Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
amcheck: Sanitize metapage's allequalimage field.
authorPeter Geoghegan <pg@bowt.ie>
Thu, 6 Aug 2020 22:25:47 +0000 (15:25 -0700)
committerPeter Geoghegan <pg@bowt.ie>
Thu, 6 Aug 2020 22:25:47 +0000 (15:25 -0700)
This will be helpful if it ever proves necessary to revoke an opclass's
support for deduplication.

Backpatch: 13-, where nbtree deduplication was introduced.

contrib/amcheck/verify_nbtree.c

index e4d501a85d1f9daa7e47853853597618b086afc4..060600a556a20b190e2031e9d66d69f78b80a7f7 100644 (file)
@@ -305,8 +305,20 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed,
                     errmsg("index \"%s\" lacks a main relation fork",
                            RelationGetRelationName(indrel))));
 
-       /* Check index, possibly against table it is an index on */
+       /* Extract metadata from metapage, and sanitize it in passing */
        _bt_metaversion(indrel, &heapkeyspace, &allequalimage);
+       if (allequalimage && !heapkeyspace)
+           ereport(ERROR,
+                   (errcode(ERRCODE_INDEX_CORRUPTED),
+                    errmsg("index \"%s\" metapage has equalimage field set on unsupported nbtree version",
+                           RelationGetRelationName(indrel))));
+       if (allequalimage && !_bt_allequalimage(indrel, false))
+           ereport(ERROR,
+                   (errcode(ERRCODE_INDEX_CORRUPTED),
+                    errmsg("index \"%s\" metapage incorrectly indicates that deduplication is safe",
+                           RelationGetRelationName(indrel))));
+
+       /* Check index, possibly against table it is an index on */
        bt_check_every_level(indrel, heaprel, heapkeyspace, parentcheck,
                             heapallindexed, rootdescend);
    }