Fixes metadata sync

pull/7240/head
gindibay 2023-10-27 08:37:46 +03:00
parent 641e413676
commit 473f6cbf05
6 changed files with 642 additions and 270 deletions

View File

@ -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 * GenerateCreateDatabaseStatementFromPgDatabase is gets the pg_database tuple and returns the CREATE DATABASE statement
*/ */
@ -552,8 +569,6 @@ static char *
GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database databaseForm) GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database databaseForm)
{ {
DatabaseCollationInfo collInfo = GetDatabaseCollation(databaseForm->oid); DatabaseCollationInfo collInfo = GetDatabaseCollation(databaseForm->oid);
elog(LOG, "collInfo: %s %s %s %s", collInfo.collation, collInfo.ctype,
collInfo.icu_locale, collInfo.collversion);
StringInfoData str; StringInfoData str;
initStringInfo(&str); initStringInfo(&str);
@ -590,7 +605,7 @@ GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database databaseForm)
if (databaseForm->datlocprovider != 0) 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) if (collInfo.collversion != NULL)

View File

@ -1490,7 +1490,7 @@ DDLTaskList(Oid relationId, const char *commandString)
List * List *
NontransactionalNodeDDLTask(TargetWorkerSet targets, List *commands) NontransactionalNodeDDLTask(TargetWorkerSet targets, List *commands)
{ {
List *ddlJobs = NodeDDLTaskList(NON_COORDINATOR_NODES, commands); List *ddlJobs = NodeDDLTaskList(targets, commands);
DDLJob *ddlJob = NULL; DDLJob *ddlJob = NULL;
foreach_ptr(ddlJob, ddlJobs) foreach_ptr(ddlJob, ddlJobs)
{ {

View File

@ -19,89 +19,143 @@ CREATE DATABASE mydatabase
TABLESPACE = create_drop_db_tablespace TABLESPACE = create_drop_db_tablespace
ALLOW_CONNECTIONS = true ALLOW_CONNECTIONS = true
IS_TEMPLATE = false; IS_TEMPLATE = false;
SELECT pd.datname, pd.encoding, SELECT result from run_command_on_all_nodes(
pd.datistemplate, pd.datallowconn, pd.datconnlimit, $$
pd.datcollate , pd. datctype , pd.datacl, SELECT jsonb_agg(to_jsonb(q2.*)) FROM (
pa.rolname AS database_owner, pt.spcname AS tablespace SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding,
FROM pg_database pd pd.datistemplate, pd.datallowconn, pd.datconnlimit,
JOIN pg_authid pa ON pd.datdba = pa.oid pd.datcollate , pd. datctype , pd.datacl,
join pg_tablespace pt on pd.dattablespace = pt.oid pa.rolname AS database_owner, pt.spcname AS tablespace
WHERE datname = 'mydatabase'; FROM pg_database pd
datname | encoding | datistemplate | datallowconn | datconnlimit | datcollate | datctype | datacl | database_owner | tablespace 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 [{"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"}]
(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"}]
(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; drop database mydatabase;
SELECT pd.datname, pd.encoding, SELECT result from run_command_on_all_nodes(
pd.datistemplate, pd.datallowconn, pd.datconnlimit, $$
pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, SELECT jsonb_agg(to_jsonb(q2.*)) FROM (
pa.rolname AS database_owner, pt.spcname AS tablespace SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding,
FROM pg_database pd pd.datistemplate, pd.datallowconn, pd.datconnlimit,
JOIN pg_authid pa ON pd.datdba = pa.oid pd.datcollate , pd. datctype , pd.datacl,
join pg_tablespace pt on pd.dattablespace = pt.oid pa.rolname AS database_owner, pt.spcname AS tablespace
WHERE datname = 'mydatabase'; FROM pg_database pd
datname | encoding | datistemplate | datallowconn | datconnlimit | datcollate | datctype | datacl | database_owner | database_owner | tablespace 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, (3 rows)
pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner,
pa.rolname AS database_owner, pt.spcname AS tablespace -- test database syncing after node addition
FROM pg_database pd select citus_remove_node('localhost', :worker_2_port);
JOIN pg_authid pa ON pd.datdba = pa.oid citus_remove_node
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
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows)
\c - - - :worker_2_port (1 row)
SELECT pd.datname, pd.encoding,
pd.datistemplate, pd.datallowconn, pd.datconnlimit, --test with is_template true and allow connections false
pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, CREATE DATABASE mydatabase
pa.rolname AS database_owner, pt.spcname AS tablespace WITH TEMPLATE = 'template0'
FROM pg_database pd OWNER = create_drop_db_test_user
JOIN pg_authid pa ON pd.datdba = pa.oid CONNECTION LIMIT = 10
join pg_tablespace pt on pd.dattablespace = pt.oid ENCODING = 'UTF8'
WHERE datname = 'mydatabase'; LC_COLLATE = 'C'
datname | encoding | datistemplate | datallowconn | datconnlimit | datcollate | datctype | datacl | database_owner | database_owner | tablespace 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 --tests for special characters in database name
set citus.enable_create_database_propagation=on; set citus.enable_create_database_propagation=on;
SET citus.log_remote_commands = true; SET citus.log_remote_commands = true;

View File

@ -1548,6 +1548,8 @@ CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace
\c - - - :master_port \c - - - :master_port
create user create_drop_db_test_user; create user create_drop_db_test_user;
set citus.enable_create_database_propagation=on; set citus.enable_create_database_propagation=on;
SET citus.log_remote_commands = true;
set citus.grep_remote_commands = '%CREATE DATABASE%';
CREATE DATABASE mydatabase CREATE DATABASE mydatabase
WITH TEMPLATE = 'template0' WITH TEMPLATE = 'template0'
OWNER = create_drop_db_test_user OWNER = create_drop_db_test_user
@ -1564,87 +1566,231 @@ CREATE DATABASE mydatabase
ALLOW_CONNECTIONS = true ALLOW_CONNECTIONS = true
IS_TEMPLATE = false IS_TEMPLATE = false
OID = 966345; OID = 966345;
SELECT pd.datname, pd.encoding, pd.datlocprovider, 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
pd.datistemplate, pd.datallowconn, pd.datconnlimit, 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
pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, SELECT result from run_command_on_all_nodes(
pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace $$
FROM pg_database pd SELECT jsonb_agg(to_jsonb(q2.*)) FROM (
JOIN pg_authid pa ON pd.datdba = pa.oid SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding,
join pg_tablespace pt on pd.dattablespace = pt.oid pd.datistemplate, pd.datallowconn, pd.datconnlimit,
WHERE datname = 'mydatabase'; pd.datcollate , pd. datctype , pd.datacl,
datname | encoding | datlocprovider | datistemplate | datallowconn | datconnlimit | datcollate | datctype | daticulocale | datcollversion | datacl | database_owner | database_owner | tablespace 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 [{"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"}]
(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"}]
(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; drop database mydatabase;
SELECT pd.datname, pd.encoding, pd.datlocprovider, SELECT result from run_command_on_all_nodes(
pd.datistemplate, pd.datallowconn, pd.datconnlimit, $$
pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, SELECT jsonb_agg(to_jsonb(q2.*)) FROM (
pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding,
FROM pg_database pd pd.datistemplate, pd.datallowconn, pd.datconnlimit,
JOIN pg_authid pa ON pd.datdba = pa.oid pd.datcollate , pd. datctype , pd.datacl,
join pg_tablespace pt on pd.dattablespace = pt.oid pa.rolname AS database_owner, pt.spcname AS tablespace
WHERE datname = 'mydatabase'; FROM pg_database pd
datname | encoding | datlocprovider | datistemplate | datallowconn | datconnlimit | datcollate | datctype | daticulocale | datcollversion | datacl | database_owner | database_owner | tablespace 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, (3 rows)
pd.datistemplate, pd.datallowconn, pd.datconnlimit,
pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, select citus_remove_node('localhost', :worker_2_port);
pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace citus_remove_node
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)
(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 \c - - - :master_port
drop tablespace create_drop_db_tablespace; drop tablespace create_drop_db_tablespace;
@ -1653,4 +1799,4 @@ drop tablespace create_drop_db_tablespace;
\c - - - :worker_2_port \c - - - :worker_2_port
drop tablespace create_drop_db_tablespace; drop tablespace create_drop_db_tablespace;
\c - - - :master_port \c - - - :master_port
drop user create_drop_db_test_user; drop user create_drop_db_test_user;

View File

@ -16,6 +16,60 @@ create user create_drop_db_test_user;
set citus.enable_create_database_propagation=on; 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 CREATE DATABASE mydatabase
WITH TEMPLATE = 'template0' WITH TEMPLATE = 'template0'
OWNER = create_drop_db_test_user OWNER = create_drop_db_test_user
@ -24,75 +78,62 @@ CREATE DATABASE mydatabase
LC_COLLATE = 'C' LC_COLLATE = 'C'
LC_CTYPE = 'C' LC_CTYPE = 'C'
TABLESPACE = create_drop_db_tablespace TABLESPACE = create_drop_db_tablespace
ALLOW_CONNECTIONS = true ALLOW_CONNECTIONS = false
IS_TEMPLATE = 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, select citus_add_node('localhost', :worker_2_port);
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, SELECT result from run_command_on_all_nodes(
pd.datistemplate, pd.datallowconn, pd.datconnlimit, $$
pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, SELECT jsonb_agg(to_jsonb(q2.*)) FROM (
pa.rolname AS database_owner, pt.spcname AS tablespace SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding,
FROM pg_database pd pd.datistemplate, pd.datallowconn, pd.datconnlimit,
JOIN pg_authid pa ON pd.datdba = pa.oid pd.datcollate , pd. datctype , pd.datacl,
join pg_tablespace pt on pd.dattablespace = pt.oid pa.rolname AS database_owner, pt.spcname AS tablespace
WHERE datname = 'mydatabase'; 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.log_remote_commands = true;
set citus.enable_create_database_propagation=on; set citus.grep_remote_commands = '%DROP DATABASE%';
drop database mydatabase; drop database mydatabase;
SELECT pd.datname, pd.encoding, SET citus.log_remote_commands = false;
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_1_port SELECT result from run_command_on_all_nodes(
$$
SELECT pd.datname, pd.encoding, SELECT jsonb_agg(to_jsonb(q2.*)) FROM (
pd.datistemplate, pd.datallowconn, pd.datconnlimit, SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding,
pd.datcollate , pd. datctype , pd.datacl, rolname AS database_owner, pd.datistemplate, pd.datallowconn, pd.datconnlimit,
pa.rolname AS database_owner, pt.spcname AS tablespace pd.datcollate , pd. datctype , pd.datacl,
FROM pg_database pd pa.rolname AS database_owner, pt.spcname AS tablespace
JOIN pg_authid pa ON pd.datdba = pa.oid FROM pg_database pd
join pg_tablespace pt on pd.dattablespace = pt.oid JOIN pg_authid pa ON pd.datdba = pa.oid
WHERE datname = 'mydatabase'; join pg_tablespace pt on pd.dattablespace = pt.oid
WHERE datname = 'mydatabase'
\c - - - :worker_2_port ) q2
$$
SELECT pd.datname, pd.encoding, ) ORDER BY result;
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
--tests for special characters in database name --tests for special characters in database name
set citus.enable_create_database_propagation=on; set citus.enable_create_database_propagation=on;

View File

@ -995,6 +995,8 @@ CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace
\c - - - :master_port \c - - - :master_port
create user create_drop_db_test_user; create user create_drop_db_test_user;
set citus.enable_create_database_propagation=on; set citus.enable_create_database_propagation=on;
SET citus.log_remote_commands = true;
set citus.grep_remote_commands = '%CREATE DATABASE%';
CREATE DATABASE mydatabase CREATE DATABASE mydatabase
WITH TEMPLATE = 'template0' WITH TEMPLATE = 'template0'
OWNER = create_drop_db_test_user OWNER = create_drop_db_test_user
@ -1012,70 +1014,184 @@ CREATE DATABASE mydatabase
IS_TEMPLATE = false IS_TEMPLATE = false
OID = 966345; OID = 966345;
SELECT pd.datname, pd.encoding, pd.datlocprovider, SELECT result from run_command_on_all_nodes(
pd.datistemplate, pd.datallowconn, pd.datconnlimit, $$
pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, SELECT jsonb_agg(to_jsonb(q2.*)) FROM (
pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding,
FROM pg_database pd pd.datistemplate, pd.datallowconn, pd.datconnlimit,
JOIN pg_authid pa ON pd.datdba = pa.oid pd.datcollate , pd. datctype , pd.datacl,
join pg_tablespace pt on pd.dattablespace = pt.oid pa.rolname AS database_owner, pt.spcname AS tablespace
WHERE datname = 'mydatabase'; FROM pg_database pd
JOIN pg_authid pa ON pd.datdba = pa.oid
\c - - - :worker_1_port join pg_tablespace pt on pd.dattablespace = pt.oid
SELECT pd.datname, pd.encoding, pd.datlocprovider, WHERE datname = 'mydatabase'
pd.datistemplate, pd.datallowconn, pd.datconnlimit, ) q2
pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, $$
pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace ) ORDER BY result;
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.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; drop database mydatabase;
SELECT pd.datname, pd.encoding, pd.datlocprovider,
pd.datistemplate, pd.datallowconn, pd.datconnlimit, SELECT result from run_command_on_all_nodes(
pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion, $$
pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace SELECT jsonb_agg(to_jsonb(q2.*)) FROM (
FROM pg_database pd SELECT pd.datname, pg_encoding_to_char(pd.encoding) as encoding,
JOIN pg_authid pa ON pd.datdba = pa.oid pd.datistemplate, pd.datallowconn, pd.datconnlimit,
join pg_tablespace pt on pd.dattablespace = pt.oid pd.datcollate , pd. datctype , pd.datacl,
WHERE datname = 'mydatabase'; 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 citus_remove_node('localhost', :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 - - - :worker_2_port
SELECT pd.datname, pd.encoding, pd.datlocprovider, SET citus.log_remote_commands = true;
pd.datistemplate, pd.datallowconn, pd.datconnlimit, set citus.grep_remote_commands = '%CREATE DATABASE%';
pd.datcollate , pd. datctype , pd.daticulocale, pd.datcollversion,
pd.datacl, rolname AS database_owner, pa.rolname AS database_owner, pt.spcname AS tablespace CREATE DATABASE mydatabase2
FROM pg_database pd WITH OWNER = create_drop_db_test_user
JOIN pg_authid pa ON pd.datdba = pa.oid ENCODING = 'UTF8'
join pg_tablespace pt on pd.dattablespace = pt.oid STRATEGY = 'wal_log'
WHERE datname = 'mydatabase'; 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 \c - - - :master_port
drop tablespace create_drop_db_tablespace; drop tablespace create_drop_db_tablespace;