Files
greptimedb/tests/compatibility/cases/avg_state_binary/setup.sql
T
discord9anddiscord9 5ef8a46e3f feat(function): add mergeable binary average states (#9062)
* feat(function): add mergeable binary average states

Signed-off-by: discord9 <discord9@163.com>

* feat(function): expose avg_calc as an OSS scalar

Signed-off-by: discord9 <discord9@163.com>

* fix(function): borrow invalid AVG scalar argument type

Signed-off-by: discord9 <discord9@163.com>

* test(function): verify public AVG state SQL finalization

Signed-off-by: discord9 <discord9@163.com>

* fix(function): return canonical AVG1 state for empty window frames

DataFusion's plain-aggregate window executor bypasses the accumulator
and calls default_value() directly when a window frame contains no
rows. create_udaf's SimpleAggregateUDF derives default_value from the
return type, which yields SQL NULL for Binary output instead of the
canonical AVG1 empty state, so empty frames and frames over only NULL
inputs became observable differently (IS NULL, direct state saves,
state comparisons).

Register avg_state/avg_merge through a small AggregateUDFImpl (AvgUdaf)
that keeps the existing accumulator and declares the canonical AVG1
empty state as default_value, restoring the documented contract. Add a
unit test asserting default_value equals the empty accumulator's
evaluate() and an sqlness case covering the empty-frame window.

Signed-off-by: discord9 <discord9@outlook.com>

---------

Signed-off-by: discord9 <discord9@163.com>
Signed-off-by: discord9 <discord9@outlook.com>
Co-authored-by: discord9 <discord9@outlook.com>
2026-09-18 07:02:10 +00:00

15 lines
520 B
SQL

CREATE TABLE avg1_states (
seq_id INT PRIMARY KEY,
state BINARY,
ts TIMESTAMP TIME INDEX
);
-- AVG1: magic (4 bytes), little-endian u64 count, little-endian f64 sum.
INSERT INTO avg1_states (seq_id, state, ts) VALUES
(1, X'4156473102000000000000000000000000000840', '2026-01-01 00:00:00'),
(2, X'4156473101000000000000000000000000001840', '2026-01-01 00:00:01'),
(3, NULL, '2026-01-01 00:00:02'),
(4, X'4156473100000000000000000000000000000000', '2026-01-01 00:00:03');
ADMIN FLUSH_TABLE('avg1_states');