{
WRITE_NODE_TYPE("TABLESAMPLECLAUSE");
+#ifdef XCP
+ if (portable_output)
+ {
+ char *tsmname = get_tablesample_method_name(node->tsmid);
+ appendStringInfo(str, " :" CppAsString(tsmid) " ");
+ _outToken(str, tsmname);
+ pfree(tsmname);
+ }
+ else
+ {
+#endif
WRITE_OID_FIELD(tsmid);
+#ifdef XCP
+ }
+#endif
WRITE_BOOL_FIELD(tsmseqscan);
WRITE_BOOL_FIELD(tsmpagemode);
+
+#ifdef XCP
+ if (portable_output)
+ {
+ WRITE_FUNCID_FIELD(tsminit);
+ WRITE_FUNCID_FIELD(tsmnextblock);
+ WRITE_FUNCID_FIELD(tsmnexttuple);
+ WRITE_FUNCID_FIELD(tsmexaminetuple);
+ WRITE_FUNCID_FIELD(tsmend);
+ WRITE_FUNCID_FIELD(tsmreset);
+ WRITE_FUNCID_FIELD(tsmcost);
+ }
+ else
+ {
+#endif
WRITE_OID_FIELD(tsminit);
WRITE_OID_FIELD(tsmnextblock);
WRITE_OID_FIELD(tsmnexttuple);
WRITE_OID_FIELD(tsmend);
WRITE_OID_FIELD(tsmreset);
WRITE_OID_FIELD(tsmcost);
+#ifdef XCP
+ }
+#endif
WRITE_NODE_FIELD(repeatable);
WRITE_NODE_FIELD(args);
}
{
READ_LOCALS(TableSampleClause);
+#ifdef XCP
+ if (portable_input)
+ {
+ char *tsmname;
+
+ token = pg_strtok(&length); /* skip :fldname */ \
+ token = pg_strtok(&length); /* tsmname */
+ tsmname = nullable_string(token, length);
+
+ if (tsmname)
+ local_node->tsmid = get_tablesample_method_id(tsmname);
+ else
+ local_node->tsmid = InvalidOid;
+ }
+ else
+ {
+#endif
READ_OID_FIELD(tsmid);
+#ifdef XCP
+ }
+#endif
+
READ_BOOL_FIELD(tsmseqscan);
READ_BOOL_FIELD(tsmpagemode);
+
+#ifdef XCP
+ if (portable_input)
+ {
+ READ_FUNCID_FIELD(tsminit);
+ READ_FUNCID_FIELD(tsmnextblock);
+ READ_FUNCID_FIELD(tsmnexttuple);
+ READ_FUNCID_FIELD(tsmexaminetuple);
+ READ_FUNCID_FIELD(tsmend);
+ READ_FUNCID_FIELD(tsmreset);
+ READ_FUNCID_FIELD(tsmcost);
+ }
+ else
+ {
+#endif
READ_OID_FIELD(tsminit);
READ_OID_FIELD(tsmnextblock);
READ_OID_FIELD(tsmnexttuple);
READ_OID_FIELD(tsmend);
READ_OID_FIELD(tsmreset);
READ_OID_FIELD(tsmcost);
+#ifdef XCP
+ }
+#endif
READ_NODE_FIELD(repeatable);
READ_NODE_FIELD(args);
else
return NULL;
}
+
+#ifdef XCP
+Oid
+get_tablesample_method_id(const char *methodname)
+{
+ Oid tsoid;
+ HeapTuple tuple;
+
+ /* Load the tablesample method */
+ tuple = SearchSysCache1(TABLESAMPLEMETHODNAME, PointerGetDatum(methodname));
+ if (!HeapTupleIsValid(tuple))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("tablesample method \"%s\" does not exist",
+ methodname)));
+
+ tsoid = HeapTupleGetOid(tuple);
+ ReleaseSysCache(tuple);
+
+ return tsoid;
+}
+#endif
+
extern Oid get_range_subtype(Oid rangeOid);
extern char *get_tablesample_method_name(Oid tsmid);
+#ifdef XCP
+extern Oid get_tablesample_method_id(const char *methodname);
+#endif
+
#define type_is_array(typid) (get_element_type(typid) != InvalidOid)
/* type_is_array_domain accepts both plain arrays and domains over arrays */
#define type_is_array_domain(typid) (get_base_element_type(typid) != InvalidOid)