/* 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) \
* 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) \
appendStringInfo(str, "<> <> -1"); \
} while (0)
+
#endif
#define booltostr(x) ((x) ? "true" : "false")
#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);
/* 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) \
#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 */
#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);