|
7 | 7 | *
|
8 | 8 | *
|
9 | 9 | * IDENTIFICATION
|
10 |
| - * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.19 1998/02/10 16:03:28 momjian Exp $ |
| 10 | + * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.20 1998/02/1303:41:23 vadim Exp $ |
11 | 11 | *
|
12 | 12 | *-------------------------------------------------------------------------
|
13 | 13 | */
|
@@ -245,39 +245,43 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
|
245 | 245 | List*llist;
|
246 | 246 |
|
247 | 247 | pstate->p_hasSubLinks= true;
|
248 |
| - |
249 | 248 | qtree=parse_analyze(lcons(sublink->subselect,NIL),pstate);
|
250 |
| -Assert(qtree->len==1); |
| 249 | +if (qtree->len!=1|| |
| 250 | +qtree->qtrees[0]->commandType!=CMD_SELECT|| |
| 251 | +qtree->qtrees[0]->resultRelation!=0 ) |
| 252 | +elog (ERROR,"parser: bad query in subselect"); |
251 | 253 | sublink->subselect= (Node*)qtree->qtrees[0];
|
252 |
| - |
253 |
| -foreach(llist,sublink->lefthand) |
254 |
| -lfirst(llist)=transformExpr(pstate,lfirst(llist),precedence); |
255 |
| - |
256 |
| -if (length(sublink->lefthand)!= |
257 |
| -length(((Query*)sublink->subselect)->targetList)) |
258 |
| -elog(ERROR,"Subselect has too many or too few fields."); |
259 | 254 |
|
260 | 255 | if (sublink->subLinkType!=EXISTS_SUBLINK)
|
261 | 256 | {
|
262 | 257 | char*op=lfirst(sublink->oper);
|
263 | 258 | List*left_expr=sublink->lefthand;
|
264 |
| -List*right_expr= ((Query*)sublink->subselect)->targetList; |
| 259 | +List*right_expr= ((Query*)sublink->subselect)->targetList; |
265 | 260 | List*elist;
|
266 | 261 |
|
| 262 | +foreach(llist,left_expr) |
| 263 | +lfirst(llist)=transformExpr(pstate,lfirst(llist),precedence); |
| 264 | + |
| 265 | +if (length(left_expr)!= |
| 266 | +length(right_expr)) |
| 267 | +elog(ERROR,"Subselect has too many or too few fields."); |
| 268 | + |
267 | 269 | sublink->oper=NIL;
|
268 | 270 | foreach(elist,left_expr)
|
269 | 271 | {
|
270 |
| -Node*lexpr=lfirst(elist); |
271 |
| -Node*rexpr=lfirst(right_expr); |
272 |
| -TargetEntry*tent= (TargetEntry*)rexpr; |
273 |
| -Expr*op_expr; |
| 272 | +Node*lexpr=lfirst(elist); |
| 273 | +Node*rexpr=lfirst(right_expr); |
| 274 | +TargetEntry*tent= (TargetEntry*)rexpr; |
| 275 | +Expr*op_expr; |
274 | 276 |
|
275 | 277 | op_expr=make_op(op,lexpr,tent->expr);
|
276 |
| -sublink->oper=lappend(sublink->oper,op_expr->oper); |
| 278 | +sublink->oper=lappend(sublink->oper,op_expr); |
277 | 279 | right_expr=lnext(right_expr);
|
278 | 280 | }
|
279 |
| -result= (Node*)expr; |
280 | 281 | }
|
| 282 | +else |
| 283 | +sublink->oper=NIL; |
| 284 | +result= (Node*)expr; |
281 | 285 | break;
|
282 | 286 | }
|
283 | 287 | default:
|
|