On Thu, Apr 08, 2021 at 10:14:17PM +0900, Fujii Masao wrote:
> On 2021/04/08 22:02, Kohei KaiGai wrote:
> > > Anyway, attached is the updated version of the patch. This is still based 
> > > on the latest Kazutaka-san's patch. That is, extra list for ONLY is still 
> > > passed to FDW. What about committing this version at first? Then we can 
> > > continue the discussion and change the behavior later if necessary.
> 
> Pushed! Thank all involved in this development!!
> For record, I attached the final patch I committed.

Find attached language fixes.

I'm also proposing to convert an if/else to an switch(), since I don't like
"if/else if" without an "else", and since the compiler can warn about missing
enum values in switch cases.  You could also write:
| Assert(behavior == DROP_RESTRICT || behavior == DROP_CASCADE)

Also, you currently test:
> +             if (extra & TRUNCATE_REL_CONTEXT_ONLY)

but TRUNCATE_REL_ aren't indepedent bits, so shouldn't be tested with "&".

src/include/commands/tablecmds.h-#define TRUNCATE_REL_CONTEXT_NORMAL       1 /* 
specified without ONLY clause */
src/include/commands/tablecmds.h-#define TRUNCATE_REL_CONTEXT_ONLY         2 /* 
specified with ONLY clause */
src/include/commands/tablecmds.h:#define TRUNCATE_REL_CONTEXT_CASCADING     3   
/* not specified but truncated
src/include/commands/tablecmds.h-                                               
 * due to dependency (e.g.,
src/include/commands/tablecmds.h-                                               
 * partition table) */

> +++ b/contrib/postgres_fdw/deparse.c
> @@ -2172,6 +2173,43 @@ deparseAnalyzeSql(StringInfo buf, Relation rel, List 
> **retrieved_attrs)
>       deparseRelation(buf, rel);
>  }
>  
> +/*
> + * Construct a simple "TRUNCATE rel" statement
> + */
> +void
> +deparseTruncateSql(StringInfo buf,
> +                                List *rels,
> +                                List *rels_extra,
> +                                DropBehavior behavior,
> +                                bool restart_seqs)
> +{
> +     ListCell   *lc1,
> +                        *lc2;
> +
> +     appendStringInfoString(buf, "TRUNCATE ");
> +
> +     forboth(lc1, rels, lc2, rels_extra)
> +     {
> +             Relation        rel = lfirst(lc1);
> +             int                     extra = lfirst_int(lc2);
> +
> +             if (lc1 != list_head(rels))
> +                     appendStringInfoString(buf, ", ");
> +             if (extra & TRUNCATE_REL_CONTEXT_ONLY)
> +                     appendStringInfoString(buf, "ONLY ");
> +
> +             deparseRelation(buf, rel);
> +     }
> +
> +     appendStringInfo(buf, " %s IDENTITY",
> +                                      restart_seqs ? "RESTART" : "CONTINUE");
> +
> +     if (behavior == DROP_RESTRICT)
> +             appendStringInfoString(buf, " RESTRICT");
> +     else if (behavior == DROP_CASCADE)
> +             appendStringInfoString(buf, " CASCADE");
> +}
>From 7bbd9312464899dfc2c70fdc64c95a298ac01594 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryz...@telsasoft.com>
Date: Thu, 8 Apr 2021 10:10:58 -0500
Subject: [PATCH 1/3] WIP doc review: Allow TRUNCATE command to truncate
 foreign tables.

8ff1c94649f5c9184ac5f07981d8aea9dfd7ac19
---
 doc/src/sgml/fdwhandler.sgml   | 43 +++++++++++++++++-----------------
 doc/src/sgml/postgres-fdw.sgml |  2 +-
 doc/src/sgml/ref/truncate.sgml |  2 +-
 3 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/doc/src/sgml/fdwhandler.sgml b/doc/src/sgml/fdwhandler.sgml
index 98882ddab8..5a76dede24 100644
--- a/doc/src/sgml/fdwhandler.sgml
+++ b/doc/src/sgml/fdwhandler.sgml
@@ -1075,40 +1075,39 @@ ExecForeignTruncate(List *rels, List *rels_extra,
                     DropBehavior behavior, bool restart_seqs);
 </programlisting>
 
-     Truncate a set of foreign tables specified in <literal>rels</literal>.
+     Truncate foreign tables.
      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
+     on a foreign table.  <literal>rels</literal> is a list of
+     <structname>Relation</structname> data structures for the
+     foreign tables to be truncated.  <literal>rels_extra</literal> is a list of
+     corresponding <literal>int</literal> values which provide extra information about
+     the foreign tables.  Each element of rels_extra may have the value
      <literal>TRUNCATE_REL_CONTEXT_NORMAL</literal>, which means that
-     the foreign table is specified WITHOUT <literal>ONLY</literal> clause
+     the foreign table is specified <emphasis>WITHOUT</emphasis> the <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>,
+     the foreign table is specified <emphasis>WITH</emphasis> the <literal>ONLY</literal> clause,
+     or <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.
+     but will be truncated due to a dependency (for example, a table partition).
     </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
+     <literal>behavior</literal> must be specified as
+     <literal>DROP_RESTRICT</literal> or <literal>DROP_CASCADE</literal>.
+     If specified as <literal>DROP_RESTRICT</literal>, the
+     <literal>RESTRICT</literal> option will be included in the
      <command>TRUNCATE</command> command.
+     If specified as <literal>DROP_CASCADE</literal>, the
+     <literal>CASCADE</literal> option will be included.
     </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 specified as <literal>true</literal>,
+     the <command>TRUNCATE</command> command will include the
+     <literal>RESTART IDENTITY</literal> option.
+     Otherwise, the <command>TRUNCATE</command> command will include the
+     <literal>CONTINUE IDENTITY</literal> option.
     </para>
 
     <para>
diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml
index 5320accf6f..116434f658 100644
--- a/doc/src/sgml/postgres-fdw.sgml
+++ b/doc/src/sgml/postgres-fdw.sgml
@@ -452,7 +452,7 @@ 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>.
diff --git a/doc/src/sgml/ref/truncate.sgml b/doc/src/sgml/ref/truncate.sgml
index acf3633be4..9d846f88c9 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, for instance,
    see <xref linkend="postgres-fdw"/>.
   </para>
  </refsect1>
-- 
2.17.0

>From 513bb389e3e3c3cfe47518164c6ce49736854756 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryz...@telsasoft.com>
Date: Sat, 10 Apr 2021 22:53:21 -0500
Subject: [PATCH 2/3] Convert an if/else if without an else to a switch

---
 contrib/postgres_fdw/deparse.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c
index bdc4c3620d..2c702c0e37 100644
--- a/contrib/postgres_fdw/deparse.c
+++ b/contrib/postgres_fdw/deparse.c
@@ -2204,10 +2204,15 @@ deparseTruncateSql(StringInfo buf,
 	appendStringInfo(buf, " %s IDENTITY",
 					 restart_seqs ? "RESTART" : "CONTINUE");
 
-	if (behavior == DROP_RESTRICT)
+	switch (behavior)
+	{
+	case DROP_RESTRICT:
 		appendStringInfoString(buf, " RESTRICT");
-	else if (behavior == DROP_CASCADE)
+		break;
+	case DROP_CASCADE:
 		appendStringInfoString(buf, " CASCADE");
+		break;
+	}
 }
 
 /*
-- 
2.17.0

>From 76d783f4e472ea466cca0d126798505f851e54d0 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryz...@telsasoft.com>
Date: Sat, 10 Apr 2021 23:08:58 -0500
Subject: [PATCH 3/3] Test integer using == and not &

---
 contrib/postgres_fdw/deparse.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c
index 2c702c0e37..c2b1269f73 100644
--- a/contrib/postgres_fdw/deparse.c
+++ b/contrib/postgres_fdw/deparse.c
@@ -2195,7 +2195,7 @@ deparseTruncateSql(StringInfo buf,
 
 		if (lc1 != list_head(rels))
 			appendStringInfoString(buf, ", ");
-		if (extra & TRUNCATE_REL_CONTEXT_ONLY)
+		if (extra == TRUNCATE_REL_CONTEXT_ONLY)
 			appendStringInfoString(buf, "ONLY ");
 
 		deparseRelation(buf, rel);
-- 
2.17.0

Reply via email to