77 *
88 *
99 * 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 $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -51,28 +51,29 @@ static Oidhashjoinop(Expr *clause);
5151void
5252make_var_only_tlist (Query * root ,List * tlist )
5353{
54- List * tlist_vars = NIL ;
55- List * l = NIL ;
56- List * tvar = NIL ;
54+ List * tlist_vars = pull_var_clause ((Node * )tlist );
5755
58- foreach ( l , tlist )
59- {
60- TargetEntry * entry = ( TargetEntry * ) lfirst ( l );
56+ add_vars_to_targetlist ( root , tlist_vars );
57+ freeList ( tlist_vars );
58+ }
6159
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 ;
6470
65- /* now, the target list only contains Var nodes */
66- foreach (tvar ,tlist_vars )
71+ foreach (temp ,vars )
6772{
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 );
7475
75- add_var_to_tlist (result ,var );
76+ add_var_to_tlist (rel ,var );
7677}
7778}
7879
@@ -87,31 +88,30 @@ make_var_only_tlist(Query *root, List *tlist)
8788void
8889add_missing_vars_to_tlist (Query * root ,List * tlist )
8990{
91+ int varno = 1 ;
9092List * l ;
91- int varno ;
9293
93- varno = 1 ;
9494foreach (l ,root -> rtable )
9595{
9696RangeTblEntry * rte = (RangeTblEntry * )lfirst (l );
9797Relids relids ;
98- RelOptInfo * result ;
99- Var * var ;
10098
10199relids = lconsi (varno ,NIL );
102100if (rte -> inFromCl && !rel_member (relids ,root -> base_rel_list ))
103101{
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 */
104108var = makeVar (varno ,ObjectIdAttributeNumber ,
105109OIDOID ,-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 );
109111}
110112pfree (relids );
111113varno ++ ;
112114}
113-
114- return ;
115115}
116116
117117/*****************************************************************************
@@ -239,26 +239,6 @@ add_join_info_to_rels(Query *root, RestrictInfo *restrictinfo,
239239}
240240}
241241
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-
262242/*****************************************************************************
263243 *
264244 * JOININFO
@@ -269,51 +249,51 @@ add_vars_to_targetlist(Query *root, List *vars)
269249 * set_joininfo_mergeable_hashable
270250 * Set the MergeJoinable or HashJoinable field for every joininfo node
271251 * (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
273253 * query.
274254 *
275255 * Returns nothing.
276256 */
277257void
278258set_joininfo_mergeable_hashable (List * rel_list )
279259{
280- List * x ,
281- * y ,
282- * z ;
283- RelOptInfo * rel ;
284- JoinInfo * joininfo ;
285- RestrictInfo * restrictinfo ;
286- Expr * clause ;
260+ List * x ;
287261
288262foreach (x ,rel_list )
289263{
290- rel = (RelOptInfo * )lfirst (x );
264+ RelOptInfo * rel = (RelOptInfo * )lfirst (x );
265+ List * y ;
266+
291267foreach (y ,rel -> joininfo )
292268{
293- joininfo = (JoinInfo * )lfirst (y );
269+ JoinInfo * joininfo = (JoinInfo * )lfirst (y );
270+ List * z ;
271+
294272foreach (z ,joininfo -> jinfo_restrictinfo )
295273{
296- restrictinfo = (RestrictInfo * )lfirst (z );
297- clause = restrictinfo -> clause ;
274+ RestrictInfo * restrictinfo = (RestrictInfo * )lfirst (z );
275+ Expr * clause = restrictinfo -> clause ;
276+
298277if (is_joinable ((Node * )clause ))
299278{
300- MergeOrder * sortop = (MergeOrder * )NULL ;
301- Oid hashop = (Oid )NULL ;
302-
303279if (_enable_mergejoin_ )
304- sortop = mergejoinop (clause );
305- if (sortop )
306280{
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+ }
309287}
310288
311289if (_enable_hashjoin_ )
312- hashop = hashjoinop (clause );
313- if (hashop )
314290{
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+ }
317297}
318298}
319299}
@@ -323,8 +303,8 @@ set_joininfo_mergeable_hashable(List *rel_list)
323303
324304/*
325305 * 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
328308 * a mergejoinable operator.
329309 */
330310static MergeOrder *
@@ -346,7 +326,7 @@ mergejoinop(Expr *clause)
346326/* caution: is_opclause accepts more than I do, so check it */
347327if (!right )
348328return NULL ;/* unary opclauses need not apply */
349- if (!IsA (left ,Var )|| !IsA (right ,Var ))
329+ if (!IsA (left ,Var )|| !IsA (right ,Var ))
350330return NULL ;
351331
352332opno = ((Oper * )clause -> oper )-> opno ;
@@ -374,8 +354,8 @@ mergejoinop(Expr *clause)
374354
375355/*
376356 * 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
379359 * a hashjoinable operator.
380360 */
381361static Oid
@@ -393,7 +373,7 @@ hashjoinop(Expr *clause)
393373/* caution: is_opclause accepts more than I do, so check it */
394374if (!right )
395375return InvalidOid ;/* unary opclauses need not apply */
396- if (!IsA (left ,Var )|| !IsA (right ,Var ))
376+ if (!IsA (left ,Var )|| !IsA (right ,Var ))
397377return InvalidOid ;
398378
399379return op_hashjoinable (((Oper * )clause -> oper )-> opno ,