]> granicus.if.org Git - postgresql/commitdiff
Restore REINDEX constraint validation.
authorNoah Misch <noah@leadboat.com>
Tue, 30 Jul 2013 22:36:52 +0000 (18:36 -0400)
committerNoah Misch <noah@leadboat.com>
Tue, 30 Jul 2013 23:41:53 +0000 (19:41 -0400)
Refactoring as part of commit 8ceb24568054232696dddc1166a8563bc78c900a
had the unintended effect of making REINDEX TABLE and REINDEX DATABASE
no longer validate constraints enforced by the indexes in question;
REINDEX INDEX still did so.  Indexes marked invalid remained so, and
constraint violations arising from data corruption went undetected.
Back-patch to 9.0, like the causative commit.

src/backend/commands/indexcmds.c
src/test/regress/expected/create_index.out
src/test/regress/sql/create_index.sql

index 34153f5eb9afe85cbdd378b654314508c6ceac80..ab73567ad2a152a612b324f0ad198b3b6f0bb204 100644 (file)
@@ -1553,7 +1553,9 @@ ReindexTable(RangeVar *relation)
 
        ReleaseSysCache(tuple);
 
-       if (!reindex_relation(heapOid, REINDEX_REL_PROCESS_TOAST))
+       if (!reindex_relation(heapOid,
+                                                 REINDEX_REL_PROCESS_TOAST |
+                                                 REINDEX_REL_CHECK_CONSTRAINTS))
                ereport(NOTICE,
                                (errmsg("table \"%s\" has no indexes",
                                                relation->relname)));
@@ -1666,7 +1668,9 @@ ReindexDatabase(const char *databaseName, bool do_system, bool do_user)
                StartTransactionCommand();
                /* functions in indexes may want a snapshot set */
                PushActiveSnapshot(GetTransactionSnapshot());
-               if (reindex_relation(relid, REINDEX_REL_PROCESS_TOAST))
+               if (reindex_relation(relid,
+                                                        REINDEX_REL_PROCESS_TOAST |
+                                                        REINDEX_REL_CHECK_CONSTRAINTS))
                        ereport(NOTICE,
                                        (errmsg("table \"%s.%s\" was reindexed",
                                                        get_namespace_name(get_rel_namespace(relid)),
index b23c712204e2052005db2a8f8da88d81e0baf340..7113ba30ce11f8bf0fb40b639ce95c21307dd71f 100644 (file)
@@ -1190,9 +1190,13 @@ COMMIT;
 BEGIN;
 CREATE INDEX std_index on concur_heap(f2);
 COMMIT;
--- check to make sure that the failed indexes were cleaned up properly and the
--- successful indexes are created properly. Notably that they do NOT have the
--- "invalid" flag set.
+-- Failed builds are left invalid by VACUUM FULL, fixed by REINDEX
+VACUUM FULL concur_heap;
+REINDEX TABLE concur_heap;
+ERROR:  could not create unique index "concur_index3"
+DETAIL:  Key (f2)=(b) is duplicated.
+DELETE FROM concur_heap WHERE f1 = 'b';
+VACUUM FULL concur_heap;
 \d concur_heap
 Table "public.concur_heap"
  Column | Type | Modifiers 
@@ -1208,6 +1212,22 @@ Indexes:
     "concur_index5" btree (f2) WHERE f1 = 'x'::text
     "std_index" btree (f2)
 
+REINDEX TABLE concur_heap;
+\d concur_heap
+Table "public.concur_heap"
+ Column | Type | Modifiers 
+--------+------+-----------
+ f1     | text | 
+ f2     | text | 
+Indexes:
+    "concur_index2" UNIQUE, btree (f1)
+    "concur_index3" UNIQUE, btree (f2)
+    "concur_heap_expr_idx" btree ((f2 || f1))
+    "concur_index1" btree (f2, f1)
+    "concur_index4" btree (f2) WHERE f1 = 'a'::text
+    "concur_index5" btree (f2) WHERE f1 = 'x'::text
+    "std_index" btree (f2)
+
 DROP TABLE concur_heap;
 --
 -- Test ADD CONSTRAINT USING INDEX
index bf27379f5918e112da8546b2b9472b131ef5cd31..29c8bef8a69e7f622d919fbcd71f066096549a43 100644 (file)
@@ -401,10 +401,13 @@ BEGIN;
 CREATE INDEX std_index on concur_heap(f2);
 COMMIT;
 
--- check to make sure that the failed indexes were cleaned up properly and the
--- successful indexes are created properly. Notably that they do NOT have the
--- "invalid" flag set.
-
+-- Failed builds are left invalid by VACUUM FULL, fixed by REINDEX
+VACUUM FULL concur_heap;
+REINDEX TABLE concur_heap;
+DELETE FROM concur_heap WHERE f1 = 'b';
+VACUUM FULL concur_heap;
+\d concur_heap
+REINDEX TABLE concur_heap;
 \d concur_heap
 
 DROP TABLE concur_heap;