diff --git a/src/backend/columnar/Makefile b/src/backend/columnar/Makefile index 1658923a8..547b57a1b 100644 --- a/src/backend/columnar/Makefile +++ b/src/backend/columnar/Makefile @@ -9,7 +9,8 @@ OBJS += \ MODULE_big = citus_columnar EXTENSION = citus_columnar -DATA = $(wildcard sql/*--*.sql) +DATA = $(wildcard sql/*--*.sql) \ + $(wildcard sql/downgrades/*--*.sql) PG_CPPFLAGS += -I$(libpq_srcdir) -I$(safestringlib_srcdir)/include ifdef USE_PGXS diff --git a/src/backend/columnar/citus_columnar.control b/src/backend/columnar/citus_columnar.control index b8af4e3ce..8f5081d09 100644 --- a/src/backend/columnar/citus_columnar.control +++ b/src/backend/columnar/citus_columnar.control @@ -1,6 +1,6 @@ # Columnar extension comment = 'Citus Columnar extension' -default_version = '11.1-2' +default_version = '11.2-1' module_pathname = '$libdir/citus_columnar' relocatable = false schema = pg_catalog \ No newline at end of file diff --git a/src/backend/columnar/columnar_tableam.c b/src/backend/columnar/columnar_tableam.c index b6179ac8c..60803f909 100644 --- a/src/backend/columnar/columnar_tableam.c +++ b/src/backend/columnar/columnar_tableam.c @@ -27,6 +27,7 @@ #include "catalog/pg_extension.h" #include "catalog/storage.h" #include "catalog/storage_xlog.h" +#include "commands/defrem.h" #include "commands/progress.h" #include "commands/vacuum.h" #include "commands/extension.h" @@ -57,6 +58,7 @@ #include "columnar/columnar_tableam.h" #include "columnar/columnar_version_compat.h" #include "distributed/listutils.h" +#include "distributed/deparser.h" /* * Timing parameters for truncate locking heuristics. @@ -2135,6 +2137,52 @@ ColumnarProcessUtility(PlannedStmt *pstmt, RelationClose(rel); } + if (IsA(parsetree, CreateExtensionStmt)) + { + CreateExtensionStmt *createExtensionStmt = castNode(CreateExtensionStmt, + parsetree); + if (strcmp(createExtensionStmt->extname, "citus_columnar") == 0) + { + DefElem *newVersionValue = GetExtensionOption(createExtensionStmt->options, + "new_version"); + if (newVersionValue) + { + const char *newVersion = defGetString(newVersionValue); + if (strcmp(newVersion, "11.1-0") == 0) + { + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("unsupported citus_columnar version 11.1-0"))); + } + } + + /*latest citus requires install columnar first, existing citus can only be an older version */ + if (get_extension_oid("citus", true) != InvalidOid) + { + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("must upgrade citus to version 11.2-1 first"))); + } + } + } + + if (IsA(parsetree, AlterExtensionStmt)) + { + AlterExtensionStmt *alterExtensionStmt = castNode(AlterExtensionStmt, parsetree); + if (strcmp(alterExtensionStmt->extname, "citus_columnar") == 0) + { + DefElem *newVersionValue = GetExtensionOption(alterExtensionStmt->options, + "new_version"); + if (newVersionValue) + { + const char *newVersion = defGetString(newVersionValue); + if (strcmp(newVersion, "11.1-0") == 0) + { + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("unsupported citus_columnar version 11.1-0"))); + } + } + } + } + PrevProcessUtilityHook_compat(pstmt, queryString, false, context, params, queryEnv, dest, completionTag); } diff --git a/src/backend/columnar/sql/citus_columnar--11.1-0--11.2-1.sql b/src/backend/columnar/sql/citus_columnar--11.1-0--11.2-1.sql new file mode 100644 index 000000000..b4a110c1c --- /dev/null +++ b/src/backend/columnar/sql/citus_columnar--11.1-0--11.2-1.sql @@ -0,0 +1,23 @@ +-- add columnar objects back + +ALTER EXTENSION citus_columnar ADD SCHEMA columnar; +ALTER EXTENSION citus_columnar ADD SEQUENCE columnar.storageid_seq; +ALTER EXTENSION citus_columnar ADD TABLE columnar.options; +ALTER EXTENSION citus_columnar ADD TABLE columnar.stripe; +ALTER EXTENSION citus_columnar ADD TABLE columnar.chunk_group; +ALTER EXTENSION citus_columnar ADD TABLE columnar.chunk; +DO $proc$ +BEGIN +-- columnar functions +IF substring(current_Setting('server_version'), '\d+')::int >= 12 THEN + EXECUTE $$ + ALTER EXTENSION citus_columnar ADD FUNCTION columnar.columnar_handler; + ALTER EXTENSION citus_columnar ADD ACCESS METHOD columnar; + ALTER EXTENSION citus_columnar ADD FUNCTION pg_catalog.alter_columnar_table_set; + ALTER EXTENSION citus_columnar ADD FUNCTION pg_catalog.alter_columnar_table_reset; + $$; +END IF; +END$proc$; +ALTER EXTENSION citus_columnar ADD FUNCTION citus_internal.upgrade_columnar_storage; +ALTER EXTENSION citus_columnar ADD FUNCTION citus_internal.downgrade_columnar_storage; +ALTER EXTENSION citus_columnar ADD FUNCTION citus_internal.columnar_ensure_am_depends_catalog; \ No newline at end of file diff --git a/src/backend/columnar/sql/citus_columnar--11.1-0.sql b/src/backend/columnar/sql/citus_columnar--11.1-0.sql new file mode 100644 index 000000000..81a70ac33 --- /dev/null +++ b/src/backend/columnar/sql/citus_columnar--11.1-0.sql @@ -0,0 +1 @@ +-- fake sql file 'Y' \ No newline at end of file diff --git a/src/backend/columnar/sql/citus_columnar--11.1-2.sql b/src/backend/columnar/sql/citus_columnar--11.2-1.sql similarity index 100% rename from src/backend/columnar/sql/citus_columnar--11.1-2.sql rename to src/backend/columnar/sql/citus_columnar--11.2-1.sql diff --git a/src/backend/columnar/sql/columnar--10.1-1--10.2-1.sql b/src/backend/columnar/sql/columnar--10.1-1--10.2-1.sql index 1ee471117..4334a7a45 100644 --- a/src/backend/columnar/sql/columnar--10.1-1--10.2-1.sql +++ b/src/backend/columnar/sql/columnar--10.1-1--10.2-1.sql @@ -28,5 +28,5 @@ $$; #include "udfs/downgrade_columnar_storage/10.2-1.sql" -- upgrade storage for all columnar relations -SELECT citus_internal.upgrade_columnar_storage(c.oid) FROM pg_class c, pg_am a +PERFORM citus_internal.upgrade_columnar_storage(c.oid) FROM pg_class c, pg_am a WHERE c.relam = a.oid AND amname = 'columnar'; diff --git a/src/backend/columnar/sql/columnar--10.2-3--10.2-4.sql b/src/backend/columnar/sql/columnar--10.2-3--10.2-4.sql index b4600a4bf..bdd8fb0c7 100644 --- a/src/backend/columnar/sql/columnar--10.2-3--10.2-4.sql +++ b/src/backend/columnar/sql/columnar--10.2-3--10.2-4.sql @@ -2,4 +2,4 @@ #include "udfs/columnar_ensure_am_depends_catalog/10.2-4.sql" -SELECT citus_internal.columnar_ensure_am_depends_catalog(); +PERFORM citus_internal.columnar_ensure_am_depends_catalog(); diff --git a/src/backend/columnar/sql/downgrades/citus_columnar--11.2-1--11.1-0.sql b/src/backend/columnar/sql/downgrades/citus_columnar--11.2-1--11.1-0.sql new file mode 100644 index 000000000..cf0d81e4d --- /dev/null +++ b/src/backend/columnar/sql/downgrades/citus_columnar--11.2-1--11.1-0.sql @@ -0,0 +1,27 @@ +-- detach relations from citus_columnar + +ALTER EXTENSION citus_columnar DROP SCHEMA columnar; +ALTER EXTENSION citus_columnar DROP SEQUENCE columnar.storageid_seq; +-- columnar tables +ALTER EXTENSION citus_columnar DROP TABLE columnar.options; +ALTER EXTENSION citus_columnar DROP TABLE columnar.stripe; +ALTER EXTENSION citus_columnar DROP TABLE columnar.chunk_group; +ALTER EXTENSION citus_columnar DROP TABLE columnar.chunk; + +DO $proc$ +BEGIN +-- columnar functions +IF substring(current_Setting('server_version'), '\d+')::int >= 12 THEN + EXECUTE $$ + ALTER EXTENSION citus_columnar DROP FUNCTION columnar.columnar_handler; + ALTER EXTENSION citus_columnar DROP ACCESS METHOD columnar; + ALTER EXTENSION citus_columnar DROP FUNCTION pg_catalog.alter_columnar_table_set; + ALTER EXTENSION citus_columnar DROP FUNCTION pg_catalog.alter_columnar_table_reset; + $$; +END IF; +END$proc$; + +-- functions under citus_internal for columnar +ALTER EXTENSION citus_columnar DROP FUNCTION citus_internal.upgrade_columnar_storage; +ALTER EXTENSION citus_columnar DROP FUNCTION citus_internal.downgrade_columnar_storage; +ALTER EXTENSION citus_columnar DROP FUNCTION citus_internal.columnar_ensure_am_depends_catalog; \ No newline at end of file diff --git a/src/backend/distributed/Makefile b/src/backend/distributed/Makefile index 2693b80c5..cd88d7da7 100644 --- a/src/backend/distributed/Makefile +++ b/src/backend/distributed/Makefile @@ -16,7 +16,6 @@ generated_sql_files = $(patsubst %,$(citus_abs_srcdir)/build/%,$(template_sql_fi generated_downgrade_sql_files += $(patsubst %,$(citus_abs_srcdir)/build/sql/%,$(template_downgrade_sql_files)) # All citus--*.sql files that are used to upgrade between versions DATA_built = $(generated_sql_files) -DATA = citus--11.1-2.control # directories with source files SUBDIRS = . commands connection ddl deparser executor metadata operations planner progress relay safeclib test transaction utils worker # enterprise modules diff --git a/src/backend/distributed/citus--11.1-2.control b/src/backend/distributed/citus--11.1-2.control deleted file mode 100644 index 361f1be60..000000000 --- a/src/backend/distributed/citus--11.1-2.control +++ /dev/null @@ -1,4 +0,0 @@ -# Citus extension 11.1-2 -relocatable = false -schema = pg_catalog -requires = 'citus_columnar' \ No newline at end of file diff --git a/src/backend/distributed/citus.control b/src/backend/distributed/citus.control index ad19ec634..c89d8c9b5 100644 --- a/src/backend/distributed/citus.control +++ b/src/backend/distributed/citus.control @@ -1,6 +1,7 @@ # Citus extension comment = 'Citus distributed database' -default_version = '11.1-2' +default_version = '11.2-1' module_pathname = '$libdir/citus' relocatable = false schema = pg_catalog +requires = 'citus_columnar' diff --git a/src/backend/distributed/commands/extension.c b/src/backend/distributed/commands/extension.c index c1cf06039..4c44bb13e 100644 --- a/src/backend/distributed/commands/extension.c +++ b/src/backend/distributed/commands/extension.c @@ -9,7 +9,7 @@ */ #include "postgres.h" - +#include "access/xact.h" #include "citus_version.h" #include "catalog/pg_extension_d.h" #include "commands/defrem.h" @@ -842,3 +842,67 @@ AlterExtensionUpdateStmtObjectAddress(Node *node, bool missing_ok) return address; } + + +/* + * CreateExtensionWithVersion builds and execute create extension statements + * per given extension name and extension verision + */ +void +CreateExtensionWithVersion(const char *extname, const char *extVersion) +{ + CreateExtensionStmt *createExtensionStmt = makeNode(CreateExtensionStmt); + + /* set location to -1 as it is unknown */ + int location = -1; + + /* set extension name and if_not_exists fields */ + createExtensionStmt->extname = extname; + createExtensionStmt->if_not_exists = true; + + if (extVersion == NULL) + { + createExtensionStmt->options = NIL; + } + else + { + Node *extensionVersionArg = (Node *) makeString(extVersion); + DefElem *extensionVersionElement = makeDefElem("new_version", extensionVersionArg, + location); + createExtensionStmt->options = lappend(createExtensionStmt->options, + extensionVersionElement); + } + + CreateExtension(NULL, createExtensionStmt); + CommandCounterIncrement(); +} + + +/* + * AlterExtensionUpdateStmt builds and execute Alter extension statements + * per given extension name and updates extension verision + */ +void +AlterExtensionUpdateStmt(const char *extname, const char *extVersion) +{ + AlterExtensionStmt *alterExtensionStmt = makeNode(AlterExtensionStmt); + + /* set location to -1 as it is unknown */ + int location = -1; + alterExtensionStmt->extname = extname; + + if (extVersion == NULL) + { + ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("alter extension \"%s\" should not be empty", + extVersion))); + } + + Node *extensionVersionArg = (Node *) makeString(extVersion); + DefElem *extensionVersionElement = makeDefElem("new_version", extensionVersionArg, + location); + alterExtensionStmt->options = lappend(alterExtensionStmt->options, + extensionVersionElement); + ExecAlterExtensionStmt(NULL, alterExtensionStmt); + CommandCounterIncrement(); +} diff --git a/src/backend/distributed/commands/utility_hook.c b/src/backend/distributed/commands/utility_hook.c index 9c93f0737..263084b5f 100644 --- a/src/backend/distributed/commands/utility_hook.c +++ b/src/backend/distributed/commands/utility_hook.c @@ -38,8 +38,10 @@ #endif #include "catalog/catalog.h" #include "catalog/dependency.h" +#include "citus_version.h" #include "commands/dbcommands.h" #include "commands/defrem.h" +#include "commands/extension.h" #include "commands/tablecmds.h" #include "distributed/adaptive_executor.h" #include "distributed/colocation_utils.h" @@ -71,6 +73,7 @@ #include "lib/stringinfo.h" #include "nodes/parsenodes.h" #include "nodes/pg_list.h" +#include "nodes/makefuncs.h" #include "tcop/utility.h" #include "utils/builtins.h" #include "utils/lsyscache.h" @@ -193,6 +196,20 @@ multi_ProcessUtility(PlannedStmt *pstmt, ErrorIfUnstableCreateOrAlterExtensionStmt(parsetree); } + if (IsA(parsetree, CreateExtensionStmt)) + { + /*CREATE EXTENSION CITUS (version Z) */ + CreateExtensionStmt *createExtensionStmt = castNode(CreateExtensionStmt, + parsetree); + if (strcmp(createExtensionStmt->extname, "citus") == 0) + { + if (get_extension_oid("citus_columnar", true) == InvalidOid) + { + CreateExtensionWithVersion("citus_columnar", NULL); + } + } + } + if (!CitusHasBeenLoaded()) { /* @@ -589,11 +606,65 @@ ProcessUtilityInternal(PlannedStmt *pstmt, if (isAlterExtensionUpdateCitusStmt) { citusCanBeUpdatedToAvailableVersion = !InstalledAndAvailableVersionsSame(); + + /*upgrade citus */ + DefElem *newVersionValue = GetExtensionOption( + ((AlterExtensionStmt *) parsetree)->options, "new_version"); + Oid citusExtensionOid = get_extension_oid("citus", true); + char *curExtensionVersion = get_extension_version(citusExtensionOid); + Oid citusColumnarOid = get_extension_oid("citus_columnar", true); + if (newVersionValue) + { + const char *newVersion = defGetString(newVersionValue); + + /*alter extension citus update to 11.2-1, and no citus_columnar installed */ + if (strcmp(newVersion, "11.2-1") == 0 && citusColumnarOid == InvalidOid) + { + /*it's upgrade citus to 11.2-1 */ + CreateExtensionWithVersion("citus_columnar", "11.1-0"); + } + else if (strcmp(curExtensionVersion, "11.2-1") == 0 && citusColumnarOid != + InvalidOid) + { + /*downgrade citus_columnar to Y */ + AlterExtensionUpdateStmt("citus_columnar", "11.1-0"); + } + } } standard_ProcessUtility_compat(pstmt, queryString, false, context, params, queryEnv, dest, completionTag); + if (isAlterExtensionUpdateCitusStmt) + { + DefElem *newVersionValue = GetExtensionOption( + ((AlterExtensionStmt *) parsetree)->options, "new_version"); + Oid citusColumnarOid = get_extension_oid("citus_columnar", true); + if (newVersionValue) + { + const char *newVersion = defGetString(newVersionValue); + if (strcmp(newVersion, "11.2-1") == 0 && citusColumnarOid != InvalidOid) + { + /*after "ALTER EXTENSION citus" updates citus_columnar Y to version Z. */ + char *curColumnarVersion = get_extension_version(citusColumnarOid); + if (strcmp(curColumnarVersion, "11.1-0") == 0) + { + AlterExtensionUpdateStmt("citus_columnar", "11.2-1"); + } + } + else if (strcmp(newVersion, "11.1-1") == 0 && citusColumnarOid != + InvalidOid) + { + /*after "ALTER EXTENSION citus" drops citus_columnar extension */ + char *curColumnarVersion = get_extension_version(citusColumnarOid); + if (strcmp(curColumnarVersion, "11.1-0") == 0) + { + RemoveExtensionById(citusColumnarOid); + } + } + } + } + /* * if we are running ALTER EXTENSION citus UPDATE (to "") command, we may need * to mark existing objects as distributed depending on the "version" parameter if 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 746674a5a..ae013f4fe 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,5 +1,12 @@ -- citus--10.0-1--10.0-2 -#include "../../columnar/sql/columnar--10.0-1--10.0-2.sql" +--#include "../../columnar/sql/columnar--10.0-1--10.0-2.sql" +DO $check_columnar$ +BEGIN + IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') 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; 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 1b9b32e34..1626e570b 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 @@ -9,7 +9,14 @@ INSERT INTO citus.pg_dist_object SELECT 0 as objsubid ON CONFLICT DO NOTHING; -#include "../../columnar/sql/columnar--10.0-3--10.1-1.sql" +--#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 + #include "../../columnar/sql/columnar--10.0-3--10.1-1.sql" + END IF; +END; +$check_columnar$; #include "udfs/create_distributed_table/10.1-1.sql"; #include "udfs/worker_partitioned_relation_total_size/10.1-1.sql" #include "udfs/worker_partitioned_relation_size/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 507a141c5..53e109e30 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 @@ -9,7 +9,15 @@ GRANT ALL ON FUNCTION pg_catalog.worker_record_sequence_dependency(regclass,regc ALTER TABLE pg_catalog.pg_dist_placement ADD CONSTRAINT placement_shardid_groupid_unique_index UNIQUE (shardid, groupid); #include "udfs/stop_metadata_sync_to_node/10.2-1.sql" -#include "../../columnar/sql/columnar--10.1-1--10.2-1.sql" +--#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 + #include "../../columnar/sql/columnar--10.1-1--10.2-1.sql" + END IF; +END; +$check_columnar$; + #include "udfs/citus_internal_add_partition_metadata/10.2-1.sql"; #include "udfs/citus_internal_add_shard_metadata/10.2-1.sql"; #include "udfs/citus_internal_add_placement_metadata/10.2-1.sql"; 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 df2b65f87..adc18d73a 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 @@ -2,4 +2,11 @@ -- bump version to 10.2-2 -#include "../../columnar/sql/columnar--10.2-1--10.2-2.sql" +--#include "../../columnar/sql/columnar--10.2-1--10.2-2.sql" +DO $check_columnar$ +BEGIN + IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN + #include "../../columnar/sql/columnar--10.2-1--10.2-2.sql" + END IF; +END; +$check_columnar$; \ No newline at end of file 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 bbfb59ae9..a8fb2d705 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 @@ -2,4 +2,11 @@ -- bump version to 10.2-3 -#include "../../columnar/sql/columnar--10.2-2--10.2-3.sql" +--#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 + #include "../../columnar/sql/columnar--10.2-2--10.2-3.sql" + END IF; +END; +$check_columnar$; \ No newline at end of file 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 b32b12066..7e5aa5bf4 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 @@ -2,7 +2,14 @@ -- bump version to 10.2-4 -#include "../../columnar/sql/columnar--10.2-3--10.2-4.sql" +--#include "../../columnar/sql/columnar--10.2-3--10.2-4.sql" +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; +END; +$check_columnar$; #include "udfs/fix_partition_shard_index_names/10.2-4.sql" #include "udfs/fix_all_partition_shard_index_names/10.2-4.sql" diff --git a/src/backend/distributed/sql/citus--11.1-1--11.1-2.sql b/src/backend/distributed/sql/citus--11.1-1--11.1-2.sql deleted file mode 100644 index a8b9733ee..000000000 --- a/src/backend/distributed/sql/citus--11.1-1--11.1-2.sql +++ /dev/null @@ -1,4 +0,0 @@ --- bump version to 11.1-2 - ---\echo Use "ALTER EXTENSION citus UPDATE TO '11.1-2'" to load this file. \quit ---do $$ begin raise log 'citus--11.1-1--11.1-2.sql'; end; $$; diff --git a/src/backend/distributed/sql/citus--11.1-1--11.2-1.sql b/src/backend/distributed/sql/citus--11.1-1--11.2-1.sql new file mode 100644 index 000000000..234edaeab --- /dev/null +++ b/src/backend/distributed/sql/citus--11.1-1--11.2-1.sql @@ -0,0 +1,38 @@ +-- bump version to 11.2-1 +-- drop columnar objects if they exists in citus extension + +DO $check_citus$ +BEGIN +IF 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' and p.proname = 'columnar_handler' +) THEN +ALTER EXTENSION citus DROP SCHEMA columnar; +ALTER EXTENSION citus DROP SEQUENCE columnar.storageid_seq; + +-- columnar tables +ALTER EXTENSION citus DROP TABLE columnar.options; +ALTER EXTENSION citus DROP TABLE columnar.stripe; +ALTER EXTENSION citus DROP TABLE columnar.chunk_group; +ALTER EXTENSION citus DROP TABLE columnar.chunk; + +DO $proc$ +BEGIN +-- columnar functions +IF substring(current_Setting('server_version'), '\d+')::int >= 12 THEN + EXECUTE $$ + ALTER EXTENSION citus DROP FUNCTION columnar.columnar_handler; + ALTER EXTENSION citus DROP ACCESS METHOD columnar; + ALTER EXTENSION citus DROP FUNCTION pg_catalog.alter_columnar_table_set; + ALTER EXTENSION citus DROP FUNCTION pg_catalog.alter_columnar_table_reset; + $$; +END IF; +END$proc$; + +-- functions under citus_internal for columnar +ALTER EXTENSION citus DROP FUNCTION citus_internal.upgrade_columnar_storage; +ALTER EXTENSION citus DROP FUNCTION citus_internal.downgrade_columnar_storage; +ALTER EXTENSION citus DROP FUNCTION citus_internal.columnar_ensure_am_depends_catalog; +END IF; +END $check_citus$; \ No newline at end of file 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 3f035f3a6..b84c4fd61 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 @@ -35,7 +35,14 @@ DROP FUNCTION IF EXISTS pg_catalog.citus_total_relation_size(regclass); #include "udfs/worker_change_sequence_dependency/10.0-1.sql" #include "udfs/remove_local_tables_from_metadata/10.0-1.sql" -#include "../../columnar/sql/columnar--9.5-1--10.0-1.sql" +--#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; +END; +$check_columnar$; #include "udfs/time_partition_range/10.0-1.sql" #include "udfs/time_partitions/10.0-1.sql" diff --git a/src/backend/distributed/sql/downgrades/citus--11.2-1--11.1-1.sql b/src/backend/distributed/sql/downgrades/citus--11.2-1--11.1-1.sql new file mode 100644 index 000000000..8b8ccedeb --- /dev/null +++ b/src/backend/distributed/sql/downgrades/citus--11.2-1--11.1-1.sql @@ -0,0 +1,24 @@ +-- add relations to citus +ALTER EXTENSION citus ADD SCHEMA columnar; +ALTER EXTENSION citus ADD SEQUENCE columnar.storageid_seq; +ALTER EXTENSION citus ADD TABLE columnar.options; +ALTER EXTENSION citus ADD TABLE columnar.stripe; +ALTER EXTENSION citus ADD TABLE columnar.chunk_group; +ALTER EXTENSION citus ADD TABLE columnar.chunk; + +DO $proc$ +BEGIN +-- columnar functions +IF substring(current_Setting('server_version'), '\d+')::int >= 12 THEN + EXECUTE $$ + ALTER EXTENSION citus ADD FUNCTION columnar.columnar_handler; + ALTER EXTENSION citus ADD ACCESS METHOD columnar; + ALTER EXTENSION citus ADD FUNCTION pg_catalog.alter_columnar_table_set; + ALTER EXTENSION citus ADD FUNCTION pg_catalog.alter_columnar_table_reset; + $$; +END IF; +END$proc$; + +ALTER EXTENSION citus ADD FUNCTION citus_internal.upgrade_columnar_storage; +ALTER EXTENSION citus ADD FUNCTION citus_internal.downgrade_columnar_storage; +ALTER EXTENSION citus ADD FUNCTION citus_internal.columnar_ensure_am_depends_catalog; \ No newline at end of file diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index a1e1719de..fe064c53c 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -227,7 +227,8 @@ extern ObjectAddress AlterExtensionSchemaStmtObjectAddress(Node *stmt, bool missing_ok); extern ObjectAddress AlterExtensionUpdateStmtObjectAddress(Node *stmt, bool missing_ok); - +extern void CreateExtensionWithVersion(const char *extname, const char *extVersion); +extern void AlterExtensionUpdateStmt(const char *extname, const char *extVersion); /* foreign_constraint.c - forward declarations */ extern bool ConstraintIsAForeignKeyToReferenceTable(char *constraintName,