mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-09-05 21:18:57 +00:00
* feat(flow): support eval schedule offsets Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com> * fix(flow): remove redundant schedule assertion Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com> * refactor(flow): trim eval offset compatibility scope Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com> * test(flow): trim eval offset edge coverage Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com> * docs(flow): trim eval offset comment noise Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com> * fix(flow): address eval offset review feedback Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com> * test(compat): cover Flow eval offset persistence Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com> --------- Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com>
64 lines
1.6 KiB
SQL
64 lines
1.6 KiB
SQL
-- EVAL OFFSET: fixed UTC epoch phase (offset + k * interval), deterministic.
|
|
|
|
CREATE TABLE eval_offset_input (
|
|
ts TIMESTAMP(3) TIME INDEX,
|
|
series STRING,
|
|
v DOUBLE,
|
|
PRIMARY KEY(series)
|
|
);
|
|
|
|
-- Scheduled at odd seconds (1 + 2k): phase anchored to the Unix epoch.
|
|
CREATE FLOW eval_offset_phase_flow
|
|
SINK TO eval_offset_phase_sink
|
|
EVAL INTERVAL '2s'
|
|
EVAL OFFSET '1s'
|
|
AS
|
|
SELECT date_trunc('second', now()) AS ts, count(v) AS c
|
|
FROM eval_offset_input
|
|
GROUP BY date_trunc('second', now());
|
|
|
|
SHOW CREATE FLOW eval_offset_phase_flow;
|
|
|
|
SELECT flow_definition FROM information_schema.flows WHERE flow_name = 'eval_offset_phase_flow';
|
|
|
|
INSERT INTO eval_offset_input VALUES
|
|
(now(), 'a', 1.0),
|
|
(now(), 'b', 2.0);
|
|
|
|
-- SQLNESS SLEEP 5s
|
|
|
|
-- Prove the offset phase: every row the offset flow wrote has an odd
|
|
-- second-of-minute (1 + 2k is always odd). This is deterministic regardless
|
|
-- of the exact wall-clock alignment of the evaluations.
|
|
SELECT
|
|
count(*) > 0 AS offset_flow_ran,
|
|
bool_and(date_part('second', ts)::BIGINT % 2 = 1) AS offset_flow_at_odd_seconds
|
|
FROM eval_offset_phase_sink;
|
|
|
|
CREATE FLOW invalid_eval_offset_no_interval
|
|
SINK TO invalid_eval_offset_sink
|
|
EVAL OFFSET '1s'
|
|
AS SELECT 1;
|
|
|
|
CREATE FLOW invalid_eval_offset_too_large
|
|
SINK TO invalid_eval_offset_sink
|
|
EVAL INTERVAL '1s'
|
|
EVAL OFFSET '2s'
|
|
AS SELECT 1;
|
|
|
|
CREATE FLOW invalid_eval_offset_fractional
|
|
SINK TO invalid_eval_offset_sink
|
|
EVAL INTERVAL '1s'
|
|
EVAL OFFSET '0.5s'
|
|
AS SELECT 1;
|
|
|
|
CREATE FLOW invalid_eval_offset_fractional_interval
|
|
SINK TO invalid_eval_offset_sink
|
|
EVAL INTERVAL '1.5s'
|
|
EVAL OFFSET '1s'
|
|
AS SELECT 1;
|
|
|
|
DROP FLOW eval_offset_phase_flow;
|
|
DROP TABLE eval_offset_phase_sink;
|
|
DROP TABLE eval_offset_input;
|