Adjust out and read functions for TableSampleClause to honor portable out/read
authorPavan Deolasee <[email protected]>
Mon, 22 Jun 2015 10:07:36 +0000 (15:37 +0530)
committerPavan Deolasee <[email protected]>
Mon, 22 Jun 2015 10:07:36 +0000 (15:37 +0530)
Instead of sending the OIDs, we need to send qualified names for various
objects in the structure

src/backend/nodes/outfuncs.c
src/backend/nodes/readfuncs.c
src/backend/utils/cache/lsyscache.c
src/include/utils/lsyscache.h

index 8e42fb912ce2794cd7b116ae6d77376310f4c13c..bda40f2f1778c936a70b914dc23eb4cdb5b6f639 100644 (file)
@@ -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);
 }
index 7d6f0001cba7fdb9c3a48d82e36ba9ffbb3e9a65..3d8b831472ad4d4e85f44cc17959513a2c724d53 100644 (file)
@@ -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);
 
index 78eec4179cdd08d560584991ec78dac4c0a82ab0..f60f20fdf4f3c7c5df36c5e3aa8a1badc1405ebd 100644 (file)
@@ -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
+
index ed2f4d2f34e802060371fccf7f772dfc1535193e..819383a16bde6b1c65f23e432d6d523189befcde 100644 (file)
@@ -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)