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