Search Postgresql Archives

[no subject]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I came across an interesting feature regarding namespace name changes.  To illustrate suppose you have two
connections open whose commands occur in the following sequence:

Time | Session A                                        | Session B
-----+--------------------------------------------------+-----------------------------------------------
1   | CREATE SCHEMA my_schema;                         |
2   | CREATE TABLE my_schema.my_table (my_column int); |
3   | BEGIN;                                           |
4   | INSERT INTO my_schema.my_table VALUES (1);       |
5   |                                                  | BEGIN;
6   |                                                  | ALTER SCHEMA my_schema RENAME TO your_schema;
7   |                                                  | COMMIT;
8   | SELECT my_column FROM my_schema.my_table;        |

If this is attempted, then session A results in the following error after the command issued at time "8":
ERROR:  schema "my_schema" does not exist

This feature occurs when the isolation level is either READ COMMITED or SERIALIZABLE.  If you instead were to
attempt a table rename in session B, then session B would appropriately hang waiting for an ACCESS EXCLUSIVE
lock.

My humble opinion (as a non-PostgreSQL developer) is that renaming the schema in an implied rename of the
table
from my_schema.my_table to your_schema.my_table.  Therefore it should also obtain a lock of some type.

As a result, all of my server side functions begin with something along the lines of:
   SELECT oid FROM pg_catalog.pg_namespaces
   WHERE nspname = 'my_schema' FOR UPDATE;
I do this for every schema which the function consults through the SPI manager.  Also, AFAIK, to be very
careful (paranoid) would require this tedious approach for every transaction.

I attempted to get around this issue by adding various entries to pg_rewrite to try to force a select
statement
on pg_namespace to be rewritten as a SELECT ... FOR UPDATE.  This failed.  I have not tried to patch the
source, though I imagine it would not be difficult.

Any opinions on approaches to this issue or the correctness of the current behavior of PostgreSQL are greatly
appreciated.

Thanks,
Jeff Greco 

---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faqs/FAQ.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux