7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.35 1999/07/24 23:21:12 tgl Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.36 1999/08/10 03:00:14 tgl Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
@@ -51,28 +51,29 @@ static Oid hashjoinop(Expr *clause);
51
51
void
52
52
make_var_only_tlist (Query * root , List * tlist )
53
53
{
54
- List * tlist_vars = NIL ;
55
- List * l = NIL ;
56
- List * tvar = NIL ;
54
+ List * tlist_vars = pull_var_clause ((Node * ) tlist );
57
55
58
- foreach ( l , tlist )
59
- {
60
- TargetEntry * entry = ( TargetEntry * ) lfirst ( l );
56
+ add_vars_to_targetlist ( root , tlist_vars );
57
+ freeList ( tlist_vars );
58
+ }
61
59
62
- tlist_vars = nconc (tlist_vars , pull_var_clause (entry -> expr ));
63
- }
60
+ /*
61
+ * add_vars_to_targetlist
62
+ * For each variable appearing in the list, add it to the relation's
63
+ * targetlist if not already present. Rel nodes will also be created
64
+ * if not already present.
65
+ */
66
+ static void
67
+ add_vars_to_targetlist (Query * root , List * vars )
68
+ {
69
+ List * temp ;
64
70
65
- /* now, the target list only contains Var nodes */
66
- foreach (tvar , tlist_vars )
71
+ foreach (temp , vars )
67
72
{
68
- Var * var = (Var * ) lfirst (tvar );
69
- Index varno ;
70
- RelOptInfo * result ;
71
-
72
- varno = var -> varno ;
73
- result = get_base_rel (root , varno );
73
+ Var * var = (Var * ) lfirst (temp );
74
+ RelOptInfo * rel = get_base_rel (root , var -> varno );
74
75
75
- add_var_to_tlist (result , var );
76
+ add_var_to_tlist (rel , var );
76
77
}
77
78
}
78
79
@@ -87,31 +88,30 @@ make_var_only_tlist(Query *root, List *tlist)
87
88
void
88
89
add_missing_vars_to_tlist (Query * root , List * tlist )
89
90
{
91
+ int varno = 1 ;
90
92
List * l ;
91
- int varno ;
92
93
93
- varno = 1 ;
94
94
foreach (l , root -> rtable )
95
95
{
96
96
RangeTblEntry * rte = (RangeTblEntry * ) lfirst (l );
97
97
Relids relids ;
98
- RelOptInfo * result ;
99
- Var * var ;
100
98
101
99
relids = lconsi (varno , NIL );
102
100
if (rte -> inFromCl && !rel_member (relids , root -> base_rel_list ))
103
101
{
102
+ RelOptInfo * rel ;
103
+ Var * var ;
104
+
105
+ /* add it to base_rel_list */
106
+ rel = get_base_rel (root , varno );
107
+ /* give it a dummy tlist entry for its OID */
104
108
var = makeVar (varno , ObjectIdAttributeNumber ,
105
109
OIDOID , -1 , 0 , varno , ObjectIdAttributeNumber );
106
- /* add it to base_rel_list */
107
- result = get_base_rel (root , varno );
108
- add_var_to_tlist (result , var );
110
+ add_var_to_tlist (rel , var );
109
111
}
110
112
pfree (relids );
111
113
varno ++ ;
112
114
}
113
-
114
- return ;
115
115
}
116
116
117
117
/*****************************************************************************
@@ -239,26 +239,6 @@ add_join_info_to_rels(Query *root, RestrictInfo *restrictinfo,
239
239
}
240
240
}
241
241
242
- /*
243
- * add_vars_to_targetlist
244
- * For each variable appearing in a clause, add it to the relation's
245
- * targetlist if not already present.
246
- */
247
- static void
248
- add_vars_to_targetlist (Query * root , List * vars )
249
- {
250
- List * temp ;
251
-
252
- foreach (temp , vars )
253
- {
254
- Var * var = (Var * ) lfirst (temp );
255
- RelOptInfo * rel = get_base_rel (root , var -> varno );
256
-
257
- if (tlistentry_member (var , rel -> targetlist ) == NULL )
258
- add_var_to_tlist (rel , var );
259
- }
260
- }
261
-
262
242
/*****************************************************************************
263
243
*
264
244
* JOININFO
@@ -269,51 +249,51 @@ add_vars_to_targetlist(Query *root, List *vars)
269
249
* set_joininfo_mergeable_hashable
270
250
* Set the MergeJoinable or HashJoinable field for every joininfo node
271
251
* (within a rel node) and the mergejoinorder or hashjoinop field for
272
- * each restrictinfo node(within a joininfo node) for all relations in a
252
+ * each restrictinfo node (within a joininfo node) for all relations in a
273
253
* query.
274
254
*
275
255
* Returns nothing.
276
256
*/
277
257
void
278
258
set_joininfo_mergeable_hashable (List * rel_list )
279
259
{
280
- List * x ,
281
- * y ,
282
- * z ;
283
- RelOptInfo * rel ;
284
- JoinInfo * joininfo ;
285
- RestrictInfo * restrictinfo ;
286
- Expr * clause ;
260
+ List * x ;
287
261
288
262
foreach (x , rel_list )
289
263
{
290
- rel = (RelOptInfo * ) lfirst (x );
264
+ RelOptInfo * rel = (RelOptInfo * ) lfirst (x );
265
+ List * y ;
266
+
291
267
foreach (y , rel -> joininfo )
292
268
{
293
- joininfo = (JoinInfo * ) lfirst (y );
269
+ JoinInfo * joininfo = (JoinInfo * ) lfirst (y );
270
+ List * z ;
271
+
294
272
foreach (z , joininfo -> jinfo_restrictinfo )
295
273
{
296
- restrictinfo = (RestrictInfo * ) lfirst (z );
297
- clause = restrictinfo -> clause ;
274
+ RestrictInfo * restrictinfo = (RestrictInfo * ) lfirst (z );
275
+ Expr * clause = restrictinfo -> clause ;
276
+
298
277
if (is_joinable ((Node * ) clause ))
299
278
{
300
- MergeOrder * sortop = (MergeOrder * ) NULL ;
301
- Oid hashop = (Oid ) NULL ;
302
-
303
279
if (_enable_mergejoin_ )
304
- sortop = mergejoinop (clause );
305
- if (sortop )
306
280
{
307
- restrictinfo -> mergejoinorder = sortop ;
308
- joininfo -> mergejoinable = true;
281
+ MergeOrder * sortop = mergejoinop (clause );
282
+ if (sortop )
283
+ {
284
+ restrictinfo -> mergejoinorder = sortop ;
285
+ joininfo -> mergejoinable = true;
286
+ }
309
287
}
310
288
311
289
if (_enable_hashjoin_ )
312
- hashop = hashjoinop (clause );
313
- if (hashop )
314
290
{
315
- restrictinfo -> hashjoinoperator = hashop ;
316
- joininfo -> hashjoinable = true;
291
+ Oid hashop = hashjoinop (clause );
292
+ if (hashop )
293
+ {
294
+ restrictinfo -> hashjoinoperator = hashop ;
295
+ joininfo -> hashjoinable = true;
296
+ }
317
297
}
318
298
}
319
299
}
@@ -323,8 +303,8 @@ set_joininfo_mergeable_hashable(List *rel_list)
323
303
324
304
/*
325
305
* mergejoinop
326
- * Returns the mergejoin operator of an operator iff 'clause' is
327
- * mergejoinable, i.e., both operands are single vars and the operator is
306
+ * Returns a MergeOrder node for 'clause' iff 'clause' is mergejoinable,
307
+ * i.e., both operands are single vars and the operator is
328
308
* a mergejoinable operator.
329
309
*/
330
310
static MergeOrder *
@@ -346,7 +326,7 @@ mergejoinop(Expr *clause)
346
326
/* caution: is_opclause accepts more than I do, so check it */
347
327
if (!right )
348
328
return NULL ; /* unary opclauses need not apply */
349
- if (!IsA (left , Var ) || !IsA (right , Var ))
329
+ if (!IsA (left , Var ) || !IsA (right , Var ))
350
330
return NULL ;
351
331
352
332
opno = ((Oper * ) clause -> oper )-> opno ;
@@ -374,8 +354,8 @@ mergejoinop(Expr *clause)
374
354
375
355
/*
376
356
* hashjoinop
377
- * Returns the hashjoin operator of an operator iff 'clause' is
378
- * hashjoinable, i.e., both operands are single vars and the operator is
357
+ * Returns the hashjoin operator iff 'clause' is hashjoinable,
358
+ * i.e., both operands are single vars and the operator is
379
359
* a hashjoinable operator.
380
360
*/
381
361
static Oid
@@ -393,7 +373,7 @@ hashjoinop(Expr *clause)
393
373
/* caution: is_opclause accepts more than I do, so check it */
394
374
if (!right )
395
375
return InvalidOid ; /* unary opclauses need not apply */
396
- if (!IsA (left , Var ) || !IsA (right , Var ))
376
+ if (!IsA (left , Var ) || !IsA (right , Var ))
397
377
return InvalidOid ;
398
378
399
379
return op_hashjoinable (((Oper * ) clause -> oper )-> opno ,
0 commit comments