diff --git a/src/backend/columnar/sql/columnar--10.2-2--10.2-3.sql b/src/backend/columnar/sql/columnar--10.2-2--10.2-3.sql index db0d8e785..25e0aade4 100644 --- a/src/backend/columnar/sql/columnar--10.2-2--10.2-3.sql +++ b/src/backend/columnar/sql/columnar--10.2-2--10.2-3.sql @@ -10,6 +10,17 @@ -- -- To do that, drop stripe_first_row_number_idx and create a unique -- constraint with the same name to keep the code change at minimum. +-- +-- If we have a pg_depend entry for this index, we can not drop it as +-- the extension depends on it. Remove the pg_depend entry if it exists. +DELETE FROM pg_depend +WHERE classid = 'pg_am'::regclass::oid + AND objid IN (select oid from pg_am where amname = 'columnar') + AND objsubid = 0 + AND refclassid = 'pg_class'::regclass::oid + AND refobjid = 'columnar.stripe_first_row_number_idx'::regclass::oid + AND refobjsubid = 0 + AND deptype = 'n'; DROP INDEX columnar.stripe_first_row_number_idx; ALTER TABLE columnar.stripe ADD CONSTRAINT stripe_first_row_number_idx UNIQUE (storage_id, first_row_number); diff --git a/src/backend/columnar/sql/downgrades/columnar--10.2-1--10.1-1.sql b/src/backend/columnar/sql/downgrades/columnar--10.2-1--10.1-1.sql index 5438a5dc4..1dc19d296 100644 --- a/src/backend/columnar/sql/downgrades/columnar--10.2-1--10.1-1.sql +++ b/src/backend/columnar/sql/downgrades/columnar--10.2-1--10.1-1.sql @@ -8,5 +8,16 @@ DROP FUNCTION citus_internal.upgrade_columnar_storage(regclass); DROP FUNCTION citus_internal.downgrade_columnar_storage(regclass); -- drop "first_row_number" column and the index defined on it +-- +-- If we have a pg_depend entry for this index, we can not drop it as +-- the extension depends on it. Remove the pg_depend entry if it exists. +DELETE FROM pg_depend +WHERE classid = 'pg_am'::regclass::oid + AND objid IN (select oid from pg_am where amname = 'columnar') + AND objsubid = 0 + AND refclassid = 'pg_class'::regclass::oid + AND refobjid = 'columnar.stripe_first_row_number_idx'::regclass::oid + AND refobjsubid = 0 + AND deptype = 'n'; DROP INDEX columnar.stripe_first_row_number_idx; ALTER TABLE columnar.stripe DROP COLUMN first_row_number; diff --git a/src/backend/columnar/sql/downgrades/columnar--10.2-3--10.2-2.sql b/src/backend/columnar/sql/downgrades/columnar--10.2-3--10.2-2.sql index fc525accd..85162f879 100644 --- a/src/backend/columnar/sql/downgrades/columnar--10.2-3--10.2-2.sql +++ b/src/backend/columnar/sql/downgrades/columnar--10.2-3--10.2-2.sql @@ -1,4 +1,14 @@ -- columnar--10.2-3--10.2-2.sql - +-- +-- If we have a pg_depend entry for this index, we can not drop it as +-- the extension depends on it. Remove the pg_depend entry if it exists. +DELETE FROM pg_depend +WHERE classid = 'pg_am'::regclass::oid + AND objid IN (select oid from pg_am where amname = 'columnar') + AND objsubid = 0 + AND refclassid = 'pg_class'::regclass::oid + AND refobjid = 'columnar.stripe_first_row_number_idx'::regclass::oid + AND refobjsubid = 0 + AND deptype = 'n'; ALTER TABLE columnar.stripe DROP CONSTRAINT stripe_first_row_number_idx; CREATE INDEX stripe_first_row_number_idx ON columnar.stripe USING BTREE(storage_id, first_row_number); diff --git a/src/test/regress/expected/multi_extension.out b/src/test/regress/expected/multi_extension.out index d2ae5a79b..8d92416c6 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -909,6 +909,24 @@ SELECT * FROM multi_extension.print_extension_changes(); | function worker_fix_partition_shard_index_names(regclass,text,text) void (4 rows) +-- There was a bug when downgrading to 10.2-2 from 10.2-4 +-- Test that we do not have any issues with this particular downgrade +ALTER EXTENSION citus UPDATE TO '10.2-2'; +ALTER EXTENSION citus UPDATE TO '10.2-4'; +SELECT * FROM multi_extension.print_extension_changes(); + previous_object | current_object +--------------------------------------------------------------------- +(0 rows) + +-- Test downgrade to 10.2-4 from 10.2-5 +ALTER EXTENSION citus UPDATE TO '10.2-5'; +ALTER EXTENSION citus UPDATE TO '10.2-4'; +-- Should be empty result since upgrade+downgrade should be a no-op +SELECT * FROM multi_extension.print_extension_changes(); + previous_object | current_object +--------------------------------------------------------------------- +(0 rows) + -- Snapshot of state at 10.2-5 ALTER EXTENSION citus UPDATE TO '10.2-5'; SELECT * FROM multi_extension.print_extension_changes(); @@ -916,9 +934,6 @@ SELECT * FROM multi_extension.print_extension_changes(); --------------------------------------------------------------------- (0 rows) --- Test downgrade to 10.2-4 from 10.2-5 -ALTER EXTENSION citus UPDATE TO '10.2-4'; -ALTER EXTENSION citus UPDATE TO '10.2-5'; -- Make sure that we defined dependencies from all rel objects (tables, -- indexes, sequences ..) to columnar table access method ... SELECT pg_class.oid INTO columnar_schema_members diff --git a/src/test/regress/sql/multi_extension.sql b/src/test/regress/sql/multi_extension.sql index 59c67b2b0..e84d51ba7 100644 --- a/src/test/regress/sql/multi_extension.sql +++ b/src/test/regress/sql/multi_extension.sql @@ -400,13 +400,21 @@ SELECT * FROM multi_extension.print_extension_changes(); ALTER EXTENSION citus UPDATE TO '10.2-4'; SELECT * FROM multi_extension.print_extension_changes(); --- Snapshot of state at 10.2-5 -ALTER EXTENSION citus UPDATE TO '10.2-5'; +-- There was a bug when downgrading to 10.2-2 from 10.2-4 +-- Test that we do not have any issues with this particular downgrade +ALTER EXTENSION citus UPDATE TO '10.2-2'; +ALTER EXTENSION citus UPDATE TO '10.2-4'; SELECT * FROM multi_extension.print_extension_changes(); -- Test downgrade to 10.2-4 from 10.2-5 -ALTER EXTENSION citus UPDATE TO '10.2-4'; ALTER EXTENSION citus UPDATE TO '10.2-5'; +ALTER EXTENSION citus UPDATE TO '10.2-4'; +-- Should be empty result since upgrade+downgrade should be a no-op +SELECT * FROM multi_extension.print_extension_changes(); + +-- Snapshot of state at 10.2-5 +ALTER EXTENSION citus UPDATE TO '10.2-5'; +SELECT * FROM multi_extension.print_extension_changes(); -- Make sure that we defined dependencies from all rel objects (tables, -- indexes, sequences ..) to columnar table access method ...