mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-16 10:33:27 +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>
152 lines
4.5 KiB
PL/PgSQL
152 lines
4.5 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.
|
|
|
|
\o /dev/null
|
|
\ir include/insert_two_partitions.sql
|
|
\o
|
|
|
|
SELECT * FROM _timescaledb_catalog.hypertable;
|
|
SELECT id, hypertable_id, schema_name, table_name, compressed_chunk_id, dropped, status, osm_chunk FROM _timescaledb_catalog.chunk;
|
|
SELECT * FROM test.show_subtables('"two_Partitions"');
|
|
SELECT * FROM "two_Partitions";
|
|
|
|
SET client_min_messages = WARNING;
|
|
TRUNCATE "two_Partitions";
|
|
|
|
SELECT * FROM _timescaledb_catalog.hypertable;
|
|
SELECT id, hypertable_id, schema_name, table_name, compressed_chunk_id, dropped, status, osm_chunk FROM _timescaledb_catalog.chunk;
|
|
|
|
-- should be empty
|
|
SELECT * FROM test.show_subtables('"two_Partitions"');
|
|
SELECT * FROM "two_Partitions";
|
|
|
|
INSERT INTO public."two_Partitions"("timeCustom", device_id, series_0, series_1) VALUES
|
|
(1257987600000000000, 'dev1', 1.5, 1),
|
|
(1257987600000000000, 'dev1', 1.5, 2),
|
|
(1257894000000000000, 'dev2', 1.5, 1),
|
|
(1257894002000000000, 'dev1', 2.5, 3);
|
|
|
|
SELECT id, hypertable_id, schema_name, table_name, compressed_chunk_id, dropped, status, osm_chunk FROM _timescaledb_catalog.chunk;
|
|
|
|
CREATE VIEW dependent_view AS SELECT * FROM _timescaledb_internal._hyper_1_5_chunk;
|
|
|
|
CREATE OR REPLACE FUNCTION test_trigger()
|
|
RETURNS TRIGGER LANGUAGE PLPGSQL AS
|
|
$BODY$
|
|
DECLARE
|
|
cnt INTEGER;
|
|
BEGIN
|
|
RAISE WARNING 'FIRING trigger when: % level: % op: % cnt: % trigger_name %',
|
|
tg_when, tg_level, tg_op, cnt, tg_name;
|
|
IF TG_OP = 'DELETE' THEN
|
|
RETURN OLD;
|
|
END IF;
|
|
RETURN NEW;
|
|
END
|
|
$BODY$;
|
|
|
|
-- test truncate on a chunk
|
|
CREATE TRIGGER _test_truncate_before
|
|
BEFORE TRUNCATE ON _timescaledb_internal._hyper_1_5_chunk
|
|
FOR EACH STATEMENT EXECUTE FUNCTION test_trigger();
|
|
|
|
CREATE TRIGGER _test_truncate_after
|
|
AFTER TRUNCATE ON _timescaledb_internal._hyper_1_5_chunk
|
|
FOR EACH STATEMENT EXECUTE FUNCTION test_trigger();
|
|
|
|
\set ON_ERROR_STOP 0
|
|
TRUNCATE "two_Partitions";
|
|
-- cannot TRUNCATE ONLY a hypertable
|
|
TRUNCATE ONLY "two_Partitions" CASCADE;
|
|
\set ON_ERROR_STOP 1
|
|
|
|
-- create a regular table to make sure we can truncate it in the same call
|
|
CREATE TABLE truncate_normal (color int);
|
|
INSERT INTO truncate_normal VALUES (1);
|
|
SELECT * FROM truncate_normal;
|
|
|
|
-- fix for bug #3580
|
|
\set ON_ERROR_STOP 0
|
|
TRUNCATE nonexistentrelation;
|
|
\set ON_ERROR_STOP 1
|
|
CREATE TABLE truncate_nested (color int);
|
|
INSERT INTO truncate_nested VALUES (2);
|
|
|
|
SELECT * FROM truncate_normal, truncate_nested;
|
|
|
|
CREATE FUNCTION fn_truncate_nested()
|
|
RETURNS trigger LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
TRUNCATE truncate_nested;
|
|
RETURN NEW;
|
|
END;
|
|
$$;
|
|
|
|
CREATE TRIGGER tg_truncate_nested
|
|
BEFORE TRUNCATE ON truncate_normal
|
|
FOR EACH STATEMENT EXECUTE FUNCTION fn_truncate_nested();
|
|
|
|
TRUNCATE truncate_normal;
|
|
SELECT * FROM truncate_normal, truncate_nested;
|
|
|
|
INSERT INTO truncate_normal VALUES (3);
|
|
INSERT INTO truncate_nested VALUES (4);
|
|
|
|
SELECT * FROM truncate_normal, truncate_nested;
|
|
|
|
TRUNCATE truncate_normal;
|
|
SELECT * FROM truncate_normal, truncate_nested;
|
|
|
|
INSERT INTO truncate_normal VALUES (5);
|
|
INSERT INTO truncate_nested VALUES (6);
|
|
SELECT * FROM truncate_normal, truncate_nested;
|
|
|
|
SELECT * FROM test.show_subtables('"two_Partitions"');
|
|
|
|
TRUNCATE "two_Partitions", truncate_normal CASCADE;
|
|
-- should be empty
|
|
SELECT * FROM test.show_subtables('"two_Partitions"');
|
|
SELECT * FROM "two_Partitions";
|
|
SELECT * FROM truncate_normal, truncate_nested;
|
|
|
|
-- test TRUNCATE can be performed by a user
|
|
-- with TRUNCATE privilege who is not table owner
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
|
|
CREATE ROLE owner WITH LOGIN;
|
|
CREATE ROLE truncator WITH LOGIN;
|
|
CREATE DATABASE test_trunc_ht OWNER owner;
|
|
|
|
\c test_trunc_ht :ROLE_SUPERUSER
|
|
SET client_min_messages = ERROR;
|
|
CREATE EXTENSION timescaledb;
|
|
RESET client_min_messages;
|
|
|
|
\c test_trunc_ht owner
|
|
CREATE TABLE test_hypertable (time TIMESTAMP WITHOUT TIME ZONE NOT NULL, value DOUBLE PRECISION);
|
|
SELECT create_hypertable('test_hypertable', 'time');
|
|
|
|
-- fail since we don't have TRUNCATE privileges yet
|
|
\set ON_ERROR_STOP 0
|
|
|
|
\c test_trunc_ht truncator
|
|
TRUNCATE TABLE test_hypertable;
|
|
|
|
\set ON_ERROR_STOP 1
|
|
|
|
\c test_trunc_ht owner
|
|
GRANT TRUNCATE ON test_hypertable TO truncator;
|
|
|
|
-- now succeed after privilege was granted
|
|
\c test_trunc_ht truncator;
|
|
TRUNCATE TABLE test_hypertable;
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
-- set client_min_messages to ERROR to suppress warnings about orphaned files
|
|
SET client_min_messages TO ERROR;
|
|
DROP DATABASE test_trunc_ht WITH (FORCE);
|
|
DROP ROLE owner;
|
|
DROP ROLE truncator;
|