The proposed metrics look good to me, thanks for the supplement. Best, Leonard
> 2026 6月 4 01:23,Fabian Hueske <[email protected]> 写道: > > Thanks Leonard, > > I've added a section about operator metrics to the proposal [1]. > If you have ideas for other useful metrics, please let me know and I'll add > them. > > Best, Fabian > > [1] > https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=421958523#FLIP579:LATERALSNAPSHOTJoin-Metrics > > Am Mi., 3. Juni 2026 um 10:18 Uhr schrieb Fabian Hueske <[email protected] >> : > >> Thank you Hongshun for your feedback! >> >> You are right that restricting the probe-side input to append-only changes >> deviates from the existing event-time (and disabled proc-time) temporal >> table joins. >> I chose this restriction because processing time semantics do not work >> well with retractions. >> A probe record of +(k1, p1) could join against a build-side of (k1, v1), >> while a later arriving probe-side retraction -(k1, p1) would join against >> (k1, v2). The resulting rectraction record of -(k1, p1, v2) would not match >> the earlier insertion +(k1, p1, v1). >> The only changelog format that would work well would be upsert changes >> (+I, +UA, -D) with key-only deletes (under the assumption that the upsert >> key is still unique after the join). >> >> I would like to keep the default behavior of only accepting append-only >> inputs to prevent retraction mismatches. >> At the same time, the operator implementation only needs to be slightly >> adjusted to support arbitrary probe-side changes (if at all). The real >> change would be in the planner / rules. >> So allowing probe-side retraction input via a config option for >> power-users who know what they are doing is certainly possible. >> >> Do you think this should be part of the proposal or would you be fine to >> leave this as future work? >> >> Best, Fabian >> >> Am Mi., 3. Juni 2026 um 08:41 Uhr schrieb Leonard Xu <[email protected]>: >> >>> Hi Fabian, >>> >>> Thanks for the detailed and thoughtful reply, and especially for agreeing >>> to add operator metrics — that alone will significantly improve the >>> debuggability of the join in production. >>> >>> (1) On CPU spike / probe-side buffering >>> >>> +1 for your reasoning on both points — deferring InputSelectable until >>> the unaligned-checkpoint limitation is resolved, and leaving micro-batch >>> transition out of v1. Watermark alignment + probe-side scan-offset is the >>> principled clean approach, agreed. >>> >>> (2) On Jark's backlog idea >>> >>> Between the two paths in your reply, I'd lean toward option (a) — having >>> the source connector emit a special WM (or a dedicated record attribute) at >>> the end of backlog — as the long-term direction for exact flip-point >>> semantics. It naturally fits what is almost certainly going to be the >>> dominant production scenario: CDC sources (mysql-cdc, mongodb-cdc, >>> postgres-cdc, ...) as the dimension build-side, all of which already have >>> an explicit "snapshot finished → binlog start" boundary internally. >>> >>> My suggestion is to ship FLIP-579 as proposed and collect user feedback >>> on LATERAL SNAPSHOT Join from real production usage — that will give us >>> solid evidence to prioritize this follow-up direction. >>> >>> (3) On the vote >>> >>> Once the metrics section is added and there are no further objections >>> from others, I'm fine to start the vote. >>> >>> >>> Best, >>> Leonard >>> >>> >>> >>>> 2026 6月 3 01:36,Fabian Hueske <[email protected]> 写道: >>>> >>>> Thanks for your valuable feedback Jark and Leonard! >>>> >>>> You are bringing up three of the tricky challenges that the new join >>> needs >>>> to deal with. >>>> >>>> (1) Jark: The build-side flip point is not exact >>>> >>>> This is correct. However, I would argue that a processing-time join does >>>> not have exact guarantees anyway and can only produce roughly >>> time-aligned >>>> results. WM alignment of build and probe-side input should help to keep >>> the >>>> alignment somewhat close. Of course, this does not mean that we >>> shouldn't >>>> try to give as good guarantees as possible. >>>> >>>> The primary mechanism for flipping from LOAD to JOIN phase is the >>>> build-side watermark crossing a configured point in time. Watermarks are >>>> used to track progress and completeness in Flink. Using them as a >>> condition >>>> to switch from LOAD to JOIN phase, means that the build-side received at >>>> least all changes up to that point in time. There might have been >>> changes >>>> with later timestamps as well. These could be buffered on the side to >>> have >>>> a stricter FLIP point, but IMO this additional data should be tolerable >>>> under proc-time semantics. >>>> >>>> If the build-side input becomes stale, the processing idle timeout flip >>>> condition gets applied. The assumption is that the build-side source is >>>> currently exhausted and all data was consumed but the WM didn't progress >>>> far enough to exceed the flip point. In this case, we want to flip and >>>> start the regular JOIN phase. >>>> >>>> For the use case of sources with an exact flip point, users would need >>> to >>>> know the timestamp of the last backlog record (or compute it if they >>> know >>>> roughly how long it takes to scan the backlog if it is computed >>> on-demand). >>>> I agree, this is not very practical. >>>> I can think of two options >>>> a) the source connector emits a special WM when it reaches the end of >>> the >>>> backlog. This would not require changes to the join operator but to the >>>> source connectors. >>>> b) The design of the SNAPSHOT function has the >>> `load_completed_condition` >>>> which is an extension point to add logic to determine the flip point. >>>> >>>> >>>> (2) Jark: Buffering probe-side during LOAD phase >>>> >>>> I think this is very similar to Leonard's point about "LOAD phase >>>> backpressure" and also closely related to Leonard's point about >>> "Flip-point >>>> CPU spike". >>>> >>>> This is indeed a potential problem. If used without care, the probe-side >>>> state might grow very large. Before talking about possible ways to >>> address >>>> this problem, let me explain how I think that the join would be used. >>>> >>>> A very common (maybe the most common?) use case should be to initialize >>> the >>>> build-side input up to time t_b and then start processing the probe-side >>>> input from time t_p (with t_p = t_b, or slightly less than t_b) >>> onwards. WM >>>> alignment would help to roughly align build-side and probe-side inputs >>>> (although not being perfectly aligned like the event-time join) >>>> Initializing the build-side up to t_b and starting consuming the >>> probe-side >>>> from t_p with (t_p << t_b) would mean that the first probe-side records >>> are >>>> joined with much later versions of the build-side. >>>> >>>> The first scenario (t_p = t_b) can be controlled with WM alignment and >>>> scan-offset table hints on the probe-side input. Since the WMs of the >>>> build-side input would be less than the WMs of the probe-side input, the >>>> probe-side input should be throttled until the build-side caught up >>> (which >>>> should be close the the flip point). >>>> Other scenarios (including the t_p << t_b scenario) would benefit from >>> an >>>> idea [1] that is described in the future work section of the FLIP. That >>>> mechanism would also be based on WM alignment and would need some >>>> collaboration from the build-side source operator to indicate >>> completeness >>>> of the backlog. >>>> >>>> Using the InputSelectable interface is an idea that we also looked into >>> (as >>>> Gustavo already pointed out). Unfortunately, it is incompatible with >>>> unaligned checkpoints and there are no other streaming operators that >>>> implement the interface. I haven't looked in depth at the current >>>> limitations, but if some of these would be resolved, it might be >>> possible >>>> to later extend the join operator. It might even work with relaxed >>>> guarantees because we don't need to fully block the input but just >>> throttle >>>> it such that less probe-side data needs to be buffered. >>>> >>>> The idea of limiting the size of the probe-side buffer with a config >>> like >>>> `max-buffer-size` sounds interesting. However, I'm not sure if applying >>>> backpressure would really work because we still need to consume the >>>> build-side to be able to reach the flip point and selective >>> backpressure is >>>> not possible without InputSelectible. >>>> >>>> An earlier draft of the proposal described eager joining (now moved to >>> the >>>> future work section [2]). The idea is that a probe-side record would be >>>> directly joined when a match was present or received during the LOAD >>> phase. >>>> After joining it wouldn't be put into state. This would of course >>>> significantly reduce the state size and solved the issue of CPU spikes >>>> during the transition but come at the cost of hard-to-explain semantics >>>> (the current semantics are rather simple, we collect until the flip >>> point >>>> and join against that). >>>> Also, the idea of eager joining was developed when the join operator was >>>> still restricted to FK-PK joins (single build-side record per join key). >>>> The design generalized this restriction to arbitrary joins which means >>>> there might be more build-side matches for a probe-side record such that >>>> the presence of a single join match (of a possibly earlier version) does >>>> not guarantee completeness anymore. That's why the idea of eager joining >>>> was discarded for now. >>>> >>>> >>>> (3) Leonard: Flip-point CPU spikes >>>> >>>> This is also a very valid concern. I would argue that the primary >>> mechanism >>>> to address this point should be to reduce the amount of buffered >>> probe-side >>>> records (see point (2) above). >>>> >>>> I also thought about your idea to micro-batch the draining. In the >>> design, >>>> the transition join is triggered per-key by event-time timers that also >>>> emit the "current" probe-side WM downstream. If we want to continue >>> using >>>> this mechanism, we would need to schedule multiple timers and probably >>> use >>>> some clever mechanism to gradually advance probe-side WMs while still >>>> consuming records. There could be a separate "TRANSITION" phase during >>>> which we still append to the probe-buffer but use the mechanism for >>> atomic >>>> build-side updates. However, this would significantly complicate the >>> design >>>> affecting the control flow and recovery. Hence, I would first try to >>>> address this issue by reducing the probe-side state. >>>> >>>> If you have better ideas for how to use micro-batching during flip >>>> transition, I'm very open to exploring those. >>>> >>>> Leonard also brought up a very important point about metrics! >>>> I will add a section on operator metrics that will help to understand >>> the >>>> state of the operator. >>>> >>>> Please let me know your thoughts! >>>> >>>> Best, Fabian >>>> >>>> [1] >>>> >>> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=421958523#FLIP579:LATERALSNAPSHOTJoin-ReduceBufferingofProbe-SideviaBuild-SideWatermarkSuppression >>>> [2] >>>> >>> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=421958523#FLIP579:LATERALSNAPSHOTJoin-EagerjoinmodeduringLOADphase >>>> >>>> >>>> Am Mo., 1. Juni 2026 um 16:44 Uhr schrieb Leonard Xu <[email protected] >>>> : >>>> >>>>> Hi Fabian >>>>> >>>>> Thanks for driving this FLIP and your kind patience. The motivation is >>>>> spot-on, and the LOAD→JOIN two-phase design is the right structural >>> fix for >>>>> the FLINK-19830 initialization problem. Overall direction +1 from my >>> side. >>>>> >>>>> Besides Jark’s idea about backlog and InputSelectable which may need >>> more >>>>> prerequisites, I’ve two concerns about current proposal: >>>>> >>>>> 1. LOAD phase backpressure. The FLIP assumes "seconds to a few minutes" >>>>> for build-side init, but nothing enforces it. Large build-side tables >>>>> (e.g., 50M rows) + fast probe streams → unbuffered probe-side state >>>>> explosion. Should we add a config like max-buffer-size that applies >>>>> backpressure when exceeded or some metrics about buffer, rather than >>>>> silently piling up records? >>>>> >>>>> 2. Flip-point CPU spike. Joining all buffered probe records × >>> build-side >>>>> state in one shot differs fundamentally from event-time join's >>> incremental >>>>> watermark-batched emission. In the worst case this could cause a >>>>> TaskManager CPU spike and downstream shock. Worth considering >>> micro-batch >>>>> draining during flip transition? >>>>> >>>>> Looking forward to your thoughts. >>>>> >>>>> Best, >>>>> Leonard >>>>> >>>>>> 2026 6月 1 16:02,Fabian Hueske <[email protected]> 写道: >>>>>> >>>>>> Hi Leonard, >>>>>> >>>>>> Sorry, missed your email and already started the vote. >>>>>> Let me put it on hold for now and continue discussing the proposal. >>>>>> >>>>>> Looking forward to your comments, >>>>>> Fabian >>>>>> >>>>>> Am Mo., 1. Juni 2026 um 09:56 Uhr schrieb Leonard Xu < >>> [email protected] >>>>>> : >>>>>> >>>>>>> @Fabian Thanks for driving this FLIP, sorry for late reply due to my >>>>>>> personal reason that I shouldn’t miss such an important FLIP. >>>>>>> >>>>>>> I’m reviewing the FLIP and will try to finish it today, could you >>> kindly >>>>>>> wait one minute to start the vote? >>>>>>> >>>>>>> And sorry for interrupt your plan again. >>>>>>> >>>>>>> Best, >>>>>>> Leonard >>>>>>> >>>>>>>> 2026 6月 1 15:51,Fabian Hueske <[email protected]> 写道: >>>>>>>> >>>>>>>> Thanks everyone for your comments on the FLIP. >>>>>>>> I will start the vote. >>>>>>>> >>>>>>>> Best, Fabian >>>>>>>> >>>>>>>> Am Do., 28. Mai 2026 um 20:13 Uhr schrieb David Anderson < >>>>>>>> [email protected]>: >>>>>>>> >>>>>>>>> Fabian, >>>>>>>>> >>>>>>>>>> So, I don't think that we should buffer unmatched probe-side >>> records >>>>>>>>> beyond >>>>>>>>> the flip point. >>>>>>>>> >>>>>>>>> Thanks for explaining your reasoning. Makes sense to me. >>>>>>>>> >>>>>>>>> David >>>>>>>>> >>>>>>>>> On Thu, May 28, 2026 at 6:55 PM Fabian Hueske <[email protected]> >>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Hi Xingcan, >>>>>>>>>> >>>>>>>>>> Thanks for your comments on the FLIP! >>>>>>>>>> >>>>>>>>>> The join's behavior when starting from a savepoint is indeed an >>>>>>> important >>>>>>>>>> aspect to consider and the problem of a rapidly advancing >>> dimension >>>>>>>>>> (build-side) table is of course real. >>>>>>>>>> >>>>>>>>>> I would argue that watermark alignment should significantly reduce >>>>> the >>>>>>>>>> impact of this. >>>>>>>>>> If enabled, sources align their consumption based on their current >>>>>>>>>> watermark such that the (presumably much smaller) build-side >>> source >>>>>>> would >>>>>>>>>> be slowed down to the event-time progress of the probe-side. >>>>>>>>>> While watermark alignment is not an "exact" mechanism, the >>> semantics >>>>> of >>>>>>>>> the >>>>>>>>>> new processing-time join also do not guarantee "exact" results. >>>>>>>>>> At the same time, alignment should ensure that build and >>> probe-side >>>>> are >>>>>>>>>> roughly aligned in event-time (without the strict guarantees that >>> the >>>>>>>>>> event-time temporal table join provides). >>>>>>>>>> >>>>>>>>>> However, I really like your idea of starting in event-time mode >>> and >>>>>>>>>> flipping to processing-time after the initialization duration >>> passed. >>>>>>>>>> I'm not sure if it would fully address the problem you described. >>> As >>>>>>> you >>>>>>>>>> said, users would need to be able to reconfigure the flip-point >>> and >>>>> I'm >>>>>>>>> not >>>>>>>>>> sure if there's a good mechanism for this yet. >>>>>>>>>> But it might have some other properties that would be beneficial, >>> so >>>>>>> I'll >>>>>>>>>> think about that. >>>>>>>>>> >>>>>>>>>> Best, >>>>>>>>>> Fabian >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Am Do., 28. Mai 2026 um 18:21 Uhr schrieb Fabian Hueske < >>>>>>>>> [email protected] >>>>>>>>>>> : >>>>>>>>>> >>>>>>>>>>> Thanks for your feedback David! >>>>>>>>>>> >>>>>>>>>>>> One question: If I understand correctly, during the JOIN phase >>> of >>>>> an >>>>>>>>>>> INNER >>>>>>>>>>> join, if the desired build-side record is missing, nothing will >>> be >>>>>>>>>> emitted >>>>>>>>>>> for the unmatched probe-side record. For an INNER join, I can >>>>> imagine >>>>>>>>>>> wanting to buffer unmatched probe-side records, expecting the >>> build >>>>>>>>> side >>>>>>>>>>> will arrive soon. What's your thinking there? >>>>>>>>>>> >>>>>>>>>>> Your understanding is correct. If a probe-side record arrives >>> during >>>>>>>>> LOAD >>>>>>>>>>> phase but no matching build-side record is received, >>>>>>>>>>> the probe-side record would be discarded without being joined >>> during >>>>>>>>> the >>>>>>>>>>> transition from LOAD to JOIN. >>>>>>>>>>> >>>>>>>>>>> I would argue that users that want to prevent this, would need to >>>>>>>>>>> configure a longer initialization time. >>>>>>>>>>> IMO, dropping unmatched probe records is not a "bad" property of >>>>> INNER >>>>>>>>>>> joins but an essential part of their semantics. It might even be >>>>>>>>> desired >>>>>>>>>> by >>>>>>>>>>> some users. >>>>>>>>>>> If we would buffer probe-side records for INNER joins beyond the >>>>>>>>>>> transition point, we: >>>>>>>>>>> * would have different behaviors for INNER and LEFT joins >>>>>>>>>>> * could not start to emit probe-side watermarks as long as there >>> are >>>>>>>>>> still >>>>>>>>>>> probe-side records buffered (or at least not advance past them >>>>> without >>>>>>>>>>> emitting late data at a later point of time) >>>>>>>>>>> * would either need another config knob to specify when to >>> "really" >>>>>>>>> clean >>>>>>>>>>> up the probe-side state or keep such unmatched records forever in >>>>>>> state >>>>>>>>>> (we >>>>>>>>>>> could also use state TTL...) >>>>>>>>>>> >>>>>>>>>>> So, I don't think that we should buffer unmatched probe-side >>> records >>>>>>>>>>> beyond the flip point. >>>>>>>>>>> >>>>>>>>>>> Best, Fabian >>>>>>>>>>> >>>>>>>>>>> Am Do., 28. Mai 2026 um 17:05 Uhr schrieb Xingcan Cui < >>>>>>>>>> [email protected] >>>>>>>>>>>> : >>>>>>>>>>> >>>>>>>>>>>> Hi Fabian, >>>>>>>>>>>> >>>>>>>>>>>> Thanks for this FLIP! The two-phase design is excellent for >>>>> avoiding >>>>>>>>>>>> early-joining bugs while maintaining low-latency processing-time >>>>>>>>>>>> semantics. >>>>>>>>>>>> >>>>>>>>>>>> After thinking more about the proposal, I'd like to point out an >>>>> edge >>>>>>>>>> case >>>>>>>>>>>> related to the initialization phase or recovery after prolonged >>>>>>>>> downtime >>>>>>>>>>>> (for example, when a job has been down for a day). While a >>>>>>>>>> processing-time >>>>>>>>>>>> join works well for live streaming, where results can reasonably >>>>>>>>> depend >>>>>>>>>> on >>>>>>>>>>>> the immediate arrival order of live data, it does not work as >>> well >>>>>>> for >>>>>>>>>>>> catch-up scenarios. >>>>>>>>>>>> >>>>>>>>>>>> Currently, if a job initializes or restores from a checkpoint >>>>> after a >>>>>>>>>> long >>>>>>>>>>>> downtime, the operator resumes directly in the processing-time >>> join >>>>>>>>>> phase. >>>>>>>>>>>> During catch-up, however, the natural chronological arrival >>> order >>>>> of >>>>>>>>> the >>>>>>>>>>>> live data is completely lost. As a result, these replayed fact >>>>>>> records >>>>>>>>>> are >>>>>>>>>>>> evaluated against the current machine time and may blindly join >>>>> with >>>>>>>>> the >>>>>>>>>>>> rapidly advancing "current" dimension snapshot, rather than the >>>>>>>>>> historical >>>>>>>>>>>> versions they were originally supposed to match. >>>>>>>>>>>> >>>>>>>>>>>> To handle this edge case, could we consider: >>>>>>>>>>>> >>>>>>>>>>>> 1. changing the first phase into an event-time join phase, and >>>>>>>>>>>> >>>>>>>>>>>> 2. allowing the operator to switch back to the first phase >>> after a >>>>>>>>>>>> restart? >>>>>>>>>>>> >>>>>>>>>>>> For example, users could configure a timestamp threshold. Before >>>>> the >>>>>>>>>>>> watermark reaches that point, the operator would run as an >>>>> event-time >>>>>>>>>>>> versioned join to safely process the catch-up phase through >>>>> watermark >>>>>>>>>>>> alignment. Once the watermark passes the threshold, the operator >>>>>>> could >>>>>>>>>>>> purge the old multi-version state and seamlessly transition >>> back to >>>>>>>>> the >>>>>>>>>>>> pure processing-time join phase for live traffic. >>>>>>>>>>>> >>>>>>>>>>>> After a job restart, users could either update the target >>> timestamp >>>>>>> to >>>>>>>>>>>> reset the operator back into the event-time phase, or leave it >>>>>>>>> unchanged >>>>>>>>>>>> to >>>>>>>>>>>> continue operating in the processing-time phase. >>>>>>>>>>>> >>>>>>>>>>>> I completely understand that this would introduce significant >>>>>>>>> complexity >>>>>>>>>>>> to >>>>>>>>>>>> the operator's state management and lifecycle, so this is only a >>>>>>>>>> tentative >>>>>>>>>>>> proposal to explore whether it might be worth considering for >>> the >>>>>>>>>>>> long-term >>>>>>>>>>>> robustness of the design. >>>>>>>>>>>> >>>>>>>>>>>> Best, >>>>>>>>>>>> >>>>>>>>>>>> Xingcan >>>>>>>>>>>> >>>>>>>>>>>> On Thu, May 28, 2026 at 8:17 AM David Anderson < >>>>> [email protected] >>>>>>>> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> I'm quite enthusiastic about this. I want to thank Fabian for >>>>>>>>> putting >>>>>>>>>>>>> together such a well-crafted FLIP. And I look forward to >>> updating >>>>>>>>> the >>>>>>>>>>>>> awkward educational content this FLIP will make obsolete. >>>>>>>>>>>>> >>>>>>>>>>>>> To my mind, the syntax expresses the semantics of this join >>> rather >>>>>>>>>> well. >>>>>>>>>>>>> >>>>>>>>>>>>> Until now, developers using event-time temporal joins sometimes >>>>>>>>>>>> resorted to >>>>>>>>>>>>> doing weird things with watermarks to handle a build side >>> that's >>>>>>>>>> mostly >>>>>>>>>>>>> idle; this lateral snapshot join is clearly better -- not to >>>>> mention >>>>>>>>>> the >>>>>>>>>>>>> added bonus of pre-loading the build table. >>>>>>>>>>>>> >>>>>>>>>>>>> One question: If I understand correctly, during the JOIN phase >>> of >>>>> an >>>>>>>>>>>> INNER >>>>>>>>>>>>> join, if the desired build-side record is missing, nothing >>> will be >>>>>>>>>>>> emitted >>>>>>>>>>>>> for the unmatched probe-side record. For an INNER join, I can >>>>>>>>> imagine >>>>>>>>>>>>> wanting to buffer unmatched probe-side records, expecting the >>>>> build >>>>>>>>>> side >>>>>>>>>>>>> will arrive soon. What's your thinking there? >>>>>>>>>>>>> >>>>>>>>>>>>> David >>>>>>>>>>>>> >>>>>>>>>>>>> On Wed, May 27, 2026 at 12:44 PM Fabian Hueske < >>>>> [email protected]> >>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks Gustavo and Timo for the positive feedback! >>>>>>>>>>>>>> >>>>>>>>>>>>>> I'd like to bump this thread up to collect more feedback. >>>>>>>>>>>>>> If there are no more responses, I will start a vote on this >>> FLIP >>>>>>>>>> next >>>>>>>>>>>>>> Monday, June 1st. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Best, Fabian >>>>>>>>>>>>>> >>>>>>>>>>>>>> Am Do., 21. Mai 2026 um 12:15 Uhr schrieb Timo Walther < >>>>>>>>>>>>> [email protected] >>>>>>>>>>>>>>> : >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Hi Fabian, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> thanks for proposing this FLIP. I agree that this join is >>> super >>>>>>>>>>>> common, >>>>>>>>>>>>>>> after talking to many people at conferences, I could imagine >>> it >>>>>>>>>>>> will be >>>>>>>>>>>>>>> one of the most used kinds of joins going forward. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Tightly coupling it with watermarks fits both from a >>> semantical >>>>>>>>>>>> point >>>>>>>>>>>>> of >>>>>>>>>>>>>>> view but also with other efforts such as FLIP-558 >>> (Improvements >>>>>>>>> to >>>>>>>>>>>>>>> SinkUpsertMaterializer and changelog disorder) [1]. In the >>> near >>>>>>>>>>>> future, >>>>>>>>>>>>>>> we should work on more automated watermarking to power these >>>>>>>>>>>>>>> watermark-based operators, but this is an orthogonal effort. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Overall I'm strongly +1 on this. Also +1 on the syntax >>>>>>>>>> improvements >>>>>>>>>>>> for >>>>>>>>>>>>>>> lateral table functions by dropping the TABLE() wrapper. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Cheers, >>>>>>>>>>>>>>> Timo >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> [1] >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>> >>>>> >>> https://cwiki.apache.org/confluence/display/FLINK/FLIP-558%3A+Improvements+to+SinkUpsertMaterializer+and+changelog+disorder >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 18.05.26 11:47, Gustavo de Morais wrote: >>>>>>>>>>>>>>>> Hi Fabian, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> In general a strong +1 for the feature, without getting into >>>>>>>>> the >>>>>>>>>>>>>> details >>>>>>>>>>>>>>> of >>>>>>>>>>>>>>>> the FLIP yet. This is a missing feature for years and I'm >>>>>>>>> happy >>>>>>>>>>>> that >>>>>>>>>>>>>>> we're >>>>>>>>>>>>>>>> putting the time to address this - while also getting rid of >>>>>>>>>> some >>>>>>>>>>>> of >>>>>>>>>>>>>> the >>>>>>>>>>>>>>>> hard restrictions we had. Thanks! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Kind regards, >>>>>>>>>>>>>>>> Gustavo >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Fri, 15 May 2026 at 16:39, Fabian Hueske < >>>>>>>>> [email protected] >>>>>>>>>>> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Hi everyone, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I'd like to start a discussion on FLIP-579: LATERAL >>> SNAPSHOT >>>>>>>>>> Join >>>>>>>>>>>>> [1]. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Enriching a stream with data from a (slowly changing) >>> dynamic >>>>>>>>>>>> table >>>>>>>>>>>>>> is a >>>>>>>>>>>>>>>>> super common use case. >>>>>>>>>>>>>>>>> Flink SQL features Temporal Joins [2] to address these use >>>>>>>>>> cases. >>>>>>>>>>>>>>>>> However, SQL users can only use the event-time variant >>> which >>>>>>>>>> has >>>>>>>>>>>>> many >>>>>>>>>>>>>>>>> limitations (heavy dependency on frequent WM updates on >>> both >>>>>>>>>>>> inputs, >>>>>>>>>>>>>>>>> build-side table requires a PK, the join predicate must >>>>>>>>> include >>>>>>>>>>>> the >>>>>>>>>>>>>>>>> build-side PK, etc). >>>>>>>>>>>>>>>>> The processing-time temporal join is disabled (due to >>>>>>>>>> build-side >>>>>>>>>>>>>>>>> initialization issues [3]) and temporal table function >>> joins >>>>>>>>>> are >>>>>>>>>>>>>>>>> only available in Table API. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> FLIP-579 proposes a new temporal join operator that >>> operates >>>>>>>>> in >>>>>>>>>>>>>>>>> processing-time and addresses the limitations of the >>> existing >>>>>>>>>>>>>>>>> implementations: >>>>>>>>>>>>>>>>> * initialization of the build-side before joining >>>>>>>>>>>>>>>>> * no requirement of continuous, frequent build-side WMs >>>>>>>>> (after >>>>>>>>>>>> the >>>>>>>>>>>>>>>>> initialization completed) >>>>>>>>>>>>>>>>> * no requirement for a PK on the build-side >>>>>>>>>>>>>>>>> * table function-based syntax [4] via a built-in SNAPSHOT >>>>>>>>>>>> function >>>>>>>>>>>>>>>>> (proposed in FLIP-517 [4]) >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Looking forward to your feedback. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Best, >>>>>>>>>>>>>>>>> Fabian >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> [1] >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>> >>>>> >>> https://cwiki.apache.org/confluence/display/FLINK/FLIP-579%3A+LATERAL+SNAPSHOT+Join >>>>>>>>>>>>>>>>> [2] >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>> >>>>> >>> https://nightlies.apache.org/flink/flink-docs-stable/docs/dev/table/sql/queries/joins/#temporal-joins >>>>>>>>>>>>>>>>> [3] https://issues.apache.org/jira/browse/FLINK-19830 >>>>>>>>>>>>>>>>> [4] >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>> >>>>> >>> https://nightlies.apache.org/flink/flink-docs-stable/docs/dev/table/sql/queries/joins/#temporal-table-function-join >>>>>>>>>>>>>>>>> [5] >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>> >>>>> >>> https://cwiki.apache.org/confluence/display/FLINK/FLIP-517%3A+Better+Handling+of+Dynamic+Table+Primitives+with+PTFs#FLIP517:BetterHandlingofDynamicTablePrimitiveswithPTFs-SNAPSHOTfortemporaljoins >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>> >>>>>>> >>>>> >>>>> >>> >>>
