From: | msrbugzilla(at)gmail(dot)com |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | BUG #6693: Potential Bug in rewriteManip.c |
Date: | 2012-06-13 18:08:37 |
Message-ID: | E1Serzh-0008Qv-6o@wrigleys.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
The following bug has been logged on the website:
Bug reference: 6693
Logged by: Ken Cheung
Email address: msrbugzilla(at)gmail(dot)com
PostgreSQL version: 9.1.3
Operating system: Linux
Description:
I observed a code clone in the following files. In these functions,
qry->resultRelation is computed differently but the comment above mentions
the same functionality. I wonder if this is a bug. Hope it helps.
function : ChangeVarNodes @ (file:
"postgresql-9.1.3/src/backend/rewrite/rewriteManip.c", line: 570)~608
context.rt_index = rt_index;
context.new_index = new_index;
context.sublevels_up = sublevels_up;
/*
* Must be prepared to start with a Query or a bare expression tree; if
* it's a Query, go straight to query_tree_walker to make sure that
* sublevels_up doesn't get incremented prematurely.
*/
if (node && IsA(node, Query))
{
Query *qry = (Query *) node;
/*
* If we are starting at a Query, and sublevels_up is zero, then we
* must also fix rangetable indexes in the Query itself --- namely
* resultRelation and rowMarks entries. sublevels_up cannot be zero
* when recursing into a subquery, so there's no need to have the same
* logic inside ChangeVarNodes_walker.
*/
if (sublevels_up == 0)
{
ListCell *l;
if (qry->resultRelation == rt_index)
qry->resultRelation = new_index;
foreach(l, qry->rowMarks)
{
RowMarkClause *rc = (RowMarkClause *) lfirst(l);
if (rc->rti == rt_index)
rc->rti = new_index;
}
}
query_tree_walker(qry, ChangeVarNodes_walker,
(void *) &context, 0);
}
else
ChangeVarNodes_walker(node, &context);
function : OffsetVarNodes @ (file:
"postgresql-9.1.3/src/backend/rewrite/rewriteManip.c", line: 402)~438
context.offset = offset;
context.sublevels_up = sublevels_up;
/*
* Must be prepared to start with a Query or a bare expression tree; if
* it's a Query, go straight to query_tree_walker to make sure that
* sublevels_up doesn't get incremented prematurely.
*/
if (node && IsA(node, Query))
{
Query *qry = (Query *) node;
/*
* If we are starting at a Query, and sublevels_up is zero, then we
* must also fix rangetable indexes in the Query itself --- namely
* resultRelation and rowMarks entries. sublevels_up cannot be zero
* when recursing into a subquery, so there's no need to have the same
* logic inside OffsetVarNodes_walker.
*/
if (sublevels_up == 0)
{
ListCell *l;
if (qry->resultRelation)
qry->resultRelation += offset;
foreach(l, qry->rowMarks)
{
RowMarkClause *rc = (RowMarkClause *) lfirst(l);
rc->rti += offset;
}
}
query_tree_walker(qry, OffsetVarNodes_walker,
(void *) &context, 0);
}
else
OffsetVarNodes_walker(node, &context);
From | Date | Subject | |
---|---|---|---|
Next Message | phb.emaj | 2012-06-13 19:17:11 | BUG #6694: 9.2 beta 2 : psql commands \db and \db+ fail |
Previous Message | msrbugzilla | 2012-06-13 18:03:39 | BUG #6692: Potential Bug in equalfuncs.c |