]> granicus.if.org Git - postgresql/commitdiff
In recordExtensionInitPriv(), keep the scan til we're done with it
authorStephen Frost <sfrost@snowman.net>
Sat, 16 Apr 2016 01:57:15 +0000 (21:57 -0400)
committerStephen Frost <sfrost@snowman.net>
Sat, 16 Apr 2016 01:57:15 +0000 (21:57 -0400)
For reasons of sheer brain fade, we (I) was calling systable_endscan()
immediately after systable_getnext() and expecting the tuple returned
by systable_getnext() to still be valid.

That's clearly wrong.  Move the systable_endscan() down below the tuple
usage.

Discovered initially by Pavel Stehule and then also by Alvaro.

Add a regression test based on Alvaro's testing.

src/backend/catalog/aclchk.c
src/test/modules/test_extensions/Makefile
src/test/modules/test_extensions/expected/test_extensions.out
src/test/modules/test_extensions/sql/test_extensions.sql
src/test/modules/test_extensions/test_ext6--1.0.sql [new file with mode: 0644]
src/test/modules/test_extensions/test_ext6.control [new file with mode: 0644]

index 4b49bb67ba06cc71a93bab00048f710773370422..7d656d5c6dec251bf4c92a0e5f593994eb8be7d4 100644 (file)
@@ -5283,8 +5283,6 @@ recordExtensionInitPriv(Oid objoid, Oid classoid, int objsubid, Acl *new_acl)
        /* There should exist only one entry or none. */
        oldtuple = systable_getnext(scan);
 
-       systable_endscan(scan);
-
        /* If we find an entry, update it with the latest ACL. */
        if (HeapTupleIsValid(oldtuple))
        {
@@ -5340,6 +5338,8 @@ recordExtensionInitPriv(Oid objoid, Oid classoid, int objsubid, Acl *new_acl)
                CatalogUpdateIndexes(relation, tuple);
        }
 
+       systable_endscan(scan);
+
        /* prevent error when processing objects multiple times */
        CommandCounterIncrement();
 
index 283233782a045e14a1e0f1abaeb0561aab7c8f3b..8f0eeb7d3c9a551efe42a91d3f127143b967b41e 100644 (file)
@@ -3,11 +3,11 @@
 MODULE = test_extensions
 PGFILEDESC = "test_extensions - regression testing for EXTENSION support"
 
-EXTENSION = test_ext1 test_ext2 test_ext3 test_ext4 test_ext5 \
+EXTENSION = test_ext1 test_ext2 test_ext3 test_ext4 test_ext5 test_ext6 \
                        test_ext_cyclic1 test_ext_cyclic2
 DATA = test_ext1--1.0.sql test_ext2--1.0.sql test_ext3--1.0.sql \
-          test_ext4--1.0.sql test_ext5--1.0.sql test_ext_cyclic1--1.0.sql \
-          test_ext_cyclic2--1.0.sql
+          test_ext4--1.0.sql test_ext5--1.0.sql test_ext6--1.0.sql \
+          test_ext_cyclic1--1.0.sql test_ext_cyclic2--1.0.sql
 
 REGRESS = test_extensions test_extdepend
 
index a57bb4b7ff014c90e4f041380b6c2d060e78d3ec..105f53fb742ed2da8ae1dcee988e1eefb0232442 100644 (file)
@@ -35,3 +35,6 @@ drop cascades to extension test_ext5
 drop cascades to extension test_ext2
 drop cascades to extension test_ext4
 drop cascades to extension test_ext1
+CREATE EXTENSION test_ext6;
+DROP EXTENSION test_ext6;
+CREATE EXTENSION test_ext6;
index 9076c02807cfe11dda6553fcfd34b4bcbac4705d..2ab8b599dc29587b280dd59d13d98c982327b3bc 100644 (file)
@@ -13,3 +13,7 @@ SELECT extname, nspname, extversion, extrelocatable FROM pg_extension e, pg_name
 CREATE EXTENSION test_ext_cyclic1 CASCADE;
 
 DROP SCHEMA test_ext CASCADE;
+
+CREATE EXTENSION test_ext6;
+DROP EXTENSION test_ext6;
+CREATE EXTENSION test_ext6;
diff --git a/src/test/modules/test_extensions/test_ext6--1.0.sql b/src/test/modules/test_extensions/test_ext6--1.0.sql
new file mode 100644 (file)
index 0000000..65a4fc5
--- /dev/null
@@ -0,0 +1 @@
+grant usage on schema @extschema@ to public;
diff --git a/src/test/modules/test_extensions/test_ext6.control b/src/test/modules/test_extensions/test_ext6.control
new file mode 100644 (file)
index 0000000..04b2146
--- /dev/null
@@ -0,0 +1,5 @@
+comment = 'test_ext6'
+default_version = '1.0'
+relocatable = false
+superuser = true
+schema = 'test_ext6'