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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy