summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPavan Deolasee2015-06-22 10:07:36 +0000
committerPavan Deolasee2015-06-22 10:07:36 +0000
commit6ce89613f509e75cdf14b3241e4031e89f84052a (patch)
tree371c9afed9b3a47d5a3d79a5a403b7f89a8505cc /src
parent5a42329c4c987b7837f9a9f3890c4f4f22a50b2d (diff)
Adjust out and read functions for TableSampleClause to honor portable out/read
Instead of sending the OIDs, we need to send qualified names for various objects in the structure
Diffstat (limited to 'src')
-rw-r--r--src/backend/nodes/outfuncs.c32
-rw-r--r--src/backend/nodes/readfuncs.c39
-rw-r--r--src/backend/utils/cache/lsyscache.c23
-rw-r--r--src/include/utils/lsyscache.h4
4 files changed, 98 insertions, 0 deletions
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8e42fb912c..bda40f2f17 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3598,9 +3598,38 @@ _outTableSampleClause(StringInfo str, const TableSampleClause *node)
{
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);
@@ -3608,6 +3637,9 @@ _outTableSampleClause(StringInfo str, const TableSampleClause *node)
WRITE_OID_FIELD(tsmend);
WRITE_OID_FIELD(tsmreset);
WRITE_OID_FIELD(tsmcost);
+#ifdef XCP
+ }
+#endif
WRITE_NODE_FIELD(repeatable);
WRITE_NODE_FIELD(args);
}
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 7d6f0001cb..3d8b831472 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -681,9 +681,45 @@ _readTableSampleClause(void)
{
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);
@@ -691,6 +727,9 @@ _readTableSampleClause(void)
READ_OID_FIELD(tsmend);
READ_OID_FIELD(tsmreset);
READ_OID_FIELD(tsmcost);
+#ifdef XCP
+ }
+#endif
READ_NODE_FIELD(repeatable);
READ_NODE_FIELD(args);
diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c
index 78eec4179c..f60f20fdf4 100644
--- a/src/backend/utils/cache/lsyscache.c
+++ b/src/backend/utils/cache/lsyscache.c
@@ -3526,3 +3526,26 @@ get_tablesample_method_name(Oid tsmid)
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
+
diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h
index ed2f4d2f34..819383a16b 100644
--- a/src/include/utils/lsyscache.h
+++ b/src/include/utils/lsyscache.h
@@ -194,6 +194,10 @@ extern char *get_namespace_name_or_temp(Oid nspid);
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)