Encode list of rel OIDs in a portable format for datanodes to translate them to
authorPavan Deolasee <pavan.deolasee@gmail.com>
Wed, 10 Jun 2015 06:17:02 +0000 (11:47 +0530)
committerPavan Deolasee <pavan.deolasee@gmail.com>
Wed, 10 Jun 2015 06:17:02 +0000 (11:47 +0530)
local OIDs correctly

We now have a new routine to send down list of portable relation OIDs. Right
now only one member of ModifyTable node uses it, but we should see if this is
necessary at other places too.

src/backend/nodes/outfuncs.c
src/backend/nodes/readfuncs.c

index 02382151bfa890aa292fe2e0ed8dd165c7bcf3df..8e42fb912ce2794cd7b116ae6d77376310f4c13c 100644 (file)
@@ -126,8 +126,10 @@ set_portable_output(bool value)
 
 /* Write a Node field */
 #define WRITE_NODE_FIELD(fldname) \
-       (appendStringInfo(str, " :" CppAsString(fldname) " "), \
-        _outNode(str, node->fldname))
+       do { \
+               appendStringInfo(str, " :" CppAsString(fldname) " "); \
+               _outNode(str, node->fldname); \
+       } while (0)
 
 /* Write a bitmapset field */
 #define WRITE_BITMAPSET_FIELD(fldname) \
@@ -143,12 +145,36 @@ set_portable_output(bool value)
  * the OID on target node. The identifier depends on object type.
  */
 
+#define WRITE_RELID_INTERNAL(relid) \
+       (_outToken(str, OidIsValid((relid)) ? NSP_NAME(get_rel_namespace((relid))) : NULL), \
+        appendStringInfoChar(str, ' '), \
+        _outToken(str, OidIsValid((relid)) ? get_rel_name((relid)) : NULL))
+
 /* write an OID which is a relation OID */
 #define WRITE_RELID_FIELD(fldname) \
        (appendStringInfo(str, " :" CppAsString(fldname) " "), \
-        _outToken(str, OidIsValid(node->fldname) ? NSP_NAME(get_rel_namespace(node->fldname)) : NULL), \
-        appendStringInfoChar(str, ' '), \
-        _outToken(str, OidIsValid(node->fldname) ? get_rel_name(node->fldname) : NULL))
+        WRITE_RELID_INTERNAL(node->fldname))
+
+#define WRITE_RELID_LIST_FIELD(fldname) \
+       do { \
+               ListCell *lc; \
+               char *sep = ""; \
+               appendStringInfo(str, " :" CppAsString(fldname) " "); \
+               if (node->fldname == NIL || list_length(node->fldname) == 0) \
+                       appendStringInfoString(str, "<>"); \
+               else \
+               { \
+                       appendStringInfoChar(str, '('); \
+                       foreach (lc, node->fldname) \
+                       { \
+                               Oid relid = lfirst_oid(lc); \
+                               appendStringInfoString(str, sep); \
+                               WRITE_RELID_INTERNAL(relid); \
+                               sep = ","; \
+                       } \
+                       appendStringInfoChar(str, ')'); \
+               } \
+       }  while (0)
 
 /* write an OID which is a data type OID */
 #define WRITE_TYPID_FIELD(fldname) \
@@ -225,6 +251,7 @@ set_portable_output(bool value)
                        appendStringInfo(str, "<> <> -1"); \
        } while (0)
 
+
 #endif
 
 #define booltostr(x)  ((x) ? "true" : "false")
@@ -518,7 +545,16 @@ _outModifyTable(StringInfo str, const ModifyTable *node)
 #endif
 #endif
        WRITE_ENUM_FIELD(onConflictAction, OnConflictAction);
+#ifdef XCP     
+       if (portable_output)
+               WRITE_RELID_LIST_FIELD(arbiterIndexes);
+       else
+       {
+#endif
        WRITE_NODE_FIELD(arbiterIndexes);
+#ifdef XCP
+       }
+#endif
        WRITE_NODE_FIELD(onConflictSet);
        WRITE_NODE_FIELD(onConflictWhere);
        WRITE_INT_FIELD(exclRelRTI);
index 84fce71dbac13088e64f9a6a8d72f76b8da9395d..7d6f0001cba7fdb9c3a48d82e36ba9ffbb3e9a65 100644 (file)
@@ -162,9 +162,11 @@ set_portable_input(bool value)
 
 /* Read a Node field */
 #define READ_NODE_FIELD(fldname) \
-       token = pg_strtok(&length);             /* skip :fldname */ \
-       (void) token;                           /* in case not used elsewhere */ \
-       local_node->fldname = nodeRead(NULL, 0)
+       do { \
+               token = pg_strtok(&length);             /* skip :fldname */ \
+               (void) token;                           /* in case not used elsewhere */ \
+               local_node->fldname = nodeRead(NULL, 0); \
+       } while (0)
 
 /* Read a bitmapset field */
 #define READ_BITMAPSET_FIELD(fldname) \
@@ -232,20 +234,48 @@ set_portable_input(bool value)
 #define NSP_OID(nspname) LookupNamespaceNoError(nspname)
 
 /* Read relation identifier and lookup the OID */
-#define READ_RELID_FIELD(fldname) \
+#define READ_RELID_INTERNAL(relid) \
        do { \
                char       *nspname; /* namespace name */ \
                char       *relname; /* relation name */ \
-               token = pg_strtok(&length);             /* skip :fldname */ \
                token = pg_strtok(&length); /* get nspname */ \
                nspname = nullable_string(token, length); \
                token = pg_strtok(&length); /* get relname */ \
                relname = nullable_string(token, length); \
                if (relname) \
-                       local_node->fldname = get_relname_relid(relname, \
+                       relid = get_relname_relid(relname, \
                                                                                                        NSP_OID(nspname)); \
                else \
-                       local_node->fldname = InvalidOid; \
+                       relid = InvalidOid; \
+       } while (0)
+
+#define READ_RELID_FIELD(fldname) \
+       do { \
+               Oid relid; \
+               token = pg_strtok(&length);             /* skip :fldname */ \
+               READ_RELID_INTERNAL(relid); \
+               local_node->fldname = relid; \
+       } while (0)
+
+#define READ_RELID_LIST_FIELD(fldname) \
+       do { \
+               token = pg_strtok(&length);             /* skip :fldname */ \
+               token = pg_strtok(&length);     /* skip '(' */ \
+               if (length > 0 ) \
+               { \
+                       Assert(token[0] == '('); \
+                       for (;;) \
+                       { \
+                               Oid relid; \
+                               READ_RELID_INTERNAL(relid); \
+                               local_node->fldname = lappend_oid(local_node->fldname, relid); \
+                               token = pg_strtok(&length); \
+                               if (token[0] == ')') \
+                               break; \
+                       } \
+               } \
+               else \
+                       local_node->fldname = NIL; \
        } while (0)
 
 /* Read data type identifier and lookup the OID */
@@ -2138,6 +2168,11 @@ _readModifyTable(void)
 #endif
 
        READ_ENUM_FIELD(onConflictAction, OnConflictAction);
+#ifdef XCP
+       if (portable_input)
+               READ_RELID_LIST_FIELD(arbiterIndexes);
+       else
+#endif
        READ_NODE_FIELD(arbiterIndexes);
        READ_NODE_FIELD(onConflictSet);
        READ_NODE_FIELD(onConflictWhere);