mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-24 18:55:04 +08:00
Support for subselects.
This commit is contained in:
parent
9184073324
commit
e51c674c59
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.14 1998/01/20 22:11:39 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.15 1998/02/13 03:40:19 vadim Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@ -22,6 +22,7 @@
|
||||
#include "nodes/primnodes.h"
|
||||
#include "nodes/relation.h"
|
||||
#include "nodes/parsenodes.h"
|
||||
#include "nodes/plannodes.h"
|
||||
#include "nodes/makefuncs.h"
|
||||
#include "nodes/nodeFuncs.h"
|
||||
|
||||
@ -57,6 +58,7 @@ make_clause(int type, Node *oper, List *args)
|
||||
}
|
||||
else
|
||||
{
|
||||
elog (ERROR, "make_clause: unsupported type %d", type);
|
||||
/* will this ever happen? translated from lispy C code - ay 10/94 */
|
||||
return ((Expr *) args);
|
||||
}
|
||||
@ -375,10 +377,10 @@ clause_relids_vars(Node *clause, List **relids, List **vars)
|
||||
foreach(vi, var_list)
|
||||
{
|
||||
Var *in_list = (Var *) lfirst(vi);
|
||||
|
||||
|
||||
Assert (var->varlevelsup == 0);
|
||||
if (in_list->varno == var->varno &&
|
||||
in_list->varattno == var->varattno &&
|
||||
in_list->varlevelsup == var->varlevelsup)
|
||||
in_list->varattno == var->varattno)
|
||||
break;
|
||||
}
|
||||
if (vi == NIL)
|
||||
@ -492,6 +494,7 @@ qual_clause_p(Node *clause)
|
||||
if (!is_opclause(clause))
|
||||
return false;
|
||||
|
||||
/* How about Param-s ? - vadim 02/03/98 */
|
||||
if (IsA(get_leftop((Expr *) clause), Var) &&
|
||||
IsA(get_rightop((Expr *) clause), Const))
|
||||
{
|
||||
@ -550,6 +553,17 @@ fix_opid(Node *clause)
|
||||
{
|
||||
fix_opid(((Aggreg *) clause)->target);
|
||||
}
|
||||
else if (is_subplan(clause) &&
|
||||
((SubPlan*) ((Expr*) clause)->oper)->sublink->subLinkType != EXISTS_SUBLINK)
|
||||
{
|
||||
List *lst;
|
||||
|
||||
foreach (lst, ((SubPlan*) ((Expr*) clause)->oper)->sublink->oper)
|
||||
{
|
||||
replace_opid((Oper*) ((Expr*) lfirst(lst))->oper);
|
||||
fix_opid((Node*) get_leftop((Expr*) lfirst(lst)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -627,16 +641,13 @@ get_relattval(Node *clause,
|
||||
*flag = (_SELEC_CONSTANT_RIGHT_ | _SELEC_NOT_CONSTANT_);
|
||||
|
||||
}
|
||||
#ifdef INDEXSCAN_PATCH
|
||||
}
|
||||
else if (is_opclause(clause) && IsA(left, Var) &&IsA(right, Param))
|
||||
else if (is_opclause(clause) && IsA(left, Var) && IsA(right, Param))
|
||||
{
|
||||
/* Function parameter used as index scan arg. DZ - 27-8-1996 */
|
||||
*relid = left->varno;
|
||||
*attno = left->varattno;
|
||||
*constval = 0;
|
||||
*flag = (_SELEC_NOT_CONSTANT_);
|
||||
#endif
|
||||
}
|
||||
else if (is_opclause(clause) &&
|
||||
is_funcclause((Node *) left) &&
|
||||
@ -680,16 +691,13 @@ get_relattval(Node *clause,
|
||||
*constval = 0;
|
||||
*flag = (_SELEC_NOT_CONSTANT_);
|
||||
}
|
||||
#ifdef INDEXSCAN_PATCH
|
||||
}
|
||||
else if (is_opclause(clause) && IsA(right, Var) &&IsA(left, Param))
|
||||
else if (is_opclause(clause) && IsA(right, Var) && IsA(left, Param))
|
||||
{
|
||||
/* ...And here... - vadim 01/22/97 */
|
||||
*relid = right->varno;
|
||||
*attno = right->varattno;
|
||||
*constval = 0;
|
||||
*flag = (_SELEC_NOT_CONSTANT_);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/tlist.c,v 1.10 1998/02/10 04:01:21 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/tlist.c,v 1.11 1998/02/13 03:40:21 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -273,6 +273,7 @@ match_varid(Var *test_var, List *tlist)
|
||||
|
||||
type_var = (Oid) test_var->vartype;
|
||||
|
||||
Assert (test_var->varlevelsup == 0);
|
||||
foreach(tl, tlist)
|
||||
{
|
||||
TargetEntry *entry;
|
||||
@ -288,9 +289,9 @@ match_varid(Var *test_var, List *tlist)
|
||||
* we test the original varno (instead of varno which might be
|
||||
* changed to INNER/OUTER.
|
||||
*/
|
||||
Assert (tlvar->varlevelsup == 0);
|
||||
if (tlvar->varnoold == test_var->varnoold &&
|
||||
tlvar->varoattno == test_var->varoattno &&
|
||||
tlvar->varlevelsup == test_var->varlevelsup)
|
||||
tlvar->varoattno == test_var->varoattno)
|
||||
{
|
||||
|
||||
if (tlvar->vartype == type_var)
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.9 1998/02/10 04:01:27 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.10 1998/02/13 03:40:23 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -18,6 +18,7 @@
|
||||
#include <nodes/relation.h>
|
||||
|
||||
#include "nodes/primnodes.h"
|
||||
#include "nodes/plannodes.h"
|
||||
#include "nodes/nodeFuncs.h"
|
||||
|
||||
#include "optimizer/internal.h"
|
||||
@ -85,7 +86,7 @@ contain_var_clause(Node *clause)
|
||||
return contain_var_clause(((Iter *) clause)->iterexpr);
|
||||
else if (single_node(clause))
|
||||
return FALSE;
|
||||
else if (or_clause(clause) || and_clause(clause))
|
||||
else if (or_clause(clause) || and_clause(clause) || is_funcclause(clause))
|
||||
{
|
||||
List *temp;
|
||||
|
||||
@ -96,7 +97,7 @@ contain_var_clause(Node *clause)
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
else if (is_funcclause(clause))
|
||||
else if (is_subplan(clause))
|
||||
{
|
||||
List *temp;
|
||||
|
||||
@ -105,6 +106,12 @@ contain_var_clause(Node *clause)
|
||||
if (contain_var_clause(lfirst(temp)))
|
||||
return TRUE;
|
||||
}
|
||||
/* Ok - check left sides of Oper-s */
|
||||
foreach(temp, ((SubPlan*) ((Expr *) clause)->oper)->sublink->oper)
|
||||
{
|
||||
if (contain_var_clause(lfirst(((Expr*) lfirst(temp))->args)))
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
else if (IsA(clause, ArrayRef))
|
||||
@ -156,19 +163,23 @@ pull_var_clause(Node *clause)
|
||||
retval = pull_var_clause(((Iter *) clause)->iterexpr);
|
||||
else if (single_node(clause))
|
||||
retval = NIL;
|
||||
else if (or_clause(clause) || and_clause(clause))
|
||||
else if (or_clause(clause) || and_clause(clause) || is_funcclause(clause))
|
||||
{
|
||||
List *temp;
|
||||
|
||||
foreach(temp, ((Expr *) clause)->args)
|
||||
retval = nconc(retval, pull_var_clause(lfirst(temp)));
|
||||
}
|
||||
else if (is_funcclause(clause))
|
||||
else if (is_subplan(clause))
|
||||
{
|
||||
List *temp;
|
||||
|
||||
foreach(temp, ((Expr *) clause)->args)
|
||||
foreach(temp, ((Expr*) clause)->args)
|
||||
retval = nconc(retval, pull_var_clause(lfirst(temp)));
|
||||
/* Ok - get Var-s from left sides of Oper-s */
|
||||
foreach(temp, ((SubPlan*) ((Expr*) clause)->oper)->sublink->oper)
|
||||
retval = nconc(retval,
|
||||
pull_var_clause(lfirst(((Expr*) lfirst(temp))->args)));
|
||||
}
|
||||
else if (IsA(clause, Aggreg))
|
||||
{
|
||||
@ -213,7 +224,7 @@ var_equal(Var *var1, Var *var2)
|
||||
(((Var *) var1)->varlevelsup == ((Var *) var2)->varlevelsup) &&
|
||||
(((Var *) var1)->varattno == ((Var *) var2)->varattno))
|
||||
{
|
||||
|
||||
Assert (((Var *) var1)->varlevelsup == 0);
|
||||
return (true);
|
||||
}
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user