On 2021/04/22 20:27, Bharath Rupireddy wrote:
On Thu, Apr 22, 2021 at 12:06 PM Fujii Masao
<masao.fu...@oss.nttdata.com> wrote:
On 2021/04/22 9:39, Bharath Rupireddy wrote:
One comment on truncate_foreign_table_docs_v1.patch:
1) I think it is "to be truncated"
+     <literal>rels</literal> is a list of <structname>Relation</structname>
+     data structures for each foreign table to truncated.

Fixed. Thanks!

How about a slightly changed phrasing like below?
+     <literal>rels</literal> is a list of <structname>Relation</structname>
+     data structures of foreign tables to truncate.
Either works at least for me. If you think that this phrasing is
more precise or better, I'm ok with that and will update the patch again.

IMO, "rels is a list of Relation data structures of foreign tables to
truncate." looks better.

Fixed.

Thanks for reviewing the patches.
Attached are the updated versions of the patches.
These patches include the fixes pointed by Justin.



3) How about adding an extra para(after below para in
postgres_fdw.sgml) on WHY we don't push "ONLY" to foreign tables while
truncating? We could add to the same para for other options if at all
we don't choose to push them.
     <command>DELETE</command>, or <command>TRUNCATE</command>.
     (Of course, the remote user you have specified in your user mapping must
     have privileges to do these things.)

I agree to document the behavior that ONLY option is always ignored
for foreign tables. But I'm not sure if we can document WHY.
Because I could not find the past discussion about why ONLY option is
ignored on SELECT, etc... Maybe it's enough to document the behavior?

+1 to specify in the documentation about ONLY option is always
ignored.

Added.

But can we specify the WHY part within deparseTruncateSql, it
will be there for developer reference? I feel it's better if this
change goes with truncate_foreign_table_dont_pass_only_clause_v2.patch

I added this information into fdwhandler.sgml because the developers
usually read fdwhandler.sgml.

Thanks!

+    <para>
+     Note that information about <literal>ONLY</literal> options specified
+     in the original <command>TRUNCATE</command> command is not passed to

I think it is not "information about", no? We just don't pass ONLY
option  instead we skip it. IMO, we can say "Note that the ONLY option
specified with a foreign table in the original TRUNCATE command is
skipped and not passed to ExecForeignTruncate."

Probably I still fail to understand your point.
But if "information about" is confusing, I'm ok to
remove that. Fixed.



+     <function>ExecForeignTruncate</function>.  This is the same behavior as
+     for the callback functions for <command>SELECT</command>,
+     <command>UPDATE</command> and  <command>DELETE</command> on
+     a foreign table.

How about "This behaviour is similar to the callback functions of
SELECT, UPDATE, DELETE on a foreign table"?

Fixed.

Regards,

--
Fujii Masao
Advanced Computing Technology Center
Research and Development Headquarters
NTT DATA CORPORATION
diff --git a/doc/src/sgml/fdwhandler.sgml b/doc/src/sgml/fdwhandler.sgml
index 0e2cd3628c..70d89393d9 100644
--- a/doc/src/sgml/fdwhandler.sgml
+++ b/doc/src/sgml/fdwhandler.sgml
@@ -1076,44 +1076,41 @@ ExecForeignTruncate(List *rels,
                     bool restart_seqs);
 </programlisting>
 
-     Truncate a set of foreign tables specified in <literal>rels</literal>.
-     This function is called when <xref linkend="sql-truncate"/> is executed
-     on foreign tables.  <literal>rels</literal> is the list of
-     <structname>Relation</structname> data structure that indicates
-     a foreign table to truncate.
+     Truncate foreign tables.  This function is called when
+     <xref linkend="sql-truncate"/> is executed on a foreign table.
+     <literal>rels</literal> is a list of <structname>Relation</structname>
+     data structures of foreign tables to truncate.
     </para>
 
     <para>
-     <literal>behavior</literal> defines how foreign tables should
-     be truncated, using as possible values <literal>DROP_RESTRICT</literal>,
-     which means that <literal>RESTRICT</literal> option is specified,
-     and <literal>DROP_CASCADE</literal>, which means that
-     <literal>CASCADE</literal> option is specified, in
-     <command>TRUNCATE</command> command.
+     <literal>behavior</literal> is either <literal>DROP_RESTRICT</literal>
+     or <literal>DROP_CASCADE</literal> indicating that the
+     <literal>RESTRICT</literal> or <literal>CASCADE</literal> option was
+     requested in the original <command>TRUNCATE</command> command,
+     respectively.
     </para>
     
     <para>
-     <literal>restart_seqs</literal> is set to <literal>true</literal>
-     if <literal>RESTART IDENTITY</literal> option is specified in
-     <command>TRUNCATE</command> command.  It is <literal>false</literal>
-     if <literal>CONTINUE IDENTITY</literal> option is specified.
+     If <literal>restart_seqs</literal> is <literal>true</literal>,
+     the original <command>TRUNCATE</command> command requested the
+     <literal>RESTART IDENTITY</literal> behavior, otherwise the
+     <literal>CONTINUE IDENTITY</literal> behavior was requested.
     </para>
 
     <para>
-     Note that information about <literal>ONLY</literal> options specified
+     Note that the <literal>ONLY</literal> options specified
      in the original <command>TRUNCATE</command> command is not passed to
-     <function>ExecForeignTruncate</function>.  This is the same behavior as
-     for the callback functions for <command>SELECT</command>,
+     <function>ExecForeignTruncate</function>.  This behavior is similar to
+     the callback functions of <command>SELECT</command>,
      <command>UPDATE</command> and <command>DELETE</command> on
      a foreign table.
     </para>
 
     <para>
-     <command>TRUNCATE</command> invokes
-     <function>ExecForeignTruncate</function> once per foreign server
-     that foreign tables to truncate belong to.  This means that all foreign
-     tables included in <literal>rels</literal> must belong to the same
-     server.
+     <function>ExecForeignTruncate</function> is invoked once per
+     foreign server for which foreign tables are to be truncated.
+     This means that all foreign tables included in <literal>rels</literal>
+     must belong to the same server.
     </para>
 
     <para>
diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml
index b0806c1274..839126c4ef 100644
--- a/doc/src/sgml/postgres-fdw.sgml
+++ b/doc/src/sgml/postgres-fdw.sgml
@@ -459,11 +459,17 @@ OPTIONS (ADD password_required 'false');
      <listitem>
       <para>
        This option controls whether <filename>postgres_fdw</filename> allows
-       foreign tables to be truncated using <command>TRUNCATE</command>
+       foreign tables to be truncated using the <command>TRUNCATE</command>
        command. It can be specified for a foreign table or a foreign server.
        A table-level option overrides a server-level option.
        The default is <literal>true</literal>.
       </para>
+
+      <para>
+       Of course, if the remote table is not in fact truncatable, an error
+       would occur anyway.  Use of this option primarily allows the error to
+       be thrown locally without querying the remote server.
+      </para>
      </listitem>
     </varlistentry>
    </variablelist>
diff --git a/doc/src/sgml/ref/truncate.sgml b/doc/src/sgml/ref/truncate.sgml
index acf3633be4..9af42dd008 100644
--- a/doc/src/sgml/ref/truncate.sgml
+++ b/doc/src/sgml/ref/truncate.sgml
@@ -173,7 +173,7 @@ TRUNCATE [ TABLE ] [ ONLY ] <replaceable 
class="parameter">name</replaceable> [
 
   <para>
    <command>TRUNCATE</command> can be used for foreign tables if
-   the foreign data wrapper supports, for instance,
+   supported by the foreign data wrapper,
    see <xref linkend="postgres-fdw"/>.
   </para>
  </refsect1>
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..8e1cc69508 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');
@@ -8364,6 +8364,8 @@ SELECT count(*) from tru_pk_ftable; -- 0
 (1 row)
 
 -- truncate with ONLY clause
+-- Since ONLY is specified, the table tru_ftable_child that inherits
+-- tru_ftable_parent locally is not truncated.
 TRUNCATE ONLY tru_ftable_parent;
 SELECT sum(id) FROM tru_ftable_parent;  -- 126
  sum 
@@ -8388,22 +8390,26 @@ 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
+-- Both parent and child tables in the foreign server are truncated
+-- even though ONLY is specified because ONLY has no effect
+-- when truncating a foreign table.
+TRUNCATE ONLY tru_ftable;
+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 e201b5404e..8bcdc8d616 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..dcd36a9753 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');
@@ -2428,6 +2428,8 @@ SELECT count(*) from tru_ftable; -- 0
 SELECT count(*) from tru_pk_ftable; -- 0
 
 -- truncate with ONLY clause
+-- Since ONLY is specified, the table tru_ftable_child that inherits
+-- tru_ftable_parent locally is not truncated.
 TRUNCATE ONLY tru_ftable_parent;
 SELECT sum(id) FROM tru_ftable_parent;  -- 126
 TRUNCATE tru_ftable_parent;
@@ -2439,13 +2441,17 @@ 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
+-- Both parent and child tables in the foreign server are truncated
+-- even though ONLY is specified because ONLY has no effect
+-- when truncating a foreign table.
+TRUNCATE ONLY tru_ftable;
+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 9f9274ce55..0e2cd3628c 100644
--- a/doc/src/sgml/fdwhandler.sgml
+++ b/doc/src/sgml/fdwhandler.sgml
@@ -1071,28 +1071,16 @@ EndDirectModify(ForeignScanState *node);
     <para>
 <programlisting>
 void
-ExecForeignTruncate(List *rels, List *rels_extra,
-                    DropBehavior behavior, bool restart_seqs);
+ExecForeignTruncate(List *rels,
+                    DropBehavior behavior,
+                    bool restart_seqs);
 </programlisting>
 
      Truncate a set of foreign tables specified in <literal>rels</literal>.
      This function is called when <xref linkend="sql-truncate"/> is executed
      on foreign tables.  <literal>rels</literal> is the list of
      <structname>Relation</structname> data structure that indicates
-     a foreign table to truncate.  <literal>rels_extra</literal> the list of
-     <literal>int</literal> value, which delivers extra information about
-     a foreign table to truncate.  Possible values are
-     <literal>TRUNCATE_REL_CONTEXT_NORMAL</literal>, which means that
-     the foreign table is specified WITHOUT <literal>ONLY</literal> clause
-     in <command>TRUNCATE</command>,
-     <literal>TRUNCATE_REL_CONTEXT_ONLY</literal>, which means that
-     the foreign table is specified WITH <literal>ONLY</literal> clause,
-     and <literal>TRUNCATE_REL_CONTEXT_CASCADING</literal>,
-     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 <literal>rels</literal> and
-     <literal>rels_extra</literal>.  The number of entries is the same
-     between the two lists.
+     a foreign table to truncate.
     </para>
 
     <para>
@@ -1111,6 +1099,15 @@ ExecForeignTruncate(List *rels, List *rels_extra,
      if <literal>CONTINUE IDENTITY</literal> option is specified.
     </para>
 
+    <para>
+     Note that information about <literal>ONLY</literal> options specified
+     in the original <command>TRUNCATE</command> command is not passed to
+     <function>ExecForeignTruncate</function>.  This is the same behavior as
+     for the callback functions for <command>SELECT</command>,
+     <command>UPDATE</command> and <command>DELETE</command> on
+     a foreign table.
+    </para>
+
     <para>
      <command>TRUNCATE</command> invokes
      <function>ExecForeignTruncate</function> once per foreign server
diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml
index 5320accf6f..b0806c1274 100644
--- a/doc/src/sgml/postgres-fdw.sgml
+++ b/doc/src/sgml/postgres-fdw.sgml
@@ -69,6 +69,13 @@
   have privileges to do these things.)
  </para>
 
+ <para>
+  Note that the <literal>ONLY</literal> option specified in
+  <command>SELECT</command>, <command>UPDATE</command>,
+  <command>DELETE</command> or <command>TRUNCATE</command>
+  has no effect when accessing or modifying the remote table.
+ </para>
+
  <para>
   Note that <filename>postgres_fdw</filename> currently lacks support for
   <command>INSERT</command> statements with an <literal>ON CONFLICT DO
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 7d00f4eb25..8e717ada28 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 d09703f7ac..d9f157172b 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -1816,7 +1816,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;
 
@@ -1846,7 +1845,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);
 
@@ -1885,7 +1883,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);
@@ -1900,7 +1897,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);
 

Reply via email to