timescaledb/test/sql/updates/setup.continuous_aggs.sql
Fabrízio de Royes Mello 356dfa8eb1 Refactor upgrade/downgrade setup sql test scripts
The setup scripts for upgrade/downgrade tests of Continuous Aggregates
has too many duplicated code for pre-2.0 tests. Refactor it a bit
removing the duplicated code by using `\if \else \endif` psql
meta-commands.

Also added a properly `round` function to all functions that returns
`float8` in SQL scripts  because in rare cases it lead to flaky tests.

This is part of #4269.
2022-05-12 12:21:28 -03:00

105 lines
4.1 KiB
SQL

-- This file and its contents are licensed under the Apache License 2.0.
-- Please see the included NOTICE for copyright information and
-- LICENSE-APACHE for a copy of the license.
-- Collect information about different features so that we can pick
-- the right usage. Some of these are changed in the same version, but
-- we keep them separate anyway so that we can do additional checking
-- if necessary.
SELECT
extversion < '2.0.0' AS has_refresh_mat_view
FROM pg_extension
WHERE extname = 'timescaledb' \gset
CREATE TYPE custom_type AS (high int, low int);
CREATE TABLE conditions_before (
timec TIMESTAMPTZ NOT NULL,
location TEXT NOT NULL,
temperature DOUBLE PRECISION NULL,
humidity DOUBLE PRECISION NULL,
lowp double precision NULL,
highp double precision null,
allnull double precision null,
highlow custom_type null,
bit_int smallint,
good_life boolean
);
SELECT table_name FROM create_hypertable( 'conditions_before', 'timec');
INSERT INTO conditions_before
SELECT generate_series('2018-12-01 00:00'::timestamp, '2018-12-31 00:00'::timestamp, '1 day'), 'POR', 55, 75, 40, 70, NULL, (1,2)::custom_type, 2, true;
INSERT INTO conditions_before
SELECT generate_series('2018-11-01 00:00'::timestamp, '2018-12-31 00:00'::timestamp, '1 day'), 'NYC', 35, 45, 50, 40, NULL, (3,4)::custom_type, 4, false;
INSERT INTO conditions_before
SELECT generate_series('2018-11-01 00:00'::timestamp, '2018-12-15 00:00'::timestamp, '1 day'), 'LA', 73, 55, NULL, 28, NULL, NULL, 8, true;
\if has_refresh_mat_view
CREATE VIEW mat_before
WITH ( timescaledb.continuous, timescaledb.refresh_lag='-30 day', timescaledb.max_interval_per_job ='1000 day')
\else
CREATE MATERIALIZED VIEW IF NOT EXISTS mat_before
WITH ( timescaledb.continuous)
\endif
AS
SELECT time_bucket('1week', timec) as bucket,
location,
round(min(allnull)) as min_allnull,
round(max(temperature)) as max_temp,
round(sum(temperature)+sum(humidity)) as agg_sum_expr,
round(avg(humidity)) AS avg_humidity,
round(stddev(humidity)) as stddev_humidity,
bit_and(bit_int),
bit_or(bit_int),
bool_and(good_life),
every(temperature > 0),
bool_or(good_life),
count(*) as count_rows,
count(temperature) as count_temp,
count(allnull) as count_zero,
round(corr(temperature, humidity)) as corr,
round(covar_pop(temperature, humidity)) as covar_pop,
round(covar_samp(temperature, humidity)) as covar_samp,
round(regr_avgx(temperature, humidity)) as regr_avgx,
round(regr_avgy(temperature, humidity)) as regr_avgy,
round(regr_count(temperature, humidity)) as regr_count,
round(regr_intercept(temperature, humidity)) as regr_intercept,
round(regr_r2(temperature, humidity)) as regr_r2,
round(regr_slope(temperature, humidity)) as regr_slope,
round(regr_sxx(temperature, humidity)) as regr_sxx,
round(regr_sxy(temperature, humidity)) as regr_sxy,
round(regr_syy(temperature, humidity)) as regr_syy,
round(stddev(temperature)) as stddev_temp,
round(stddev_pop(temperature)) as stddev_pop,
round(stddev_samp(temperature)) as stddev_samp,
round(variance(temperature)) as variance,
round(var_pop(temperature)) as var_pop,
round(var_samp(temperature)) as var_samp,
last(temperature, timec) as last_temp,
last(highlow, timec) as last_hl,
first(highlow, timec) as first_hl,
histogram(temperature, 0, 100, 5)
FROM conditions_before
\if :has_refresh_mat_view
GROUP BY bucket, location
HAVING min(location) >= 'NYC' and avg(temperature) > 2;
ALTER VIEW mat_before SET (timescaledb.materialized_only=true);
\else
GROUP BY bucket, location
HAVING min(location) >= 'NYC' and avg(temperature) > 2 WITH NO DATA;
SELECT add_continuous_aggregate_policy('mat_before', NULL, '-30 days'::interval, '336 h');
ALTER MATERIALIZED VIEW mat_before SET (timescaledb.materialized_only=true);
\endif
GRANT SELECT ON mat_before TO cagg_user WITH GRANT OPTION;
-- have to use psql conditional here because the procedure call can't be in transaction
\if :has_refresh_mat_view
REFRESH MATERIALIZED VIEW mat_before;
\else
CALL refresh_continuous_aggregate('mat_before',NULL,NULL);
\endif