mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-17 02:53:51 +08:00
- Added creation_time attribute to timescaledb catalog table "chunk". Also, updated corresponding view timescaledb_information.chunks to include chunk_creation_time attribute. - A newly created chunk is assigned the creation time during chunk creation to handle new partition range for give dimension (Time/ SERIAL/BIGSERIAL/INT/...). - In case of an already existing chunk, the creation time is updated as part of running upgrade script. The current timestamp (now()) at the time of upgrade has been assigned as chunk creation time. - Similarly, downgrade script is updated to drop the attribute creation_time from catalog table "chunk". - All relevant queries/views/test output have been updated accordingly. Co-authored-by: Nikhil Sontakke <nikhil@timescale.com>
204 lines
8.1 KiB
PL/PgSQL
204 lines
8.1 KiB
PL/PgSQL
-- 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.
|
|
|
|
\ir include/insert_single.sql
|
|
|
|
SELECT * FROM test.show_columnsp('"one_Partition".%');
|
|
SELECT * FROM "one_Partition" ORDER BY "timeCustom", device_id, series_0, series_1, series_2;
|
|
|
|
--test that we can insert data into a 1-dimensional table (only time partitioning)
|
|
CREATE TABLE "1dim"(time timestamp PRIMARY KEY, temp float);
|
|
SELECT create_hypertable('"1dim"', 'time');
|
|
INSERT INTO "1dim" VALUES('2017-01-20T09:00:01', 22.5) RETURNING *;
|
|
INSERT INTO "1dim" VALUES('2017-01-20T09:00:21', 21.2);
|
|
INSERT INTO "1dim" VALUES('2017-01-20T09:00:47', 25.1);
|
|
SELECT * FROM "1dim";
|
|
|
|
CREATE TABLE regular_table (time timestamp, temp float);
|
|
INSERT INTO regular_table SELECT * FROM "1dim";
|
|
SELECT * FROM regular_table;
|
|
|
|
TRUNCATE TABLE regular_table;
|
|
INSERT INTO regular_table VALUES('2017-01-20T09:00:59', 29.2);
|
|
INSERT INTO "1dim" SELECT * FROM regular_table;
|
|
SELECT * FROM "1dim";
|
|
SELECT "1dim" FROM "1dim";
|
|
|
|
--test that we can insert pre-1970 dates
|
|
CREATE TABLE "1dim_pre1970"(time timestamp PRIMARY KEY, temp float);
|
|
SELECT create_hypertable('"1dim_pre1970"', 'time', chunk_time_interval=> INTERVAL '1 Month');
|
|
INSERT INTO "1dim_pre1970" VALUES('1969-12-01T19:00:00', 21.2);
|
|
INSERT INTO "1dim_pre1970" VALUES('1969-12-20T09:00:00', 25.1);
|
|
INSERT INTO "1dim_pre1970" VALUES('1970-01-20T09:00:00', 26.6);
|
|
INSERT INTO "1dim_pre1970" VALUES('1969-02-20T09:00:00', 29.9);
|
|
|
|
--should show warning
|
|
BEGIN;
|
|
CREATE TABLE "1dim_usec_interval"(time timestamp PRIMARY KEY, temp float);
|
|
SELECT create_hypertable('"1dim_usec_interval"', 'time', chunk_time_interval=> 10);
|
|
INSERT INTO "1dim_usec_interval" VALUES('1969-12-01T19:00:00', 21.2);
|
|
ROLLBACK;
|
|
|
|
CREATE TABLE "1dim_usec_interval"(time timestamp PRIMARY KEY, temp float);
|
|
SELECT create_hypertable('"1dim_usec_interval"', 'time', chunk_time_interval=> 1000000);
|
|
INSERT INTO "1dim_usec_interval" VALUES('1969-12-01T19:00:00', 21.2);
|
|
|
|
CREATE TABLE "1dim_neg"(time INTEGER, temp float);
|
|
SELECT create_hypertable('"1dim_neg"', 'time', chunk_time_interval=>10);
|
|
INSERT INTO "1dim_neg" VALUES (-20, 21.2);
|
|
INSERT INTO "1dim_neg" VALUES (-19, 21.2);
|
|
INSERT INTO "1dim_neg" VALUES (-1, 21.2);
|
|
INSERT INTO "1dim_neg" VALUES (0, 21.2);
|
|
INSERT INTO "1dim_neg" VALUES (1, 21.2);
|
|
INSERT INTO "1dim_neg" VALUES (19, 21.2);
|
|
INSERT INTO "1dim_neg" VALUES (20, 21.2);
|
|
SELECT * FROM "1dim_pre1970";
|
|
SELECT * FROM "1dim_neg";
|
|
SELECT id, hypertable_id, schema_name, table_name, compressed_chunk_id, dropped, status, osm_chunk FROM _timescaledb_catalog.chunk;
|
|
SELECT * FROM _timescaledb_catalog.dimension_slice;
|
|
|
|
|
|
-- Create a three-dimensional table
|
|
CREATE TABLE "3dim" (time timestamp, temp float, device text, location text);
|
|
SELECT create_hypertable('"3dim"', 'time', 'device', 2);
|
|
SELECT add_dimension('"3dim"', 'location', 2);
|
|
INSERT INTO "3dim" VALUES('2017-01-20T09:00:01', 22.5, 'blue', 'nyc');
|
|
INSERT INTO "3dim" VALUES('2017-01-20T09:00:21', 21.2, 'brown', 'sthlm');
|
|
INSERT INTO "3dim" VALUES('2017-01-20T09:00:47', 25.1, 'yellow', 'la');
|
|
|
|
--show the constraints on the three-dimensional chunk
|
|
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_7_16_chunk');
|
|
|
|
--queries should work in three dimensions
|
|
SELECT * FROM "3dim";
|
|
|
|
-- test that explain works
|
|
EXPLAIN (COSTS FALSE)
|
|
INSERT INTO "3dim" VALUES('2017-01-21T09:00:01', 32.9, 'green', 'nyc'),
|
|
('2017-01-21T09:00:47', 27.3, 'purple', 'la') RETURNING *;
|
|
|
|
EXPLAIN (COSTS FALSE)
|
|
WITH "3dim_insert" AS (
|
|
INSERT INTO "3dim" VALUES('2017-01-21T09:01:44', 19.3, 'black', 'la') RETURNING time, temp
|
|
), regular_insert AS (
|
|
INSERT INTO regular_table VALUES('2017-01-21T10:00:51', 14.3) RETURNING time, temp
|
|
) INSERT INTO "1dim" (SELECT time, temp FROM "3dim_insert" UNION SELECT time, temp FROM regular_insert);
|
|
|
|
-- test prepared statement INSERT
|
|
PREPARE "1dim_plan" (timestamp, float) AS
|
|
INSERT INTO "1dim" VALUES($1, $2) ON CONFLICT (time) DO NOTHING;
|
|
EXECUTE "1dim_plan" ('2017-04-17 23:35', 31.4);
|
|
EXECUTE "1dim_plan" ('2017-04-17 23:35', 32.6);
|
|
|
|
-- test prepared statement with generic plan (forced when no parameters)
|
|
PREPARE "1dim_plan_generic" AS
|
|
INSERT INTO "1dim" VALUES('2017-05-18 17:24', 18.3);
|
|
EXECUTE "1dim_plan_generic";
|
|
|
|
SELECT * FROM "1dim" ORDER BY time;
|
|
SELECT * FROM "3dim" ORDER BY (time, device);
|
|
|
|
-- Test large intervals as default interval for integer is
|
|
-- supported as part of hypertable generalization
|
|
\set ON_ERROR_STOP 0
|
|
CREATE TABLE "inttime_err"(time INTEGER PRIMARY KEY, temp float);
|
|
SELECT create_hypertable('"inttime_err"', 'time', chunk_time_interval=>2147483648);
|
|
\set ON_ERROR_STOP 1
|
|
SELECT create_hypertable('"inttime_err"', 'time', chunk_time_interval=>2147483647);
|
|
|
|
-- Test large intervals as default interval is supported
|
|
-- for integer types as part of hypertable generalization.
|
|
|
|
\set ON_ERROR_STOP 0
|
|
CREATE TABLE "smallinttime_err"(time SMALLINT PRIMARY KEY, temp float);
|
|
SELECT create_hypertable('"smallinttime_err"', 'time', chunk_time_interval=>32768);
|
|
\set ON_ERROR_STOP 1
|
|
SELECT create_hypertable('"smallinttime_err"', 'time', chunk_time_interval=>32767);
|
|
|
|
--make sure date inserts work even when the timezone changes the
|
|
CREATE TABLE hyper_date(time date, temp float);
|
|
SELECT create_hypertable('"hyper_date"', 'time');
|
|
SET timezone=+1;
|
|
INSERT INTO "hyper_date" VALUES('2011-01-26', 22.5);
|
|
RESET timezone;
|
|
|
|
--make sure timestamp inserts work even when the timezone changes the
|
|
SET timezone = 'UTC';
|
|
CREATE TABLE "test_tz"(time timestamp PRIMARY KEY, temp float);
|
|
SELECT create_hypertable('"test_tz"', 'time', chunk_time_interval=> INTERVAL '1 day');
|
|
INSERT INTO "test_tz" VALUES('2017-09-22 10:00:00', 21.2);
|
|
INSERT INTO "test_tz" VALUES('2017-09-21 19:00:00', 21.2);
|
|
SET timezone = 'US/central';
|
|
INSERT INTO "test_tz" VALUES('2017-09-21 19:01:00', 21.2);
|
|
|
|
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_10_20_chunk');
|
|
SELECT * FROM test_tz;
|
|
|
|
-- test various memory settings --
|
|
SET timescaledb.max_open_chunks_per_insert = 10;
|
|
SET timescaledb.max_cached_chunks_per_hypertable = 10;
|
|
CREATE TABLE "nondefault_mem_settings"(time timestamp PRIMARY KEY, temp float);
|
|
SELECT create_hypertable('"nondefault_mem_settings"', 'time', chunk_time_interval=> INTERVAL '1 Month');
|
|
INSERT INTO "nondefault_mem_settings" VALUES('2000-12-01T19:00:00', 21.2);
|
|
INSERT INTO "nondefault_mem_settings" VALUES('2001-12-20T09:00:00', 25.1);
|
|
|
|
--lowest possible
|
|
SET timescaledb.max_open_chunks_per_insert = 1;
|
|
SET timescaledb.max_cached_chunks_per_hypertable = 1;
|
|
INSERT INTO "nondefault_mem_settings" VALUES
|
|
('2001-01-20T09:00:00', 26.6),
|
|
('2002-02-20T09:00:00', 27.9),
|
|
('2003-02-20T09:00:00', 28.9);
|
|
INSERT INTO "nondefault_mem_settings" VALUES
|
|
('2001-03-20T09:00:00', 30.6),
|
|
('2002-03-20T09:00:00', 31.9),
|
|
('2003-03-20T09:00:00', 32.9);
|
|
|
|
--warning about mismatched cache sizes
|
|
SET timescaledb.max_open_chunks_per_insert = 100;
|
|
SET timescaledb.max_cached_chunks_per_hypertable = 10;
|
|
INSERT INTO "nondefault_mem_settings" VALUES
|
|
('2001-05-20T09:00:00', 36.6),
|
|
('2002-05-20T09:00:00', 37.9),
|
|
('2003-05-20T09:00:00', 38.9);
|
|
|
|
--unlimited
|
|
SET timescaledb.max_open_chunks_per_insert = 0;
|
|
SET timescaledb.max_cached_chunks_per_hypertable = 0;
|
|
INSERT INTO "nondefault_mem_settings" VALUES
|
|
('2001-04-20T09:00:00', 33.6),
|
|
('2002-04-20T09:00:00', 34.9),
|
|
('2003-04-20T09:00:00', 35.9);
|
|
|
|
SELECT * FROM "nondefault_mem_settings";
|
|
|
|
|
|
--test rollback
|
|
BEGIN;
|
|
\set QUIET off
|
|
CREATE TABLE "data_records" ("time" bigint NOT NULL, "value" integer CHECK (VALUE >= 0));
|
|
SELECT create_hypertable('data_records', 'time', chunk_time_interval => 2592000000);
|
|
|
|
INSERT INTO "data_records" ("time", "value") VALUES (0, 1);
|
|
SAVEPOINT savepoint_1;
|
|
INSERT INTO "data_records" ("time", "value") VALUES (1, 0);
|
|
ROLLBACK TO SAVEPOINT savepoint_1;
|
|
INSERT INTO "data_records" ("time", "value") VALUES (2, 1);
|
|
|
|
SAVEPOINT savepoint_2;
|
|
\set ON_ERROR_STOP 0
|
|
INSERT INTO "data_records" ("time", "value") VALUES (3, -1);
|
|
\set ON_ERROR_STOP 1
|
|
ROLLBACK TO SAVEPOINT savepoint_2;
|
|
INSERT INTO "data_records" ("time", "value") VALUES (4, 1);
|
|
|
|
SAVEPOINT savepoint_3;
|
|
INSERT INTO "data_records" ("time", "value") VALUES (5, 0);
|
|
ROLLBACK TO SAVEPOINT savepoint_3;
|
|
|
|
SELECT * FROM data_records;
|
|
|
|
\set QUIET on
|
|
ROLLBACK;
|