Fix errors in copyfuncs/equalfuncs support for JSON node types.
authorTom Lane <[email protected]>
Tue, 5 Jul 2022 15:12:33 +0000 (11:12 -0400)
committerTom Lane <[email protected]>
Tue, 5 Jul 2022 15:12:33 +0000 (11:12 -0400)
Noted while comparing existing code to the output of the proposed
patch to automate creation of these functions.  Some of the changes
are just cosmetic, but others represent real bugs.  I've not
attempted to analyze the user-visible impact.

Back-patch to v15 where this code came in.

Discussion: https://postgr.es/m/1794155.1656984188@sss.pgh.pa.us

src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c

index 51d630fa8925e04db5a8a95abf6745c4545f1624..706d283a925a4c00578143094a168c9489888de7 100644 (file)
@@ -2703,7 +2703,8 @@ _copyJsonTable(const JsonTable *from)
    COPY_NODE_FIELD(plan);
    COPY_NODE_FIELD(on_error);
    COPY_NODE_FIELD(alias);
-   COPY_SCALAR_FIELD(location);
+   COPY_SCALAR_FIELD(lateral);
+   COPY_LOCATION_FIELD(location);
 
    return newnode;
 }
@@ -2721,13 +2722,13 @@ _copyJsonTableColumn(const JsonTableColumn *from)
    COPY_NODE_FIELD(typeName);
    COPY_STRING_FIELD(pathspec);
    COPY_STRING_FIELD(pathname);
-   COPY_SCALAR_FIELD(format);
+   COPY_NODE_FIELD(format);
    COPY_SCALAR_FIELD(wrapper);
    COPY_SCALAR_FIELD(omit_quotes);
    COPY_NODE_FIELD(columns);
    COPY_NODE_FIELD(on_empty);
    COPY_NODE_FIELD(on_error);
-   COPY_SCALAR_FIELD(location);
+   COPY_LOCATION_FIELD(location);
 
    return newnode;
 }
@@ -2742,10 +2743,10 @@ _copyJsonTablePlan(const JsonTablePlan *from)
 
    COPY_SCALAR_FIELD(plan_type);
    COPY_SCALAR_FIELD(join_type);
-   COPY_STRING_FIELD(pathname);
    COPY_NODE_FIELD(plan1);
    COPY_NODE_FIELD(plan2);
-   COPY_SCALAR_FIELD(location);
+   COPY_STRING_FIELD(pathname);
+   COPY_LOCATION_FIELD(location);
 
    return newnode;
 }
index e747e1667d01252ea841808fa1cfea066b72fd36..fccc0b4a18d1f6e564d9b3867f9a952731fd57de 100644 (file)
@@ -147,14 +147,29 @@ _equalTableFunc(const TableFunc *a, const TableFunc *b)
    return true;
 }
 
+static bool
+_equalJsonTablePlan(const JsonTablePlan *a, const JsonTablePlan *b)
+{
+   COMPARE_SCALAR_FIELD(plan_type);
+   COMPARE_SCALAR_FIELD(join_type);
+   COMPARE_NODE_FIELD(plan1);
+   COMPARE_NODE_FIELD(plan2);
+   COMPARE_STRING_FIELD(pathname);
+   COMPARE_LOCATION_FIELD(location);
+
+   return true;
+}
+
 static bool
 _equalJsonTable(const JsonTable *a, const JsonTable *b)
 {
    COMPARE_NODE_FIELD(common);
    COMPARE_NODE_FIELD(columns);
+   COMPARE_NODE_FIELD(plan);
    COMPARE_NODE_FIELD(on_error);
    COMPARE_NODE_FIELD(alias);
-   COMPARE_SCALAR_FIELD(location);
+   COMPARE_SCALAR_FIELD(lateral);
+   COMPARE_LOCATION_FIELD(location);
 
    return true;
 }
@@ -166,13 +181,14 @@ _equalJsonTableColumn(const JsonTableColumn *a, const JsonTableColumn *b)
    COMPARE_STRING_FIELD(name);
    COMPARE_NODE_FIELD(typeName);
    COMPARE_STRING_FIELD(pathspec);
-   COMPARE_SCALAR_FIELD(format);
+   COMPARE_STRING_FIELD(pathname);
+   COMPARE_NODE_FIELD(format);
    COMPARE_SCALAR_FIELD(wrapper);
    COMPARE_SCALAR_FIELD(omit_quotes);
    COMPARE_NODE_FIELD(columns);
    COMPARE_NODE_FIELD(on_empty);
    COMPARE_NODE_FIELD(on_error);
-   COMPARE_SCALAR_FIELD(location);
+   COMPARE_LOCATION_FIELD(location);
 
    return true;
 }
@@ -4405,6 +4421,9 @@ equal(const void *a, const void *b)
        case T_JsonArgument:
            retval = _equalJsonArgument(a, b);
            break;
+       case T_JsonTablePlan:
+           retval = _equalJsonTablePlan(a, b);
+           break;
        case T_JsonTable:
            retval = _equalJsonTable(a, b);
            break;