Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 5729c35

Browse files
committed
fix_indxqual_references didn't cope with ArrayRef nodes,
meaning that this failed: select proname,typname,prosrc from pg_proc,pg_type where proname = 'float8' and pg_proc.proargtypes[0] = pg_type.oid;
1 parent 9f82f9e commit 5729c35

File tree

1 file changed

+61
-56
lines changed

1 file changed

+61
-56
lines changed

src/backend/optimizer/plan/createplan.c

Lines changed: 61 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
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+
632639
static Node *
633640
fix_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
{
639646
if (lfirsti(index_path->parent->relids) == ((Var *) clause)->varno)
640647
{
648+
Node *newclause;
641649
int pos = 0;
642650
int varatt = ((Var *) clause)->varattno;
643651
int *indexkeys = ((IndexPath *) index_path)->indexkeys;
@@ -655,20 +663,18 @@ fix_indxqual_references(Node *clause, Path *index_path)
655663
((Var *) newclause)->varattno = pos + 1;
656664
return 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);
668671
else if (is_opclause(clause) &&
669672
is_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+
*/
672678
Var *newvar = makeVar((Index) lfirsti(index_path->parent->relids),
673679
1, /* func indices have one key */
674680
((Func *) ((Expr *) clause)->oper)->functype,
@@ -686,61 +692,60 @@ fix_indxqual_references(Node *clause, Path *index_path)
686692
{
687693
Expr *expr = (Expr *) clause;
688694
List *new_subclauses = NIL;
689-
Node *subclause = NULL;
690-
List *i = NIL;
695+
List *i;
691696

692697
foreach(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;
722709
List *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

0 commit comments

Comments
 (0)