Re: Extending outfuncs support to utility statements - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Extending outfuncs support to utility statements
Date
Msg-id 1919681.1657663299@sss.pgh.pa.us
Whole thread Raw
In response to Re: Extending outfuncs support to utility statements  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
I wrote:
> There might be enough node types that are raw-parse-tree-only,
> but not involved in utility statements, to make it worth
> continuing to suppress readfuncs support for them.  But I kinda
> doubt it.  I'll try to get some numbers later today.

Granting that we want write/read support for utility statements,
it seems that what we can save by suppressing raw-parse-tree-only
nodes is only about 10kB.  That's clearly not worth troubling over
in the grand scheme of things, so I suggest that we just open the
floodgates as attached.

            regards, tom lane

diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl
index 7694e04d0a..96af17516a 100644
--- a/src/backend/nodes/gen_node_support.pl
+++ b/src/backend/nodes/gen_node_support.pl
@@ -166,23 +166,6 @@ push @scalar_types, qw(EquivalenceClass* EquivalenceMember*);
 # currently not required.
 push @scalar_types, qw(QualCost);

-# XXX various things we are not publishing right now to stay level
-# with the manual system
-push @no_read_write,
-  qw(AccessPriv AlterTableCmd CreateOpClassItem FunctionParameter InferClause ObjectWithArgs OnConflictClause
PartitionCmdRoleSpec VacuumRelation); 
-push @no_read, qw(A_ArrayExpr A_Indices A_Indirection AlterStatsStmt
-  CollateClause ColumnDef ColumnRef CreateForeignTableStmt CreateStatsStmt
-  CreateStmt FuncCall ImportForeignSchemaStmt IndexElem IndexStmt
-  JsonAggConstructor JsonArgument JsonArrayAgg JsonArrayConstructor
-  JsonArrayQueryConstructor JsonCommon JsonFuncExpr JsonKeyValue
-  JsonObjectAgg JsonObjectConstructor JsonOutput JsonParseExpr JsonScalarExpr
-  JsonSerializeExpr JsonTable JsonTableColumn JsonTablePlan LockingClause
-  MultiAssignRef PLAssignStmt ParamRef PartitionElem PartitionSpec
-  PlaceHolderVar PublicationObjSpec PublicationTable RangeFunction
-  RangeSubselect RangeTableFunc RangeTableFuncCol RangeTableSample RawStmt
-  ResTarget ReturnStmt SelectStmt SortBy StatsElem TableLikeClause
-  TriggerTransition TypeCast TypeName WindowDef WithClause XmlSerialize);
-

 ## check that we have the expected number of files on the command line
 die "wrong number of input files, expected @all_input_files\n"
@@ -795,14 +778,6 @@ foreach my $n (@node_types)
     next if elem $n, @nodetag_only;
     next if elem $n, @no_read_write;

-    # XXX For now, skip all "Stmt"s except that ones that were there before.
-    if ($n =~ /Stmt$/)
-    {
-        my @keep =
-          qw(AlterStatsStmt CreateForeignTableStmt CreateStatsStmt CreateStmt DeclareCursorStmt
ImportForeignSchemaStmtIndexStmt NotifyStmt PlannedStmt PLAssignStmt RawStmt ReturnStmt SelectStmt SetOperationStmt); 
-        next unless elem $n, @keep;
-    }
-
     my $no_read = (elem $n, @no_read);

     # output format starts with upper case node type name
@@ -827,13 +802,20 @@ _out${n}(StringInfo str, const $n *node)

 ";

-    print $rff "
+    if (!$no_read)
+    {
+        my $macro =
+          (@{ $node_type_info{$n}->{fields} } > 0)
+          ? 'READ_LOCALS'
+          : 'READ_LOCALS_NO_FIELDS';
+        print $rff "
 static $n *
 _read${n}(void)
 {
-\tREAD_LOCALS($n);
+\t$macro($n);

-" unless $no_read;
+";
+    }

     # print instructions for each field
     foreach my $f (@{ $node_type_info{$n}->{fields} })
@@ -883,6 +865,7 @@ _read${n}(void)
             print $rff "\tREAD_LOCATION_FIELD($f);\n" unless $no_read;
         }
         elsif ($t eq 'int'
+            || $t eq 'int16'
             || $t eq 'int32'
             || $t eq 'AttrNumber'
             || $t eq 'StrategyNumber')
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 4d776e7b51..85ac0b5e21 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -415,79 +415,6 @@ _outExtensibleNode(StringInfo str, const ExtensibleNode *node)
     methods->nodeOut(str, node);
 }

-static void
-_outQuery(StringInfo str, const Query *node)
-{
-    WRITE_NODE_TYPE("QUERY");
-
-    WRITE_ENUM_FIELD(commandType, CmdType);
-    WRITE_ENUM_FIELD(querySource, QuerySource);
-    /* we intentionally do not print the queryId field */
-    WRITE_BOOL_FIELD(canSetTag);
-
-    /*
-     * Hack to work around missing outfuncs routines for a lot of the
-     * utility-statement node types.  (The only one we actually *need* for
-     * rules support is NotifyStmt.)  Someday we ought to support 'em all, but
-     * for the meantime do this to avoid getting lots of warnings when running
-     * with debug_print_parse on.
-     */
-    if (node->utilityStmt)
-    {
-        switch (nodeTag(node->utilityStmt))
-        {
-            case T_CreateStmt:
-            case T_IndexStmt:
-            case T_NotifyStmt:
-            case T_DeclareCursorStmt:
-                WRITE_NODE_FIELD(utilityStmt);
-                break;
-            default:
-                appendStringInfoString(str, " :utilityStmt ?");
-                break;
-        }
-    }
-    else
-        appendStringInfoString(str, " :utilityStmt <>");
-
-    WRITE_INT_FIELD(resultRelation);
-    WRITE_BOOL_FIELD(hasAggs);
-    WRITE_BOOL_FIELD(hasWindowFuncs);
-    WRITE_BOOL_FIELD(hasTargetSRFs);
-    WRITE_BOOL_FIELD(hasSubLinks);
-    WRITE_BOOL_FIELD(hasDistinctOn);
-    WRITE_BOOL_FIELD(hasRecursive);
-    WRITE_BOOL_FIELD(hasModifyingCTE);
-    WRITE_BOOL_FIELD(hasForUpdate);
-    WRITE_BOOL_FIELD(hasRowSecurity);
-    WRITE_BOOL_FIELD(isReturn);
-    WRITE_NODE_FIELD(cteList);
-    WRITE_NODE_FIELD(rtable);
-    WRITE_NODE_FIELD(jointree);
-    WRITE_NODE_FIELD(targetList);
-    WRITE_ENUM_FIELD(override, OverridingKind);
-    WRITE_NODE_FIELD(onConflict);
-    WRITE_NODE_FIELD(returningList);
-    WRITE_NODE_FIELD(groupClause);
-    WRITE_BOOL_FIELD(groupDistinct);
-    WRITE_NODE_FIELD(groupingSets);
-    WRITE_NODE_FIELD(havingQual);
-    WRITE_NODE_FIELD(windowClause);
-    WRITE_NODE_FIELD(distinctClause);
-    WRITE_NODE_FIELD(sortClause);
-    WRITE_NODE_FIELD(limitOffset);
-    WRITE_NODE_FIELD(limitCount);
-    WRITE_ENUM_FIELD(limitOption, LimitOption);
-    WRITE_NODE_FIELD(rowMarks);
-    WRITE_NODE_FIELD(setOperations);
-    WRITE_NODE_FIELD(constraintDeps);
-    WRITE_NODE_FIELD(withCheckOptions);
-    WRITE_NODE_FIELD(mergeActionList);
-    WRITE_BOOL_FIELD(mergeUseOuterJoin);
-    WRITE_LOCATION_FIELD(stmt_location);
-    WRITE_INT_FIELD(stmt_len);
-}
-
 static void
 _outRangeTblEntry(StringInfo str, const RangeTblEntry *node)
 {
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 1421686938..a2391280be 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -240,56 +240,6 @@ readBitmapset(void)
  * special_read_write attribute
  */

-static Query *
-_readQuery(void)
-{
-    READ_LOCALS(Query);
-
-    READ_ENUM_FIELD(commandType, CmdType);
-    READ_ENUM_FIELD(querySource, QuerySource);
-    local_node->queryId = UINT64CONST(0);    /* not saved in output format */
-    READ_BOOL_FIELD(canSetTag);
-    READ_NODE_FIELD(utilityStmt);
-    READ_INT_FIELD(resultRelation);
-    READ_BOOL_FIELD(hasAggs);
-    READ_BOOL_FIELD(hasWindowFuncs);
-    READ_BOOL_FIELD(hasTargetSRFs);
-    READ_BOOL_FIELD(hasSubLinks);
-    READ_BOOL_FIELD(hasDistinctOn);
-    READ_BOOL_FIELD(hasRecursive);
-    READ_BOOL_FIELD(hasModifyingCTE);
-    READ_BOOL_FIELD(hasForUpdate);
-    READ_BOOL_FIELD(hasRowSecurity);
-    READ_BOOL_FIELD(isReturn);
-    READ_NODE_FIELD(cteList);
-    READ_NODE_FIELD(rtable);
-    READ_NODE_FIELD(jointree);
-    READ_NODE_FIELD(targetList);
-    READ_ENUM_FIELD(override, OverridingKind);
-    READ_NODE_FIELD(onConflict);
-    READ_NODE_FIELD(returningList);
-    READ_NODE_FIELD(groupClause);
-    READ_BOOL_FIELD(groupDistinct);
-    READ_NODE_FIELD(groupingSets);
-    READ_NODE_FIELD(havingQual);
-    READ_NODE_FIELD(windowClause);
-    READ_NODE_FIELD(distinctClause);
-    READ_NODE_FIELD(sortClause);
-    READ_NODE_FIELD(limitOffset);
-    READ_NODE_FIELD(limitCount);
-    READ_ENUM_FIELD(limitOption, LimitOption);
-    READ_NODE_FIELD(rowMarks);
-    READ_NODE_FIELD(setOperations);
-    READ_NODE_FIELD(constraintDeps);
-    READ_NODE_FIELD(withCheckOptions);
-    READ_NODE_FIELD(mergeActionList);
-    READ_BOOL_FIELD(mergeUseOuterJoin);
-    READ_LOCATION_FIELD(stmt_location);
-    READ_INT_FIELD(stmt_len);
-
-    READ_DONE();
-}
-
 static Const *
 _readConst(void)
 {
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index e2ad761768..29e48642b7 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -117,8 +117,6 @@ typedef uint32 AclMode;            /* a bitmask of privilege bits */
  */
 typedef struct Query
 {
-    pg_node_attr(custom_read_write)
-
     NodeTag        type;

     CmdType        commandType;    /* select|insert|update|delete|merge|utility */
@@ -126,10 +124,10 @@ typedef struct Query
     QuerySource querySource;    /* where did I come from? */

     /*
-     * query identifier (can be set by plugins); ignored for equal, might not
-     * be set
+     * query identifier (can be set by plugins); ignored for equal, as it
+     * might not be set; also not stored
      */
-    uint64        queryId pg_node_attr(equal_ignore, read_as(0));
+    uint64        queryId pg_node_attr(equal_ignore, read_write_ignore, read_as(0));

     bool        canSetTag;        /* do I set the command result tag? */


pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: System catalog documentation chapter
Next
From: Andres Freund
Date:
Subject: Re: making relfilenodes 56 bits