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

Commit15455e1

Browse files
committed
Eliminate RewritePreprocessQuery, which was taking an
unreasonable amount of time to clean up after a vanished parser problem.Don't call fireRIRonSubselect when we know there are no subselects,either.
1 parentc6f5f85 commit15455e1

File tree

1 file changed

+22
-72
lines changed

1 file changed

+22
-72
lines changed

‎src/backend/rewrite/rewriteHandler.c

Lines changed: 22 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
*
88
* IDENTIFICATION
9-
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.61 1999/10/17 23:50:43 tgl Exp $
9+
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.62 1999/11/01 05:18:31 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -491,7 +491,7 @@ modifyAggrefMakeSublink(Expr *origexp, Query *parsetree)
491491
target= (Var*) (aggref->target);
492492
if (!IsA(target,Var))
493493
elog(ERROR,"rewrite: aggregates of views only allowed on simple variables for now");
494-
rte=(RangeTblEntry*)nth(target->varno-1,parsetree->rtable);
494+
rte=rt_fetch(target->varno,parsetree->rtable);
495495

496496
resdom=makeNode(Resdom);
497497
resdom->resno=1;
@@ -916,7 +916,7 @@ ApplyRetrieveRule(Query *parsetree,
916916

917917
if (relation_level)
918918
{
919-
RangeTblEntry*rte=(RangeTblEntry*)nth(rt_index-1,rtable);
919+
RangeTblEntry*rte=rt_fetch(rt_index,rtable);
920920

921921
parsetree= (Query*)apply_RIR_view((Node*)parsetree,
922922
rt_index,rte,
@@ -1024,7 +1024,7 @@ fireRIRrules(Query *parsetree)
10241024
{
10251025
++rt_index;
10261026

1027-
rte=nth(rt_index-1,parsetree->rtable);
1027+
rte=rt_fetch(rt_index,parsetree->rtable);
10281028

10291029
/*
10301030
* If the table is not one named in the original FROM clause
@@ -1110,7 +1110,8 @@ fireRIRrules(Query *parsetree)
11101110
heap_close(rel,AccessShareLock);
11111111
}
11121112

1113-
fireRIRonSubselect((Node*)parsetree,NULL);
1113+
if (parsetree->hasSubLinks)
1114+
fireRIRonSubselect((Node*)parsetree,NULL);
11141115

11151116
parsetree->qual=modifyAggrefQual(parsetree->qual,parsetree);
11161117

@@ -1246,8 +1247,7 @@ fireRules(Query *parsetree,
12461247
break;
12471248
}
12481249

1249-
rte= (RangeTblEntry*)nth(parsetree->resultRelation-1,
1250-
parsetree->rtable);
1250+
rte=rt_fetch(parsetree->resultRelation,parsetree->rtable);
12511251
if (!rte->skipAcl)
12521252
{
12531253
acl_rc=pg_aclcheck(rte->relname,
@@ -1546,50 +1546,6 @@ QueryRewriteOne(Query *parsetree)
15461546
}
15471547

15481548

1549-
/* ----------
1550-
* RewritePreprocessQuery -
1551-
*adjust details in the parsetree, the rule system
1552-
*depends on
1553-
* ----------
1554-
*/
1555-
staticvoid
1556-
RewritePreprocessQuery(Query*parsetree)
1557-
{
1558-
/* ----------
1559-
* if the query has a resultRelation, reassign the
1560-
* result domain numbers to the attribute numbers in the
1561-
* target relation. FixNew() depends on it when replacing
1562-
* *new* references in a rule action by the expressions
1563-
* from the rewritten query.
1564-
* resjunk targets are somewhat arbitrarily given a resno of 0;
1565-
* this is to prevent FixNew() from matching them to var nodes.
1566-
* ----------
1567-
*/
1568-
if (parsetree->resultRelation>0)
1569-
{
1570-
RangeTblEntry*rte;
1571-
Relationrd;
1572-
List*tl;
1573-
1574-
rte= (RangeTblEntry*)nth(parsetree->resultRelation-1,
1575-
parsetree->rtable);
1576-
rd=heap_openr(rte->relname,AccessShareLock);
1577-
1578-
foreach(tl,parsetree->targetList)
1579-
{
1580-
TargetEntry*tle= (TargetEntry*)lfirst(tl);
1581-
1582-
if (!tle->resdom->resjunk)
1583-
tle->resdom->resno=attnameAttNum(rd,tle->resdom->resname);
1584-
else
1585-
tle->resdom->resno=0;
1586-
}
1587-
1588-
heap_close(rd,AccessShareLock);
1589-
}
1590-
}
1591-
1592-
15931549
/*
15941550
* BasicQueryRewrite -
15951551
* rewrite one query via query rewrite system, possibly returning 0
@@ -1606,20 +1562,12 @@ BasicQueryRewrite(Query *parsetree)
16061562
/*
16071563
* Step 1
16081564
*
1609-
* There still seems something broken with the resdom numbers so we
1610-
* reassign them first.
1611-
*/
1612-
RewritePreprocessQuery(parsetree);
1613-
1614-
/*
1615-
* Step 2
1616-
*
16171565
* Apply all non-SELECT rules possibly getting 0 or many queries
16181566
*/
16191567
querylist=QueryRewriteOne(parsetree);
16201568

16211569
/*
1622-
* Step3
1570+
* Step2
16231571
*
16241572
* Apply all the RIR rules on each query
16251573
*/
@@ -1629,17 +1577,20 @@ BasicQueryRewrite(Query *parsetree)
16291577

16301578
/*
16311579
* If the query was marked having aggregates, check if this is
1632-
* still true after rewriting. This check must get expanded when
1633-
* someday aggregates can appear somewhere else than in the
1634-
* targetlist or the having qual.
1580+
* still true after rewriting. Ditto for sublinks.
1581+
*
1582+
* This check must get expanded when someday aggregates can appear
1583+
* somewhere else than in the targetlist or the having qual.
16351584
*/
16361585
if (query->hasAggs)
16371586
query->hasAggs=checkQueryHasAggs((Node*) (query->targetList))
16381587
||checkQueryHasAggs((Node*) (query->havingQual));
1639-
query->hasSubLinks=checkQueryHasSubLink((Node*) (query->qual))
1640-
||checkQueryHasSubLink((Node*) (query->havingQual));
1588+
if (query->hasSubLinks)
1589+
query->hasSubLinks=checkQueryHasSubLink((Node*) (query->qual))
1590+
||checkQueryHasSubLink((Node*) (query->havingQual));
16411591
results=lappend(results,query);
16421592
}
1593+
16431594
returnresults;
16441595
}
16451596

@@ -1809,8 +1760,7 @@ Except_Intersect_Rewrite(Query *parsetree)
18091760
Node*limitOffset,
18101761
*limitCount;
18111762
CmdTypecommandType=CMD_SELECT;
1812-
List*rtable_insert=NIL;
1813-
1763+
RangeTblEntry*rtable_insert=NULL;
18141764
List*prev_target=NIL;
18151765

18161766
/*
@@ -1837,15 +1787,15 @@ Except_Intersect_Rewrite(Query *parsetree)
18371787
*/
18381788
if (parsetree->commandType==CMD_INSERT)
18391789
{
1840-
parsetree->commandType=CMD_SELECT;
1841-
commandType=CMD_INSERT;
1842-
parsetree->resultRelation=0;
1843-
18441790
/*
18451791
* The result relation ( = the one to insert into) has to be
18461792
* attached to the rtable list of the new top node
18471793
*/
1848-
rtable_insert=nth(length(parsetree->rtable)-1,parsetree->rtable);
1794+
rtable_insert=rt_fetch(parsetree->resultRelation,parsetree->rtable);
1795+
1796+
parsetree->commandType=CMD_SELECT;
1797+
commandType=CMD_INSERT;
1798+
parsetree->resultRelation=0;
18491799
}
18501800

18511801
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp