From 473f6cbf05b4f8e0e7cc8383a79d24e9e4c54ade Mon Sep 17 00:00:00 2001 From: gindibay Date: Fri, 27 Oct 2023 08:37:46 +0300 Subject: [PATCH] Fixes metadata sync --- src/backend/distributed/commands/database.c | 21 +- .../distributed/commands/utility_hook.c | 2 +- .../create_drop_database_propagation.out | 202 +++++++----- src/test/regress/expected/pg15.out | 296 +++++++++++++----- .../sql/create_drop_database_propagation.sql | 161 ++++++---- src/test/regress/sql/pg15.sql | 230 ++++++++++---- 6 files changed, 642 insertions(+), 270 deletions(-) diff --git a/src/backend/distributed/commands/database.c b/src/backend/distributed/commands/database.c index 443c0f366..e7a8299ae 100644 --- a/src/backend/distributed/commands/database.c +++ b/src/backend/distributed/commands/database.c @@ -545,6 +545,23 @@ FreeDatabaseCollationInfo(DatabaseCollationInfo collInfo) } + +static char *get_locale_provider_string(char datlocprovider) +{ + switch (datlocprovider) + { + case 'c': + return "libc"; + case 'i': + return "icu"; + case 'l': + return "locale"; + default: + return ""; + } +} + + /* * GenerateCreateDatabaseStatementFromPgDatabase is gets the pg_database tuple and returns the CREATE DATABASE statement */ @@ -552,8 +569,6 @@ static char * GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database databaseForm) { DatabaseCollationInfo collInfo = GetDatabaseCollation(databaseForm->oid); - elog(LOG, "collInfo: %s %s %s %s", collInfo.collation, collInfo.ctype, - collInfo.icu_locale, collInfo.collversion); StringInfoData str; initStringInfo(&str); @@ -590,7 +605,7 @@ GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database databaseForm) if (databaseForm->datlocprovider != 0) { - appendStringInfo(&str, " LOCALE_PROVIDER = '%c'", databaseForm->datlocprovider); + appendStringInfo(&str, " LOCALE_PROVIDER = '%s'", get_locale_provider_string(databaseForm->datlocprovider)); } if (collInfo.collversion != NULL) diff --git a/src/backend/distributed/commands/utility_hook.c b/src/backend/distributed/commands/utility_hook.c index fc763f369..0d400d139 100644 --- a/src/backend/distributed/commands/utility_hook.c +++ b/src/backend/distributed/commands/utility_hook.c @@ -1490,7 +1490,7 @@ DDLTaskList(Oid relationId, const char *commandString) List * NontransactionalNodeDDLTask(TargetWorkerSet targets, List *commands) { - List *ddlJobs = NodeDDLTaskList(NON_COORDINATOR_NODES, commands); + List *ddlJobs = NodeDDLTaskList(targets, commands); DDLJob *ddlJob = NULL; foreach_ptr(ddlJob, ddlJobs) { diff --git a/src/test/regress/expected/create_drop_database_propagation.out b/src/test/regress/expected/create_drop_database_propagation.out index 088a445d6..78ce0025e 100644 --- a/src/test/regress/expected/create_drop_database_propagation.out +++ b/src/test/regress/expected/create_drop_database_propagation.out @@ -19,89 +19,143 @@ CREATE DATABASE mydatabase TABLESPACE = create_drop_db_tablespace ALLOW_CONNECTIONS = true IS_TEMPLATE = false; -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datistemplate | datallowconn | datconnlimit | datcollate | datctype | datacl | database_owner | tablespace +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + result --------------------------------------------------------------------- - mydatabase | 6 | f | t | 10 | C | C | | create_drop_db_test_user | create_drop_db_tablespace -(1 row) + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] +(3 rows) -\c - - - :worker_1_port -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datistemplate | datallowconn | datconnlimit | datcollate | datctype | datacl | database_owner | database_owner | tablespace ---------------------------------------------------------------------- - mydatabase | 6 | f | t | 10 | C | C | | create_drop_db_test_user | create_drop_db_test_user | create_drop_db_tablespace -(1 row) - -\c - - - :worker_2_port -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datistemplate | datallowconn | datconnlimit | datcollate | datctype | datacl | database_owner | database_owner | tablespace ---------------------------------------------------------------------- - mydatabase | 6 | f | t | 10 | C | C | | create_drop_db_test_user | create_drop_db_test_user | create_drop_db_tablespace -(1 row) - -\c - - - :master_port -set citus.enable_create_database_propagation=on; drop database mydatabase; -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datistemplate | datallowconn | datconnlimit | datcollate | datctype | datacl | database_owner | database_owner | tablespace +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + result --------------------------------------------------------------------- -(0 rows) -\c - - - :worker_1_port -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datistemplate | datallowconn | datconnlimit | datcollate | datctype | datacl | database_owner | database_owner | tablespace + + +(3 rows) + +-- test database syncing after node addition +select citus_remove_node('localhost', :worker_2_port); + citus_remove_node --------------------------------------------------------------------- -(0 rows) -\c - - - :worker_2_port -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datistemplate | datallowconn | datconnlimit | datcollate | datctype | datacl | database_owner | database_owner | tablespace +(1 row) + +--test with is_template true and allow connections false +CREATE DATABASE mydatabase + WITH TEMPLATE = 'template0' + OWNER = create_drop_db_test_user + CONNECTION LIMIT = 10 + ENCODING = 'UTF8' + LC_COLLATE = 'C' + LC_CTYPE = 'C' + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = false + IS_TEMPLATE = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + result --------------------------------------------------------------------- -(0 rows) + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": false, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": false, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] +(2 rows) + +select citus_add_node('localhost', :worker_2_port); + citus_add_node +--------------------------------------------------------------------- + 30 +(1 row) + +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": false, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": false, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": false, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] +(3 rows) + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database mydatabase; +NOTICE: issuing DROP DATABASE mydatabase +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +NOTICE: issuing DROP DATABASE mydatabase +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +SET citus.log_remote_commands = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + + + +(3 rows) -\c - - - :master_port --tests for special characters in database name set citus.enable_create_database_propagation=on; SET citus.log_remote_commands = true; diff --git a/src/test/regress/expected/pg15.out b/src/test/regress/expected/pg15.out index caee521a7..3ee5a15cf 100644 --- a/src/test/regress/expected/pg15.out +++ b/src/test/regress/expected/pg15.out @@ -1548,6 +1548,8 @@ CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace \c - - - :master_port create user create_drop_db_test_user; set citus.enable_create_database_propagation=on; +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE DATABASE%'; CREATE DATABASE mydatabase WITH TEMPLATE = 'template0' OWNER = create_drop_db_test_user @@ -1564,87 +1566,231 @@ CREATE DATABASE mydatabase ALLOW_CONNECTIONS = true IS_TEMPLATE = false OID = 966345; -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datlocprovider | datistemplate | datallowconn | datconnlimit | datcollate | datctype | daticulocale | datcollversion | datacl | database_owner | database_owner | tablespace +NOTICE: issuing CREATE DATABASE mydatabase TEMPLATE template0 OWNER create_drop_db_test_user CONNECTION LIMIT 10 ENCODING 'UTF8' STRATEGY 'wal_log' LOCALE '' LC_COLLATE 'POSIX' LC_CTYPE 'POSIX' ICU_LOCALE 'und' LOCALE_PROVIDER 'icu' COLLATION_VERSION '1.0' TABLESPACE create_drop_db_tablespace ALLOW_CONNECTIONS true IS_TEMPLATE false OID 966345 +NOTICE: issuing CREATE DATABASE mydatabase TEMPLATE template0 OWNER create_drop_db_test_user CONNECTION LIMIT 10 ENCODING 'UTF8' STRATEGY 'wal_log' LOCALE '' LC_COLLATE 'POSIX' LC_CTYPE 'POSIX' ICU_LOCALE 'und' LOCALE_PROVIDER 'icu' COLLATION_VERSION '1.0' TABLESPACE create_drop_db_tablespace ALLOW_CONNECTIONS true IS_TEMPLATE false OID 966345 +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + result --------------------------------------------------------------------- - mydatabase | 6 | i | f | t | 10 | C | C | und | 1.0 | | create_drop_db_test_user | create_drop_db_test_user | create_drop_db_tablespace -(1 row) + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": 10, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] +(3 rows) -\c - - - :worker_1_port -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datlocprovider | datistemplate | datallowconn | datconnlimit | datcollate | datctype | daticulocale | datcollversion | datacl | database_owner | database_owner | tablespace ---------------------------------------------------------------------- - mydatabase | 6 | i | f | t | 10 | C | C | und | 1.0 | | create_drop_db_test_user | create_drop_db_test_user | create_drop_db_tablespace -(1 row) - -\c - - - :worker_2_port -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datlocprovider | datistemplate | datallowconn | datconnlimit | datcollate | datctype | daticulocale | datcollversion | datacl | database_owner | database_owner | tablespace ---------------------------------------------------------------------- - mydatabase | 6 | i | f | t | 10 | C | C | und | 1.0 | | create_drop_db_test_user | create_drop_db_test_user | create_drop_db_tablespace -(1 row) - -\c - - - :master_port -set citus.enable_create_database_propagation=on; drop database mydatabase; -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datlocprovider | datistemplate | datallowconn | datconnlimit | datcollate | datctype | daticulocale | datcollversion | datacl | database_owner | database_owner | tablespace +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + result --------------------------------------------------------------------- -(0 rows) -\c - - - :worker_1_port -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datlocprovider | datistemplate | datallowconn | datconnlimit | datcollate | datctype | daticulocale | datcollversion | datacl | database_owner | database_owner | tablespace ---------------------------------------------------------------------- -(0 rows) -\c - - - :worker_2_port -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - datname | encoding | datlocprovider | datistemplate | datallowconn | datconnlimit | datcollate | datctype | daticulocale | datcollversion | datacl | database_owner | database_owner | tablespace + +(3 rows) + +select citus_remove_node('localhost', :worker_2_port); + citus_remove_node --------------------------------------------------------------------- -(0 rows) + +(1 row) + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE DATABASE%'; +CREATE DATABASE mydatabase2 + WITH OWNER = create_drop_db_test_user + ENCODING = 'UTF8' + STRATEGY = 'wal_log' + LOCALE = 'en_US.utf8' + LC_COLLATE = 'POSIX' + LC_CTYPE = 'POSIX' + COLLATION_VERSION = '1.0' + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = true + IS_TEMPLATE = false + OID = 966345; +NOTICE: issuing CREATE DATABASE mydatabase2 OWNER create_drop_db_test_user ENCODING 'UTF8' STRATEGY 'wal_log' LOCALE 'en_US.utf8' LC_COLLATE 'POSIX' LC_CTYPE 'POSIX' COLLATION_VERSION '1.0' TABLESPACE create_drop_db_tablespace ALLOW_CONNECTIONS true IS_TEMPLATE false OID 966345 +SET citus.log_remote_commands = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase2' + ) q2 + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + [{"datacl": null, "datname": "mydatabase2", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": -1, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase2", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": -1, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] +(2 rows) + +SET citus.log_remote_commands = true; +select citus_add_node('localhost', :worker_2_port); +NOTICE: issuing SET citus.enable_ddl_propagation TO 'off';select pg_catalog.citus_internal_database_command( 'CREATE DATABASE postgres OWNER = postgres ENCODING = ''UTF8'' LC_COLLATE = ''C'' LC_CTYPE = ''C'' LOCALE_PROVIDER = ''libc'' TABLESPACE = pg_default ALLOW_CONNECTIONS = ''true'' IS_TEMPLATE = ''false''');select pg_catalog.citus_internal_database_command( 'CREATE DATABASE regression OWNER = postgres ENCODING = ''UTF8'' LC_COLLATE = ''C'' LC_CTYPE = ''C'' LOCALE_PROVIDER = ''libc'' TABLESPACE = pg_default ALLOW_CONNECTIONS = ''true'' IS_TEMPLATE = ''false''');select pg_catalog.citus_internal_database_command( 'CREATE DATABASE template1 OWNER = postgres ENCODING = ''UTF8'' LC_COLLATE = ''C'' LC_CTYPE = ''C'' LOCALE_PROVIDER = ''libc'' TABLESPACE = pg_default ALLOW_CONNECTIONS = ''true'' IS_TEMPLATE = ''true''');select pg_catalog.citus_internal_database_command( 'CREATE DATABASE template0 OWNER = postgres ENCODING = ''UTF8'' LC_COLLATE = ''C'' LC_CTYPE = ''C'' LOCALE_PROVIDER = ''libc'' TABLESPACE = pg_default ALLOW_CONNECTIONS = ''false'' IS_TEMPLATE = ''true''');select pg_catalog.citus_internal_database_command( 'CREATE DATABASE mydatabase2 OWNER = create_drop_db_test_user ENCODING = ''UTF8'' LC_COLLATE = ''C'' LC_CTYPE = ''C'' LOCALE_PROVIDER = ''libc'' COLLATION_VERSION = ''1.0'' TABLESPACE = create_drop_db_tablespace ALLOW_CONNECTIONS = ''true'' IS_TEMPLATE = ''false''');ALTER ROLE ALL IN DATABASE regression SET lc_messages = 'C';ALTER ROLE ALL IN DATABASE regression SET lc_monetary = 'C';ALTER ROLE ALL IN DATABASE regression SET lc_numeric = 'C';ALTER ROLE ALL IN DATABASE regression SET lc_time = 'C';ALTER ROLE ALL IN DATABASE regression SET bytea_output = 'hex';ALTER ROLE ALL IN DATABASE regression SET timezone_abbreviations = 'Default';SET citus.enable_ddl_propagation TO 'on' + citus_add_node +--------------------------------------------------------------------- + 30 +(1 row) + +SET citus.log_remote_commands = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase2' + ) q2 + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + [{"datacl": null, "datname": "mydatabase2", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": -1, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase2", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": -1, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "mydatabase2", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": true, "datconnlimit": -1, "datistemplate": false, "database_owner": "create_drop_db_test_user"}] +(3 rows) + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database mydatabase2; +NOTICE: issuing DROP DATABASE mydatabase2 +NOTICE: issuing DROP DATABASE mydatabase2 +SET citus.log_remote_commands = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + + + +(3 rows) + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE DATABASE%'; +-- create a template database with all options set and allow connections false +CREATE DATABASE my_template_database + WITH TEMPLATE = 'template0' + OWNER = create_drop_db_test_user + ENCODING = 'UTF8' + STRATEGY = 'wal_log' + LOCALE = 'en_US.utf8' + LC_COLLATE = 'POSIX' + LC_CTYPE = 'POSIX' + ICU_LOCALE = 'en-US' + LOCALE_PROVIDER = 'icu' + COLLATION_VERSION = '1.0' + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = false + IS_TEMPLATE = true; +NOTICE: issuing CREATE DATABASE my_template_database TEMPLATE template0 OWNER create_drop_db_test_user ENCODING 'UTF8' STRATEGY 'wal_log' LOCALE 'en_US.utf8' LC_COLLATE 'POSIX' LC_CTYPE 'POSIX' ICU_LOCALE 'en-US' LOCALE_PROVIDER 'icu' COLLATION_VERSION '1.0' TABLESPACE create_drop_db_tablespace ALLOW_CONNECTIONS false IS_TEMPLATE true +NOTICE: issuing CREATE DATABASE my_template_database TEMPLATE template0 OWNER create_drop_db_test_user ENCODING 'UTF8' STRATEGY 'wal_log' LOCALE 'en_US.utf8' LC_COLLATE 'POSIX' LC_CTYPE 'POSIX' ICU_LOCALE 'en-US' LOCALE_PROVIDER 'icu' COLLATION_VERSION '1.0' TABLESPACE create_drop_db_tablespace ALLOW_CONNECTIONS false IS_TEMPLATE true +SET citus.log_remote_commands = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'my_template_database' + ) q2 + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + [{"datacl": null, "datname": "my_template_database", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": false, "datconnlimit": -1, "datistemplate": true, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "my_template_database", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": false, "datconnlimit": -1, "datistemplate": true, "database_owner": "create_drop_db_test_user"}] + [{"datacl": null, "datname": "my_template_database", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "datallowconn": false, "datconnlimit": -1, "datistemplate": true, "database_owner": "create_drop_db_test_user"}] +(3 rows) + +SET citus.log_remote_commands = true; +--template databases could not be dropped so we need to change the template flag +SELECT result from run_command_on_all_nodes( + $$ + UPDATE pg_database SET datistemplate = false WHERE datname = 'my_template_database' + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + UPDATE 1 + UPDATE 1 + UPDATE 1 +(3 rows) + +; +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database my_template_database; +NOTICE: issuing DROP DATABASE my_template_database +NOTICE: issuing DROP DATABASE my_template_database +SET citus.log_remote_commands = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'my_template_database' + ) q2 + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + + + +(3 rows) \c - - - :master_port drop tablespace create_drop_db_tablespace; @@ -1653,4 +1799,4 @@ drop tablespace create_drop_db_tablespace; \c - - - :worker_2_port drop tablespace create_drop_db_tablespace; \c - - - :master_port -drop user create_drop_db_test_user; \ No newline at end of file +drop user create_drop_db_test_user; diff --git a/src/test/regress/sql/create_drop_database_propagation.sql b/src/test/regress/sql/create_drop_database_propagation.sql index d21956595..6f9202a4b 100644 --- a/src/test/regress/sql/create_drop_database_propagation.sql +++ b/src/test/regress/sql/create_drop_database_propagation.sql @@ -16,6 +16,60 @@ create user create_drop_db_test_user; set citus.enable_create_database_propagation=on; + +CREATE DATABASE mydatabase + WITH OWNER = create_drop_db_test_user + TEMPLATE = 'template0' + ENCODING = 'UTF8' + CONNECTION LIMIT = 10 + LC_COLLATE = 'C' + LC_CTYPE = 'C' + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = true + IS_TEMPLATE = false; + + + +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + + +drop database mydatabase; + + + +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + +-- test database syncing after node addition + +select citus_remove_node('localhost', :worker_2_port); + +--test with is_template true and allow connections false CREATE DATABASE mydatabase WITH TEMPLATE = 'template0' OWNER = create_drop_db_test_user @@ -24,75 +78,62 @@ CREATE DATABASE mydatabase LC_COLLATE = 'C' LC_CTYPE = 'C' TABLESPACE = create_drop_db_tablespace - ALLOW_CONNECTIONS = true + ALLOW_CONNECTIONS = false IS_TEMPLATE = false; -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; -\c - - - :worker_1_port +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; -\c - - - :worker_2_port +select citus_add_node('localhost', :worker_2_port); -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; -\c - - - :master_port -set citus.enable_create_database_propagation=on; +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%DROP DATABASE%'; drop database mydatabase; -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; +SET citus.log_remote_commands = false; -\c - - - :worker_1_port - -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - -\c - - - :worker_2_port - -SELECT pd.datname, pd.encoding, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, -pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - -\c - - - :master_port +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; --tests for special characters in database name set citus.enable_create_database_propagation=on; diff --git a/src/test/regress/sql/pg15.sql b/src/test/regress/sql/pg15.sql index f0c6706d2..ac523b521 100644 --- a/src/test/regress/sql/pg15.sql +++ b/src/test/regress/sql/pg15.sql @@ -995,6 +995,8 @@ CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace \c - - - :master_port create user create_drop_db_test_user; set citus.enable_create_database_propagation=on; +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE DATABASE%'; CREATE DATABASE mydatabase WITH TEMPLATE = 'template0' OWNER = create_drop_db_test_user @@ -1012,70 +1014,184 @@ CREATE DATABASE mydatabase IS_TEMPLATE = false OID = 966345; -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - -\c - - - :worker_1_port -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; -\c - - - :worker_2_port -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; - - -\c - - - :master_port -set citus.enable_create_database_propagation=on; drop database mydatabase; -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; + +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; -\c - - - :worker_1_port -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; +select citus_remove_node('localhost', :worker_2_port); -\c - - - :worker_2_port -SELECT pd.datname, pd.encoding, pd.datlocprovider, -pd.datistemplate, pd.datallowconn, pd.datconnlimit, -pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, -pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace -FROM pg_database pd -JOIN pg_authid pa ON pd.datdba = pa.oid -join pg_tablespace pt on pd.dattablespace = pt.oid -WHERE datname = 'mydatabase'; +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE DATABASE%'; + +CREATE DATABASE mydatabase2 + WITH OWNER = create_drop_db_test_user + ENCODING = 'UTF8' + STRATEGY = 'wal_log' + LOCALE = 'en_US.utf8' + LC_COLLATE = 'POSIX' + LC_CTYPE = 'POSIX' + COLLATION_VERSION = '1.0' + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = true + IS_TEMPLATE = false + OID = 966345; + +SET citus.log_remote_commands = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase2' + ) q2 + $$ +) ORDER BY result; + + +SET citus.log_remote_commands = true; +select citus_add_node('localhost', :worker_2_port); + +SET citus.log_remote_commands = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase2' + ) q2 + $$ +) ORDER BY result; + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database mydatabase2; + +SET citus.log_remote_commands = false; + +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'mydatabase' + ) q2 + $$ +) ORDER BY result; + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE DATABASE%'; + +-- create a template database with all options set and allow connections false +CREATE DATABASE my_template_database + WITH TEMPLATE = 'template0' + OWNER = create_drop_db_test_user + ENCODING = 'UTF8' + STRATEGY = 'wal_log' + LOCALE = 'en_US.utf8' + LC_COLLATE = 'POSIX' + LC_CTYPE = 'POSIX' + ICU_LOCALE = 'en-US' + LOCALE_PROVIDER = 'icu' + COLLATION_VERSION = '1.0' + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = false + IS_TEMPLATE = true; + +SET citus.log_remote_commands = false; + +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'my_template_database' + ) q2 + $$ +) ORDER BY result; + + + +SET citus.log_remote_commands = true; + +--template databases could not be dropped so we need to change the template flag +SELECT result from run_command_on_all_nodes( + $$ + UPDATE pg_database SET datistemplate = false WHERE datname = 'my_template_database' + $$ +) ORDER BY result; + +; + +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database my_template_database; + +SET citus.log_remote_commands = false; +SELECT result from run_command_on_all_nodes( + $$ + SELECT jsonb_agg(to_jsonb(q2.*)) FROM ( + SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding, + pd.datistemplate, pd.datallowconn, pd.datconnlimit, + pd.datcollate , pd. datctype , pd.datacl, + pa.rolname AS database_owner, pt.spcname AS tablespace + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + join pg_tablespace pt on pd.dattablespace = pt.oid + WHERE datname = 'my_template_database' + ) q2 + $$ +) ORDER BY result; + \c - - - :master_port drop tablespace create_drop_db_tablespace;