timescaledb/tsl/test/sql/ddl_hook.sql
Dmitry Simonenko f9d8667b1d Fix distributed hypertable DROP within a procedure
When DROP being executed inside procedure ddl_command_start
was not handled which lead to ignoring this operation on the
data nodes.

Fix #3663
2021-10-12 23:28:57 +03:00

133 lines
3.9 KiB
PL/PgSQL

-- This file and its contents are licensed under the Timescale License.
-- Please see the included NOTICE for copyright information and
-- LICENSE-TIMESCALE for a copy of the license.
\c :TEST_DBNAME :ROLE_SUPERUSER
CREATE OR REPLACE FUNCTION ts_test_ddl_command_hook_reg() RETURNS VOID
AS :TSL_MODULE_PATHNAME, 'ts_test_ddl_command_hook_reg'
LANGUAGE C VOLATILE STRICT;
CREATE OR REPLACE FUNCTION ts_test_ddl_command_hook_unreg() RETURNS VOID
AS :TSL_MODULE_PATHNAME, 'ts_test_ddl_command_hook_unreg'
LANGUAGE C VOLATILE STRICT;
SET client_min_messages TO ERROR;
DROP SCHEMA IF EXISTS htable_schema CASCADE;
DROP TABLE IF EXISTS htable;
DROP TABLE IF EXISTS non_htable;
SET client_min_messages TO NOTICE;
CREATE SCHEMA htable_schema;
-- Install test hooks
SELECT ts_test_ddl_command_hook_reg();
CREATE TABLE htable(time timestamptz, device int, color int CONSTRAINT color_check CHECK (color > 0), temp float);
CREATE UNIQUE INDEX htable_pk ON htable(time);
-- CREATE TABLE
SELECT * FROM create_hypertable('htable', 'time');
SELECT * FROM test.show_columns('htable');
SELECT * FROM test.show_constraints('htable');
SELECT * FROM test.show_indexes('htable');
-- ADD CONSTRAINT
ALTER TABLE htable ADD CONSTRAINT device_check CHECK (device > 0);
SELECT * FROM test.show_constraints('htable');
-- DROP CONSTRAINT
ALTER TABLE htable DROP CONSTRAINT device_check;
SELECT * FROM test.show_constraints('htable');
-- DROP COLUMN
ALTER TABLE htable DROP COLUMN color;
SELECT * FROM test.show_columns('htable');
-- ADD COLUMN
ALTER TABLE htable ADD COLUMN description text;
SELECT * FROM test.show_columns('htable');
-- CREATE INDEX
CREATE INDEX htable_description_idx ON htable (description);
SELECT * FROM test.show_indexes('htable');
-- CREATE/DROP TRIGGER
CREATE OR REPLACE FUNCTION test_trigger()
RETURNS TRIGGER LANGUAGE PLPGSQL AS
$BODY$
BEGIN
RETURN OLD;
END
$BODY$;
CREATE TRIGGER htable_trigger_test
BEFORE INSERT ON htable
FOR EACH ROW EXECUTE FUNCTION test_trigger();
DROP TRIGGER htable_trigger_test on htable;
DROP FUNCTION test_trigger();
-- CLUSTER, TRUNCATE, REINDEX, VACUUM (should not call event hooks)
CREATE TABLE non_htable (id int);
CLUSTER htable USING htable_description_idx;
TRUNCATE non_htable, htable;
REINDEX TABLE htable;
VACUUM htable;
-- ALTER TABLE
ALTER TABLE htable ADD CONSTRAINT temp_check CHECK (temp > 0.0);
SELECT * FROM test.show_constraints('htable');
ALTER TABLE htable RENAME CONSTRAINT temp_check TO temp_chk;
ALTER TABLE htable RENAME COLUMN description TO descr;
ALTER INDEX htable_description_idx RENAME to htable_descr_idx;
ALTER TABLE htable SET SCHEMA htable_schema;
ALTER TABLE htable_schema.htable SET SCHEMA public;
ALTER TABLE public.htable RENAME TO htable2;
ALTER TABLE htable2 RENAME TO htable;
-- DROP INDEX, TABLE
\set ON_ERROR_STOP 0
DROP INDEX htable_description_idx, htable_pk;
DROP TABLE htable, non_htable;
\set ON_ERROR_STOP 1
DROP INDEX htable_descr_idx;
DROP TABLE htable;
DROP TABLE non_htable;
-- DROP TABLE within procedure
CREATE TABLE test (time timestamp, v int);
SELECT create_hypertable('test','time');
CREATE PROCEDURE test_drop() LANGUAGE PLPGSQL AS $$
BEGIN
DROP TABLE test;
END
$$;
CALL test_drop();
-- DROP CASCADE cases
-- DROP schema
CREATE TABLE htable_schema.non_htable (id int);
CREATE TABLE htable_schema.htable(time timestamptz, device int, color int, temp float);
SELECT * FROM create_hypertable('htable_schema.htable', 'time');
DROP SCHEMA htable_schema CASCADE;
-- DROP column cascades to index drop
CREATE TABLE htable(time timestamptz, device int, color int, temp float);
SELECT * FROM create_hypertable('htable', 'time');
CREATE INDEX htable_device_idx ON htable (device);
ALTER TABLE htable DROP COLUMN device;
DROP TABLE htable;
-- DROP foreign key
CREATE TABLE non_htable (id int PRIMARY KEY);
CREATE TABLE htable(time timestamptz, device int REFERENCES non_htable(id));
SELECT * FROM create_hypertable('htable', 'time');
DROP TABLE non_htable CASCADE;
-- cleanup
SELECT ts_test_ddl_command_hook_unreg();