Обсуждение: ExecuteTruncate quirk: expects a unique list of relations

Поиск
Список
Период
Сортировка

ExecuteTruncate quirk: expects a unique list of relations

От
Nikhils
Дата:
Hi, <br /><br />Consider this simple case:<br /><br />postgres=# TRUNCATE foo, foo; <br />ERROR:  cannot TRUNCATE "foo"
becauseit is being used by active queries in this session <br /><br />The above occurs because the ExecuteTruncate()
functioninvokes truncate_check_rel() in a loop. Since the same table name appears twice, the rd_refcnt for table "foo"
isbumped up to 2, causing the above failure.<br /><br clear="all" />We might want to add a step to ExecuteTruncate(),
orwhatever calls it, to make the list unique.<br /><br />Regards,<br />Nikhils<br />-- <br />EnterpriseDB <a
href="http://www.enterprisedb.com">http://www.enterprisedb.com</a>

Re: ExecuteTruncate quirk: expects a unique list of relations

От
Bruce Momjian
Дата:
Nikhils wrote:
> Hi,
>
> Consider this simple case:
>
> postgres=# TRUNCATE foo, foo;
> ERROR:  cannot TRUNCATE "foo" because it is being used by active queries in
> this session
>
> The above occurs because the ExecuteTruncate() function invokes
> truncate_check_rel() in a loop. Since the same table name appears twice, the
> rd_refcnt for table "foo" is bumped up to 2, causing the above failure.
>
> We might want to add a step to ExecuteTruncate(), or whatever calls it, to
> make the list unique.

Fixed with attached, applied patch.  I didn't see any other cases that
need fixing;  LOCK foo, foo already works fine.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/backend/commands/tablecmds.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v
retrieving revision 1.259
diff -c -c -r1.259 tablecmds.c
*** src/backend/commands/tablecmds.c    19 Jun 2008 00:46:04 -0000    1.259
--- src/backend/commands/tablecmds.c    16 Jul 2008 16:35:28 -0000
***************
*** 762,767 ****
--- 762,770 ----
      ResultRelInfo *resultRelInfo;
      ListCell   *cell;

+     /* make list unique */
+     stmt->relations = list_union(NIL, stmt->relations);
+
      /*
       * Open, exclusive-lock, and check all the explicitly-specified relations
       */