7
7
*
8
8
*
9
9
* 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 $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
@@ -629,15 +629,23 @@ create_hashjoin_node(HashPath *best_path,
629
629
*
630
630
*****************************************************************************/
631
631
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
+
632
639
static Node *
633
640
fix_indxqual_references (Node * clause , Path * index_path )
634
641
{
635
- Node * newclause ;
636
-
637
- if (IsA (clause , Var ))
642
+ if ( clause == NULL )
643
+ return NULL ;
644
+ else if (IsA (clause , Var ))
638
645
{
639
646
if (lfirsti (index_path -> parent -> relids ) == ((Var * ) clause )-> varno )
640
647
{
648
+ Node * newclause ;
641
649
int pos = 0 ;
642
650
int varatt = ((Var * ) clause )-> varattno ;
643
651
int * indexkeys = ((IndexPath * ) index_path )-> indexkeys ;
@@ -655,20 +663,18 @@ fix_indxqual_references(Node *clause, Path *index_path)
655
663
((Var * ) newclause )-> varattno = pos + 1 ;
656
664
return newclause ;
657
665
}
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 );
667
668
}
669
+ else if (single_node (clause ))
670
+ return copyObject (clause );
668
671
else if (is_opclause (clause ) &&
669
672
is_funcclause ((Node * ) get_leftop ((Expr * ) clause )) &&
670
673
((Func * ) ((Expr * ) get_leftop ((Expr * ) clause ))-> oper )-> funcisindex )
671
674
{
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
+ */
672
678
Var * newvar = makeVar ((Index ) lfirsti (index_path -> parent -> relids ),
673
679
1 , /* func indices have one key */
674
680
((Func * ) ((Expr * ) clause )-> oper )-> functype ,
@@ -686,61 +692,60 @@ fix_indxqual_references(Node *clause, Path *index_path)
686
692
{
687
693
Expr * expr = (Expr * ) clause ;
688
694
List * new_subclauses = NIL ;
689
- Node * subclause = NULL ;
690
- List * i = NIL ;
695
+ List * i ;
691
696
692
697
foreach (i , expr -> args )
693
698
{
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 ));
700
703
}
701
704
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 );
718
706
}
719
- else
707
+ else if ( IsA ( clause , List ))
720
708
{
721
- List * oldclauses = (List * ) clause ;
722
709
List * new_subclauses = NIL ;
723
- Node * subclause = NULL ;
724
- List * i = NIL ;
710
+ List * i ;
725
711
726
- foreach (i , oldclauses )
712
+ foreach (i , ( List * ) clause )
727
713
{
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 ));
734
718
}
735
719
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 ;
744
749
}
745
750
}
746
751
0 commit comments