aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/indexcmds.c18
-rw-r--r--src/test/regress/expected/create_table.out22
-rw-r--r--src/test/regress/sql/create_table.sql6
3 files changed, 44 insertions, 2 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 1c1d0da448d..99acd4a6a2c 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -1685,14 +1685,28 @@ ReindexIndex(RangeVar *indexRelation)
{
Oid indOid;
Oid heapOid = InvalidOid;
+ Relation irel;
+ char persistence;
- /* lock level used here should match index lock reindex_index() */
+ /*
+ * Find and lock index, and check permissions on table; use callback to
+ * obtain lock on table first, to avoid deadlock hazard. The lock level
+ * used here must match the index lock obtained in reindex_index().
+ */
indOid = RangeVarGetRelidExtended(indexRelation, AccessExclusiveLock,
false, false,
RangeVarCallbackForReindexIndex,
(void *) &heapOid);
- reindex_index(indOid, false, indexRelation->relpersistence);
+ /*
+ * Obtain the current persistence of the existing index. We already hold
+ * lock on the index.
+ */
+ irel = index_open(indOid, NoLock);
+ persistence = irel->rd_rel->relpersistence;
+ index_close(irel, NoLock);
+
+ reindex_index(indOid, false, persistence);
return indOid;
}
diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out
index 34b5fc113d0..8ba7bbc1113 100644
--- a/src/test/regress/expected/create_table.out
+++ b/src/test/regress/expected/create_table.out
@@ -208,6 +208,28 @@ CREATE TABLE IF NOT EXISTS test_tsvector(
);
NOTICE: relation "test_tsvector" already exists, skipping
CREATE UNLOGGED TABLE unlogged1 (a int primary key); -- OK
+CREATE TEMPORARY TABLE unlogged2 (a int primary key); -- OK
+SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged\d' ORDER BY relname;
+ relname | relkind | relpersistence
+----------------+---------+----------------
+ unlogged1 | r | u
+ unlogged1_pkey | i | u
+ unlogged2 | r | t
+ unlogged2_pkey | i | t
+(4 rows)
+
+REINDEX INDEX unlogged1_pkey;
+REINDEX INDEX unlogged2_pkey;
+SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged\d' ORDER BY relname;
+ relname | relkind | relpersistence
+----------------+---------+----------------
+ unlogged1 | r | u
+ unlogged1_pkey | i | u
+ unlogged2 | r | t
+ unlogged2_pkey | i | t
+(4 rows)
+
+DROP TABLE unlogged2;
INSERT INTO unlogged1 VALUES (42);
CREATE UNLOGGED TABLE public.unlogged2 (a int primary key); -- also OK
CREATE UNLOGGED TABLE pg_temp.unlogged3 (a int primary key); -- not OK
diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql
index 08029a99b0a..03bb5ff704e 100644
--- a/src/test/regress/sql/create_table.sql
+++ b/src/test/regress/sql/create_table.sql
@@ -246,6 +246,12 @@ CREATE TABLE IF NOT EXISTS test_tsvector(
);
CREATE UNLOGGED TABLE unlogged1 (a int primary key); -- OK
+CREATE TEMPORARY TABLE unlogged2 (a int primary key); -- OK
+SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged\d' ORDER BY relname;
+REINDEX INDEX unlogged1_pkey;
+REINDEX INDEX unlogged2_pkey;
+SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged\d' ORDER BY relname;
+DROP TABLE unlogged2;
INSERT INTO unlogged1 VALUES (42);
CREATE UNLOGGED TABLE public.unlogged2 (a int primary key); -- also OK
CREATE UNLOGGED TABLE pg_temp.unlogged3 (a int primary key); -- not OK