From 0efd6f78299131261f64bc2ba1c9429854fedcca Mon Sep 17 00:00:00 2001 From: Hanefi Onaldi Date: Wed, 28 Sep 2022 18:11:30 +0300 Subject: [PATCH 1/3] Fix tests for missing downgrades --- src/test/regress/expected/multi_extension.out | 12 +++++++++--- src/test/regress/sql/multi_extension.sql | 10 ++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/test/regress/expected/multi_extension.out b/src/test/regress/expected/multi_extension.out index d2ae5a79b..c15e44b92 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -909,6 +909,15 @@ SELECT * FROM multi_extension.print_extension_changes(); | function worker_fix_partition_shard_index_names(regclass,text,text) void (4 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 +925,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..1f9459d6d 100644 --- a/src/test/regress/sql/multi_extension.sql +++ b/src/test/regress/sql/multi_extension.sql @@ -400,14 +400,16 @@ SELECT * FROM multi_extension.print_extension_changes(); 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-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(); --- 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 From 5ddd4754a2fcad425e187c4b16da63b3c0622ce2 Mon Sep 17 00:00:00 2001 From: Hanefi Onaldi Date: Wed, 28 Sep 2022 18:52:24 +0300 Subject: [PATCH 2/3] Document failing downgrades from 10.2-4 to 10.2-2 --- src/test/regress/expected/multi_extension.out | 13 +++++++++++++ src/test/regress/sql/multi_extension.sql | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/src/test/regress/expected/multi_extension.out b/src/test/regress/expected/multi_extension.out index c15e44b92..32c2cfe8d 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -909,6 +909,19 @@ 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'; +ERROR: cannot drop constraint stripe_first_row_number_idx on table columnar.stripe because other objects depend on it +DETAIL: access method columnar depends on index columnar.stripe_first_row_number_idx +HINT: Use DROP ... CASCADE to drop the dependent objects too. +ALTER EXTENSION citus UPDATE TO '10.2-4'; +NOTICE: version "10.2-4" of extension "citus" is already installed +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'; diff --git a/src/test/regress/sql/multi_extension.sql b/src/test/regress/sql/multi_extension.sql index 1f9459d6d..e84d51ba7 100644 --- a/src/test/regress/sql/multi_extension.sql +++ b/src/test/regress/sql/multi_extension.sql @@ -400,6 +400,12 @@ SELECT * FROM multi_extension.print_extension_changes(); ALTER EXTENSION citus UPDATE TO '10.2-4'; SELECT * FROM multi_extension.print_extension_changes(); +-- 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-5'; ALTER EXTENSION citus UPDATE TO '10.2-4'; From 11a9a3771fcab97447a6e910aaae27d19e92f5ce Mon Sep 17 00:00:00 2001 From: Hanefi Onaldi Date: Wed, 28 Sep 2022 18:22:53 +0300 Subject: [PATCH 3/3] Ensure no dependencies to index before drop --- .../columnar/sql/columnar--10.2-2--10.2-3.sql | 11 +++++++++++ .../sql/downgrades/columnar--10.2-1--10.1-1.sql | 11 +++++++++++ .../sql/downgrades/columnar--10.2-3--10.2-2.sql | 12 +++++++++++- src/test/regress/expected/multi_extension.out | 4 ---- 4 files changed, 33 insertions(+), 5 deletions(-) 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 32c2cfe8d..8d92416c6 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -912,11 +912,7 @@ SELECT * FROM multi_extension.print_extension_changes(); -- 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'; -ERROR: cannot drop constraint stripe_first_row_number_idx on table columnar.stripe because other objects depend on it -DETAIL: access method columnar depends on index columnar.stripe_first_row_number_idx -HINT: Use DROP ... CASCADE to drop the dependent objects too. ALTER EXTENSION citus UPDATE TO '10.2-4'; -NOTICE: version "10.2-4" of extension "citus" is already installed SELECT * FROM multi_extension.print_extension_changes(); previous_object | current_object ---------------------------------------------------------------------