Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite51c674

Browse files
committed
Support for subselects.
1 parent9184073 commite51c674

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
* AUTHORDATEMAJOR 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+
elseif (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-
#ifdefINDEXSCAN_PATCH
631644
}
632-
elseif (is_opclause(clause)&&IsA(left,Var)&&IsA(right,Param))
645+
elseif (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
elseif (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-
#ifdefINDEXSCAN_PATCH
684694
}
685-
elseif (is_opclause(clause)&&IsA(right,Var)&&IsA(left,Param))
695+
elseif (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:21momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/tlist.c,v 1.11 1998/02/13 03:40:21vadim 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
returncontain_var_clause(((Iter*)clause)->iterexpr);
8687
elseif (single_node(clause))
8788
return FALSE;
88-
elseif (or_clause(clause)||and_clause(clause))
89+
elseif (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-
elseif (is_funcclause(clause))
100+
elseif (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
elseif (IsA(clause,ArrayRef))
@@ -156,19 +163,23 @@ pull_var_clause(Node *clause)
156163
retval=pull_var_clause(((Iter*)clause)->iterexpr);
157164
elseif (single_node(clause))
158165
retval=NIL;
159-
elseif (or_clause(clause)||and_clause(clause))
166+
elseif (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-
elseif (is_funcclause(clause))
173+
elseif (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
elseif (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)

[8]ページ先頭

©2009-2025 Movatter.jp