@ -8,7 +8,7 @@
*
*
*
*
* IDENTIFICATION
* 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 .
* 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
* resjunk true if the target should be marked resjunk , ie , it is not
* wanted in the final projected tuple .
* wanted in the final projected tuple .
* retset if non - NULL , and the entry is a function expression , pass back
* expr - > funcretset
*/
*/
TargetEntry *
TargetEntry *
transformTargetEntry ( ParseState * pstate ,
transformTargetEntry ( ParseState * pstate ,
Node * node ,
Node * node ,
Node * expr ,
Node * expr ,
char * colname ,
char * colname ,
bool resjunk ,
bool resjunk )
bool * retset )
{
{
Oid type_id ;
Oid type_id ;
int32 type_mod ;
int32 type_mod ;
@ -64,9 +61,6 @@ transformTargetEntry(ParseState *pstate,
if ( IsA ( expr , RangeVar ) )
if ( IsA ( expr , RangeVar ) )
elog ( ERROR , " You can't use relation names alone in the target list, try relation.*. " ) ;
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_id = exprType ( expr ) ;
type_mod = exprTypmod ( expr ) ;
type_mod = exprTypmod ( expr ) ;
@ -99,12 +93,10 @@ transformTargetEntry(ParseState *pstate,
List *
List *
transformTargetList ( ParseState * pstate , List * targetlist )
transformTargetList ( ParseState * pstate , List * targetlist )
{
{
bool retset = false ;
List * p_target = NIL ;
List * p_target = NIL ;
while ( targetlist ! = NIL )
while ( targetlist ! = NIL )
{
{
bool entry_retset = false ;
ResTarget * res = ( ResTarget * ) lfirst ( targetlist ) ;
ResTarget * res = ( ResTarget * ) lfirst ( targetlist ) ;
if ( IsA ( res - > val , ColumnRef ) )
if ( IsA ( res - > val , ColumnRef ) )
@ -181,8 +173,7 @@ transformTargetList(ParseState *pstate, List *targetlist)
res - > val ,
res - > val ,
NULL ,
NULL ,
res - > name ,
res - > name ,
false ,
false ) ) ;
& entry_retset ) ) ;
}
}
}
}
else if ( IsA ( res - > val , InsertDefault ) )
else if ( IsA ( res - > val , InsertDefault ) )
@ -203,16 +194,9 @@ transformTargetList(ParseState *pstate, List *targetlist)
res - > val ,
res - > val ,
NULL ,
NULL ,
res - > name ,
res - > name ,
false ,
false ) ) ;
& entry_retset ) ) ;
}
}
if ( retset & & entry_retset )
elog ( ERROR , " Only one target list entry may return a set result " ) ;
if ( entry_retset )
retset = true ;
targetlist = lnext ( targetlist ) ;
targetlist = lnext ( targetlist ) ;
}
}