Files
greptimedb/tests/cases/standalone/common/flow/flow_scheduled_now_boundary.sql
T
2026-07-01 10:56:30 +00:00

56 lines
2.1 KiB
SQL

CREATE TABLE now_boundary_input (
ts TIMESTAMP(3) TIME INDEX,
v DOUBLE,
PRIMARY KEY(v)
);
CREATE FLOW now_boundary_flow
SINK TO now_boundary_sink
EVAL INTERVAL '1s'
AS
SELECT
date_bin(INTERVAL '1 second', ts) AS window_start,
count(v) AS value_count,
now() AS create_time,
current_timestamp() AS cur_ts
FROM now_boundary_input
WHERE ts >= date_trunc('second', now()) - INTERVAL '1 second'
AND ts < date_trunc('second', current_timestamp())
GROUP BY date_bin(INTERVAL '1 second', ts);
INSERT INTO now_boundary_input VALUES
(date_trunc('second', now()) - INTERVAL '1 second', 0.0),
(date_trunc('second', now()), 1.0),
(date_trunc('second', now()) + INTERVAL '1 second', 2.0),
(date_trunc('second', now()) + INTERVAL '2 seconds', 3.0),
(date_trunc('second', now()) + INTERVAL '3 seconds', 4.0),
(date_trunc('second', now()) + INTERVAL '4 seconds', 5.0),
(date_trunc('second', now()) + INTERVAL '5 seconds', 6.0),
(date_trunc('second', now()) + INTERVAL '6 seconds', 7.0),
(date_trunc('second', now()) + INTERVAL '7 seconds', 8.0);
-- SQLNESS SLEEP 4s
SELECT
count(DISTINCT window_start) >= 1 AS has_selected_window,
min(value_count) AS min_value_count,
max(value_count) AS max_value_count,
bool_and(create_time = date_trunc('second', create_time)) AS all_create_time_at_second_boundary,
bool_and(cur_ts = create_time) AS cur_ts_equals_create_time,
bool_and(window_start = create_time - INTERVAL '1 second') AS all_windows_match_scheduled_previous_second
FROM now_boundary_sink
WHERE value_count > 0;
-- The WHERE clause should select exactly the previous scheduled second.
-- It intentionally uses both now() and current_timestamp() in filter bounds.
-- If the distributed analyzer folds now()/current_timestamp() with wall-clock time, the remote
-- filter shifts forward and this invariant fails: window_start becomes equal
-- to create_time instead of create_time - 1s.
SELECT
bool_and(value_count = 1) AS all_value_count_equals_one
FROM now_boundary_sink
WHERE value_count > 0;
DROP FLOW now_boundary_flow;
DROP TABLE now_boundary_sink;
DROP TABLE now_boundary_input;