Files
greptimedb/tests/cases/standalone/common/flow/flow_eval_offset.result
2026-08-13 18:37:34 +08:00

194 lines
8.9 KiB
Plaintext

-- 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)
);
Affected Rows: 0
-- 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());
Affected Rows: 0
-- EVAL INTERVAL without an offset is epoch-anchored: even seconds (2k).
CREATE FLOW eval_zero_offset_phase_flow
SINK TO eval_zero_offset_phase_sink
EVAL INTERVAL '2s'
AS
SELECT date_trunc('second', now()) AS ts, count(v) AS c
FROM eval_offset_input
GROUP BY date_trunc('second', now());
Affected Rows: 0
SHOW CREATE FLOW eval_offset_phase_flow;
+------------------------+------------------------------------------------------------------------------------------------------------------------+
| Flow | Create Flow |
+------------------------+------------------------------------------------------------------------------------------------------------------------+
| eval_offset_phase_flow | CREATE FLOW IF NOT EXISTS eval_offset_phase_flow |
| | SINK TO public.eval_offset_phase_sink |
| | EVAL INTERVAL '2 s' |
| | EVAL OFFSET '1 s' |
| | AS SELECT date_trunc('second', now()) AS ts, count(v) AS c FROM eval_offset_input GROUP BY date_trunc('second', now()) |
+------------------------+------------------------------------------------------------------------------------------------------------------------+
SELECT flow_definition FROM information_schema.flows WHERE flow_name = 'eval_offset_phase_flow';
+------------------------------------------------------------------------------------------------------------------------+
| flow_definition |
+------------------------------------------------------------------------------------------------------------------------+
| CREATE FLOW IF NOT EXISTS eval_offset_phase_flow |
| SINK TO public.eval_offset_phase_sink |
| EVAL INTERVAL '2 s' |
| EVAL OFFSET '1 s' |
| AS SELECT date_trunc('second', now()) AS ts, count(v) AS c FROM eval_offset_input GROUP BY date_trunc('second', now()) |
+------------------------------------------------------------------------------------------------------------------------+
-- A zero offset is canonicalized away: SHOW CREATE omits EVAL OFFSET.
CREATE FLOW eval_zero_offset_canonical_flow
SINK TO eval_zero_offset_canonical_sink
EVAL INTERVAL '2s'
EVAL OFFSET '0s'
AS
SELECT date_trunc('second', now()) AS ts, count(v) AS c
FROM eval_offset_input
GROUP BY date_trunc('second', now());
Affected Rows: 0
SHOW CREATE FLOW eval_zero_offset_canonical_flow;
+---------------------------------+------------------------------------------------------------------------------------------------------------------------+
| Flow | Create Flow |
+---------------------------------+------------------------------------------------------------------------------------------------------------------------+
| eval_zero_offset_canonical_flow | CREATE FLOW IF NOT EXISTS eval_zero_offset_canonical_flow |
| | SINK TO public.eval_zero_offset_canonical_sink |
| | EVAL INTERVAL '2 s' |
| | AS SELECT date_trunc('second', now()) AS ts, count(v) AS c FROM eval_offset_input GROUP BY date_trunc('second', now()) |
+---------------------------------+------------------------------------------------------------------------------------------------------------------------+
SELECT flow_definition FROM information_schema.flows WHERE flow_name = 'eval_zero_offset_canonical_flow';
+------------------------------------------------------------------------------------------------------------------------+
| flow_definition |
+------------------------------------------------------------------------------------------------------------------------+
| CREATE FLOW IF NOT EXISTS eval_zero_offset_canonical_flow |
| SINK TO public.eval_zero_offset_canonical_sink |
| EVAL INTERVAL '2 s' |
| AS SELECT date_trunc('second', now()) AS ts, count(v) AS c FROM eval_offset_input GROUP BY date_trunc('second', now()) |
+------------------------------------------------------------------------------------------------------------------------+
INSERT INTO eval_offset_input VALUES
(now(), 'a', 1.0),
(now(), 'b', 2.0);
Affected Rows: 2
-- Let both scheduled flows evaluate at least once.
-- SQLNESS SLEEP 5s
-- Prove the offset phase: every row the offset flow wrote has an odd
-- second-of-minute (1 + 2k is always odd), while the zero-offset flow wrote
-- even seconds (2k is always even). 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;
+-----------------+----------------------------+
| offset_flow_ran | offset_flow_at_odd_seconds |
+-----------------+----------------------------+
| true | true |
+-----------------+----------------------------+
SELECT
count(*) > 0 AS zero_offset_flow_ran,
bool_and(date_part('second', ts)::BIGINT % 2 = 0) AS zero_offset_flow_at_even_seconds
FROM eval_zero_offset_phase_sink;
+----------------------+----------------------------------+
| zero_offset_flow_ran | zero_offset_flow_at_even_seconds |
+----------------------+----------------------------------+
| true | true |
+----------------------+----------------------------------+
-- Invalid syntax / validation cases.
CREATE FLOW invalid_eval_offset_no_interval
SINK TO invalid_eval_offset_sink
EVAL OFFSET '1s'
AS SELECT 1;
Error: 1004(InvalidArguments), Invalid interval provided: EVAL OFFSET requires EVAL INTERVAL to be specified
CREATE FLOW invalid_eval_offset_too_large
SINK TO invalid_eval_offset_sink
EVAL INTERVAL '1s'
EVAL OFFSET '2s'
AS SELECT 1;
Error: 1004(InvalidArguments), Invalid interval provided: EVAL OFFSET must be in range [0, EVAL INTERVAL), got 2 seconds with EVAL INTERVAL 1 seconds
CREATE FLOW invalid_eval_offset_fractional
SINK TO invalid_eval_offset_sink
EVAL INTERVAL '1s'
EVAL OFFSET '0.5s'
AS SELECT 1;
Error: 1004(InvalidArguments), Invalid interval provided: EVAL OFFSET must be a whole number of seconds
CREATE FLOW invalid_eval_offset_fractional_interval
SINK TO invalid_eval_offset_sink
EVAL INTERVAL '1.5s'
EVAL OFFSET '1s'
AS SELECT 1;
Error: 1004(InvalidArguments), Invalid interval provided: EVAL INTERVAL must be a whole number of seconds when EVAL OFFSET is specified
CREATE FLOW invalid_eval_offset_month
SINK TO invalid_eval_offset_sink
EVAL INTERVAL '1 hour'
EVAL OFFSET '1 month'
AS SELECT 1;
Error: 1004(InvalidArguments), Invalid interval provided: Interval with months is not allowed in EVAL OFFSET
DROP FLOW eval_offset_phase_flow;
Affected Rows: 0
DROP FLOW eval_zero_offset_phase_flow;
Affected Rows: 0
DROP FLOW eval_zero_offset_canonical_flow;
Affected Rows: 0
DROP TABLE eval_offset_phase_sink;
Affected Rows: 0
DROP TABLE eval_zero_offset_phase_sink;
Affected Rows: 0
DROP TABLE eval_zero_offset_canonical_sink;
Affected Rows: 0
DROP TABLE eval_offset_input;
Affected Rows: 0