diff options
Diffstat (limited to 'src/backend/nodes/readfuncs.c')
-rw-r--r-- | src/backend/nodes/readfuncs.c | 458 |
1 files changed, 246 insertions, 212 deletions
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index eca2e3017b0..bb4a565a8b5 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.140 2002/11/25 21:29:38 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.141 2002/12/12 15:49:28 tgl Exp $ * * NOTES * Path and Plan nodes do not have any readfuncs support, because we @@ -302,38 +302,30 @@ _readResdom(void) READ_DONE(); } -/* - * _readExpr - */ -static Expr * -_readExpr(void) +static Alias * +_readAlias(void) { - READ_LOCALS(Expr); + READ_LOCALS(Alias); - READ_OID_FIELD(typeOid); + READ_STRING_FIELD(aliasname); + READ_NODE_FIELD(colnames); - /* do-it-yourself enum representation */ - token = pg_strtok(&length); /* skip :opType */ - token = pg_strtok(&length); /* get field value */ - if (strncmp(token, "op", 2) == 0) - local_node->opType = OP_EXPR; - else if (strncmp(token, "distinct", 8) == 0) - local_node->opType = DISTINCT_EXPR; - else if (strncmp(token, "func", 4) == 0) - local_node->opType = FUNC_EXPR; - else if (strncmp(token, "or", 2) == 0) - local_node->opType = OR_EXPR; - else if (strncmp(token, "and", 3) == 0) - local_node->opType = AND_EXPR; - else if (strncmp(token, "not", 3) == 0) - local_node->opType = NOT_EXPR; - else if (strncmp(token, "subp", 4) == 0) - local_node->opType = SUBPLAN_EXPR; - else - elog(ERROR, "_readExpr: unknown opType \"%.*s\"", length, token); + READ_DONE(); +} - READ_NODE_FIELD(oper); - READ_NODE_FIELD(args); +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_ENUM_FIELD(inhOpt, InhOption); + READ_BOOL_FIELD(istemp); + READ_NODE_FIELD(alias); READ_DONE(); } @@ -358,27 +350,6 @@ _readVar(void) } /* - * _readArrayRef - */ -static ArrayRef * -_readArrayRef(void) -{ - READ_LOCALS(ArrayRef); - - READ_OID_FIELD(refrestype); - READ_INT_FIELD(refattrlength); - READ_INT_FIELD(refelemlength); - READ_BOOL_FIELD(refelembyval); - READ_CHAR_FIELD(refelemalign); - READ_NODE_FIELD(refupperindexpr); - READ_NODE_FIELD(reflowerindexpr); - READ_NODE_FIELD(refexpr); - READ_NODE_FIELD(refassgnexpr); - - READ_DONE(); -} - -/* * _readConst */ static Const * @@ -401,17 +372,72 @@ _readConst(void) } /* - * _readFunc + * _readParam + */ +static Param * +_readParam(void) +{ + READ_LOCALS(Param); + + READ_INT_FIELD(paramkind); + READ_INT_FIELD(paramid); + READ_STRING_FIELD(paramname); + READ_OID_FIELD(paramtype); + + READ_DONE(); +} + +/* + * _readAggref + */ +static Aggref * +_readAggref(void) +{ + READ_LOCALS(Aggref); + + READ_OID_FIELD(aggfnoid); + READ_OID_FIELD(aggtype); + READ_NODE_FIELD(target); + READ_BOOL_FIELD(aggstar); + READ_BOOL_FIELD(aggdistinct); + + READ_DONE(); +} + +/* + * _readArrayRef */ -static Func * -_readFunc(void) +static ArrayRef * +_readArrayRef(void) { - READ_LOCALS(Func); + READ_LOCALS(ArrayRef); + + READ_OID_FIELD(refrestype); + READ_INT_FIELD(refattrlength); + READ_INT_FIELD(refelemlength); + READ_BOOL_FIELD(refelembyval); + READ_CHAR_FIELD(refelemalign); + READ_NODE_FIELD(refupperindexpr); + READ_NODE_FIELD(reflowerindexpr); + READ_NODE_FIELD(refexpr); + READ_NODE_FIELD(refassgnexpr); + + READ_DONE(); +} + +/* + * _readFuncExpr + */ +static FuncExpr * +_readFuncExpr(void) +{ + READ_LOCALS(FuncExpr); READ_OID_FIELD(funcid); READ_OID_FIELD(funcresulttype); READ_BOOL_FIELD(funcretset); READ_ENUM_FIELD(funcformat, CoercionForm); + READ_NODE_FIELD(args); local_node->func_fcache = NULL; @@ -419,17 +445,28 @@ _readFunc(void) } /* - * _readOper + * _readOpExpr */ -static Oper * -_readOper(void) +static OpExpr * +_readOpExpr(void) { - READ_LOCALS(Oper); + READ_LOCALS(OpExpr); READ_OID_FIELD(opno); - READ_OID_FIELD(opid); + READ_OID_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.) + */ + local_node->opfuncid = InvalidOid; + READ_OID_FIELD(opresulttype); READ_BOOL_FIELD(opretset); + READ_NODE_FIELD(args); local_node->op_fcache = NULL; @@ -437,52 +474,55 @@ _readOper(void) } /* - * _readParam + * _readDistinctExpr */ -static Param * -_readParam(void) +static DistinctExpr * +_readDistinctExpr(void) { - READ_LOCALS(Param); - - READ_INT_FIELD(paramkind); - READ_INT_FIELD(paramid); - READ_STRING_FIELD(paramname); - READ_OID_FIELD(paramtype); + READ_LOCALS(DistinctExpr); - READ_DONE(); -} + READ_OID_FIELD(opno); + READ_OID_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.) + */ + local_node->opfuncid = InvalidOid; -/* - * _readAggref - */ -static Aggref * -_readAggref(void) -{ - READ_LOCALS(Aggref); + READ_OID_FIELD(opresulttype); + READ_BOOL_FIELD(opretset); + READ_NODE_FIELD(args); - READ_OID_FIELD(aggfnoid); - READ_OID_FIELD(aggtype); - READ_NODE_FIELD(target); - READ_BOOL_FIELD(aggstar); - READ_BOOL_FIELD(aggdistinct); - /* aggno is not saved since it is just executor state */ + local_node->op_fcache = NULL; READ_DONE(); } -static RangeVar * -_readRangeVar(void) +/* + * _readBoolExpr + */ +static BoolExpr * +_readBoolExpr(void) { - READ_LOCALS(RangeVar); + READ_LOCALS(BoolExpr); - local_node->catalogname = NULL; /* not currently saved in output - * format */ + /* 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 + elog(ERROR, "_readBoolExpr: unknown boolop \"%.*s\"", length, token); - READ_STRING_FIELD(schemaname); - READ_STRING_FIELD(relname); - READ_ENUM_FIELD(inhOpt, InhOption); - READ_BOOL_FIELD(istemp); - READ_NODE_FIELD(alias); + READ_NODE_FIELD(args); READ_DONE(); } @@ -505,6 +545,10 @@ _readSubLink(void) } /* + * _readSubPlanExpr is not needed since it doesn't appear in stored rules. + */ + +/* * _readFieldSelect */ static FieldSelect * @@ -537,58 +581,6 @@ _readRelabelType(void) } /* - * _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(using); - 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(); -} - - -/* - * Stuff from parsenodes.h. - */ - -/* * _readCaseExpr */ static CaseExpr * @@ -664,17 +656,6 @@ _readConstraintTest(void) } /* - * _readDomainConstraintValue - */ -static DomainConstraintValue * -_readDomainConstraintValue(void) -{ - READ_LOCALS_NO_FIELDS(DomainConstraintValue); - - READ_DONE(); -} - -/* * _readConstraintTestValue */ static ConstraintTestValue * @@ -697,12 +678,63 @@ _readTargetEntry(void) READ_LOCALS(TargetEntry); READ_NODE_FIELD(resdom); - /* fjoin not supported ... */ READ_NODE_FIELD(expr); 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(using); + 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(); +} + + +/* + * Stuff from parsenodes.h. + */ + static ColumnRef * _readColumnRef(void) { @@ -760,13 +792,13 @@ _readExprFieldSelect(void) READ_DONE(); } -static Alias * -_readAlias(void) +/* + * _readDomainConstraintValue + */ +static DomainConstraintValue * +_readDomainConstraintValue(void) { - READ_LOCALS(Alias); - - READ_STRING_FIELD(aliasname); - READ_NODE_FIELD(colnames); + READ_LOCALS_NO_FIELDS(DomainConstraintValue); READ_DONE(); } @@ -835,53 +867,7 @@ parseNodeString(void) #define MATCH(tokname, namelen) \ (length == namelen && strncmp(token, tokname, namelen) == 0) - if (MATCH("AGGREF", 6)) - return_value = _readAggref(); - else if (MATCH("SUBLINK", 7)) - return_value = _readSubLink(); - else if (MATCH("FIELDSELECT", 11)) - return_value = _readFieldSelect(); - else if (MATCH("RELABELTYPE", 11)) - return_value = _readRelabelType(); - else if (MATCH("RANGETBLREF", 11)) - return_value = _readRangeTblRef(); - else if (MATCH("FROMEXPR", 8)) - return_value = _readFromExpr(); - else if (MATCH("JOINEXPR", 8)) - return_value = _readJoinExpr(); - else if (MATCH("RESDOM", 6)) - return_value = _readResdom(); - else if (MATCH("EXPR", 4)) - return_value = _readExpr(); - else if (MATCH("ARRAYREF", 8)) - return_value = _readArrayRef(); - else if (MATCH("VAR", 3)) - return_value = _readVar(); - else if (MATCH("CONST", 5)) - return_value = _readConst(); - else if (MATCH("FUNC", 4)) - return_value = _readFunc(); - else if (MATCH("OPER", 4)) - return_value = _readOper(); - else if (MATCH("PARAM", 5)) - return_value = _readParam(); - else if (MATCH("TARGETENTRY", 11)) - return_value = _readTargetEntry(); - else if (MATCH("RANGEVAR", 8)) - return_value = _readRangeVar(); - else if (MATCH("COLUMNREF", 9)) - return_value = _readColumnRef(); - else if (MATCH("COLUMNDEF", 9)) - return_value = _readColumnDef(); - else if (MATCH("TYPENAME", 8)) - return_value = _readTypeName(); - else if (MATCH("EXPRFIELDSELECT", 15)) - return_value = _readExprFieldSelect(); - else if (MATCH("ALIAS", 5)) - return_value = _readAlias(); - else if (MATCH("RTE", 3)) - return_value = _readRangeTblEntry(); - else if (MATCH("QUERY", 5)) + if (MATCH("QUERY", 5)) return_value = _readQuery(); else if (MATCH("NOTIFY", 6)) return_value = _readNotifyStmt(); @@ -891,6 +877,36 @@ parseNodeString(void) return_value = _readGroupClause(); else if (MATCH("SETOPERATIONSTMT", 16)) return_value = _readSetOperationStmt(); + else if (MATCH("RESDOM", 6)) + return_value = _readResdom(); + else if (MATCH("ALIAS", 5)) + return_value = _readAlias(); + else if (MATCH("RANGEVAR", 8)) + return_value = _readRangeVar(); + 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("ARRAYREF", 8)) + return_value = _readArrayRef(); + else if (MATCH("FUNCEXPR", 8)) + return_value = _readFuncExpr(); + else if (MATCH("OPEXPR", 6)) + return_value = _readOpExpr(); + else if (MATCH("DISTINCTEXPR", 12)) + return_value = _readDistinctExpr(); + 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("RELABELTYPE", 11)) + return_value = _readRelabelType(); else if (MATCH("CASE", 4)) return_value = _readCaseExpr(); else if (MATCH("WHEN", 4)) @@ -901,10 +917,28 @@ parseNodeString(void) return_value = _readBooleanTest(); else if (MATCH("CONSTRAINTTEST", 14)) return_value = _readConstraintTest(); - else if (MATCH("DOMAINCONSTRAINTVALUE", 21)) - return_value = _readDomainConstraintValue(); else if (MATCH("CONSTRAINTTESTVALUE", 19)) return_value = _readConstraintTestValue(); + else if (MATCH("TARGETENTRY", 11)) + return_value = _readTargetEntry(); + 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("COLUMNREF", 9)) + return_value = _readColumnRef(); + else if (MATCH("COLUMNDEF", 9)) + return_value = _readColumnDef(); + else if (MATCH("TYPENAME", 8)) + return_value = _readTypeName(); + else if (MATCH("EXPRFIELDSELECT", 15)) + return_value = _readExprFieldSelect(); + else if (MATCH("DOMAINCONSTRAINTVALUE", 21)) + return_value = _readDomainConstraintValue(); + else if (MATCH("RTE", 3)) + return_value = _readRangeTblEntry(); else { elog(ERROR, "badly formatted node string \"%.32s\"...", token); |