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

Reply via email to