*
*
* 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
#include "nodes/primnodes.h"
#include "nodes/relation.h"
#include "nodes/parsenodes.h"
+#include "nodes/plannodes.h"
#include "nodes/makefuncs.h"
#include "nodes/nodeFuncs.h"
}
else
{
+ elog (ERROR, "make_clause: unsupported type %d", type);
/* will this ever happen? translated from lispy C code - ay 10/94 */
return ((Expr *) args);
}
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)
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))
{
{
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)));
+ }
+ }
}
*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) &&
*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
{
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
type_var = (Oid) test_var->vartype;
+ Assert (test_var->varlevelsup == 0);
foreach(tl, tlist)
{
TargetEntry *entry;
* 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)
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
#include <nodes/relation.h>
#include "nodes/primnodes.h"
+#include "nodes/plannodes.h"
#include "nodes/nodeFuncs.h"
#include "optimizer/internal.h"
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;
}
return FALSE;
}
- else if (is_funcclause(clause))
+ else if (is_subplan(clause))
{
List *temp;
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))
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))
{
(((Var *) var1)->varlevelsup == ((Var *) var2)->varlevelsup) &&
(((Var *) var1)->varattno == ((Var *) var2)->varattno))
{
-
+ Assert (((Var *) var1)->varlevelsup == 0);
return (true);
}
else