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 Oidhashjoinop(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
- * Returnsthe mergejoin operator of an operator iff 'clause' is
327
- *mergejoinable, i.e., both operands are single vars and the operator is
306
+ * Returnsa 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 operatorof 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 ,