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

Reply via email to