This is an automated email from the ASF dual-hosted git repository.
chenjinbao1989 pushed a commit to branch cbdb-postgres-merge
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
The following commit(s) were added to refs/heads/cbdb-postgres-merge by this
push:
new a6f1f3718ea Fix compile errors for read functions
a6f1f3718ea is described below
commit a6f1f3718ea8feb0493d720fd96e7045f3e8d7da
Author: Jinbao Chen <[email protected]>
AuthorDate: Wed Sep 24 21:57:14 2025 +0800
Fix compile errors for read functions
---
src/backend/nodes/outfast.c | 106 +++++++++++++++++-----------
src/backend/nodes/outfuncs.c | 132 ++++++++++++++++++++++-------------
src/backend/nodes/readfast.c | 33 +++++++--
src/backend/nodes/readfuncs.c | 15 ++--
src/backend/nodes/readfuncs_common.c | 96 ++++++++++---------------
5 files changed, 220 insertions(+), 162 deletions(-)
diff --git a/src/backend/nodes/outfast.c b/src/backend/nodes/outfast.c
index de8169c7b9e..bfc244b904a 100644
--- a/src/backend/nodes/outfast.c
+++ b/src/backend/nodes/outfast.c
@@ -545,47 +545,71 @@ _outAExpr(StringInfo str, A_Expr *node)
}
static void
-_outValue(StringInfo str, Value *value)
+_outInteger(StringInfo str, const Integer *node)
{
+ int16 vt = T_Integer;
+ appendBinaryStringInfo(str, (const char *)&vt, sizeof(int16));
+ appendBinaryStringInfo(str, (const char *)&node->ival, sizeof(long));
+}
+
- int16 vt = value->type;
+static void
+_outFloat(StringInfo str, const Float *node)
+{
+ int16 vt = T_Float;
+ int slen;
+
+ appendBinaryStringInfo(str, (const char *) &vt, sizeof(int16));
+ slen = (node->fval != NULL ? strlen(node->fval) : 0);
+ appendBinaryStringInfo(str, (const char *)&slen, sizeof(int));
+ if (slen > 0)
+ appendBinaryStringInfo(str, node->fval, slen);
+}
+
+static void
+_outBoolean(StringInfo str, const Boolean *node)
+{
+ int16 vt = T_Boolean;
appendBinaryStringInfo(str, (const char *)&vt, sizeof(int16));
- switch (value->type)
- {
- case T_Integer:
- appendBinaryStringInfo(str, (const char
*)&value->val.ival, sizeof(long));
- break;
- case T_Float:
- case T_String:
- case T_BitString:
- {
- int slen = (value->val.str != NULL ?
strlen(value->val.str) : 0);
- appendBinaryStringInfo(str, (const char
*)&slen, sizeof(int));
- if (slen > 0)
- appendBinaryStringInfo(str,
value->val.str, slen);
- }
- break;
- case T_Null:
- /* nothing to do */
- break;
- default:
- elog(ERROR, "unrecognized node type: %d", (int)
value->type);
- break;
- }
+ appendBinaryStringInfo(str, (const char *)&node->boolval, sizeof(long));
}
+
+static void
+_outString(StringInfo str, const String *node)
+{
+ int16 vt = T_String;
+ int slen;
+
+ appendBinaryStringInfo(str, (const char *) &vt, sizeof(int16));
+ slen = (node->sval != NULL ? strlen(node->sval) : 0);
+ appendBinaryStringInfo(str, (const char *)&slen, sizeof(int));
+ if (slen > 0)
+ appendBinaryStringInfo(str, node->sval, slen);
+}
+
+static void
+_outBitString(StringInfo str, const BitString *node)
+{
+ int16 vt = T_BitString;
+ int slen;
+
+ appendBinaryStringInfo(str, (const char *) &vt, sizeof(int16));
+ slen = (node->bsval != NULL ? strlen(node->bsval) : 0);
+ appendBinaryStringInfo(str, (const char *)&slen, sizeof(int));
+ if (slen > 0)
+ appendBinaryStringInfo(str, node->bsval, slen);
+}
+
+
static void
_outAConst(StringInfo str, A_Const *node)
{
WRITE_NODE_TYPE("A_CONST");
- if (node->isnull)
- appendStringInfoString(str, " NULL");
- else
- {
- appendStringInfoString(str, " :val ");
- outNode(str, &node->val);
- }
+ if (!node->isnull)
+ _outNode(str, &node->val);
+
WRITE_LOCATION_FIELD(location);
}
@@ -876,14 +900,18 @@ _outNode(StringInfo str, void *obj)
}
else if (IsA(obj, List) ||IsA(obj, IntList) || IsA(obj, OidList))
_outList(str, obj);
- else if (IsA(obj, Integer) ||
- IsA(obj, Float) ||
- IsA(obj, String) ||
- IsA(obj, Null) ||
- IsA(obj, BitString))
- {
- _outValue(str, obj);
- }
+ else if (IsA(obj, Integer))
+ _outInteger(str, (Integer *) obj);
+ else if (IsA(obj, Float))
+ _outFloat(str, (Float *) obj);
+ else if (IsA(obj, Boolean))
+ _outBoolean(str, (Boolean *) obj);
+ else if (IsA(obj, String))
+ _outString(str, (String *) obj);
+ else if (IsA(obj, BitString))
+ _outBitString(str, (BitString *) obj);
+ else if (IsA(obj, Bitmapset))
+ outBitmapset(str, (Bitmapset *) obj);
else
{
switch (nodeTag(obj))
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index f34620f400a..51fd5f00df4 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -216,6 +216,11 @@ outToken(StringInfo str, const char *s)
appendStringInfoString(str, "<>");
return;
}
+ if (*s == '\0')
+ {
+ appendStringInfoString(str, "\"\"");
+ return;
+ }
/*
* Look for characters or patterns that are treated specially by read.c
@@ -249,6 +254,13 @@ outChar(StringInfo str, char c)
{
char in[2];
+ /* Traditionally, we've represented \0 as <>, so keep doing that */
+ if (c == '\0')
+ {
+ appendStringInfoString(str, "<>");
+ return;
+ }
+
in[0] = c;
in[1] = '\0';
@@ -261,7 +273,7 @@ outChar(StringInfo str, char c)
static void
outDouble(StringInfo str, double d)
{
- char buf[DOUBLE_SHORTEST_DECIMAL_LEN];
+ char buf[DOUBLE_SHORTEST_DECIMAL_LEN];
double_to_shortest_decimal_buf(d, buf);
appendStringInfoString(str, buf);
@@ -278,6 +290,8 @@ _outList(StringInfo str, const List *node)
appendStringInfoChar(str, 'i');
else if (IsA(node, OidList))
appendStringInfoChar(str, 'o');
+ else if (IsA(node, XidList))
+ appendStringInfoChar(str, 'x');
foreach(lc, node)
{
@@ -296,6 +310,8 @@ _outList(StringInfo str, const List *node)
appendStringInfo(str, " %d", lfirst_int(lc));
else if (IsA(node, OidList))
appendStringInfo(str, " %u", lfirst_oid(lc));
+ else if (IsA(node, XidList))
+ appendStringInfo(str, " %u", lfirst_xid(lc));
else
elog(ERROR, "unrecognized list node type: %d",
(int) node->type);
@@ -3850,46 +3866,6 @@ _outAExpr(StringInfo str, const A_Expr *node)
WRITE_LOCATION_FIELD(location);
}
-static void
-_outValue(StringInfo str, const Value *value)
-{
- switch (value->type)
- {
- case T_Integer:
- appendStringInfo(str, "%d", value->val.ival);
- break;
- case T_Float:
-
- /*
- * We assume the value is a valid numeric literal and
so does not
- * need quoting.
- */
- appendStringInfoString(str, value->val.str);
- break;
- case T_String:
-
- /*
- * We use outToken to provide escaping of the string's
content,
- * but we don't want it to do anything with an empty
string.
- */
- appendStringInfoChar(str, '"');
- if (value->val.str[0] != '\0')
- outToken(str, value->val.str);
- appendStringInfoChar(str, '"');
- break;
- case T_BitString:
- /* internal representation already has leading 'b' */
- appendStringInfoString(str, value->val.str);
- break;
- case T_Null:
- /* this is seen only within A_Const, not in transformed
trees */
- appendStringInfoString(str, "NULL");
- break;
- default:
- elog(ERROR, "unrecognized node type: %d", (int)
value->type);
- break;
- }
-}
#endif /* COMPILING_BINARY_FUNCS */
static void
@@ -3925,6 +3901,56 @@ _outRawStmt(StringInfo str, const RawStmt *node)
}
#ifndef COMPILING_BINARY_FUNCS
+
+
+static void
+_outInteger(StringInfo str, const Integer *node)
+{
+ appendStringInfo(str, "%d", node->ival);
+}
+
+static void
+_outFloat(StringInfo str, const Float *node)
+{
+ /*
+ * We assume the value is a valid numeric literal and so does not need
+ * quoting.
+ */
+ appendStringInfoString(str, node->fval);
+}
+
+static void
+_outBoolean(StringInfo str, const Boolean *node)
+{
+ appendStringInfoString(str, node->boolval ? "true" : "false");
+}
+
+static void
+_outString(StringInfo str, const String *node)
+{
+ /*
+ * We use outToken to provide escaping of the string's content, but we
+ * don't want it to convert an empty string to '""', because we're
putting
+ * double quotes around the string already.
+ */
+ appendStringInfoChar(str, '"');
+ if (node->sval[0] != '\0')
+ outToken(str, node->sval);
+ appendStringInfoChar(str, '"');
+}
+
+static void
+_outBitString(StringInfo str, const BitString *node)
+{
+ /*
+ * The lexer will always produce a string starting with 'b' or 'x'.
There
+ * might be characters following that that need escaping, but outToken
+ * won't escape the 'b' or 'x'. This is relied on by nodeTokenType.
+ */
+ Assert(node->bsval[0] == 'b' || node->bsval[0] == 'x');
+ outToken(str, node->bsval);
+}
+
static void
_outAConst(StringInfo str, const A_Const *node)
{
@@ -4259,16 +4285,22 @@ outNode(StringInfo str, const void *obj)
if (obj == NULL)
appendStringInfoString(str, "<>");
- else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList))
+ else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList) ||
+ IsA(obj, XidList))
_outList(str, obj);
- else if (IsA(obj, Integer) ||
- IsA(obj, Float) ||
- IsA(obj, String) ||
- IsA(obj, BitString))
- {
- /* nodeRead does not want to see { } around these! */
- _outValue(str, obj);
- }
+ /* nodeRead does not want to see { } around these! */
+ else if (IsA(obj, Integer))
+ _outInteger(str, (Integer *) obj);
+ else if (IsA(obj, Float))
+ _outFloat(str, (Float *) obj);
+ else if (IsA(obj, Boolean))
+ _outBoolean(str, (Boolean *) obj);
+ else if (IsA(obj, String))
+ _outString(str, (String *) obj);
+ else if (IsA(obj, BitString))
+ _outBitString(str, (BitString *) obj);
+ else if (IsA(obj, Bitmapset))
+ outBitmapset(str, (Bitmapset *) obj);
else
{
appendStringInfoChar(str, '{');
diff --git a/src/backend/nodes/readfast.c b/src/backend/nodes/readfast.c
index 887f9eae433..2e344796aa4 100644
--- a/src/backend/nodes/readfast.c
+++ b/src/backend/nodes/readfast.c
@@ -463,15 +463,38 @@ _readAConst(void)
{
READ_LOCALS(A_Const);
- READ_ENUM_FIELD(val.type, NodeTag);
+ READ_ENUM_FIELD(val.node.type, NodeTag);
- switch (local_node->val.type)
+ switch (local_node->val.node.type)
{
case T_Integer:
- memcpy(&local_node->val.val.ival, read_str_ptr,
sizeof(long)); read_str_ptr+=sizeof(long);
+ memcpy(&local_node->val.ival.ival, read_str_ptr,
sizeof(long)); read_str_ptr+=sizeof(long);
+ break;
+ case T_Boolean:
+ memcpy(&local_node->val.boolval.boolval, read_str_ptr,
sizeof(long)); read_str_ptr+=sizeof(long);
break;
case T_Float:
+ {
+ int slen; char * nn;
+ memcpy(&slen, read_str_ptr, sizeof(int));
+ read_str_ptr+=sizeof(int);
+ nn = palloc(slen+1);
+ memcpy(nn,read_str_ptr,slen);
+ nn[slen] = '\0';
+ local_node->val.fval.fval = nn; read_str_ptr+=slen;
+ }
+ break;
case T_String:
+ {
+ int slen; char * nn;
+ memcpy(&slen, read_str_ptr, sizeof(int));
+ read_str_ptr+=sizeof(int);
+ nn = palloc(slen+1);
+ memcpy(nn,read_str_ptr,slen);
+ nn[slen] = '\0';
+ local_node->val.sval.sval = nn; read_str_ptr+=slen;
+ }
+ break;
case T_BitString:
{
int slen; char * nn;
@@ -480,7 +503,7 @@ _readAConst(void)
nn = palloc(slen+1);
memcpy(nn,read_str_ptr,slen);
nn[slen] = '\0';
- local_node->val.val.str = nn; read_str_ptr+=slen;
+ local_node->val.bsval.bsval = nn; read_str_ptr+=slen;
}
break;
case T_Null:
@@ -935,7 +958,7 @@ _readDynamicSeqScan(void)
{
READ_LOCALS(DynamicSeqScan);
- ReadCommonScan(&local_node->seqscan);
+ ReadCommonScan(&local_node->seqscan.scan);
READ_NODE_FIELD(partOids);
READ_NODE_FIELD(part_prune_info);
READ_NODE_FIELD(join_prune_paramids);
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 636e79d1cf4..5d9ae29a830 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -101,7 +101,7 @@
#define READ_UINT64_FIELD(fldname) \
token = pg_strtok(&length); /* skip :fldname */ \
token = pg_strtok(&length); /* get field value */ \
- local_node->fldname = pg_strtouint64(token, NULL, 10)
+ local_node->fldname = strtou64(token, NULL, 10)
/* Read a long integer field (anything written as ":fldname %ld") */
#define READ_LONG_FIELD(fldname) \
@@ -1453,10 +1453,15 @@ _readRangeTblEntry(void)
READ_CHAR_FIELD(relkind);
READ_INT_FIELD(rellockmode);
READ_NODE_FIELD(tablesample);
+ READ_UINT_FIELD(perminfoindex);
break;
case RTE_SUBQUERY:
READ_NODE_FIELD(subquery);
READ_BOOL_FIELD(security_barrier);
+ READ_OID_FIELD(relid);
+ READ_CHAR_FIELD(relkind);
+ READ_INT_FIELD(rellockmode);
+ READ_UINT_FIELD(perminfoindex);
break;
case RTE_JOIN:
READ_ENUM_FIELD(jointype, JoinType);
@@ -1523,12 +1528,6 @@ _readRangeTblEntry(void)
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(insertedCols);
- READ_BITMAPSET_FIELD(updatedCols);
- READ_BITMAPSET_FIELD(extraUpdatedCols);
READ_NODE_FIELD(securityQuals);
READ_BOOL_FIELD(forceDistRandom);
@@ -1911,7 +1910,7 @@ _readSeqScan(void)
{
READ_LOCALS_NO_FIELDS(SeqScan);
- ReadCommonScan(local_node);
+ ReadCommonScan(&local_node->scan);
READ_DONE();
}
diff --git a/src/backend/nodes/readfuncs_common.c
b/src/backend/nodes/readfuncs_common.c
index 92f9828c1d1..db259750bfd 100644
--- a/src/backend/nodes/readfuncs_common.c
+++ b/src/backend/nodes/readfuncs_common.c
@@ -43,65 +43,40 @@ _readAConst(void)
{
READ_LOCALS(A_Const);
- /* skip " :val " */
+ /* We expect either NULL or :val here */
token = pg_strtok(&length);
- if (length != 4 || token[0] != ':' || token[1] != 'v')
- elog(ERROR,"Unable to understand A_CONST node \"%.30s\"",
token);
-
- token = pg_strtok(&length);
- token = debackslash(token,length);
- local_node->val.type = T_String;
-
- if (token[0] == '"')
- {
- local_node->val.val.str = palloc(length - 1);
- strncpy(local_node->val.val.str , token+1, strlen(token)-2);
- local_node->val.val.str[strlen(token)-2] = '\0';
- }
- else if (length > 2 && (token[0] == 'b'|| token[0] == 'B') && (token[1]
== '\'' || token[1] == '"'))
- {
- local_node->val.type = T_BitString;
- local_node->val.val.str = palloc(length+1);
- strncpy(local_node->val.val.str , token, length);
- local_node->val.val.str[length] = '\0';
- }
+ if (length == 4 && strncmp(token, "NULL", 4) == 0)
+ local_node->isnull = true;
else
{
- bool isInt = true;
- bool isFloat = true;
- int i = 0;
- if (token[i] == ' ')
- i++;
- if (token[i] == '-' || token[i] == '+')
- i++;
- for (; i < length; i++)
- if (token[i] < '0' || token[i] > '9')
- {
- isInt = false;
- if (token[i] != '.' && token[i] != 'e' && token[i] !=
'E' && token[i] != '+' && token[i] != '-')
- isFloat = false;
- }
- if (isInt)
- {
- local_node->val.type = T_Integer;
- local_node->val.val.ival = atol(token);
- }
- else if (isFloat)
- {
- local_node->val.type = T_Float;
- local_node->val.val.str = palloc(length + 1);
- strcpy(local_node->val.val.str , token);
- }
- else
+ union ValUnion *tmp = nodeRead(NULL, 0);
+
+ /* To forestall valgrind complaints, copy only the valid data */
+ switch (nodeTag(tmp))
{
- elog(ERROR,"Deserialization problem: A_Const not
string, bitstring, float, or int");
- local_node->val.val.str = palloc(length + 1);
- strcpy(local_node->val.val.str , token);
+ case T_Integer:
+ memcpy(&local_node->val, tmp, sizeof(Integer));
+ break;
+ case T_Float:
+ memcpy(&local_node->val, tmp, sizeof(Float));
+ break;
+ case T_Boolean:
+ memcpy(&local_node->val, tmp, sizeof(Boolean));
+ break;
+ case T_String:
+ memcpy(&local_node->val, tmp, sizeof(String));
+ break;
+ case T_BitString:
+ memcpy(&local_node->val, tmp,
sizeof(BitString));
+ break;
+ default:
+ elog(ERROR, "unrecognized node type: %d",
+ (int) nodeTag(tmp));
+ break;
}
}
- /* CDB: 'location' field is not serialized */
- local_node->location = -1;
+ READ_LOCATION_FIELD(location);
READ_DONE();
}
@@ -363,9 +338,9 @@ _readAlterPublicationStmt()
READ_STRING_FIELD(pubname);
READ_NODE_FIELD(options);
- READ_NODE_FIELD(tables);
+ READ_NODE_FIELD(pubobjects);
READ_BOOL_FIELD(for_all_tables);
- READ_ENUM_FIELD(tableAction, DefElemAction);
+ READ_ENUM_FIELD(action, AlterPublicationAction);
READ_DONE();
}
@@ -903,7 +878,7 @@ _readCreatePublicationStmt()
READ_STRING_FIELD(pubname);
READ_NODE_FIELD(options);
- READ_NODE_FIELD(tables);
+ READ_NODE_FIELD(pubobjects);
READ_BOOL_FIELD(for_all_tables);
READ_DONE();
@@ -1260,7 +1235,7 @@ _readGrantRoleStmt(void)
READ_NODE_FIELD(granted_roles);
READ_NODE_FIELD(grantee_roles);
READ_BOOL_FIELD(is_grant);
- READ_BOOL_FIELD(admin_opt);
+ READ_NODE_FIELD(opt);
READ_NODE_FIELD(grantor);
READ_ENUM_FIELD(behavior, DropBehavior);
Assert(local_node->behavior <= DROP_CASCADE);
@@ -1346,10 +1321,11 @@ _readIndexStmt(void)
READ_NODE_FIELD(excludeOpNames);
READ_STRING_FIELD(idxcomment);
READ_OID_FIELD(indexOid);
- READ_OID_FIELD(oldNode);
+ READ_OID_FIELD(oldNumber);
READ_UINT_FIELD(oldCreateSubid);
- READ_UINT_FIELD(oldFirstRelfilenodeSubid);
+ READ_UINT_FIELD(oldFirstRelfilelocatorSubid);
READ_BOOL_FIELD(unique);
+ READ_BOOL_FIELD(nulls_not_distinct);
READ_BOOL_FIELD(primary);
READ_BOOL_FIELD(isconstraint);
READ_BOOL_FIELD(deferrable);
@@ -1472,7 +1448,7 @@ _readPartitionSpec(void)
{
READ_LOCALS(PartitionSpec);
- READ_STRING_FIELD(strategy);
+ READ_ENUM_FIELD(strategy, PartitionStrategy);
READ_NODE_FIELD(partParams);
READ_LOCATION_FIELD(location);
@@ -1568,7 +1544,7 @@ _readRestrictInfo(void)
READ_BOOL_FIELD(leakproof);
READ_ENUM_FIELD(has_volatile, VolatileFunctionStatus);
READ_UINT_FIELD(security_level);
- WRITE_INT_FIELD(num_base_rels);
+ READ_INT_FIELD(num_base_rels);
READ_BOOL_FIELD(contain_outer_query_references);
READ_BITMAPSET_FIELD(clause_relids);
READ_BITMAPSET_FIELD(required_relids);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]