mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
Fix for EXISTS.
This commit is contained in:
parent
e51c674c59
commit
7fab67a8ac
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.19 1998/02/10 16:03:28 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.20 1998/02/13 03:41:23 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -245,39 +245,43 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
|
|||||||
List *llist;
|
List *llist;
|
||||||
|
|
||||||
pstate->p_hasSubLinks = true;
|
pstate->p_hasSubLinks = true;
|
||||||
|
|
||||||
qtree = parse_analyze(lcons(sublink->subselect,NIL), pstate);
|
qtree = parse_analyze(lcons(sublink->subselect,NIL), pstate);
|
||||||
Assert(qtree->len == 1);
|
if (qtree->len != 1 ||
|
||||||
|
qtree->qtrees[0]->commandType != CMD_SELECT ||
|
||||||
|
qtree->qtrees[0]->resultRelation != 0 )
|
||||||
|
elog (ERROR, "parser: bad query in subselect");
|
||||||
sublink->subselect = (Node *) qtree->qtrees[0];
|
sublink->subselect = (Node *) qtree->qtrees[0];
|
||||||
|
|
||||||
foreach(llist, sublink->lefthand)
|
|
||||||
lfirst(llist) = transformExpr(pstate, lfirst(llist), precedence);
|
|
||||||
|
|
||||||
if (length(sublink->lefthand) !=
|
|
||||||
length(((Query *)sublink->subselect)->targetList))
|
|
||||||
elog(ERROR,"Subselect has too many or too few fields.");
|
|
||||||
|
|
||||||
if (sublink->subLinkType != EXISTS_SUBLINK)
|
if (sublink->subLinkType != EXISTS_SUBLINK)
|
||||||
{
|
{
|
||||||
char *op = lfirst(sublink->oper);
|
char *op = lfirst(sublink->oper);
|
||||||
List *left_expr = sublink->lefthand;
|
List *left_expr = sublink->lefthand;
|
||||||
List *right_expr = ((Query *)sublink->subselect)->targetList;
|
List *right_expr = ((Query*) sublink->subselect)->targetList;
|
||||||
List *elist;
|
List *elist;
|
||||||
|
|
||||||
|
foreach(llist, left_expr)
|
||||||
|
lfirst(llist) = transformExpr(pstate, lfirst(llist), precedence);
|
||||||
|
|
||||||
|
if (length(left_expr) !=
|
||||||
|
length(right_expr))
|
||||||
|
elog(ERROR,"Subselect has too many or too few fields.");
|
||||||
|
|
||||||
sublink->oper = NIL;
|
sublink->oper = NIL;
|
||||||
foreach(elist, left_expr)
|
foreach(elist, left_expr)
|
||||||
{
|
{
|
||||||
Node *lexpr = lfirst(elist);
|
Node *lexpr = lfirst(elist);
|
||||||
Node *rexpr = lfirst(right_expr);
|
Node *rexpr = lfirst(right_expr);
|
||||||
TargetEntry *tent = (TargetEntry *)rexpr;
|
TargetEntry *tent = (TargetEntry *)rexpr;
|
||||||
Expr *op_expr;
|
Expr *op_expr;
|
||||||
|
|
||||||
op_expr = make_op(op, lexpr, tent->expr);
|
op_expr = make_op(op, lexpr, tent->expr);
|
||||||
sublink->oper = lappend(sublink->oper, op_expr->oper);
|
sublink->oper = lappend(sublink->oper, op_expr);
|
||||||
right_expr = lnext(right_expr);
|
right_expr = lnext(right_expr);
|
||||||
}
|
}
|
||||||
result = (Node *) expr;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
sublink->oper = NIL;
|
||||||
|
result = (Node *) expr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user