77 *
88 *
99 * IDENTIFICATION
10- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.52 1999/05/01 19:47:40 tgl Exp $
10+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.53 1999/05/06 01:30:58 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -629,15 +629,23 @@ create_hashjoin_node(HashPath *best_path,
629629 *
630630 *****************************************************************************/
631631
632+ /*
633+ * fix_indxqual_references
634+ *Adjust a qual clause to refer to an index instead of the original relation.
635+ *
636+ * Returns a modified copy of the given clause --- the original is not changed.
637+ */
638+
632639static Node *
633640fix_indxqual_references (Node * clause ,Path * index_path )
634641{
635- Node * newclause ;
636-
637- if (IsA (clause ,Var ))
642+ if ( clause == NULL )
643+ return NULL ;
644+ else if (IsA (clause ,Var ))
638645{
639646if (lfirsti (index_path -> parent -> relids )== ((Var * )clause )-> varno )
640647{
648+ Node * newclause ;
641649int pos = 0 ;
642650int varatt = ((Var * )clause )-> varattno ;
643651int * indexkeys = ((IndexPath * )index_path )-> indexkeys ;
@@ -655,20 +663,18 @@ fix_indxqual_references(Node *clause, Path *index_path)
655663((Var * )newclause )-> varattno = pos + 1 ;
656664return newclause ;
657665}
658- else
659- return clause ;
660- }
661- else if (IsA (clause ,Const ))
662- return clause ;
663- else if (IsA (clause ,Param ))
664- {
665- /* Function parameter used as index scan arg. DZ - 27-8-1996 */
666- return clause ;
666+ /* The Var is not part of the indexed relation, leave it alone */
667+ return copyObject (clause );
667668}
669+ else if (single_node (clause ))
670+ return copyObject (clause );
668671else if (is_opclause (clause )&&
669672is_funcclause ((Node * )get_leftop ((Expr * )clause ))&&
670673((Func * ) ((Expr * )get_leftop ((Expr * )clause ))-> oper )-> funcisindex )
671674{
675+ /* This looks pretty seriously wrong to me, but I'm not sure what it's
676+ * supposed to be doing ... tgl 5/99
677+ */
672678Var * newvar = makeVar ((Index )lfirsti (index_path -> parent -> relids ),
6736791 ,/* func indices have one key */
674680((Func * ) ((Expr * )clause )-> oper )-> functype ,
@@ -686,61 +692,60 @@ fix_indxqual_references(Node *clause, Path *index_path)
686692{
687693Expr * expr = (Expr * )clause ;
688694List * new_subclauses = NIL ;
689- Node * subclause = NULL ;
690- List * i = NIL ;
695+ List * i ;
691696
692697foreach (i ,expr -> args )
693698{
694- subclause = lfirst (i );
695- if (subclause )
696- new_subclauses = lappend (new_subclauses ,
697- fix_indxqual_references (subclause ,
698- index_path ));
699-
699+ Node * subclause = lfirst (i );
700+ new_subclauses = lappend (new_subclauses ,
701+ fix_indxqual_references (subclause ,
702+ index_path ));
700703}
701704
702- /*
703- * XXX new_subclauses should be a list of the form: ( (var var)
704- * (var const) ...) ?
705- */
706- if (new_subclauses )
707- {
708- return (Node * )
709- make_clause (expr -> opType ,expr -> oper ,new_subclauses );
710- }
711- else
712- return clause ;
713- }
714- else if (IsA (clause ,CaseExpr ))
715- {
716- elog (NOTICE ,"optimizer: fix_indxqual_references sees CaseExpr" );
717- return clause ;
705+ return (Node * )make_clause (expr -> opType ,expr -> oper ,new_subclauses );
718706}
719- else
707+ else if ( IsA ( clause , List ))
720708{
721- List * oldclauses = (List * )clause ;
722709List * new_subclauses = NIL ;
723- Node * subclause = NULL ;
724- List * i = NIL ;
710+ List * i ;
725711
726- foreach (i ,oldclauses )
712+ foreach (i ,( List * ) clause )
727713{
728- subclause = lfirst (i );
729- if (subclause )
730- new_subclauses = lappend (new_subclauses ,
731- fix_indxqual_references (subclause ,
732- index_path ));
733-
714+ Node * subclause = lfirst (i );
715+ new_subclauses = lappend (new_subclauses ,
716+ fix_indxqual_references (subclause ,
717+ index_path ));
734718}
735719
736- /*
737- * XXX new_subclauses should be a list of the form: ( (var var)
738- * (var const) ...) ?
739- */
740- if (new_subclauses )
741- return (Node * )new_subclauses ;
742- else
743- return clause ;
720+ return (Node * )new_subclauses ;
721+ }
722+ else if (IsA (clause ,ArrayRef ))
723+ {
724+ ArrayRef * oldnode = (ArrayRef * )clause ;
725+ ArrayRef * newnode = makeNode (ArrayRef );
726+
727+ newnode -> refattrlength = oldnode -> refattrlength ;
728+ newnode -> refelemlength = oldnode -> refelemlength ;
729+ newnode -> refelemtype = oldnode -> refelemtype ;
730+ newnode -> refelembyval = oldnode -> refelembyval ;
731+ newnode -> refupperindexpr = (List * )
732+ fix_indxqual_references ((Node * )oldnode -> refupperindexpr ,
733+ index_path );
734+ newnode -> reflowerindexpr = (List * )
735+ fix_indxqual_references ((Node * )oldnode -> reflowerindexpr ,
736+ index_path );
737+ newnode -> refexpr =
738+ fix_indxqual_references (oldnode -> refexpr ,index_path );
739+ newnode -> refassgnexpr =
740+ fix_indxqual_references (oldnode -> refassgnexpr ,index_path );
741+
742+ return (Node * )newnode ;
743+ }
744+ else
745+ {
746+ elog (ERROR ,"fix_indxqual_references: Cannot handle node type %d" ,
747+ nodeTag (clause ));
748+ return NULL ;
744749}
745750}
746751