diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/analyze.c | 96 | ||||
-rw-r--r-- | src/backend/parser/parse_clause.c | 42 | ||||
-rw-r--r-- | src/backend/parser/parse_expr.c | 32 | ||||
-rw-r--r-- | src/backend/parser/parse_relation.c | 38 | ||||
-rw-r--r-- | src/backend/parser/parse_target.c | 68 |
5 files changed, 106 insertions, 170 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 6e160869919..191f4446b06 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.316 2005/03/10 23:21:23 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.317 2005/04/06 16:34:06 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -438,15 +438,12 @@ transformViewStmt(ParseState *pstate, ViewStmt *stmt, foreach(targetList, stmt->query->targetList) { TargetEntry *te = (TargetEntry *) lfirst(targetList); - Resdom *rd; Assert(IsA(te, TargetEntry)); - rd = te->resdom; - Assert(IsA(rd, Resdom)); /* junk columns don't get aliases */ - if (rd->resjunk) + if (te->resjunk) continue; - rd->resname = pstrdup(strVal(lfirst(alist_item))); + te->resname = pstrdup(strVal(lfirst(alist_item))); alist_item = lnext(alist_item); if (alist_item == NULL) break; /* done assigning aliases */ @@ -507,7 +504,6 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, { Query *qry = makeNode(Query); Query *selectQuery = NULL; - bool copy_up_hack = false; List *sub_rtable; List *sub_namespace; List *icolumns; @@ -615,7 +611,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, * separate from the subquery's tlist because we may add columns, * insert datatype coercions, etc.) * - * HACK: unknown-type constants and params in the INSERT's targetlist + * HACK: unknown-type constants and params in the SELECT's targetlist * are copied up as-is rather than being referenced as subquery * outputs. This is to ensure that when we try to coerce them to * the target column's datatype, the right things happen (see @@ -627,28 +623,25 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, foreach(tl, selectQuery->targetList) { TargetEntry *tle = (TargetEntry *) lfirst(tl); - Resdom *resnode = tle->resdom; Expr *expr; - if (resnode->resjunk) + if (tle->resjunk) continue; if (tle->expr && (IsA(tle->expr, Const) || IsA(tle->expr, Param)) && exprType((Node *) tle->expr) == UNKNOWNOID) - { expr = tle->expr; - copy_up_hack = true; - } else expr = (Expr *) makeVar(rtr->rtindex, - resnode->resno, - resnode->restype, - resnode->restypmod, + tle->resno, + exprType((Node *) tle->expr), + exprTypmod((Node *) tle->expr), 0); - resnode = copyObject(resnode); - resnode->resno = (AttrNumber) pstate->p_next_resno++; - qry->targetList = lappend(qry->targetList, - makeTargetEntry(resnode, expr)); + tle = makeTargetEntry(expr, + (AttrNumber) pstate->p_next_resno++, + tle->resname, + false); + qry->targetList = lappend(qry->targetList, tle); } } else @@ -690,7 +683,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, col = (ResTarget *) lfirst(icols); Assert(IsA(col, ResTarget)); - Assert(!tle->resdom->resjunk); + Assert(!tle->resjunk); updateTargetListEntry(pstate, tle, col->name, lfirst_int(attnos), col->indirection); @@ -708,28 +701,6 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("INSERT has more target columns than expressions"))); - /* - * If we copied up any unknown Params (see HACK above) then their - * resolved types need to be propagated into the Resdom nodes of - * the sub-INSERT's tlist. One hack begets another :-( - */ - if (copy_up_hack) - { - foreach(tl, selectQuery->targetList) - { - TargetEntry *tle = (TargetEntry *) lfirst(tl); - Resdom *resnode = tle->resdom; - - if (resnode->resjunk) - continue; - if (resnode->restype == UNKNOWNOID) - { - resnode->restype = exprType((Node *) tle->expr); - resnode->restypmod = exprTypmod((Node *) tle->expr); - } - } - } - /* done building the range table and jointree */ qry->rtable = pstate->p_rtable; qry->jointree = makeFromExpr(pstate->p_joinlist, NULL); @@ -2007,26 +1978,23 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt) foreach(dtlist, sostmt->colTypes) { Oid colType = lfirst_oid(dtlist); - Resdom *leftResdom; + TargetEntry *lefttle = (TargetEntry *) lfirst(left_tlist); char *colName; - Resdom *resdom; + TargetEntry *tle; Expr *expr; - leftResdom = ((TargetEntry *) lfirst(left_tlist))->resdom; - Assert(!leftResdom->resjunk); - colName = pstrdup(leftResdom->resname); - resdom = makeResdom((AttrNumber) pstate->p_next_resno++, - colType, - -1, - colName, - false); + Assert(!lefttle->resjunk); + colName = pstrdup(lefttle->resname); expr = (Expr *) makeVar(leftmostRTI, - leftResdom->resno, + lefttle->resno, colType, -1, 0); - qry->targetList = lappend(qry->targetList, - makeTargetEntry(resdom, expr)); + tle = makeTargetEntry(expr, + (AttrNumber) pstate->p_next_resno++, + colName, + false); + qry->targetList = lappend(qry->targetList, tle); targetvars = lappend(targetvars, expr); targetnames = lappend(targetnames, makeString(colName)); left_tlist = lnext(left_tlist); @@ -2284,11 +2252,10 @@ getSetColTypes(ParseState *pstate, Node *node) foreach(tl, selectQuery->targetList) { TargetEntry *tle = (TargetEntry *) lfirst(tl); - Resdom *resnode = tle->resdom; - if (resnode->resjunk) + if (tle->resjunk) continue; - result = lappend_oid(result, resnode->restype); + result = lappend_oid(result, exprType((Node *) tle->expr)); } return result; } @@ -2324,8 +2291,8 @@ applyColumnNames(List *dst, List *src) TargetEntry *d = (TargetEntry *) lfirst(dst_item); ColumnDef *s = (ColumnDef *) lfirst(src_item); - Assert(d->resdom && !d->resdom->resjunk); - d->resdom->resname = pstrdup(s->colname); + Assert(!d->resjunk); + d->resname = pstrdup(s->colname); } } @@ -2383,10 +2350,9 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt) foreach(tl, qry->targetList) { TargetEntry *tle = (TargetEntry *) lfirst(tl); - Resdom *resnode = tle->resdom; ResTarget *origTarget; - if (resnode->resjunk) + if (tle->resjunk) { /* * Resjunk nodes need no additional processing, but be sure @@ -2394,8 +2360,8 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt) * rewriter or planner might get confused. They don't need a * resname either. */ - resnode->resno = (AttrNumber) pstate->p_next_resno++; - resnode->resname = NULL; + tle->resno = (AttrNumber) pstate->p_next_resno++; + tle->resname = NULL; continue; } if (origTargetList == NULL) diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 2885ff51ec0..6d13e485b2e 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.138 2004/12/31 22:00:27 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.139 2005/04/06 16:34:06 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1161,10 +1161,9 @@ findTargetlistEntry(ParseState *pstate, Node *node, List **tlist, int clause) foreach(tl, *tlist) { TargetEntry *tle = (TargetEntry *) lfirst(tl); - Resdom *resnode = tle->resdom; - if (!resnode->resjunk && - strcmp(resnode->resname, name) == 0) + if (!tle->resjunk && + strcmp(tle->resname, name) == 0) { if (target_result != NULL) { @@ -1204,9 +1203,8 @@ findTargetlistEntry(ParseState *pstate, Node *node, List **tlist, int clause) foreach(tl, *tlist) { TargetEntry *tle = (TargetEntry *) lfirst(tl); - Resdom *resnode = tle->resdom; - if (!resnode->resjunk) + if (!tle->resjunk) { if (++targetlist_pos == target_pos) return tle; /* return the unique match */ @@ -1282,7 +1280,7 @@ transformGroupClause(ParseState *pstate, List *grouplist, continue; /* if tlist item is an UNKNOWN literal, change it to TEXT */ - restype = tle->resdom->restype; + restype = exprType((Node *) tle->expr); if (restype == UNKNOWNOID) { @@ -1290,8 +1288,7 @@ transformGroupClause(ParseState *pstate, List *grouplist, restype, TEXTOID, -1, COERCION_IMPLICIT, COERCE_IMPLICIT_CAST); - restype = tle->resdom->restype = TEXTOID; - tle->resdom->restypmod = -1; + restype = TEXTOID; } /* @@ -1304,7 +1301,7 @@ transformGroupClause(ParseState *pstate, List *grouplist, */ if (sortItem && ((SortClause *) lfirst(sortItem))->tleSortGroupRef == - tle->resdom->ressortgroupref) + tle->ressortgroupref) { ordering_op = ((SortClause *) lfirst(sortItem))->sortop; sortItem = lnext(sortItem); @@ -1405,7 +1402,7 @@ transformDistinctClause(ParseState *pstate, List *distinctlist, SortClause *scl = (SortClause *) lfirst(slitem); TargetEntry *tle = get_sortgroupclause_tle(scl, *targetlist); - if (tle->resdom->resjunk) + if (tle->resjunk) ereport(ERROR, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), errmsg("for SELECT DISTINCT, ORDER BY expressions must appear in select list"))); @@ -1445,7 +1442,7 @@ transformDistinctClause(ParseState *pstate, List *distinctlist, { SortClause *scl = (SortClause *) lfirst(nextsortlist); - if (tle->resdom->ressortgroupref != scl->tleSortGroupRef) + if (tle->ressortgroupref != scl->tleSortGroupRef) ereport(ERROR, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), errmsg("SELECT DISTINCT ON expressions must match initial ORDER BY expressions"))); @@ -1466,7 +1463,7 @@ transformDistinctClause(ParseState *pstate, List *distinctlist, { SortClause *scl = (SortClause *) lfirst(slitem); - if (tle->resdom->ressortgroupref == scl->tleSortGroupRef) + if (tle->ressortgroupref == scl->tleSortGroupRef) { result = lappend(result, copyObject(scl)); break; @@ -1501,7 +1498,7 @@ addAllTargetsToSortList(ParseState *pstate, List *sortlist, { TargetEntry *tle = (TargetEntry *) lfirst(l); - if (!tle->resdom->resjunk) + if (!tle->resjunk) sortlist = addTargetToSortList(pstate, tle, sortlist, targetlist, SORTBY_ASC, NIL, @@ -1533,7 +1530,7 @@ addTargetToSortList(ParseState *pstate, TargetEntry *tle, if (!targetIsInSortList(tle, sortlist)) { SortClause *sortcl = makeNode(SortClause); - Oid restype = tle->resdom->restype; + Oid restype = exprType((Node *) tle->expr); /* if tlist item is an UNKNOWN literal, change it to TEXT */ if (restype == UNKNOWNOID && resolveUnknown) @@ -1542,8 +1539,7 @@ addTargetToSortList(ParseState *pstate, TargetEntry *tle, restype, TEXTOID, -1, COERCION_IMPLICIT, COERCE_IMPLICIT_CAST); - restype = tle->resdom->restype = TEXTOID; - tle->resdom->restypmod = -1; + restype = TEXTOID; } sortcl->tleSortGroupRef = assignSortGroupRef(tle, targetlist); @@ -1586,20 +1582,20 @@ assignSortGroupRef(TargetEntry *tle, List *tlist) Index maxRef; ListCell *l; - if (tle->resdom->ressortgroupref) /* already has one? */ - return tle->resdom->ressortgroupref; + if (tle->ressortgroupref) /* already has one? */ + return tle->ressortgroupref; /* easiest way to pick an unused refnumber: max used + 1 */ maxRef = 0; foreach(l, tlist) { - Index ref = ((TargetEntry *) lfirst(l))->resdom->ressortgroupref; + Index ref = ((TargetEntry *) lfirst(l))->ressortgroupref; if (ref > maxRef) maxRef = ref; } - tle->resdom->ressortgroupref = maxRef + 1; - return tle->resdom->ressortgroupref; + tle->ressortgroupref = maxRef + 1; + return tle->ressortgroupref; } /* @@ -1613,7 +1609,7 @@ assignSortGroupRef(TargetEntry *tle, List *tlist) bool targetIsInSortList(TargetEntry *tle, List *sortList) { - Index ref = tle->resdom->ressortgroupref; + Index ref = tle->ressortgroupref; ListCell *l; /* no need to scan list if tle has no marker */ diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index ba3dbcad75b..058a1566be0 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.180 2005/01/19 23:45:24 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.181 2005/04/06 16:34:06 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -960,13 +960,13 @@ transformSubLink(ParseState *pstate, SubLink *sublink) * resjunk targets). */ if (tlist_item == NULL || - ((TargetEntry *) lfirst(tlist_item))->resdom->resjunk) + ((TargetEntry *) lfirst(tlist_item))->resjunk) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("subquery must return a column"))); while ((tlist_item = lnext(tlist_item)) != NULL) { - if (!((TargetEntry *) lfirst(tlist_item))->resdom->resjunk) + if (!((TargetEntry *) lfirst(tlist_item))->resjunk) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("subquery must return only one column"))); @@ -1045,7 +1045,7 @@ transformSubLink(ParseState *pstate, SubLink *sublink) Operator optup; Form_pg_operator opform; - if (tent->resdom->resjunk) + if (tent->resjunk) continue; if (ll_item == NULL) @@ -1417,18 +1417,16 @@ exprType(Node *expr) elog(ERROR, "cannot get type for untransformed sublink"); tent = (TargetEntry *) linitial(qtree->targetList); Assert(IsA(tent, TargetEntry)); - Assert(!tent->resdom->resjunk); - if (sublink->subLinkType == EXPR_SUBLINK) - type = tent->resdom->restype; - else + Assert(!tent->resjunk); + type = exprType((Node *) tent->expr); + if (sublink->subLinkType == ARRAY_SUBLINK) { - /* ARRAY_SUBLINK */ - type = get_array_type(tent->resdom->restype); + type = get_array_type(type); if (!OidIsValid(type)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("could not find array type for data type %s", - format_type_be(tent->resdom->restype)))); + format_type_be(exprType((Node *) tent->expr))))); } } else @@ -1456,18 +1454,16 @@ exprType(Node *expr) tent = (TargetEntry *) linitial(subplan->plan->targetlist); Assert(IsA(tent, TargetEntry)); - Assert(!tent->resdom->resjunk); - if (subplan->subLinkType == EXPR_SUBLINK) - type = tent->resdom->restype; - else + Assert(!tent->resjunk); + type = exprType((Node *) tent->expr); + if (subplan->subLinkType == ARRAY_SUBLINK) { - /* ARRAY_SUBLINK */ - type = get_array_type(tent->resdom->restype); + type = get_array_type(type); if (!OidIsValid(type)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("could not find array type for data type %s", - format_type_be(tent->resdom->restype)))); + format_type_be(exprType((Node *) tent->expr))))); } } else diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 6e391f4eb8b..031bfa8fe24 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.103 2005/03/31 22:46:13 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.104 2005/04/06 16:34:06 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -910,15 +910,15 @@ addRangeTableEntryForSubquery(ParseState *pstate, { TargetEntry *te = (TargetEntry *) lfirst(tlistitem); - if (te->resdom->resjunk) + if (te->resjunk) continue; varattno++; - Assert(varattno == te->resdom->resno); + Assert(varattno == te->resno); if (varattno > numaliases) { char *attrname; - attrname = pstrdup(te->resdom->resname); + attrname = pstrdup(te->resname); eref->colnames = lappend(eref->colnames, makeString(attrname)); } } @@ -1260,10 +1260,10 @@ expandRTE(List *rtable, int rtindex, int sublevels_up, { TargetEntry *te = (TargetEntry *) lfirst(tlistitem); - if (te->resdom->resjunk) + if (te->resjunk) continue; varattno++; - Assert(varattno == te->resdom->resno); + Assert(varattno == te->resno); if (colnames) { @@ -1279,8 +1279,8 @@ expandRTE(List *rtable, int rtindex, int sublevels_up, Var *varnode; varnode = makeVar(rtindex, varattno, - te->resdom->restype, - te->resdom->restypmod, + exprType((Node *) te->expr), + exprTypmod((Node *) te->expr), sublevels_up); *colvars = lappend(*colvars, varnode); @@ -1532,14 +1532,12 @@ expandRelAttrs(ParseState *pstate, List *rtable, int rtindex, int sublevels_up) { char *label = strVal(lfirst(name)); Node *varnode = (Node *) lfirst(var); - TargetEntry *te = makeNode(TargetEntry); - - te->resdom = makeResdom((AttrNumber) pstate->p_next_resno++, - exprType(varnode), - exprTypmod(varnode), - label, - false); - te->expr = (Expr *) varnode; + TargetEntry *te; + + te = makeTargetEntry((Expr *) varnode, + (AttrNumber) pstate->p_next_resno++, + label, + false); te_list = lappend(te_list, te); } @@ -1641,11 +1639,11 @@ get_rte_attribute_type(RangeTblEntry *rte, AttrNumber attnum, TargetEntry *te = get_tle_by_resno(rte->subquery->targetList, attnum); - if (te == NULL || te->resdom->resjunk) + if (te == NULL || te->resjunk) elog(ERROR, "subquery %s does not have attribute %d", rte->eref->aliasname, attnum); - *vartype = te->resdom->restype; - *vartypmod = te->resdom->restypmod; + *vartype = exprType((Node *) te->expr); + *vartypmod = exprTypmod((Node *) te->expr); } break; case RTE_FUNCTION: @@ -1856,7 +1854,7 @@ get_tle_by_resno(List *tlist, AttrNumber resno) { TargetEntry *tle = (TargetEntry *) lfirst(l); - if (tle->resdom->resno == resno) + if (tle->resno == resno) return tle; } return NULL; diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index 8675bc26839..d537f570bd4 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.130 2005/03/26 06:28:59 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.131 2005/04/06 16:34:06 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -30,7 +30,7 @@ #include "utils/typcache.h" -static void markTargetListOrigin(ParseState *pstate, Resdom *res, +static void markTargetListOrigin(ParseState *pstate, TargetEntry *tle, Var *var, int levelsup); static Node *transformAssignmentIndirection(ParseState *pstate, Node *basenode, @@ -65,17 +65,10 @@ transformTargetEntry(ParseState *pstate, char *colname, bool resjunk) { - Oid type_id; - int32 type_mod; - Resdom *resnode; - /* Transform the node if caller didn't do it already */ if (expr == NULL) expr = transformExpr(pstate, node); - type_id = exprType(expr); - type_mod = exprTypmod(expr); - if (colname == NULL && !resjunk) { /* @@ -85,13 +78,10 @@ transformTargetEntry(ParseState *pstate, colname = FigureColname(node); } - resnode = makeResdom((AttrNumber) pstate->p_next_resno++, - type_id, - type_mod, - colname, - resjunk); - - return makeTargetEntry(resnode, (Expr *) expr); + return makeTargetEntry((Expr *) expr, + (AttrNumber) pstate->p_next_resno++, + colname, + resjunk); } @@ -176,13 +166,13 @@ markTargetListOrigins(ParseState *pstate, List *targetlist) { TargetEntry *tle = (TargetEntry *) lfirst(l); - markTargetListOrigin(pstate, tle->resdom, (Var *) tle->expr, 0); + markTargetListOrigin(pstate, tle, (Var *) tle->expr, 0); } } /* * markTargetListOrigin() - * If 'var' is a Var of a plain relation, mark 'res' with its origin + * If 'var' is a Var of a plain relation, mark 'tle' with its origin * * levelsup is an extra offset to interpret the Var's varlevelsup correctly. * @@ -190,7 +180,8 @@ markTargetListOrigins(ParseState *pstate, List *targetlist) * do not drill down into views, but report the view as the column owner. */ static void -markTargetListOrigin(ParseState *pstate, Resdom *res, Var *var, int levelsup) +markTargetListOrigin(ParseState *pstate, TargetEntry *tle, + Var *var, int levelsup) { int netlevelsup; RangeTblEntry *rte; @@ -206,20 +197,20 @@ markTargetListOrigin(ParseState *pstate, Resdom *res, Var *var, int levelsup) { case RTE_RELATION: /* It's a table or view, report it */ - res->resorigtbl = rte->relid; - res->resorigcol = attnum; + tle->resorigtbl = rte->relid; + tle->resorigcol = attnum; break; case RTE_SUBQUERY: { /* Subselect-in-FROM: copy up from the subselect */ - TargetEntry *te = get_tle_by_resno(rte->subquery->targetList, - attnum); + TargetEntry *ste = get_tle_by_resno(rte->subquery->targetList, + attnum); - if (te == NULL || te->resdom->resjunk) + if (ste == NULL || ste->resjunk) elog(ERROR, "subquery %s does not have attribute %d", rte->eref->aliasname, attnum); - res->resorigtbl = te->resdom->resorigtbl; - res->resorigcol = te->resdom->resorigcol; + tle->resorigtbl = ste->resorigtbl; + tle->resorigcol = ste->resorigcol; } break; case RTE_JOIN: @@ -229,7 +220,7 @@ markTargetListOrigin(ParseState *pstate, Resdom *res, Var *var, int levelsup) Assert(attnum > 0 && attnum <= list_length(rte->joinaliasvars)); aliasvar = (Var *) list_nth(rte->joinaliasvars, attnum - 1); - markTargetListOrigin(pstate, res, aliasvar, netlevelsup); + markTargetListOrigin(pstate, tle, aliasvar, netlevelsup); } break; case RTE_SPECIAL: @@ -264,7 +255,6 @@ updateTargetListEntry(ParseState *pstate, Oid type_id; /* type of value provided */ Oid attrtype; /* type of target column */ int32 attrtypmod; - Resdom *resnode = tle->resdom; Relation rd = pstate->p_target_relation; Assert(rd != NULL); @@ -369,21 +359,14 @@ updateTargetListEntry(ParseState *pstate, } /* - * The result of the target expression should now match the - * destination column's type. - */ - resnode->restype = attrtype; - resnode->restypmod = attrtypmod; - - /* * Set the resno to identify the target column --- the rewriter and * planner depend on this. We also set the resname to identify the * target column, but this is only for debugging purposes; it should * not be relied on. (In particular, it might be out of date in a * stored rule.) */ - resnode->resno = (AttrNumber) attrno; - resnode->resname = colname; + tle->resno = (AttrNumber) attrno; + tle->resname = colname; } /* @@ -881,13 +864,10 @@ ExpandIndirectionStar(ParseState *pstate, A_Indirection *ind) fieldnode = (Node *) fselect; } - te = makeNode(TargetEntry); - te->resdom = makeResdom((AttrNumber) pstate->p_next_resno++, - att->atttypid, - att->atttypmod, - pstrdup(NameStr(att->attname)), - false); - te->expr = (Expr *) fieldnode; + te = makeTargetEntry((Expr *) fieldnode, + (AttrNumber) pstate->p_next_resno++, + pstrdup(NameStr(att->attname)), + false); te_list = lappend(te_list, te); } |