mirror of https://github.com/citusdata/citus.git
Fix upgrade & downgrade errors
parent
1f9fb0511c
commit
64e1ec7488
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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; $$;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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; $$;
|
||||
|
|
|
@ -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; $$;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
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 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; $$;
|
||||
|
|
|
@ -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; $$;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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';
|
||||
|
@ -1054,6 +1055,12 @@ ALTER EXTENSION citus UPDATE TO '11.1-1';
|
|||
SELECT * FROM multi_extension.print_extension_changes();
|
||||
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';
|
||||
|
|
|
@ -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';
|
||||
|
|
Loading…
Reference in New Issue