Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5729c35

Browse files
committed
fix_indxqual_references didn't cope with ArrayRef nodes,
meaning that this failed:select proname,typname,prosrc from pg_proc,pg_typewhere proname = 'float8' and pg_proc.proargtypes[0] = pg_type.oid;
1 parent9f82f9e commit5729c35

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
staticNode*
633640
fix_indxqual_references(Node*clause,Path*index_path)
634641
{
635-
Node*newclause;
636-
637-
if (IsA(clause,Var))
642+
if (clause==NULL)
643+
returnNULL;
644+
elseif (IsA(clause,Var))
638645
{
639646
if (lfirsti(index_path->parent->relids)== ((Var*)clause)->varno)
640647
{
648+
Node*newclause;
641649
intpos=0;
642650
intvaratt= ((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
returnnewclause;
657665
}
658-
else
659-
returnclause;
660-
}
661-
elseif (IsA(clause,Const))
662-
returnclause;
663-
elseif (IsA(clause,Param))
664-
{
665-
/* Function parameter used as index scan arg. DZ - 27-8-1996 */
666-
returnclause;
666+
/* The Var is not part of the indexed relation, leave it alone */
667+
returncopyObject(clause);
667668
}
669+
elseif (single_node(clause))
670+
returncopyObject(clause);
668671
elseif (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-
returnclause;
713-
}
714-
elseif (IsA(clause,CaseExpr))
715-
{
716-
elog(NOTICE,"optimizer: fix_indxqual_references sees CaseExpr");
717-
returnclause;
705+
return (Node*)make_clause(expr->opType,expr->oper,new_subclauses);
718706
}
719-
else
707+
elseif (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-
returnclause;
720+
return (Node*)new_subclauses;
721+
}
722+
elseif (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+
returnNULL;
744749
}
745750
}
746751

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp