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. >>> > >>> >>
