Conversation
This was referenced Sep 23, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Do not merge before #9485, the format specification this implements, is voted and merged. Stacked on #9486.
This turns on the semantic type contract of #7073 for new tables. Today a table's
logical_typenames one exact Arrow type. So appendingLargeUtf8,Utf8View, or dictionary data to astringcolumn fails even though every value fits, and view input is squeezed into 32-bit offsets.A table created with data storage version 2.3 or later now sets
FLAG_SEMANTIC_TYPES(bit 2048) in both flag words. The flag is sticky across later versions and restores, and it is never set on an existing table, so every existing table and every table on 2.2 or earlier keeps its exact behavior. Older builds refuse flagged tables through the unknown-flag check.On a flagged table:
string,decimal:10:2) and alance-schema:output-encodingentry when a created column's layout is not the default. ALargeUtf8orUtf8Viewcolumn reads back as it was created. Appends never change the entry. Setting an entry that is not an output encoding of the column's type fails the schema update. An unknown entry read from the manifest is kept but ignored.Decimal256(10, 2)appends todecimal:10:2, andDecimal128(12, 2)is rejected.LargeUtf8/LargeBinary, which holds every value, instead of being cast to 32-bit offsets. The single write boundary from feat: check write inputs against the data file schema at a single boundary #9478 still holds because file schemas and arrays agree.DataBlock::into_arrowdecodes the stored layout and converts to the requested one of the same values: offset widths, views, dictionary and plain layouts, dictionary key widths, and decimal widths. Constant pages read their scalar the same way. A value that does not fit, such asutf8offsets past 2 GiB, fails the read with the field, the byte size, and the requested layout instead of truncating.Tradeoffs:
Field::output_encoding, including the default. Legacy and data file fields never carry one. This letsdata_type(), projections, and exact comparisons follow the layout without consulting the table's flags. The manifest records only non-default encodings. Data file writers normalize their schema withSchema::to_data_file_schema().