Oid relid = lfirst_oid(lc); \
appendStringInfoString(str, sep); \
WRITE_RELID_INTERNAL(relid); \
- sep = ","; \
+ sep = " , "; \
} \
- appendStringInfoChar(str, ')'); \
+ appendStringInfoString(str, " )"); \
} \
} while (0)
+#define WRITE_TYPID_INTERNAL(typid) \
+ (outToken(str, OidIsValid(typid) ? NSP_NAME(get_typ_namespace(typid)) : NULL), \
+ appendStringInfoChar(str, ' '), \
+ outToken(str, OidIsValid(typid) ? get_typ_name(typid) : NULL))
+
/* write an OID which is a data type OID */
#define WRITE_TYPID_FIELD(fldname) \
(appendStringInfo(str, " :" CppAsString(fldname) " "), \
- outToken(str, OidIsValid(node->fldname) ? NSP_NAME(get_typ_namespace(node->fldname)) : NULL), \
- appendStringInfoChar(str, ' '), \
- outToken(str, OidIsValid(node->fldname) ? get_typ_name(node->fldname) : NULL))
+ WRITE_TYPID_INTERNAL(node->fldname))
+
+#define WRITE_TYPID_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 typid = lfirst_oid(lc); \
+ appendStringInfoString(str, sep); \
+ WRITE_TYPID_INTERNAL(typid); \
+ sep = " , "; \
+ } \
+ appendStringInfoString(str, " )"); \
+ } \
+ } while (0)
/* write an OID which is a function OID */
#define WRITE_FUNCID_FIELD(fldname) \
else
#endif
WRITE_OID_FIELD(aggtranstype);
+#ifdef XCP
+ if (portable_output)
+ WRITE_TYPID_LIST_FIELD(aggargtypes);
+ else
+#endif
WRITE_NODE_FIELD(aggargtypes);
WRITE_NODE_FIELD(aggdirectargs);
WRITE_NODE_FIELD(args);
} while (0)
/* Read data type identifier and lookup the OID */
-#define READ_TYPID_FIELD(fldname) \
+#define READ_TYPID_INTERNAL(typid) \
do { \
char *nspname; /* namespace name */ \
char *typname; /* data type name */ \
- token = pg_strtok(&length); /* skip :fldname */ \
token = pg_strtok(&length); /* get nspname */ \
nspname = nullable_string(token, length); \
token = pg_strtok(&length); /* get typname */ \
typname = nullable_string(token, length); \
if (typname) \
- local_node->fldname = get_typname_typid(typname, \
- NSP_OID(nspname)); \
+ { \
+ typid = get_typname_typid(typname, \
+ NSP_OID(nspname)); \
+ if (!OidIsValid((typid))) \
+ elog(WARNING, "could not find OID for type %s.%s", nspname,\
+ typname); \
+ } \
else \
- local_node->fldname = InvalidOid; \
+ typid = InvalidOid; \
+ } while (0)
+
+#define READ_TYPID_FIELD(fldname) \
+ do { \
+ Oid typid; \
+ token = pg_strtok(&length); /* skip :fldname */ \
+ READ_TYPID_INTERNAL(typid); \
+ local_node->fldname = typid; \
+ } while (0)
+
+#define READ_TYPID_LIST_FIELD(fldname) \
+ do { \
+ token = pg_strtok(&length); /* skip :fldname */ \
+ token = pg_strtok(&length); /* skip '(' */ \
+ if (length > 0 ) \
+ { \
+ Assert(token[0] == '('); \
+ for (;;) \
+ { \
+ Oid typid; \
+ READ_TYPID_INTERNAL(typid); \
+ local_node->fldname = lappend_oid(local_node->fldname, typid); \
+ token = pg_strtok(&length); \
+ if (token[0] == ')') \
+ break; \
+ } \
+ } \
+ else \
+ local_node->fldname = NIL; \
} while (0)
/* Read function identifier and lookup the OID */
else
#endif
READ_OID_FIELD(aggtranstype);
+#ifdef XCP
+ if (portable_input)
+ READ_TYPID_LIST_FIELD(aggargtypes);
+ else
+#endif
READ_NODE_FIELD(aggargtypes);
READ_NODE_FIELD(aggdirectargs);
READ_NODE_FIELD(args);