Skip to content
Snippets Groups Projects
Commit 15455e14 authored by Tom Lane's avatar Tom Lane
Browse files

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.
parent c6f5f858
No related branches found
No related tags found
No related merge requests found
......@@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.61 1999/10/17 23:50:43 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.62 1999/11/01 05:18:31 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -491,7 +491,7 @@ modifyAggrefMakeSublink(Expr *origexp, Query *parsetree)
target = (Var *) (aggref->target);
if (! IsA(target, Var))
elog(ERROR, "rewrite: aggregates of views only allowed on simple variables for now");
rte = (RangeTblEntry *) nth(target->varno - 1, parsetree->rtable);
rte = rt_fetch(target->varno, parsetree->rtable);
resdom = makeNode(Resdom);
resdom->resno = 1;
......@@ -916,7 +916,7 @@ ApplyRetrieveRule(Query *parsetree,
if (relation_level)
{
RangeTblEntry *rte = (RangeTblEntry *) nth(rt_index - 1, rtable);
RangeTblEntry *rte = rt_fetch(rt_index, rtable);
parsetree = (Query *) apply_RIR_view((Node *) parsetree,
rt_index, rte,
......@@ -1024,7 +1024,7 @@ fireRIRrules(Query *parsetree)
{
++rt_index;
rte = nth(rt_index - 1, parsetree->rtable);
rte = rt_fetch(rt_index, parsetree->rtable);
/*
* If the table is not one named in the original FROM clause
......@@ -1110,6 +1110,7 @@ fireRIRrules(Query *parsetree)
heap_close(rel, AccessShareLock);
}
if (parsetree->hasSubLinks)
fireRIRonSubselect((Node *) parsetree, NULL);
parsetree->qual = modifyAggrefQual(parsetree->qual, parsetree);
......@@ -1246,8 +1247,7 @@ fireRules(Query *parsetree,
break;
}
rte = (RangeTblEntry *) nth(parsetree->resultRelation - 1,
parsetree->rtable);
rte = rt_fetch(parsetree->resultRelation, parsetree->rtable);
if (!rte->skipAcl)
{
acl_rc = pg_aclcheck(rte->relname,
......@@ -1546,50 +1546,6 @@ QueryRewriteOne(Query *parsetree)
}
/* ----------
* RewritePreprocessQuery -
* adjust details in the parsetree, the rule system
* depends on
* ----------
*/
static void
RewritePreprocessQuery(Query *parsetree)
{
/* ----------
* if the query has a resultRelation, reassign the
* result domain numbers to the attribute numbers in the
* target relation. FixNew() depends on it when replacing
* *new* references in a rule action by the expressions
* from the rewritten query.
* resjunk targets are somewhat arbitrarily given a resno of 0;
* this is to prevent FixNew() from matching them to var nodes.
* ----------
*/
if (parsetree->resultRelation > 0)
{
RangeTblEntry *rte;
Relation rd;
List *tl;
rte = (RangeTblEntry *) nth(parsetree->resultRelation - 1,
parsetree->rtable);
rd = heap_openr(rte->relname, AccessShareLock);
foreach(tl, parsetree->targetList)
{
TargetEntry *tle = (TargetEntry *) lfirst(tl);
if (! tle->resdom->resjunk)
tle->resdom->resno = attnameAttNum(rd, tle->resdom->resname);
else
tle->resdom->resno = 0;
}
heap_close(rd, AccessShareLock);
}
}
/*
* BasicQueryRewrite -
* rewrite one query via query rewrite system, possibly returning 0
......@@ -1606,20 +1562,12 @@ BasicQueryRewrite(Query *parsetree)
/*
* Step 1
*
* There still seems something broken with the resdom numbers so we
* reassign them first.
*/
RewritePreprocessQuery(parsetree);
/*
* Step 2
*
* Apply all non-SELECT rules possibly getting 0 or many queries
*/
querylist = QueryRewriteOne(parsetree);
/*
* Step 3
* Step 2
*
* Apply all the RIR rules on each query
*/
......@@ -1629,17 +1577,20 @@ BasicQueryRewrite(Query *parsetree)
/*
* If the query was marked having aggregates, check if this is
* still true after rewriting. This check must get expanded when
* someday aggregates can appear somewhere else than in the
* targetlist or the having qual.
* still true after rewriting. Ditto for sublinks.
*
* This check must get expanded when someday aggregates can appear
* somewhere else than in the targetlist or the having qual.
*/
if (query->hasAggs)
query->hasAggs = checkQueryHasAggs((Node *) (query->targetList))
|| checkQueryHasAggs((Node *) (query->havingQual));
if (query->hasSubLinks)
query->hasSubLinks = checkQueryHasSubLink((Node *) (query->qual))
|| checkQueryHasSubLink((Node *) (query->havingQual));
results = lappend(results, query);
}
return results;
}
......@@ -1809,8 +1760,7 @@ Except_Intersect_Rewrite(Query *parsetree)
Node *limitOffset,
*limitCount;
CmdType commandType = CMD_SELECT;
List *rtable_insert = NIL;
RangeTblEntry *rtable_insert = NULL;
List *prev_target = NIL;
/*
......@@ -1837,15 +1787,15 @@ Except_Intersect_Rewrite(Query *parsetree)
*/
if (parsetree->commandType == CMD_INSERT)
{
parsetree->commandType = CMD_SELECT;
commandType = CMD_INSERT;
parsetree->resultRelation = 0;
/*
* The result relation ( = the one to insert into) has to be
* attached to the rtable list of the new top node
*/
rtable_insert = nth(length(parsetree->rtable) - 1, parsetree->rtable);
rtable_insert = rt_fetch(parsetree->resultRelation, parsetree->rtable);
parsetree->commandType = CMD_SELECT;
commandType = CMD_INSERT;
parsetree->resultRelation = 0;
}
/*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment