I am fine with keeping the #16765 <https://github.com/apache/iceberg/pull/16765> toString() change in 1.12 and documenting it as a behavior change.
Old metadata still loads: "geometry" and "geometry(OGC:CRS84)" parse to the same type. Writing the long form is clearer and matches Appendix C. As Szehon mentioned, this also helps the UDF work I am doing (#15994 <https://github.com/apache/iceberg/pull/15994>). A definition-id is built from parameter type strings. If omitted vs explicit default algorithm printed differently, two equal Geography types would look like two different overloads. With #16765 <https://github.com/apache/iceberg/pull/16765> they print the same, so we do not need a workaround for that case. Thanks, Huaxin On Fri, Sep 18, 2026 at 8:22 PM Neelesh Salian <[email protected]> wrote: > Based on Szehon's comments, it makes sense to keep the behavior change for > 1.12. If we are making a change, I can make sure this is in the Release > Notes + Release blog so users are aware. > At the end of the voting process for this RC thread here, we can see where > we land. > Please vote on the RC when you get a chance. > Thank you for all those who have voted thus far. > > On Fri, Sep 18, 2026 at 6:58 PM Anoop Johnson <[email protected]> wrote: > >> The API change behavior seems reasonable to me. If there are no >> objections from the community, we should probably just keep it. If not, the >> PR Xin prepared looks like a reasonable fallback. (thanks for turning that >> around so quickly!) >> >> Best, >> Anoop >> >> On Fri, Sep 18, 2026 at 6:06 PM Szehon Ho <[email protected]> >> wrote: >> >>> Hi, >>> >>> Thanks for the thorough review! Indeed, toString() of the >>> Geometry/Geography type is changed to include crs, >>> algorithm parameters, even if they are the same as default. >>> >>> I took a look, for me it seems ok to keep the API behavior change for >>> 1.12, and put it in the "Behavior Change" category of the release notes. >>> Some reasons: >>> >>> 1. It's just clearer overall. We found without this change, two >>> Geography type having the same default algorithm print differently >>> depending on whether the user sets it or not, which seemed like a bug. >>> 2. toString() now matches the serialization spec, which includes C and >>> A: >>> >>>> geometry(<C>) and geography(<C>, <A>) >>> >>> 3. It makes Iceberg JSON schema writer obey the spec as is (using >>> toString), avoiding the workaround. >>> 4. It makes the Iceberg UDF PR that Huaxin is working on easier: >>> https://github.com/apache/iceberg/pull/15994. A UDF overload has a >>> definition-id which includes the param type string, and we'd have to >>> workaround in that code as well, otherwise its a correctness issue if two >>> Geography types with the default algorithm have different definition-id >>> depending on whether the user set it explicitly. >>> >>> Happy to hear what others think though. >>> Thanks, >>> Szehon >>> >>> On Fri, Sep 18, 2026 at 2:56 PM Xin Huang via dev < >>> [email protected]> wrote: >>> >>>> Hi Steven, >>>> >>>> Thanks for catching this and bringing it to the community’s attention. >>>> >>>> The reason for the change in #16765 >>>> <http://urldefense.com/v3/__https://github.com/apache/iceberg/pull/16765__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZslwUNqdQ$> >>>> was to persist the resolved CRS and algorithm explicitly in metadata, >>>> including when they match the defaults. Changing toString() was a side >>>> effect that I didn’t recognize as a behavior change at the time. >>>> >>>> I double-checked Appendix C <https://iceberg.apache.org/spec/#schemas>, >>>> which lists geometry(<C>) and geography(<C>, <A>) as the canonical >>>> serialized forms. The spec also defines the meaning of omitted parameters, >>>> so existing metadata must continue to be interpreted using those defaults. >>>> >>>> I see three options: >>>> >>>> 1. Restore the pre-#16765 >>>> >>>> <http://urldefense.com/v3/__https://github.com/apache/iceberg/pull/16765__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZslwUNqdQ$> >>>> behavior. >>>> Both toString() and schema JSON use compact forms for default >>>> instances, although these differ from the canonical JSON forms listed in >>>> Appendix C. >>>> 2. Restore the old toString() output while serializing explicit >>>> parameters. For the same constructor inputs, toString() produces >>>> the pre-#16765 output, while schema JSON and Java serialization include >>>> the >>>> resolved CRS and algorithm. I’ve opened PR #18169 >>>> <https://github.com/apache/iceberg/pull/18169> with this approach. >>>> 3. Keep #16765 >>>> >>>> <http://urldefense.com/v3/__https://github.com/apache/iceberg/pull/16765__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZslwUNqdQ$> >>>> unchanged. >>>> Both toString() and serialization include explicit parameters, >>>> retaining the behavior change in 1.12. >>>> >>>> My preference is option 2, but I’m happy to follow the community’s >>>> preference. >>>> >>>> Thanks, >>>> Xin >>>> >>>> On Fri, Sep 18, 2026 at 11:12 AM Steven Wu <[email protected]> >>>> wrote: >>>> >>>>> I want to call out a behavior change in 1.12. >>>>> >>>>> PR #16765 >>>>> <https://urldefense.com/v3/__https://github.com/apache/iceberg/pull/16765__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZslwUNqdQ$> >>>>> changed GeometryType / GeographyType so toString() always writes the >>>>> resolved defaults instead of omitting them. >>>>> >>>>> *Before*: Default instances collapsed to the bare type name. Geometry >>>>> with no CRS printed geometry. Geography printed geography, >>>>> geography(crs), or geography(crs, algorithm) depending on what was >>>>> stored as unset. >>>>> >>>>> *After*: the constructor stores omitted CRS / algorithm as the >>>>> Iceberg defaults, and toString() always includes them: >>>>> >>>>> - geometry → geometry(OGC:CRS84) >>>>> - geography → geography(OGC:CRS84, spherical) >>>>> >>>>> *Implications* >>>>> >>>>> - Read path is backward compatible, as SchemaParser or >>>>> Types.fromTypeName can parse the type string to the same Type object >>>>> - Write path is not string stable. >>>>> >>>>> *Question*: Do we consider the type's `toString()` change a breaking >>>>> change? Personally, I am okay with 1.12 moving forward with the changed >>>>> behavior since read is compatible. But I wanted to bring this to the >>>>> community attention. >>>>> >>>>> On Fri, Sep 18, 2026 at 9:57 AM Gianluca Graziadei < >>>>> [email protected]> wrote: >>>>> >>>>>> +1 (non-binding) >>>>>> >>>>>> Verified checksums, signature, source archive vs. tag, RAT, and ran >>>>>> smoke tests with the staged Spark 4.0 runtime. >>>>>> >>>>>> One follow-up, in the same spirit as Xuanwo's note: the source >>>>>> archive also bundles site/docs/assets/javascript/lottie-player.js >>>>>> (LottieFiles, MIT) without a license header or an entry in the root >>>>>> LICENSE. Not a blocker for this RC since both assets have shipped >>>>>> since 1.9.0; this issue is already tacked here >>>>>> https://lists.apache.org/thread/hstl6z6qp55hxgdlljpc5xg8wc3kq800 >>>>>> <https://urldefense.com/v3/__https://lists.apache.org/thread/hstl6z6qp55hxgdlljpc5xg8wc3kq800__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZucd-8rlQ$> >>>>>> >>>>>> Separately, while testing I hit a pre-existing NoSuchMethodError when >>>>>> reading variant columns with commons-lang3 < 3.13 on the classpath >>>>>> (iceberg-parquet uses Streams.of(Iterable) without declaring the >>>>>> dependency). Also present in 1.11.0, so not a regression; issue >>>>>> tracked here >>>>>> https://github.com/apache/iceberg/issues/18164 >>>>>> <https://urldefense.com/v3/__https://github.com/apache/iceberg/issues/18164__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZuvdhMbeg$> >>>>>> >>>>>> Cheers, >>>>>> Gianluca >>>>>> >>>>>> On 2026/09/18 00:22:06 Neelesh Salian wrote: >>>>>> > Hi Everyone, >>>>>> > >>>>>> > I propose that we release the following RC as the official Apache >>>>>> Iceberg >>>>>> > 1.12.0 release. >>>>>> > >>>>>> > The commit ID is dec392570a88e45ac3a417a487dd72f9bdb629d5 >>>>>> > * This corresponds to the tag: apache-iceberg-1.12.0-rc0 >>>>>> > * >>>>>> https://github.com/apache/iceberg/commits/apache-iceberg-1.12.0-rc0 >>>>>> <https://urldefense.com/v3/__https://github.com/apache/iceberg/commits/apache-iceberg-1.12.0-rc0__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZtNy1-EQg$> >>>>>> > * >>>>>> > >>>>>> https://github.com/apache/iceberg/tree/dec392570a88e45ac3a417a487dd72f9bdb629d5 >>>>>> <https://urldefense.com/v3/__https://github.com/apache/iceberg/tree/dec392570a88e45ac3a417a487dd72f9bdb629d5__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZsZEbwiNw$> >>>>>> > >>>>>> > The release tarball, signature, and checksums are here: >>>>>> > * >>>>>> https://dist.apache.org/repos/dist/dev/iceberg/apache-iceberg-1.12.0-rc0 >>>>>> <https://urldefense.com/v3/__https://dist.apache.org/repos/dist/dev/iceberg/apache-iceberg-1.12.0-rc0__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZstALTGmw$> >>>>>> > >>>>>> > You can find the KEYS file here: >>>>>> > * https://downloads.apache.org/iceberg/KEYS >>>>>> <https://urldefense.com/v3/__https://downloads.apache.org/iceberg/KEYS__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZsc5zcLsw$> >>>>>> > >>>>>> > Convenience binary artifacts are staged on Nexus. The Maven >>>>>> repository URL >>>>>> > is: >>>>>> > * >>>>>> https://repository.apache.org/content/repositories/orgapacheiceberg-1283/ >>>>>> <https://urldefense.com/v3/__https://repository.apache.org/content/repositories/orgapacheiceberg-1283/__;!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZsXi0VR9A$> >>>>>> > >>>>>> > Please download, verify, and test. >>>>>> > >>>>>> > Instructions for verifying a release can be found here: >>>>>> > * >>>>>> https://iceberg.apache.org/how-to-release/#how-to-verify-a-release >>>>>> <https://urldefense.com/v3/__https://iceberg.apache.org/how-to-release/*how-to-verify-a-release__;Iw!!LIr3w8kk_Xxm!tKhzW34uoygDezpDOWiLjy5JRZ97R3veb-YTd5dqkITpmgITiZxSurPnO4FkDvwQ20sDnl_lIPSBk-GmvZs5jtCNBQ$> >>>>>> > >>>>>> > As this vote spans the weekend, it will remain open until Monday, >>>>>> September >>>>>> > 21, 2026 at 2:00 PM Pacific Time. >>>>>> > >>>>>> > [ ] +1 Release this as Apache Iceberg 1.12.0 >>>>>> > [ ] +0 >>>>>> > [ ] -1 Do not release this because... >>>>>> > >>>>>> > Only PMC members have binding votes, but other community members are >>>>>> > encouraged to cast >>>>>> > non-binding votes. This vote will pass if there are 3 binding +1 >>>>>> votes and >>>>>> > more binding >>>>>> > +1 votes than -1 votes. >>>>>> > >>>>>> >>>>>
