Skip to content

Commit e51c674

Browse files
committed
Support for subselects.
1 parent 9184073 commit e51c674

File tree

3 files changed

+42
-22
lines changed

3 files changed

+42
-22
lines changed

src/backend/optimizer/util/clauses.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.14 1998/01/20 22:11:39 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.15 1998/02/13 03:40:19 vadim Exp $
1111
*
1212
* HISTORY
1313
* AUTHOR DATE MAJOR EVENT
@@ -22,6 +22,7 @@
2222
#include "nodes/primnodes.h"
2323
#include "nodes/relation.h"
2424
#include "nodes/parsenodes.h"
25+
#include "nodes/plannodes.h"
2526
#include "nodes/makefuncs.h"
2627
#include "nodes/nodeFuncs.h"
2728

@@ -57,6 +58,7 @@ make_clause(int type, Node *oper, List *args)
5758
}
5859
else
5960
{
61+
elog (ERROR, "make_clause: unsupported type %d", type);
6062
/* will this ever happen? translated from lispy C code - ay 10/94 */
6163
return ((Expr *) args);
6264
}
@@ -375,10 +377,10 @@ clause_relids_vars(Node *clause, List **relids, List **vars)
375377
foreach(vi, var_list)
376378
{
377379
Var *in_list = (Var *) lfirst(vi);
378-
380+
381+
Assert (var->varlevelsup == 0);
379382
if (in_list->varno == var->varno &&
380-
in_list->varattno == var->varattno &&
381-
in_list->varlevelsup == var->varlevelsup)
383+
in_list->varattno == var->varattno)
382384
break;
383385
}
384386
if (vi == NIL)
@@ -492,6 +494,7 @@ qual_clause_p(Node *clause)
492494
if (!is_opclause(clause))
493495
return false;
494496

497+
/* How about Param-s ? - vadim 02/03/98 */
495498
if (IsA(get_leftop((Expr *) clause), Var) &&
496499
IsA(get_rightop((Expr *) clause), Const))
497500
{
@@ -550,6 +553,17 @@ fix_opid(Node *clause)
550553
{
551554
fix_opid(((Aggreg *) clause)->target);
552555
}
556+
else if (is_subplan(clause) &&
557+
((SubPlan*) ((Expr*) clause)->oper)->sublink->subLinkType != EXISTS_SUBLINK)
558+
{
559+
List *lst;
560+
561+
foreach (lst, ((SubPlan*) ((Expr*) clause)->oper)->sublink->oper)
562+
{
563+
replace_opid((Oper*) ((Expr*) lfirst(lst))->oper);
564+
fix_opid((Node*) get_leftop((Expr*) lfirst(lst)));
565+
}
566+
}
553567

554568
}
555569

@@ -627,16 +641,13 @@ get_relattval(Node *clause,
627641
*flag = (_SELEC_CONSTANT_RIGHT_ | _SELEC_NOT_CONSTANT_);
628642

629643
}
630-
#ifdef INDEXSCAN_PATCH
631644
}
632-
else if (is_opclause(clause) && IsA(left, Var) &&IsA(right, Param))
645+
else if (is_opclause(clause) && IsA(left, Var) && IsA(right, Param))
633646
{
634-
/* Function parameter used as index scan arg. DZ - 27-8-1996 */
635647
*relid = left->varno;
636648
*attno = left->varattno;
637649
*constval = 0;
638650
*flag = (_SELEC_NOT_CONSTANT_);
639-
#endif
640651
}
641652
else if (is_opclause(clause) &&
642653
is_funcclause((Node *) left) &&
@@ -680,16 +691,13 @@ get_relattval(Node *clause,
680691
*constval = 0;
681692
*flag = (_SELEC_NOT_CONSTANT_);
682693
}
683-
#ifdef INDEXSCAN_PATCH
684694
}
685-
else if (is_opclause(clause) && IsA(right, Var) &&IsA(left, Param))
695+
else if (is_opclause(clause) && IsA(right, Var) && IsA(left, Param))
686696
{
687-
/* ...And here... - vadim 01/22/97 */
688697
*relid = right->varno;
689698
*attno = right->varattno;
690699
*constval = 0;
691700
*flag = (_SELEC_NOT_CONSTANT_);
692-
#endif
693701
}
694702
else
695703
{

src/backend/optimizer/util/tlist.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/tlist.c,v 1.10 1998/02/10 04:01:21 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/tlist.c,v 1.11 1998/02/13 03:40:21 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -273,6 +273,7 @@ match_varid(Var *test_var, List *tlist)
273273

274274
type_var = (Oid) test_var->vartype;
275275

276+
Assert (test_var->varlevelsup == 0);
276277
foreach(tl, tlist)
277278
{
278279
TargetEntry *entry;
@@ -288,9 +289,9 @@ match_varid(Var *test_var, List *tlist)
288289
* we test the original varno (instead of varno which might be
289290
* changed to INNER/OUTER.
290291
*/
292+
Assert (tlvar->varlevelsup == 0);
291293
if (tlvar->varnoold == test_var->varnoold &&
292-
tlvar->varoattno == test_var->varoattno &&
293-
tlvar->varlevelsup == test_var->varlevelsup)
294+
tlvar->varoattno == test_var->varoattno)
294295
{
295296

296297
if (tlvar->vartype == type_var)

src/backend/optimizer/util/var.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.9 1998/02/10 04:01:27 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.10 1998/02/13 03:40:23 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -18,6 +18,7 @@
1818
#include <nodes/relation.h>
1919

2020
#include "nodes/primnodes.h"
21+
#include "nodes/plannodes.h"
2122
#include "nodes/nodeFuncs.h"
2223

2324
#include "optimizer/internal.h"
@@ -85,7 +86,7 @@ contain_var_clause(Node *clause)
8586
return contain_var_clause(((Iter *) clause)->iterexpr);
8687
else if (single_node(clause))
8788
return FALSE;
88-
else if (or_clause(clause) || and_clause(clause))
89+
else if (or_clause(clause) || and_clause(clause) || is_funcclause(clause))
8990
{
9091
List *temp;
9192

@@ -96,7 +97,7 @@ contain_var_clause(Node *clause)
9697
}
9798
return FALSE;
9899
}
99-
else if (is_funcclause(clause))
100+
else if (is_subplan(clause))
100101
{
101102
List *temp;
102103

@@ -105,6 +106,12 @@ contain_var_clause(Node *clause)
105106
if (contain_var_clause(lfirst(temp)))
106107
return TRUE;
107108
}
109+
/* Ok - check left sides of Oper-s */
110+
foreach(temp, ((SubPlan*) ((Expr *) clause)->oper)->sublink->oper)
111+
{
112+
if (contain_var_clause(lfirst(((Expr*) lfirst(temp))->args)))
113+
return TRUE;
114+
}
108115
return FALSE;
109116
}
110117
else if (IsA(clause, ArrayRef))
@@ -156,19 +163,23 @@ pull_var_clause(Node *clause)
156163
retval = pull_var_clause(((Iter *) clause)->iterexpr);
157164
else if (single_node(clause))
158165
retval = NIL;
159-
else if (or_clause(clause) || and_clause(clause))
166+
else if (or_clause(clause) || and_clause(clause) || is_funcclause(clause))
160167
{
161168
List *temp;
162169

163170
foreach(temp, ((Expr *) clause)->args)
164171
retval = nconc(retval, pull_var_clause(lfirst(temp)));
165172
}
166-
else if (is_funcclause(clause))
173+
else if (is_subplan(clause))
167174
{
168175
List *temp;
169176

170-
foreach(temp, ((Expr *) clause)->args)
177+
foreach(temp, ((Expr*) clause)->args)
171178
retval = nconc(retval, pull_var_clause(lfirst(temp)));
179+
/* Ok - get Var-s from left sides of Oper-s */
180+
foreach(temp, ((SubPlan*) ((Expr*) clause)->oper)->sublink->oper)
181+
retval = nconc(retval,
182+
pull_var_clause(lfirst(((Expr*) lfirst(temp))->args)));
172183
}
173184
else if (IsA(clause, Aggreg))
174185
{
@@ -213,7 +224,7 @@ var_equal(Var *var1, Var *var2)
213224
(((Var *) var1)->varlevelsup == ((Var *) var2)->varlevelsup) &&
214225
(((Var *) var1)->varattno == ((Var *) var2)->varattno))
215226
{
216-
227+
Assert (((Var *) var1)->varlevelsup == 0);
217228
return (true);
218229
}
219230
else

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy