diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c index bdc4c3620d..7a798530e3 100644 --- a/contrib/postgres_fdw/deparse.c +++ b/contrib/postgres_fdw/deparse.c @@ -2179,24 +2179,19 @@ deparseAnalyzeSql(StringInfo buf, Relation rel, List **retrieved_attrs) void deparseTruncateSql(StringInfo buf, List *rels, - List *rels_extra, DropBehavior behavior, bool restart_seqs) { - ListCell *lc1, - *lc2; + ListCell *cell; appendStringInfoString(buf, "TRUNCATE "); - forboth(lc1, rels, lc2, rels_extra) + foreach(cell, rels) { - Relation rel = lfirst(lc1); - int extra = lfirst_int(lc2); + Relation rel = lfirst(cell); - if (lc1 != list_head(rels)) + if (cell != list_head(rels)) appendStringInfoString(buf, ", "); - if (extra & TRUNCATE_REL_CONTEXT_ONLY) - appendStringInfoString(buf, "ONLY "); deparseRelation(buf, rel); } diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 5070d93239..d32f291089 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -8218,13 +8218,13 @@ drop table loc3; -- test for TRUNCATE -- =================================================================== CREATE TABLE tru_rtable0 (id int primary key); -CREATE TABLE tru_rtable1 (id int primary key); CREATE FOREIGN TABLE tru_ftable (id int) SERVER loopback OPTIONS (table_name 'tru_rtable0'); INSERT INTO tru_rtable0 (SELECT x FROM generate_series(1,10) x); CREATE TABLE tru_ptable (id int) PARTITION BY HASH(id); CREATE TABLE tru_ptable__p0 PARTITION OF tru_ptable FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE tru_rtable1 (id int primary key); CREATE FOREIGN TABLE tru_ftable__p1 PARTITION OF tru_ptable FOR VALUES WITH (MODULUS 2, REMAINDER 1) SERVER loopback OPTIONS (table_name 'tru_rtable1'); @@ -8388,22 +8388,23 @@ SELECT sum(id) FROM tru_ftable; -- 95 95 (1 row) -TRUNCATE ONLY tru_ftable; -- truncate only parent portion -SELECT sum(id) FROM tru_ftable; -- 60 - sum ------ - 60 +TRUNCATE ONLY tru_ftable; -- truncate both of parent and child +SELECT count(*) FROM tru_ftable; -- 0 + count +------- + 0 (1 row) INSERT INTO tru_rtable0 (SELECT x FROM generate_series(21,25) x); -SELECT sum(id) FROM tru_ftable; -- 175 +INSERT INTO tru_rtable0_child (SELECT x FROM generate_series(26,30) x); +SELECT sum(id) FROM tru_ftable; -- 255 sum ----- - 175 + 255 (1 row) TRUNCATE tru_ftable; -- truncate both of parent and child -SELECT count(*) FROM tru_ftable; -- empty +SELECT count(*) FROM tru_ftable; -- 0 count ------- 0 diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index c590f374c6..c521cba3fc 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -401,7 +401,6 @@ static void postgresExplainForeignModify(ModifyTableState *mtstate, static void postgresExplainDirectModify(ForeignScanState *node, ExplainState *es); static void postgresExecForeignTruncate(List *rels, - List *rels_extra, DropBehavior behavior, bool restart_seqs); static bool postgresAnalyzeForeignTable(Relation relation, @@ -2881,7 +2880,6 @@ postgresExplainDirectModify(ForeignScanState *node, ExplainState *es) */ static void postgresExecForeignTruncate(List *rels, - List *rels_extra, DropBehavior behavior, bool restart_seqs) { @@ -2964,7 +2962,7 @@ postgresExecForeignTruncate(List *rels, /* Construct the TRUNCATE command string */ initStringInfo(&sql); - deparseTruncateSql(&sql, rels, rels_extra, behavior, restart_seqs); + deparseTruncateSql(&sql, rels, behavior, restart_seqs); /* Issue the TRUNCATE command to remote server */ do_sql_command(conn, sql.data); diff --git a/contrib/postgres_fdw/postgres_fdw.h b/contrib/postgres_fdw/postgres_fdw.h index 5d44b75314..9591c0f6c2 100644 --- a/contrib/postgres_fdw/postgres_fdw.h +++ b/contrib/postgres_fdw/postgres_fdw.h @@ -209,7 +209,6 @@ extern void deparseAnalyzeSql(StringInfo buf, Relation rel, List **retrieved_attrs); extern void deparseTruncateSql(StringInfo buf, List *rels, - List *rels_extra, DropBehavior behavior, bool restart_seqs); extern void deparseStringLiteral(StringInfo buf, const char *val); diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index 74590089bd..65643e120d 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -2355,7 +2355,6 @@ drop table loc3; -- test for TRUNCATE -- =================================================================== CREATE TABLE tru_rtable0 (id int primary key); -CREATE TABLE tru_rtable1 (id int primary key); CREATE FOREIGN TABLE tru_ftable (id int) SERVER loopback OPTIONS (table_name 'tru_rtable0'); INSERT INTO tru_rtable0 (SELECT x FROM generate_series(1,10) x); @@ -2363,6 +2362,7 @@ INSERT INTO tru_rtable0 (SELECT x FROM generate_series(1,10) x); CREATE TABLE tru_ptable (id int) PARTITION BY HASH(id); CREATE TABLE tru_ptable__p0 PARTITION OF tru_ptable FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE tru_rtable1 (id int primary key); CREATE FOREIGN TABLE tru_ftable__p1 PARTITION OF tru_ptable FOR VALUES WITH (MODULUS 2, REMAINDER 1) SERVER loopback OPTIONS (table_name 'tru_rtable1'); @@ -2439,13 +2439,14 @@ INSERT INTO tru_rtable0 (SELECT x FROM generate_series(5,9) x); INSERT INTO tru_rtable0_child (SELECT x FROM generate_series(10,14) x); SELECT sum(id) FROM tru_ftable; -- 95 -TRUNCATE ONLY tru_ftable; -- truncate only parent portion -SELECT sum(id) FROM tru_ftable; -- 60 +TRUNCATE ONLY tru_ftable; -- truncate both of parent and child +SELECT count(*) FROM tru_ftable; -- 0 INSERT INTO tru_rtable0 (SELECT x FROM generate_series(21,25) x); -SELECT sum(id) FROM tru_ftable; -- 175 +INSERT INTO tru_rtable0_child (SELECT x FROM generate_series(26,30) x); +SELECT sum(id) FROM tru_ftable; -- 255 TRUNCATE tru_ftable; -- truncate both of parent and child -SELECT count(*) FROM tru_ftable; -- empty +SELECT count(*) FROM tru_ftable; -- 0 -- cleanup DROP FOREIGN TABLE tru_ftable_parent, tru_ftable_child, tru_pk_ftable,tru_ftable__p1,tru_ftable; diff --git a/doc/src/sgml/fdwhandler.sgml b/doc/src/sgml/fdwhandler.sgml index 98882ddab8..3fe373ef00 100644 --- a/doc/src/sgml/fdwhandler.sgml +++ b/doc/src/sgml/fdwhandler.sgml @@ -1071,28 +1071,16 @@ EndDirectModify(ForeignScanState *node); void -ExecForeignTruncate(List *rels, List *rels_extra, - DropBehavior behavior, bool restart_seqs); +ExecForeignTruncate(List *rels, + DropBehavior behavior, + bool restart_seqs); Truncate a set of foreign tables specified in rels. This function is called when is executed on foreign tables. rels is the list of Relation data structure that indicates - a foreign table to truncate. rels_extra the list of - int value, which delivers extra information about - a foreign table to truncate. Possible values are - TRUNCATE_REL_CONTEXT_NORMAL, which means that - the foreign table is specified WITHOUT ONLY clause - in TRUNCATE, - TRUNCATE_REL_CONTEXT_ONLY, which means that - the foreign table is specified WITH ONLY clause, - and TRUNCATE_REL_CONTEXT_CASCADING, - which means that the foreign table is not specified explicitly, - but will be truncated due to dependency (for example, partition table). - There is one-to-one mapping between rels and - rels_extra. The number of entries is the same - between the two lists. + a foreign table to truncate. diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 096a6f2891..6e320f96ad 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -323,7 +323,6 @@ typedef struct ForeignTruncateInfo { Oid serverid; List *rels; - List *rels_extra; } ForeignTruncateInfo; /* @@ -1620,7 +1619,6 @@ ExecuteTruncate(TruncateStmt *stmt) { List *rels = NIL; List *relids = NIL; - List *relids_extra = NIL; List *relids_logged = NIL; ListCell *cell; @@ -1654,9 +1652,7 @@ ExecuteTruncate(TruncateStmt *stmt) rels = lappend(rels, rel); relids = lappend_oid(relids, myrelid); - relids_extra = lappend_int(relids_extra, (recurse ? - TRUNCATE_REL_CONTEXT_NORMAL : - TRUNCATE_REL_CONTEXT_ONLY)); + /* Log this relation only if needed for logical decoding */ if (RelationIsLogicallyLogged(rel)) relids_logged = lappend_oid(relids_logged, myrelid); @@ -1704,8 +1700,7 @@ ExecuteTruncate(TruncateStmt *stmt) rels = lappend(rels, rel); relids = lappend_oid(relids, childrelid); - relids_extra = lappend_int(relids_extra, - TRUNCATE_REL_CONTEXT_CASCADING); + /* Log this relation only if needed for logical decoding */ if (RelationIsLogicallyLogged(rel)) relids_logged = lappend_oid(relids_logged, childrelid); @@ -1718,7 +1713,7 @@ ExecuteTruncate(TruncateStmt *stmt) errhint("Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly."))); } - ExecuteTruncateGuts(rels, relids, relids_extra, relids_logged, + ExecuteTruncateGuts(rels, relids, relids_logged, stmt->behavior, stmt->restart_seqs); /* And close the rels */ @@ -1739,15 +1734,13 @@ ExecuteTruncate(TruncateStmt *stmt) * * explicit_rels is the list of Relations to truncate that the command * specified. relids is the list of Oids corresponding to explicit_rels. - * relids_extra is the list of integer values that deliver extra information - * about relations in explicit_rels. relids_logged is the list of Oids - * (a subset of relids) that require WAL-logging. This is all a bit redundant, - * but the existing callers have this information handy in this form. + * relids_logged is the list of Oids (a subset of relids) that require + * WAL-logging. This is all a bit redundant, but the existing callers have + * this information handy in this form. */ void ExecuteTruncateGuts(List *explicit_rels, List *relids, - List *relids_extra, List *relids_logged, DropBehavior behavior, bool restart_seqs) { @@ -1760,8 +1753,6 @@ ExecuteTruncateGuts(List *explicit_rels, ResultRelInfo *resultRelInfo; SubTransactionId mySubid; ListCell *cell; - ListCell *lc1, - *lc2; Oid *logrelids; /* @@ -1799,8 +1790,7 @@ ExecuteTruncateGuts(List *explicit_rels, truncate_check_activity(rel); rels = lappend(rels, rel); relids = lappend_oid(relids, relid); - relids_extra = lappend_int(relids_extra, - TRUNCATE_REL_CONTEXT_CASCADING); + /* Log this relation only if needed for logical decoding */ if (RelationIsLogicallyLogged(rel)) relids_logged = lappend_oid(relids_logged, relid); @@ -1901,11 +1891,9 @@ ExecuteTruncateGuts(List *explicit_rels, */ mySubid = GetCurrentSubTransactionId(); - Assert(list_length(rels) == list_length(relids_extra)); - forboth(lc1, rels, lc2, relids_extra) + foreach(cell, rels) { - Relation rel = (Relation) lfirst(lc1); - int extra = lfirst_int(lc2); + Relation rel = (Relation) lfirst(cell); /* * Save OID of partitioned tables for later; nothing else to do for @@ -1952,7 +1940,6 @@ ExecuteTruncateGuts(List *explicit_rels, { ft_info->serverid = serverid; ft_info->rels = NIL; - ft_info->rels_extra = NIL; } /* @@ -1960,7 +1947,6 @@ ExecuteTruncateGuts(List *explicit_rels, * foreign table belongs to. */ ft_info->rels = lappend(ft_info->rels, rel); - ft_info->rels_extra = lappend_int(ft_info->rels_extra, extra); continue; } @@ -2044,7 +2030,6 @@ ExecuteTruncateGuts(List *explicit_rels, Assert(routine->ExecForeignTruncate != NULL); routine->ExecForeignTruncate(ft_info->rels, - ft_info->rels_extra, behavior, restart_seqs); } diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index fb3ba5c415..4dd869aaba 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -1795,7 +1795,6 @@ apply_handle_truncate(StringInfo s) List *rels = NIL; List *part_rels = NIL; List *relids = NIL; - List *relids_extra = NIL; List *relids_logged = NIL; ListCell *lc; @@ -1825,7 +1824,6 @@ apply_handle_truncate(StringInfo s) remote_rels = lappend(remote_rels, rel); rels = lappend(rels, rel->localrel); relids = lappend_oid(relids, rel->localreloid); - relids_extra = lappend_int(relids_extra, TRUNCATE_REL_CONTEXT_NORMAL); if (RelationIsLogicallyLogged(rel->localrel)) relids_logged = lappend_oid(relids_logged, rel->localreloid); @@ -1864,7 +1862,6 @@ apply_handle_truncate(StringInfo s) rels = lappend(rels, childrel); part_rels = lappend(part_rels, childrel); relids = lappend_oid(relids, childrelid); - relids_extra = lappend_int(relids_extra, TRUNCATE_REL_CONTEXT_CASCADING); /* Log this relation only if needed for logical decoding */ if (RelationIsLogicallyLogged(childrel)) relids_logged = lappend_oid(relids_logged, childrelid); @@ -1879,7 +1876,6 @@ apply_handle_truncate(StringInfo s) */ ExecuteTruncateGuts(rels, relids, - relids_extra, relids_logged, DROP_RESTRICT, restart_seqs); diff --git a/src/include/commands/tablecmds.h b/src/include/commands/tablecmds.h index b808a07e46..14f4b4882f 100644 --- a/src/include/commands/tablecmds.h +++ b/src/include/commands/tablecmds.h @@ -21,16 +21,6 @@ #include "storage/lock.h" #include "utils/relcache.h" -/* - * These values indicate how a relation was specified as the target to - * truncate in TRUNCATE command. - */ -#define TRUNCATE_REL_CONTEXT_NORMAL 1 /* specified without ONLY clause */ -#define TRUNCATE_REL_CONTEXT_ONLY 2 /* specified with ONLY clause */ -#define TRUNCATE_REL_CONTEXT_CASCADING 3 /* not specified but truncated - * due to dependency (e.g., - * partition table) */ - struct AlterTableUtilityContext; /* avoid including tcop/utility.h here */ @@ -68,7 +58,6 @@ extern void CheckTableNotInUse(Relation rel, const char *stmt); extern void ExecuteTruncate(TruncateStmt *stmt); extern void ExecuteTruncateGuts(List *explicit_rels, List *relids, - List *relids_extra, List *relids_logged, DropBehavior behavior, bool restart_seqs); diff --git a/src/include/foreign/fdwapi.h b/src/include/foreign/fdwapi.h index 4ebbca6de9..4f17becbb8 100644 --- a/src/include/foreign/fdwapi.h +++ b/src/include/foreign/fdwapi.h @@ -161,7 +161,6 @@ typedef List *(*ImportForeignSchema_function) (ImportForeignSchemaStmt *stmt, Oid serverOid); typedef void (*ExecForeignTruncate_function) (List *rels, - List *rels_extra, DropBehavior behavior, bool restart_seqs);