diff --git a/src/backend/distributed/utils/citus_ruleutils.c b/src/backend/distributed/utils/citus_ruleutils.c index 706f9599a..8e706ddea 100644 --- a/src/backend/distributed/utils/citus_ruleutils.c +++ b/src/backend/distributed/utils/citus_ruleutils.c @@ -229,51 +229,67 @@ pg_get_tableschemadef_string(Oid tableRelationId) AttrNumber constraintIndex = 0; AttrNumber constraintCount = 0; StringInfoData buffer = { NULL, 0, 0, 0 }; + OverrideSearchPath *overridePath = NULL; /* - * Instead of retrieving values from system catalogs as other functions in - * ruleutils.c do, we follow an unusual approach here: we open the relation, - * and fetch the relation's tuple descriptor. We do this because the tuple - * descriptor already contains information harnessed from pg_attrdef, - * pg_attribute, pg_constraint, and pg_class; and therefore using the - * descriptor saves us from a lot of additional work. + * Set search_path to NIL so that all objects outside of pg_catalog will be + * schema-prefixed. pg_catalog will be added automatically when we call + * PushOverrideSearchPath(), since we set addCatalog to true; */ - relation = relation_open(tableRelationId, AccessShareLock); - relationName = generate_relation_name(tableRelationId, NIL); + overridePath = GetOverrideSearchPath(CurrentMemoryContext); + overridePath->schemas = NIL; + overridePath->addCatalog = true; + PushOverrideSearchPath(overridePath); - relationKind = relation->rd_rel->relkind; - if (relationKind != RELKIND_RELATION && relationKind != RELKIND_FOREIGN_TABLE) + PG_TRY(); { - ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("%s is not a regular or foreign table", relationName))); - } + /* + * Instead of retrieving values from system catalogs as other functions in + * ruleutils.c do, we follow an unusual approach here: we open the relation, + * and fetch the relation's tuple descriptor. We do this because the tuple + * descriptor already contains information harnessed from pg_attrdef, + * pg_attribute, pg_constraint, and pg_class; and therefore using the + * descriptor saves us from a lot of additional work. + */ + relation = relation_open(tableRelationId, AccessShareLock); + relationName = generate_relation_name(tableRelationId, NIL); - initStringInfo(&buffer); - if (relationKind == RELKIND_RELATION) - { - appendStringInfo(&buffer, "CREATE TABLE %s (", relationName); - } - else - { - appendStringInfo(&buffer, "CREATE FOREIGN TABLE %s (", relationName); - } - - /* - * Iterate over the table's columns. If a particular column is not dropped - * and is not inherited from another table, print the column's name and its - * formatted type. - */ - tupleDescriptor = RelationGetDescr(relation); - tupleConstraints = tupleDescriptor->constr; - - for (attributeIndex = 0; attributeIndex < tupleDescriptor->natts; attributeIndex++) - { - Form_pg_attribute attributeForm = tupleDescriptor->attrs[attributeIndex]; - const char *attributeName = NULL; - const char *attributeTypeName = NULL; - - if (!attributeForm->attisdropped && attributeForm->attinhcount == 0) + relationKind = relation->rd_rel->relkind; + if (relationKind != RELKIND_RELATION && relationKind != RELKIND_FOREIGN_TABLE) { + ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("%s is not a regular or foreign table", relationName))); + } + + initStringInfo(&buffer); + if (relationKind == RELKIND_RELATION) + { + appendStringInfo(&buffer, "CREATE TABLE %s (", relationName); + } + else + { + appendStringInfo(&buffer, "CREATE FOREIGN TABLE %s (", relationName); + } + + /* + * Iterate over the table's columns. If a particular column is not dropped + * and is not inherited from another table, print the column's name and its + * formatted type. + */ + tupleDescriptor = RelationGetDescr(relation); + tupleConstraints = tupleDescriptor->constr; + + for (attributeIndex = 0; attributeIndex < tupleDescriptor->natts; attributeIndex++) + { + Form_pg_attribute attributeForm = tupleDescriptor->attrs[attributeIndex]; + const char *attributeName = NULL; + const char *attributeTypeName = NULL; + + if (attributeForm->attisdropped || attributeForm->attinhcount != 0) + { + continue; + } + if (firstAttributePrinted) { appendStringInfoString(&buffer, ", "); @@ -325,64 +341,75 @@ pg_get_tableschemadef_string(Oid tableRelationId) appendStringInfoString(&buffer, " NOT NULL"); } } - } - /* - * Now check if the table has any constraints. If it does, set the number of - * check constraints here. Then iterate over all check constraints and print - * them. - */ - if (tupleConstraints != NULL) - { - constraintCount = tupleConstraints->num_check; - } - - for (constraintIndex = 0; constraintIndex < constraintCount; constraintIndex++) - { - ConstrCheck *checkConstraintList = tupleConstraints->check; - ConstrCheck *checkConstraint = &(checkConstraintList[constraintIndex]); - - Node *checkNode = NULL; - List *checkContext = NULL; - char *checkString = NULL; - - /* if an attribute or constraint has been printed, format properly */ - if (firstAttributePrinted || constraintIndex > 0) + /* + * Now check if the table has any constraints. If it does, set the number of + * check constraints here. Then iterate over all check constraints and print + * them. + */ + if (tupleConstraints != NULL) { - appendStringInfoString(&buffer, ", "); + constraintCount = tupleConstraints->num_check; } - appendStringInfo(&buffer, "CONSTRAINT %s CHECK ", - quote_identifier(checkConstraint->ccname)); + for (constraintIndex = 0; constraintIndex < constraintCount; constraintIndex++) + { + ConstrCheck *checkConstraintList = tupleConstraints->check; + ConstrCheck *checkConstraint = &(checkConstraintList[constraintIndex]); - /* convert expression to node tree, and prepare deparse context */ - checkNode = (Node *) stringToNode(checkConstraint->ccbin); - checkContext = deparse_context_for(relationName, tableRelationId); + Node *checkNode = NULL; + List *checkContext = NULL; + char *checkString = NULL; - /* deparse check constraint string */ - checkString = deparse_expression(checkNode, checkContext, false, false); + /* if an attribute or constraint has been printed, format properly */ + if (firstAttributePrinted || constraintIndex > 0) + { + appendStringInfoString(&buffer, ", "); + } - appendStringInfoString(&buffer, checkString); + appendStringInfo(&buffer, "CONSTRAINT %s CHECK ", + quote_identifier(checkConstraint->ccname)); + + /* convert expression to node tree, and prepare deparse context */ + checkNode = (Node *) stringToNode(checkConstraint->ccbin); + checkContext = deparse_context_for(relationName, tableRelationId); + + /* deparse check constraint string */ + checkString = deparse_expression(checkNode, checkContext, false, false); + + appendStringInfoString(&buffer, checkString); + } + + /* close create table's outer parentheses */ + appendStringInfoString(&buffer, ")"); + + /* + * If the relation is a foreign table, append the server name and options to + * the create table statement. + */ + if (relationKind == RELKIND_FOREIGN_TABLE) + { + ForeignTable *foreignTable = GetForeignTable(tableRelationId); + ForeignServer *foreignServer = GetForeignServer(foreignTable->serverid); + + char *serverName = foreignServer->servername; + appendStringInfo(&buffer, " SERVER %s", quote_identifier(serverName)); + AppendOptionListToString(&buffer, foreignTable->options); + } } - - /* close create table's outer parentheses */ - appendStringInfoString(&buffer, ")"); - - /* - * If the relation is a foreign table, append the server name and options to - * the create table statement. - */ - if (relationKind == RELKIND_FOREIGN_TABLE) + PG_CATCH(); { - ForeignTable *foreignTable = GetForeignTable(tableRelationId); - ForeignServer *foreignServer = GetForeignServer(foreignTable->serverid); + /* close the connection */ + relation_close(relation, AccessShareLock); + PopOverrideSearchPath(); - char *serverName = foreignServer->servername; - appendStringInfo(&buffer, " SERVER %s", quote_identifier(serverName)); - AppendOptionListToString(&buffer, foreignTable->options); + PG_RE_THROW(); } + PG_END_TRY(); + /* close the connection */ relation_close(relation, AccessShareLock); + PopOverrideSearchPath(); return (buffer.data); } diff --git a/src/backend/distributed/utils/ruleutils_94.c b/src/backend/distributed/utils/ruleutils_94.c index 7dc0edcb1..9fc25421d 100644 --- a/src/backend/distributed/utils/ruleutils_94.c +++ b/src/backend/distributed/utils/ruleutils_94.c @@ -1731,6 +1731,8 @@ get_query_def_extended(Query *query, StringInfo buf, List *parentnamespace, deparse_context context; deparse_namespace dpns; + OverrideSearchPath *overridePath = NULL; + /* Guard against excessively long or deeply-nested queries */ CHECK_FOR_INTERRUPTS(); check_stack_depth(); @@ -1746,51 +1748,73 @@ get_query_def_extended(Query *query, StringInfo buf, List *parentnamespace, */ AcquireRewriteLocks(query, false, false); - context.buf = buf; - context.namespaces = lcons(&dpns, list_copy(parentnamespace)); - context.windowClause = NIL; - context.windowTList = NIL; - context.varprefix = (parentnamespace != NIL || - list_length(query->rtable) != 1); - context.prettyFlags = prettyFlags; - context.wrapColumn = wrapColumn; - context.indentLevel = startIndent; - context.distrelid = distrelid; - context.shardid = shardid; + /* + * Set search_path to NIL so that all objects outside of pg_catalog will be + * schema-prefixed. pg_catalog will be added automatically when we call + * PushOverrideSearchPath(), since we set addCatalog to true; + */ + overridePath = GetOverrideSearchPath(CurrentMemoryContext); + overridePath->schemas = NIL; + overridePath->addCatalog = true; + PushOverrideSearchPath(overridePath); - set_deparse_for_query(&dpns, query, parentnamespace); - - switch (query->commandType) + PG_TRY(); { - case CMD_SELECT: - get_select_query_def(query, &context, resultDesc); - break; + context.buf = buf; + context.namespaces = lcons(&dpns, list_copy(parentnamespace)); + context.windowClause = NIL; + context.windowTList = NIL; + context.varprefix = (parentnamespace != NIL || + list_length(query->rtable) != 1); + context.prettyFlags = prettyFlags; + context.wrapColumn = wrapColumn; + context.indentLevel = startIndent; + context.distrelid = distrelid; + context.shardid = shardid; - case CMD_UPDATE: - get_update_query_def(query, &context); - break; + set_deparse_for_query(&dpns, query, parentnamespace); - case CMD_INSERT: - get_insert_query_def(query, &context); - break; + switch (query->commandType) + { + case CMD_SELECT: + get_select_query_def(query, &context, resultDesc); + break; - case CMD_DELETE: - get_delete_query_def(query, &context); - break; + case CMD_UPDATE: + get_update_query_def(query, &context); + break; - case CMD_NOTHING: - appendStringInfoString(buf, "NOTHING"); - break; + case CMD_INSERT: + get_insert_query_def(query, &context); + break; - case CMD_UTILITY: - get_utility_query_def(query, &context); - break; + case CMD_DELETE: + get_delete_query_def(query, &context); + break; - default: - elog(ERROR, "unrecognized query command type: %d", - query->commandType); - break; + case CMD_NOTHING: + appendStringInfoString(buf, "NOTHING"); + break; + + case CMD_UTILITY: + get_utility_query_def(query, &context); + break; + + default: + elog(ERROR, "unrecognized query command type: %d", + query->commandType); + break; + } } + PG_CATCH(); + { + /* close the connection */ + PopOverrideSearchPath(); + + PG_RE_THROW(); + } + PG_END_TRY(); + PopOverrideSearchPath(); } /* ---------- @@ -6395,14 +6419,17 @@ generate_relation_or_shard_name(Oid relid, Oid distrelid, int64 shardid, if (relid == distrelid) { - /* XXX: this is where we would--but don't yet--handle schema-prefixing */ relname = get_relation_name(relid); if (shardid > 0) { + Oid schemaOid = get_rel_namespace(relid); + char *schemaName = get_namespace_name(schemaOid); + AppendShardIdToName(&relname, shardid); - relname = (char *) quote_identifier(relname); + relname = quote_qualified_identifier(schemaName, relname); + } } else diff --git a/src/backend/distributed/utils/ruleutils_95.c b/src/backend/distributed/utils/ruleutils_95.c index ee68f1e3a..ea0522f14 100644 --- a/src/backend/distributed/utils/ruleutils_95.c +++ b/src/backend/distributed/utils/ruleutils_95.c @@ -1838,6 +1838,8 @@ get_query_def_extended(Query *query, StringInfo buf, List *parentnamespace, deparse_context context; deparse_namespace dpns; + OverrideSearchPath *overridePath = NULL; + /* Guard against excessively long or deeply-nested queries */ CHECK_FOR_INTERRUPTS(); check_stack_depth(); @@ -1853,52 +1855,75 @@ get_query_def_extended(Query *query, StringInfo buf, List *parentnamespace, */ AcquireRewriteLocks(query, false, false); - context.buf = buf; - context.namespaces = lcons(&dpns, list_copy(parentnamespace)); - context.windowClause = NIL; - context.windowTList = NIL; - context.varprefix = (parentnamespace != NIL || - list_length(query->rtable) != 1); - context.prettyFlags = prettyFlags; - context.wrapColumn = wrapColumn; - context.indentLevel = startIndent; - context.special_exprkind = EXPR_KIND_NONE; - context.distrelid = distrelid; - context.shardid = shardid; + /* + * Set search_path to NIL so that all objects outside of pg_catalog will be + * schema-prefixed. pg_catalog will be added automatically when we call + * PushOverrideSearchPath(), since we set addCatalog to true; + */ + overridePath = GetOverrideSearchPath(CurrentMemoryContext); + overridePath->schemas = NIL; + overridePath->addCatalog = true; + PushOverrideSearchPath(overridePath); - set_deparse_for_query(&dpns, query, parentnamespace); - - switch (query->commandType) + PG_TRY(); { - case CMD_SELECT: - get_select_query_def(query, &context, resultDesc); - break; + context.buf = buf; + context.namespaces = lcons(&dpns, list_copy(parentnamespace)); + context.windowClause = NIL; + context.windowTList = NIL; + context.varprefix = (parentnamespace != NIL || + list_length(query->rtable) != 1); + context.prettyFlags = prettyFlags; + context.wrapColumn = wrapColumn; + context.indentLevel = startIndent; + context.special_exprkind = EXPR_KIND_NONE; + context.distrelid = distrelid; + context.shardid = shardid; - case CMD_UPDATE: - get_update_query_def(query, &context); - break; + set_deparse_for_query(&dpns, query, parentnamespace); - case CMD_INSERT: - get_insert_query_def(query, &context); - break; + switch (query->commandType) + { + case CMD_SELECT: + get_select_query_def(query, &context, resultDesc); + break; - case CMD_DELETE: - get_delete_query_def(query, &context); - break; + case CMD_UPDATE: + get_update_query_def(query, &context); + break; - case CMD_NOTHING: - appendStringInfoString(buf, "NOTHING"); - break; + case CMD_INSERT: + get_insert_query_def(query, &context); + break; - case CMD_UTILITY: - get_utility_query_def(query, &context); - break; + case CMD_DELETE: + get_delete_query_def(query, &context); + break; - default: - elog(ERROR, "unrecognized query command type: %d", - query->commandType); - break; + case CMD_NOTHING: + appendStringInfoString(buf, "NOTHING"); + break; + + case CMD_UTILITY: + get_utility_query_def(query, &context); + break; + + default: + elog(ERROR, "unrecognized query command type: %d", + query->commandType); + break; + } } + PG_CATCH(); + { + /* close the connection */ + PopOverrideSearchPath(); + + PG_RE_THROW(); + } + PG_END_TRY(); + + PopOverrideSearchPath(); } /* ---------- @@ -6975,14 +7000,16 @@ generate_relation_or_shard_name(Oid relid, Oid distrelid, int64 shardid, if (relid == distrelid) { - /* XXX: this is where we would--but don't yet--handle schema-prefixing */ relname = get_relation_name(relid); if (shardid > 0) { + Oid schemaOid = get_rel_namespace(relid); + char *schemaName = get_namespace_name(schemaOid); + AppendShardIdToName(&relname, shardid); - relname = (char *) quote_identifier(relname); + relname = quote_qualified_identifier(schemaName, relname); } } else diff --git a/src/test/regress/expected/multi_generate_ddl_commands.out b/src/test/regress/expected/multi_generate_ddl_commands.out index bb929e533..3fcfe0e04 100644 --- a/src/test/regress/expected/multi_generate_ddl_commands.out +++ b/src/test/regress/expected/multi_generate_ddl_commands.out @@ -17,9 +17,9 @@ CREATE TABLE simple_table ( id bigint ); SELECT table_ddl_command_array('simple_table'); - table_ddl_command_array ----------------------------------------------------------------------------- - {"CREATE TABLE simple_table (first_name text, last_name text, id bigint)"} + table_ddl_command_array +----------------------------------------------------------------------------------- + {"CREATE TABLE public.simple_table (first_name text, last_name text, id bigint)"} (1 row) -- ensure not-null constraints are propagated @@ -28,9 +28,9 @@ CREATE TABLE not_null_table ( id bigint not null ); SELECT table_ddl_command_array('not_null_table'); - table_ddl_command_array ------------------------------------------------------------------ - {"CREATE TABLE not_null_table (city text, id bigint NOT NULL)"} + table_ddl_command_array +------------------------------------------------------------------------ + {"CREATE TABLE public.not_null_table (city text, id bigint NOT NULL)"} (1 row) -- ensure tables not in search path are schema-prefixed @@ -50,9 +50,9 @@ CREATE TABLE column_constraint_table ( age int CONSTRAINT non_negative_age CHECK (age >= 0) ); SELECT table_ddl_command_array('column_constraint_table'); - table_ddl_command_array ---------------------------------------------------------------------------------------------------------------------------------------- - {"CREATE TABLE column_constraint_table (first_name text, last_name text, age integer, CONSTRAINT non_negative_age CHECK (age >= 0))"} + table_ddl_command_array +---------------------------------------------------------------------------------------------------------------------------------------------- + {"CREATE TABLE public.column_constraint_table (first_name text, last_name text, age integer, CONSTRAINT non_negative_age CHECK (age >= 0))"} (1 row) -- including table constraints @@ -63,9 +63,9 @@ CREATE TABLE table_constraint_table ( CONSTRAINT bids_ordered CHECK (min_bid > max_bid) ); SELECT table_ddl_command_array('table_constraint_table'); - table_ddl_command_array ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {"CREATE TABLE table_constraint_table (bid_item_id bigint, min_bid numeric NOT NULL, max_bid numeric NOT NULL, CONSTRAINT bids_ordered CHECK (min_bid > max_bid))"} + table_ddl_command_array +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"CREATE TABLE public.table_constraint_table (bid_item_id bigint, min_bid numeric NOT NULL, max_bid numeric NOT NULL, CONSTRAINT bids_ordered CHECK (min_bid > max_bid))"} (1 row) -- default values are supported @@ -74,9 +74,9 @@ CREATE TABLE default_value_table ( price decimal default 0.00 ); SELECT table_ddl_command_array('default_value_table'); - table_ddl_command_array ------------------------------------------------------------------------------- - {"CREATE TABLE default_value_table (name text, price numeric DEFAULT 0.00)"} + table_ddl_command_array +------------------------------------------------------------------------------------- + {"CREATE TABLE public.default_value_table (name text, price numeric DEFAULT 0.00)"} (1 row) -- of course primary keys work... @@ -86,9 +86,9 @@ CREATE TABLE pkey_table ( id bigint PRIMARY KEY ); SELECT table_ddl_command_array('pkey_table'); - table_ddl_command_array -------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {"CREATE TABLE pkey_table (first_name text, last_name text, id bigint NOT NULL)","ALTER TABLE public.pkey_table ADD CONSTRAINT pkey_table_pkey PRIMARY KEY (id)"} + table_ddl_command_array +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"CREATE TABLE public.pkey_table (first_name text, last_name text, id bigint NOT NULL)","ALTER TABLE public.pkey_table ADD CONSTRAINT pkey_table_pkey PRIMARY KEY (id)"} (1 row) -- as do unique indexes... @@ -97,9 +97,9 @@ CREATE TABLE unique_table ( username text UNIQUE not null ); SELECT table_ddl_command_array('unique_table'); - table_ddl_command_array ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {"CREATE TABLE unique_table (user_id bigint NOT NULL, username text NOT NULL)","ALTER TABLE public.unique_table ADD CONSTRAINT unique_table_username_key UNIQUE (username)"} + table_ddl_command_array +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"CREATE TABLE public.unique_table (user_id bigint NOT NULL, username text NOT NULL)","ALTER TABLE public.unique_table ADD CONSTRAINT unique_table_username_key UNIQUE (username)"} (1 row) -- and indexes used for clustering @@ -110,9 +110,9 @@ CREATE TABLE clustered_table ( CREATE INDEX clustered_time_idx ON clustered_table (received_at); CLUSTER clustered_table USING clustered_time_idx; SELECT table_ddl_command_array('clustered_table'); - table_ddl_command_array ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {"CREATE TABLE clustered_table (data json NOT NULL, received_at timestamp without time zone NOT NULL)","CREATE INDEX clustered_time_idx ON clustered_table USING btree (received_at)","ALTER TABLE clustered_table CLUSTER ON clustered_time_idx"} + table_ddl_command_array +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"CREATE TABLE public.clustered_table (data json NOT NULL, received_at timestamp without time zone NOT NULL)","CREATE INDEX clustered_time_idx ON clustered_table USING btree (received_at)","ALTER TABLE clustered_table CLUSTER ON clustered_time_idx"} (1 row) -- fiddly things like storage type and statistics also work @@ -129,9 +129,9 @@ ALTER TABLE fiddly_table ALTER traceroute SET STORAGE EXTERNAL, ALTER ip_addr SET STATISTICS 500; SELECT table_ddl_command_array('fiddly_table'); - table_ddl_command_array -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {"CREATE TABLE fiddly_table (hostname character(255) NOT NULL, os character(255) NOT NULL, ip_addr inet NOT NULL, traceroute text NOT NULL)","ALTER TABLE ONLY fiddly_table ALTER COLUMN hostname SET STORAGE PLAIN, ALTER COLUMN os SET STORAGE MAIN, ALTER COLUMN ip_addr SET STORAGE EXTENDED, ALTER COLUMN ip_addr SET STATISTICS 500, ALTER COLUMN traceroute SET STORAGE EXTERNAL"} + table_ddl_command_array +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"CREATE TABLE public.fiddly_table (hostname character(255) NOT NULL, os character(255) NOT NULL, ip_addr inet NOT NULL, traceroute text NOT NULL)","ALTER TABLE ONLY fiddly_table ALTER COLUMN hostname SET STORAGE PLAIN, ALTER COLUMN os SET STORAGE MAIN, ALTER COLUMN ip_addr SET STORAGE EXTENDED, ALTER COLUMN ip_addr SET STATISTICS 500, ALTER COLUMN traceroute SET STORAGE EXTERNAL"} (1 row) -- test foreign tables using fake FDW @@ -141,15 +141,15 @@ CREATE FOREIGN TABLE foreign_table ( ) SERVER fake_fdw_server OPTIONS (encoding 'utf-8', compression 'true'); SELECT table_ddl_command_array('foreign_table'); NOTICE: foreign-data wrapper "fake_fdw" does not have an extension defined - table_ddl_command_array -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {"CREATE SERVER fake_fdw_server FOREIGN DATA WRAPPER fake_fdw","CREATE FOREIGN TABLE foreign_table (id bigint NOT NULL, full_name text DEFAULT ''::text NOT NULL) SERVER fake_fdw_server OPTIONS (encoding 'utf-8', compression 'true')"} + table_ddl_command_array +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"CREATE SERVER fake_fdw_server FOREIGN DATA WRAPPER fake_fdw","CREATE FOREIGN TABLE public.foreign_table (id bigint NOT NULL, full_name text DEFAULT ''::text NOT NULL) SERVER fake_fdw_server OPTIONS (encoding 'utf-8', compression 'true')"} (1 row) -- propagating views is not supported CREATE VIEW local_view AS SELECT * FROM simple_table; SELECT table_ddl_command_array('local_view'); -ERROR: local_view is not a regular or foreign table +ERROR: public.local_view is not a regular or foreign table -- clean up DROP VIEW IF EXISTS local_view; DROP FOREIGN TABLE IF EXISTS foreign_table; diff --git a/src/test/regress/expected/multi_master_protocol.out b/src/test/regress/expected/multi_master_protocol.out index b000b15af..6d1b5102c 100644 --- a/src/test/regress/expected/multi_master_protocol.out +++ b/src/test/regress/expected/multi_master_protocol.out @@ -12,9 +12,9 @@ SELECT part_storage_type, part_key, part_replica_count, part_max_size, (1 row) SELECT * FROM master_get_table_ddl_events('lineitem'); - master_get_table_ddl_events ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - CREATE TABLE lineitem (l_orderkey bigint NOT NULL, l_partkey integer NOT NULL, l_suppkey integer NOT NULL, l_linenumber integer NOT NULL, l_quantity numeric(15,2) NOT NULL, l_extendedprice numeric(15,2) NOT NULL, l_discount numeric(15,2) NOT NULL, l_tax numeric(15,2) NOT NULL, l_returnflag character(1) NOT NULL, l_linestatus character(1) NOT NULL, l_shipdate date NOT NULL, l_commitdate date NOT NULL, l_receiptdate date NOT NULL, l_shipinstruct character(25) NOT NULL, l_shipmode character(10) NOT NULL, l_comment character varying(44) NOT NULL) + master_get_table_ddl_events +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + CREATE TABLE public.lineitem (l_orderkey bigint NOT NULL, l_partkey integer NOT NULL, l_suppkey integer NOT NULL, l_linenumber integer NOT NULL, l_quantity numeric(15,2) NOT NULL, l_extendedprice numeric(15,2) NOT NULL, l_discount numeric(15,2) NOT NULL, l_tax numeric(15,2) NOT NULL, l_returnflag character(1) NOT NULL, l_linestatus character(1) NOT NULL, l_shipdate date NOT NULL, l_commitdate date NOT NULL, l_receiptdate date NOT NULL, l_shipinstruct character(25) NOT NULL, l_shipmode character(10) NOT NULL, l_comment character varying(44) NOT NULL) CREATE INDEX lineitem_time_index ON lineitem USING btree (l_shipdate) ALTER TABLE public.lineitem ADD CONSTRAINT lineitem_pkey PRIMARY KEY (l_orderkey, l_linenumber) (3 rows) diff --git a/src/test/regress/expected/multi_modifications.out b/src/test/regress/expected/multi_modifications.out index 33d64ae68..3daee50ad 100644 --- a/src/test/regress/expected/multi_modifications.out +++ b/src/test/regress/expected/multi_modifications.out @@ -280,7 +280,7 @@ ALTER TABLE limit_orders_750000 RENAME TO renamed_orders; \c - - - :master_port -- Fourth: Perform an INSERT on the remaining node INSERT INTO limit_orders VALUES (276, 'ADR', 140, '2007-07-02 16:32:15', 'sell', 43.67); -WARNING: relation "limit_orders_750000" does not exist +WARNING: relation "public.limit_orders_750000" does not exist CONTEXT: while executing command on localhost:57638 -- Last: Verify the insert worked but the deleted placement is now unhealthy SELECT count(*) FROM limit_orders WHERE id = 276; @@ -311,7 +311,7 @@ ALTER TABLE limit_orders_750000 RENAME TO renamed_orders; \c - - - :master_port -- Fourth: Perform an INSERT on the remaining node INSERT INTO limit_orders VALUES (276, 'ADR', 140, '2007-07-02 16:32:15', 'sell', 43.67); -WARNING: relation "limit_orders_750000" does not exist +WARNING: relation "public.limit_orders_750000" does not exist CONTEXT: while executing command on localhost:57637 ERROR: could not modify any active placements -- Last: Verify worker is still healthy diff --git a/src/test/regress/pg_regress_multi.pl b/src/test/regress/pg_regress_multi.pl index 34c833c6e..11166b74d 100644 --- a/src/test/regress/pg_regress_multi.pl +++ b/src/test/regress/pg_regress_multi.pl @@ -45,6 +45,7 @@ my %dataTypes = (); my %fdws = (); my %fdwServers = (); my %functions = (); +my %operators = (); GetOptions( 'bindir=s' => \$bindir, @@ -112,7 +113,11 @@ for my $option (@userPgOptions) 'bug_status', ' ENUM (\'new\', \'open\', \'closed\')'); # define functions as signature->definition -%functions = ('fake_fdw_handler()', 'fdw_handler AS \'citus\' LANGUAGE C STRICT;'); +%functions = ('fake_fdw_handler()', 'fdw_handler AS \'citus\' LANGUAGE C STRICT;', + 'equal_test_composite_type_function(test_composite_type, test_composite_type)', 'boolean AS \'select $1.i = $2.i AND $1.i2 = $2.i2;\' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT;'); + + +%operators = ('=', '(LEFTARG = test_composite_type, RIGHTARG = test_composite_type, PROCEDURE = equal_test_composite_type_function, HASHES)'); #define fdws as name->handler name %fdws = ('fake_fdw', 'fake_fdw_handler'); @@ -257,6 +262,14 @@ for my $port (@workerPorts) or die "Could not create FUNCTION $function on worker"; } + foreach my $operator (keys %operators) + { + system("$bindir/psql", + ('-h', $host, '-p', $port, '-U', $user, "regression", + '-c', "CREATE OPERATOR $operator $operators{$operator};")) == 0 + or die "Could not create OPERATOR $operator on worker"; + } + foreach my $fdw (keys %fdws) { system("$bindir/psql",