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

Commit56e59ed

Browse files
committed
Fix a performance regression in 8.2: optimization of MIN/MAX into indexscans
had stopped working for tables buried inside views or sub-selects. This isbecause I had gotten rid of the simplify_jointree() preprocessing step, andoptimize_minmax_aggregates() wasn't smart enough to deal with a non-canonicalFromExpr. Per gripe from Bill Howe.
1 parent91e18db commit56e59ed

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

‎src/backend/optimizer/plan/planagg.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/optimizer/plan/planagg.c,v 1.25 2007/01/09 02:14:13 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/optimizer/plan/planagg.c,v 1.26 2007/02/06 06:50:26 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -70,6 +70,7 @@ Plan *
7070
optimize_minmax_aggregates(PlannerInfo*root,List*tlist,Path*best_path)
7171
{
7272
Query*parse=root->parse;
73+
FromExpr*jtnode;
7374
RangeTblRef*rtr;
7475
RangeTblEntry*rte;
7576
RelOptInfo*rel;
@@ -102,14 +103,19 @@ optimize_minmax_aggregates(PlannerInfo *root, List *tlist, Path *best_path)
102103
* We also restrict the query to reference exactly one table, since join
103104
* conditions can't be handled reasonably. (We could perhaps handle a
104105
* query containing cartesian-product joins, but it hardly seems worth the
105-
* trouble.)
106+
* trouble.) However, the single real table could be buried in several
107+
* levels of FromExpr.
106108
*/
107-
Assert(parse->jointree!=NULL&&IsA(parse->jointree,FromExpr));
108-
if (list_length(parse->jointree->fromlist)!=1)
109-
returnNULL;
110-
rtr= (RangeTblRef*)linitial(parse->jointree->fromlist);
111-
if (!IsA(rtr,RangeTblRef))
109+
jtnode=parse->jointree;
110+
while (IsA(jtnode,FromExpr))
111+
{
112+
if (list_length(jtnode->fromlist)!=1)
113+
returnNULL;
114+
jtnode=linitial(jtnode->fromlist);
115+
}
116+
if (!IsA(jtnode,RangeTblRef))
112117
returnNULL;
118+
rtr= (RangeTblRef*)jtnode;
113119
rte=rt_fetch(rtr->rtindex,parse->rtable);
114120
if (rte->rtekind!=RTE_RELATION||rte->inh)
115121
returnNULL;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp