6438 lines
200 KiB
C++
Executable File
6438 lines
200 KiB
C++
Executable File
/* -------------------------------------------------------------------------
|
|
*
|
|
* readfuncs.cpp
|
|
* Reader functions for openGauss tree nodes.
|
|
*
|
|
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* src/common/backend/nodes/readfuncs.cpp
|
|
*
|
|
* NOTES
|
|
* Path and Plan nodes do not have any readfuncs support, because we
|
|
* never have occasion to read them in. (There was once code here that
|
|
* claimed to read them, but it was broken as well as unused.) We
|
|
* never read executor state trees, either.
|
|
*
|
|
* Parse location fields are written out by outfuncs.c, but only for
|
|
* possible debugging use. When reading a location field, we discard
|
|
* the stored value and set the location field to -1 (ie, "unknown").
|
|
* This is because nodes coming from a stored rule should not be thought
|
|
* to have a known location in the current query's text.
|
|
*
|
|
* -------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
#include "knl/knl_variable.h"
|
|
|
|
#include <math.h>
|
|
|
|
#include "miscadmin.h"
|
|
#include "bulkload/dist_fdw.h"
|
|
#include "catalog/gs_opt_model.h"
|
|
#include "nodes/parsenodes.h"
|
|
#include "foreign/fdwapi.h"
|
|
#include "nodes/plannodes.h"
|
|
#include "optimizer/dataskew.h"
|
|
#include "optimizer/planner.h"
|
|
#include "nodes/parsenodes.h"
|
|
#include "nodes/readfuncs.h"
|
|
#include "parser/parse_func.h"
|
|
#include "parser/parse_hint.h"
|
|
#ifdef PGXC
|
|
#include "access/htup.h"
|
|
#include "catalog/namespace.h"
|
|
#include "catalog/pg_class.h"
|
|
#include "catalog/pg_proc.h"
|
|
#include "catalog/pg_synonym.h"
|
|
#include "catalog/pg_type.h"
|
|
#include "access/attnum.h"
|
|
#include "pgxc/groupmgr.h"
|
|
#include "pgxc/pgxc.h"
|
|
#include "pgxc/pgFdwRemote.h"
|
|
#include "utils/builtins.h"
|
|
#include "utils/lsyscache.h"
|
|
#include "catalog/pg_enum.h"
|
|
#include "access/transam.h"
|
|
#endif
|
|
#include "executor/node/nodeExtensible.h"
|
|
#include "storage/lmgr.h"
|
|
#include "optimizer/streamplan.h"
|
|
#include "utils/rel.h"
|
|
#include "utils/rel_gs.h"
|
|
#include "utils/syscache.h"
|
|
#include "tcop/utility.h"
|
|
#include "utils/builtins.h"
|
|
|
|
THR_LOCAL bool skip_read_extern_fields = false;
|
|
|
|
#define IS_DATANODE_BUT_NOT_SINGLENODE (IS_PGXC_DATANODE && !IS_SINGLE_NODE)
|
|
/*
|
|
* Macros to simplify reading of different kinds of fields. Use these
|
|
* wherever possible to reduce the chance for silly typos. Note that these
|
|
* hard-wire conventions about the names of the local variables in a Read
|
|
* routine.
|
|
*/
|
|
|
|
/* Macros for declaring appropriate local variables */
|
|
|
|
/* try to see if a field exist
|
|
* IF_EXIST(fieldname)
|
|
* {
|
|
* ... do actual read
|
|
* }
|
|
*/
|
|
#define IF_EXIST(fieldname) \
|
|
if ((NULL != (token = pg_strtok(&length, false))) && \
|
|
(0 == strncmp(token, ":" CppAsString(fieldname), strlen(":" CppAsString(fieldname)))))
|
|
|
|
/* A few guys need only local_node */
|
|
#define READ_LOCALS_NO_FIELDS(nodeTypeName) nodeTypeName* local_node = makeNode(nodeTypeName)
|
|
|
|
#define READ_LOCALS_NULL(nodeTypeName) \
|
|
if (local_node == NULL) \
|
|
local_node = makeNode(nodeTypeName);
|
|
|
|
/* And a few guys need only the pg_strtok support fields */
|
|
#define READ_TEMP_LOCALS() \
|
|
char* token = NULL; \
|
|
int length;
|
|
|
|
#define LIST_LENGTH(fldname) \
|
|
int size; \
|
|
size = list_length(local_node->fldname);
|
|
|
|
#define DEFINE_UINT64_ARRAY(arrayLen) uint64* local_node = (uint64*)palloc0(sizeof(uint64) * (arrayLen))
|
|
|
|
#define DEFINE_UINT16_ARRAY(arrayLen) uint16* local_node = (uint16*)palloc0(sizeof(uint16) * (arrayLen))
|
|
|
|
#define READ_UINT64_ARRAY_FILED(arrayLen) \
|
|
DEFINE_UINT64_ARRAY(arrayLen); \
|
|
READ_TEMP_LOCALS()
|
|
|
|
#define READ_UINT16_ARRAY_FILED(arrayLen) \
|
|
DEFINE_UINT16_ARRAY(arrayLen); \
|
|
READ_TEMP_LOCALS()
|
|
|
|
/* ... but most need both */
|
|
#define READ_LOCALS(nodeTypeName) \
|
|
READ_LOCALS_NO_FIELDS(nodeTypeName); \
|
|
READ_TEMP_LOCALS()
|
|
|
|
/* Read an integer field (anything written as ":fldname %d") */
|
|
#define READ_INT_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = atoi(token); \
|
|
} while (0)
|
|
|
|
#define READ_INT_FIELD_DIRECT(fldname) \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = atoi(token)
|
|
|
|
/* Read an integer field (anything written as ":fldname %ld") */
|
|
#define READ_LONG_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = atol(token); \
|
|
} while (0)
|
|
|
|
/* Read an 64bit unsigned integer field (anything written as ":fldname %lu") */
|
|
#define READ_UINT64_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = strtoul(token, NULL, 0); \
|
|
} while (0)
|
|
|
|
/* Read an unsigned long integer field (anything written as ":fldname %UINT64") */
|
|
#define READ_ULONG_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = strtoul(token, NULL, 0); \
|
|
} while (0)
|
|
|
|
#define READ_POINTER_FIELD(fldname, datatype) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = (datatype*)strtoul(token, NULL, 0); \
|
|
} while (0)
|
|
|
|
#define READ_INT_ARRAY(fldname, size) \
|
|
do { \
|
|
local_node->fldname = (int*)palloc(local_node->size * sizeof(int)); \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
for (int i = 0; i < local_node->size; i++) { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname[i] = atoi(token); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_DOUBLE_ARRAY(fldname, size) \
|
|
do { \
|
|
local_node->fldname = (double*)palloc(local_node->size * sizeof(double)); \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
for (int i = 0; i < local_node->size; i++) { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname[i] = atof(token); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_INT_ARRAY_LEN(fldname) \
|
|
do { \
|
|
local_node->fldname = (int*)palloc(size * sizeof(int)); \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
for (int i = 0; i < size; i++) { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname[i] = atoi(token); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_UINT2_ARRAY_LEN(fldname) \
|
|
do { \
|
|
local_node->fldname = (uint2*)palloc(size * sizeof(uint2)); \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
for (int i = 0; i < size; i++) { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname[i] = (uint2)atoi(token); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_ATTR_ARRAY(fldname, size) \
|
|
do { \
|
|
local_node->fldname = (AttrNumber*)palloc(local_node->size * sizeof(AttrNumber)); \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
for (int i = 0; i < local_node->size; i++) { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname[i] = atoi(token); \
|
|
} \
|
|
} while (0)
|
|
|
|
/* Read an unsigned integer field (anything written as ":fldname %u") */
|
|
#define READ_UINT_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = atoui(token); \
|
|
} while (0)
|
|
|
|
/* Read an OID field (don't hard-wire assumption that OID is same as uint) */
|
|
#define READ_OID_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = atooid(token); \
|
|
} while (0)
|
|
|
|
#define READ_OID_ARRAY(fldname, size) \
|
|
do { \
|
|
local_node->fldname = (Oid*)palloc(local_node->size * sizeof(Oid)); \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
for (int i = 0; i < local_node->size; i++) { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname[i] = atooid(token); \
|
|
} \
|
|
} while (0)
|
|
|
|
/*
|
|
* Note that this macro is used to convert collation to oid
|
|
* by collation_name
|
|
*/
|
|
#define READ_OID_ARRAY_BYCONVERT(fldname, size) \
|
|
do { \
|
|
for (int i = 0; i < local_node->size; i++) { \
|
|
if (local_node->fldname[i] >= FirstBootstrapObjectId) { \
|
|
IF_EXIST(collname) \
|
|
{ \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); \
|
|
char* _collname = nullable_string(token, length); \
|
|
Assert(_collname != NULL); \
|
|
if (!IS_PGXC_COORDINATOR) { \
|
|
List* _collnameList = list_make1(makeString(_collname)); \
|
|
local_node->fldname[i] = get_collation_oid(_collnameList, false); \
|
|
list_free_ext(_collnameList); \
|
|
} \
|
|
if (NULL != _collname) \
|
|
pfree_ext(_collname); \
|
|
} \
|
|
} \
|
|
} \
|
|
} while (0);
|
|
|
|
#define READ_OID_ARRAY_LEN(fldname) \
|
|
do { \
|
|
local_node->fldname = (Oid*)palloc(size * sizeof(Oid)); \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
for (int i = 0; i < size; i++) { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname[i] = atooid(token); \
|
|
} \
|
|
} while (0);
|
|
|
|
/* Read a char field (ie, one ascii character) */
|
|
#define READ_CHAR_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
if (token == NULL) { \
|
|
ereport(ERROR, \
|
|
(errmodule(MOD_OPT), \
|
|
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), \
|
|
errmsg("token should not return NULL."))); \
|
|
} \
|
|
local_node->fldname = token[0]; \
|
|
} while (0);
|
|
|
|
/* Read an enumerated-type field which is converted from an expression */
|
|
#define READ_ENUM_EXPR(fldname, enumtype, expr) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = (enumtype)(expr); \
|
|
} while (0);
|
|
|
|
|
|
/* Read an enumerated-type field that was written as an integer code */
|
|
#define READ_ENUM_FIELD(fldname, enumtype) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = (enumtype)atoi(token); \
|
|
} while (0);
|
|
|
|
/* Read a float field */
|
|
#define READ_FLOAT_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = atof(token); \
|
|
} while (0)
|
|
|
|
/* Read a boolean field */
|
|
#define READ_BOOL_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
if (token == NULL) { \
|
|
ereport(ERROR, \
|
|
(errmodule(MOD_OPT), \
|
|
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), \
|
|
errmsg("token should not return NULL."))); \
|
|
} \
|
|
local_node->fldname = strtobool(token); \
|
|
} while (0)
|
|
|
|
#define READ_BOOL_FIELD_DIRECT(fldname) \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
if (token == NULL) { \
|
|
ereport(ERROR, \
|
|
(errmodule(MOD_OPT), errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("token should not return NULL."))); \
|
|
} \
|
|
local_node->fldname = strtobool(token)
|
|
|
|
#define READ_BOOL_ARRAY(fldname, size) \
|
|
do { \
|
|
local_node->fldname = (bool*)palloc(local_node->size * sizeof(bool)); \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
for (int i = 0; i < local_node->size; i++) { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
if (token == NULL) { \
|
|
ereport(ERROR, \
|
|
(errmodule(MOD_OPT), \
|
|
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), \
|
|
errmsg("token should not return NULL."))); \
|
|
} \
|
|
local_node->fldname[i] = strtobool(token); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_BOOL_ARRAY_LEN(fldname) \
|
|
do { \
|
|
local_node->fldname = (bool*)palloc(size * sizeof(bool)); \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
for (int i = 0; i < size; i++) { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
if (token == NULL) { \
|
|
ereport(ERROR, \
|
|
(errmodule(MOD_OPT), \
|
|
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), \
|
|
errmsg("token should not return NULL."))); \
|
|
} \
|
|
local_node->fldname[i] = strtobool(token); \
|
|
} \
|
|
} while (0);
|
|
|
|
/* Read a character-string field */
|
|
#define READ_STRING_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = nullable_string(token, length); \
|
|
} while (0)
|
|
|
|
#define READCOPY_STRING_FIELD_DIRECT(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
if (length >= 0) { \
|
|
int reterrno = strncpy_s(local_node->fldname, length + 1, (debackslash(token, length)), length); \
|
|
securec_check(reterrno, "\0", "\0"); \
|
|
local_node->fldname[length] = '\0'; \
|
|
} \
|
|
} while (0)
|
|
|
|
/* Read a parse location field (and throw away the value, per notes above) */
|
|
#define READ_LOCATION_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
token = pg_strtok(&length); /* get field value */ \
|
|
local_node->fldname = atoi(token); /* set field to "unknown" */ \
|
|
} while (0)
|
|
|
|
/* Read a Node field */
|
|
#define READ_NODE_FIELD(fldname) \
|
|
do { \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
void* ptr = nodeRead(NULL, 0); \
|
|
errno_t reterrno = memcpy_s(&local_node->fldname, sizeof(void*), &ptr, sizeof(void*)); \
|
|
securec_check(reterrno, "\0", "\0"); \
|
|
} while (0)
|
|
|
|
/* Read a bitmapset field */
|
|
#define READ_BITMAPSET_FIELD(fldname) \
|
|
token = pg_strtok(&length); /* skip :fldname */ \
|
|
local_node->fldname = _readBitmapset()
|
|
|
|
#define READ_TYPEINFO_FIELD(fldname) \
|
|
do { \
|
|
if (local_node->fldname >= FirstBootstrapObjectId) { \
|
|
IF_EXIST(exprtypename) \
|
|
{ \
|
|
char* exprtypename = NULL; \
|
|
char* exprtypenamespace = NULL; \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
exprtypename = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
exprtypenamespace = nullable_string(token, length); \
|
|
/* No need to reset field on CN or singlenode, keep pg_strtok() for forward compatibility */ \
|
|
if (IS_DATANODE_BUT_NOT_SINGLENODE) { \
|
|
local_node->fldname = get_typeoid(get_namespace_oid(exprtypenamespace, false), exprtypename); \
|
|
} \
|
|
pfree_ext(exprtypename); \
|
|
pfree_ext(exprtypenamespace); \
|
|
} \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_TYPEINFO(typePtr) \
|
|
do { \
|
|
/* fetch next typid that write in typeinfo list */ \
|
|
IF_EXIST(exprtypename) \
|
|
{ \
|
|
char* exprtypename = NULL; \
|
|
char* exprtypenamespace = NULL; \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
exprtypename = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
exprtypenamespace = nullable_string(token, length); \
|
|
typePtr = get_typeoid(get_namespace_oid(exprtypenamespace, false), exprtypename); \
|
|
pfree_ext(exprtypename); \
|
|
pfree_ext(exprtypenamespace); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_TYPEINFO_LIST(fldname) \
|
|
do { \
|
|
ListCell* cell = NULL; \
|
|
foreach (cell, local_node->fldname) { \
|
|
Oid typid = lfirst_oid(cell); \
|
|
if (typid < FirstBootstrapObjectId) /* skip bootstrap type */ \
|
|
continue; \
|
|
/* fetch next typid that write in typeinfo list */ \
|
|
READ_TYPEINFO(lfirst_oid(cell)); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_TYPINFO_ARRAY(fldname, size) \
|
|
do { \
|
|
for (int i = 0; i < local_node->size; i++) { \
|
|
Oid typid = local_node->fldname[i]; \
|
|
if (typid < FirstBootstrapObjectId) /* skip bootstrap type */ \
|
|
continue; \
|
|
/* fetch next typid that write in typeinfo list */ \
|
|
READ_TYPEINFO(local_node->fldname[i]); \
|
|
} \
|
|
} while (0);
|
|
|
|
/* read full-text search configuratio's oid from its name */
|
|
#define READ_CFGINFO_FIELD(fldname1, fldname2) \
|
|
do { \
|
|
if (REGCONFIGOID == local_node->fldname1) { \
|
|
char *cfgname, *cfgnamespace; \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
cfgname = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
cfgnamespace = nullable_string(token, length); \
|
|
local_node->fldname2 = \
|
|
DirectFunctionCall1(regconfigin, CStringGetDatum(quote_qualified_identifier(cfgnamespace, cfgname))); \
|
|
pfree_ext(cfgname); \
|
|
pfree_ext(cfgnamespace); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_FUNCINFO_FIELD(fldname) \
|
|
do { \
|
|
if (local_node->fldname >= FirstBootstrapObjectId) { \
|
|
IF_EXIST(funcname) \
|
|
{ \
|
|
char *funcname, *funcnamespace; \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
funcname = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
funcnamespace = nullable_string(token, length); \
|
|
bool notfound = false; \
|
|
if (IS_DATANODE_BUT_NOT_SINGLENODE && !skip_read_extern_fields) { \
|
|
Oid funcoid = InvalidOid; \
|
|
do { \
|
|
Oid nspid = get_namespace_oid(funcnamespace, true); \
|
|
if (!OidIsValid(nspid)) { \
|
|
notfound = true; \
|
|
break; \
|
|
} \
|
|
funcoid = get_func_oid(funcname, nspid, (Expr*)local_node); \
|
|
} while (0); \
|
|
if (notfound || !OidIsValid(funcoid)) { \
|
|
ereport(ERROR, \
|
|
(errmodule(MOD_OPT), errcode(ERRCODE_UNDEFINED_OBJECT), \
|
|
errmsg("Cannot identify function %s.%s while deserializing field.", \
|
|
funcname, funcnamespace), \
|
|
errdetail("Function with oid %u or its namespace may be renamed", \
|
|
local_node->fldname), \
|
|
errhint("Please rebuild column defalt expression, views etc. that are" \
|
|
" related to this renamed object."), \
|
|
errcause("Object renamed after recorded as nodetree."), \
|
|
erraction("Rebuild relevant object."))); \
|
|
} \
|
|
local_node->fldname = funcoid; \
|
|
} \
|
|
pfree_ext(funcname); \
|
|
pfree_ext(funcnamespace); \
|
|
} \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_OPINFO_FIELD(fldname) \
|
|
do { \
|
|
if (local_node->fldname >= FirstNormalObjectId) { \
|
|
char* opname; \
|
|
char* opnamespace; \
|
|
char* oprleftname; \
|
|
char* oprrightname; \
|
|
Oid namespaceId; \
|
|
Oid oprleft; \
|
|
Oid oprright; \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
opname = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
opnamespace = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
oprleftname = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
oprrightname = nullable_string(token, length); \
|
|
if (IS_DATANODE_BUT_NOT_SINGLENODE) { \
|
|
namespaceId = get_namespace_oid(opnamespace, false); \
|
|
oprleft = get_typeoid(namespaceId, oprleftname); \
|
|
oprright = oprleft; \
|
|
local_node->fldname = get_operator_oid(opname, namespaceId, oprleft, oprright); \
|
|
} \
|
|
pfree_ext(opname); \
|
|
pfree_ext(opnamespace); \
|
|
pfree_ext(oprleftname); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_OPERATOROID_ARRAY(fldname, size) \
|
|
do { \
|
|
local_node->fldname = (Oid*)palloc(local_node->size * sizeof(Oid)); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
for (int i = 0; i < local_node->size; i++) { \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
local_node->fldname[i] = atooid(token); \
|
|
if (local_node->fldname[i] >= FirstNormalObjectId) { \
|
|
char* opname; \
|
|
char* opnamespace; \
|
|
char* oprleftname; \
|
|
char* oprrightname; \
|
|
Oid namespaceId; \
|
|
Oid oprleft; \
|
|
Oid oprright; \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
opname = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
opnamespace = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
oprleftname = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
oprrightname = nullable_string(token, length); \
|
|
if (IS_DATANODE_BUT_NOT_SINGLENODE) { \
|
|
namespaceId = get_namespace_oid(opnamespace, false); \
|
|
oprleft = get_typeoid(namespaceId, oprleftname); \
|
|
oprright = oprleft; \
|
|
local_node->fldname[i] = get_operator_oid(opname, namespaceId, oprleft, oprright); \
|
|
} \
|
|
pfree_ext(opname); \
|
|
pfree_ext(opnamespace); \
|
|
pfree_ext(oprleftname); \
|
|
} \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
} \
|
|
} while (0);
|
|
|
|
#define READ_RELINFO_FIELD(fldname) \
|
|
do { \
|
|
if (local_node->fldname >= FirstBootstrapObjectId) { \
|
|
IF_EXIST(relname) \
|
|
{ \
|
|
char *relname, *relnamespace; \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
relname = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
relnamespace = nullable_string(token, length); \
|
|
local_node->fldname = get_valid_relname_relid(relnamespace, relname); \
|
|
pfree_ext(relname); \
|
|
pfree_ext(relnamespace); \
|
|
} \
|
|
} \
|
|
} while (0)
|
|
|
|
#define READ_SYNINFO_FILED(fldname) \
|
|
do { \
|
|
IF_EXIST(synname) \
|
|
{ \
|
|
char* synName = NULL; \
|
|
char* synSchema = NULL; \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
synName = nullable_string(token, length); \
|
|
token = pg_strtok(&length); \
|
|
token = pg_strtok(&length); \
|
|
synSchema = nullable_string(token, length); \
|
|
Assert(synName != NULL && synSchema != NULL); \
|
|
if (!IS_SINGLE_NODE && !IS_PGXC_COORDINATOR && !isRestoreMode) { \
|
|
local_node->fldname = GetSynonymOid(synName, get_namespace_oid(synSchema, false), true); \
|
|
} \
|
|
pfree_ext(synName); \
|
|
pfree_ext(synSchema); \
|
|
} \
|
|
} while (0)
|
|
|
|
/* Routine exit. This if branch just keep compiler silent. */
|
|
#define READ_DONE() \
|
|
if (token != NULL) { \
|
|
token = NULL; \
|
|
} \
|
|
return local_node
|
|
|
|
#define READ_END() return local_node
|
|
|
|
/*
|
|
* NOTE: use atoi() to read values written with %d, or atoui() to read
|
|
* values written with %u in outfuncs.c. An exception is OID values,
|
|
* for which use atooid(). (As of 7.1, outfuncs.c writes OIDs as %u,
|
|
* but this will probably change in the future.)
|
|
*/
|
|
#define atoui(x) ((unsigned int)strtoul((x), NULL, 10))
|
|
|
|
#define atooid(x) ((Oid)strtoul((x), NULL, 10))
|
|
|
|
#define strtobool(x) ((*(x) == 't') ? true : false)
|
|
|
|
#define nullable_string(token, length) ((length) == 0 ? NULL : debackslash(token, length))
|
|
|
|
/*
|
|
* function for _readOpExpr, _readDistinctExpr and _readNullIfExpr.
|
|
*/
|
|
#define READ_EXPR_FIELD() \
|
|
do { \
|
|
READ_OID_FIELD(opno); \
|
|
READ_OPINFO_FIELD(opno); \
|
|
READ_OID_FIELD(opfuncid); \
|
|
READ_FUNCINFO_FIELD(opfuncid); \
|
|
\
|
|
/* */ \
|
|
/* The opfuncid is stored in the textual format primarily for debugging*/ \
|
|
/* and documentation reasons. We want to always read it as zero to force*/ \
|
|
/* it to be re-looked-up in the pg_operator entry. This ensures that*/ \
|
|
/* stored rules don't have hidden dependencies on operators' functions.*/ \
|
|
/* (We don't currently support an ALTER OPERATOR command, but might*/ \
|
|
/* someday.)*/ \
|
|
/* */ \
|
|
/* Until PteroDB supports ALTER OPERATOR let's comment this to make*/ \
|
|
/* Plan shipping work*/ \
|
|
READ_OID_FIELD(opresulttype); \
|
|
READ_BOOL_FIELD(opretset); \
|
|
READ_OID_FIELD(opcollid); \
|
|
READ_OID_FIELD(inputcollid); \
|
|
READ_NODE_FIELD(args); \
|
|
READ_LOCATION_FIELD(location); \
|
|
\
|
|
READ_TYPEINFO_FIELD(opresulttype); \
|
|
\
|
|
READ_DONE(); \
|
|
} while (0)
|
|
|
|
/*
|
|
* function for _readStream and _readVecStream.
|
|
*/
|
|
#define READ_STREAM_FIELD() \
|
|
do { \
|
|
READ_TEMP_LOCALS(); \
|
|
\
|
|
/* Read Plan */ \
|
|
_readScan(&local_node->scan); \
|
|
\
|
|
READ_ENUM_FIELD(type, StreamType); \
|
|
\
|
|
READ_STRING_FIELD(plan_statement); \
|
|
READ_NODE_FIELD(consumer_nodes); \
|
|
READ_NODE_FIELD(distribute_keys); \
|
|
READ_BOOL_FIELD(is_sorted); \
|
|
READ_NODE_FIELD(sort); \
|
|
READ_BOOL_FIELD(is_dummy); \
|
|
READ_INT_FIELD(smpDesc.consumerDop); \
|
|
READ_INT_FIELD(smpDesc.producerDop); \
|
|
READ_ENUM_FIELD(smpDesc.distriType, SmpStreamType); \
|
|
READ_NODE_FIELD(skew_list); \
|
|
READ_INT_FIELD(stream_level); \
|
|
READ_NODE_FIELD(origin_consumer_nodes); \
|
|
READ_BOOL_FIELD(is_recursive_local); \
|
|
\
|
|
READ_DONE(); \
|
|
} while (0)
|
|
|
|
/*
|
|
* function for _readRemoteQuery and _readVecRemoteQuery.
|
|
*/
|
|
#define READ_REMOTEQUERY_FIELD() \
|
|
do { \
|
|
/* Read Scan */ \
|
|
_readScan(&local_node->scan); \
|
|
\
|
|
READ_ENUM_FIELD(exec_direct_type, ExecDirectType); \
|
|
READ_STRING_FIELD(sql_statement); \
|
|
READ_NODE_FIELD(exec_nodes); \
|
|
READ_ENUM_FIELD(combine_type, CombineType); \
|
|
\
|
|
READ_BOOL_FIELD(read_only); \
|
|
READ_BOOL_FIELD(force_autocommit); \
|
|
READ_STRING_FIELD(statement); \
|
|
READ_STRING_FIELD(cursor); \
|
|
READ_INT_FIELD(rq_num_params); \
|
|
/* fix a bug, local_node->rq_num_params will be 0 in plan router and scan gather node. */ \
|
|
if (local_node->rq_num_params > 0) { \
|
|
READ_OID_ARRAY(rq_param_types, rq_num_params); \
|
|
} \
|
|
READ_BOOL_FIELD(rq_params_internal); \
|
|
\
|
|
READ_ENUM_FIELD(exec_type, RemoteQueryExecType); \
|
|
READ_BOOL_FIELD(is_temp); \
|
|
\
|
|
READ_BOOL_FIELD(rq_finalise_aggs); \
|
|
READ_BOOL_FIELD(rq_sortgroup_colno); \
|
|
READ_NODE_FIELD(remote_query); \
|
|
READ_NODE_FIELD(base_tlist); \
|
|
READ_NODE_FIELD(coord_var_tlist); \
|
|
READ_NODE_FIELD(query_var_tlist); \
|
|
READ_BOOL_FIELD(has_row_marks); \
|
|
READ_BOOL_FIELD(rq_save_command_id); \
|
|
READ_BOOL_FIELD(is_simple); \
|
|
READ_BOOL_FIELD(mergesort_required); \
|
|
READ_BOOL_FIELD(spool_no_data); \
|
|
READ_BOOL_FIELD(poll_multi_channel); \
|
|
READ_INT_FIELD(num_stream); \
|
|
READ_INT_FIELD(num_gather); \
|
|
READ_NODE_FIELD(sort); \
|
|
READ_NODE_FIELD(rte_ref); \
|
|
READ_ENUM_FIELD(position, RemoteQueryType); \
|
|
\
|
|
READ_TYPINFO_ARRAY(rq_param_types, rq_num_params); \
|
|
IF_EXIST(is_remote_function_query) \
|
|
{ \
|
|
READ_BOOL_FIELD(is_remote_function_query); \
|
|
} \
|
|
IF_EXIST(isCustomPlan) \
|
|
{ \
|
|
READ_BOOL_FIELD(isCustomPlan); \
|
|
} \
|
|
IF_EXIST(isFQS) \
|
|
{ \
|
|
READ_BOOL_FIELD(isFQS); \
|
|
} \
|
|
IF_EXIST(relationOids) \
|
|
{ \
|
|
READ_NODE_FIELD(relationOids); \
|
|
} \
|
|
READ_DONE(); \
|
|
} while (0)
|
|
|
|
/*
|
|
* function for _readHashJoin and _readVecHashJoin.
|
|
*/
|
|
#define READ_HASHJOIN_FIELD() \
|
|
do { \
|
|
READ_TEMP_LOCALS(); \
|
|
\
|
|
/* Read Join */ \
|
|
_readJoin(&local_node->join); \
|
|
\
|
|
READ_NODE_FIELD(hashclauses); \
|
|
READ_BOOL_FIELD(streamBothSides); \
|
|
READ_BOOL_FIELD(transferFilterFlag); \
|
|
READ_BOOL_FIELD(rebuildHashTable); \
|
|
READ_BOOL_FIELD(isSonicHash); \
|
|
read_mem_info(&local_node->mem_info); \
|
|
\
|
|
READ_DONE(); \
|
|
} while (0)
|
|
|
|
/*
|
|
* function for _readMergeJoin and _readVecMergeJoin.
|
|
*/
|
|
#define READ_MERGEJOIN() \
|
|
do { \
|
|
READ_TEMP_LOCALS(); \
|
|
\
|
|
/* Read Join */ \
|
|
_readJoin(&local_node->join); \
|
|
\
|
|
READ_NODE_FIELD(mergeclauses); \
|
|
LIST_LENGTH(mergeclauses); \
|
|
READ_OID_ARRAY_LEN(mergeFamilies); \
|
|
READ_OID_ARRAY_LEN(mergeCollations); \
|
|
READ_INT_ARRAY_LEN(mergeStrategies); \
|
|
READ_BOOL_ARRAY_LEN(mergeNullsFirst); \
|
|
\
|
|
READ_DONE(); \
|
|
} while (0)
|
|
|
|
/*
|
|
* function for _readForeignScan and _readVecForeignScan.
|
|
*/
|
|
#define READ_FOREIGNSCAN() \
|
|
do { \
|
|
READ_OID_FIELD(scan_relid); \
|
|
READ_NODE_FIELD(fdw_exprs); \
|
|
READ_NODE_FIELD(fdw_private); \
|
|
READ_BOOL_FIELD(fsSystemCol); \
|
|
READ_BOOL_FIELD(needSaveError); \
|
|
READ_NODE_FIELD(errCache); \
|
|
READ_NODE_FIELD(prunningResult); \
|
|
READ_NODE_FIELD(rel); \
|
|
READ_NODE_FIELD(options); \
|
|
\
|
|
READ_LONG_FIELD(objectNum); \
|
|
READ_INT_FIELD(bfNum); \
|
|
} while (0)
|
|
|
|
static Datum readDatum(bool typbyval);
|
|
static Scan* _readScan(Scan* local_node);
|
|
extern bool StreamTopConsumerAmI();
|
|
static void read_mem_info(OpMemInfo* local_node);
|
|
static void _readCursorData(Cursor_Data* local_node);
|
|
|
|
/*
|
|
* _readBitmapset
|
|
*/
|
|
static Bitmapset* _readBitmapset(void)
|
|
{
|
|
Bitmapset* result = NULL;
|
|
|
|
READ_TEMP_LOCALS();
|
|
|
|
token = pg_strtok(&length);
|
|
if (token == NULL) {
|
|
ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("incomplete Bitmapset structure")));
|
|
}
|
|
if (length != 1 || token[0] != '(') {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), errmsg("unrecognized token: \"%.*s\"", length, token)));
|
|
}
|
|
token = pg_strtok(&length);
|
|
if (token == NULL) {
|
|
ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("incomplete Bitmapset structure")));
|
|
}
|
|
if (length != 1 || token[0] != 'b') {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), errmsg("unrecognized token: \"%.*s\"", length, token)));
|
|
}
|
|
|
|
for (;;) {
|
|
int val;
|
|
char* endptr = NULL;
|
|
|
|
token = pg_strtok(&length);
|
|
if (token == NULL) {
|
|
ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("unterminated Bitmapset structure")));
|
|
}
|
|
if (length == 1 && token[0] == ')') {
|
|
break;
|
|
}
|
|
val = (int)strtol(token, &endptr, 10);
|
|
if (endptr != token + length) {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
|
|
errmsg("unrecognized integer: \"%.*s\"", length, token)));
|
|
}
|
|
result = bms_add_member(result, val);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/*
|
|
* ereport error information of _readUint64Array and _readUint16Array
|
|
*/
|
|
void check_token_complete(const char* token, const int length)
|
|
{
|
|
if (token == NULL) {
|
|
ereport(ERROR, (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), errmsg("incomplete array structure")));
|
|
}
|
|
|
|
if (length != 1 || token[0] != '(') {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), errmsg("unrecognized token: \"%.*s\"", length, token)));
|
|
}
|
|
}
|
|
|
|
/*
|
|
* ereport error information of _readUint64Array and _readUint16Array
|
|
*/
|
|
void token_if_terminated(const char* token)
|
|
{
|
|
if (token == NULL) {
|
|
ereport(ERROR, (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), errmsg("unterminated array structure")));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the uint64 string "(a int int ...)" to uint64 array.
|
|
* @in arrayLen, the array length.
|
|
* @return
|
|
*/
|
|
static uint64* _readUint64Array(int arrayLen)
|
|
{
|
|
READ_UINT64_ARRAY_FILED(arrayLen);
|
|
|
|
token = pg_strtok(&length);
|
|
check_token_complete(token, length);
|
|
|
|
token = pg_strtok(&length);
|
|
if (token == NULL) {
|
|
ereport(ERROR, (errcode(ERRCODE_UNEXPECTED_NULL_VALUE), errmsg("incomplete Bitmapset structure")));
|
|
}
|
|
if (length != 1 || token[0] != 'a') {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), errmsg("unrecognized token: \"%.*s\"", length, token)));
|
|
}
|
|
|
|
for (int index = 0;;) {
|
|
uint64 val;
|
|
char* endptr = NULL;
|
|
|
|
token = pg_strtok(&length);
|
|
token_if_terminated(token);
|
|
|
|
if (length == 1 && token[0] == ')') {
|
|
break;
|
|
}
|
|
val = (uint64)strtoul(token, &endptr, 10);
|
|
if (endptr != token + length) {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
|
|
errmsg("unrecognized integer: \"%.*s\"", length, token)));
|
|
}
|
|
Assert(index < arrayLen);
|
|
local_node[index++] = val;
|
|
}
|
|
|
|
return local_node;
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the uint16 string "(a int int ...)" to uint16 array.
|
|
* @in arrayLen, the array length.
|
|
* @return
|
|
*/
|
|
static uint16* _readUint16Array(int arrayLen)
|
|
{
|
|
READ_UINT16_ARRAY_FILED(arrayLen);
|
|
|
|
token = pg_strtok(&length);
|
|
check_token_complete(token, length);
|
|
|
|
token = pg_strtok(&length);
|
|
if (token == NULL) {
|
|
ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("incomplete Bitmapset structure")));
|
|
}
|
|
if (length != 1 || token[0] != 'a') {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), errmsg("unrecognized token: \"%.*s\"", length, token)));
|
|
}
|
|
for (int index = 0;;) {
|
|
uint16 val;
|
|
char* endptr = NULL;
|
|
|
|
token = pg_strtok(&length);
|
|
token_if_terminated(token);
|
|
|
|
if (length == 1 && token[0] == ')') {
|
|
break;
|
|
}
|
|
val = (uint16)strtol(token, &endptr, 10);
|
|
if (endptr != token + length) {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
|
|
errmsg("unrecognized integer: \"%.*s\"", length, token)));
|
|
}
|
|
Assert(index < arrayLen);
|
|
local_node[index++] = val;
|
|
}
|
|
|
|
return local_node;
|
|
}
|
|
|
|
/*
|
|
* _readDistribution
|
|
* read information for a Distribution
|
|
*
|
|
* @param (in) : void
|
|
*
|
|
* @return:
|
|
* Distribution *: the target Distribution pointer
|
|
*/
|
|
static Distribution* _readDistribution(void)
|
|
{
|
|
Distribution* local_node = NewDistribution();
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_UINT_FIELD(group_oid);
|
|
READ_BITMAPSET_FIELD(bms_data_nodeids);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to hint struct.
|
|
* @return: Hint struct.
|
|
*/
|
|
static Hint* _readBaseHint(Hint* local_node)
|
|
{
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_NODE_FIELD(relnames);
|
|
READ_ENUM_FIELD(hint_keyword, HintKeyword);
|
|
READ_ENUM_FIELD(state, HintStatus);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to join hint struct.
|
|
* @return: Join hint struct.
|
|
*/
|
|
static JoinMethodHint* _readJoinHint(void)
|
|
{
|
|
READ_LOCALS(JoinMethodHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
READ_BOOL_FIELD(negative);
|
|
READ_BITMAPSET_FIELD(joinrelids);
|
|
READ_BITMAPSET_FIELD(inner_joinrelids);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to predpush hint struct.
|
|
* @return: Predpush hint struct.
|
|
*/
|
|
static PredpushHint* _readPredpushHint(void)
|
|
{
|
|
READ_LOCALS(PredpushHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
READ_BOOL_FIELD(negative);
|
|
READ_STRING_FIELD(dest_name);
|
|
READ_INT_FIELD(dest_id);
|
|
READ_BITMAPSET_FIELD(candidates);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to predpush same level hint struct.
|
|
* @return: Predpush same level hint struct.
|
|
*/
|
|
static PredpushSameLevelHint* _readPredpushSameLevelHint(void)
|
|
{
|
|
READ_LOCALS(PredpushSameLevelHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
READ_BOOL_FIELD(negative);
|
|
READ_STRING_FIELD(dest_name);
|
|
READ_INT_FIELD(dest_id);
|
|
READ_BITMAPSET_FIELD(candidates);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to rewrite hint struct.
|
|
* @return: rewrite hint struct.
|
|
*/
|
|
static RewriteHint* _readRewriteHint(void)
|
|
{
|
|
READ_LOCALS(RewriteHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
READ_NODE_FIELD(param_names);
|
|
READ_UINT_FIELD(param_bits);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to gather hint struct.
|
|
* @return: gather hint struct.
|
|
*/
|
|
static GatherHint* _readGatherHint(void)
|
|
{
|
|
READ_LOCALS(GatherHint);
|
|
_readBaseHint(&(local_node->base));
|
|
READ_ENUM_FIELD(source, GatherSource);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to no_gpc hint struct.
|
|
* @return: no_gpc hint struct.
|
|
*/
|
|
static NoGPCHint* _readNoGPCHint(void)
|
|
{
|
|
READ_LOCALS_NO_FIELDS(NoGPCHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
|
|
READ_END();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to no_expand hint struct.
|
|
* @return: no_expand hint struct.
|
|
*/
|
|
static NoExpandHint* _readNoExpandHint(void)
|
|
{
|
|
READ_LOCALS_NO_FIELDS(NoExpandHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
|
|
READ_END();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to set hint struct.
|
|
* @return: set hint struct.
|
|
*/
|
|
static SetHint* _readSetHint(void)
|
|
{
|
|
READ_LOCALS(SetHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
READ_STRING_FIELD(name);
|
|
READ_STRING_FIELD(value);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to rewrite plancache hint struct.
|
|
* @return: plancache hint struct.
|
|
*/
|
|
static PlanCacheHint* _readPlanCacheHint(void)
|
|
{
|
|
READ_LOCALS(PlanCacheHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
READ_BOOL_FIELD(chooseCustomPlan);
|
|
IF_EXIST(method) {
|
|
READ_ENUM_FIELD(method, GplanSelectionMethod);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to leading hint struct.
|
|
* @return: Leading hint struct.
|
|
*/
|
|
static LeadingHint* _readLeadingHint(void)
|
|
{
|
|
READ_LOCALS(LeadingHint);
|
|
_readBaseHint(&(local_node->base));
|
|
READ_BOOL_FIELD(join_order_hint);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to rows hint struct.
|
|
* @return: Rows hint struct.
|
|
*/
|
|
static RowsHint* _readRowsHint(void)
|
|
{
|
|
READ_LOCALS(RowsHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
|
|
READ_BITMAPSET_FIELD(joinrelids);
|
|
READ_STRING_FIELD(rows_str);
|
|
READ_ENUM_FIELD(value_type, RowsValueType);
|
|
READ_FLOAT_FIELD(rows);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to stream hint struct.
|
|
* @return: Stream hint struct.
|
|
*/
|
|
static StreamHint* _readStreamHint(void)
|
|
{
|
|
READ_LOCALS(StreamHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
READ_BOOL_FIELD(negative);
|
|
READ_BITMAPSET_FIELD(joinrelids);
|
|
READ_ENUM_FIELD(stream_type, StreamType);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to BlockName hint struct.
|
|
* @return: BlockName hint struct.
|
|
*/
|
|
static BlockNameHint* _readBlockNameHint(void)
|
|
{
|
|
READ_LOCALS_NO_FIELDS(BlockNameHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
|
|
READ_END();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to Scan hint struct.
|
|
* @return: Scan hint struct.
|
|
*/
|
|
static ScanMethodHint* _readScanMethodHint(void)
|
|
{
|
|
READ_LOCALS(ScanMethodHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
READ_BOOL_FIELD(negative);
|
|
READ_BITMAPSET_FIELD(relid);
|
|
READ_NODE_FIELD(indexlist);
|
|
|
|
READ_END();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to pgfdw remote information.
|
|
* @return: Scan hint struct.
|
|
*/
|
|
static PgFdwRemoteInfo* _readPgFdwRemoteInfo(void)
|
|
{
|
|
READ_LOCALS(PgFdwRemoteInfo);
|
|
|
|
READ_CHAR_FIELD(reltype);
|
|
READ_INT_FIELD(datanodenum);
|
|
READ_ULONG_FIELD(snapsize);
|
|
|
|
token = pg_strtok(&length); /* skip :fldname */
|
|
|
|
local_node->snapshot = (Snapshot)_readUint16Array(local_node->snapsize / 2);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to Skew hint struct.
|
|
* @return: Skew hint struct.
|
|
*/
|
|
static SkewHint* _readSkewHint(void)
|
|
{
|
|
READ_LOCALS(SkewHint);
|
|
|
|
_readBaseHint(&(local_node->base));
|
|
READ_BITMAPSET_FIELD(relid);
|
|
READ_NODE_FIELD(column_list);
|
|
READ_NODE_FIELD(value_list);
|
|
|
|
READ_END();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to Skew hint transform struct.
|
|
* @return: Skew hint transform struct.
|
|
*/
|
|
static SkewHintTransf* _readSkewHintTransf(void)
|
|
{
|
|
READ_LOCALS(SkewHintTransf);
|
|
|
|
READ_NODE_FIELD(before);
|
|
READ_NODE_FIELD(rel_info_list);
|
|
READ_NODE_FIELD(column_info_list);
|
|
READ_NODE_FIELD(value_info_list);
|
|
|
|
READ_END();
|
|
}
|
|
|
|
static SkewRelInfo* _readSkewRelInfo(void)
|
|
{
|
|
READ_LOCALS(SkewRelInfo);
|
|
|
|
READ_STRING_FIELD(relation_name);
|
|
READ_OID_FIELD(relation_oid);
|
|
READ_NODE_FIELD(rte);
|
|
READ_NODE_FIELD(parent_rte);
|
|
|
|
READ_END();
|
|
}
|
|
|
|
static SkewColumnInfo* _readSkewColumnInfo(void)
|
|
{
|
|
READ_LOCALS(SkewColumnInfo);
|
|
|
|
READ_OID_FIELD(relation_Oid);
|
|
READ_STRING_FIELD(column_name);
|
|
READ_UINT_FIELD(attnum);
|
|
READ_OID_FIELD(column_typid);
|
|
READ_NODE_FIELD(expr);
|
|
|
|
READ_TYPEINFO_FIELD(column_typid);
|
|
READ_END();
|
|
}
|
|
|
|
static SkewValueInfo* _readSkewValueInfo(void)
|
|
{
|
|
READ_LOCALS(SkewValueInfo);
|
|
|
|
READ_BOOL_FIELD(support_redis);
|
|
READ_NODE_FIELD(const_value);
|
|
|
|
READ_END();
|
|
}
|
|
|
|
/*
|
|
* @Description: Read string to hint state struct.
|
|
* @return: Hint state struct
|
|
*/
|
|
static HintState* _readHintState()
|
|
{
|
|
READ_LOCALS(HintState);
|
|
|
|
READ_INT_FIELD(nall_hints);
|
|
READ_NODE_FIELD(join_hint);
|
|
READ_NODE_FIELD(leading_hint);
|
|
READ_NODE_FIELD(row_hint);
|
|
READ_NODE_FIELD(stream_hint);
|
|
READ_NODE_FIELD(block_name_hint);
|
|
READ_NODE_FIELD(scan_hint);
|
|
READ_NODE_FIELD(skew_hint);
|
|
IF_EXIST(predpush_hint) {
|
|
READ_NODE_FIELD(predpush_hint);
|
|
}
|
|
IF_EXIST(rewrite_hint) {
|
|
READ_NODE_FIELD(rewrite_hint);
|
|
}
|
|
IF_EXIST(gather_hint) {
|
|
READ_NODE_FIELD(gather_hint);
|
|
}
|
|
IF_EXIST(no_expand_hint) {
|
|
READ_NODE_FIELD(no_expand_hint);
|
|
}
|
|
IF_EXIST(set_hint) {
|
|
READ_NODE_FIELD(set_hint);
|
|
}
|
|
IF_EXIST(cache_plan_hint) {
|
|
READ_NODE_FIELD(cache_plan_hint);
|
|
}
|
|
IF_EXIST(no_gpc_hint) {
|
|
READ_NODE_FIELD(no_gpc_hint);
|
|
}
|
|
IF_EXIST(predpush_same_level_hint) {
|
|
READ_NODE_FIELD(predpush_same_level_hint);
|
|
}
|
|
IF_EXIST(from_sql_patch) {
|
|
READ_BOOL_FIELD(from_sql_patch);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readQuery
|
|
*/
|
|
static Query* _readQuery(void)
|
|
{
|
|
READ_LOCALS(Query);
|
|
|
|
READ_ENUM_FIELD(commandType, CmdType);
|
|
READ_ENUM_FIELD(querySource, QuerySource);
|
|
local_node->queryId = 0; /* not saved in output format */
|
|
READ_BOOL_FIELD(canSetTag);
|
|
READ_NODE_FIELD(utilityStmt);
|
|
READ_INT_FIELD(resultRelation);
|
|
READ_BOOL_FIELD(hasAggs);
|
|
READ_BOOL_FIELD(hasWindowFuncs);
|
|
READ_BOOL_FIELD(hasSubLinks);
|
|
READ_BOOL_FIELD(hasDistinctOn);
|
|
READ_BOOL_FIELD(hasRecursive);
|
|
READ_BOOL_FIELD(hasModifyingCTE);
|
|
READ_BOOL_FIELD(hasForUpdate);
|
|
IF_EXIST(hasRowSecurity) {
|
|
READ_BOOL_FIELD(hasRowSecurity);
|
|
}
|
|
IF_EXIST(hasSynonyms) {
|
|
READ_BOOL_FIELD(hasSynonyms);
|
|
}
|
|
IF_EXIST(hasIgnore) {
|
|
READ_BOOL_FIELD(hasIgnore);
|
|
}
|
|
READ_NODE_FIELD(cteList);
|
|
READ_NODE_FIELD(rtable);
|
|
READ_NODE_FIELD(jointree);
|
|
READ_NODE_FIELD(targetList);
|
|
|
|
IF_EXIST(starStart) {
|
|
READ_NODE_FIELD(starStart);
|
|
}
|
|
|
|
IF_EXIST(starEnd) {
|
|
READ_NODE_FIELD(starEnd);
|
|
}
|
|
|
|
IF_EXIST(starOnly) {
|
|
READ_NODE_FIELD(starOnly);
|
|
}
|
|
|
|
READ_NODE_FIELD(returningList);
|
|
READ_NODE_FIELD(groupClause);
|
|
READ_NODE_FIELD(groupingSets);
|
|
READ_NODE_FIELD(havingQual);
|
|
READ_NODE_FIELD(windowClause);
|
|
READ_NODE_FIELD(distinctClause);
|
|
READ_NODE_FIELD(sortClause);
|
|
READ_NODE_FIELD(limitOffset);
|
|
READ_NODE_FIELD(limitCount);
|
|
READ_NODE_FIELD(rowMarks);
|
|
READ_NODE_FIELD(setOperations);
|
|
READ_NODE_FIELD(constraintDeps);
|
|
|
|
IF_EXIST(hintState) {
|
|
READ_NODE_FIELD(hintState);
|
|
}
|
|
|
|
#ifdef PGXC
|
|
IF_EXIST(sql_statement) {
|
|
READ_STRING_FIELD(sql_statement);
|
|
}
|
|
IF_EXIST(is_local) {
|
|
READ_BOOL_FIELD(is_local);
|
|
}
|
|
IF_EXIST(has_to_save_cmd_id) {
|
|
READ_BOOL_FIELD(has_to_save_cmd_id);
|
|
}
|
|
IF_EXIST(vec_output) {
|
|
READ_BOOL_FIELD(vec_output);
|
|
}
|
|
IF_EXIST(isTruncationCastAdded) { /* in order to deal history data when user execute data recovery */
|
|
(void*)pg_strtok(&length); /* skip :fldname */
|
|
token = pg_strtok(&length); /* get field value */
|
|
local_node->tdTruncCastStatus = (TdTruncCastStatus)(strtobool(token) ? 1 : 2);
|
|
}
|
|
IF_EXIST(tdTruncCastStatus) {
|
|
READ_ENUM_FIELD(tdTruncCastStatus, TdTruncCastStatus);
|
|
}
|
|
IF_EXIST(equalVars) {
|
|
READ_NODE_FIELD(equalVars);
|
|
}
|
|
#endif
|
|
|
|
IF_EXIST(mergeTarget_relation) {
|
|
READ_INT_FIELD(mergeTarget_relation);
|
|
}
|
|
IF_EXIST(mergeSourceTargetList) {
|
|
READ_NODE_FIELD(mergeSourceTargetList);
|
|
}
|
|
IF_EXIST(mergeActionList) {
|
|
READ_NODE_FIELD(mergeActionList);
|
|
}
|
|
IF_EXIST(upsertQuery) {
|
|
READ_NODE_FIELD(upsertQuery);
|
|
}
|
|
IF_EXIST(upsertClause) {
|
|
READ_NODE_FIELD(upsertClause);
|
|
}
|
|
IF_EXIST(isRowTriggerShippable) {
|
|
READ_BOOL_FIELD(isRowTriggerShippable);
|
|
}
|
|
IF_EXIST(use_star_targets) {
|
|
READ_BOOL_FIELD(use_star_targets);
|
|
}
|
|
IF_EXIST(is_from_full_join_rewrite) {
|
|
READ_BOOL_FIELD(use_star_targets);
|
|
}
|
|
IF_EXIST(can_push)
|
|
{
|
|
READ_BOOL_FIELD(can_push);
|
|
}
|
|
|
|
IF_EXIST(unique_check)
|
|
{
|
|
READ_BOOL_FIELD(unique_check);
|
|
}
|
|
IF_EXIST(resultRelations) {
|
|
READ_NODE_FIELD(resultRelations);
|
|
} else if (local_node->resultRelation != 0) {
|
|
local_node->resultRelations = list_make1_int(local_node->resultRelation);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readNotifyStmt
|
|
*/
|
|
static NotifyStmt* _readNotifyStmt(void)
|
|
{
|
|
READ_LOCALS(NotifyStmt);
|
|
|
|
READ_STRING_FIELD(conditionname);
|
|
READ_STRING_FIELD(payload);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readDeclareCursorStmt
|
|
*/
|
|
static DeclareCursorStmt* _readDeclareCursorStmt(void)
|
|
{
|
|
READ_LOCALS(DeclareCursorStmt);
|
|
|
|
READ_STRING_FIELD(portalname);
|
|
READ_INT_FIELD(options);
|
|
READ_NODE_FIELD(query);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static CopyStmt* _readCopyStmt(void)
|
|
{
|
|
READ_LOCALS(CopyStmt);
|
|
READ_NODE_FIELD(relation);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static AlterTableStmt* _readAlterTableStmt(void)
|
|
{
|
|
READ_LOCALS(AlterTableStmt);
|
|
READ_NODE_FIELD(relation);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static PLDebug_variable* _readPLDebug_variable(void)
|
|
{
|
|
READ_LOCALS(PLDebug_variable);
|
|
READ_STRING_FIELD(name);
|
|
READ_STRING_FIELD(var_type);
|
|
READ_STRING_FIELD(value);
|
|
READ_STRING_FIELD(pkgname);
|
|
READ_BOOL_FIELD(isconst);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static PLDebug_breakPoint* _readPLDebug_breakPoint(void)
|
|
{
|
|
READ_LOCALS(PLDebug_breakPoint);
|
|
READ_INT_FIELD(bpIndex);
|
|
READ_OID_FIELD(funcoid);
|
|
READ_INT_FIELD(lineno);
|
|
READ_STRING_FIELD(query);
|
|
READ_BOOL_FIELD(active);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static PLDebug_frame* _readPLDebug_frame(void)
|
|
{
|
|
READ_LOCALS(PLDebug_frame);
|
|
READ_INT_FIELD(frameno);
|
|
READ_STRING_FIELD(funcname);
|
|
READ_INT_FIELD(lineno);
|
|
READ_STRING_FIELD(query);
|
|
READ_INT_FIELD(funcoid);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readSortGroupClause
|
|
*/
|
|
static SortGroupClause* _readSortGroupClause(void)
|
|
{
|
|
READ_LOCALS(SortGroupClause);
|
|
|
|
READ_UINT_FIELD(tleSortGroupRef);
|
|
READ_OID_FIELD(eqop);
|
|
READ_OPINFO_FIELD(eqop);
|
|
READ_OID_FIELD(sortop);
|
|
READ_OPINFO_FIELD(sortop);
|
|
READ_BOOL_FIELD(nulls_first);
|
|
READ_BOOL_FIELD(hashable);
|
|
READ_BOOL_FIELD(groupSet);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readGroupingSet
|
|
*/
|
|
static GroupingSet* _readGroupingSet(void)
|
|
{
|
|
READ_LOCALS(GroupingSet);
|
|
|
|
READ_ENUM_FIELD(kind, GroupingSetKind);
|
|
READ_NODE_FIELD(content);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readWindowClause
|
|
*/
|
|
static WindowClause* _readWindowClause(void)
|
|
{
|
|
READ_LOCALS(WindowClause);
|
|
|
|
READ_STRING_FIELD(name);
|
|
READ_STRING_FIELD(refname);
|
|
READ_NODE_FIELD(partitionClause);
|
|
READ_NODE_FIELD(orderClause);
|
|
READ_INT_FIELD(frameOptions);
|
|
READ_NODE_FIELD(startOffset);
|
|
READ_NODE_FIELD(endOffset);
|
|
READ_UINT_FIELD(winref);
|
|
READ_BOOL_FIELD(copiedOrder);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readRowMarkClause
|
|
*/
|
|
static RowMarkClause* _readRowMarkClause(void)
|
|
{
|
|
READ_LOCALS(RowMarkClause);
|
|
|
|
READ_UINT_FIELD(rti);
|
|
READ_BOOL_FIELD(forUpdate);
|
|
IF_EXIST(waitSec) {
|
|
READ_INT_FIELD(waitSec);
|
|
}
|
|
|
|
IF_EXIST(waitPolicy) {
|
|
READ_ENUM_FIELD(waitPolicy, LockWaitPolicy);
|
|
}
|
|
/* convert noWait (true/false) to LockWaitPolicy (LockWaitError/LockWaitBlock) */
|
|
IF_EXIST(noWait) {
|
|
READ_ENUM_EXPR(waitPolicy, LockWaitPolicy, (strtobool(token) ? LockWaitError : LockWaitBlock));
|
|
}
|
|
READ_BOOL_FIELD(pushedDown);
|
|
IF_EXIST(strength) {
|
|
READ_ENUM_FIELD(strength, LockClauseStrength);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCommonTableExpr
|
|
*/
|
|
static CommonTableExpr* _readCommonTableExpr(void)
|
|
{
|
|
READ_LOCALS(CommonTableExpr);
|
|
|
|
READ_STRING_FIELD(ctename);
|
|
READ_NODE_FIELD(aliascolnames);
|
|
IF_EXIST(ctematerialized) {
|
|
READ_ENUM_FIELD(ctematerialized, CTEMaterialize);
|
|
}
|
|
READ_NODE_FIELD(ctequery);
|
|
READ_LOCATION_FIELD(location);
|
|
READ_BOOL_FIELD(cterecursive);
|
|
READ_INT_FIELD(cterefcount);
|
|
READ_NODE_FIELD(ctecolnames);
|
|
READ_NODE_FIELD(ctecoltypes);
|
|
READ_NODE_FIELD(ctecoltypmods);
|
|
READ_NODE_FIELD(ctecolcollations);
|
|
READ_TYPEINFO_LIST(ctecoltypes);
|
|
|
|
/*
|
|
* Set default value for locator_type, and we will set its real value
|
|
* in SS_process_ctes later.
|
|
*/
|
|
local_node->locator_type = LOCATOR_TYPE_NONE;
|
|
IF_EXIST(self_reference) {
|
|
READ_BOOL_FIELD(self_reference);
|
|
}
|
|
IF_EXIST(swoptions) {
|
|
READ_NODE_FIELD(swoptions);
|
|
}
|
|
IF_EXIST(referenced_by_subquery) {
|
|
READ_BOOL_FIELD(referenced_by_subquery);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readStartWithTargetRelInfo
|
|
*/
|
|
static StartWithTargetRelInfo* _readStartWithTargetRelInfo(void)
|
|
{
|
|
READ_LOCALS(StartWithTargetRelInfo);
|
|
|
|
READ_STRING_FIELD(relname);
|
|
READ_STRING_FIELD(aliasname);
|
|
READ_STRING_FIELD(ctename);
|
|
READ_NODE_FIELD(columns);
|
|
READ_NODE_FIELD(tblstmt);
|
|
|
|
READ_ENUM_FIELD(rtekind, RTEKind);
|
|
READ_NODE_FIELD(rte);
|
|
READ_NODE_FIELD(rtr);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readSetOperationStmt
|
|
*/
|
|
static SetOperationStmt* _readSetOperationStmt(void)
|
|
{
|
|
READ_LOCALS(SetOperationStmt);
|
|
|
|
READ_ENUM_FIELD(op, SetOperation);
|
|
READ_BOOL_FIELD(all);
|
|
READ_NODE_FIELD(larg);
|
|
READ_NODE_FIELD(rarg);
|
|
READ_NODE_FIELD(colTypes);
|
|
READ_NODE_FIELD(colTypmods);
|
|
READ_NODE_FIELD(colCollations);
|
|
READ_NODE_FIELD(groupClauses);
|
|
|
|
READ_TYPEINFO_LIST(colTypes);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* Stuff from primnodes.h.
|
|
*/
|
|
|
|
static Alias* _readAlias(void)
|
|
{
|
|
READ_LOCALS(Alias);
|
|
|
|
READ_STRING_FIELD(aliasname);
|
|
READ_NODE_FIELD(colnames);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static RangeVar* _readRangeVar(void)
|
|
{
|
|
READ_LOCALS(RangeVar);
|
|
|
|
local_node->catalogname = NULL; /* not currently saved in output
|
|
* format */
|
|
|
|
READ_STRING_FIELD(schemaname);
|
|
READ_STRING_FIELD(relname);
|
|
READ_STRING_FIELD(partitionname);
|
|
IF_EXIST(subpartitionname) {
|
|
READ_STRING_FIELD(subpartitionname);
|
|
}
|
|
READ_ENUM_FIELD(inhOpt, InhOption);
|
|
READ_CHAR_FIELD(relpersistence);
|
|
READ_NODE_FIELD(alias);
|
|
READ_LOCATION_FIELD(location);
|
|
READ_BOOL_FIELD(ispartition);
|
|
IF_EXIST(issubpartition) {
|
|
READ_BOOL_FIELD(issubpartition);
|
|
}
|
|
READ_NODE_FIELD(partitionKeyValuesList);
|
|
|
|
IF_EXIST(isbucket){
|
|
READ_BOOL_FIELD(isbucket);
|
|
}
|
|
|
|
IF_EXIST(buckets) {
|
|
READ_NODE_FIELD(buckets);
|
|
}
|
|
|
|
IF_EXIST(withVerExpr) {
|
|
READ_BOOL_FIELD(withVerExpr);
|
|
}
|
|
IF_EXIST(partitionNameList) {
|
|
READ_NODE_FIELD(partitionNameList);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
static IntoClause* _readIntoClause(void)
|
|
{
|
|
READ_LOCALS(IntoClause);
|
|
|
|
READ_NODE_FIELD(rel);
|
|
READ_NODE_FIELD(colNames);
|
|
READ_NODE_FIELD(options);
|
|
READ_ENUM_FIELD(onCommit, OnCommitAction);
|
|
READ_ENUM_FIELD(row_compress, RelCompressType);
|
|
READ_STRING_FIELD(tableSpaceName);
|
|
READ_BOOL_FIELD(skipData);
|
|
READ_CHAR_FIELD(relkind);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readVar
|
|
*/
|
|
static Var* _readVar(void)
|
|
{
|
|
READ_LOCALS(Var);
|
|
|
|
READ_UINT_FIELD(varno);
|
|
READ_INT_FIELD(varattno);
|
|
READ_OID_FIELD(vartype);
|
|
READ_INT_FIELD(vartypmod);
|
|
READ_OID_FIELD(varcollid);
|
|
READ_UINT_FIELD(varlevelsup);
|
|
READ_UINT_FIELD(varnoold);
|
|
READ_INT_FIELD(varoattno);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
/*
|
|
* recompute the vartype since inconsistent OID
|
|
* among coordinators and data nodes
|
|
*/
|
|
READ_TYPEINFO_FIELD(vartype);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readRownum
|
|
*/
|
|
static Rownum* _readRownum(void)
|
|
{
|
|
READ_LOCALS(Rownum);
|
|
|
|
READ_OID_FIELD(rownumcollid);
|
|
READ_LOCATION_FIELD(location);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readConst
|
|
*/
|
|
static Const* _readConst(void)
|
|
{
|
|
READ_LOCALS(Const);
|
|
|
|
READ_OID_FIELD(consttype);
|
|
READ_INT_FIELD(consttypmod);
|
|
READ_OID_FIELD(constcollid);
|
|
READ_INT_FIELD(constlen);
|
|
READ_BOOL_FIELD(constbyval);
|
|
READ_BOOL_FIELD(constisnull);
|
|
READ_BOOL_FIELD(ismaxvalue);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
/*
|
|
* WARNING: it have been modified it too times, for forward compatibility
|
|
* , we have to blame_outConst and make sure that all historical versions
|
|
* can be decode correctly
|
|
*/
|
|
|
|
/*
|
|
* try to decode data type oid for new version, in new version, data type
|
|
* name string is moved to the front of "constvalue"
|
|
*/
|
|
READ_TYPEINFO_FIELD(consttype);
|
|
|
|
IF_EXIST(constvalue) {
|
|
token = pg_strtok(&length); /* skip string "constvalue" */
|
|
if (local_node->ismaxvalue || local_node->constisnull) {
|
|
/* skip "<MAXVALUE>" / "<>" */
|
|
token = pg_strtok(&length);
|
|
} else IF_EXIST(udftypevalue) {
|
|
Oid typinput;
|
|
Oid typioparam;
|
|
Oid typid = local_node->consttype;
|
|
int32 typmode = local_node->consttypmod;
|
|
char* valueStr = NULL;
|
|
|
|
token = pg_strtok(&length); /* skip string "udftypevalue" */
|
|
token = pg_strtok(&length); /* read value string */
|
|
valueStr = nullable_string(token, length);
|
|
|
|
/* translate data string to Datum */
|
|
getTypeInputInfo(typid, &typinput, &typioparam);
|
|
local_node->constvalue = OidInputFunctionCall(typinput, valueStr, typioparam, typmode);
|
|
} else {
|
|
/*
|
|
* 1. compatible with previous versions if oid >= FirstBootstrapObjectId
|
|
* 2. for internel type with oid < FirstBootstrapObjectId
|
|
*/
|
|
local_node->constvalue = readDatum(local_node->constbyval);
|
|
}
|
|
}
|
|
|
|
/* read conttype again to compatible with previous versions */
|
|
READ_TYPEINFO_FIELD(consttype);
|
|
READ_CFGINFO_FIELD(consttype, constvalue);
|
|
|
|
IF_EXIST(cursor_data) {
|
|
token = pg_strtok(&length); /* skip white space */
|
|
_readCursorData(&local_node->cursor_data);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readParam
|
|
*/
|
|
static Param* _readParam(void)
|
|
{
|
|
READ_LOCALS(Param);
|
|
|
|
READ_ENUM_FIELD(paramkind, ParamKind);
|
|
READ_INT_FIELD(paramid);
|
|
READ_OID_FIELD(paramtype);
|
|
READ_INT_FIELD(paramtypmod);
|
|
READ_OID_FIELD(paramcollid);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(paramtype);
|
|
IF_EXIST(tableOfIndexType)
|
|
{
|
|
READ_OID_FIELD(tableOfIndexType);
|
|
}
|
|
IF_EXIST(recordVarTypOid)
|
|
{
|
|
READ_OID_FIELD(recordVarTypOid);
|
|
}
|
|
IF_EXIST(tableOfIndexTypeList)
|
|
{
|
|
READ_NODE_FIELD(tableOfIndexTypeList);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readAggref
|
|
*/
|
|
static Aggref* _readAggref(void)
|
|
{
|
|
READ_LOCALS(Aggref);
|
|
READ_OID_FIELD(aggfnoid);
|
|
#ifdef ENABLE_MULTIPLE_NODES
|
|
token = pg_strtok(&length, false); /* name: pronamespace */
|
|
if (token != NULL && (0 == memcmp(token, ":pronamespace", strlen(":pronamespace")))) {
|
|
// shipping out for dn, oid will be different on dn, so proname and pronamespace string will be must.
|
|
char* proname = NULL;
|
|
char* pronamespace = NULL;
|
|
char* rettypenamespace = NULL;
|
|
char* rettypename = NULL;
|
|
Oid namespace_oid = 0;
|
|
Oid type_namespace_oid = 0;
|
|
Oid rettype = 0;
|
|
int nargs = 0;
|
|
Oid* argtypes = NULL;
|
|
|
|
token = pg_strtok(&length); /* skip name: pronamespace */
|
|
token = pg_strtok(&length); /* get pronamespace value */
|
|
pronamespace = nullable_string(token, length);
|
|
namespace_oid = get_namespace_oid(pronamespace, false);
|
|
token = pg_strtok(&length); /* skip name: proname */
|
|
token = pg_strtok(&length); /* get proname value */
|
|
proname = nullable_string(token, length);
|
|
|
|
token = pg_strtok(&length); /* skip name: rettypenamespace */
|
|
token = pg_strtok(&length); /* get rettypenamespace value */
|
|
rettypenamespace = nullable_string(token, length);
|
|
type_namespace_oid = get_namespace_oid(rettypenamespace, false);
|
|
|
|
token = pg_strtok(&length); /* skip name: rettypename */
|
|
token = pg_strtok(&length); /* get rettypename value */
|
|
rettypename = nullable_string(token, length);
|
|
|
|
rettype = get_typeoid(type_namespace_oid, rettypename);
|
|
|
|
token = pg_strtok(&length); /* skip name: pronargs */
|
|
token = pg_strtok(&length); /* get pronargs value */
|
|
nargs = atoi(token);
|
|
|
|
argtypes = (Oid*)palloc(nargs * sizeof(Oid));
|
|
token = pg_strtok(&length); /* skip name: proargs */
|
|
for (int i = 0; i < nargs; i++) {
|
|
char* argtypenamespace = NULL;
|
|
char* argtypename = NULL;
|
|
Oid arg_type_namespace_oid = 0;
|
|
Oid argtype = 0;
|
|
token = pg_strtok(&length); /* get argtypenamespace value */
|
|
argtypenamespace = nullable_string(token, length);
|
|
arg_type_namespace_oid = get_namespace_oid(argtypenamespace, false);
|
|
|
|
token = pg_strtok(&length); /* get argtypename value */
|
|
argtypename = nullable_string(token, length);
|
|
|
|
argtype = get_typeoid(arg_type_namespace_oid, argtypename);
|
|
argtypes[i] = argtype;
|
|
}
|
|
local_node->aggfnoid = get_func_oid_ext(proname, namespace_oid, rettype, nargs, argtypes);
|
|
}
|
|
#endif /* ENABLE_MULTIPLE_NODES */
|
|
READ_OID_FIELD(aggtype);
|
|
#ifdef PGXC
|
|
READ_OID_FIELD(aggtrantype);
|
|
READ_BOOL_FIELD(agghas_collectfn);
|
|
READ_INT_FIELD(aggstage);
|
|
#endif /* PGXC */
|
|
READ_OID_FIELD(aggcollid);
|
|
READ_OID_FIELD(inputcollid);
|
|
IF_EXIST(aggdirectargs)
|
|
{
|
|
READ_NODE_FIELD(aggdirectargs);
|
|
}
|
|
READ_NODE_FIELD(args);
|
|
READ_NODE_FIELD(aggorder);
|
|
READ_NODE_FIELD(aggdistinct);
|
|
READ_BOOL_FIELD(aggstar);
|
|
IF_EXIST(aggkind)
|
|
{
|
|
READ_CHAR_FIELD(aggkind);
|
|
}
|
|
IF_EXIST(aggvariadic)
|
|
{
|
|
READ_BOOL_FIELD(aggvariadic);
|
|
}
|
|
READ_UINT_FIELD(agglevelsup);
|
|
READ_LOCATION_FIELD(location);
|
|
READ_TYPEINFO_FIELD(aggtype);
|
|
READ_TYPEINFO_FIELD(aggtrantype);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readGroupingFunc
|
|
*/
|
|
static GroupingFunc* _readGroupingFunc(void)
|
|
{
|
|
READ_LOCALS(GroupingFunc);
|
|
|
|
READ_NODE_FIELD(args);
|
|
READ_NODE_FIELD(refs);
|
|
READ_NODE_FIELD(cols);
|
|
READ_UINT_FIELD(agglevelsup);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static GroupingId* _readGroupingId(void)
|
|
{
|
|
READ_LOCALS_NO_FIELDS(GroupingId);
|
|
|
|
READ_END();
|
|
}
|
|
|
|
/*
|
|
* _readWindowFunc
|
|
*/
|
|
static WindowFunc* _readWindowFunc(void)
|
|
{
|
|
READ_LOCALS(WindowFunc);
|
|
|
|
READ_OID_FIELD(winfnoid);
|
|
READ_OID_FIELD(wintype);
|
|
READ_OID_FIELD(wincollid);
|
|
READ_OID_FIELD(inputcollid);
|
|
READ_NODE_FIELD(args);
|
|
READ_UINT_FIELD(winref);
|
|
READ_BOOL_FIELD(winstar);
|
|
READ_BOOL_FIELD(winagg);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(wintype);
|
|
READ_FUNCINFO_FIELD(winfnoid);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readArrayRef
|
|
*/
|
|
static ArrayRef* _readArrayRef(void)
|
|
{
|
|
READ_LOCALS(ArrayRef);
|
|
|
|
READ_OID_FIELD(refarraytype);
|
|
READ_OID_FIELD(refelemtype);
|
|
READ_INT_FIELD(reftypmod);
|
|
READ_OID_FIELD(refcollid);
|
|
READ_NODE_FIELD(refupperindexpr);
|
|
READ_NODE_FIELD(reflowerindexpr);
|
|
READ_NODE_FIELD(refexpr);
|
|
READ_NODE_FIELD(refassgnexpr);
|
|
|
|
READ_TYPEINFO_FIELD(refarraytype);
|
|
READ_TYPEINFO_FIELD(refelemtype);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readFuncExpr
|
|
*/
|
|
static FuncExpr* _readFuncExpr(void)
|
|
{
|
|
READ_LOCALS(FuncExpr);
|
|
|
|
READ_OID_FIELD(funcid);
|
|
READ_OID_FIELD(funcresulttype);
|
|
IF_EXIST(funcresulttype_orig) {
|
|
READ_INT_FIELD(funcresulttype_orig);
|
|
}
|
|
READ_BOOL_FIELD(funcretset);
|
|
READ_ENUM_FIELD(funcformat, CoercionForm);
|
|
READ_OID_FIELD(funccollid);
|
|
READ_OID_FIELD(inputcollid);
|
|
READ_NODE_FIELD(args);
|
|
token = pg_strtok(&length);
|
|
char* fieldName = nullable_string(token, length);
|
|
|
|
if (fieldName != NULL && pg_strcasecmp(fieldName, ":seqName") == 0 && local_node->funcid == NEXTVALFUNCOID) {
|
|
char* seqName = NULL;
|
|
char* seqNamespace = NULL;
|
|
token = pg_strtok(&length);
|
|
seqName = nullable_string(token, length);
|
|
|
|
if (seqName == NULL) {
|
|
ereport(ERROR, (errcode(ERRCODE_UNEXPECTED_NULL_VALUE), errmsg("NULL seqName for nextval()")));
|
|
}
|
|
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
seqNamespace = nullable_string(token, length);
|
|
|
|
if (seqNamespace == NULL) {
|
|
Assert(false);
|
|
ereport(ERROR, (errcode(ERRCODE_UNEXPECTED_NULL_VALUE), errmsg("NULL seqNamespace for nextval()")));
|
|
}
|
|
|
|
if (IS_DATANODE_BUT_NOT_SINGLENODE && !skip_read_extern_fields) {
|
|
|
|
Oid seqid = get_valid_relname_relid(seqNamespace, seqName, true);
|
|
Const* firstArg = (Const*)linitial(local_node->args);
|
|
if (OidIsValid(seqid)) {
|
|
if (firstArg != NULL) {
|
|
firstArg->constvalue = ObjectIdGetDatum(seqid);
|
|
}
|
|
} else {
|
|
ereport(ERROR, (errmodule(MOD_OPT), errcode(ERRCODE_UNDEFINED_OBJECT),
|
|
errmsg("Cannot identify sequence %s.%s while deserializing field.", seqNamespace, seqName),
|
|
errdetail("Sequence with oid %u or its namespace may be renamed",
|
|
DatumGetObjectId(firstArg->constvalue)),
|
|
errhint("Please rebuild column defalt expression, views etc. that are related to this sequence"),
|
|
errcause("Object renamed after recorded as nodetree."), erraction("Rebuild relevant object.")));
|
|
}
|
|
}
|
|
pfree_ext(seqName);
|
|
pfree_ext(seqNamespace);
|
|
READ_LOCATION_FIELD(location);
|
|
} else {
|
|
token = pg_strtok(&length);
|
|
local_node->location = atoi(token);
|
|
}
|
|
|
|
IF_EXIST(refSynOid) {
|
|
READ_OID_FIELD(refSynOid);
|
|
}
|
|
|
|
READ_TYPEINFO_FIELD(funcresulttype);
|
|
READ_FUNCINFO_FIELD(funcid);
|
|
/*
|
|
* Same reason as above, get synOid for distribution plan.
|
|
*/
|
|
READ_SYNINFO_FILED(refSynOid);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readNamedArgExpr
|
|
*/
|
|
static NamedArgExpr* _readNamedArgExpr(void)
|
|
{
|
|
READ_LOCALS(NamedArgExpr);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_STRING_FIELD(name);
|
|
READ_INT_FIELD(argnumber);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readOpExpr
|
|
*/
|
|
static OpExpr* _readOpExpr(void)
|
|
{
|
|
READ_LOCALS(OpExpr);
|
|
|
|
READ_EXPR_FIELD();
|
|
}
|
|
|
|
/*
|
|
* _readDistinctExpr
|
|
*/
|
|
static DistinctExpr* _readDistinctExpr(void)
|
|
{
|
|
READ_LOCALS(DistinctExpr);
|
|
|
|
READ_EXPR_FIELD();
|
|
}
|
|
|
|
/*
|
|
* _readNullIfExpr
|
|
*/
|
|
static NullIfExpr* _readNullIfExpr(void)
|
|
{
|
|
READ_LOCALS(NullIfExpr);
|
|
|
|
READ_EXPR_FIELD();
|
|
}
|
|
|
|
/*
|
|
* _readScalarArrayOpExpr
|
|
*/
|
|
static ScalarArrayOpExpr* _readScalarArrayOpExpr(void)
|
|
{
|
|
READ_LOCALS(ScalarArrayOpExpr);
|
|
|
|
READ_OID_FIELD(opno);
|
|
READ_OPINFO_FIELD(opno);
|
|
READ_OID_FIELD(opfuncid);
|
|
READ_FUNCINFO_FIELD(opfuncid);
|
|
|
|
/*
|
|
* The opfuncid is stored in the textual format primarily for debugging
|
|
* and documentation reasons. We want to always read it as zero to force
|
|
* it to be re-looked-up in the pg_operator entry. This ensures that
|
|
* stored rules don't have hidden dependencies on operators' functions.
|
|
* (We don't currently support an ALTER OPERATOR command, but might
|
|
* someday.)
|
|
*/
|
|
|
|
// Until PteroDB supports ALTER OPERATOR let's comment this to make
|
|
// Plan shipping work
|
|
READ_BOOL_FIELD(useOr);
|
|
READ_OID_FIELD(inputcollid);
|
|
READ_NODE_FIELD(args);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readBoolExpr
|
|
*/
|
|
static BoolExpr* _readBoolExpr(void)
|
|
{
|
|
READ_LOCALS(BoolExpr);
|
|
|
|
/* do-it-yourself enum representation */
|
|
token = pg_strtok(&length); /* skip :boolop */
|
|
token = pg_strtok(&length); /* get field value */
|
|
if (strncmp(token, "and", 3) == 0)
|
|
local_node->boolop = AND_EXPR;
|
|
else if (strncmp(token, "or", 2) == 0)
|
|
local_node->boolop = OR_EXPR;
|
|
else if (strncmp(token, "not", 3) == 0)
|
|
local_node->boolop = NOT_EXPR;
|
|
else
|
|
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unrecognized boolop \"%.*s\"", length, token)));
|
|
|
|
READ_NODE_FIELD(args);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readSubLink
|
|
*/
|
|
static SubLink* _readSubLink(void)
|
|
{
|
|
READ_LOCALS(SubLink);
|
|
|
|
READ_ENUM_FIELD(subLinkType, SubLinkType);
|
|
READ_NODE_FIELD(testexpr);
|
|
READ_NODE_FIELD(operName);
|
|
READ_NODE_FIELD(subselect);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readMergeStmt
|
|
*/
|
|
static MergeStmt* _readMergeStmt(void)
|
|
{
|
|
READ_LOCALS(MergeStmt);
|
|
|
|
READ_NODE_FIELD(relation);
|
|
READ_NODE_FIELD(source_relation);
|
|
READ_NODE_FIELD(join_condition);
|
|
READ_NODE_FIELD(mergeWhenClauses);
|
|
READ_BOOL_FIELD(is_insert_update);
|
|
READ_NODE_FIELD(insert_stmt);
|
|
IF_EXIST(hintState) {
|
|
READ_NODE_FIELD(hintState);
|
|
};
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readSubPlan is not needed since it doesn't appear in stored rules.
|
|
*/
|
|
|
|
/*
|
|
* _readFieldSelect
|
|
*/
|
|
static FieldSelect* _readFieldSelect(void)
|
|
{
|
|
READ_LOCALS(FieldSelect);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_INT_FIELD(fieldnum);
|
|
READ_OID_FIELD(resulttype);
|
|
READ_INT_FIELD(resulttypmod);
|
|
READ_OID_FIELD(resultcollid);
|
|
|
|
READ_TYPEINFO_FIELD(resulttype);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readFieldStore
|
|
*/
|
|
static FieldStore* _readFieldStore(void)
|
|
{
|
|
READ_LOCALS(FieldStore);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_NODE_FIELD(newvals);
|
|
READ_NODE_FIELD(fieldnums);
|
|
READ_OID_FIELD(resulttype);
|
|
|
|
READ_TYPEINFO_FIELD(resulttype);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readRelabelType
|
|
*/
|
|
static RelabelType* _readRelabelType(void)
|
|
{
|
|
READ_LOCALS(RelabelType);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_OID_FIELD(resulttype);
|
|
READ_INT_FIELD(resulttypmod);
|
|
READ_OID_FIELD(resultcollid);
|
|
READ_ENUM_FIELD(relabelformat, CoercionForm);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(resulttype);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCoerceViaIO
|
|
*/
|
|
static CoerceViaIO* _readCoerceViaIO(void)
|
|
{
|
|
READ_LOCALS(CoerceViaIO);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_OID_FIELD(resulttype);
|
|
READ_OID_FIELD(resultcollid);
|
|
READ_ENUM_FIELD(coerceformat, CoercionForm);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(resulttype);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readArrayCoerceExpr
|
|
*/
|
|
static ArrayCoerceExpr* _readArrayCoerceExpr(void)
|
|
{
|
|
READ_LOCALS(ArrayCoerceExpr);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_OID_FIELD(elemfuncid);
|
|
READ_OID_FIELD(resulttype);
|
|
READ_INT_FIELD(resulttypmod);
|
|
READ_OID_FIELD(resultcollid);
|
|
READ_BOOL_FIELD(isExplicit);
|
|
READ_ENUM_FIELD(coerceformat, CoercionForm);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(resulttype);
|
|
READ_FUNCINFO_FIELD(elemfuncid);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readConvertRowtypeExpr
|
|
*/
|
|
static ConvertRowtypeExpr* _readConvertRowtypeExpr(void)
|
|
{
|
|
READ_LOCALS(ConvertRowtypeExpr);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_OID_FIELD(resulttype);
|
|
READ_ENUM_FIELD(convertformat, CoercionForm);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(resulttype);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCollateExpr
|
|
*/
|
|
static CollateExpr* _readCollateExpr(void)
|
|
{
|
|
READ_LOCALS(CollateExpr);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_OID_FIELD(collOid);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
// Note that this section must be modified if _outCollateExpr changes
|
|
if (local_node->collOid >= FirstBootstrapObjectId) {
|
|
IF_EXIST(collname) {
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
char* collname = nullable_string(token, length);
|
|
Assert(collname != NULL);
|
|
if (!IS_PGXC_COORDINATOR) {
|
|
List* collnameList = list_make1(makeString(collname));
|
|
local_node->collOid = get_collation_oid(collnameList, false);
|
|
list_free_ext(collnameList);
|
|
}
|
|
if (NULL != collname)
|
|
pfree_ext(collname);
|
|
}
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCaseExpr
|
|
*/
|
|
static CaseExpr* _readCaseExpr(void)
|
|
{
|
|
READ_LOCALS(CaseExpr);
|
|
|
|
READ_OID_FIELD(casetype);
|
|
READ_OID_FIELD(casecollid);
|
|
READ_NODE_FIELD(arg);
|
|
READ_NODE_FIELD(args);
|
|
READ_NODE_FIELD(defresult);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(casetype);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCaseWhen
|
|
*/
|
|
static CaseWhen* _readCaseWhen(void)
|
|
{
|
|
READ_LOCALS(CaseWhen);
|
|
|
|
READ_NODE_FIELD(expr);
|
|
READ_NODE_FIELD(result);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCaseTestExpr
|
|
*/
|
|
static CaseTestExpr* _readCaseTestExpr(void)
|
|
{
|
|
READ_LOCALS(CaseTestExpr);
|
|
|
|
READ_OID_FIELD(typeId);
|
|
READ_INT_FIELD(typeMod);
|
|
READ_OID_FIELD(collation);
|
|
|
|
READ_TYPEINFO_FIELD(typeId);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readArrayExpr
|
|
*/
|
|
static ArrayExpr* _readArrayExpr(void)
|
|
{
|
|
READ_LOCALS(ArrayExpr);
|
|
|
|
READ_OID_FIELD(array_typeid);
|
|
READ_OID_FIELD(array_collid);
|
|
READ_OID_FIELD(element_typeid);
|
|
READ_NODE_FIELD(elements);
|
|
READ_BOOL_FIELD(multidims);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(array_typeid);
|
|
READ_TYPEINFO_FIELD(element_typeid);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readRowExpr
|
|
*/
|
|
static RowExpr* _readRowExpr(void)
|
|
{
|
|
READ_LOCALS(RowExpr);
|
|
|
|
READ_NODE_FIELD(args);
|
|
READ_OID_FIELD(row_typeid);
|
|
READ_ENUM_FIELD(row_format, CoercionForm);
|
|
READ_NODE_FIELD(colnames);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(row_typeid);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readRowCompareExpr
|
|
*/
|
|
static RowCompareExpr* _readRowCompareExpr(void)
|
|
{
|
|
READ_LOCALS(RowCompareExpr);
|
|
|
|
READ_ENUM_FIELD(rctype, RowCompareType);
|
|
READ_NODE_FIELD(opnos);
|
|
READ_NODE_FIELD(opfamilies);
|
|
READ_NODE_FIELD(inputcollids);
|
|
READ_NODE_FIELD(largs);
|
|
READ_NODE_FIELD(rargs);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCoalesceExpr
|
|
*/
|
|
static CoalesceExpr* _readCoalesceExpr(void)
|
|
{
|
|
READ_LOCALS(CoalesceExpr);
|
|
|
|
READ_OID_FIELD(coalescetype);
|
|
READ_OID_FIELD(coalescecollid);
|
|
READ_NODE_FIELD(args);
|
|
READ_LOCATION_FIELD(location);
|
|
READ_BOOL_FIELD(isnvl);
|
|
|
|
READ_TYPEINFO_FIELD(coalescetype);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readMinMaxExpr
|
|
*/
|
|
static MinMaxExpr* _readMinMaxExpr(void)
|
|
{
|
|
READ_LOCALS(MinMaxExpr);
|
|
|
|
READ_OID_FIELD(minmaxtype);
|
|
READ_OID_FIELD(minmaxcollid);
|
|
READ_OID_FIELD(inputcollid);
|
|
READ_ENUM_FIELD(op, MinMaxOp);
|
|
READ_NODE_FIELD(args);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(minmaxtype);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readXmlExpr
|
|
*/
|
|
static XmlExpr* _readXmlExpr(void)
|
|
{
|
|
READ_LOCALS(XmlExpr);
|
|
|
|
READ_ENUM_FIELD(op, XmlExprOp);
|
|
READ_STRING_FIELD(name);
|
|
READ_NODE_FIELD(named_args);
|
|
READ_NODE_FIELD(arg_names);
|
|
READ_NODE_FIELD(args);
|
|
READ_ENUM_FIELD(xmloption, XmlOptionType);
|
|
READ_OID_FIELD(type);
|
|
READ_INT_FIELD(typmod);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(type);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readNullTest
|
|
*/
|
|
static NullTest* _readNullTest(void)
|
|
{
|
|
READ_LOCALS(NullTest);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_ENUM_FIELD(nulltesttype, NullTestType);
|
|
READ_BOOL_FIELD(argisrow);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readSetVariableExpr
|
|
*/
|
|
static SetVariableExpr* _readSetVariableExpr(void)
|
|
{
|
|
READ_LOCALS(SetVariableExpr);
|
|
|
|
READ_NODE_FIELD(value);
|
|
READ_STRING_FIELD(name);
|
|
READ_BOOL_FIELD(is_session);
|
|
READ_BOOL_FIELD(is_global);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readHashFilter
|
|
*/
|
|
static HashFilter* _readHashFilter(void)
|
|
{
|
|
READ_LOCALS(HashFilter);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_NODE_FIELD(typeOids);
|
|
READ_NODE_FIELD(nodeList);
|
|
|
|
READ_TYPEINFO_LIST(typeOids);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readBooleanTest
|
|
*/
|
|
static BooleanTest* _readBooleanTest(void)
|
|
{
|
|
READ_LOCALS(BooleanTest);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_ENUM_FIELD(booltesttype, BoolTestType);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCoerceToDomain
|
|
*/
|
|
static CoerceToDomain* _readCoerceToDomain(void)
|
|
{
|
|
READ_LOCALS(CoerceToDomain);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_OID_FIELD(resulttype);
|
|
READ_INT_FIELD(resulttypmod);
|
|
READ_OID_FIELD(resultcollid);
|
|
READ_ENUM_FIELD(coercionformat, CoercionForm);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(resulttype);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCoerceToDomainValue
|
|
*/
|
|
static CoerceToDomainValue* _readCoerceToDomainValue(void)
|
|
{
|
|
READ_LOCALS(CoerceToDomainValue);
|
|
|
|
READ_OID_FIELD(typeId);
|
|
READ_INT_FIELD(typeMod);
|
|
READ_OID_FIELD(collation);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(typeId);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readSetToDefault
|
|
*/
|
|
static SetToDefault* _readSetToDefault(void)
|
|
{
|
|
READ_LOCALS(SetToDefault);
|
|
|
|
READ_OID_FIELD(typeId);
|
|
READ_INT_FIELD(typeMod);
|
|
READ_OID_FIELD(collation);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_TYPEINFO_FIELD(typeId);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readCurrentOfExpr
|
|
*/
|
|
static CurrentOfExpr* _readCurrentOfExpr(void)
|
|
{
|
|
READ_LOCALS(CurrentOfExpr);
|
|
|
|
READ_UINT_FIELD(cvarno);
|
|
READ_STRING_FIELD(cursor_name);
|
|
READ_INT_FIELD(cursor_param);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readTargetEntry
|
|
*/
|
|
static TargetEntry* _readTargetEntry(void)
|
|
{
|
|
READ_LOCALS(TargetEntry);
|
|
|
|
READ_NODE_FIELD(expr);
|
|
READ_INT_FIELD(resno);
|
|
READ_STRING_FIELD(resname);
|
|
READ_UINT_FIELD(ressortgroupref);
|
|
READ_OID_FIELD(resorigtbl);
|
|
READ_INT_FIELD(resorigcol);
|
|
READ_BOOL_FIELD(resjunk);
|
|
IF_EXIST(rtindex) {
|
|
READ_UINT_FIELD(rtindex);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readPseudoTargetEntry
|
|
*/
|
|
static PseudoTargetEntry* _readPseudoTargetEntry(void)
|
|
{
|
|
READ_LOCALS(PseudoTargetEntry);
|
|
|
|
READ_NODE_FIELD(tle);
|
|
READ_NODE_FIELD(srctle);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readRangeTblRef
|
|
*/
|
|
static RangeTblRef* _readRangeTblRef(void)
|
|
{
|
|
READ_LOCALS(RangeTblRef);
|
|
|
|
READ_INT_FIELD(rtindex);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readJoinExpr
|
|
*/
|
|
static JoinExpr* _readJoinExpr(void)
|
|
{
|
|
READ_LOCALS(JoinExpr);
|
|
|
|
READ_ENUM_FIELD(jointype, JoinType);
|
|
READ_BOOL_FIELD(isNatural);
|
|
READ_NODE_FIELD(larg);
|
|
READ_NODE_FIELD(rarg);
|
|
READ_NODE_FIELD(usingClause);
|
|
READ_NODE_FIELD(quals);
|
|
READ_NODE_FIELD(alias);
|
|
READ_INT_FIELD(rtindex);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readFromExpr
|
|
*/
|
|
static FromExpr* _readFromExpr(void)
|
|
{
|
|
READ_LOCALS(FromExpr);
|
|
|
|
READ_NODE_FIELD(fromlist);
|
|
READ_NODE_FIELD(quals);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readMergeAction
|
|
*/
|
|
static MergeAction* _readMergeAction(void)
|
|
{
|
|
READ_LOCALS(MergeAction);
|
|
|
|
READ_BOOL_FIELD(matched);
|
|
READ_NODE_FIELD(qual);
|
|
READ_ENUM_FIELD(commandType, CmdType);
|
|
READ_NODE_FIELD(targetList);
|
|
READ_NODE_FIELD(pulluped_targetList);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* Stuff from parsenodes.h.
|
|
*/
|
|
|
|
/*
|
|
* _readRangeTblEntry
|
|
*/
|
|
static RangeTblEntry* _readRangeTblEntry(void)
|
|
{
|
|
READ_LOCALS(RangeTblEntry);
|
|
|
|
/* put alias + eref first to make dump more legible */
|
|
READ_NODE_FIELD(alias);
|
|
READ_NODE_FIELD(eref);
|
|
READ_ENUM_FIELD(rtekind, RTEKind);
|
|
#ifdef PGXC
|
|
READ_STRING_FIELD(relname);
|
|
READ_NODE_FIELD(partAttrNum);
|
|
#endif
|
|
|
|
token = pg_strtok(&length, false);
|
|
if (token != NULL && (0 == memcmp(token, ":mainRelName", strlen(":mainRelName")))) {
|
|
READ_STRING_FIELD(mainRelName);
|
|
}
|
|
|
|
token = pg_strtok(&length, false);
|
|
if (token != NULL && (0 == memcmp(token, ":mainRelNameSpace", strlen(":mainRelNameSpace")))) {
|
|
READ_STRING_FIELD(mainRelNameSpace);
|
|
}
|
|
|
|
switch (local_node->rtekind) {
|
|
case RTE_RELATION:
|
|
READ_OID_FIELD(relid);
|
|
READ_CHAR_FIELD(relkind);
|
|
READ_BOOL_FIELD(isResultRel);
|
|
token = pg_strtok(&length, false);
|
|
if (token != NULL && (0 == memcmp(token, ":tablesample", strlen(":tablesample")))) {
|
|
READ_NODE_FIELD(tablesample);
|
|
}
|
|
|
|
IF_EXIST(timecapsule) {
|
|
READ_NODE_FIELD(timecapsule);
|
|
}
|
|
|
|
READ_OID_FIELD(partitionOid);
|
|
READ_BOOL_FIELD(isContainPartition);
|
|
IF_EXIST(subpartitionOid) {
|
|
READ_OID_FIELD(subpartitionOid);
|
|
}
|
|
IF_EXIST(isContainSubPartition) {
|
|
READ_BOOL_FIELD(isContainSubPartition);
|
|
}
|
|
|
|
IF_EXIST(refSynOid)
|
|
{
|
|
READ_OID_FIELD(refSynOid);
|
|
}
|
|
|
|
READ_BOOL_FIELD(ispartrel);
|
|
|
|
token = pg_strtok(&length, false);
|
|
if (token != NULL && (0 == memcmp(token, ":ignoreResetRelid", strlen(":ignoreResetRelid")))) {
|
|
READ_BOOL_FIELD(ignoreResetRelid);
|
|
}
|
|
|
|
READ_NODE_FIELD(pname);
|
|
READ_NODE_FIELD(partid_list);
|
|
READ_NODE_FIELD(plist);
|
|
/*
|
|
* Note: The Oid shipped(in plan) is invalid here
|
|
* We need to get the Oid on this node.
|
|
*/
|
|
if (local_node->relid >= FirstBootstrapObjectId && !local_node->ignoreResetRelid) {
|
|
char* relname = NULL;
|
|
char* relnamespace = NULL;
|
|
Oid deltaRelId = InvalidOid;
|
|
if (local_node->mainRelName != NULL) {
|
|
char* mainRelName = pstrdup(local_node->mainRelName);
|
|
char* mainRelNameSpace = pstrdup(local_node->mainRelNameSpace);
|
|
|
|
Oid relid = get_valid_relname_relid(mainRelNameSpace, mainRelName);
|
|
|
|
Relation mianRel = relation_open(relid, AccessShareLock);
|
|
|
|
deltaRelId = RelationGetDeltaRelId(mianRel);
|
|
|
|
relation_close(mianRel, AccessShareLock);
|
|
pfree_ext(mainRelName);
|
|
pfree_ext(mainRelNameSpace);
|
|
|
|
} else {
|
|
IF_EXIST(relname) {
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
relname = nullable_string(token, length);
|
|
if (relname == NULL) {
|
|
Assert(false);
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_UNEXPECTED_NULL_VALUE),
|
|
errmsg("NULL relname for RTE %u found", local_node->relid)));
|
|
}
|
|
}
|
|
IF_EXIST(relnamespace) {
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
relnamespace = nullable_string(token, length);
|
|
if (relnamespace == NULL) {
|
|
Assert(false);
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_UNEXPECTED_NULL_VALUE),
|
|
errmsg("NULL relnamespace for RTE %u found", local_node->relid)));
|
|
}
|
|
}
|
|
/*
|
|
* Same reason as above, get synOid for distribution plan.
|
|
*/
|
|
READ_SYNINFO_FILED(refSynOid);
|
|
}
|
|
|
|
/*
|
|
* 1. As get oid here is for distributed plan, we don't need get oid in restoremode which just for
|
|
* single node execution.
|
|
* 2. Get oid through relnamespace and relname is not reliable as this messages stored in nodes will not
|
|
* update properly, like nodes messages in pg_rewrite for views.
|
|
*/
|
|
#ifdef ENABLE_MULTIPLE_NODES
|
|
if (!IS_PGXC_COORDINATOR && !isRestoreMode) {
|
|
Oid relid = InvalidOid;
|
|
if (!OidIsValid(deltaRelId) && relname != NULL && relnamespace != NULL) {
|
|
relid = get_valid_relname_relid(relnamespace, relname);
|
|
|
|
pfree_ext(relname);
|
|
pfree_ext(relnamespace);
|
|
} else {
|
|
relid = deltaRelId;
|
|
}
|
|
|
|
if (OidIsValid(relid)) {
|
|
local_node->relid = relid;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
break;
|
|
case RTE_SUBQUERY:
|
|
READ_NODE_FIELD(subquery);
|
|
READ_BOOL_FIELD(security_barrier);
|
|
break;
|
|
case RTE_JOIN:
|
|
READ_ENUM_FIELD(jointype, JoinType);
|
|
READ_NODE_FIELD(joinaliasvars);
|
|
break;
|
|
case RTE_FUNCTION:
|
|
READ_NODE_FIELD(funcexpr);
|
|
READ_NODE_FIELD(funccoltypes);
|
|
READ_NODE_FIELD(funccoltypmods);
|
|
READ_NODE_FIELD(funccolcollations);
|
|
|
|
READ_TYPEINFO_LIST(funccoltypes);
|
|
break;
|
|
case RTE_VALUES:
|
|
READ_NODE_FIELD(values_lists);
|
|
READ_NODE_FIELD(values_collations);
|
|
break;
|
|
case RTE_CTE:
|
|
READ_STRING_FIELD(ctename);
|
|
READ_UINT_FIELD(ctelevelsup);
|
|
READ_BOOL_FIELD(self_reference);
|
|
IF_EXIST(cterecursive) {
|
|
READ_BOOL_FIELD(cterecursive);
|
|
}
|
|
READ_NODE_FIELD(ctecoltypes);
|
|
READ_NODE_FIELD(ctecoltypmods);
|
|
READ_NODE_FIELD(ctecolcollations);
|
|
|
|
IF_EXIST(swConverted) {
|
|
READ_BOOL_FIELD(swConverted);
|
|
}
|
|
IF_EXIST(origin_index) {
|
|
READ_NODE_FIELD(origin_index);
|
|
}
|
|
IF_EXIST(swAborted) {
|
|
READ_BOOL_FIELD(swAborted);
|
|
}
|
|
IF_EXIST(swSubExist) {
|
|
READ_BOOL_FIELD(swSubExist);
|
|
}
|
|
|
|
READ_TYPEINFO_LIST(ctecoltypes);
|
|
break;
|
|
#ifdef PGXC
|
|
case RTE_REMOTE_DUMMY:
|
|
/* Nothing to do */
|
|
break;
|
|
#endif /* PGXC */
|
|
case RTE_RESULT:
|
|
/* no extra fields */
|
|
break;
|
|
default:
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_UNRECOGNIZED_NODE_TYPE),
|
|
errmsg("unrecognized RTE kind: %d", (int)local_node->rtekind)));
|
|
break;
|
|
}
|
|
|
|
IF_EXIST(lateral)
|
|
{
|
|
READ_BOOL_FIELD(lateral);
|
|
}
|
|
READ_BOOL_FIELD(inh);
|
|
READ_BOOL_FIELD(inFromCl);
|
|
READ_UINT_FIELD(requiredPerms);
|
|
READ_OID_FIELD(checkAsUser);
|
|
READ_BITMAPSET_FIELD(selectedCols);
|
|
READ_BITMAPSET_FIELD(modifiedCols);
|
|
|
|
IF_EXIST(insertedCols) {
|
|
READ_BITMAPSET_FIELD(insertedCols);
|
|
}
|
|
|
|
IF_EXIST(updatedCols) {
|
|
READ_BITMAPSET_FIELD(updatedCols);
|
|
}
|
|
|
|
READ_ENUM_FIELD(orientation, RelOrientation);
|
|
|
|
IF_EXIST(securityQuals) {
|
|
READ_NODE_FIELD(securityQuals);
|
|
}
|
|
|
|
IF_EXIST(subquery_pull_up) {
|
|
READ_BOOL_FIELD(subquery_pull_up);
|
|
}
|
|
|
|
IF_EXIST(correlated_with_recursive_cte) {
|
|
READ_BOOL_FIELD(correlated_with_recursive_cte);
|
|
}
|
|
|
|
IF_EXIST(relhasbucket) {
|
|
READ_BOOL_FIELD(relhasbucket);
|
|
}
|
|
|
|
IF_EXIST(isbucket) {
|
|
READ_BOOL_FIELD(isbucket);
|
|
}
|
|
|
|
IF_EXIST(bucketmapsize) {
|
|
READ_INT_FIELD(bucketmapsize);
|
|
}
|
|
|
|
IF_EXIST(buckets) {
|
|
READ_NODE_FIELD(buckets);
|
|
}
|
|
|
|
IF_EXIST(isexcluded){
|
|
READ_BOOL_FIELD(isexcluded);
|
|
}
|
|
|
|
IF_EXIST(sublink_pull_up) {
|
|
READ_BOOL_FIELD(sublink_pull_up);
|
|
}
|
|
|
|
IF_EXIST(is_ustore) {
|
|
READ_BOOL_FIELD(is_ustore);
|
|
}
|
|
|
|
IF_EXIST(extraUpdatedCols) {
|
|
READ_BITMAPSET_FIELD(extraUpdatedCols);
|
|
}
|
|
IF_EXIST(partitionOidList) {
|
|
READ_NODE_FIELD(partitionOidList);
|
|
READ_NODE_FIELD(subpartitionOidList);
|
|
} else if (OidIsValid(local_node->partitionOid)) {
|
|
local_node->partitionOidList = lappend_oid(local_node->partitionOidList, local_node->partitionOid);
|
|
local_node->subpartitionOidList = lappend_oid(local_node->subpartitionOidList, local_node->subpartitionOid);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
// TO-DO
|
|
//
|
|
static Plan* _readPlan(Plan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Plan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_INT_FIELD(plan_node_id);
|
|
READ_INT_FIELD(parent_node_id);
|
|
READ_ENUM_FIELD(exec_type, RemoteQueryExecType);
|
|
READ_FLOAT_FIELD(startup_cost);
|
|
READ_FLOAT_FIELD(total_cost);
|
|
READ_FLOAT_FIELD(plan_rows);
|
|
READ_FLOAT_FIELD(multiple);
|
|
READ_INT_FIELD(plan_width);
|
|
READ_NODE_FIELD(targetlist);
|
|
READ_NODE_FIELD(qual);
|
|
READ_NODE_FIELD(lefttree);
|
|
READ_NODE_FIELD(righttree);
|
|
READ_BOOL_FIELD(ispwj);
|
|
READ_INT_FIELD(paramno);
|
|
IF_EXIST(subparamno) {
|
|
READ_INT_FIELD(subparamno);
|
|
}
|
|
READ_NODE_FIELD(initPlan);
|
|
READ_NODE_FIELD(distributed_keys);
|
|
READ_NODE_FIELD(exec_nodes);
|
|
READ_BITMAPSET_FIELD(extParam);
|
|
READ_BITMAPSET_FIELD(allParam);
|
|
READ_BOOL_FIELD(vec_output);
|
|
READ_BOOL_FIELD(hasUniqueResults);
|
|
READ_BOOL_FIELD(isDeltaTable);
|
|
READ_INT_FIELD(operatorMemKB[0]);
|
|
READ_INT_FIELD(operatorMemKB[1]);
|
|
READ_INT_FIELD(operatorMaxMem);
|
|
READ_BOOL_FIELD(parallel_enabled);
|
|
READ_BOOL_FIELD(hasHashFilter);
|
|
READ_NODE_FIELD(var_list);
|
|
READ_NODE_FIELD(filterIndexList);
|
|
READ_INT_FIELD(dop);
|
|
READ_INT_FIELD(recursive_union_plan_nodeid);
|
|
READ_BOOL_FIELD(recursive_union_controller);
|
|
READ_INT_FIELD(control_plan_nodeid);
|
|
READ_BOOL_FIELD(is_sync_plannode);
|
|
if (t_thrd.proc->workingVersionNum >= ML_OPT_MODEL_VERSION_NUM) {
|
|
READ_FLOAT_FIELD(pred_rows);
|
|
READ_FLOAT_FIELD(pred_startup_time);
|
|
READ_FLOAT_FIELD(pred_total_time);
|
|
READ_LONG_FIELD(pred_max_memory);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
static SubPlan* _readSubPlan(SubPlan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(SubPlan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_ENUM_FIELD(subLinkType, SubLinkType);
|
|
READ_NODE_FIELD(testexpr);
|
|
READ_NODE_FIELD(paramIds);
|
|
READ_INT_FIELD(plan_id);
|
|
READ_STRING_FIELD(plan_name);
|
|
READ_OID_FIELD(firstColType);
|
|
READ_INT_FIELD(firstColTypmod);
|
|
READ_OID_FIELD(firstColCollation);
|
|
READ_BOOL_FIELD(useHashTable);
|
|
READ_BOOL_FIELD(unknownEqFalse);
|
|
READ_NODE_FIELD(setParam);
|
|
READ_NODE_FIELD(parParam);
|
|
READ_NODE_FIELD(args);
|
|
READ_FLOAT_FIELD(startup_cost);
|
|
READ_FLOAT_FIELD(per_call_cost);
|
|
|
|
READ_TYPEINFO_FIELD(firstColType);
|
|
READ_DONE();
|
|
}
|
|
|
|
static LockRows* _readLockRows(LockRows* local_node)
|
|
{
|
|
READ_LOCALS_NULL(LockRows);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_NODE_FIELD(rowMarks);
|
|
READ_INT_FIELD(epqParam);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Limit* _readLimit(Limit* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Limit);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_NODE_FIELD(limitOffset);
|
|
READ_NODE_FIELD(limitCount);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Agg* _readAgg(Agg* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Agg);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_ENUM_FIELD(aggstrategy, AggStrategy);
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(grpColIdx, numCols);
|
|
READ_OPERATOROID_ARRAY(grpOperators, numCols);
|
|
|
|
READ_LONG_FIELD(numGroups);
|
|
READ_NODE_FIELD(groupingSets);
|
|
READ_NODE_FIELD(chain);
|
|
READ_BOOL_FIELD(is_final);
|
|
READ_BOOL_FIELD(single_node);
|
|
READ_BITMAPSET_FIELD(aggParams);
|
|
read_mem_info(&local_node->mem_info);
|
|
READ_BOOL_FIELD(is_sonichash);
|
|
READ_BOOL_FIELD(is_dummy);
|
|
READ_UINT_FIELD(skew_optimize);
|
|
|
|
IF_EXIST(unique_check) {
|
|
READ_BOOL_FIELD(unique_check);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static WindowAgg* _readWindowAgg(WindowAgg* local_node)
|
|
{
|
|
READ_LOCALS_NULL(WindowAgg);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
READ_UINT_FIELD(winref);
|
|
|
|
READ_INT_FIELD(partNumCols);
|
|
READ_ATTR_ARRAY(partColIdx, partNumCols);
|
|
READ_OPERATOROID_ARRAY(partOperators, partNumCols);
|
|
READ_INT_FIELD(ordNumCols);
|
|
READ_ATTR_ARRAY(ordColIdx, ordNumCols);
|
|
READ_OPERATOROID_ARRAY(ordOperators, ordNumCols);
|
|
|
|
READ_INT_FIELD(frameOptions);
|
|
READ_NODE_FIELD(startOffset);
|
|
READ_NODE_FIELD(endOffset);
|
|
read_mem_info(&local_node->mem_info);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Stream* _readStream(Stream* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Stream);
|
|
|
|
READ_STREAM_FIELD();
|
|
}
|
|
|
|
static BitmapOr* _readBitmapOr(BitmapOr* local_node)
|
|
{
|
|
READ_LOCALS_NULL(BitmapOr);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
READ_NODE_FIELD(bitmapplans);
|
|
IF_EXIST(is_ustore) {
|
|
READ_BOOL_FIELD(is_ustore);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static BitmapAnd* _readBitmapAnd(BitmapAnd* local_node)
|
|
{
|
|
READ_LOCALS_NULL(BitmapAnd);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
READ_NODE_FIELD(bitmapplans);
|
|
IF_EXIST(is_ustore) {
|
|
READ_BOOL_FIELD(is_ustore);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static CStoreIndexOr* _readCStoreIndexOr(CStoreIndexOr* local_node)
|
|
{
|
|
READ_LOCALS_NULL(CStoreIndexOr);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
READ_NODE_FIELD(bitmapplans);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static CStoreIndexAnd* _readCStoreIndexAnd(CStoreIndexAnd* local_node)
|
|
{
|
|
READ_LOCALS_NULL(CStoreIndexAnd);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
READ_NODE_FIELD(bitmapplans);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static PruningResult* _readPruningResult(PruningResult* local_node)
|
|
{
|
|
const int num = 92267;
|
|
READ_LOCALS_NULL(PruningResult);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_ENUM_FIELD(state, PruningResultState);
|
|
/* skip boundary info */
|
|
READ_BITMAPSET_FIELD(bm_rangeSelectedPartitions);
|
|
READ_INT_FIELD(intervalOffset);
|
|
READ_BITMAPSET_FIELD(intervalSelectedPartitions);
|
|
READ_NODE_FIELD(ls_rangeSelectedPartitions);
|
|
IF_EXIST(ls_selectedSubPartitions) {
|
|
READ_NODE_FIELD(ls_selectedSubPartitions);
|
|
}
|
|
if (t_thrd.proc->workingVersionNum >= num) {
|
|
READ_NODE_FIELD(expr);
|
|
}
|
|
IF_EXIST(isPbeSinlePartition) {
|
|
READ_BOOL_FIELD(isPbeSinlePartition);
|
|
}
|
|
/* skip PartitionMap */
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static SubPartitionPruningResult* _readSubPartitionPruningResult(SubPartitionPruningResult* local_node)
|
|
{
|
|
READ_LOCALS_NULL(SubPartitionPruningResult);
|
|
READ_TEMP_LOCALS();
|
|
|
|
/* skip boundary info */
|
|
READ_INT_FIELD(partSeq);
|
|
READ_BITMAPSET_FIELD(bm_selectedSubPartitions);
|
|
READ_NODE_FIELD(ls_selectedSubPartitions);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static BucketInfo* _readBucketInfo(BucketInfo* local_node)
|
|
{
|
|
READ_LOCALS_NULL(BucketInfo);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_NODE_FIELD(buckets);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Scan* _readScan(Scan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Scan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
// When deseriliazing on a different node, should we map this too?
|
|
// Remember OIDs are different on different nodes
|
|
READ_UINT_FIELD(scanrelid);
|
|
READ_BOOL_FIELD(isPartTbl);
|
|
READ_INT_FIELD(itrs);
|
|
READ_NODE_FIELD(pruningInfo);
|
|
|
|
IF_EXIST(bucketInfo) {
|
|
READ_NODE_FIELD(bucketInfo);
|
|
}
|
|
|
|
READ_ENUM_FIELD(partScanDirection, ScanDirection);
|
|
READ_BOOL_FIELD(scan_qual_optimized);
|
|
READ_BOOL_FIELD(predicate_pushdown_optimized);
|
|
|
|
token = pg_strtok(&length, false);
|
|
if (0 == memcmp(token, ":tablesample", strlen(":tablesample"))) {
|
|
READ_NODE_FIELD(tablesample);
|
|
}
|
|
read_mem_info(&local_node->mem_info);
|
|
IF_EXIST(scanBatchMode) {
|
|
READ_BOOL_FIELD(scanBatchMode);
|
|
}
|
|
IF_EXIST(partition_iterator_elimination) {
|
|
READ_BOOL_FIELD(partition_iterator_elimination);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
static PartIterator* _readPartIterator(PartIterator* local_node)
|
|
{
|
|
READ_LOCALS_NULL(PartIterator);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_ENUM_FIELD(partType, PartitionType);
|
|
READ_INT_FIELD(itrs);
|
|
READ_ENUM_FIELD(direction, ScanDirection);
|
|
READ_NODE_FIELD(param);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static PartIteratorParam* _readPartIteratorParam(PartIteratorParam* local_node)
|
|
{
|
|
READ_LOCALS_NULL(PartIteratorParam);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_INT_FIELD(paramno);
|
|
IF_EXIST(subPartParamno) {
|
|
READ_INT_FIELD(subPartParamno);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static CteScan* _readCteScan(CteScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(CteScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_INT_FIELD(ctePlanId);
|
|
READ_INT_FIELD(cteParam);
|
|
|
|
IF_EXIST(cteRef) {
|
|
READ_NODE_FIELD(cteRef);
|
|
}
|
|
IF_EXIST(internalEntryList) {
|
|
READ_NODE_FIELD(internalEntryList);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static ValuesScan* _readValuesScan(ValuesScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(ValuesScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_NODE_FIELD(values_lists);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static BitmapHeapScan* _readBitmapHeapScan(BitmapHeapScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(BitmapHeapScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Scan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_NODE_FIELD(bitmapqualorig);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static CStoreIndexHeapScan* _readCStoreIndexHeapScan(CStoreIndexHeapScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(CStoreIndexHeapScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Scan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_NODE_FIELD(bitmapqualorig);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static TidScan* _readTidScan(TidScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(TidScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readScan(&local_node->scan);
|
|
READ_NODE_FIELD(tidquals);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static IndexOnlyScan* _readIndexOnlyScan(IndexOnlyScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(IndexOnlyScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_OID_FIELD(indexid);
|
|
if (local_node->indexid >= FirstBootstrapObjectId) {
|
|
IF_EXIST(indexname) {
|
|
char *relname, *relnamespace;
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
relname = nullable_string(token, length);
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
relnamespace = nullable_string(token, length);
|
|
if (!IS_PGXC_COORDINATOR)
|
|
local_node->indexid = get_valid_relname_relid(relnamespace, relname);
|
|
|
|
pfree_ext(relname);
|
|
pfree_ext(relnamespace);
|
|
}
|
|
}
|
|
READ_NODE_FIELD(indexqual);
|
|
READ_NODE_FIELD(indexorderby);
|
|
READ_NODE_FIELD(indextlist);
|
|
READ_ENUM_FIELD(indexorderdir, ScanDirection);
|
|
IF_EXIST(selectivity) {
|
|
READ_FLOAT_FIELD(selectivity);
|
|
}
|
|
IF_EXIST(is_partial) {
|
|
READ_BOOL_FIELD(is_partial);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static BitmapIndexScan* _readBitmapIndexScan(BitmapIndexScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(BitmapIndexScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Scan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_OID_FIELD(indexid);
|
|
READ_NODE_FIELD(indexqual);
|
|
READ_NODE_FIELD(indexqualorig);
|
|
#ifdef STREAMPLAN
|
|
// Note: The Oid shipped(in plan) is invalid here
|
|
// We need to get the Oid on this node
|
|
if (local_node->indexid >= FirstBootstrapObjectId) {
|
|
IF_EXIST(indexname) {
|
|
char *indexname, *indexnamespace;
|
|
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
indexname = nullable_string(token, length);
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
indexnamespace = nullable_string(token, length);
|
|
if (!IS_PGXC_COORDINATOR)
|
|
local_node->indexid = get_valid_relname_relid(indexnamespace, indexname);
|
|
|
|
pfree_ext(indexname);
|
|
pfree_ext(indexnamespace);
|
|
}
|
|
}
|
|
#endif // STREAMPLAN
|
|
IF_EXIST(is_ustore) {
|
|
READ_BOOL_FIELD(is_ustore);
|
|
}
|
|
IF_EXIST(selectivity) {
|
|
READ_FLOAT_FIELD(selectivity);
|
|
}
|
|
IF_EXIST(is_partial) {
|
|
READ_BOOL_FIELD(is_partial);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static CStoreIndexCtidScan* _readCStoreIndexCtidScan(CStoreIndexCtidScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(CStoreIndexCtidScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Scan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_OID_FIELD(indexid);
|
|
READ_NODE_FIELD(indexqual);
|
|
READ_NODE_FIELD(cstorequal);
|
|
READ_NODE_FIELD(indexqualorig);
|
|
#ifdef STREAMPLAN
|
|
// Note: The Oid shipped(in plan) is invalid here
|
|
// We need to get the Oid on this node
|
|
if (local_node->indexid >= FirstBootstrapObjectId) {
|
|
IF_EXIST(indexname) {
|
|
char *indexname, *indexnamespace;
|
|
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
indexname = nullable_string(token, length);
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
indexnamespace = nullable_string(token, length);
|
|
if (!IS_PGXC_COORDINATOR) {
|
|
local_node->indexid = get_valid_relname_relid(indexnamespace, indexname);
|
|
}
|
|
pfree_ext(indexname);
|
|
pfree_ext(indexnamespace);
|
|
}
|
|
}
|
|
#endif // STREAMPLAN
|
|
READ_NODE_FIELD(indextlist);
|
|
READ_DONE();
|
|
}
|
|
|
|
static SubqueryScan* _readSubqueryScan(SubqueryScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(SubqueryScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Scan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_NODE_FIELD(subplan);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static IndexScan* _readIndexScan(IndexScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(IndexScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Scan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_OID_FIELD(indexid);
|
|
#ifdef STREAMPLAN
|
|
// Note: The Oid shipped(in plan) is invalid here
|
|
// We need to get the Oid on this node
|
|
if (local_node->indexid >= FirstBootstrapObjectId) {
|
|
IF_EXIST(indexname) {
|
|
char *indexname, *indexnamespace;
|
|
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
indexname = nullable_string(token, length);
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
indexnamespace = nullable_string(token, length);
|
|
if (!IS_PGXC_COORDINATOR)
|
|
local_node->indexid = get_valid_relname_relid(indexnamespace, indexname);
|
|
|
|
pfree_ext(indexname);
|
|
pfree_ext(indexnamespace);
|
|
}
|
|
}
|
|
#endif // STREAMPLAN
|
|
|
|
READ_NODE_FIELD(indexqual);
|
|
READ_NODE_FIELD(indexqualorig);
|
|
READ_NODE_FIELD(indexorderby);
|
|
READ_NODE_FIELD(indexorderbyorig);
|
|
READ_ENUM_FIELD(indexorderdir, ScanDirection);
|
|
IF_EXIST(is_ustore) {
|
|
READ_BOOL_FIELD(is_ustore);
|
|
}
|
|
IF_EXIST(selectivity) {
|
|
READ_FLOAT_FIELD(selectivity);
|
|
}
|
|
IF_EXIST(is_partial) {
|
|
READ_BOOL_FIELD(is_partial);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
static CStoreIndexScan* _readCStoreIndexScan(CStoreIndexScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(CStoreIndexScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Scan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_OID_FIELD(indexid);
|
|
#ifdef STREAMPLAN
|
|
// Note: The Oid shipped(in plan) is invalid here
|
|
// We need to get the Oid on this node
|
|
if (local_node->indexid >= FirstBootstrapObjectId) {
|
|
IF_EXIST(indexname) {
|
|
char *indexname, *indexnamespace;
|
|
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
indexname = nullable_string(token, length);
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
indexnamespace = nullable_string(token, length);
|
|
if (!IS_PGXC_COORDINATOR)
|
|
local_node->indexid = get_valid_relname_relid(indexnamespace, indexname);
|
|
|
|
pfree_ext(indexname);
|
|
pfree_ext(indexnamespace);
|
|
}
|
|
}
|
|
#endif // STREAMPLAN
|
|
|
|
READ_NODE_FIELD(indexqual);
|
|
READ_NODE_FIELD(indexqualorig);
|
|
READ_NODE_FIELD(indexorderby);
|
|
READ_NODE_FIELD(indexorderbyorig);
|
|
READ_ENUM_FIELD(indexorderdir, ScanDirection);
|
|
READ_NODE_FIELD(baserelcstorequal);
|
|
READ_NODE_FIELD(cstorequal);
|
|
READ_NODE_FIELD(indextlist);
|
|
READ_ENUM_FIELD(relStoreLocation, RelstoreType);
|
|
READ_BOOL_FIELD(indexonly);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Sort* _readSort(Sort* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Sort);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(sortColIdx, numCols);
|
|
READ_OPERATOROID_ARRAY(sortOperators, numCols);
|
|
READ_OID_ARRAY(collations, numCols);
|
|
|
|
// Conver collname to colloid when node->collOid is user-defined,
|
|
// because DN and CN use different OID though the objection name is the same
|
|
// Note that this function must be changed if _outSort change
|
|
//
|
|
READ_OID_ARRAY_BYCONVERT(collations, numCols);
|
|
|
|
READ_BOOL_ARRAY(nullsFirst, numCols);
|
|
read_mem_info(&local_node->mem_info);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Unique* _readUnique(Unique* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Unique);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(uniqColIdx, numCols);
|
|
READ_OPERATOROID_ARRAY(uniqOperators, numCols);
|
|
READ_DONE();
|
|
}
|
|
|
|
static SimpleSort* _readSimpleSort(SimpleSort* local_node)
|
|
{
|
|
READ_LOCALS_NULL(SimpleSort);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(sortColIdx, numCols);
|
|
READ_OPERATOROID_ARRAY(sortOperators, numCols);
|
|
READ_OID_ARRAY(sortCollations, numCols);
|
|
|
|
/*
|
|
* Conver collname to colloid when node->collOid is user-defined,
|
|
* because DN and CN use different OID though the objection name is the same
|
|
* Note that this function must be changed if _outSimpleSort change
|
|
*/
|
|
READ_OID_ARRAY_BYCONVERT(sortCollations, numCols);
|
|
|
|
READ_BOOL_ARRAY(nullsFirst, numCols);
|
|
|
|
READ_BOOL_FIELD(sortToStore);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static RemoteQuery* _readRemoteQuery(void)
|
|
{
|
|
READ_LOCALS(RemoteQuery);
|
|
|
|
READ_REMOTEQUERY_FIELD();
|
|
}
|
|
|
|
static SliceBoundary* _readSliceBoundary(void)
|
|
{
|
|
READ_LOCALS(SliceBoundary);
|
|
READ_INT_FIELD(nodeIdx);
|
|
READ_INT_FIELD(len);
|
|
|
|
|
|
token = pg_strtok(&length); /* skip ":boundary" */
|
|
token = pg_strtok(&length); /* skip "(" */
|
|
for (int i = 0; i < local_node->len; i++) {
|
|
void *ptr = nodeRead(NULL, 0);
|
|
errno_t err = memcpy_s(&local_node->boundary[i], sizeof(void *), &ptr, sizeof(void *));
|
|
securec_check(err, "\0", "\0");
|
|
}
|
|
token = pg_strtok(&length); /* skip ")" */
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static ExecBoundary* _readExecBoundary(void)
|
|
{
|
|
READ_LOCALS(ExecBoundary);
|
|
READ_CHAR_FIELD(locatorType);
|
|
READ_INT_FIELD(count);
|
|
|
|
token = pg_strtok(&length); /* skip ":eles" */
|
|
token = pg_strtok(&length); /* skip "(" */
|
|
if (local_node->count > 0) {
|
|
local_node->eles = (SliceBoundary**)palloc0(sizeof(SliceBoundary*) * local_node->count);
|
|
for (int i = 0; i < local_node->count; i++) {
|
|
void *ptr = nodeRead(NULL, 0);
|
|
errno_t err = memcpy_s(&local_node->eles[i], sizeof(void *), &ptr, sizeof(void *));
|
|
securec_check(err, "\0", "\0");
|
|
}
|
|
}
|
|
token = pg_strtok(&length); /* skip ")" */
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readExecNodes
|
|
* read information for a ExecNodes
|
|
*
|
|
* @param (in) : void
|
|
*
|
|
* @return:
|
|
* ExecNodes *: the target ExecNodes pointer
|
|
*/
|
|
static ExecNodes* _readExecNodes(void)
|
|
{
|
|
READ_LOCALS(ExecNodes);
|
|
|
|
READ_NODE_FIELD(primarynodelist);
|
|
READ_NODE_FIELD(nodeList);
|
|
Distribution* distribution = _readDistribution();
|
|
ng_set_distribution(&local_node->distribution, distribution);
|
|
IF_EXIST(baselocatortype) {
|
|
READ_CHAR_FIELD(baselocatortype);
|
|
}
|
|
READ_NODE_FIELD(en_expr);
|
|
READ_OID_FIELD(en_relid);
|
|
|
|
IF_EXIST(boundaries) {
|
|
READ_NODE_FIELD(boundaries);
|
|
}
|
|
|
|
READ_ENUM_FIELD(accesstype, RelationAccessType);
|
|
READ_NODE_FIELD(en_dist_vars);
|
|
READ_INT_FIELD(bucketmapIdx);
|
|
READ_BOOL_FIELD(nodelist_is_nil);
|
|
READ_NODE_FIELD(original_nodeList);
|
|
READ_NODE_FIELD(dynamic_en_expr);
|
|
|
|
if (t_thrd.proc->workingVersionNum >= 92106) {
|
|
IF_EXIST(bucketid) {
|
|
READ_INT_FIELD(bucketid);
|
|
}
|
|
IF_EXIST(bucketexpr) {
|
|
READ_NODE_FIELD(bucketexpr);
|
|
}
|
|
IF_EXIST(bucketrelid) {
|
|
READ_OID_FIELD(bucketrelid);
|
|
}
|
|
/*
|
|
* Note: The Oid shipped(in plan) is invalid here
|
|
* We need to get the Oid on this node.
|
|
*/
|
|
if (local_node->bucketrelid >= FirstBootstrapObjectId) {
|
|
char* relname = NULL;
|
|
char* relnamespace = NULL;
|
|
|
|
IF_EXIST(relname) {
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
relname = nullable_string(token, length);
|
|
if (relname == NULL) {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_UNEXPECTED_NULL_VALUE),
|
|
errmsg("NULL relname for RTE %u found", local_node->bucketrelid)));
|
|
}
|
|
}
|
|
IF_EXIST(relnamespace) {
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
relnamespace = nullable_string(token, length);
|
|
if (relnamespace == NULL) {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_UNEXPECTED_NULL_VALUE),
|
|
errmsg("NULL relnamespace for RTE %u found", local_node->bucketrelid)));
|
|
}
|
|
}
|
|
#ifdef ENABLE_MULTIPLE_NODES
|
|
if (!IS_PGXC_COORDINATOR && !isRestoreMode) {
|
|
Oid bucketrelid = InvalidOid;
|
|
if (relname != NULL && relnamespace != NULL) {
|
|
bucketrelid = get_valid_relname_relid(relnamespace, relname);
|
|
pfree_ext(relname);
|
|
pfree_ext(relnamespace);
|
|
}
|
|
|
|
if (OidIsValid(bucketrelid)) {
|
|
local_node->bucketrelid = bucketrelid;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
static ModifyTable* _readModifyTable(ModifyTable* local_node)
|
|
{
|
|
READ_LOCALS_NULL(ModifyTable);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_ENUM_FIELD(operation, CmdType);
|
|
READ_BOOL_FIELD(canSetTag);
|
|
READ_NODE_FIELD(resultRelations);
|
|
READ_INT_FIELD(resultRelIndex);
|
|
READ_NODE_FIELD(plans);
|
|
READ_NODE_FIELD(returningLists);
|
|
READ_NODE_FIELD(fdwPrivLists);
|
|
READ_NODE_FIELD(rowMarks);
|
|
READ_INT_FIELD(epqParam);
|
|
READ_BOOL_FIELD(partKeyUpdated);
|
|
if (t_thrd.proc->workingVersionNum >= REPLACE_INTO_VERSION_NUM) {
|
|
READ_BOOL_FIELD(isReplace);
|
|
}
|
|
#ifdef PGXC
|
|
READ_NODE_FIELD(remote_plans);
|
|
READ_NODE_FIELD(remote_insert_plans);
|
|
READ_NODE_FIELD(remote_update_plans);
|
|
READ_NODE_FIELD(remote_delete_plans);
|
|
#endif
|
|
READ_BOOL_FIELD(is_dist_insertselect);
|
|
READ_NODE_FIELD(cacheEnt);
|
|
|
|
IF_EXIST(mergeTargetRelation) {
|
|
READ_INT_FIELD(mergeTargetRelation);
|
|
}
|
|
|
|
IF_EXIST(mergeSourceTargetList) {
|
|
READ_NODE_FIELD(mergeSourceTargetList);
|
|
}
|
|
|
|
IF_EXIST(mergeActionList) {
|
|
READ_NODE_FIELD(mergeActionList);
|
|
}
|
|
|
|
IF_EXIST(upsertAction) {
|
|
READ_ENUM_FIELD(upsertAction, UpsertAction);
|
|
}
|
|
|
|
IF_EXIST(updateTlist) {
|
|
READ_NODE_FIELD(updateTlist);
|
|
}
|
|
|
|
IF_EXIST(exclRelTlist) {
|
|
READ_NODE_FIELD(exclRelTlist);
|
|
}
|
|
|
|
IF_EXIST(exclRelRTIndex) {
|
|
READ_INT_FIELD(exclRelRTIndex);
|
|
}
|
|
|
|
IF_EXIST(upsertWhere) {
|
|
READ_NODE_FIELD(upsertWhere);
|
|
}
|
|
IF_EXIST(targetlists) {
|
|
READ_NODE_FIELD(targetlists);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static UpsertExpr* _readUpsertExpr(void)
|
|
{
|
|
READ_LOCALS(UpsertExpr);
|
|
|
|
READ_ENUM_FIELD(upsertAction, UpsertAction);
|
|
READ_NODE_FIELD(updateTlist);
|
|
READ_NODE_FIELD(exclRelTlist);
|
|
READ_INT_FIELD(exclRelIndex);
|
|
IF_EXIST(upsertWhere) {
|
|
READ_NODE_FIELD(upsertWhere);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static UpsertClause* _readUpsertClause(void)
|
|
{
|
|
READ_LOCALS(UpsertClause);
|
|
|
|
READ_NODE_FIELD(targetList);
|
|
READ_INT_FIELD(location);
|
|
IF_EXIST(whereClause) {
|
|
READ_NODE_FIELD(whereClause);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* _readMergeWhenClause
|
|
*/
|
|
static MergeWhenClause* _readMergeWhenClause(void)
|
|
{
|
|
READ_LOCALS(MergeWhenClause);
|
|
|
|
READ_BOOL_FIELD(matched);
|
|
READ_ENUM_FIELD(commandType, CmdType);
|
|
READ_NODE_FIELD(condition);
|
|
READ_NODE_FIELD(targetList);
|
|
READ_NODE_FIELD(cols);
|
|
READ_NODE_FIELD(values);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static BaseResult* _readResult(BaseResult* local_node)
|
|
{
|
|
READ_LOCALS_NULL(BaseResult);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
READ_NODE_FIELD(resconstantqual);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Material* _readMaterial(Material* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Material);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
READ_BOOL_FIELD(materialize_all);
|
|
read_mem_info(&local_node->mem_info);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Append* _readAppend(Append* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Append);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
READ_NODE_FIELD(appendplans);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecAppend* _readVecAppend(VecAppend* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecAppend);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
READ_NODE_FIELD(appendplans);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static MergeAppend* _readMergeAppend(MergeAppend* local_node)
|
|
{
|
|
READ_LOCALS_NULL(MergeAppend);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
READ_NODE_FIELD(mergeplans);
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(sortColIdx, numCols);
|
|
READ_OPERATOROID_ARRAY(sortOperators, numCols);
|
|
READ_OID_ARRAY(collations, numCols);
|
|
|
|
// Conver collname to colloid when node->collOid is user-defined,
|
|
// because DN and CN use different OID though the objection name is the same
|
|
// Note that this function must be changed if _outSort change
|
|
//
|
|
READ_OID_ARRAY_BYCONVERT(collations, numCols);
|
|
|
|
READ_BOOL_ARRAY(nullsFirst, numCols);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Group* _readGroup(Group* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Group);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(grpColIdx, numCols);
|
|
READ_OPERATOROID_ARRAY(grpOperators, numCols);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Join* _readJoin(Join* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Join);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_ENUM_FIELD(jointype, JoinType);
|
|
READ_NODE_FIELD(joinqual);
|
|
READ_BOOL_FIELD(optimizable);
|
|
READ_NODE_FIELD(nulleqqual);
|
|
READ_UINT_FIELD(skewoptimize);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static Hash* _readHash(Hash* local_node)
|
|
{
|
|
READ_LOCALS_NULL(Hash);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_INT_FIELD(skewColumn);
|
|
READ_BOOL_FIELD(skewInherit);
|
|
READ_OID_FIELD(skewColType);
|
|
READ_INT_FIELD(skewColTypmod);
|
|
|
|
// for tmp, remove the line and fix the issue
|
|
local_node->skewTable = InvalidOid;
|
|
|
|
READ_TYPEINFO_FIELD(skewColType);
|
|
READ_DONE();
|
|
}
|
|
|
|
static HashJoin* _readHashJoin(HashJoin* local_node)
|
|
{
|
|
READ_LOCALS_NULL(HashJoin);
|
|
READ_HASHJOIN_FIELD();
|
|
}
|
|
|
|
static MergeJoin* _readMergeJoin(MergeJoin* local_node)
|
|
{
|
|
READ_LOCALS_NULL(MergeJoin);
|
|
READ_MERGEJOIN();
|
|
}
|
|
|
|
static VecMergeJoin* _readVecMergeJoin(VecMergeJoin* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecMergeJoin);
|
|
READ_MERGEJOIN();
|
|
}
|
|
|
|
static NestLoop* _readNestLoop(void)
|
|
{
|
|
READ_LOCALS(NestLoop);
|
|
|
|
// Read Join
|
|
_readJoin(&local_node->join);
|
|
|
|
READ_NODE_FIELD(nestParams);
|
|
READ_BOOL_FIELD(materialAll);
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecNestLoop* _readVecNestLoop(void)
|
|
{
|
|
READ_LOCALS(VecNestLoop);
|
|
|
|
// Read Join
|
|
_readJoin(&local_node->join);
|
|
|
|
READ_NODE_FIELD(nestParams);
|
|
READ_BOOL_FIELD(materialAll);
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecMaterial* _readVecMaterial(void)
|
|
{
|
|
READ_LOCALS(VecMaterial);
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
READ_BOOL_FIELD(materialize_all);
|
|
read_mem_info(&local_node->mem_info);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecRemoteQuery* _readVecRemoteQuery(void)
|
|
{
|
|
READ_LOCALS(VecRemoteQuery);
|
|
|
|
READ_REMOTEQUERY_FIELD();
|
|
}
|
|
|
|
static PlannedStmt* _readPlannedStmt(void)
|
|
{
|
|
READ_LOCALS(PlannedStmt);
|
|
|
|
READ_ENUM_FIELD(commandType, CmdType);
|
|
READ_UINT64_FIELD(queryId);
|
|
READ_BOOL_FIELD(hasReturning);
|
|
READ_BOOL_FIELD(hasModifyingCTE);
|
|
IF_EXIST(hasIgnore) {
|
|
READ_BOOL_FIELD(hasIgnore);
|
|
}
|
|
READ_BOOL_FIELD(canSetTag);
|
|
READ_BOOL_FIELD(transientPlan);
|
|
IF_EXIST(dependsOnRole) {
|
|
READ_BOOL_FIELD(dependsOnRole);
|
|
}
|
|
READ_NODE_FIELD(planTree);
|
|
READ_NODE_FIELD(rtable);
|
|
READ_NODE_FIELD(resultRelations);
|
|
READ_NODE_FIELD(utilityStmt);
|
|
READ_NODE_FIELD(subplans);
|
|
READ_BITMAPSET_FIELD(rewindPlanIDs);
|
|
READ_NODE_FIELD(rowMarks);
|
|
READ_NODE_FIELD(relationOids);
|
|
READ_NODE_FIELD(invalItems);
|
|
READ_INT_FIELD(nParamExec);
|
|
READ_INT_FIELD(num_streams);
|
|
READ_INT_FIELD(max_push_sql_num);
|
|
IF_EXIST(gather_count) {
|
|
READ_INT_FIELD(gather_count);
|
|
}
|
|
READ_INT_FIELD(num_nodes);
|
|
|
|
if (t_thrd.proc->workingVersionNum < 92097 || local_node->num_streams > 0) {
|
|
local_node->nodesDefinition = (NodeDefinition*)palloc0(sizeof(NodeDefinition) * local_node->num_nodes);
|
|
for (int i = 0; i < local_node->num_nodes; i++) {
|
|
READ_OID_FIELD(nodesDefinition[i].nodeoid);
|
|
READCOPY_STRING_FIELD_DIRECT(nodesDefinition[i].nodename.data);
|
|
READCOPY_STRING_FIELD_DIRECT(nodesDefinition[i].nodehost.data);
|
|
READ_INT_FIELD_DIRECT(nodesDefinition[i].nodeport);
|
|
READ_INT_FIELD_DIRECT(nodesDefinition[i].nodectlport);
|
|
READ_INT_FIELD_DIRECT(nodesDefinition[i].nodesctpport);
|
|
READCOPY_STRING_FIELD_DIRECT(nodesDefinition[i].nodehost1.data);
|
|
READ_INT_FIELD_DIRECT(nodesDefinition[i].nodeport1);
|
|
READ_INT_FIELD_DIRECT(nodesDefinition[i].nodectlport1);
|
|
READ_INT_FIELD_DIRECT(nodesDefinition[i].nodesctpport1);
|
|
READ_BOOL_FIELD_DIRECT(nodesDefinition[i].nodeisprimary);
|
|
READ_BOOL_FIELD_DIRECT(nodesDefinition[i].nodeispreferred);
|
|
}
|
|
}
|
|
|
|
READ_INT_FIELD(instrument_option);
|
|
READ_INT_FIELD(num_plannodes);
|
|
READ_INT_FIELD(query_mem[0]);
|
|
READ_INT_FIELD(query_mem[1]);
|
|
READ_INT_FIELD(assigned_query_mem[0]);
|
|
READ_INT_FIELD(assigned_query_mem[1]);
|
|
|
|
READ_INT_FIELD(num_bucketmaps);
|
|
int size;
|
|
for (int j = 0; j < local_node->num_bucketmaps; j++) {
|
|
local_node->bucketCnt[j] = BUCKETDATALEN;
|
|
IF_EXIST(bucketCnt) {
|
|
READ_INT_FIELD(bucketCnt[j]);
|
|
}
|
|
size = local_node->bucketCnt[j];
|
|
READ_UINT2_ARRAY_LEN(bucketMap[j]);
|
|
}
|
|
|
|
READ_STRING_FIELD(query_string);
|
|
READ_NODE_FIELD(subplan_ids);
|
|
READ_NODE_FIELD(initPlan);
|
|
/* data redistribution for DFS table. */
|
|
READ_UINT_FIELD(dataDestRelIndex);
|
|
READ_INT_FIELD(MaxBloomFilterNum);
|
|
READ_INT_FIELD(query_dop);
|
|
READ_BOOL_FIELD(in_compute_pool);
|
|
READ_BOOL_FIELD(has_obsrel);
|
|
|
|
READ_INT_FIELD(ng_num);
|
|
local_node->ng_queryMem = NULL;
|
|
if (local_node->ng_num > 0) {
|
|
local_node->ng_queryMem = (NodeGroupQueryMem*)palloc0(local_node->ng_num * sizeof(NodeGroupQueryMem));
|
|
for (int i = 0; i < local_node->ng_num; i++) {
|
|
READCOPY_STRING_FIELD_DIRECT(ng_queryMem[i].nodegroup);
|
|
READ_INT_FIELD_DIRECT(ng_queryMem[i].query_mem[0]);
|
|
READ_INT_FIELD_DIRECT(ng_queryMem[i].query_mem[1]);
|
|
}
|
|
}
|
|
READ_BOOL_FIELD(isRowTriggerShippable);
|
|
READ_BOOL_FIELD(is_stream_plan);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static NestLoopParam* _readNestLoopParam(void)
|
|
{
|
|
READ_LOCALS(NestLoopParam);
|
|
|
|
READ_INT_FIELD(paramno);
|
|
READ_NODE_FIELD(paramval);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static PlanRowMark* _readPlanRowMark(void)
|
|
{
|
|
READ_LOCALS(PlanRowMark);
|
|
|
|
READ_UINT_FIELD(rti);
|
|
READ_UINT_FIELD(prti);
|
|
READ_UINT_FIELD(rowmarkId);
|
|
READ_ENUM_FIELD(markType, RowMarkType);
|
|
IF_EXIST(waitSec) {
|
|
READ_INT_FIELD(waitSec);
|
|
}
|
|
|
|
IF_EXIST(waitPolicy) {
|
|
READ_ENUM_FIELD(waitPolicy, LockWaitPolicy);
|
|
}
|
|
/* convert noWait (true/false) to LockWaitPolicy (LockWaitError/LockWaitBlock) */
|
|
IF_EXIST(noWait) {
|
|
READ_ENUM_EXPR(waitPolicy, LockWaitPolicy, (strtobool(token) ? LockWaitError : LockWaitBlock));
|
|
}
|
|
READ_BOOL_FIELD(isParent);
|
|
READ_INT_FIELD(numAttrs);
|
|
READ_BITMAPSET_FIELD(bms_nodeids);
|
|
|
|
READ_DONE();
|
|
}
|
|
static Scan* _readSeqScan(void)
|
|
{
|
|
READ_LOCALS_NO_FIELDS(SeqScan);
|
|
|
|
_readScan(local_node);
|
|
|
|
READ_END();
|
|
}
|
|
|
|
static SetOp* _readSetOp(SetOp* local_node)
|
|
{
|
|
READ_LOCALS_NULL(SetOp);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_ENUM_FIELD(cmd, SetOpCmd);
|
|
READ_ENUM_FIELD(strategy, SetOpStrategy);
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(dupColIdx, numCols);
|
|
READ_OPERATOROID_ARRAY(dupOperators, numCols);
|
|
READ_INT_FIELD(flagColIdx);
|
|
READ_INT_FIELD(firstFlag);
|
|
READ_LONG_FIELD(numGroups);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static FunctionScan* _readFunctionScan(FunctionScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(FunctionScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_NODE_FIELD(funcexpr);
|
|
READ_NODE_FIELD(funccolnames);
|
|
READ_NODE_FIELD(funccoltypes);
|
|
READ_NODE_FIELD(funccoltypmods);
|
|
READ_NODE_FIELD(funccolcollations);
|
|
|
|
READ_TYPEINFO_LIST(funccoltypes);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static ForeignScan* _readForeignScan(ForeignScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(ForeignScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_FOREIGNSCAN();
|
|
|
|
if (local_node->bfNum > 0) {
|
|
local_node->bloomFilterSet = (BloomFilterSet**)palloc0(sizeof(BloomFilterSet*) * local_node->bfNum);
|
|
|
|
for (int cnt = 0; cnt < local_node->bfNum; cnt++) {
|
|
READ_NODE_FIELD(bloomFilterSet[cnt]);
|
|
}
|
|
}
|
|
|
|
READ_BOOL_FIELD(in_compute_pool);
|
|
READ_DONE();
|
|
}
|
|
|
|
static ExtensiblePlan* _readExtensiblePlan(ExtensiblePlan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(ExtensiblePlan);
|
|
READ_TEMP_LOCALS();
|
|
char* extensible_name;
|
|
ExtensiblePlanMethods* methods;
|
|
|
|
// Read Plan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_UINT_FIELD(flags);
|
|
READ_NODE_FIELD(extensible_plans);
|
|
READ_NODE_FIELD(extensible_exprs);
|
|
READ_NODE_FIELD(extensible_private);
|
|
READ_NODE_FIELD(extensible_plan_tlist);
|
|
READ_BITMAPSET_FIELD(extensible_relids);
|
|
|
|
/* Lookup ExtensiblePlanMethods by ExtensibleName */
|
|
token = pg_strtok(&length); /* skip methods: */
|
|
token = pg_strtok(&length); /* ExtensibleName */
|
|
extensible_name = nullable_string(token, length);
|
|
methods = GetExtensiblePlanMethods(extensible_name, false);
|
|
local_node->methods = methods;
|
|
READ_DONE();
|
|
}
|
|
|
|
static ForeignPartState* _readForeignPartState(ForeignPartState* local_node)
|
|
{
|
|
READ_LOCALS_NULL(ForeignPartState);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_NODE_FIELD(partitionKey);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static RecursiveUnion* _readRecursiveUnion(RecursiveUnion* local_node)
|
|
{
|
|
READ_LOCALS_NULL(RecursiveUnion);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_INT_FIELD(wtParam);
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(dupColIdx, numCols);
|
|
READ_OPERATOROID_ARRAY(dupOperators, numCols);
|
|
READ_LONG_FIELD(numGroups);
|
|
READ_BOOL_FIELD(has_inner_stream);
|
|
READ_BOOL_FIELD(has_outer_stream);
|
|
READ_BOOL_FIELD(is_used);
|
|
READ_BOOL_FIELD(is_correlated);
|
|
IF_EXIST(internalEntryList) {
|
|
READ_NODE_FIELD(internalEntryList);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static StartWithOp* _readStartWithOp(StartWithOp* local_node)
|
|
{
|
|
READ_LOCALS_NULL(StartWithOp);
|
|
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_NODE_FIELD(cteplan);
|
|
READ_NODE_FIELD(ruplan);
|
|
|
|
READ_NODE_FIELD(keyEntryList);
|
|
READ_NODE_FIELD(colEntryList);
|
|
READ_NODE_FIELD(internalEntryList);
|
|
READ_NODE_FIELD(fullEntryList);
|
|
|
|
READ_NODE_FIELD(swoptions);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static StartWithOptions* _readStartWithOptions(StartWithOptions* local_node)
|
|
{
|
|
READ_LOCALS_NULL(StartWithOptions);
|
|
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_NODE_FIELD(siblings_orderby_clause);
|
|
READ_NODE_FIELD(prior_key_index);
|
|
READ_ENUM_FIELD(connect_by_type, StartWithConnectByType);
|
|
READ_NODE_FIELD(connect_by_level_quals);
|
|
READ_NODE_FIELD(connect_by_other_quals);
|
|
READ_BOOL_FIELD(nocycle);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static WorkTableScan* _readWorkTableScan(WorkTableScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(WorkTableScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_INT_FIELD(wtParam);
|
|
IF_EXIST(forStartWith) {
|
|
READ_BOOL_FIELD(forStartWith);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static PlanInvalItem* _readPlanInvalItem(PlanInvalItem* local_node)
|
|
{
|
|
READ_LOCALS_NULL(PlanInvalItem);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_INT_FIELD(cacheId);
|
|
READ_UINT_FIELD(hashValue);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static DistFdwDataNodeTask* _readDistFdwDataNodeTask(DistFdwDataNodeTask* local_node)
|
|
{
|
|
READ_LOCALS_NULL(DistFdwDataNodeTask);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_STRING_FIELD(dnName);
|
|
READ_NODE_FIELD(task);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static DistFdwFileSegment* _readDistFdwFileSegment(DistFdwFileSegment* local_node)
|
|
{
|
|
READ_LOCALS_NULL(DistFdwFileSegment);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_STRING_FIELD(filename);
|
|
READ_LONG_FIELD(begin);
|
|
READ_LONG_FIELD(end);
|
|
READ_LONG_FIELD(ObjectSize);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static SplitInfo* _readSplitInfo(SplitInfo* local_node)
|
|
{
|
|
READ_LOCALS_NULL(SplitInfo);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_STRING_FIELD(filePath);
|
|
READ_STRING_FIELD(fileName);
|
|
READ_NODE_FIELD(partContentList);
|
|
READ_LONG_FIELD(ObjectSize);
|
|
READ_STRING_FIELD(eTag);
|
|
READ_INT_FIELD(prefixSlashNum);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static SplitMap* _readSplitMap(SplitMap* local_node)
|
|
{
|
|
READ_LOCALS_NULL(SplitMap);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_INT_FIELD(nodeId);
|
|
READ_CHAR_FIELD(locatorType);
|
|
READ_LONG_FIELD(totalSize);
|
|
READ_INT_FIELD(fileNums);
|
|
READ_STRING_FIELD(downDiskFilePath);
|
|
READ_NODE_FIELD(lengths);
|
|
READ_NODE_FIELD(splits);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/* @hdfs */
|
|
static DfsPrivateItem* _readDfsPrivateItem(DfsPrivateItem* local_node)
|
|
{
|
|
READ_LOCALS_NULL(DfsPrivateItem);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_NODE_FIELD(columnList);
|
|
READ_NODE_FIELD(targetList);
|
|
READ_NODE_FIELD(restrictColList);
|
|
READ_NODE_FIELD(partList);
|
|
READ_NODE_FIELD(opExpressionList);
|
|
READ_NODE_FIELD(dnTask);
|
|
READ_NODE_FIELD(hdfsQual);
|
|
READ_INT_FIELD(colNum);
|
|
READ_DOUBLE_ARRAY(selectivity, colNum);
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* Description: Read tableSampleClause string to tableSampleClause struct.
|
|
*
|
|
* Parameters: void
|
|
*
|
|
* Return: TableSampleClause*
|
|
*/
|
|
static TableSampleClause* _readTableSampleClause(void)
|
|
{
|
|
READ_LOCALS(TableSampleClause);
|
|
|
|
READ_ENUM_FIELD(sampleType, TableSampleType);
|
|
READ_NODE_FIELD(args);
|
|
READ_NODE_FIELD(repeatable);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* Description: Read TimeCapsuleClause string to TimeCapsuleClause struct.
|
|
*
|
|
* Parameters: void
|
|
*
|
|
* Return: TimeCapsuleClause*
|
|
*/
|
|
static TimeCapsuleClause* ReadTimeCapsuleClause(void)
|
|
{
|
|
READ_LOCALS(TimeCapsuleClause);
|
|
|
|
READ_ENUM_FIELD(tvtype, TvVersionType);
|
|
READ_NODE_FIELD(tvver);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static DefElem* _readDefElem(DefElem* local_node)
|
|
{
|
|
READ_LOCALS_NULL(DefElem);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_STRING_FIELD(defnamespace);
|
|
READ_STRING_FIELD(defname);
|
|
READ_NODE_FIELD(arg);
|
|
READ_ENUM_FIELD(defaction, DefElemAction);
|
|
|
|
IF_EXIST(begin_location) {
|
|
READ_INT_FIELD(begin_location);
|
|
}
|
|
|
|
IF_EXIST(end_location) {
|
|
READ_INT_FIELD(end_location);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static ErrorCacheEntry* _readErrorCacheEntry(ErrorCacheEntry* local_node)
|
|
{
|
|
READ_LOCALS_NULL(ErrorCacheEntry);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_NODE_FIELD(rte);
|
|
READ_STRING_FIELD(filename);
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecToRow* _readVecToRow(void)
|
|
{
|
|
READ_LOCALS_NO_FIELDS(VecToRow);
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_END();
|
|
}
|
|
|
|
static RowToVec* _readRowToVec(void)
|
|
{
|
|
READ_LOCALS_NO_FIELDS(RowToVec);
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_END();
|
|
}
|
|
|
|
static VecSort* _readVecSort(VecSort* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecSort);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(sortColIdx, numCols);
|
|
READ_OID_ARRAY(sortOperators, numCols);
|
|
READ_OID_ARRAY(collations, numCols);
|
|
READ_BOOL_ARRAY(nullsFirst, numCols);
|
|
read_mem_info(&local_node->mem_info);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecResult* _readVecResult(VecResult* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecResult);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
READ_NODE_FIELD(resconstantqual);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static CStoreScan* _readCStoreScan(CStoreScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(CStoreScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Scan
|
|
_readScan((Scan*)local_node);
|
|
|
|
READ_NODE_FIELD(cstorequal);
|
|
READ_NODE_FIELD(minMaxInfo);
|
|
READ_ENUM_FIELD(relStoreLocation, RelstoreType);
|
|
READ_BOOL_FIELD(is_replica_table);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
#ifdef ENABLE_MULTIPLE_NODES
|
|
static TsStoreScan* _readTsStoreScan(TsStoreScan *local_node)
|
|
{
|
|
READ_LOCALS_NULL(TsStoreScan);
|
|
READ_TEMP_LOCALS();
|
|
// Read Scan
|
|
_readScan((Scan *)local_node);
|
|
|
|
READ_NODE_FIELD(tsstorequal);
|
|
READ_NODE_FIELD(minMaxInfo);
|
|
READ_ENUM_FIELD(relStoreLocation, RelstoreType);
|
|
READ_BOOL_FIELD(is_replica_table);
|
|
READ_INT_FIELD(sort_by_time_colidx);
|
|
READ_INT_FIELD(limit);
|
|
READ_BOOL_FIELD(is_simple_scan);
|
|
READ_BOOL_FIELD(has_sort);
|
|
READ_INT_FIELD(series_func_calls);
|
|
READ_INT_FIELD(top_key_func_arg);
|
|
READ_DONE();
|
|
}
|
|
#endif /* ENABLE_MULTIPLE_NODES */
|
|
|
|
static VecSubqueryScan* _readVecSubqueryScan(VecSubqueryScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecSubqueryScan);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Scan
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_NODE_FIELD(subplan);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecModifyTable* _readVecModifyTable(VecModifyTable* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecModifyTable);
|
|
READ_TEMP_LOCALS();
|
|
_readPlan(&local_node->plan);
|
|
READ_ENUM_FIELD(operation, CmdType);
|
|
READ_BOOL_FIELD(canSetTag);
|
|
READ_NODE_FIELD(resultRelations);
|
|
READ_INT_FIELD(resultRelIndex);
|
|
READ_NODE_FIELD(plans);
|
|
READ_NODE_FIELD(returningLists);
|
|
READ_NODE_FIELD(rowMarks);
|
|
READ_INT_FIELD(epqParam);
|
|
READ_BOOL_FIELD(partKeyUpdated);
|
|
#ifdef PGXC
|
|
READ_NODE_FIELD(remote_plans);
|
|
READ_NODE_FIELD(remote_insert_plans);
|
|
READ_NODE_FIELD(remote_update_plans);
|
|
READ_NODE_FIELD(remote_delete_plans);
|
|
#endif
|
|
READ_NODE_FIELD(cacheEnt);
|
|
|
|
IF_EXIST(mergeTargetRelation) {
|
|
READ_INT_FIELD(mergeTargetRelation);
|
|
}
|
|
|
|
IF_EXIST(mergeSourceTargetList) {
|
|
READ_NODE_FIELD(mergeSourceTargetList);
|
|
}
|
|
|
|
IF_EXIST(mergeActionList) {
|
|
READ_NODE_FIELD(mergeActionList);
|
|
}
|
|
read_mem_info(&local_node->mem_info);
|
|
|
|
READ_DONE();
|
|
}
|
|
static VecAgg* _readVecAgg(VecAgg* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecAgg);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_ENUM_FIELD(aggstrategy, AggStrategy);
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(grpColIdx, numCols);
|
|
READ_OID_ARRAY(grpOperators, numCols);
|
|
READ_LONG_FIELD(numGroups);
|
|
READ_NODE_FIELD(groupingSets);
|
|
READ_NODE_FIELD(chain);
|
|
READ_BOOL_FIELD(is_final);
|
|
READ_BOOL_FIELD(single_node);
|
|
READ_BITMAPSET_FIELD(aggParams);
|
|
read_mem_info(&local_node->mem_info);
|
|
READ_BOOL_FIELD(is_sonichash);
|
|
READ_UINT_FIELD(skew_optimize);
|
|
|
|
IF_EXIST(unique_check) {
|
|
READ_BOOL_FIELD(unique_check);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecLimit* _readVecLimit(VecLimit* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecLimit);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_NODE_FIELD(limitOffset);
|
|
READ_NODE_FIELD(limitCount);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecHashJoin* _readVecHashJoin(VecHashJoin* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecHashJoin);
|
|
READ_HASHJOIN_FIELD();
|
|
}
|
|
|
|
static VecSetOp* _readVecSetOp(VecSetOp* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecSetOp);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_ENUM_FIELD(cmd, SetOpCmd);
|
|
READ_ENUM_FIELD(strategy, SetOpStrategy);
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(dupColIdx, numCols);
|
|
READ_OID_ARRAY(dupOperators, numCols);
|
|
READ_INT_FIELD(flagColIdx);
|
|
READ_INT_FIELD(firstFlag);
|
|
READ_LONG_FIELD(numGroups);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecGroup* _readVecGroup(VecGroup* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecGroup);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(grpColIdx, numCols);
|
|
READ_OID_ARRAY(grpOperators, numCols);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecUnique* _readVecUnique(VecUnique* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecUnique);
|
|
READ_TEMP_LOCALS();
|
|
|
|
// Read Plan
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_INT_FIELD(numCols);
|
|
READ_ATTR_ARRAY(uniqColIdx, numCols);
|
|
READ_OID_ARRAY(uniqOperators, numCols);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecPartIterator* _readVecPartIterator(VecPartIterator* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecPartIterator);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
|
|
READ_ENUM_FIELD(partType, PartitionType);
|
|
READ_INT_FIELD(itrs);
|
|
READ_ENUM_FIELD(direction, ScanDirection);
|
|
READ_NODE_FIELD(param);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecForeignScan* _readVecForeignScan(VecForeignScan* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecForeignScan);
|
|
READ_TEMP_LOCALS();
|
|
_readScan(&local_node->scan);
|
|
|
|
READ_FOREIGNSCAN();
|
|
|
|
if (local_node->bfNum > 0) {
|
|
local_node->bloomFilterSet = (BloomFilterSet**)palloc0(sizeof(BloomFilterSet*) * local_node->bfNum);
|
|
|
|
for (int cnt = 0; cnt < local_node->bfNum; cnt++) {
|
|
READ_NODE_FIELD(bloomFilterSet[cnt]);
|
|
}
|
|
}
|
|
|
|
READ_BOOL_FIELD(in_compute_pool);
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecStream* _readVecStream(VecStream* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecStream);
|
|
|
|
READ_STREAM_FIELD();
|
|
}
|
|
|
|
static HDFSTableAnalyze* _readHDFSTableAnalyze(HDFSTableAnalyze* local_node)
|
|
{
|
|
READ_LOCALS_NULL(HDFSTableAnalyze);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_NODE_FIELD(DnWorkFlow);
|
|
READ_INT_FIELD(DnCnt);
|
|
READ_BOOL_FIELD(isHdfsStore);
|
|
token = pg_strtok(&length); /* skip :fldname */
|
|
for (int i = 0; i < ANALYZE_MODE_MAX_NUM - 1; i++) {
|
|
token = pg_strtok(&length); /* get field value */
|
|
local_node->sampleRate[i] = atof(token);
|
|
}
|
|
READ_UINT_FIELD(orgCnNodeNo);
|
|
READ_BOOL_FIELD(isHdfsForeignTbl);
|
|
READ_BOOL_FIELD(sampleTableRequired);
|
|
READ_NODE_FIELD(tmpSampleTblNameList);
|
|
READ_ENUM_FIELD(disttype, DistributionType);
|
|
READ_INT_FIELD(memUsage.work_mem);
|
|
READ_INT_FIELD(memUsage.max_mem);
|
|
READ_DONE();
|
|
}
|
|
|
|
static VecWindowAgg* _readVecWindowAgg(VecWindowAgg* local_node)
|
|
{
|
|
READ_LOCALS_NULL(VecWindowAgg);
|
|
READ_TEMP_LOCALS();
|
|
|
|
_readPlan(&local_node->plan);
|
|
READ_UINT_FIELD(winref);
|
|
|
|
READ_INT_FIELD(partNumCols);
|
|
READ_ATTR_ARRAY(partColIdx, partNumCols);
|
|
READ_OID_ARRAY(partOperators, partNumCols);
|
|
READ_INT_FIELD(ordNumCols);
|
|
READ_ATTR_ARRAY(ordColIdx, ordNumCols);
|
|
READ_OID_ARRAY(ordOperators, ordNumCols);
|
|
|
|
READ_INT_FIELD(frameOptions);
|
|
READ_NODE_FIELD(startOffset);
|
|
READ_NODE_FIELD(endOffset);
|
|
read_mem_info(&local_node->mem_info);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static PlaceHolderVar* _readPlaceHolderVar()
|
|
{
|
|
READ_LOCALS(PlaceHolderVar);
|
|
|
|
READ_NODE_FIELD(phexpr);
|
|
READ_BITMAPSET_FIELD(phrels);
|
|
READ_UINT_FIELD(phid);
|
|
READ_UINT_FIELD(phlevelsup);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static AttrMetaData* _readAttrMetaData(AttrMetaData* local_node)
|
|
{
|
|
READ_LOCALS_NULL(AttrMetaData);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_STRING_FIELD(attname);
|
|
READ_OID_FIELD(atttypid);
|
|
READ_OID_FIELD(attlen);
|
|
READ_OID_FIELD(attnum);
|
|
READ_OID_FIELD(atttypmod);
|
|
READ_BOOL_FIELD(attbyval);
|
|
READ_CHAR_FIELD(attstorage);
|
|
READ_CHAR_FIELD(attalign);
|
|
READ_BOOL_FIELD(attnotnull);
|
|
READ_BOOL_FIELD(atthasdef);
|
|
READ_BOOL_FIELD(attisdropped);
|
|
READ_BOOL_FIELD(attislocal);
|
|
READ_INT_FIELD(attkvtype);
|
|
READ_INT_FIELD(attcmprmode);
|
|
READ_INT_FIELD(attinhcount);
|
|
READ_OID_FIELD(attcollation);
|
|
|
|
READ_TYPEINFO_FIELD(atttypid);
|
|
READ_DONE();
|
|
}
|
|
|
|
static RelationMetaData* _readRelationMetaData(RelationMetaData* local_node)
|
|
{
|
|
READ_LOCALS_NULL(RelationMetaData);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_OID_FIELD(rd_id);
|
|
|
|
READ_OID_FIELD(spcNode);
|
|
READ_OID_FIELD(dbNode);
|
|
READ_OID_FIELD(relNode);
|
|
|
|
IF_EXIST(bucketNode) {
|
|
READ_INT_FIELD(bucketNode);
|
|
}
|
|
|
|
READ_STRING_FIELD(relname);
|
|
READ_CHAR_FIELD(relkind);
|
|
READ_CHAR_FIELD(parttype);
|
|
|
|
READ_INT_FIELD(natts);
|
|
READ_NODE_FIELD(attrs);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static ForeignOptions* _readForeignOptions(ForeignOptions* local_node)
|
|
{
|
|
READ_LOCALS_NULL(ForeignOptions);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_ENUM_FIELD(stype, ServerTypeOption);
|
|
READ_NODE_FIELD(fOptions);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static BloomFilterSet* _readBloomFilterSet(BloomFilterSet* local_node)
|
|
{
|
|
READ_LOCALS_NULL(BloomFilterSet);
|
|
READ_TEMP_LOCALS();
|
|
READ_ULONG_FIELD(length);
|
|
local_node->data = _readUint64Array(local_node->length);
|
|
READ_ULONG_FIELD(numBits);
|
|
READ_ULONG_FIELD(numHashFunctions);
|
|
READ_ULONG_FIELD(numValues);
|
|
READ_ULONG_FIELD(maxNumValues);
|
|
READ_ULONG_FIELD(startupEntries);
|
|
|
|
elog(DEBUG1, "_readBloomFilterSet:: data");
|
|
StringInfo str = makeStringInfo();
|
|
appendStringInfo(str, "\n");
|
|
for (uint64 ii = 0; ii < local_node->length; ii++) {
|
|
if (local_node->data[ii] != 0) {
|
|
appendStringInfo(str, "not zore value in position %lu , value %lu,\n ", ii, local_node->data[ii]);
|
|
}
|
|
}
|
|
elog(DEBUG1, "%s", str->data);
|
|
resetStringInfo(str);
|
|
elog(DEBUG1, "_readBloomFilterSet:: valuePositions");
|
|
appendStringInfo(str, "\n");
|
|
if (local_node->startupEntries > 0) {
|
|
local_node->valuePositions = (ValueBit*)palloc0(local_node->startupEntries * sizeof(ValueBit));
|
|
appendStringInfo(str, "\n");
|
|
for (uint64 cell = 0; cell < local_node->startupEntries; cell++) {
|
|
uint16* array = _readUint16Array(MAX_HASH_FUNCTIONS);
|
|
for (int idx = 0; idx < MAX_HASH_FUNCTIONS; idx++) {
|
|
local_node->valuePositions[cell].position[idx] = array[idx];
|
|
|
|
appendStringInfo(str, "%d, ", local_node->valuePositions[cell].position[idx]);
|
|
}
|
|
appendStringInfo(str, "\n");
|
|
}
|
|
elog(DEBUG1, "%s", str->data);
|
|
}
|
|
|
|
READ_ULONG_FIELD(minIntValue);
|
|
READ_FLOAT_FIELD(minFloatValue);
|
|
READ_STRING_FIELD(minStringValue);
|
|
READ_ULONG_FIELD(maxIntValue);
|
|
READ_FLOAT_FIELD(maxFloatValue);
|
|
READ_STRING_FIELD(maxStringValue);
|
|
|
|
READ_BOOL_FIELD(addMinMax);
|
|
READ_BOOL_FIELD(hasMM);
|
|
READ_ENUM_FIELD(bfType, BloomFilterType);
|
|
READ_OID_FIELD(dataType);
|
|
READ_INT_FIELD(typeMod);
|
|
READ_OID_FIELD(collation);
|
|
|
|
READ_TYPEINFO_FIELD(dataType);
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the PurgeStmt struct.
|
|
* @in str, deserialized string.
|
|
* @return PurgeStmt struct.
|
|
*/
|
|
static PurgeStmt* ReadPurgeStmt()
|
|
{
|
|
READ_LOCALS(PurgeStmt);
|
|
READ_ENUM_FIELD(purtype, PurgeType);
|
|
READ_NODE_FIELD(purobj);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the TimeCapsuleStmt struct.
|
|
* @in str, deserialized string.
|
|
* @return TimeCapsuleStmt struct.
|
|
*/
|
|
static TimeCapsuleStmt* ReadTimeCapsuleStmt()
|
|
{
|
|
READ_LOCALS(TimeCapsuleStmt);
|
|
READ_ENUM_FIELD(tcaptype, TimeCapsuleType);
|
|
READ_NODE_FIELD(relation);
|
|
READ_STRING_FIELD(new_relname);
|
|
|
|
READ_NODE_FIELD(tvver);
|
|
READ_ENUM_FIELD(tvtype, TvVersionType);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the CommentStmt struct.
|
|
* @in str, deserialized string.
|
|
* @return CommentStmt struct.
|
|
*/
|
|
static CommentStmt* _readCommentStmt()
|
|
{
|
|
READ_LOCALS(CommentStmt);
|
|
READ_ENUM_FIELD(objtype, ObjectType);
|
|
READ_NODE_FIELD(objname);
|
|
READ_NODE_FIELD(objargs);
|
|
READ_STRING_FIELD(comment);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the TableLikeCtx struct.
|
|
* @in str, deserialized string.
|
|
* @return TableLikeCtx struct.
|
|
*/
|
|
static TableLikeCtx* _readTableLikeCtx()
|
|
{
|
|
READ_LOCALS(TableLikeCtx);
|
|
|
|
READ_UINT_FIELD(options);
|
|
READ_BOOL_FIELD(temp_table);
|
|
READ_BOOL_FIELD(hasoids);
|
|
READ_NODE_FIELD(columns);
|
|
READ_NODE_FIELD(ckconstraints);
|
|
READ_NODE_FIELD(comments);
|
|
READ_NODE_FIELD(cluster_keys);
|
|
READ_NODE_FIELD(partition);
|
|
READ_NODE_FIELD(inh_indexes);
|
|
READ_NODE_FIELD(reloptions);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the ColumnDef struct.
|
|
* @in str, deserialized string.
|
|
* @return ColumnDef struct.
|
|
*/
|
|
static ColumnDef* _readColumnDef()
|
|
{
|
|
READ_LOCALS(ColumnDef);
|
|
|
|
READ_STRING_FIELD(colname);
|
|
READ_NODE_FIELD(typname);
|
|
IF_EXIST(kvtype) {
|
|
READ_INT_FIELD(kvtype);
|
|
}
|
|
READ_INT_FIELD(inhcount);
|
|
READ_BOOL_FIELD(is_local);
|
|
READ_BOOL_FIELD(is_not_null);
|
|
READ_BOOL_FIELD(is_from_type);
|
|
READ_BOOL_FIELD(is_serial);
|
|
READ_CHAR_FIELD(storage);
|
|
READ_ENUM_FIELD(cmprs_mode, int8);
|
|
READ_NODE_FIELD(raw_default);
|
|
READ_NODE_FIELD(cooked_default);
|
|
READ_NODE_FIELD(collClause);
|
|
READ_OID_FIELD(collOid);
|
|
READ_NODE_FIELD(constraints);
|
|
READ_NODE_FIELD(fdwoptions);
|
|
IF_EXIST(columnOptions) {
|
|
READ_NODE_FIELD(columnOptions);
|
|
}
|
|
READ_NODE_FIELD(clientLogicColumnRef);
|
|
if (local_node->storage == '0') {
|
|
local_node->storage = 0;
|
|
}
|
|
|
|
IF_EXIST(generatedCol) {
|
|
READ_CHAR_FIELD(generatedCol);
|
|
}
|
|
IF_EXIST(update_default) {
|
|
READ_NODE_FIELD(update_default);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the ColumnRef struct.
|
|
* @in str, deserialized string.
|
|
* @return ColumnRef struct.
|
|
*/
|
|
static ColumnRef* _readColumnRef()
|
|
{
|
|
READ_LOCALS(ColumnRef);
|
|
|
|
READ_NODE_FIELD(fields);
|
|
IF_EXIST(prior) {
|
|
READ_BOOL_FIELD(prior);
|
|
}
|
|
IF_EXIST(indnum) {
|
|
READ_INT_FIELD(indnum);
|
|
}
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the TypeName struct.
|
|
* @in str, deserialized string.
|
|
* @return TypeName struct.
|
|
*/
|
|
static TypeName* _readTypeName()
|
|
{
|
|
READ_LOCALS(TypeName);
|
|
|
|
READ_NODE_FIELD(names);
|
|
READ_OID_FIELD(typeOid);
|
|
READ_BOOL_FIELD(setof);
|
|
READ_BOOL_FIELD(pct_type);
|
|
READ_NODE_FIELD(typmods);
|
|
READ_INT_FIELD(typemod);
|
|
READ_NODE_FIELD(arrayBounds);
|
|
READ_LOCATION_FIELD(location);
|
|
IF_EXIST(pct_rowtype)
|
|
{
|
|
READ_BOOL_FIELD(pct_rowtype);
|
|
}
|
|
IF_EXIST(end_location)
|
|
{
|
|
READ_LOCATION_FIELD(end_location);
|
|
}
|
|
|
|
READ_TYPEINFO_FIELD(typeOid);
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the IndexElem struct.
|
|
* @in str, deserialized string.
|
|
* @return IndexElem struct.
|
|
*/
|
|
static IndexElem* _readIndexElem()
|
|
{
|
|
READ_LOCALS(IndexElem);
|
|
|
|
READ_STRING_FIELD(name);
|
|
READ_NODE_FIELD(expr);
|
|
READ_STRING_FIELD(indexcolname);
|
|
READ_NODE_FIELD(collation);
|
|
READ_NODE_FIELD(opclass);
|
|
READ_ENUM_FIELD(ordering, SortByDir);
|
|
READ_ENUM_FIELD(nulls_ordering, SortByNulls);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the IndexStmt struct.
|
|
* @in str, deserialized string.
|
|
* @return IndexStmt struct.
|
|
*/
|
|
static IndexStmt* _readIndexStmt()
|
|
{
|
|
READ_LOCALS(IndexStmt);
|
|
|
|
READ_STRING_FIELD(schemaname);
|
|
READ_STRING_FIELD(idxname);
|
|
READ_NODE_FIELD(relation);
|
|
READ_STRING_FIELD(accessMethod);
|
|
READ_STRING_FIELD(tableSpace);
|
|
READ_NODE_FIELD(indexParams);
|
|
if (t_thrd.proc->workingVersionNum >= SUPPORT_GPI_VERSION_NUM) {
|
|
READ_NODE_FIELD(indexIncludingParams);
|
|
READ_BOOL_FIELD(isGlobal);
|
|
}
|
|
READ_NODE_FIELD(options);
|
|
READ_NODE_FIELD(whereClause);
|
|
READ_NODE_FIELD(excludeOpNames);
|
|
READ_STRING_FIELD(idxcomment);
|
|
READ_OID_FIELD(indexOid);
|
|
READ_OID_FIELD(oldNode);
|
|
READ_NODE_FIELD(partClause);
|
|
IF_EXIST(indexOptions) {
|
|
READ_NODE_FIELD(indexOptions);
|
|
}
|
|
READ_BOOL_FIELD(isPartitioned);
|
|
READ_BOOL_FIELD(unique);
|
|
READ_BOOL_FIELD(primary);
|
|
READ_BOOL_FIELD(isconstraint);
|
|
READ_BOOL_FIELD(deferrable);
|
|
READ_BOOL_FIELD(initdeferred);
|
|
READ_BOOL_FIELD(concurrent);
|
|
READ_NODE_FIELD(inforConstraint);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the Constraint struct.
|
|
* @in str, deserialized string.
|
|
* @return Constraint struct.
|
|
*/
|
|
static Constraint* _readConstraint()
|
|
{
|
|
READ_LOCALS(Constraint);
|
|
|
|
READ_STRING_FIELD(conname);
|
|
READ_BOOL_FIELD(deferrable);
|
|
READ_BOOL_FIELD(initdeferred);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
token = pg_strtok(&length); /* skip :fldname */
|
|
token = pg_strtok(&length); /* get field value */
|
|
|
|
#define MATCH_TYPE(tokname) (length == (sizeof(tokname) - 1) && memcmp(token, tokname, sizeof(tokname) - 1) == 0)
|
|
|
|
if (MATCH_TYPE("NULL")) {
|
|
local_node->contype = CONSTR_NULL;
|
|
} else if (MATCH_TYPE("NOT_NULL")) {
|
|
local_node->contype = CONSTR_NOTNULL;
|
|
} else if (MATCH_TYPE("DEFAULT")) {
|
|
local_node->contype = CONSTR_DEFAULT;
|
|
READ_NODE_FIELD(raw_expr);
|
|
if (t_thrd.proc->workingVersionNum >= ON_UPDATE_TIMESTAMP_VERSION_NUM) {
|
|
READ_NODE_FIELD(update_expr);
|
|
}
|
|
READ_STRING_FIELD(cooked_expr);
|
|
} else if (MATCH_TYPE("CHECK")) {
|
|
local_node->contype = CONSTR_CHECK;
|
|
READ_BOOL_FIELD(is_no_inherit);
|
|
READ_NODE_FIELD(raw_expr);
|
|
READ_STRING_FIELD(cooked_expr);
|
|
} else if (MATCH_TYPE("PRIMARY_KEY")) {
|
|
local_node->contype = CONSTR_PRIMARY;
|
|
READ_NODE_FIELD(keys);
|
|
if (t_thrd.proc->workingVersionNum >= SUPPORT_GPI_VERSION_NUM) {
|
|
READ_NODE_FIELD(including);
|
|
}
|
|
READ_NODE_FIELD(options);
|
|
READ_STRING_FIELD(indexname);
|
|
READ_STRING_FIELD(indexspace);
|
|
} else if (MATCH_TYPE("UNIQUE")) {
|
|
local_node->contype = CONSTR_UNIQUE;
|
|
READ_NODE_FIELD(keys);
|
|
if (t_thrd.proc->workingVersionNum >= SUPPORT_GPI_VERSION_NUM) {
|
|
READ_NODE_FIELD(including);
|
|
}
|
|
READ_NODE_FIELD(options);
|
|
READ_STRING_FIELD(indexname);
|
|
READ_STRING_FIELD(indexspace);
|
|
} else if (MATCH_TYPE("EXCLUSION")) {
|
|
local_node->contype = CONSTR_EXCLUSION;
|
|
READ_NODE_FIELD(exclusions);
|
|
if (t_thrd.proc->workingVersionNum >= SUPPORT_GPI_VERSION_NUM) {
|
|
READ_NODE_FIELD(including);
|
|
}
|
|
READ_NODE_FIELD(options);
|
|
READ_STRING_FIELD(indexname);
|
|
READ_STRING_FIELD(indexspace);
|
|
READ_STRING_FIELD(access_method);
|
|
READ_NODE_FIELD(where_clause);
|
|
} else if (MATCH_TYPE("FOREIGN_KEY")) {
|
|
local_node->contype = CONSTR_FOREIGN;
|
|
READ_NODE_FIELD(pktable);
|
|
READ_NODE_FIELD(fk_attrs);
|
|
READ_NODE_FIELD(pk_attrs);
|
|
READ_CHAR_FIELD(fk_matchtype);
|
|
READ_CHAR_FIELD(fk_upd_action);
|
|
READ_CHAR_FIELD(fk_del_action);
|
|
READ_NODE_FIELD(old_conpfeqop);
|
|
READ_NODE_FIELD(old_pktable_oid);
|
|
READ_BOOL_FIELD(skip_validation);
|
|
READ_BOOL_FIELD(initially_valid);
|
|
} else if (MATCH_TYPE("CLUSTER")) {
|
|
local_node->contype = CONSTR_CLUSTER;
|
|
READ_NODE_FIELD(keys);
|
|
} else if (MATCH_TYPE("ATTR_DEFERRABLE")) {
|
|
local_node->contype = CONSTR_ATTR_DEFERRABLE;
|
|
} else if (MATCH_TYPE("ATTR_NOT_DEFERRABLE")) {
|
|
local_node->contype = CONSTR_ATTR_NOT_DEFERRABLE;
|
|
} else if (MATCH_TYPE("ATTR_DEFERRED")) {
|
|
local_node->contype = CONSTR_ATTR_DEFERRED;
|
|
} else if (MATCH_TYPE("ATTR_IMMEDIATE")) {
|
|
local_node->contype = CONSTR_ATTR_IMMEDIATE;
|
|
} else {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("_readConstraint(): badly contype \"%s\"...", token)));
|
|
}
|
|
IF_EXIST(constraintOptions) {
|
|
READ_NODE_FIELD(constraintOptions);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
static ClientLogicColumnParam* _readColumnParam ()
|
|
{
|
|
READ_LOCALS(ClientLogicColumnParam);
|
|
READ_ENUM_FIELD(key, ClientLogicColumnProperty);
|
|
READ_STRING_FIELD(value);
|
|
READ_UINT_FIELD(len);
|
|
READ_LOCATION_FIELD(location);
|
|
READ_DONE();
|
|
}
|
|
|
|
static ClientLogicGlobalParam* _readGlobalParam ()
|
|
{
|
|
READ_LOCALS(ClientLogicGlobalParam);
|
|
READ_ENUM_FIELD(key, ClientLogicGlobalProperty);
|
|
READ_STRING_FIELD(value);
|
|
READ_UINT_FIELD(len);
|
|
READ_LOCATION_FIELD(location);
|
|
READ_DONE();
|
|
}
|
|
|
|
static CreateClientLogicGlobal* _readGlobalSetting ()
|
|
{
|
|
READ_LOCALS(CreateClientLogicGlobal);
|
|
READ_NODE_FIELD(global_key_name);
|
|
READ_NODE_FIELD(global_setting_params);
|
|
READ_DONE();
|
|
}
|
|
|
|
static CreateClientLogicColumn* _readColumnSetting ()
|
|
{
|
|
READ_LOCALS(CreateClientLogicColumn);
|
|
READ_NODE_FIELD(column_key_name);
|
|
READ_NODE_FIELD(column_setting_params);
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the ClientLogicColumnRef struct.
|
|
* @in str, deserialized string.
|
|
* @return clientLogicColumnRef struct.
|
|
*/
|
|
static ClientLogicColumnRef* _readClientLogicColumnRef()
|
|
{
|
|
READ_LOCALS(ClientLogicColumnRef);
|
|
|
|
READ_NODE_FIELD(column_key_name);
|
|
READ_NODE_FIELD(orig_typname);
|
|
READ_NODE_FIELD(dest_typname);
|
|
READ_LOCATION_FIELD(location);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the RangePartitionDefState struct.
|
|
* @in str, deserialized string.
|
|
* @return RangePartitionDefState struct.
|
|
*/
|
|
static RangePartitionDefState* _readRangePartitionDefState()
|
|
{
|
|
READ_LOCALS(RangePartitionDefState);
|
|
|
|
READ_STRING_FIELD(partitionName);
|
|
READ_NODE_FIELD(boundary);
|
|
READ_STRING_FIELD(tablespacename);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static ListPartitionDefState* _readListPartitionDefState()
|
|
{
|
|
READ_LOCALS(ListPartitionDefState);
|
|
|
|
READ_STRING_FIELD(partitionName);
|
|
READ_NODE_FIELD(boundary);
|
|
READ_STRING_FIELD(tablespacename);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static HashPartitionDefState* _readHashPartitionDefState()
|
|
{
|
|
READ_LOCALS(HashPartitionDefState);
|
|
|
|
READ_STRING_FIELD(partitionName);
|
|
READ_NODE_FIELD(boundary);
|
|
READ_STRING_FIELD(tablespacename);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the IntervalPartitionDefState struct.
|
|
* @in str, deserialized string.
|
|
* @return IntervalPartitionDefState struct.
|
|
*/
|
|
static IntervalPartitionDefState* _readIntervalPartitionDefState()
|
|
{
|
|
READ_LOCALS(IntervalPartitionDefState);
|
|
|
|
READ_NODE_FIELD(partInterval);
|
|
READ_NODE_FIELD(intervalTablespaces);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the PartitionState struct.
|
|
* @in str, deserialized string.
|
|
* @return PartitionState struct.
|
|
*/
|
|
static PartitionState* _readPartitionState()
|
|
{
|
|
READ_LOCALS(PartitionState);
|
|
|
|
READ_CHAR_FIELD(partitionStrategy);
|
|
READ_NODE_FIELD(intervalPartDef);
|
|
READ_NODE_FIELD(partitionKey);
|
|
READ_NODE_FIELD(partitionList);
|
|
READ_ENUM_FIELD(rowMovement, RowMovementValue);
|
|
READ_NODE_FIELD(subPartitionState);
|
|
READ_NODE_FIELD(partitionNameList);
|
|
|
|
if (local_node->partitionStrategy == '0') {
|
|
local_node->partitionStrategy = 0;
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the RangePartitionindexDefState struct.
|
|
* @in str, deserialized string.
|
|
* @return RangePartitionindexDefState struct.
|
|
*/
|
|
static RangePartitionindexDefState* _readRangePartitionindexDefState()
|
|
{
|
|
READ_LOCALS(RangePartitionindexDefState);
|
|
|
|
READ_STRING_FIELD(name);
|
|
READ_STRING_FIELD(tablespace);
|
|
READ_NODE_FIELD(sublist);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the RangePartitionStartEndDefState struct.
|
|
* @in str, deserialized string.
|
|
* @return RangePartitionStartEndDefState struct.
|
|
*/
|
|
static RangePartitionStartEndDefState* _readRangePartitionStartEndDefState()
|
|
{
|
|
READ_LOCALS(RangePartitionStartEndDefState);
|
|
|
|
READ_STRING_FIELD(partitionName);
|
|
READ_NODE_FIELD(startValue);
|
|
READ_NODE_FIELD(endValue);
|
|
READ_NODE_FIELD(everyValue);
|
|
READ_STRING_FIELD(tableSpaceName);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the SplitPartitionState struct.
|
|
* @in str, deserialized string.
|
|
* @return SplitPartitionState struct.
|
|
*/
|
|
static SplitPartitionState* _readSplitPartitionState()
|
|
{
|
|
READ_LOCALS(SplitPartitionState);
|
|
|
|
IF_EXIST(splitType) {
|
|
READ_ENUM_FIELD(splitType, SplitPartitionType);
|
|
}
|
|
READ_STRING_FIELD(src_partition_name);
|
|
READ_NODE_FIELD(partition_for_values);
|
|
READ_NODE_FIELD(split_point);
|
|
READ_NODE_FIELD(dest_partition_define_list);
|
|
IF_EXIST(newListSubPartitionBoundry) {
|
|
READ_NODE_FIELD(newListSubPartitionBoundry);
|
|
}
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/**
|
|
* @Description: deserialize the AddPartitionState struct.
|
|
* @in str, deserialized string.
|
|
* @return AddPartitionState struct.
|
|
*/
|
|
static AddPartitionState* _readAddPartitionState()
|
|
{
|
|
READ_LOCALS(AddPartitionState);
|
|
|
|
READ_NODE_FIELD(partitionList);
|
|
READ_BOOL_FIELD(isStartEnd);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static AddSubPartitionState* _readAddSubPartitionState()
|
|
{
|
|
READ_LOCALS(AddSubPartitionState);
|
|
|
|
READ_NODE_FIELD(subPartitionList);
|
|
READ_STRING_FIELD(partitionName);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static QualSkewInfo* _readQualSkewInfo()
|
|
{
|
|
READ_LOCALS_NO_FIELDS(QualSkewInfo);
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_ENUM_FIELD(skew_stream_type, SkewStreamType);
|
|
READ_NODE_FIELD(skew_quals);
|
|
READ_FLOAT_FIELD(qual_cost.startup);
|
|
READ_FLOAT_FIELD(qual_cost.per_tuple);
|
|
READ_FLOAT_FIELD(broadcast_ratio);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static TdigestData* _readTdigestData()
|
|
{
|
|
|
|
READ_TEMP_LOCALS();
|
|
token = pg_strtok(&length);
|
|
token = pg_strtok(&length);
|
|
double compression = atof(token);
|
|
int compressNum = 6;
|
|
int compressAdd = 10;
|
|
TdigestData* local_node = makeNodeWithSize(TdigestData, sizeof(TdigestData) +
|
|
(((compressNum * (int)compression) + compressAdd) * sizeof(CentroidPoint)));
|
|
local_node->compression = compression;
|
|
|
|
READ_INT_FIELD(cap);
|
|
READ_INT_FIELD(merged_nodes);
|
|
READ_INT_FIELD(unmerged_nodes);
|
|
READ_FLOAT_FIELD(merged_count);
|
|
READ_FLOAT_FIELD(unmerged_count);
|
|
READ_FLOAT_FIELD(valuetoc);
|
|
|
|
for (int i = 0; i < (local_node->merged_nodes + local_node->unmerged_nodes); i++) {
|
|
READ_FLOAT_FIELD(nodes[i].mean);
|
|
token = pg_strtok(&length);
|
|
local_node->nodes[i].count = atol(token);
|
|
}
|
|
READ_DONE();
|
|
}
|
|
|
|
static AutoIncrement* _readAutoIncrement()
|
|
{
|
|
READ_LOCALS(AutoIncrement);
|
|
|
|
READ_NODE_FIELD(expr);
|
|
READ_OID_FIELD(autoincin_funcid);
|
|
READ_OID_FIELD(autoincout_funcid);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static PrefixKey* _readPrefixKey()
|
|
{
|
|
READ_LOCALS(PrefixKey);
|
|
|
|
READ_NODE_FIELD(arg);
|
|
READ_INT_FIELD(length);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static UserSetElem* _readUserSetElem()
|
|
{
|
|
READ_LOCALS(UserSetElem);
|
|
|
|
READ_NODE_FIELD(name);
|
|
READ_NODE_FIELD(val);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
static UserVar* _readUserVar()
|
|
{
|
|
READ_LOCALS(UserVar);
|
|
|
|
READ_STRING_FIELD(name);
|
|
READ_NODE_FIELD(value);
|
|
|
|
READ_DONE();
|
|
}
|
|
|
|
/*
|
|
* parseNodeString
|
|
*
|
|
* Given a character string representing a node tree, parseNodeString creates
|
|
* the internal node structure.
|
|
*
|
|
* The string to be read must already have been loaded into pg_strtok().
|
|
*/
|
|
Node* parseNodeString(void)
|
|
{
|
|
void* return_value = NULL;
|
|
|
|
READ_TEMP_LOCALS();
|
|
|
|
/* Guard against stack overflow due to overly complex expressions */
|
|
check_stack_depth();
|
|
|
|
token = pg_strtok(&length);
|
|
|
|
#define MATCH(tokname, namelen) ((length == (namelen)) && (memcmp(token, (tokname), (namelen)) == 0))
|
|
|
|
if (MATCH("QUERY", 5)) {
|
|
return_value = _readQuery();
|
|
} else if (MATCH("SORTGROUPCLAUSE", 15)) {
|
|
return_value = _readSortGroupClause();
|
|
} else if (MATCH("GROUPINGSET", 11)) {
|
|
return_value = _readGroupingSet();
|
|
} else if (MATCH("WINDOWCLAUSE", 12)) {
|
|
return_value = _readWindowClause();
|
|
} else if (MATCH("ROWMARKCLAUSE", 13)) {
|
|
return_value = _readRowMarkClause();
|
|
} else if (MATCH("COMMONTABLEEXPR", 15)) {
|
|
return_value = _readCommonTableExpr();
|
|
} else if (MATCH("STARTWITHTARGETRELINFO", 22)) {
|
|
return_value = _readStartWithTargetRelInfo();
|
|
} else if (MATCH("SETOPERATIONSTMT", 16)) {
|
|
return_value = _readSetOperationStmt();
|
|
} else if (MATCH("ALIAS", 5)) {
|
|
return_value = _readAlias();
|
|
} else if (MATCH("RANGEVAR", 8)) {
|
|
return_value = _readRangeVar();
|
|
} else if (MATCH("INTOCLAUSE", 10)) {
|
|
return_value = _readIntoClause();
|
|
} else if (MATCH("VAR", 3)) {
|
|
return_value = _readVar();
|
|
} else if (MATCH("CONST", 5)) {
|
|
return_value = _readConst();
|
|
} else if (MATCH("PARAM", 5)) {
|
|
return_value = _readParam();
|
|
} else if (MATCH("AGGREF", 6)) {
|
|
return_value = _readAggref();
|
|
} else if (MATCH("GROUPINGFUNC", 12)) {
|
|
return_value = _readGroupingFunc();
|
|
} else if (MATCH("GROUPINGID", 10)) {
|
|
return_value = _readGroupingId();
|
|
} else if (MATCH("WINDOWFUNC", 10)) {
|
|
return_value = _readWindowFunc();
|
|
} else if (MATCH("ARRAYREF", 8)) {
|
|
return_value = _readArrayRef();
|
|
} else if (MATCH("FUNCEXPR", 8)) {
|
|
return_value = _readFuncExpr();
|
|
} else if (MATCH("NAMEDARGEXPR", 12)) {
|
|
return_value = _readNamedArgExpr();
|
|
} else if (MATCH("OPEXPR", 6)) {
|
|
return_value = _readOpExpr();
|
|
} else if (MATCH("DISTINCTEXPR", 12)) {
|
|
return_value = _readDistinctExpr();
|
|
} else if (MATCH("NULLIFEXPR", 10)) {
|
|
return_value = _readNullIfExpr();
|
|
} else if (MATCH("SCALARARRAYOPEXPR", 17)) {
|
|
return_value = _readScalarArrayOpExpr();
|
|
} else if (MATCH("BOOLEXPR", 8)) {
|
|
return_value = _readBoolExpr();
|
|
} else if (MATCH("SUBLINK", 7)) {
|
|
return_value = _readSubLink();
|
|
} else if (MATCH("FIELDSELECT", 11)) {
|
|
return_value = _readFieldSelect();
|
|
} else if (MATCH("FIELDSTORE", 10)) {
|
|
return_value = _readFieldStore();
|
|
} else if (MATCH("RELABELTYPE", 11)) {
|
|
return_value = _readRelabelType();
|
|
} else if (MATCH("COERCEVIAIO", 11)) {
|
|
return_value = _readCoerceViaIO();
|
|
} else if (MATCH("ARRAYCOERCEEXPR", 15)) {
|
|
return_value = _readArrayCoerceExpr();
|
|
} else if (MATCH("CONVERTROWTYPEEXPR", 18)) {
|
|
return_value = _readConvertRowtypeExpr();
|
|
} else if (MATCH("COLLATE", 7)) {
|
|
return_value = _readCollateExpr();
|
|
} else if (MATCH("CASE", 4)) {
|
|
return_value = _readCaseExpr();
|
|
} else if (MATCH("WHEN", 4)) {
|
|
return_value = _readCaseWhen();
|
|
} else if (MATCH("CASETESTEXPR", 12)) {
|
|
return_value = _readCaseTestExpr();
|
|
} else if (MATCH("ARRAY", 5)) {
|
|
return_value = _readArrayExpr();
|
|
} else if (MATCH("ROW", 3)) {
|
|
return_value = _readRowExpr();
|
|
} else if (MATCH("ROWCOMPARE", 10)) {
|
|
return_value = _readRowCompareExpr();
|
|
} else if (MATCH("COALESCE", 8)) {
|
|
return_value = _readCoalesceExpr();
|
|
} else if (MATCH("MINMAX", 6)) {
|
|
return_value = _readMinMaxExpr();
|
|
} else if (MATCH("XMLEXPR", 7)) {
|
|
return_value = _readXmlExpr();
|
|
} else if (MATCH("NULLTEST", 8)) {
|
|
return_value = _readNullTest();
|
|
} else if (MATCH("SETVARIABLEEXPR", 15)) {
|
|
return_value = _readSetVariableExpr();
|
|
} else if (MATCH("HASHFILTER", 10)) {
|
|
return_value = _readHashFilter();
|
|
} else if (MATCH("BOOLEANTEST", 11)) {
|
|
return_value = _readBooleanTest();
|
|
} else if (MATCH("COERCETODOMAIN", 14)) {
|
|
return_value = _readCoerceToDomain();
|
|
} else if (MATCH("COERCETODOMAINVALUE", 19)) {
|
|
return_value = _readCoerceToDomainValue();
|
|
} else if (MATCH("SETTODEFAULT", 12)) {
|
|
return_value = _readSetToDefault();
|
|
} else if (MATCH("CURRENTOFEXPR", 13)) {
|
|
return_value = _readCurrentOfExpr();
|
|
} else if (MATCH("TARGETENTRY", 11)) {
|
|
return_value = _readTargetEntry();
|
|
} else if (MATCH("PSEUDOTARGETENTRY", 17)) {
|
|
return_value = _readPseudoTargetEntry();
|
|
} else if (MATCH("STARTWITHOPTIONS", 16)) {
|
|
return_value = _readStartWithOptions(NULL);
|
|
} else if (MATCH("STARTWITHOP", 11)) {
|
|
return_value = _readStartWithOp(NULL);
|
|
} else if (MATCH("RANGETBLREF", 11)) {
|
|
return_value = _readRangeTblRef();
|
|
} else if (MATCH("JOINEXPR", 8)) {
|
|
return_value = _readJoinExpr();
|
|
} else if (MATCH("FROMEXPR", 8)) {
|
|
return_value = _readFromExpr();
|
|
} else if (MATCH("MERGEACTION", 11)) {
|
|
return_value = _readMergeAction();
|
|
} else if (MATCH("MERGEINTO", 9)) {
|
|
return_value = _readMergeStmt();
|
|
} else if (MATCH("RTE", 3)) {
|
|
return_value = _readRangeTblEntry();
|
|
} else if (MATCH("TABLESAMPLECLAUSE", 17)) {
|
|
return_value = _readTableSampleClause();
|
|
} else if (MATCH("TIMECAPSULECLAUSE", 17)) {
|
|
return_value = ReadTimeCapsuleClause();
|
|
} else if (MATCH("NOTIFY", 6)) {
|
|
return_value = _readNotifyStmt();
|
|
} else if (MATCH("DECLARECURSOR", 13)) {
|
|
return_value = _readDeclareCursorStmt();
|
|
} else if (MATCH("NESTLOOP", 8)) {
|
|
return_value = _readNestLoop();
|
|
} else if (MATCH("SEQSCAN", 7)) {
|
|
return_value = _readSeqScan();
|
|
} else if (MATCH("BITMAPHEAPSCAN", 14)) {
|
|
return_value = _readBitmapHeapScan(NULL);
|
|
} else if (MATCH("BITMAPINDEXSCAN", 15)) {
|
|
return_value = _readBitmapIndexScan(NULL);
|
|
} else if (MATCH("STREAM", 6)) {
|
|
return_value = _readStream(NULL);
|
|
} else if (MATCH("LIMIT", 5)) {
|
|
return_value = _readLimit(NULL);
|
|
} else if (MATCH("AGG", 3)) {
|
|
return_value = _readAgg(NULL);
|
|
} else if (MATCH("SCAN", 4)) {
|
|
return_value = _readScan(NULL);
|
|
} else if (MATCH("BUCKETINFO", 10)) {
|
|
return_value = _readBucketInfo(NULL);
|
|
} else if (MATCH("SUBQUERYSCAN", 12)) {
|
|
return_value = _readSubqueryScan(NULL);
|
|
} else if (MATCH("INDEXSCAN", 9)) {
|
|
return_value = _readIndexScan(NULL);
|
|
} else if (MATCH("JOIN", 4)) {
|
|
return_value = _readJoin(NULL);
|
|
} else if (MATCH("HASH", 4)) {
|
|
return_value = _readHash(NULL);
|
|
} else if (MATCH("HASHJOIN", 8)) {
|
|
return_value = _readHashJoin(NULL);
|
|
} else if (MATCH("MERGEJOIN", 9)) {
|
|
return_value = _readMergeJoin(NULL);
|
|
} else if (MATCH("REMOTEQUERY", 11)) {
|
|
return_value = _readRemoteQuery();
|
|
} else if (MATCH("EXEC_NODES", 10)) {
|
|
return_value = _readExecNodes();
|
|
} else if (MATCH("SLICEBOUNDARY", 13)) {
|
|
return_value = _readSliceBoundary();
|
|
} else if (MATCH("EXECBOUNDARY", 12)) {
|
|
return_value = _readExecBoundary();
|
|
} else if (MATCH("PLAN", 4)) {
|
|
return_value = _readPlan(NULL);
|
|
} else if (MATCH("MATERIAL", 8)) {
|
|
return_value = _readMaterial(NULL);
|
|
} else if (MATCH("APPEND", 6)) {
|
|
return_value = _readAppend(NULL);
|
|
} else if (MATCH("MERGEAPPEND", 11)) {
|
|
return_value = _readMergeAppend(NULL);
|
|
} else if (MATCH("SUBPLAN", 7)) {
|
|
return_value = _readSubPlan(NULL);
|
|
} else if (MATCH("SIMPLESORT", 10)) {
|
|
return_value = _readSimpleSort(NULL);
|
|
} else if (MATCH("SORT", 4)) {
|
|
return_value = _readSort(NULL);
|
|
} else if (MATCH("UNIQUE", 6)) {
|
|
return_value = _readUnique(NULL);
|
|
} else if (MATCH("PLANNEDSTMT", 11)) {
|
|
return_value = _readPlannedStmt();
|
|
} else if (MATCH("SETOP", 5)) {
|
|
return_value = _readSetOp(NULL);
|
|
} else if (MATCH("GROUP", 5)) {
|
|
return_value = _readGroup(NULL);
|
|
} else if (MATCH("LOCKROWS", 8)) {
|
|
return_value = _readLockRows(NULL);
|
|
} else if (MATCH("CTESCAN", 7)) {
|
|
return_value = _readCteScan(NULL);
|
|
} else if (MATCH("WINDOWAGG", 9)) {
|
|
return_value = _readWindowAgg(NULL);
|
|
} else if (MATCH("MODIFYTABLE", 11)) {
|
|
return_value = _readModifyTable(NULL);
|
|
} else if (MATCH("MERGEWHENCLAUSE", 15)) {
|
|
return_value = _readMergeWhenClause();
|
|
} else if (MATCH("RESULT", 6)) {
|
|
return_value = _readResult(NULL);
|
|
} else if (MATCH("VALUESSCAN", 10)) {
|
|
return_value = _readValuesScan(NULL);
|
|
} else if (MATCH("FUNCTIONSCAN", 12)) {
|
|
return_value = _readFunctionScan(NULL);
|
|
} else if (MATCH("RECURSIVEUNION", 14)) {
|
|
return_value = _readRecursiveUnion(NULL);
|
|
} else if (MATCH("WORKTABLESCAN", 13)) {
|
|
return_value = _readWorkTableScan(NULL);
|
|
} else if (MATCH("PLANINVALITEM", 13)) {
|
|
return_value = _readPlanInvalItem(NULL);
|
|
} else if (MATCH("BITMAPOR", 8)) {
|
|
return_value = _readBitmapOr(NULL);
|
|
} else if (MATCH("PLANROWMARK", 11)) {
|
|
return_value = _readPlanRowMark();
|
|
} else if (MATCH("WINDOWAGG", 9)) {
|
|
return_value = _readWindowAgg(NULL);
|
|
} else if (MATCH("FOREIGNSCAN", 11)) {
|
|
return_value = _readForeignScan(NULL);
|
|
} else if (MATCH("EXTENSIBLEPLAN", 14)) {
|
|
return_value = _readExtensiblePlan(NULL);
|
|
} else if (MATCH("FOREIGNPARTSTATE", 16)) {
|
|
return_value = _readForeignPartState(NULL);
|
|
} else if (MATCH("BITMAPAND", 9)) {
|
|
return_value = _readBitmapAnd(NULL);
|
|
} else if (MATCH("INDEXONLYSCAN", 13)) {
|
|
return_value = _readIndexOnlyScan(NULL);
|
|
} else if (MATCH("CSTOREINDEXSCAN", 15)) {
|
|
return_value = _readCStoreIndexScan(NULL);
|
|
} else if (MATCH("CSTOREINDEXCTIDSCAN", 19)) {
|
|
return_value = _readCStoreIndexCtidScan(NULL);
|
|
} else if (MATCH("CSTOREINDEXHEAPSCAN", 19)) {
|
|
return_value = _readCStoreIndexHeapScan(NULL);
|
|
} else if (MATCH("CSTOREINDEXAND", 14)) {
|
|
return_value = _readCStoreIndexAnd(NULL);
|
|
} else if (MATCH("CSTOREINDEXOR", 13)) {
|
|
return_value = _readCStoreIndexOr(NULL);
|
|
} else if (MATCH("PRUNINGRESULT", 13)) {
|
|
return_value = _readPruningResult(NULL);
|
|
} else if (MATCH("SUBPARTITIONPRUNINGRESULT", 25)) {
|
|
return_value = _readSubPartitionPruningResult(NULL);
|
|
} else if (MATCH("PARTITERATOR", 12)) {
|
|
return_value = _readPartIterator(NULL);
|
|
} else if (MATCH("PARTITERATORPARAM", 17)) {
|
|
return_value = _readPartIteratorParam(NULL);
|
|
} else if (MATCH("NESTLOOPPARAM", 13)) {
|
|
return_value = _readNestLoopParam();
|
|
} else if (MATCH("DISTFDWDATANODETASK", 19)) {
|
|
return_value = _readDistFdwDataNodeTask(NULL);
|
|
} else if (MATCH("DISTFDWFILESEGMENT", 18)) {
|
|
return_value = _readDistFdwFileSegment(NULL);
|
|
} else if (MATCH("SPLITINFO", 9)) {
|
|
return_value = _readSplitInfo(NULL);
|
|
} else if (MATCH("SPLITMAP", 8)) {
|
|
return_value = _readSplitMap(NULL);
|
|
} else if (MATCH("DFSPRIVATEITEM", 14)) {
|
|
return_value = _readDfsPrivateItem(NULL);
|
|
} else if (MATCH("DEFELEM", 7)) {
|
|
return_value = _readDefElem(NULL);
|
|
} else if (MATCH("TIDSCAN", 7)) {
|
|
return_value = _readTidScan(NULL);
|
|
} else if (MATCH("ERRORCACHEENTRY", 15)) {
|
|
return_value = _readErrorCacheEntry(NULL);
|
|
} else if (MATCH("ROWTOVEC", 8)) {
|
|
return_value = _readRowToVec();
|
|
} else if (MATCH("VECTOROW", 8)) {
|
|
return_value = _readVecToRow();
|
|
} else if (MATCH("VECSORT", 7)) {
|
|
return_value = _readVecSort(NULL);
|
|
} else if (MATCH("VECRESULT", 9)) {
|
|
return_value = _readVecResult(NULL);
|
|
} else if (MATCH("CSTORESCAN", 10)) {
|
|
return_value = _readCStoreScan(NULL);
|
|
#ifdef ENABLE_MULTIPLE_NODES
|
|
} else if (MATCH("TSSTORESCAN",11)) {
|
|
return_value = _readTsStoreScan(NULL);
|
|
#endif
|
|
} else if (MATCH("VECSUBQUERYSCAN", 15)) {
|
|
return_value = _readVecSubqueryScan(NULL);
|
|
} else if (MATCH("VECHASHJOIN", 11)) {
|
|
return_value = _readVecHashJoin(NULL);
|
|
} else if (MATCH("VECAGG", 6)) {
|
|
return_value = _readVecAgg(NULL);
|
|
} else if (MATCH("VECPARTITERATOR", 15)) {
|
|
return_value = _readVecPartIterator(NULL);
|
|
} else if (MATCH("VECAPPEND", 9)) {
|
|
return_value = _readVecAppend(NULL);
|
|
} else if (MATCH("VECSETOP", 8)) {
|
|
return_value = _readVecSetOp(NULL);
|
|
} else if (MATCH("VECFOREIGNSCAN", 14)) {
|
|
return_value = _readVecForeignScan(NULL);
|
|
} else if (MATCH("VECMODIFYTABLE", 14)) {
|
|
return_value = _readVecModifyTable(NULL);
|
|
} else if (MATCH("VECSTREAM", 9)) {
|
|
return_value = _readVecStream(NULL);
|
|
} else if (MATCH("VECLIMIT", 8)) {
|
|
return_value = _readVecLimit(NULL);
|
|
} else if (MATCH("VECGROUP", 8)) {
|
|
return_value = _readVecGroup(NULL);
|
|
} else if (MATCH("VECUNIQUE", 9)) {
|
|
return_value = _readVecUnique(NULL);
|
|
} else if ((MATCH("VECNESTLOOP", 11))) {
|
|
return_value = _readVecNestLoop();
|
|
} else if ((MATCH("VECMATERIAL", 11))) {
|
|
return_value = _readVecMaterial();
|
|
} else if ((MATCH("VECREMOTEQUERY", 14))) {
|
|
return_value = _readVecRemoteQuery();
|
|
} else if (MATCH("VECMERGEJOIN", 12)) {
|
|
return_value = _readVecMergeJoin(NULL);
|
|
} else if (MATCH("VECWINDOWAGG", 12)) {
|
|
return_value = _readVecWindowAgg(NULL);
|
|
} else if (MATCH("HDFSTABLEANALYZE", 16)) {
|
|
return_value = _readHDFSTableAnalyze(NULL);
|
|
} else if (MATCH("PLACEHOLDERVAR", 14)) {
|
|
return_value = _readPlaceHolderVar();
|
|
} else if (MATCH("ATTRMETADATA", 12)) {
|
|
return_value = _readAttrMetaData(NULL);
|
|
} else if (MATCH("RELATIONMETADATA", 16)) {
|
|
return_value = _readRelationMetaData(NULL);
|
|
} else if (MATCH("FOREIGNOPTIONS", 14)) {
|
|
return_value = _readForeignOptions(NULL);
|
|
} else if (MATCH("BLOOMFILTERSET", 14)) {
|
|
return_value = _readBloomFilterSet(NULL);
|
|
} else if (MATCH("HINTSTATE", 9)) {
|
|
return_value = _readHintState();
|
|
} else if (MATCH("JOINHINT", 8)) {
|
|
return_value = _readJoinHint();
|
|
} else if (MATCH("LEADINGHINT", 11)) {
|
|
return_value = _readLeadingHint();
|
|
} else if (MATCH("ROWSHINT", 8)) {
|
|
return_value = _readRowsHint();
|
|
} else if (MATCH("STREAMHINT", 10)) {
|
|
return_value = _readStreamHint();
|
|
} else if (MATCH("BLOCKNAMEHINT", 13)) {
|
|
return_value = _readBlockNameHint();
|
|
} else if (MATCH("SCANHINT", 8)) {
|
|
return_value = _readScanMethodHint();
|
|
} else if (MATCH("PGFDWREMOTEINFO", 15)) {
|
|
return_value = _readPgFdwRemoteInfo();
|
|
} else if (MATCH("SKEWHINT", 8)) {
|
|
return_value = _readSkewHint();
|
|
} else if (MATCH("SKEWHINTTRANSF", 14)) {
|
|
return_value = _readSkewHintTransf();
|
|
} else if (MATCH("SKEWRELINFO", 11)) {
|
|
return_value = _readSkewRelInfo();
|
|
} else if (MATCH("SKEWCOLUMNINFO", 14)) {
|
|
return_value = _readSkewColumnInfo();
|
|
} else if (MATCH("SKEWVALUEINFO", 13)) {
|
|
return_value = _readSkewValueInfo();
|
|
} else if (MATCH("QUALSKEWINFO", 12)) {
|
|
return_value = _readQualSkewInfo();
|
|
} else if (MATCH("PURGESTMT", 9)) {
|
|
return_value = ReadPurgeStmt();
|
|
} else if (MATCH("TIMECAPSULESTMT", 15)) {
|
|
return_value = ReadTimeCapsuleStmt();
|
|
} else if (MATCH("COMMENTSTMT", 11)) {
|
|
return_value = _readCommentStmt();
|
|
} else if (MATCH("TABLELIKECTX", 12)) {
|
|
return_value = _readTableLikeCtx();
|
|
} else if (MATCH("COLUMNDEF", 9)) {
|
|
return_value = _readColumnDef();
|
|
} else if (MATCH("COLUMNREF", 9)) {
|
|
return_value = _readColumnRef();
|
|
} else if (MATCH("TYPENAME", 8)) {
|
|
return_value = _readTypeName();
|
|
} else if (MATCH("INDEXELEM", 9)) {
|
|
return_value = _readIndexElem();
|
|
} else if (MATCH("INDEXSTMT", 9)) {
|
|
return_value = _readIndexStmt();
|
|
} else if (MATCH("CONSTRAINT", 10)) {
|
|
return_value = _readConstraint();
|
|
} else if (MATCH("PARTITIONSTATE", 14)) {
|
|
return_value = _readPartitionState();
|
|
} else if (MATCH("RANGEPARTITIONDEFSTATE", 22)) {
|
|
return_value = _readRangePartitionDefState();
|
|
} else if (MATCH("LISTPARTITIONDEFSTATE", 21)) {
|
|
return_value = _readListPartitionDefState();
|
|
} else if (MATCH("HASHPARTITIONDEFSTATE", 21)) {
|
|
return_value = _readHashPartitionDefState();
|
|
} else if (MATCH("INTERVALPARTITIONDEFSTATE", 25)) {
|
|
return_value = _readIntervalPartitionDefState();
|
|
} else if (MATCH("RANGEPARTITIONINDEXDEFSTATE", 27)) {
|
|
return_value = _readRangePartitionindexDefState();
|
|
} else if (MATCH("RANGEPARTITIONSTARTENDDEFSTATE", 30)) {
|
|
return_value = _readRangePartitionStartEndDefState();
|
|
} else if (MATCH("SPLITPARTITIONSTATE", 19)) {
|
|
return_value = _readSplitPartitionState();
|
|
} else if (MATCH("ADDPARTITIONSTATE", 17)) {
|
|
return_value = _readAddPartitionState();
|
|
} else if (MATCH("ADDSUBPARTITIONSTATE", 20)) {
|
|
return_value = _readAddSubPartitionState();
|
|
} else if (MATCH("CLIENTLOGICCOLUMNREF", 20)) {
|
|
return_value = _readClientLogicColumnRef();
|
|
} else if (MATCH("GLOBALPARAM", 11)) {
|
|
return_value = _readGlobalParam();
|
|
} else if (MATCH("COLUMNPARAM", 11)) {
|
|
return_value = _readColumnParam();
|
|
} else if (MATCH("GLOBALSETTING", 13)) {
|
|
return_value = _readGlobalSetting();
|
|
} else if (MATCH("COLUMNSETTING", 13)) {
|
|
return_value = _readColumnSetting();
|
|
} else if (MATCH("UPSERTEXPR", 10)) {
|
|
return_value = _readUpsertExpr();
|
|
} else if (MATCH("UPSERTCLAUSE", 12)) {
|
|
return_value = _readUpsertClause();
|
|
} else if (MATCH("PREDPUSHHINT", 12)) {
|
|
return_value = _readPredpushHint();
|
|
} else if (MATCH("PREDPUSHSAMELEVELHINT", 21)) {
|
|
return_value = _readPredpushSameLevelHint();
|
|
} else if (MATCH("REWRITEHINT", 11)) {
|
|
return_value = _readRewriteHint();
|
|
} else if (MATCH("GATHERHINT", 10)) {
|
|
return_value = _readGatherHint();
|
|
} else if (MATCH("NOEXPANDHINT", 12)) {
|
|
return_value = _readNoExpandHint();
|
|
} else if (MATCH("SETHINT", 7)) {
|
|
return_value = _readSetHint();
|
|
} else if (MATCH("PLANCACHEHINT", 13)) {
|
|
return_value = _readPlanCacheHint();
|
|
} else if (MATCH("NOGPCHINT", 9)) {
|
|
return_value = _readNoGPCHint();
|
|
} else if (MATCH("ROWNUM", 6)) {
|
|
return_value = _readRownum();
|
|
} else if (MATCH("COPY", 4)) {
|
|
return_value = _readCopyStmt();
|
|
} else if (MATCH("ALTERTABLE", 10)) {
|
|
return_value = _readAlterTableStmt();
|
|
} else if (MATCH("PLDEBUG_VARIABLE", 16)) {
|
|
return_value = _readPLDebug_variable();
|
|
} else if (MATCH("PLDEBUG_BREAKPOINT", 18)) {
|
|
return_value = _readPLDebug_breakPoint();
|
|
} else if (MATCH("PLDEBUG_FRAME", 13)) {
|
|
return_value = _readPLDebug_frame();
|
|
} else if (MATCH("TdigestData", 11)) {
|
|
return_value = _readTdigestData();
|
|
} else if (MATCH("AUTO_INCREMENT", 14)) {
|
|
return_value = _readAutoIncrement();
|
|
} else if (MATCH("PREFIXKEY", 9)) {
|
|
return_value = _readPrefixKey();
|
|
} else if (MATCH("USERSETELEM", 11)) {
|
|
return_value = _readUserSetElem();
|
|
} else if (MATCH("USERVAR", 7)) {
|
|
return_value = _readUserVar();
|
|
} else {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_UNRECOGNIZED_NODE_TYPE),
|
|
errmsg("parseNodeString(): badly formatted node string \"%s\"...", token)));
|
|
return_value = NULL; /* keep compiler quiet */
|
|
}
|
|
|
|
return (Node*)return_value;
|
|
}
|
|
|
|
/*
|
|
* readDatum
|
|
*
|
|
* Given a string representation of a constant, recreate the appropriate
|
|
* Datum. The string representation embeds length info, but not byValue,
|
|
* so we must be told that.
|
|
*/
|
|
static Datum readDatum(bool typbyval)
|
|
{
|
|
Size length, i;
|
|
int tokenLength;
|
|
char* token = NULL;
|
|
Datum res;
|
|
char* s = NULL;
|
|
|
|
/*
|
|
* read the actual length of the value
|
|
*/
|
|
token = pg_strtok(&tokenLength);
|
|
length = atoui(token);
|
|
|
|
token = pg_strtok(&tokenLength); /* read the '[' */
|
|
if (token == NULL || token[0] != '[') {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
|
errmsg("expected \"[\" to start datum, but got \"%s\"; length = %lu",
|
|
token ? (const char*)token : "[NULL]",
|
|
(unsigned long)length)));
|
|
}
|
|
|
|
if (typbyval) {
|
|
if (length > (Size)sizeof(Datum))
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
|
errmsg("byval datum but length = %lu", (unsigned long)length)));
|
|
|
|
res = (Datum)0;
|
|
s = (char*)(&res);
|
|
for (i = 0; i < (Size)sizeof(Datum); i++) {
|
|
token = pg_strtok(&tokenLength);
|
|
s[i] = (char)atoi(token);
|
|
}
|
|
} else if (length <= 0) {
|
|
res = (Datum)NULL;
|
|
} else {
|
|
s = (char*)palloc(length);
|
|
for (i = 0; i < length; i++) {
|
|
token = pg_strtok(&tokenLength);
|
|
s[i] = (char)atoi(token);
|
|
}
|
|
res = PointerGetDatum(s);
|
|
}
|
|
|
|
token = pg_strtok(&tokenLength); /* read the ']' */
|
|
if (token == NULL || token[0] != ']') {
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
|
errmsg("expected \"]\" to end datum, but got \"%s\"; length = %lu",
|
|
token ? (const char*)token : "[NULL]",
|
|
(unsigned long)length)));
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
/*
|
|
* read_mem_info
|
|
*
|
|
* Given a string representation of OpMemInfo structure, recreate the structure
|
|
*/
|
|
static void read_mem_info(OpMemInfo* local_node)
|
|
{
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_FLOAT_FIELD(opMem);
|
|
READ_FLOAT_FIELD(minMem);
|
|
READ_FLOAT_FIELD(maxMem);
|
|
READ_FLOAT_FIELD(regressCost);
|
|
}
|
|
|
|
/*
|
|
* _readCursorData
|
|
*
|
|
* Given a string representation of Cursor_Data structure, recreate the structure
|
|
*/
|
|
static void _readCursorData(Cursor_Data* local_node)
|
|
{
|
|
READ_TEMP_LOCALS();
|
|
|
|
READ_INT_FIELD(row_count);
|
|
READ_INT_FIELD(cur_dno);
|
|
READ_BOOL_FIELD(is_open);
|
|
READ_BOOL_FIELD(found);
|
|
READ_BOOL_FIELD(not_found);
|
|
READ_BOOL_FIELD(null_open);
|
|
READ_BOOL_FIELD(null_fetch);
|
|
}
|
|
|
|
/*
|
|
* stringToNode_skip_extern_fields
|
|
*
|
|
* The object's oid is different between different nodes, so we send the object name
|
|
* and namespace to remote node, and re-parse the object name to local OID.
|
|
* But sometimes no need to do this.
|
|
* For example:
|
|
* create table t (a int default func());
|
|
* We send the SQL statement to other node, and the func LOCAL OID will be recorded
|
|
* in pg_attrdef's adbin, so no need to do re-parse the object name to LOCAL OID.
|
|
*/
|
|
void* stringToNode_skip_extern_fields(char* str)
|
|
{
|
|
void* retval = NULL;
|
|
|
|
PG_TRY();
|
|
{
|
|
skip_read_extern_fields = true;
|
|
|
|
retval = stringToNode(str);
|
|
|
|
skip_read_extern_fields = false;
|
|
}
|
|
|
|
PG_CATCH();
|
|
{
|
|
skip_read_extern_fields = false;
|
|
PG_RE_THROW();
|
|
}
|
|
|
|
PG_END_TRY();
|
|
|
|
return retval;
|
|
}
|