probeSegments
private fn
void probeSegments(bool csr, Tables)(Tables tables, size_t mask,
const ArrayData[][] lkeyChunks, const size_t[] lstarts,
const size_t[] lHashes, const ArrayData[][] rkeyChunks,
const size_t[] rstarts, const ColumnEq[] eqs,
JoinKind kind, size_t segLen, size_t nSegs, size_t lheight,
ref size_t[][] segLeft, ref size_t[][] segRight,
size_t[][] matchedRight = null)The probe (ADR-2026-10-19-02, ADR-2026-10-23-03): fixed left-row segments over the immutable table, each first counting its hash-equal candidates (integer compares only - the typed key equality runs once, in the fill pass), allocating its lists once at the bound, then filling. LEFT padding adds one candidate per non-null-key left row, so the bound is exact except for hash collisions. The concatenation over segments is the serial probe's output, bit for bit, whatever the scheduling.
Parameters
csr | which table shape to walk (true CSR, false chains) |
tables | the CSR table (CsrTable) or the chain table (ChainTables) |
mask | the slot mask |
lchunks | the left key's chunks |
lstarts | the left chunks' global starts |
lHashes | the left rows' hashes |
rchunks | the right key's chunks |
rstarts | the right chunks' global starts |
keyEq | the typed key equality |
kind | the join kind (LEFT pads unmatched rows) |
segLen | the segment length |
nSegs | the segment count |
lheight | the left row count |
segLeft | the per-segment left-row lists (the output) |
segRight | the per-segment right-row lists (the output) |