From 72c72f131bcb2ea06f8224e50cd97663a8e05dec Mon Sep 17 00:00:00 2001 From: Andrey Fedorov Date: Mon, 21 Oct 2019 20:53:22 -0700 Subject: [PATCH] Fixes bug in time_slices to work with large queries --- migrations/v1_8_6-v1_8_8.md | 25 +++++++++++++++++++ src/runners/tests/run_alerts.py | 2 +- .../installer-queries/create-udtfs.sql.fmt | 15 ++++++++--- 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 migrations/v1_8_6-v1_8_8.md diff --git a/migrations/v1_8_6-v1_8_8.md b/migrations/v1_8_6-v1_8_8.md new file mode 100644 index 000000000..b96a672e6 --- /dev/null +++ b/migrations/v1_8_6-v1_8_8.md @@ -0,0 +1,25 @@ +## Bug fixes in data UDTF's + +Time slices would be buggy when running as part of a large query. To fix them, please run — + +~~~ +USE SCHEMA data; + +CREATE OR REPLACE FUNCTION time_slices (n NUMBER, s TIMESTAMP_NTZ, e TIMESTAMP_NTZ) +RETURNS TABLE ( slice_start TIMESTAMP_NTZ, slice_end TIMESTAMP_NTZ ) +AS ' + SELECT DATEADD(sec, DATEDIFF(sec, s, e) * ROW_NUMBER() OVER (ORDER BY SEQ4()) / n, s) AS slice_start + , DATEADD(sec, DATEDIFF(sec, s, e) * 1 / n, slice_start) AS slice_end + FROM TABLE(GENERATOR(ROWCOUNT => n)) +' +; + +CREATE OR REPLACE FUNCTION time_slices (n NUMBER, s TIMESTAMP_LTZ, e TIMESTAMP_LTZ) +RETURNS TABLE ( slice_start TIMESTAMP_LTZ, slice_end TIMESTAMP_LTZ ) +AS ' + SELECT DATEADD(sec, DATEDIFF(sec, s, e) * ROW_NUMBER() OVER (ORDER BY SEQ4()) / n, s) AS slice_start + , DATEADD(sec, DATEDIFF(sec, s, e) * 1 / n, slice_start) AS slice_end + FROM TABLE(GENERATOR(ROWCOUNT => n)) +' +; +~~~ diff --git a/src/runners/tests/run_alerts.py b/src/runners/tests/run_alerts.py index db36be0ec..9a30c60c3 100644 --- a/src/runners/tests/run_alerts.py +++ b/src/runners/tests/run_alerts.py @@ -220,7 +220,7 @@ def test_alert_runners_processor_and_dispatcher( assert len(query_rule_run_record) == 7 # 3 from samples + 4 test alert queries assert query_rule_run_record[0]['QUERY_NAME'] == 'ACTIVITY_BY_ADMIN_ALERT_QUERY' - queries_by_admin = 57 + queries_by_admin = 58 assert query_rule_run_record[0]['NUM_ALERTS_CREATED'] == queries_by_admin assert ( diff --git a/src/scripts/installer-queries/create-udtfs.sql.fmt b/src/scripts/installer-queries/create-udtfs.sql.fmt index bb11d2efd..570c19413 100644 --- a/src/scripts/installer-queries/create-udtfs.sql.fmt +++ b/src/scripts/installer-queries/create-udtfs.sql.fmt @@ -1,9 +1,18 @@ USE SCHEMA data; -CREATE OR REPLACE FUNCTION time_slices (n NUMBER, s TIMESTAMP, e TIMESTAMP) -RETURNS TABLE ( slice_start TIMESTAMP, slice_end TIMESTAMP ) +CREATE FUNCTION IF NOT EXISTS time_slices (n NUMBER, s TIMESTAMP_NTZ, e TIMESTAMP_NTZ) +RETURNS TABLE ( slice_start TIMESTAMP_NTZ, slice_end TIMESTAMP_NTZ ) +AS ' + SELECT DATEADD(sec, DATEDIFF(sec, s, e) * ROW_NUMBER() OVER (ORDER BY SEQ4()) / n, s) AS slice_start + , DATEADD(sec, DATEDIFF(sec, s, e) * 1 / n, slice_start) AS slice_end + FROM TABLE(GENERATOR(ROWCOUNT => n)) +' +; + +CREATE FUNCTION IF NOT EXISTS time_slices (n NUMBER, s TIMESTAMP_LTZ, e TIMESTAMP_LTZ) +RETURNS TABLE ( slice_start TIMESTAMP_LTZ, slice_end TIMESTAMP_LTZ ) AS ' - SELECT DATEADD(sec, DATEDIFF(sec, s, e) * SEQ4() / n, s) AS slice_start + SELECT DATEADD(sec, DATEDIFF(sec, s, e) * ROW_NUMBER() OVER (ORDER BY SEQ4()) / n, s) AS slice_start , DATEADD(sec, DATEDIFF(sec, s, e) * 1 / n, slice_start) AS slice_end FROM TABLE(GENERATOR(ROWCOUNT => n)) '