Skip to content

feat(core): N-dimensional array support#5243

Merged
bluestreak01 merged 856 commits intomasterfrom
nd_arr
Jun 2, 2025
Merged

feat(core): N-dimensional array support#5243
bluestreak01 merged 856 commits intomasterfrom
nd_arr

Conversation

@amunra
Copy link
Copy Markdown
Contributor

@amunra amunra commented Dec 11, 2024

N-Dimensional Array is a flat array of numbers, but with a hierarchical addressing scheme applied to it, which makes it usable as an N-dimensional array accessed with N indexes.

Hierarchical subdivision of the flat array:

dim 0: |. . . . . .|. . . . . .| -- stride = 6, len = 2
dim 1: |. .|. .|. .|. .|. .|. .| -- stride = 2, len = 3
dim 2: |.|.|.|.|.|.|.|.|.|.|.|.| -- stride = 1, len = 2

Formula to access a member with syntax arr[i,j,k]:

flatIndex = 6i + 2j + k

Note that this is just summing up contributions at each dimension. We can perform it in any order. This fact makes transposing an array a cheap operation.

New SQL syntax

Assuming CREATE TABLE tango (a DOUBLE, b DOUBLE) and CREATE TABLE samba (arr DOUBLE[][]), these work:

  • SELECT ARRAY[1.0, 2.0, 3.0] -- DOUBLE array literal
  • SELECT ARRAY[1, 2, 3] -- also DOUBLE array literal (auto-cast)
  • SELECT ARRAY[a, b] FROM tango
  • SELECT ARRAY[[a], [b]] FROM tango
  • INSERT INTO samba SELECT ARRAY[[a, a], [b, b]] FROM tango
  • CREATE TABLE foxtrot AS (SELECT ARRAY[[a, a], [b, b]] arr FROM tango)
  • SELECT arr[1, 2] FROM samba -- returns the value in the DOUBLE[][] array at coordinates (1, 2)
  • SELECT arr[1] FROM samba -- returns the DOUBLE[] sub-array at index 1
  • SELECT arr[1][2] FROM samba -- same result and performance as arr[1, 2]
  • SELECT arr[2:] FROM samba -- a slice without the upper bound takes everything from the lower bound till the end of that dimension. The returned array has the same dimensionality -- in this case, DOUBLE[][].
  • SELECT arr[1:100] FROM samba -- a slice with up to 100 elements. If the array is shorter, this returns the entire array.
  • SELECT arr[2:3, 3:4] FROM samba -- selects a slice of the DOUBLE[][] array, comprising of the second row and third column. The returned array has two dimensions, each of length 1.
  • SELECT arr[2:3, 3:4][1] FROM samba -- first selects the slice as above, then takes the sub-array at index 1 of the slice (part of the 2nd row of the original array, a DOUBLE[])
  • SELECT arr[1:, 2] FROM samba -- selects a DOUBLE[] subarray of all the 2nd elements in the 2nd dimension
  • etc. all other combinations of slicing and indexing
  • SELECT a * a FROM samba -- element-wise multiplication of arrays with same shape
  • SELECT a + a FROM samba -- element-wise addition of arrays with same shape
  • SELECT matmul(arr, transpose(arr)) FROM samba -- multiplies matrix with its transposed self

Also implemented:

  • l2price_arr(target, price_array, size_array)
  • equality: SELECT arr1 = arr2 FROM table, SELECT arr1 != arr2 FROM table
  • dim_length(arr, 1) -- length of array's 1st dimension (1-based)

MUST HAVE:

Support in ILP clients:

  • Java
  • C
  • C++
  • Rust
  • Python
  • Node.js
  • Go

...

  • fix Javadoc errors (and keep Javadoc clean) @bluestreak01
  • fix formatting (and keep it clean) @bluestreak01
  • type literal support, as in create table tab(a double[][]); @bluestreak01
  • add SQL syntax and behaviour to create table with ARRAY columns @bluestreak01
  • ensure syntax errors are accurately reported around ☝️ @bluestreak01 / @nwoolmer
  • support array literals from expression parser (ARRAY[[1,2,bid],[2,3,ask]]) @mtopolnik
  • array access function: arr[1, 2] @mtopolnik
  • optimize array indexing composition: arr[1][2] -> arr[1, 2] @mtopolnik
  • validate array access dimensions earlier @mtopolnik
  • array slice: arr[1:3, 2:4] @mtopolnik
  • array slice with open upper bound: arr[2:] @mtopolnik
  • transpose array: t(arr) @mtopolnik
  • matrix multiplication: arr1 * arr2 @mtopolnik
  • l2price_arr() implemented for orderbook stored in arrays. It should take two array parameters: price_arr, size_arr. @mtopolnik
  • rename l2price_arr() to l2price() and make it work alongside the legacy l2price(). Currently there's a signature clash since l2price() is varargs. @mtopolnik
  • optimize array functions for constant arguments
  • optimize flat array equality check, currently it's implemented as a default interface method
  • add SQL syntax and behaviour to add column (alter table..) @nwoolmer
  • ensure syntax errors are accurately reported around ☝️ @nwoolmer
  • column type change initial stub: accurate error reporting @nwoolmer
  • introduce ArrayFunction into the function framework @bluestreak01
  • create rnd_array test function @bluestreak01
  • implement & test create as select and insert as select for arrays non-WAL @bluestreak01
  • implement & test create as select and insert as select for arrays WAL @bluestreak01
  • improve ArrayTypeDriver.arrayToJson() so it works with non-default strides (i.e., transposed array) @mtopolnik
  • augment rnd_double_array() to generate null elements and null arrays, as well as configure array shape limits @bluestreak01
  • add ARRAY to storage fuzz test system (O3 test, column top, drop/create partitions etc) @bluestreak01
  • write JSON & CSV http server tests for double arrays @bluestreak01
  • add ARRAY support to ILP https://github.com/questdb/rfc/discussions/116 @kafka1991
  • add Web Console (JSON + TXT) support for ARRAY type @bluestreak01
  • add split/merge partition tests for ARRAY type @bluestreak01
  • add PGWire support for ARRAY type @jerrinot
  • add WebConsole support to egress large arrays (e.g. egress partial column values, rather than row-level size granularity) @bluestreak01
  • WAL/non-WAL to support arrays filly, including all O3 permutations @bluestreak01
  • implement ingress for single array element type - DOUBLE
  • implement and test graceful failure when converting a partition with arrays to parquet @jerrinot
  • add PGWire support to egress large arrays (e.g. egress partial column values) @mtopolnik
  • array_length() function
  • allow ARRAY[1, 2] and auto-cast to DOUBLE[]
  • allow slice bounds to be larger than actual array, don't throw "Index out of bounds"
  • ILP over HTTP to support binary encoded arrays, stream arrays in regardless of their size
  • ILP over TCP to support binary encoded arrays, stream arrays in regardless of their size
  • ensure you can use DEDUP on a table that has arrays. Array as dedup key is not supported. @mtopolnik
  • update docs: "Columns of ARRAY type cannot be used in UPSERT KEYS list" @mtopolnik Add ARRAY as non-dedup type + generally improve text documentation#156
  • add tests for union/set SQLs for array type cast or lack of thereof (correct error reporting) @jerrinot
  • benchmark ARRAY ingress @mtopolnik
  • prevent special NULL value of LONG and other types from occurring in an array
  • make sure we ban any other array element type except DOUBLE @mtopolnik
  • go through as many sqls as possible and make sure we ban or assert exceptions for arrays @nwoolmer
  • test GROUP BY, SORT, JOIN, etc
  • test replication @mtopolnik

Stage 2 - data ingress refinement

  • add WebConsole support to ingress large arrays from INSERT statement, e.g. send queries as POST request (optionally) @bluestreak01
  • integrate array column type with Parquet partitions (ser/des need to support the type) and cover that with tests
  • add PGWire support to ingress large arrays (? - partial message parsing, test first)
  • array support in Go client
  • array support in Node.js client
  • array support in .Net client

Stage 3 - data egress

  • programmatic PG wire, casual select from array column - extend buffer for SQL temporarily, up to max limit, fail when array is beyond max limit
  • support PG COPY for unlimited array streaming - if array beyond max limit
  • REST (Web Console) - send array as is below X bytes and sent string preview above X byte. Add something that would allow the Web Console preview more of array data in popup window
  • REST - send chunked array fully

Stage X - Misc

  • support array column type in DEDUP
  • integrate array column type with Parquet partitions (ser/des need to support the type) and cover that with tests
  • approx_percentile overload that accepts an array of percents and returns an array of results

Stage 3 - misc

  • type cast, e.g. cast scalar to array, string to array, array-to-array

@amunra amunra marked this pull request as ready for review December 13, 2024 15:06
@amunra amunra marked this pull request as draft December 13, 2024 15:06
@bluestreak01 bluestreak01 marked this pull request as ready for review January 28, 2025 19:41
@CLAassistant
Copy link
Copy Markdown

CLAassistant commented Feb 7, 2025

CLA assistant check
All committers have signed the CLA.

@puzpuzpuz
Copy link
Copy Markdown
Contributor

Added integrate array column type with Parquet partitions (ser/des need to support the type) and cover that with tests todo item to the list as integration with Parquet seems to be missing in the plans

bluestreak01
bluestreak01 previously approved these changes Jun 2, 2025
@glasstiger
Copy link
Copy Markdown
Contributor

[PR Coverage check]

😍 pass : 4266 / 5062 (84.27%)

file detail

path covered line new line coverage
🔵 io/questdb/cairo/vm/NullMemoryCMR.java 0 1 00.00%
🔵 io/questdb/cutlass/line/array/LongArray.java 0 14 00.00%
🔵 io/questdb/cairo/map/Unordered4Map.java 0 1 00.00%
🔵 io/questdb/griffin/engine/join/JoinRecord.java 0 3 00.00%
🔵 io/questdb/cairo/sql/DelegatingRecord.java 0 1 00.00%
🔵 io/questdb/cairo/map/Unordered8Map.java 0 1 00.00%
🔵 io/questdb/std/str/DirectUtf8String.java 0 6 00.00%
🔵 io/questdb/cairo/map/Unordered2Map.java 0 1 00.00%
🔵 io/questdb/griffin/engine/groupby/SplitVirtualRecord.java 0 1 00.00%
🔵 io/questdb/griffin/model/ExpressionNode.java 0 1 00.00%
🔵 io/questdb/cairo/sql/Record.java 0 1 00.00%
🔵 io/questdb/griffin/OperatorRegistry.java 0 4 00.00%
🔵 io/questdb/cairo/SingleRecordSink.java 0 5 00.00%
🔵 io/questdb/griffin/engine/functions/date/IntervalFunctionFactory.java 0 12 00.00%
🔵 io/questdb/griffin/engine/functions/UndefinedFunction.java 0 3 00.00%
🔵 io/questdb/griffin/engine/window/WindowFunction.java 0 2 00.00%
🔵 io/questdb/cairo/vm/api/NullMemory.java 0 2 00.00%
🔵 io/questdb/cutlass/line/LineSenderException.java 0 2 00.00%
🔵 io/questdb/griffin/engine/functions/groupby/InterpolationGroupByFunction.java 0 7 00.00%
🔵 io/questdb/cairo/sql/ArrayFunction.java 3 35 08.57%
🔵 io/questdb/std/Numbers.java 1 10 10.00%
🔵 io/questdb/griffin/engine/functions/date/AbstractDayIntervalFunction.java 1 7 14.29%
🔵 io/questdb/griffin/engine/functions/rnd/RndIntervalFunctionFactory.java 1 7 14.29%
🔵 io/questdb/griffin/engine/functions/columns/IntervalColumn.java 1 7 14.29%
🔵 io/questdb/griffin/engine/functions/constants/IntervalTypeConstant.java 1 7 14.29%
🔵 io/questdb/griffin/engine/functions/columns/RecordColumn.java 1 6 16.67%
🔵 io/questdb/griffin/engine/functions/constants/IntervalConstant.java 1 6 16.67%
🔵 io/questdb/griffin/engine/functions/bind/IndexedParameterLinkFunction.java 2 9 22.22%
🔵 io/questdb/cutlass/line/LineUdpSender.java 3 11 27.27%
🔵 io/questdb/griffin/engine/functions/UntypedFunction.java 1 3 33.33%
🔵 io/questdb/griffin/engine/functions/bind/NamedParameterLinkFunction.java 1 3 33.33%
🔵 io/questdb/griffin/engine/functions/Long128Function.java 1 3 33.33%
🔵 io/questdb/cutlass/line/LineTcpSenderV1.java 4 12 33.33%
🔵 io/questdb/griffin/engine/functions/json/JsonExtractFunction.java 1 3 33.33%
🔵 io/questdb/cutlass/line/http/LineHttpSenderV1.java 5 13 38.46%
🔵 io/questdb/cutlass/line/array/FlattenArrayUtils.java 26 64 40.62%
🔵 io/questdb/std/DirectIntSlice.java 15 37 40.54%
🔵 io/questdb/std/bytes/DirectByteSink.java 15 34 44.12%
🔵 io/questdb/cutlass/line/AbstractLineTcpSender.java 1 2 50.00%
🔵 io/questdb/std/str/CharSink.java 1 2 50.00%
🔵 io/questdb/griffin/engine/functions/IntervalFunction.java 1 2 50.00%
🔵 io/questdb/griffin/engine/functions/catalogue/CurrentSchemasFunctionFactory.java 1 2 50.00%
🔵 io/questdb/cairo/arr/FunctionArray.java 33 66 50.00%
🔵 io/questdb/griffin/engine/functions/CursorFunction.java 1 2 50.00%
🔵 io/questdb/griffin/engine/functions/catalogue/StringToStringArrayFunction.java 1 2 50.00%
🔵 io/questdb/griffin/engine/functions/RecordFunction.java 2 4 50.00%
🔵 io/questdb/cairo/map/UnorderedVarcharMap.java 1 2 50.00%
🔵 io/questdb/griffin/engine/functions/AbstractGeoHashFunction.java 1 2 50.00%
🔵 io/questdb/cairo/vm/MemoryPARWImpl.java 5 9 55.56%
🔵 io/questdb/cutlass/line/LineTcpSenderV2.java 51 80 63.75%
🔵 io/questdb/std/DirectIntList.java 9 14 64.29%
🔵 io/questdb/griffin/engine/functions/FloatFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/DateFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/UuidFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/ByteFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/Long256Function.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/BinFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/StrFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/BooleanFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/CharFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/IPv4Function.java 2 3 66.67%
🔵 io/questdb/cairo/arr/DirectArray.java 81 121 66.94%
🔵 io/questdb/griffin/engine/functions/DoubleFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/SymbolFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/LongFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/ShortFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/VarcharFunction.java 2 3 66.67%
🔵 io/questdb/griffin/engine/functions/IntFunction.java 2 3 66.67%
🔵 io/questdb/cairo/vm/AbstractMemoryCR.java 2 3 66.67%
🔵 io/questdb/cutlass/pgwire/modern/PgNonNullBinaryArrayView.java 40 58 68.97%
🔵 io/questdb/griffin/engine/groupby/GroupByUtils.java 31 44 70.45%
🔵 io/questdb/griffin/engine/functions/bind/ArrayBindVariable.java 23 32 71.88%
🔵 io/questdb/cutlass/line/tcp/LineTcpParser.java 89 122 72.95%
🔵 io/questdb/client/Sender.java 32 44 72.73%
🔵 io/questdb/std/Rnd.java 36 50 72.00%
🔵 io/questdb/cairo/arr/BorrowedFlatArrayView.java 22 30 73.33%
🔵 io/questdb/cairo/sql/VirtualRecord.java 3 4 75.00%
🔵 io/questdb/griffin/engine/functions/constants/ArrayTypeConstant.java 3 4 75.00%
🔵 io/questdb/griffin/engine/functions/array/StrArrayDereferenceFunctionFactory.java 3 4 75.00%
🔵 io/questdb/cairo/arr/SingleElementDoubleArray.java 12 16 75.00%
🔵 io/questdb/griffin/engine/functions/StrArrayFunction.java 3 4 75.00%
🔵 io/questdb/cutlass/line/http/LineHttpSenderV2.java 36 48 75.00%
🔵 io/questdb/cutlass/http/DefaultHttpServerConfiguration.java 6 8 75.00%
🔵 io/questdb/cutlass/http/processors/LineHttpProcessorState.java 19 25 76.00%
🔵 io/questdb/cutlass/http/client/HttpClient.java 21 27 77.78%
🔵 io/questdb/cutlass/line/tcp/ArrayBinaryFormatParser.java 60 76 78.95%
🔵 io/questdb/griffin/engine/functions/constants/ArrayConstant.java 54 68 79.41%
🔵 io/questdb/cairo/arr/MutableArray.java 50 62 80.65%
🔵 io/questdb/cutlass/line/tcp/LineWalAppender.java 18 22 81.82%
🔵 io/questdb/cairo/BinaryTypeDriver.java 9 11 81.82%
🔵 io/questdb/griffin/engine/functions/array/ArrayCreateFunctionFactory.java 109 129 84.50%
🔵 io/questdb/griffin/engine/functions/bind/BindVariableServiceImpl.java 27 32 84.38%
🔵 io/questdb/griffin/engine/functions/array/IntIntervalRightOpenFunctionFactory.java 12 14 85.71%
🔵 io/questdb/griffin/engine/functions/finance/LevelTwoPriceArrayFunctionFactory.java 42 49 85.71%
🔵 io/questdb/cutlass/line/http/AbstractLineHttpSender.java 95 111 85.59%
🔵 io/questdb/cairo/map/OrderedMap.java 6 7 85.71%
🔵 io/questdb/griffin/engine/functions/eq/EqDoubleArrayFunctionFactory.java 17 20 85.00%
🔵 io/questdb/griffin/SqlCodeGenerator.java 109 127 85.83%
🔵 io/questdb/cairo/arr/BorrowedArray.java 53 62 85.48%
🔵 io/questdb/cairo/wal/WalEventCursor.java 18 21 85.71%
🔵 io/questdb/griffin/engine/functions/cast/CastDoubleArrayToVarcharFunctionFactory.java 13 15 86.67%
🔵 io/questdb/cairo/VarcharTypeDriver.java 7 8 87.50%
🔵 io/questdb/griffin/engine/functions/array/DoubleArrayBinaryOperator.java 65 74 87.84%
🔵 io/questdb/cutlass/pgwire/modern/PGUtils.java 16 18 88.89%
🔵 io/questdb/cutlass/line/tcp/TableUpdateDetails.java 8 9 88.89%
🔵 io/questdb/cutlass/line/tcp/LineTcpConnectionContext.java 24 27 88.89%
🔵 io/questdb/cairo/arr/DerivedArrayView.java 75 85 88.24%
🔵 io/questdb/cairo/arr/ArrayTypeDriver.java 237 264 89.77%
🔵 io/questdb/cairo/arr/ArrayView.java 102 114 89.47%
🔵 io/questdb/cairo/TableWriter.java 9 10 90.00%
🔵 io/questdb/griffin/engine/functions/rnd/RndDoubleArrayFunctionFactory.java 78 86 90.70%
🔵 io/questdb/cutlass/line/tcp/LineTcpMeasurementEvent.java 10 11 90.91%
🔵 io/questdb/cutlass/line/array/AbstractArray.java 35 38 92.11%
🔵 io/questdb/griffin/engine/functions/conditional/CaseCommon.java 13 14 92.86%
🔵 io/questdb/cairo/StringTypeDriver.java 12 13 92.31%
🔵 io/questdb/griffin/engine/functions/array/DoubleArrayAddFunctionFactory.java 14 15 93.33%
🔵 io/questdb/griffin/engine/functions/array/DoubleArrayTransposeFunctionFactory.java 15 16 93.75%
🔵 io/questdb/griffin/engine/functions/cast/CastDoubleArrayToStrFunctionFactory.java 14 15 93.33%
🔵 io/questdb/griffin/engine/functions/array/DoubleArraySubtractFunctionFactory.java 14 15 93.33%
🔵 io/questdb/cutlass/http/processors/TextQueryProcessor.java 44 47 93.62%
🔵 io/questdb/cutlass/pgwire/modern/PGPipelineEntry.java 137 145 94.48%
🔵 io/questdb/cutlass/line/AbstractLineSender.java 18 19 94.74%
🔵 io/questdb/griffin/SqlUtil.java 17 18 94.44%
🔵 io/questdb/griffin/engine/functions/array/DoubleMatrixMultiplyFunctionFactory.java 62 65 95.38%
🔵 io/questdb/griffin/engine/functions/cast/CastDoubleToDoubleArray.java 20 21 95.24%
🔵 io/questdb/cutlass/http/HttpResponseArrayWriteState.java 21 22 95.45%
🔵 io/questdb/cutlass/line/tcp/LineTcpEventBuffer.java 26 27 96.30%
🔵 io/questdb/PropServerConfiguration.java 32 33 96.97%
🔵 io/questdb/cutlass/line/tcp/AdaptiveRecvBuffer.java 88 91 96.70%
🔵 io/questdb/griffin/engine/functions/cast/CastStrToDoubleArrayFunctionFactory.java 25 26 96.15%
🔵 io/questdb/griffin/engine/functions/array/DoubleArrayFlattenFunctionFactory.java 33 34 97.06%
🔵 io/questdb/griffin/engine/functions/cast/CastDoubleArrayToDoubleArrayFunctionFactory.java 35 36 97.22%
🔵 io/questdb/griffin/FunctionParser.java 65 67 97.01%
🔵 io/questdb/std/IntStack.java 33 34 97.06%
🔵 io/questdb/cutlass/pgwire/PGOids.java 33 34 97.06%
🔵 io/questdb/cairo/ColumnType.java 83 84 98.81%
🔵 io/questdb/griffin/FunctionFactoryDescriptor.java 52 53 98.11%
🔵 io/questdb/griffin/ExpressionParser.java 245 249 98.39%
🔵 io/questdb/cutlass/pgwire/modern/DoubleArrayParser.java 89 90 98.89%
🔵 io/questdb/griffin/RecordToRowCopierUtils.java 76 77 98.70%
🔵 io/questdb/griffin/engine/functions/columns/DateColumn.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/bool/AllNotEqVarcharFunctionFactory.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/bind/CompiledFilterSymbolBindVariable.java 1 1 100.00%
🔵 io/questdb/cutlass/http/client/HttpClientException.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/bind/VarcharBindVariable.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/bind/LongBindVariable.java 1 1 100.00%
🔵 io/questdb/std/IntList.java 27 27 100.00%
🔵 io/questdb/cairo/vm/api/MemoryCARW.java 6 6 100.00%
🔵 io/questdb/cairo/wal/WalEventWriter.java 2 2 100.00%
🔵 io/questdb/cutlass/http/processors/SettingsProcessor.java 1 1 100.00%
🔵 io/questdb/cutlass/line/tcp/DefaultColumnTypes.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/finance/LevelTwoPriceFunctionFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/window/RankFunctionFactory.java 89 89 100.00%
🔵 io/questdb/griffin/engine/functions/catalogue/PgProcCatalogueCursor.java 1 1 100.00%
🔵 io/questdb/cairo/sql/async/PageFrameSequence.java 3 3 100.00%
🔵 io/questdb/cairo/wal/WalDataRecord.java 6 6 100.00%
🔵 io/questdb/cairo/O3Utils.java 3 3 100.00%
🔵 io/questdb/cutlass/http/HttpRequestProcessor.java 1 1 100.00%
🔵 io/questdb/cairo/wal/WalWriter.java 7 7 100.00%
🔵 io/questdb/griffin/engine/functions/bind/DoubleBindVariable.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/bind/ShortBindVariable.java 1 1 100.00%
🔵 io/questdb/griffin/ExpressionTreeBuilder.java 9 9 100.00%
🔵 io/questdb/griffin/engine/functions/columns/SymbolColumn.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/array/DoubleArrayAccessFunctionFactory.java 195 195 100.00%
🔵 io/questdb/griffin/engine/functions/columns/BooleanColumn.java 1 1 100.00%
🔵 io/questdb/cairo/sql/Function.java 1 1 100.00%
🔵 io/questdb/cutlass/line/tcp/LineTcpReceiverConfigurationWrapper.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/window/RowNumberFunctionFactory.java 4 4 100.00%
🔵 io/questdb/cutlass/http/HttpConnectionContext.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/columns/ArrayColumn.java 7 7 100.00%
🔵 io/questdb/griffin/engine/functions/catalogue/PgTypeCatalogueCursor.java 30 30 100.00%
🔵 io/questdb/griffin/engine/functions/array/ArrayDimLengthFunctionFactory.java 48 48 100.00%
🔵 io/questdb/griffin/engine/functions/columns/FloatColumn.java 1 1 100.00%
🔵 io/questdb/cairo/sql/PageFrameMemoryRecord.java 54 54 100.00%
🔵 io/questdb/griffin/SqlParser.java 72 72 100.00%
🔵 io/questdb/cairo/RecordChain.java 23 23 100.00%
🔵 io/questdb/std/ObjectPool.java 1 1 100.00%
🔵 io/questdb/cairo/RecordSinkFactory.java 17 17 100.00%
🔵 io/questdb/griffin/engine/functions/columns/Long128Column.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/columns/Long256Column.java 1 1 100.00%
🔵 io/questdb/griffin/engine/union/UnionCastRecord.java 3 3 100.00%
🔵 io/questdb/cairo/vm/api/MemoryCR.java 1 1 100.00%
🔵 io/questdb/cairo/arr/NoopArrayWriteState.java 5 5 100.00%
🔵 io/questdb/griffin/engine/functions/catalogue/CursorDereferenceFunctionFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/columns/ShortColumn.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/str/ConcatFunctionFactory.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/bind/DateBindVariable.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/columns/BinColumn.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/bind/Long256BindVariable.java 1 1 100.00%
🔵 io/questdb/cairo/DefaultCairoConfiguration.java 1 1 100.00%
🔵 io/questdb/griffin/engine/union/UnionRecord.java 3 3 100.00%
🔵 io/questdb/griffin/engine/functions/constants/Constants.java 2 2 100.00%
🔵 io/questdb/cutlass/http/processors/TextQueryProcessorState.java 5 5 100.00%
🔵 io/questdb/griffin/engine/table/SelectedRecord.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/bind/StrBindVariable.java 1 1 100.00%
🔵 io/questdb/cairo/CursorPrinter.java 3 3 100.00%
🔵 io/questdb/griffin/FunctionFactoryCache.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/bind/CharBindVariable.java 1 1 100.00%
🔵 io/questdb/cutlass/line/array/DoubleArray.java 14 14 100.00%
🔵 io/questdb/griffin/engine/functions/array/IntIntervalFunctionFactory.java 14 14 100.00%
🔵 io/questdb/mp/WorkerPool.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/bool/AllNotEqStrFunctionFactory.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/bind/FloatBindVariable.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/bind/IntBindVariable.java 1 1 100.00%
🔵 io/questdb/PropertyKey.java 3 3 100.00%
🔵 io/questdb/griffin/UpdateOperatorImpl.java 2 2 100.00%
🔵 io/questdb/std/MemoryTag.java 3 3 100.00%
🔵 io/questdb/griffin/OperatorExpression.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/bind/ByteBindVariable.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/columns/DoubleColumn.java 1 1 100.00%
🔵 io/questdb/std/LongList.java 1 1 100.00%
🔵 io/questdb/std/DirectByteSequenceView.java 16 16 100.00%
🔵 io/questdb/cairo/DebugUtils.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/bind/UuidBindVariable.java 1 1 100.00%
🔵 io/questdb/std/BytecodeAssembler.java 6 6 100.00%
🔵 io/questdb/griffin/engine/functions/bind/IPv4BindVariable.java 1 1 100.00%
🔵 io/questdb/griffin/SqlCompilerImpl.java 30 30 100.00%
🔵 io/questdb/griffin/engine/functions/window/LastValueDoubleWindowFunctionFactory.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/conditional/ArrayCaseFunction.java 7 7 100.00%
🔵 io/questdb/griffin/engine/functions/bind/BooleanBindVariable.java 1 1 100.00%
🔵 io/questdb/std/ObjStack.java 17 17 100.00%
🔵 io/questdb/cairo/map/OrderedMapVarSizeRecord.java 22 22 100.00%
🔵 io/questdb/std/str/DirectUtf8Sink.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/columns/UuidColumn.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/columns/LongColumn.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/array/DoubleArrayMultiplyFunctionFactory.java 15 15 100.00%
🔵 io/questdb/griffin/engine/ops/InsertOperationImpl.java 1 1 100.00%
🔵 io/questdb/cutlass/line/tcp/LineProtocolException.java 4 4 100.00%
🔵 io/questdb/cairo/CairoConfigurationWrapper.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/array/DoubleArraySliceFunctionFactory.java 2 2 100.00%
🔵 io/questdb/griffin/engine/functions/BinaryFunction.java 2 2 100.00%
🔵 io/questdb/cutlass/line/tcp/TableStructureAdapter.java 4 4 100.00%
🔵 io/questdb/griffin/SqlOptimiser.java 1 1 100.00%
🔵 io/questdb/DefaultServerConfiguration.java 3 3 100.00%
🔵 io/questdb/griffin/engine/functions/columns/TimestampColumn.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/constants/NullConstant.java 2 2 100.00%
🔵 io/questdb/cutlass/line/tcp/DefaultLineTcpReceiverConfiguration.java 5 5 100.00%
🔵 io/questdb/griffin/InsertRowImpl.java 1 1 100.00%
🔵 io/questdb/griffin/engine/table/AbstractPageFrameRecordCursor.java 2 2 100.00%
🔵 io/questdb/HttpClientConfiguration.java 1 1 100.00%
🔵 io/questdb/cutlass/pgwire/modern/TypesAndInsertModern.java 1 1 100.00%
🔵 io/questdb/cutlass/http/processors/JsonQueryProcessorState.java 26 26 100.00%
🔵 io/questdb/griffin/SqlKeywords.java 6 6 100.00%
🔵 io/questdb/griffin/engine/functions/columns/ByteColumn.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/TimestampFunction.java 2 2 100.00%
🔵 io/questdb/std/DoubleList.java 1 1 100.00%
🔵 io/questdb/std/bytes/DirectByteSlice.java 6 6 100.00%
🔵 io/questdb/griffin/engine/functions/bind/TimestampBindVariable.java 1 1 100.00%
🔵 io/questdb/griffin/engine/functions/columns/IntColumn.java 1 1 100.00%

@bluestreak01 bluestreak01 merged commit 4b46f23 into master Jun 2, 2025
37 checks passed
@bluestreak01 bluestreak01 deleted the nd_arr branch June 2, 2025 18:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Core Related to storage, data type, etc. New feature Feature requests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants