Window join¶
Status: Native. Both sides carry the same window-attached windowing — TUMBLE, HOP, or
CUMULATE — and match within the shared window rather than an explicit BETWEEN bound. Like the
interval join, it is not changelog-aware: both inputs must be insert-only, and a
retracting/updating input falls it back per the insert-only guard.
Admission¶
The same key/type/residual conditions as the interval join — a supported-type equi-key, null-dropping keys for a non-INNER join, a non-equi residual the native expression engine can express, and all four join types (INNER/LEFT/RIGHT/FULL) native — plus one condition specific to this shape: both sides must carry the same time semantics, either both event-time windows or both proctime windows. An event-time/proctime mismatch between the two sides' windowing isn't native.
An event-time window join closes each window on the watermark, like the windowed aggregate; a proctime window join closes it on a processing-time timer instead.
Falls back to Flink when¶
- the join type isn't INNER, LEFT, RIGHT, or FULL;
- there's no equi key;
- the key columns aren't null-dropping for a non-INNER join;
- the equi-key type is outside the supported set;
- the non-equi residual isn't expressible by the native expression engine;
- the two sides' windowing doesn't share time semantics (one event-time, one proctime);
- either side's window rides a
TIMESTAMP_LTZtime attribute in a session zone the window-assignment zone gate rejects (any historical or recurring transition, or a fixed offset not aligned with the window slide).
Window start/end payload columns remain local wall-clock values. The join compares its watermark or processing-time clock after applying the fixed offset and fires at the window's final millisecond. Both inputs must use the same time domain. Late rows are rejected using that same threshold, including after recovery. See the state upgrade contract for checkpoints written before the boundary correction.