Bugs in copyfuncs/equalfuncs support for JSON node types

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Bugs in copyfuncs/equalfuncs support for JSON node types
Дата
Msg-id 1794155.1656984188@sss.pgh.pa.us
обсуждение исходный текст
Ответы Re: Bugs in copyfuncs/equalfuncs support for JSON node types  (Zhihong Yu <zyu@yugabyte.com>)
Re: Bugs in copyfuncs/equalfuncs support for JSON node types  (Justin Pryzby <pryzby@telsasoft.com>)
Список pgsql-hackers
In reviewing Peter's patch to auto-generate the backend/nodes
support files, I compared what the patch's script produces to
what is in the code now.  I found several discrepancies in the
recently-added parse node types for JSON functions, and as far
as I can see every one of those discrepancies is an error in
the existing code.  Some of them are relatively harmless
(e.g. COPY_LOCATION_FIELD isn't really different from
COPY_SCALAR_FIELD), but some of them definitely are live bugs.
I propose the attached patch.

            regards, tom lane

diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 51d630fa89..706d283a92 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -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;
 }
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index e747e1667d..fccc0b4a18 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -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;

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: avoid multiple hard links to same WAL file after a crash
Следующее
От: Zhihong Yu
Дата:
Сообщение: Re: Bugs in copyfuncs/equalfuncs support for JSON node types