The following bug has been logged on the website:

Bug reference:      6693
Logged by:          Ken Cheung
Email address:      msrbugzi...@gmail.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);


-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to