mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-22 22:11:29 +08:00
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.
105 lines
4.1 KiB
SQL
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
|
|
|