Hi Leonard,

Thank you so much for all your support and guidance.


I have already signed up on Apache Flink Confluence [1] under the
username Chanhae
Oh.

If you are able to grant me write access, I will move the current draft
there using the FLIP template and proceed toward a community vote.


[1]
 
https://cwiki.apache.org/confluence/spaces/FLINK/pages/44302796/Apache+Flink+Home
<https://cwiki.apache.org/confluence/spaces/FLINK/pages/44302796/Apache+Flink+Home>


Thank you again for your kind help!


Best regards,

Chanhae

On Tue, Jul 21, 2026 at 12:16 PM Leonard Xu <[email protected]> wrote:

> Hi ChanHae,
>
> Thanks for the update. The newly added limitations and boundary-query
> result
> requirements address my remaining concerns. No further concerns from me.
>
> One small procedural suggestion: FLIPs are usually maintained in the Apache
> Flink Confluence wiki, so it would be great if you could move the current
> Google Docs draft there using the FLIP template [1]. This will make it
> easier
> for the community to review, track, and eventually vote on the FLIP.
>
> If you do not have write permission to the Flink wiki yet, no worries.
> Please
> feel free to share your Apache Confluence username, and I can help add the
> permission for you.
>
> Best,
> Leonard
>
> [1]
> https://cwiki.apache.org/confluence/spaces/FLINK/pages/65145553/FLIP+Template
>
> > 2026 7月 20 11:41 下午,Chanhae Oh <[email protected]> 写道:
> >
> > Hi Leonard,
> >
> > Thank you for the +1 and for the additional suggestions.
> >
> > I have updated the FLIP based on your comments (changes marked with green
> > underlines):
> >
> > - Physical-id partitioning: added explicit limitation note for
> > static/write-free tables
> > - Boundary-query partitioning: added result requirements (single column,
> > type compatibility, NULL rejection)
> >
> > Please let me know if there is anything further needed before moving to
> the
> > next stage.
> >
> > Best regards,
> > Chanhae Oh
> >
> > On Mon, Jul 20, 2026 at 1:19 PM Leonard Xu <[email protected]> wrote:
> >
> >> Hi ChanHae,
> >>
> >> Thanks for the update. With these semantics clarified, I think the
> >> proposal is
> >> reasonable to move forward.
> >>
> >> My remaining suggestion is to make the limitations very explicit in both
> >> the
> >> FLIP and the user documentation. In particular, physical-id partitioning
> >> should
> >> be documented as suitable for static tables, or tables without
> concurrent
> >> changes during the scan. For boundary-query partitioning, the connector
> >> should
> >> reject NULL boundary values and require the boundary query to return a
> >> single
> >> column that is comparable with the partition column.
> >>
> >> With these documented, I am +1 on moving this FLIP forward.
> >>
> >> Best,
> >> Leonard
> >>
> >>> 2026 7月 8 7:12 下午,Chanhae Oh <[email protected]> 写道:
> >>>
> >>> Hi Leonard,
> >>>
> >>> Thank you for taking the time to review this proposal.
> >>> Your feedback touched on the exact boundary conditions and correctness
> >>> guarantees that I had not articulated precisely enough, and I genuinely
> >>> learned from the breadth of your perspective.
> >>>
> >>> I have updated the FLIP to address each of your questions (changed
> >> sections
> >>> are highlighted in yellow).
> >>>
> >>> 1. Physical ID Partitioning — correctness under concurrent changes
> >>> (Updated: Proposed Changes > Physical ID Partitioning > Correctness
> >>> Guarantees and Limitations)
> >>>
> >>> The two databases behave differently at the physical layer. Oracle
> ROWID
> >> is
> >>> stable under normal DML — it only changes under structural operations
> >>> (ALTER TABLE MOVE, EXPORT/IMPORT, row movement). PostgreSQL ctid,
> >> however,
> >>> changes on every UPDATE since a new tuple is written at a new location.
> >>> Physical-id partitioning for PostgreSQL is therefore only safe when no
> >>> concurrent DML runs during the scan.
> >>>
> >>> 2.1. Boundary-query — should the query return exactly N-1 values?
> >>> (Updated: Proposed Changes > Boundary Query > Partition count behavior)
> >>>
> >>> Requiring exactly N-1 is too strict. Fewer values are allowed — the
> >>> partition count simply reduces to (returned values) + 1. More than N-1
> >>> values is a validation error, since scan.partition.num serves as a
> >> resource
> >>> cap and silently exceeding it could create more parallelism than the
> user
> >>> intended.
> >>>
> >>> 2.2. Boundary-query — how are inclusive/exclusive predicates generated?
> >>> (Updated: Proposed Changes > Boundary Query > Predicate contract)
> >>>
> >>> Partition 1 uses col < v1 OR col IS NULL, middle partitions use v(i-1)
> <=
> >>> col < vi (left-inclusive, right-exclusive), and the last partition uses
> >> col
> >>>> = v(N-1). This ensures no row is emitted by two partitions
> >> simultaneously.
> >>>
> >>> 2.3. Boundary-query — NULL values, duplicate boundaries, unsorted
> >> results,
> >>> count mismatch
> >>> (Updated: Proposed Changes > Boundary Query > Predicate contract,
> >> Partition
> >>> count behavior)
> >>>
> >>> - NULL: Routed to Partition 1 via the explicit col IS NULL clause,
> since
> >>> SQL NULL comparisons evaluate to NULL rather than TRUE.
> >>> - Duplicate boundary values: Handled gracefully by the predicate
> pattern
> >> —
> >>> the affected middle partition produces an empty result set with no data
> >>> loss.
> >>> - Unsorted results: The connector wraps the boundary-query in a
> subquery
> >>> with ORDER BY 1, so the user does not need to include ORDER BY.
> >>> - Count mismatch: Same as 2.1 — fewer values reduce partition count;
> more
> >>> values are rejected at validation.
> >>>
> >>> Additionally, I added an Option Validation Matrix section to make the
> >>> constraints across the three partitioning modes explicit in one place.
> >>>
> >>> Please let me know if any of the updated content raises further
> >> questions.
> >>>
> >>> Thank you again for your thorough review.
> >>>
> >>> P.S Thank you for your interest Youngil Kim.
> >>>
> >>> Best regards,
> >>> ChanHae Oh
> >>>
> >>> On Wed, Jul 8, 2026 at 2:48 PM Leonard Xu <[email protected]> wrote:
> >>>
> >>>> Hi Chanhae,
> >>>>
> >>>> Thanks for driving this FLIP. The motivation makes sense to me: the
> >> current
> >>>> equal-width JDBC partitioning does not work well for skewed data, and
> it
> >>>> also
> >>>> does not help much when users do not have a suitable
> >> numeric/date/timestamp
> >>>> partition column.
> >>>>
> >>>> I am generally supportive of the direction, but I think both proposed
> >>>> approaches
> >>>> need clearer semantics.
> >>>>
> >>>> For physical-id partitioning, ROWID/ctid are physical identifiers
> rather
> >>>> than
> >>>> stable logical keys. They may change after updates, table rewrites,
> >>>> vacuum, or
> >>>> row movement. Since different splits may be read by different
> >> statements or
> >>>> connections, the FLIP should clarify whether this mode only targets
> >> static
> >>>> tables, or whether the connector can provide a consistent snapshot
> >> across
> >>>> all
> >>>> splits. Otherwise, missing or duplicated rows may be possible.
> >>>>
> >>>> For boundary-query partitioning, the contract should also be more
> >> precise.
> >>>> For
> >>>> example, if scan.partition.num is N, should the query return N - 1
> >>>> boundaries?
> >>>> How are inclusive/exclusive predicates generated? How should NULL
> >> values,
> >>>> duplicate boundaries, unordered results, or boundary count mismatches
> be
> >>>> handled?
> >>>> These details are important to avoid missing or duplicated rows.
> >>>>
> >>>> It would also be helpful to define the option validation matrix
> clearly,
> >>>> e.g.
> >>>> which options are required or mutually exclusive for range
> partitioning,
> >>>> boundary-query partitioning, and physical-id partitioning.
> >>>>
> >>>> Overall, I like the direction, but I think the FLIP should first nail
> >> down
> >>>> the
> >>>> correctness guarantees and edge-case behavior.
> >>>>
> >>>> Best,
> >>>> Leonard
> >>
> >>
>
>

Reply via email to