diff --git a/src/backend/distributed/commands/extension.c b/src/backend/distributed/commands/extension.c index b3e82ac11..567bc7021 100644 --- a/src/backend/distributed/commands/extension.c +++ b/src/backend/distributed/commands/extension.c @@ -1013,6 +1013,19 @@ CreateExtensionWithVersion(char *extname, char *extVersion) } +/* + * GetExtensionVersionNumber convert extension version to real value + */ +double +GetExtensionVersionNumber(char *extVersion) +{ + char *strtokPosition = NULL; + char *versionVal = strtok_r(extVersion, "-", &strtokPosition); + double versionNumber = strtod(versionVal, NULL); + return versionNumber; +} + + /* * AlterExtensionUpdateStmt builds and execute Alter extension statements * per given extension name and updates extension verision diff --git a/src/backend/distributed/commands/utility_hook.c b/src/backend/distributed/commands/utility_hook.c index 3086a7c31..39caf0b04 100644 --- a/src/backend/distributed/commands/utility_hook.c +++ b/src/backend/distributed/commands/utility_hook.c @@ -211,13 +211,13 @@ multi_ProcessUtility(PlannedStmt *pstmt, if (newVersionValue) { - const char *newVersion = defGetString(newVersionValue); - const char schemaVersionSeparator = '-'; - char *leftSeperatorPosition = strchr(newVersion, schemaVersionSeparator); - versionNumber = strtod(leftSeperatorPosition, NULL); + const char *newVersion = strdup(defGetString(newVersionValue)); + char *strtokPosition = NULL; + char *versionVal = strtok_r(newVersion, "-", &strtokPosition); + versionNumber = strtod(versionVal, NULL); } - if (versionNumber >= 11.1) + if (versionNumber * 100 >= 1110.0) { if (get_extension_oid("citus_columnar", true) == InvalidOid) { @@ -655,19 +655,21 @@ ProcessUtilityInternal(PlannedStmt *pstmt, ((AlterExtensionStmt *) parsetree)->options, "new_version"); Oid citusExtensionOid = get_extension_oid("citus", true); char *curExtensionVersion = get_extension_version(citusExtensionOid); + double curExtensionNumber = GetExtensionVersionNumber(strdup( + curExtensionVersion)); Oid citusColumnarOid = get_extension_oid("citus_columnar", true); if (newVersionValue) { - const char *newVersion = defGetString(newVersionValue); + char *newVersion = defGetString(newVersionValue); + double newVersionNumber = GetExtensionVersionNumber(strdup(newVersion)); - /*alter extension citus update to 11.1-1, and no citus_columnar installed */ - if (strcmp(newVersion, "11.1-1") == 0 && citusColumnarOid == InvalidOid) + /*alter extension citus update to version >= 11.1-1, and no citus_columnar installed */ + if (newVersionNumber * 100 >= 1110 && citusColumnarOid == InvalidOid) { - /*it's upgrade citus to 11.1-1 */ + /*it's upgrade citus to version later or equal to 11.1-1 */ CreateExtensionWithVersion("citus_columnar", "11.1-0"); } - else if (strcmp(curExtensionVersion, "11.1-1") == 0 && citusColumnarOid != - InvalidOid) + else if (newVersionNumber * 100 < 1110 && citusColumnarOid != InvalidOid) { /*downgrade citus_columnar to Y */ AlterExtensionUpdateStmt("citus_columnar", "11.1-0"); @@ -676,7 +678,7 @@ ProcessUtilityInternal(PlannedStmt *pstmt, else { double versionNumber = strtod(CITUS_MAJORVERSION, NULL); - if (versionNumber >= 11.1) + if (versionNumber * 100 >= 1110) { if (citusColumnarOid == InvalidOid) { @@ -696,8 +698,9 @@ ProcessUtilityInternal(PlannedStmt *pstmt, Oid citusColumnarOid = get_extension_oid("citus_columnar", true); if (newVersionValue) { - const char *newVersion = defGetString(newVersionValue); - if (strcmp(newVersion, "11.1-1") == 0 && citusColumnarOid != InvalidOid) + char *newVersion = defGetString(newVersionValue); + double newVersionNumber = GetExtensionVersionNumber(strdup(newVersion)); + if (newVersionNumber * 100 >= 1110 && citusColumnarOid != InvalidOid) { /*after "ALTER EXTENSION citus" updates citus_columnar Y to version Z. */ char *curColumnarVersion = get_extension_version(citusColumnarOid); @@ -706,8 +709,7 @@ ProcessUtilityInternal(PlannedStmt *pstmt, AlterExtensionUpdateStmt("citus_columnar", "11.1-1"); } } - else if (strcmp(newVersion, "11.0-2") == 0 && citusColumnarOid != - InvalidOid) + else if (newVersionNumber * 100 < 1110 && citusColumnarOid != InvalidOid) { /*after "ALTER EXTENSION citus" drops citus_columnar extension */ char *curColumnarVersion = get_extension_version(citusColumnarOid); @@ -720,7 +722,7 @@ ProcessUtilityInternal(PlannedStmt *pstmt, else { double versionNumber = strtod(CITUS_MAJORVERSION, NULL); - if (versionNumber >= 11.1) + if (versionNumber * 100 >= 1110) { char *curColumnarVersion = get_extension_version(citusColumnarOid); if (strcmp(curColumnarVersion, "11.1-0") == 0) diff --git a/src/backend/distributed/sql/citus--10.0-1--10.0-2.sql b/src/backend/distributed/sql/citus--10.0-1--10.0-2.sql index a72e2edee..e3e8f3b77 100644 --- a/src/backend/distributed/sql/citus--10.0-1--10.0-2.sql +++ b/src/backend/distributed/sql/citus--10.0-1--10.0-2.sql @@ -1,12 +1,18 @@ -- citus--10.0-1--10.0-2 --#include "../../columnar/sql/columnar--10.0-1--10.0-2.sql" +DO $$ begin raise log '%', 'begin 10.0-1--10.0-2'; end; $$; DO $check_columnar$ BEGIN - IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN + IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e + INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid) + INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid) + WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler' + ) THEN #include "../../columnar/sql/columnar--10.0-1--10.0-2.sql" END IF; END; $check_columnar$; GRANT SELECT ON public.citus_tables TO public; +DO $$ begin raise log '%', ' 10.0-1--10.0-2'; end; $$; diff --git a/src/backend/distributed/sql/citus--10.0-4--10.1-1.sql b/src/backend/distributed/sql/citus--10.0-4--10.1-1.sql index f3e559d07..5dc8ca268 100644 --- a/src/backend/distributed/sql/citus--10.0-4--10.1-1.sql +++ b/src/backend/distributed/sql/citus--10.0-4--10.1-1.sql @@ -3,6 +3,7 @@ -- add the current database to the distributed objects if not already in there. -- this is to reliably propagate some of the alter database commands that might be -- supported. + INSERT INTO citus.pg_dist_object SELECT 'pg_catalog.pg_database'::regclass::oid AS oid, (SELECT oid FROM pg_database WHERE datname = current_database()) as objid, @@ -12,7 +13,11 @@ ON CONFLICT DO NOTHING; --#include "../../columnar/sql/columnar--10.0-3--10.1-1.sql" DO $check_columnar$ BEGIN - IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN + IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e + INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid) + INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid) + WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler' + ) THEN #include "../../columnar/sql/columnar--10.0-3--10.1-1.sql" END IF; END; @@ -55,4 +60,5 @@ WHERE repmodel = 'c' DROP TRIGGER pg_dist_rebalance_strategy_enterprise_check_trigger ON pg_catalog.pg_dist_rebalance_strategy; DROP FUNCTION citus_internal.pg_dist_rebalance_strategy_enterprise_check(); +DO $$ begin raise log '%', '10.0-4--10.1-1'; end; $$; #include "udfs/citus_cleanup_orphaned_shards/10.1-1.sql" diff --git a/src/backend/distributed/sql/citus--10.1-1--10.2-1.sql b/src/backend/distributed/sql/citus--10.1-1--10.2-1.sql index b6dc93385..97676e005 100644 --- a/src/backend/distributed/sql/citus--10.1-1--10.2-1.sql +++ b/src/backend/distributed/sql/citus--10.1-1--10.2-1.sql @@ -12,7 +12,11 @@ ALTER TABLE pg_catalog.pg_dist_placement ADD CONSTRAINT placement_shardid_groupi --#include "../../columnar/sql/columnar--10.1-1--10.2-1.sql" DO $check_columnar$ BEGIN - IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN + IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e + INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid) + INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid) + WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler' + ) THEN #include "../../columnar/sql/columnar--10.1-1--10.2-1.sql" END IF; END; @@ -29,6 +33,8 @@ $check_columnar$; #include "udfs/get_missing_time_partition_ranges/10.2-1.sql" #include "udfs/worker_nextval/10.2-1.sql" +DO $$ begin raise log '%', 'begin 10.1-1--10.2-1'; end; $$; + DROP FUNCTION pg_catalog.citus_drop_all_shards(regclass, text, text); CREATE FUNCTION pg_catalog.citus_drop_all_shards(logicalrelid regclass, schema_name text, @@ -42,3 +48,4 @@ COMMENT ON FUNCTION pg_catalog.citus_drop_all_shards(regclass, text, text, boole #include "udfs/citus_drop_trigger/10.2-1.sql"; #include "udfs/citus_prepare_pg_upgrade/10.2-1.sql" #include "udfs/citus_finish_pg_upgrade/10.2-1.sql" +DO $$ begin raise log '%', '10.1-1--10.2-1'; end; $$; diff --git a/src/backend/distributed/sql/citus--10.2-1--10.2-2.sql b/src/backend/distributed/sql/citus--10.2-1--10.2-2.sql index 8245eecce..c7b99154a 100644 --- a/src/backend/distributed/sql/citus--10.2-1--10.2-2.sql +++ b/src/backend/distributed/sql/citus--10.2-1--10.2-2.sql @@ -3,10 +3,16 @@ -- bump version to 10.2-2 --#include "../../columnar/sql/columnar--10.2-1--10.2-2.sql" +DO $$ begin raise log '%', 'begin 10.2-1--10.2-2'; end; $$; DO $check_columnar$ BEGIN - IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN + IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e + INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid) + INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid) + WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler' + ) THEN #include "../../columnar/sql/columnar--10.2-1--10.2-2.sql" END IF; END; $check_columnar$; +DO $$ begin raise log '%', '10.2-1--10.2-2'; end; $$; diff --git a/src/backend/distributed/sql/citus--10.2-2--10.2-3.sql b/src/backend/distributed/sql/citus--10.2-2--10.2-3.sql index fc01c1fc3..66316eaf0 100644 --- a/src/backend/distributed/sql/citus--10.2-2--10.2-3.sql +++ b/src/backend/distributed/sql/citus--10.2-2--10.2-3.sql @@ -5,7 +5,11 @@ --#include "../../columnar/sql/columnar--10.2-2--10.2-3.sql" DO $check_columnar$ BEGIN - IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN + IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e + INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid) + INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid) + WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler' + ) THEN #include "../../columnar/sql/columnar--10.2-2--10.2-3.sql" END IF; END; diff --git a/src/backend/distributed/sql/citus--10.2-3--10.2-4.sql b/src/backend/distributed/sql/citus--10.2-3--10.2-4.sql index 19f74b09d..2d40dd219 100644 --- a/src/backend/distributed/sql/citus--10.2-3--10.2-4.sql +++ b/src/backend/distributed/sql/citus--10.2-3--10.2-4.sql @@ -3,11 +3,16 @@ -- bump version to 10.2-4 --#include "../../columnar/sql/columnar--10.2-3--10.2-4.sql" +DO $$ begin raise log '%', 'begin 10.2-3--10.2-4'; end; $$; DO $check_columnar$ BEGIN - IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN - #include "../../columnar/sql/columnar--10.2-3--10.2-4.sql" - END IF; +IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e + INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid) + INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid) + WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler' + ) THEN + #include "../../columnar/sql/columnar--10.2-3--10.2-4.sql" +END IF; END; $check_columnar$; @@ -15,3 +20,4 @@ $check_columnar$; #include "udfs/fix_all_partition_shard_index_names/10.2-4.sql" #include "udfs/worker_fix_partition_shard_index_names/10.2-4.sql" #include "udfs/citus_finish_pg_upgrade/10.2-4.sql" +DO $$ begin raise log '%', '10.2-3--10.2-4'; end; $$; diff --git a/src/backend/distributed/sql/citus--9.5-1--10.0-4.sql b/src/backend/distributed/sql/citus--9.5-1--10.0-4.sql index 751665b7c..a25f2c8d2 100644 --- a/src/backend/distributed/sql/citus--9.5-1--10.0-4.sql +++ b/src/backend/distributed/sql/citus--9.5-1--10.0-4.sql @@ -6,7 +6,7 @@ -- cat citus--9.5-1--10.0-1.sql citus--10.0-1--10.0-2.sql citus--10.0-2--10.0-3.sql > citus--9.5-1--10.0-4.sql -- copy of citus--9.5-1--10.0-1 - +DO $$ begin raise log '%', 'begin 9.5-1--10.0-4'; end; $$; DROP FUNCTION pg_catalog.upgrade_to_reference_table(regclass); DROP FUNCTION IF EXISTS pg_catalog.citus_total_relation_size(regclass); @@ -38,9 +38,13 @@ DROP FUNCTION IF EXISTS pg_catalog.citus_total_relation_size(regclass); --#include "../../columnar/sql/columnar--9.5-1--10.0-1.sql" DO $check_columnar$ BEGIN - IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN - #include "../../columnar/sql/columnar--9.5-1--10.0-1.sql" - END IF; +IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e + INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid) + INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid) + WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler' + ) THEN +#include "../../columnar/sql/columnar--9.5-1--10.0-1.sql" +END IF; END; $check_columnar$; @@ -179,7 +183,19 @@ GRANT SELECT ON pg_catalog.citus_worker_stat_activity TO PUBLIC; -- copy of citus--10.0-1--10.0-2 +--#include "../../columnar/sql/columnar--10.0-1--10.0-2.sql" +DO $check_columnar$ +BEGIN +IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e + INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid) + INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid) + WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler' + ) THEN #include "../../columnar/sql/columnar--10.0-1--10.0-2.sql" +END IF; +END; +$check_columnar$; + -- copy of citus--10.0-2--10.0-3 @@ -222,3 +238,4 @@ COMMENT ON FUNCTION pg_catalog.citus_get_active_worker_nodes() RESET search_path; +DO $$ begin raise log '%', ' 9.5-1--10.0-4'; end; $$; diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index 1e6f3d588..b612221aa 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -207,6 +207,7 @@ extern ObjectAddress AlterExtensionUpdateStmtObjectAddress(Node *stmt, bool missing_ok); extern void CreateExtensionWithVersion(char *extname, char *extVersion); extern void AlterExtensionUpdateStmt(char *extname, char *extVersion); +extern double GetExtensionVersionNumber(char *extVersion); /* foreign_constraint.c - forward declarations */ extern bool ConstraintIsAForeignKeyToReferenceTable(char *constraintName, diff --git a/src/test/regress/expected/multi_extension.out b/src/test/regress/expected/multi_extension.out index b5b99b9f6..3ff6f2350 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -103,6 +103,7 @@ ORDER BY 1, 2; -- DROP EXTENSION pre-created by the regression suite DROP EXTENSION citus; +DROP EXTENSION citus_columnar; \c -- these tests switch between citus versions and call ddl's that require pg_dist_object to be created SET citus.enable_metadata_sync TO 'false'; @@ -1052,8 +1053,14 @@ SELECT * FROM multi_extension.print_extension_changes(); -- Snapshot of state at 11.1-1 ALTER EXTENSION citus UPDATE TO '11.1-1'; SELECT * FROM multi_extension.print_extension_changes(); - previous_object | current_object + previous_object | current_object --------------------------------------------------------------------- + access method columnar | + function alter_columnar_table_reset(regclass,boolean,boolean,boolean,boolean) void | + function alter_columnar_table_set(regclass,integer,integer,name,integer) void | + function citus_internal.columnar_ensure_am_depends_catalog() void | + function citus_internal.downgrade_columnar_storage(regclass) void | + function citus_internal.upgrade_columnar_storage(regclass) void | function columnar.columnar_handler(internal) table_am_handler | function worker_cleanup_job_schema_cache() void | function worker_create_schema(bigint,text) void | @@ -1063,25 +1070,13 @@ SELECT * FROM multi_extension.print_extension_changes(); function worker_merge_files_into_table(bigint,integer,text[],text[]) void | function worker_range_partition_table(bigint,integer,text,text,oid,anyarray) void | function worker_repartition_cleanup(bigint) void | + schema columnar | sequence columnar.storageid_seq | table columnar.chunk | table columnar.chunk_group | table columnar.options | table columnar.stripe | - | function columnar.get_storage_id(regclass) bigint - | function columnar_internal.columnar_handler(internal) table_am_handler - | schema columnar_internal - | sequence columnar_internal.storageid_seq - | table columnar_internal.chunk - | table columnar_internal.chunk_group - | table columnar_internal.options - | table columnar_internal.stripe - | view columnar.chunk - | view columnar.chunk_group - | view columnar.options - | view columnar.storage - | view columnar.stripe -(27 rows) +(21 rows) -- Test downgrade script (result should be empty) ALTER EXTENSION citus UPDATE TO '11.0-2'; @@ -1118,6 +1113,7 @@ ORDER BY 1, 2; RESET citus.enable_version_checks; RESET columnar.enable_version_checks; DROP EXTENSION citus; +DROP EXTENSION citus_columnar; CREATE EXTENSION citus VERSION '8.0-1'; ERROR: specified version incompatible with loaded Citus library DETAIL: Loaded library requires 11.1, but 8.0-1 was specified. @@ -1194,11 +1190,13 @@ NOTICE: version "9.1-1" of extension "citus" is already installed ALTER EXTENSION citus UPDATE; -- re-create in newest version DROP EXTENSION citus; +DROP EXTENSION citus_columnar; \c CREATE EXTENSION citus; -- test cache invalidation in workers \c - - - :worker_1_port DROP EXTENSION citus; +DROP EXTENSION citus_columnar; SET citus.enable_version_checks TO 'false'; SET columnar.enable_version_checks TO 'false'; CREATE EXTENSION citus VERSION '8.0-1'; diff --git a/src/test/regress/sql/multi_extension.sql b/src/test/regress/sql/multi_extension.sql index 1366f4fb4..0cab58944 100644 --- a/src/test/regress/sql/multi_extension.sql +++ b/src/test/regress/sql/multi_extension.sql @@ -98,6 +98,7 @@ ORDER BY 1, 2; -- DROP EXTENSION pre-created by the regression suite DROP EXTENSION citus; +DROP EXTENSION citus_columnar; \c -- these tests switch between citus versions and call ddl's that require pg_dist_object to be created @@ -497,6 +498,7 @@ ORDER BY 1, 2; RESET citus.enable_version_checks; RESET columnar.enable_version_checks; DROP EXTENSION citus; +DROP EXTENSION citus_columnar; CREATE EXTENSION citus VERSION '8.0-1'; -- Test non-distributed queries work even in version mismatch @@ -561,6 +563,7 @@ ALTER EXTENSION citus UPDATE; -- re-create in newest version DROP EXTENSION citus; +DROP EXTENSION citus_columnar; \c CREATE EXTENSION citus; @@ -568,6 +571,7 @@ CREATE EXTENSION citus; \c - - - :worker_1_port DROP EXTENSION citus; +DROP EXTENSION citus_columnar; SET citus.enable_version_checks TO 'false'; SET columnar.enable_version_checks TO 'false'; CREATE EXTENSION citus VERSION '8.0-1';