mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-17 19:13:16 +08:00
Add support for ALTER SCHEMA command on multi-node
This change adds support for ALTER SCHEMA RENAME TO and ALTER SCHEMA OWNER TO commands to distributed database. Issue: #3909
This commit is contained in:
parent
24d9243f8b
commit
4b3227663a
@ -423,12 +423,12 @@ dist_ddl_process_alter_object_schema(const ProcessUtilityArgs *args)
|
||||
{
|
||||
AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, args->parsetree);
|
||||
|
||||
/* ALTER object SET SCHEMA */
|
||||
if (list_length(args->hypertable_list) != 1)
|
||||
return;
|
||||
|
||||
if (stmt->objectType == OBJECT_TABLE)
|
||||
{
|
||||
/* ALTER object SET SCHEMA */
|
||||
if (list_length(args->hypertable_list) != 1)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Hypertable oid is available in hypertable_list but
|
||||
* cannot be resolved here until standard utility hook will synchronize new
|
||||
@ -441,31 +441,55 @@ dist_ddl_process_alter_object_schema(const ProcessUtilityArgs *args)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
dist_ddl_process_alter_owner_stmt(const ProcessUtilityArgs *args)
|
||||
{
|
||||
AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, args->parsetree);
|
||||
|
||||
if (stmt->objectType == OBJECT_SCHEMA)
|
||||
{
|
||||
/* ALTER SCHEMA OWNER TO */
|
||||
dist_ddl_state_add_current_data_node_list();
|
||||
dist_ddl_state_schedule(DIST_DDL_EXEC_ON_START, args);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
dist_ddl_process_rename(const ProcessUtilityArgs *args)
|
||||
{
|
||||
RenameStmt *stmt = castNode(RenameStmt, args->parsetree);
|
||||
|
||||
if (list_length(args->hypertable_list) != 1)
|
||||
return;
|
||||
|
||||
if (stmt->renameType == OBJECT_TABLE)
|
||||
switch (stmt->renameType)
|
||||
{
|
||||
/*
|
||||
* Hypertable oid is available in hypertable_list but
|
||||
* cannot be resolved here until standard utility hook will synchronize new
|
||||
* relation name and schema.
|
||||
*
|
||||
* Save oid for dist_ddl_end execution.
|
||||
*/
|
||||
dist_ddl_state.relid = linitial_oid(args->hypertable_list);
|
||||
dist_ddl_state_schedule(DIST_DDL_EXEC_ON_END, args);
|
||||
return;
|
||||
}
|
||||
case OBJECT_SCHEMA:
|
||||
|
||||
/* Only handles other renamings here (e.g., triggers) */
|
||||
if (dist_ddl_state_set_hypertable(args))
|
||||
dist_ddl_state_schedule(DIST_DDL_EXEC_ON_START, args);
|
||||
/* ALTER SCHEMA RENAME TO */
|
||||
dist_ddl_state_add_current_data_node_list();
|
||||
dist_ddl_state_schedule(DIST_DDL_EXEC_ON_START, args);
|
||||
break;
|
||||
|
||||
case OBJECT_TABLE:
|
||||
|
||||
/* ALTER TABLE RENAME TO */
|
||||
if (list_length(args->hypertable_list) != 1)
|
||||
break;
|
||||
/*
|
||||
* Hypertable oid is available in hypertable_list but
|
||||
* cannot be resolved here until standard utility hook will synchronize new
|
||||
* relation name and schema.
|
||||
*
|
||||
* Save oid for dist_ddl_end execution.
|
||||
*/
|
||||
dist_ddl_state.relid = linitial_oid(args->hypertable_list);
|
||||
dist_ddl_state_schedule(DIST_DDL_EXEC_ON_END, args);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Only handles other renamings here (e.g., triggers) */
|
||||
if (dist_ddl_state_set_hypertable(args))
|
||||
dist_ddl_state_schedule(DIST_DDL_EXEC_ON_START, args);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -892,6 +916,7 @@ dist_ddl_process(const ProcessUtilityArgs *args)
|
||||
|
||||
/* Block unsupported operations on distributed hypertables and
|
||||
* decide on how to execute it. */
|
||||
|
||||
switch (tag)
|
||||
{
|
||||
case T_CreateSchemaStmt:
|
||||
@ -910,6 +935,10 @@ dist_ddl_process(const ProcessUtilityArgs *args)
|
||||
dist_ddl_process_alter_object_schema(args);
|
||||
break;
|
||||
|
||||
case T_AlterOwnerStmt:
|
||||
dist_ddl_process_alter_owner_stmt(args);
|
||||
break;
|
||||
|
||||
case T_RenameStmt:
|
||||
dist_ddl_process_rename(args);
|
||||
break;
|
||||
|
@ -1087,13 +1087,105 @@ nspname|usename
|
||||
|
||||
(1 row)
|
||||
|
||||
-- ALTER SCHEMA RENAME TO
|
||||
CREATE SCHEMA dist_schema;
|
||||
CREATE TABLE dist_schema.some_dist_table(time timestamptz, device int, color int, temp float);
|
||||
SELECT * FROM create_hypertable('dist_schema.some_dist_table', 'time', replication_factor => 3);
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
4 | dist_schema | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
ALTER SCHEMA dist_schema RENAME TO dist_schema_2;
|
||||
SELECT * FROM test.remote_exec(NULL, $$ SELECT schemaname, tablename FROM pg_tables WHERE tablename = 'some_dist_table' $$);
|
||||
NOTICE: [data_node_1]: SELECT schemaname, tablename FROM pg_tables WHERE tablename = 'some_dist_table'
|
||||
NOTICE: [data_node_1]:
|
||||
schemaname |tablename
|
||||
-------------+---------------
|
||||
dist_schema_2|some_dist_table
|
||||
(1 row)
|
||||
|
||||
|
||||
NOTICE: [data_node_2]: SELECT schemaname, tablename FROM pg_tables WHERE tablename = 'some_dist_table'
|
||||
NOTICE: [data_node_2]:
|
||||
schemaname |tablename
|
||||
-------------+---------------
|
||||
dist_schema_2|some_dist_table
|
||||
(1 row)
|
||||
|
||||
|
||||
NOTICE: [data_node_3]: SELECT schemaname, tablename FROM pg_tables WHERE tablename = 'some_dist_table'
|
||||
NOTICE: [data_node_3]:
|
||||
schemaname |tablename
|
||||
-------------+---------------
|
||||
dist_schema_2|some_dist_table
|
||||
(1 row)
|
||||
|
||||
|
||||
remote_exec
|
||||
-------------
|
||||
|
||||
(1 row)
|
||||
|
||||
-- ALTER SCHEMA OWNER TO
|
||||
ALTER SCHEMA dist_schema_2 OWNER TO :ROLE_1;
|
||||
SELECT * FROM test.remote_exec(NULL, $$
|
||||
SELECT s.nspname, u.usename
|
||||
FROM pg_catalog.pg_namespace s
|
||||
JOIN pg_catalog.pg_user u ON u.usesysid = s.nspowner
|
||||
WHERE s.nspname = 'dist_schema_2';
|
||||
$$);
|
||||
NOTICE: [data_node_1]:
|
||||
SELECT s.nspname, u.usename
|
||||
FROM pg_catalog.pg_namespace s
|
||||
JOIN pg_catalog.pg_user u ON u.usesysid = s.nspowner
|
||||
WHERE s.nspname = 'dist_schema_2'
|
||||
NOTICE: [data_node_1]:
|
||||
nspname |usename
|
||||
-------------+-----------
|
||||
dist_schema_2|test_role_1
|
||||
(1 row)
|
||||
|
||||
|
||||
NOTICE: [data_node_2]:
|
||||
SELECT s.nspname, u.usename
|
||||
FROM pg_catalog.pg_namespace s
|
||||
JOIN pg_catalog.pg_user u ON u.usesysid = s.nspowner
|
||||
WHERE s.nspname = 'dist_schema_2'
|
||||
NOTICE: [data_node_2]:
|
||||
nspname |usename
|
||||
-------------+-----------
|
||||
dist_schema_2|test_role_1
|
||||
(1 row)
|
||||
|
||||
|
||||
NOTICE: [data_node_3]:
|
||||
SELECT s.nspname, u.usename
|
||||
FROM pg_catalog.pg_namespace s
|
||||
JOIN pg_catalog.pg_user u ON u.usesysid = s.nspowner
|
||||
WHERE s.nspname = 'dist_schema_2'
|
||||
NOTICE: [data_node_3]:
|
||||
nspname |usename
|
||||
-------------+-----------
|
||||
dist_schema_2|test_role_1
|
||||
(1 row)
|
||||
|
||||
|
||||
remote_exec
|
||||
-------------
|
||||
|
||||
(1 row)
|
||||
|
||||
DROP SCHEMA dist_schema_2 CASCADE;
|
||||
NOTICE: drop cascades to table dist_schema_2.some_dist_table
|
||||
-- DROP column cascades to index drop
|
||||
CREATE TABLE some_dist_table(time timestamptz, device int, color int, temp float);
|
||||
SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor => 3);
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
4 | public | some_dist_table | t
|
||||
5 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
CREATE INDEX some_dist_device_idx ON some_dist_table (device);
|
||||
@ -1184,7 +1276,7 @@ SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor =>
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
6 | public | some_dist_table | t
|
||||
7 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
@ -1237,7 +1329,7 @@ SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor =>
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
7 | public | some_dist_table | t
|
||||
8 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
@ -1287,7 +1379,7 @@ SELECT * FROM create_distributed_hypertable('some_dist_table', 'time');
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
8 | public | some_dist_table | t
|
||||
9 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
\set ON_ERROR_STOP 0
|
||||
@ -1306,7 +1398,7 @@ SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor =>
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
9 | public | some_dist_table | t
|
||||
10 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
@ -1399,7 +1491,7 @@ SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor =>
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
10 | public | some_dist_table | t
|
||||
11 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
@ -1485,7 +1577,7 @@ SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor =>
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
11 | public | some_dist_table | t
|
||||
12 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
@ -1580,7 +1672,7 @@ SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor =>
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
12 | public | some_dist_table | t
|
||||
13 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
@ -1672,7 +1764,7 @@ SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor =>
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
13 | public | some_dist_table | t
|
||||
14 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
@ -1760,7 +1852,7 @@ SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor =>
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
14 | public | some_dist_table | t
|
||||
15 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
@ -1849,7 +1941,7 @@ SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor =>
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+-----------------+---------
|
||||
15 | public | some_dist_table | t
|
||||
16 | public | some_dist_table | t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
@ -1943,14 +2035,14 @@ SELECT * FROM create_hypertable('disttable', 'time', replication_factor => 3);
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+------------+---------
|
||||
16 | public | disttable | t
|
||||
17 | public | disttable | t
|
||||
(1 row)
|
||||
|
||||
INSERT INTO disttable VALUES ('2017-01-01 06:01', 0, 1, 0.0);
|
||||
SELECT show_chunks('disttable');
|
||||
show_chunks
|
||||
----------------------------------------------
|
||||
_timescaledb_internal._dist_hyper_16_6_chunk
|
||||
_timescaledb_internal._dist_hyper_17_6_chunk
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test.show_constraints('disttable');
|
||||
@ -1991,7 +2083,7 @@ SELECT show_chunks('disttable')
|
||||
NOTICE: [data_node_1]:
|
||||
show_chunks
|
||||
--------------------------------------------
|
||||
_timescaledb_internal._dist_hyper_16_6_chunk
|
||||
_timescaledb_internal._dist_hyper_17_6_chunk
|
||||
(1 row)
|
||||
|
||||
|
||||
@ -2018,7 +2110,7 @@ SELECT show_chunks('disttable')
|
||||
NOTICE: [data_node_2]:
|
||||
show_chunks
|
||||
--------------------------------------------
|
||||
_timescaledb_internal._dist_hyper_16_6_chunk
|
||||
_timescaledb_internal._dist_hyper_17_6_chunk
|
||||
(1 row)
|
||||
|
||||
|
||||
@ -2045,7 +2137,7 @@ SELECT show_chunks('disttable')
|
||||
NOTICE: [data_node_3]:
|
||||
show_chunks
|
||||
--------------------------------------------
|
||||
_timescaledb_internal._dist_hyper_16_6_chunk
|
||||
_timescaledb_internal._dist_hyper_17_6_chunk
|
||||
(1 row)
|
||||
|
||||
|
||||
@ -2102,7 +2194,7 @@ SELECT * FROM create_hypertable('disttable', 'time', replication_factor => 3);
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
hypertable_id | schema_name | table_name | created
|
||||
---------------+-------------+------------+---------
|
||||
17 | public | disttable | t
|
||||
18 | public | disttable | t
|
||||
(1 row)
|
||||
|
||||
CREATE INDEX disttable_device_idx ON disttable (device);
|
||||
|
@ -312,6 +312,25 @@ JOIN pg_catalog.pg_user u ON u.usesysid = s.nspowner
|
||||
WHERE s.nspname = 'dist_schema_3';
|
||||
$$);
|
||||
|
||||
-- ALTER SCHEMA RENAME TO
|
||||
CREATE SCHEMA dist_schema;
|
||||
CREATE TABLE dist_schema.some_dist_table(time timestamptz, device int, color int, temp float);
|
||||
SELECT * FROM create_hypertable('dist_schema.some_dist_table', 'time', replication_factor => 3);
|
||||
ALTER SCHEMA dist_schema RENAME TO dist_schema_2;
|
||||
SELECT * FROM test.remote_exec(NULL, $$ SELECT schemaname, tablename FROM pg_tables WHERE tablename = 'some_dist_table' $$);
|
||||
|
||||
-- ALTER SCHEMA OWNER TO
|
||||
ALTER SCHEMA dist_schema_2 OWNER TO :ROLE_1;
|
||||
|
||||
SELECT * FROM test.remote_exec(NULL, $$
|
||||
SELECT s.nspname, u.usename
|
||||
FROM pg_catalog.pg_namespace s
|
||||
JOIN pg_catalog.pg_user u ON u.usesysid = s.nspowner
|
||||
WHERE s.nspname = 'dist_schema_2';
|
||||
$$);
|
||||
|
||||
DROP SCHEMA dist_schema_2 CASCADE;
|
||||
|
||||
-- DROP column cascades to index drop
|
||||
CREATE TABLE some_dist_table(time timestamptz, device int, color int, temp float);
|
||||
SELECT * FROM create_hypertable('some_dist_table', 'time', replication_factor => 3);
|
||||
|
Loading…
x
Reference in New Issue
Block a user