Skip to content

feat(sql): window join#6292

Merged
bluestreak01 merged 323 commits intomasterfrom
puzpuzpuz_parallel_window_join_poc
Dec 20, 2025
Merged

feat(sql): window join#6292
bluestreak01 merged 323 commits intomasterfrom
puzpuzpuz_parallel_window_join_poc

Conversation

@puzpuzpuz
Copy link
Copy Markdown
Contributor

@puzpuzpuz puzpuzpuz commented Oct 21, 2025

Adds new WINDOW JOIN syntax for time-based aggregations:

SELECT t.*, avg(p.bid) avg_big, avg(p.ask) avg_ask
FROM trades t
WINDOW JOIN prices p ON p.sym = t.sym
  RANGE BETWEEN 1 second PRECEDING and 1 second FOLLOWING INCLUDE PREVAILING;

Here, each trades row is joined with all prices rows with the matching sym value from the [-1s, 1s] interval, inclusive, and then aggregations are calculated for the joined prices rows.

In case of symbol-based join, the execution may use SIMD instructions to calculate the aggregates. Other than that, the execution may use multiple threads as long as left-hand table has many rows.

Both INCLUDE PREVAILING (the default) and EXCLUDE PREVAILING clauses of WINDOW JOIN is supported. In case of the EXCLUDE PREVAILING clause, only the right-hand table rows from the window interval are aggregated. The INCLUDE PREVAILING clause also includes the latest right-hand table row (think, price) before the interval (think, ASOF JOIN combined with EXCLUDE PREVAILING WINDOW JOIN).

Requirements:

  • Right-hand side of the query must be a "physical" table, i.e. not a sub-query.
  • WINDOW JOINs can be chained in the same query level, but can't be mixed with other JOIN types, e.g. OUTER JOIN. Although, it's possible to use other JOIN types if WINDOW JOIN is moved to a sub-query.

GA Readiness Checklist

  • Replace hardcoded 1024 symbol limit with dynamic hash tables to support arbitrary symbol value sizes @kafka1991
  • Support more vectorized aggregate functions for AsyncFastWindowJoinRecordCursorFactory @RaphDal
  • Support all fixed-size types (that have aggregate functions) @RaphDal
  • Single-thread WindowJoinFactory @RaphDal
  • FastWindowJoin support join filter @kafka1991
  • NormalWindowJoin supports vectorized aggregate when joinFilter is null @kafka1991
  • AsyncWindowJoin support case when slave doesn't support TimeFrameCursor @RaphDal
  • Small page frame size for window join @kafka1991
  • Apply time intrinsics from the left-hand table to the right-hand table @kafka1991
  • remove TODO comments throughout the codebase.@kafka1991
  • Support limit in master table @RaphDal
  • Fix memory leak in SqlCodeGenerator around window join factory creation: when the code throws SqlException, we need to make sure that filter and groupByFunctions (and any other intermediate structs) are closed
  • Double check that vectorized reducers kick in when all aggregate functions use right-hand columns only and cover left-hand/right-hand column expression case with tests
  • Support window join chains @kafka1991
  • Add single-threaded Fast factory - @RaphDal
  • Add parallel tests - @puzpuzpuz
  • Add parallel tests that involve functions which use group by allocator - @puzpuzpuz
  • Fix missing casts in column sink @kafka1991
  • Cover binary search in TimeFrameHelper with tests
  • Add tests with multiple window joins involving the same left-hand table
  • Add parallel test for vectorized impl that satisfies the perWorkerGroupByFunctions != null condition
  • Add more tests, specially for edge case validation.
  • Measure performance with the latest changes - the vectorized perf should be same as it was in PoC
  • Time frame support for single threaded implementation @RaphDal
  • [Nice to have] build segment tree aggregate prototype
  • [Nice to have] AsyncWindowJoin support negative limit

Benchmarks

0.5B trades and 1.6B prices rows within a single day:

-- 123s on Ryzen 7900x + 64GB RAM box
SELECT t.*, avg(p.bid) avg_big, avg(p.ask) avg_ask
FROM trades t
WINDOW JOIN prices p ON p.sym = t.symbol
  RANGE BETWEEN '1' second PRECEDING and '1' second FOLLOWING INCLUDE PREVAILING
LIMIT -1;

-- 115s
SELECT t.*, avg(p.bid) avg_big, avg(p.ask) avg_ask
FROM trades t
WINDOW JOIN prices p ON p.sym = t.symbol
  RANGE BETWEEN '1' second PRECEDING and '1' second FOLLOWING EXCLUDE PREVAILING
LIMIT -1;

Microbenchmark results for the new DirectIntIntHashMap hash table used in the symbol column equality operator:

Benchmark                                  (size)  Mode  Cnt   Score    Error  Units
IntIntHashMapBenchmark.testDirectHashMap     5000  avgt    3   4.953 ±  4.042  ns/op
IntIntHashMapBenchmark.testDirectHashMap    50000  avgt    3   4.783 ±  0.197  ns/op
IntIntHashMapBenchmark.testDirectHashMap   500000  avgt    3   4.683 ±  0.135  ns/op
IntIntHashMapBenchmark.testDirectHashMap  5000000  avgt    3  20.119 ±  3.876  ns/op
IntIntHashMapBenchmark.testHashMap           5000  avgt    3   4.682 ± 10.045  ns/op
IntIntHashMapBenchmark.testHashMap          50000  avgt    3   5.380 ±  0.804  ns/op
IntIntHashMapBenchmark.testHashMap         500000  avgt    3   5.165 ±  0.623  ns/op
IntIntHashMapBenchmark.testHashMap        5000000  avgt    3  16.193 ±  6.691  ns/op
IntIntHashMapBenchmark.testStdHashMap        5000  avgt    3   9.468 ±  0.282  ns/op
IntIntHashMapBenchmark.testStdHashMap       50000  avgt    3  11.244 ±  1.683  ns/op
IntIntHashMapBenchmark.testStdHashMap      500000  avgt    3  30.416 ± 32.222  ns/op
IntIntHashMapBenchmark.testStdHashMap     5000000  avgt    3  82.271 ± 13.793  ns/op

New EqSymFunctionFactory speeds up filters like sym_col1 = sym_col2:

create table x as (
  select rnd_symbol('1','3','5',null) a, rnd_symbol('1','4','5',null) b
  from long_sequence(100_000_000)
);

-- master 1.24s
-- patch 65ms
select count() from x where a = b;

Microbenchmark results for Vect#sum*Acc() functions (they're now vectorized):

# before
Benchmark                                    Mode  Cnt     Score   Error  Units
SumDoubleBenchmark.testVectSumDouble         avgt    2   165.845          ns/op
SumDoubleBenchmark.testVectSumDoubleAcc      avgt    2  1122.349          ns/op

# after
Benchmark                                Mode  Cnt     Score   Error  Units
SumDoubleBenchmark.testVectSumDoubleAcc  avgt    2   151.589          ns/op

# before
Benchmark                            Mode  Cnt     Score   Error  Units
SumLongBenchmark.testVectSumLong     avgt    2   125.216          ns/op
SumLongBenchmark.testVectSumLongAcc  avgt    2  1128.825          ns/op

# after
Benchmark                            Mode  Cnt    Score   Error  Units
SumLongBenchmark.testVectSumLongAcc  avgt    2  159.327          ns/op

# before
Benchmark                          Mode  Cnt    Score   Error  Units
SumIntBenchmark.testVectSumInt     avgt    2   89.560          ns/op
SumIntBenchmark.testVectSumIntAcc  avgt    2  558.675          ns/op

# after
Benchmark                          Mode  Cnt    Score   Error  Units
SumIntBenchmark.testVectSumIntAcc  avgt    2  122.994          ns/op

# before
Benchmark                            Mode  Cnt     Score   Error  Units
SumShortBenchmark.testJavaHeapSum    avgt    2  4861.724          ns/op
SumShortBenchmark.testJavaNativeSum  avgt    2  4852.106          ns/op
SumShortBenchmark.testNativeSum      avgt    2   300.381          ns/op

# after
Benchmark                        Mode  Cnt    Score   Error  Units
SumShortBenchmark.testNativeSum  avgt    2   97.380          ns/op

@puzpuzpuz puzpuzpuz self-assigned this Oct 21, 2025
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Oct 21, 2025

Important

Review skipped

Auto reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch puzpuzpuz_parallel_window_join_poc

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@puzpuzpuz puzpuzpuz marked this pull request as ready for review October 29, 2025 19:11
@puzpuzpuz puzpuzpuz added DO NOT MERGE These changes should not be merged to main branch New feature Feature requests SQL Issues or changes relating to SQL execution labels Oct 29, 2025
@puzpuzpuz puzpuzpuz force-pushed the puzpuzpuz_parallel_window_join_poc branch from a5a40b7 to 59148b5 Compare December 18, 2025 09:58
GitHub Actions - Rebuild Native Libraries and others added 2 commits December 18, 2025 10:03
@puzpuzpuz puzpuzpuz force-pushed the puzpuzpuz_parallel_window_join_poc branch from 7b1d2a0 to 490f846 Compare December 18, 2025 10:31
@glasstiger
Copy link
Copy Markdown
Contributor

[PR Coverage check]

😍 pass : 4371 / 5716 (76.47%)

file detail

path covered line new line coverage
🔵 io/questdb/griffin/engine/functions/constants/Decimal8Constant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/CharConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/LongConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/GeoShortConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/IPv4Constant.java 0 5 00.00%
🔵 io/questdb/cairo/sql/Function.java 0 1 00.00%
🔵 io/questdb/griffin/engine/functions/constants/DateConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/DoubleConstant.java 0 5 00.00%
🔵 io/questdb/cairo/sql/TimeFrameCursor.java 0 2 00.00%
🔵 io/questdb/griffin/engine/QueryProgress.java 0 2 00.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountVarcharGroupByFunction.java 0 1 00.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastArrayGroupByFunction.java 0 1 00.00%
🔵 io/questdb/cairo/wal/WalApplySqlExecutionContext.java 0 1 00.00%
🔵 io/questdb/griffin/engine/functions/UnaryFunction.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/UuidConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountLong256GroupByFunction.java 0 1 00.00%
🔵 io/questdb/griffin/engine/functions/constants/GeoIntConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/Long128Constant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/IntervalConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountUuidGroupByFunction.java 0 1 00.00%
🔵 io/questdb/griffin/engine/functions/TernaryFunction.java 0 7 00.00%
🔵 io/questdb/griffin/engine/functions/constants/GeoByteConstant.java 0 5 00.00%
🔵 io/questdb/cairo/sql/RecordCursorFactory.java 0 3 00.00%
🔵 io/questdb/griffin/engine/functions/constants/Decimal256Constant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/Decimal64Constant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/GeoLongConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountSymbolGroupByFunction.java 0 1 00.00%
🔵 io/questdb/cairo/map/MapValue.java 0 1 00.00%
🔵 io/questdb/griffin/engine/functions/constants/Decimal128Constant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/Decimal32Constant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastTimestampGroupByFunction.java 0 3 00.00%
🔵 io/questdb/griffin/engine/functions/constants/TimestampConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstTimestampGroupByFunction.java 0 4 00.00%
🔵 io/questdb/griffin/engine/functions/constants/Decimal16Constant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/constants/ShortConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountStrGroupByFunction.java 0 1 00.00%
🔵 io/questdb/griffin/engine/functions/constants/Long256Constant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/MultiArgFunction.java 0 11 00.00%
🔵 io/questdb/griffin/engine/functions/constants/FloatConstant.java 0 5 00.00%
🔵 io/questdb/griffin/engine/groupby/FlyweightMapValueImpl.java 25 142 17.61%
🔵 io/questdb/griffin/engine/functions/groupby/FirstGeoHashGroupByFunctionLong.java 1 4 25.00%
🔵 io/questdb/griffin/engine/table/SelectedRecordCursorFactory.java 1 4 25.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstGeoHashGroupByFunctionShort.java 1 4 25.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstGeoHashGroupByFunctionInt.java 1 4 25.00%
🔵 io/questdb/griffin/engine/table/ExtraNullColumnRecord.java 12 43 27.91%
🔵 io/questdb/griffin/engine/groupby/GroupByColumnSink.java 59 212 27.83%
🔵 io/questdb/griffin/engine/groupby/FlyweightCompactMapValue.java 34 122 27.87%
🔵 io/questdb/cairo/DefaultCairoConfiguration.java 1 3 33.33%
🔵 io/questdb/griffin/engine/table/ExtraNullColumnCursorFactory.java 58 125 46.40%
🔵 io/questdb/griffin/engine/table/AsyncGroupByNotKeyedAtom.java 2 4 50.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstNotNullGeoHashGroupByFunctionFactory.java 21 37 56.76%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullGeoHashGroupByFunctionFactory.java 21 37 56.76%
🔵 io/questdb/griffin/engine/groupby/SampleByFillPrevNotKeyedRecordCursorFactory.java 4 7 57.14%
🔵 io/questdb/griffin/engine/functions/BinaryFunction.java 3 5 60.00%
🔵 io/questdb/griffin/engine/functions/constants/IntConstant.java 3 5 60.00%
🔵 io/questdb/griffin/engine/table/ExtraNullColumnRecordCursor.java 23 34 67.65%
🔵 io/questdb/griffin/model/QueryModel.java 42 62 67.74%
🔵 io/questdb/cairo/map/Unordered4MapValue.java 34 48 70.83%
🔵 io/questdb/griffin/engine/groupby/SampleByFillNoneNotKeyedRecordCursorFactory.java 7 10 70.00%
🔵 io/questdb/cairo/map/UnorderedVarcharMapValue.java 34 47 72.34%
🔵 io/questdb/cairo/map/Unordered8MapValue.java 36 48 75.00%
🔵 io/questdb/griffin/engine/table/PageFrameRecordCursorFactory.java 6 8 75.00%
🔵 io/questdb/griffin/engine/functions/GroupByFunction.java 6 8 75.00%
🔵 io/questdb/griffin/engine/join/WindowJoinFastRecordCursorFactory.java 510 665 76.69%
🔵 io/questdb/griffin/engine/join/AsyncWindowJoinRecordCursorFactory.java 796 1033 77.06%
🔵 io/questdb/griffin/engine/functions/groupby/FirstBooleanGroupByFunction.java 4 5 80.00%
🔵 io/questdb/cairo/ColumnTypes.java 8 10 80.00%
🔵 io/questdb/griffin/engine/functions/columns/ColumnFunction.java 4 5 80.00%
🔵 io/questdb/griffin/engine/functions/groupby/SumShortGroupByFunction.java 4 5 80.00%
🔵 io/questdb/griffin/engine/functions/groupby/SumIntGroupByFunction.java 4 5 80.00%
🔵 io/questdb/griffin/engine/groupby/DirectMapValueFactory.java 9 11 81.82%
🔵 io/questdb/griffin/engine/table/TimeFrameCursorImpl.java 14 17 82.35%
🔵 io/questdb/griffin/engine/groupby/SimpleMapValue.java 77 92 83.70%
🔵 io/questdb/griffin/engine/functions/groupby/AvgShortGroupByFunction.java 5 6 83.33%
🔵 io/questdb/cairo/GenericRecordMetadata.java 11 13 84.62%
🔵 io/questdb/griffin/engine/join/WindowJoinRecordCursorFactory.java 197 231 85.28%
🔵 io/questdb/griffin/engine/functions/groupby/CountIntGroupByFunction.java 6 7 85.71%
🔵 io/questdb/griffin/engine/join/WindowJoinTimeFrameHelper.java 252 293 86.01%
🔵 io/questdb/griffin/SqlParser.java 75 87 86.21%
🔵 io/questdb/griffin/engine/join/AsyncWindowJoinRecordCursor.java 207 239 86.61%
🔵 io/questdb/griffin/engine/functions/eq/EqSymFunctionFactory.java 34 38 89.47%
🔵 io/questdb/griffin/engine/functions/groupby/CountGeoHashGroupByFunctionByte.java 9 10 90.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountGeoHashGroupByFunctionInt.java 9 10 90.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountGeoHashGroupByFunctionShort.java 9 10 90.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountGeoHashGroupByFunctionLong.java 9 10 90.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountIPv4GroupByFunction.java 10 11 90.91%
🔵 io/questdb/std/DirectIntMultiLongHashMap.java 121 132 91.67%
🔵 io/questdb/griffin/engine/functions/groupby/CountFloatGroupByFunction.java 11 12 91.67%
🔵 io/questdb/griffin/model/RuntimeIntervalModelBuilder.java 22 24 91.67%
🔵 io/questdb/griffin/model/ExpressionNode.java 13 14 92.86%
🔵 io/questdb/griffin/SqlKeywords.java 24 26 92.31%
🔵 io/questdb/griffin/engine/table/ConcurrentTimeFrameCursor.java 72 78 92.31%
🔵 io/questdb/griffin/model/WindowJoinContext.java 67 70 95.71%
🔵 io/questdb/griffin/SqlOptimiser.java 142 148 95.95%
🔵 io/questdb/griffin/engine/join/AsyncWindowJoinFastAtom.java 68 71 95.77%
🔵 io/questdb/std/DirectIntIntHashMap.java 94 97 96.91%
🔵 io/questdb/griffin/engine/join/AsyncWindowJoinAtom.java 264 273 96.70%
🔵 io/questdb/std/DirectIntLongHashMap.java 99 102 97.06%
🔵 io/questdb/griffin/engine/join/WindowJoinPrevailingCache.java 55 56 98.21%
🔵 io/questdb/griffin/engine/functions/groupby/MaxDoubleGroupByFunction.java 5 5 100.00%
🔵 io/questdb/griffin/engine/join/AsOfJoinDenseRecordCursorFactoryBase.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstIntGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstShortGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountLongGroupByFunction.java 6 6 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastDoubleGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/groupby/SampleByFillValueNotKeyedRecordCursorFactory.java 11 11 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstFloatGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstCharGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastCharGroupByFunctionFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/table/AsyncTopKRecordCursorFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MaxFloatGroupByFunction.java 10 10 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstNotNullFloatGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastCharGroupByFunction.java 4 4 100.00%
🔵 io/questdb/cairo/sql/PageFrameMemoryRecord.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstNotNullIPv4GroupByFunctionFactory.java 8 8 100.00%
🔵 io/questdb/griffin/model/IntrinsicModel.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastFloatGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/groupby/GroupByLongList.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/AvgDoubleGroupByFunction.java 7 7 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastLongGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/join/JoinRecordMetadata.java 3 3 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullDoubleGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/BasePlanSink.java 5 5 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastDateGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MinDateGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastShortGroupByFunctionFactory.java 1 1 100.00%
🔵 io/questdb/cairo/map/OrderedMapValue.java 48 48 100.00%
🔵 io/questdb/griffin/engine/join/LtJoinNoKeyFastRecordCursorFactory.java 1 1 100.00%
🔵 io/questdb/griffin/SqlExecutionContextImpl.java 19 19 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MaxIPv4GroupByFunction.java 10 10 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullLongGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstNotNullIntGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullCharGroupByFunctionFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MaxDateGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastIPv4GroupByFunction.java 4 4 100.00%
🔵 io/questdb/PropertyKey.java 3 3 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstNotNullCharGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullDateGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MinLongGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/join/FilteredAsOfJoinNoKeyFastRecordCursorFactory.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastBooleanGroupByFunction.java 4 4 100.00%
🔵 io/questdb/cairo/map/OrderedMap.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastByteGroupByFunctionFactory.java 1 1 100.00%
🔵 io/questdb/griffin/SqlCompilerImpl.java 2 2 100.00%
🔵 io/questdb/griffin/model/RuntimeIntervalModel.java 3 3 100.00%
🔵 io/questdb/griffin/engine/join/AsOfJoinIndexedRecordCursorFactory.java 1 1 100.00%
🔵 io/questdb/cairo/sql/TimeFrame.java 30 30 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastByteGroupByFunction.java 4 4 100.00%
🔵 io/questdb/cairo/CairoConfigurationWrapper.java 3 3 100.00%
🔵 io/questdb/griffin/engine/table/AsyncFilteredRecordCursorFactory.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastShortGroupByFunction.java 4 4 100.00%
🔵 io/questdb/cairo/map/MapFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstNotNullLongGroupByFunction.java 8 8 100.00%
🔵 io/questdb/std/IntList.java 3 3 100.00%
🔵 io/questdb/griffin/engine/table/AsyncGroupByNotKeyedRecordCursorFactory.java 1 1 100.00%
🔵 io/questdb/PropServerConfiguration.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/SumLongGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/groupby/SampleByFillNullNotKeyedRecordCursorFactory.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstDoubleGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastIntGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MinTimestampGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/join/WindowJoinSymbolTableSource.java 12 12 100.00%
🔵 io/questdb/griffin/engine/join/AsOfJoinNoKeyFastRecordCursorFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstNotNullDateGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullDateGroupByFunctionFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MinFloatGroupByFunction.java 10 10 100.00%
🔵 io/questdb/cairo/ColumnType.java 2 2 100.00%
🔵 io/questdb/griffin/engine/groupby/vect/SumDoubleVectorAggregateFunction.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MaxCharGroupByFunction.java 10 10 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MinIPv4GroupByFunction.java 11 11 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MinDoubleGroupByFunction.java 5 5 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MaxLongGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountDoubleGroupByFunction.java 7 7 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstIPv4GroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/table/SelectedRecord.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MaxTimestampGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullIntGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/groupby/GroupByUtils.java 2 2 100.00%
🔵 io/questdb/griffin/engine/join/AsOfJoinFastRecordCursorFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/table/AsyncGroupByRecordCursorFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/table/AbstractPageFrameRecordCursorFactory.java 3 3 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstLongGroupByFunction.java 4 4 100.00%
🔵 io/questdb/cairo/sql/async/PageFrameReduceTask.java 6 6 100.00%
🔵 io/questdb/std/DirectLongList.java 9 9 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastGeoHashGroupByFunctionFactory.java 57 57 100.00%
🔵 io/questdb/griffin/engine/table/AsyncJitFilteredRecordCursorFactory.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MinIntGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullIPv4GroupByFunctionFactory.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/SumDoubleGroupByFunction.java 5 5 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstNotNullDoubleGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MinCharGroupByFunction.java 11 11 100.00%
🔵 io/questdb/griffin/engine/join/FilteredAsOfJoinFastRecordCursorFactory.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstByteGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstGeoHashGroupByFunctionByte.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/CountLongConstGroupByFunction.java 4 4 100.00%
🔵 io/questdb/cairo/mv/MatViewRefreshSqlExecutionContext.java 1 1 100.00%
🔵 io/questdb/griffin/engine/groupby/GroupByNotKeyedRecordCursorFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/SumFloatGroupByFunction.java 14 14 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullCharGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/LastNotNullFloatGroupByFunction.java 8 8 100.00%
🔵 io/questdb/griffin/engine/join/AsOfJoinMemoizedRecordCursorFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/FirstDateGroupByFunction.java 4 4 100.00%
🔵 io/questdb/griffin/engine/functions/groupby/MaxIntGroupByFunction.java 4 4 100.00%

@bluestreak01 bluestreak01 merged commit cf8c145 into master Dec 20, 2025
45 checks passed
@bluestreak01 bluestreak01 deleted the puzpuzpuz_parallel_window_join_poc branch December 20, 2025 01:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

New feature Feature requests SQL Issues or changes relating to SQL execution

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants