Re: BUG #1002: Update using rule on view with inheritance alters 0 rows, 1 row expected. - Mailing list pgsql-bugs

From Tom Lane
Subject Re: BUG #1002: Update using rule on view with inheritance alters 0 rows, 1 row expected.
Date
Msg-id 25758.1070935091@sss.pgh.pa.us
Whole thread Raw
In response to BUG #1002: Update using rule on view with inheritance alters 0 rows, 1 row expected.  ("PostgreSQL Bugs List" <pgsql-bugs@postgresql.org>)
List pgsql-bugs
"PostgreSQL Bugs List" <pgsql-bugs@postgresql.org> writes:
> The following query updates 0 rows, when 1 row is
> expected to be updated:

Nice catch.  The attached patch seems to fix it.

            regards, tom lane


*** src/backend/optimizer/util/clauses.c.orig    Sat Nov 29 14:51:51 2003
--- src/backend/optimizer/util/clauses.c    Mon Dec  8 20:41:07 2003
***************
*** 2960,2995 ****
          RangeTblEntry *rte = (RangeTblEntry *) lfirst(rt);
          RangeTblEntry *newrte;

          switch (rte->rtekind)
          {
              case RTE_RELATION:
              case RTE_SPECIAL:
!                 /* nothing to do, don't bother to make a copy */
                  break;
              case RTE_SUBQUERY:
                  if (!(flags & QTW_IGNORE_RT_SUBQUERIES))
                  {
-                     FLATCOPY(newrte, rte, RangeTblEntry);
                      CHECKFLATCOPY(newrte->subquery, rte->subquery, Query);
                      MUTATE(newrte->subquery, newrte->subquery, Query *);
-                     rte = newrte;
                  }
                  break;
              case RTE_JOIN:
                  if (!(flags & QTW_IGNORE_JOINALIASES))
                  {
-                     FLATCOPY(newrte, rte, RangeTblEntry);
                      MUTATE(newrte->joinaliasvars, rte->joinaliasvars, List *);
-                     rte = newrte;
                  }
                  break;
              case RTE_FUNCTION:
-                 FLATCOPY(newrte, rte, RangeTblEntry);
                  MUTATE(newrte->funcexpr, rte->funcexpr, Node *);
-                 rte = newrte;
                  break;
          }
!         FastAppend(&newrt, rte);
      }
      query->rtable = FastListValue(&newrt);
      return query;
--- 2960,2990 ----
          RangeTblEntry *rte = (RangeTblEntry *) lfirst(rt);
          RangeTblEntry *newrte;

+         FLATCOPY(newrte, rte, RangeTblEntry);
          switch (rte->rtekind)
          {
              case RTE_RELATION:
              case RTE_SPECIAL:
!                 /* we don't bother to copy eref, aliases, etc; OK? */
                  break;
              case RTE_SUBQUERY:
                  if (!(flags & QTW_IGNORE_RT_SUBQUERIES))
                  {
                      CHECKFLATCOPY(newrte->subquery, rte->subquery, Query);
                      MUTATE(newrte->subquery, newrte->subquery, Query *);
                  }
                  break;
              case RTE_JOIN:
                  if (!(flags & QTW_IGNORE_JOINALIASES))
                  {
                      MUTATE(newrte->joinaliasvars, rte->joinaliasvars, List *);
                  }
                  break;
              case RTE_FUNCTION:
                  MUTATE(newrte->funcexpr, rte->funcexpr, Node *);
                  break;
          }
!         FastAppend(&newrt, newrte);
      }
      query->rtable = FastListValue(&newrt);
      return query;

pgsql-bugs by date:

Previous
From: "PostgreSQL Bugs List"
Date:
Subject: BUG #1002: Update using rule on view with inheritance alters 0 rows, 1 row expected.
Next
From: Tom Lane
Date:
Subject: Re: Bug in pg_restore or in postmaster itself?