mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
[ Revert patch ]
> ================================================================= > User interface proposal for multi-row function targetlist entries > ================================================================= > 1. Only one targetlist entry may return a set. > 2. Each targetlist item (other than the set returning one) is > repeated for each item in the returned set. > Having gotten no objections (actually, no response at all), I can only assume no one had heartburn with this change. The attached patch covers the first of the two proposals, i.e. restricting the target list to only one set returning function. Joe Conway
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.96 2003/02/13 05:06:35 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.97 2003/02/13 05:53:46 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -42,16 +42,13 @@ static int FigureColnameInternal(Node *node, char **name);
|
||||
* colname the column name to be assigned, or NULL if none yet set.
|
||||
* resjunk true if the target should be marked resjunk, ie, it is not
|
||||
* wanted in the final projected tuple.
|
||||
* retset if non-NULL, and the entry is a function expression, pass back
|
||||
* expr->funcretset
|
||||
*/
|
||||
TargetEntry *
|
||||
transformTargetEntry(ParseState *pstate,
|
||||
Node *node,
|
||||
Node *expr,
|
||||
char *colname,
|
||||
bool resjunk,
|
||||
bool *retset)
|
||||
bool resjunk)
|
||||
{
|
||||
Oid type_id;
|
||||
int32 type_mod;
|
||||
@ -64,9 +61,6 @@ transformTargetEntry(ParseState *pstate,
|
||||
if (IsA(expr, RangeVar))
|
||||
elog(ERROR, "You can't use relation names alone in the target list, try relation.*.");
|
||||
|
||||
if (retset && IsA(expr, FuncExpr))
|
||||
*retset = ((FuncExpr *) expr)->funcretset;
|
||||
|
||||
type_id = exprType(expr);
|
||||
type_mod = exprTypmod(expr);
|
||||
|
||||
@ -99,12 +93,10 @@ transformTargetEntry(ParseState *pstate,
|
||||
List *
|
||||
transformTargetList(ParseState *pstate, List *targetlist)
|
||||
{
|
||||
bool retset = false;
|
||||
List *p_target = NIL;
|
||||
|
||||
while (targetlist != NIL)
|
||||
{
|
||||
bool entry_retset = false;
|
||||
ResTarget *res = (ResTarget *) lfirst(targetlist);
|
||||
|
||||
if (IsA(res->val, ColumnRef))
|
||||
@ -181,8 +173,7 @@ transformTargetList(ParseState *pstate, List *targetlist)
|
||||
res->val,
|
||||
NULL,
|
||||
res->name,
|
||||
false,
|
||||
&entry_retset));
|
||||
false));
|
||||
}
|
||||
}
|
||||
else if (IsA(res->val, InsertDefault))
|
||||
@ -203,16 +194,9 @@ transformTargetList(ParseState *pstate, List *targetlist)
|
||||
res->val,
|
||||
NULL,
|
||||
res->name,
|
||||
false,
|
||||
&entry_retset));
|
||||
false));
|
||||
}
|
||||
|
||||
if (retset && entry_retset)
|
||||
elog(ERROR, "Only one target list entry may return a set result");
|
||||
|
||||
if (entry_retset)
|
||||
retset = true;
|
||||
|
||||
targetlist = lnext(targetlist);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user