mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-24 15:05:03 +08:00
Add support for setting replica identity on hypertables via ALTER TABLE. The replica identity is used in logical replication to identify rows that have changed. Currently, replica identity can only be altered on hypertables via the root; changing it directly on chunks will raise an error.
135 lines
6.7 KiB
Plaintext
135 lines
6.7 KiB
Plaintext
-- 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.
|
|
CREATE TABLE PUBLIC."Hypertable_1" (
|
|
time BIGINT NOT NULL,
|
|
"Device_id" TEXT NOT NULL,
|
|
temp_c int NOT NULL DEFAULT -1
|
|
);
|
|
CREATE INDEX ON PUBLIC."Hypertable_1" (time, "Device_id");
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM create_hypertable(NULL, NULL);
|
|
ERROR: relation cannot be NULL
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1"', NULL);
|
|
ERROR: time column cannot be NULL
|
|
-- integer time dimensions require an explicit interval
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1"', 'time');
|
|
ERROR: integer dimensions require an explicit interval
|
|
-- space dimensions require explicit number of partitions
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1"', 'time', 'Device_id', chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: invalid number of partitions for dimension "Device_id"
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1_mispelled"', 'time', 'Device_id', 2, chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: relation "public.Hypertable_1_mispelled" does not exist at character 33
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1"', 'time_mispelled', 'Device_id', 2, chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: column "time_mispelled" does not exist
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1"', 'Device_id', 'Device_id', 2, chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: invalid type for dimension "Device_id"
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1"', 'time', 'Device_id_mispelled', 2, chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: column "Device_id_mispelled" does not exist
|
|
INSERT INTO PUBLIC."Hypertable_1" VALUES(1,'dev_1', 3);
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1"', 'time', 'Device_id', 2, chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: table "Hypertable_1" is not empty
|
|
DELETE FROM PUBLIC."Hypertable_1" ;
|
|
\set ON_ERROR_STOP 1
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1"', 'time', 'Device_id', 2, chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
hypertable_id | schema_name | table_name | created
|
|
---------------+-------------+--------------+---------
|
|
1 | public | Hypertable_1 | t
|
|
(1 row)
|
|
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1"', 'time', 'Device_id', 2, chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: table "Hypertable_1" is already a hypertable
|
|
\set ON_ERROR_STOP 1
|
|
INSERT INTO "Hypertable_1" VALUES (0, 1, 0);
|
|
\set ON_ERROR_STOP 0
|
|
ALTER TABLE _timescaledb_internal._hyper_1_1_chunk ALTER COLUMN temp_c DROP NOT NULL;
|
|
ERROR: operation not supported on chunk tables
|
|
\set ON_ERROR_STOP 1
|
|
CREATE TABLE PUBLIC."Parent" (
|
|
time BIGINT NOT NULL,
|
|
"Device_id" TEXT NOT NULL,
|
|
temp_c int NOT NULL DEFAULT -1
|
|
);
|
|
\set ON_ERROR_STOP 0
|
|
ALTER TABLE "Hypertable_1" INHERIT "Parent";
|
|
ERROR: hypertables do not support inheritance
|
|
ALTER TABLE _timescaledb_internal._hyper_1_1_chunk INHERIT "Parent";
|
|
ERROR: operation not supported on chunk tables
|
|
ALTER TABLE _timescaledb_internal._hyper_1_1_chunk NO INHERIT "Parent";
|
|
ERROR: operation not supported on chunk tables
|
|
\set ON_ERROR_STOP 1
|
|
CREATE TABLE PUBLIC."Child" () INHERITS ("Parent");
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM create_hypertable('"public"."Parent"', 'time', chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: table "Parent" is already partitioned
|
|
SELECT * FROM create_hypertable('"public"."Child"', 'time', chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: table "Child" is already partitioned
|
|
\set ON_ERROR_STOP 1
|
|
CREATE UNLOGGED TABLE PUBLIC."Hypertable_unlogged" (
|
|
time BIGINT NOT NULL,
|
|
"Device_id" TEXT NOT NULL,
|
|
temp_c int NOT NULL DEFAULT -1
|
|
);
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_unlogged"', 'time', chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: table "Hypertable_unlogged" has to be logged
|
|
\set ON_ERROR_STOP 1
|
|
ALTER TABLE PUBLIC."Hypertable_unlogged" SET LOGGED;
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_unlogged"', 'time', chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
hypertable_id | schema_name | table_name | created
|
|
---------------+-------------+---------------------+---------
|
|
2 | public | Hypertable_unlogged | t
|
|
(1 row)
|
|
|
|
CREATE TEMP TABLE "Hypertable_temp" (
|
|
time BIGINT NOT NULL,
|
|
"Device_id" TEXT NOT NULL,
|
|
temp_c int NOT NULL DEFAULT -1
|
|
);
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM create_hypertable('"Hypertable_temp"', 'time', chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: table "Hypertable_temp" has to be logged
|
|
ALTER TABLE "Hypertable_1" SET UNLOGGED;
|
|
ERROR: logging cannot be turned off for hypertables
|
|
\set ON_ERROR_STOP 1
|
|
ALTER TABLE "Hypertable_1" SET LOGGED;
|
|
CREATE TABLE PUBLIC."Hypertable_1_rule" (
|
|
time BIGINT NOT NULL,
|
|
"Device_id" TEXT NOT NULL,
|
|
temp_c int NOT NULL DEFAULT -1
|
|
);
|
|
CREATE RULE notify_me AS ON UPDATE TO "Hypertable_1_rule" DO ALSO NOTIFY "Hypertable_1_rule";
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1_rule"', 'time', chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: hypertables do not support rules
|
|
\set ON_ERROR_STOP 1
|
|
ALTER TABLE "Hypertable_1_rule" DISABLE RULE notify_me;
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1_rule"', 'time', chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
ERROR: hypertables do not support rules
|
|
\set ON_ERROR_STOP 1
|
|
DROP RULE notify_me ON "Hypertable_1_rule";
|
|
SELECT * FROM create_hypertable('"public"."Hypertable_1_rule"', 'time', chunk_time_interval=>_timescaledb_internal.interval_to_usec('1 month'));
|
|
hypertable_id | schema_name | table_name | created
|
|
---------------+-------------+-------------------+---------
|
|
3 | public | Hypertable_1_rule | t
|
|
(1 row)
|
|
|
|
\set ON_ERROR_STOP 0
|
|
CREATE RULE notify_me AS ON UPDATE TO "Hypertable_1_rule" DO ALSO NOTIFY "Hypertable_1_rule";
|
|
ERROR: hypertables do not support rules
|
|
\set ON_ERROR_STOP 1
|
|
\set ON_ERROR_STOP 0
|
|
SELECT add_dimension(NULL,NULL);
|
|
ERROR: hypertable cannot be NULL
|
|
\set ON_ERROR_STOP 1
|
|
\set ON_ERROR_STOP 0
|
|
SELECT attach_tablespace(NULL,NULL);
|
|
ERROR: invalid tablespace name
|
|
\set ON_ERROR_STOP 1
|
|
\set ON_ERROR_STOP 0
|
|
select set_number_partitions(NULL,NULL);
|
|
ERROR: hypertable cannot be NULL
|
|
\set ON_ERROR_STOP 1
|