diff --git a/.github/workflows/changelog-check.yaml b/.github/workflows/changelog-check.yaml index 892e7595736..65f5183830d 100644 --- a/.github/workflows/changelog-check.yaml +++ b/.github/workflows/changelog-check.yaml @@ -38,7 +38,7 @@ jobs: folder=".unreleased" # Get the list of modified files in this pull request - files=$(git --no-pager diff --name-only HEAD $(git merge-base HEAD ${{ github.event.pull_request.base.sha }})) + files=$(git --no-pager diff --diff-filter=ACMR --name-only $(git merge-base HEAD ${{ github.event.pull_request.base.sha }}) HEAD) if echo "$BODY" | egrep -qsi "Disable-check:[[:space:]]*force-changelog-file"; then # skip changelog checks if forced @@ -46,8 +46,8 @@ jobs: else # if no changelog files found, and the PR does not have the force disable check option if ! echo "${files}" | grep -Eq "^(${folder})/.+$"; then - echo "PR does not add a change log file in .unlreased/ folder" - echo "Check .unlreased/template.rfc822 for the format of the change log file." + echo "PR does not add a change log file in .unreleased/ folder" + echo "Check .unreleased/template.rfc822 for the format of the change log file." echo echo "To disable changelog updated check, add this trailer to pull request message:" echo diff --git a/.unreleased/5655_decompression_workers.txt b/.unreleased/5655_decompression_workers.txt deleted file mode 100644 index 9a7d946ec0a..00000000000 --- a/.unreleased/5655_decompression_workers.txt +++ /dev/null @@ -1 +0,0 @@ -Implements: #5655 Improve the number of parallel workers for decompression \ No newline at end of file diff --git a/.unreleased/PR_5150 b/.unreleased/PR_5150 deleted file mode 100644 index 7a56f641af4..00000000000 --- a/.unreleased/PR_5150 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5150 MERGE support on hypertables \ No newline at end of file diff --git a/.unreleased/PR_5586 b/.unreleased/PR_5586 deleted file mode 100644 index 4d9c263de73..00000000000 --- a/.unreleased/PR_5586 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5586 Index scan support during UPDATE/DELETE \ No newline at end of file diff --git a/.unreleased/PR_5805 b/.unreleased/PR_5805 deleted file mode 100644 index a48ee63e57a..00000000000 --- a/.unreleased/PR_5805 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5805 Make logrepl markers for (partial) decompressions diff --git a/.unreleased/PR_5839 b/.unreleased/PR_5839 deleted file mode 100644 index 31e5f8f8fe0..00000000000 --- a/.unreleased/PR_5839 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5839 Support CAGG names in chunk_detailed_size diff --git a/.unreleased/PR_5852 b/.unreleased/PR_5852 deleted file mode 100644 index 2bb083c8b9b..00000000000 --- a/.unreleased/PR_5852 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5852 Make set_chunk_time_interval CAGGs aware diff --git a/.unreleased/PR_5868 b/.unreleased/PR_5868 deleted file mode 100644 index 66964c04cfa..00000000000 --- a/.unreleased/PR_5868 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5868 Allows ALTER TABLE ... REPLICA IDENTITY (FULL|INDEX) on materialized hypertables (continuoues aggregates) diff --git a/.unreleased/PR_5930 b/.unreleased/PR_5930 deleted file mode 100644 index 599e2c28976..00000000000 --- a/.unreleased/PR_5930 +++ /dev/null @@ -1,2 +0,0 @@ -Fixes: #5930 Add update tests with weird user names for jobs -Thanks: @mrksngl for discovering and reporting the issue diff --git a/.unreleased/PR_6036 b/.unreleased/PR_6036 deleted file mode 100644 index 313457f45fb..00000000000 --- a/.unreleased/PR_6036 +++ /dev/null @@ -1 +0,0 @@ -Implements: #6036 Add API function for updating OSM chunk ranges diff --git a/.unreleased/PR_6067 b/.unreleased/PR_6067 deleted file mode 100644 index 18229a13ed2..00000000000 --- a/.unreleased/PR_6067 +++ /dev/null @@ -1 +0,0 @@ -Implements: #6067 Adds drop_chunks hook for OSM diff --git a/.unreleased/PR_6081 b/.unreleased/PR_6081 deleted file mode 100644 index db672d882a5..00000000000 --- a/.unreleased/PR_6081 +++ /dev/null @@ -1,2 +0,0 @@ -Fixes: #6081 Improve compressed DML datatype handling - diff --git a/.unreleased/bugfix_5562 b/.unreleased/bugfix_5562 deleted file mode 100644 index 3de323f9e1e..00000000000 --- a/.unreleased/bugfix_5562 +++ /dev/null @@ -1 +0,0 @@ -Fixes: #5562 Move trigger functions to _timescaledb_functions schema diff --git a/.unreleased/bugfix_5734 b/.unreleased/bugfix_5734 deleted file mode 100644 index 17415ae00b2..00000000000 --- a/.unreleased/bugfix_5734 +++ /dev/null @@ -1,5 +0,0 @@ -Implements: #5860 Rectifies interval calculation for Heirarchical CAggs - -Fixes: #5734 - -Thanks: @lukaskirner diff --git a/.unreleased/bugfix_5872 b/.unreleased/bugfix_5872 deleted file mode 100644 index 57742d0553a..00000000000 --- a/.unreleased/bugfix_5872 +++ /dev/null @@ -1 +0,0 @@ -Fixes: #5872 Fix duplicates on partially compressed chunk reads diff --git a/.unreleased/bugfix_5892 b/.unreleased/bugfix_5892 deleted file mode 100644 index 78ac805eede..00000000000 --- a/.unreleased/bugfix_5892 +++ /dev/null @@ -1,2 +0,0 @@ -Implements: #5894 Check unique indexes when enabling compression -Fixes: #5892 diff --git a/.unreleased/bugfix_5909 b/.unreleased/bugfix_5909 deleted file mode 100644 index b10042d6a2c..00000000000 --- a/.unreleased/bugfix_5909 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5909 CREATE INDEX ONLY ON hypertable creates index on chunks diff --git a/.unreleased/bugfix_5918 b/.unreleased/bugfix_5918 deleted file mode 100644 index f33bd53bd4a..00000000000 --- a/.unreleased/bugfix_5918 +++ /dev/null @@ -1,3 +0,0 @@ -Fixes: #5918 Fix crash in COPY from program returning error - -Thanks: @alexanderlaw diff --git a/.unreleased/bugfix_5951 b/.unreleased/bugfix_5951 deleted file mode 100644 index f6b1216adf0..00000000000 --- a/.unreleased/bugfix_5951 +++ /dev/null @@ -1,4 +0,0 @@ -Implements: #5951 _timescaledb_internal.create_compressed_chunk doesn't account for existing uncompressed rows - -Fixes: #5946 - diff --git a/.unreleased/bugfix_5990 b/.unreleased/bugfix_5990 deleted file mode 100644 index 39513242393..00000000000 --- a/.unreleased/bugfix_5990 +++ /dev/null @@ -1 +0,0 @@ -Fixes: #5990 Place data in first/last function in correct mctx diff --git a/.unreleased/bugfix_5991 b/.unreleased/bugfix_5991 deleted file mode 100644 index 96dc1b67ec3..00000000000 --- a/.unreleased/bugfix_5991 +++ /dev/null @@ -1,2 +0,0 @@ -Fixes: #5991 Call eq_func correctly in time_bucket_gapfill -Thanks: @willsbit for reporting a crash in time_bucket_gapfill diff --git a/.unreleased/bugfix_6015 b/.unreleased/bugfix_6015 deleted file mode 100644 index d8d7f0aabb9..00000000000 --- a/.unreleased/bugfix_6015 +++ /dev/null @@ -1 +0,0 @@ -Fixes: #6015 Correct row count in EXPLAIN ANALYZE INSERT .. ON CONFLICT output diff --git a/.unreleased/bugfix_6024 b/.unreleased/bugfix_6024 deleted file mode 100644 index f331b36a67d..00000000000 --- a/.unreleased/bugfix_6024 +++ /dev/null @@ -1,3 +0,0 @@ -Fixes: #6035 UPDATE on compressed chunk crashes server - -Thanks: @alexanderlaw for reporting this issue on server crash diff --git a/.unreleased/bugfix_6037 b/.unreleased/bugfix_6037 deleted file mode 100644 index 86f413b8495..00000000000 --- a/.unreleased/bugfix_6037 +++ /dev/null @@ -1,3 +0,0 @@ -Fixes: #6045 Fix segfault in set_integer_now_func - -Thanks: @alexanderlaw for reporting this issue in set_integer_now_func diff --git a/.unreleased/bugfix_6044 b/.unreleased/bugfix_6044 deleted file mode 100644 index f9270ad46fb..00000000000 --- a/.unreleased/bugfix_6044 +++ /dev/null @@ -1 +0,0 @@ -Fixes: #6044 Server crash when using duplicate segmentby column diff --git a/.unreleased/bugfix_6053 b/.unreleased/bugfix_6053 deleted file mode 100644 index 09a8f4fad43..00000000000 --- a/.unreleased/bugfix_6053 +++ /dev/null @@ -1 +0,0 @@ -Fixes: #6053 Function approximate_row_count returns 0 for caggs diff --git a/.unreleased/bugfix_6084 b/.unreleased/bugfix_6084 deleted file mode 100644 index f9d422aa430..00000000000 --- a/.unreleased/bugfix_6084 +++ /dev/null @@ -1,2 +0,0 @@ -Fixes: #6084 Propagate parameter changes to decompress child nodes -Thanks: @ajcanterbury for reporting a problem with lateral joins on compressed chunks diff --git a/.unreleased/bugfix_chunk_create b/.unreleased/bugfix_chunk_create deleted file mode 100644 index 93aa83f3ccb..00000000000 --- a/.unreleased/bugfix_chunk_create +++ /dev/null @@ -1 +0,0 @@ -Fixes: #5788 Chunk_create must add existing table or fail diff --git a/.unreleased/feature_5137 b/.unreleased/feature_5137 deleted file mode 100644 index df1de9a8bfa..00000000000 --- a/.unreleased/feature_5137 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5137 Insert into index during chunk compression diff --git a/.unreleased/feature_5515 b/.unreleased/feature_5515 deleted file mode 100644 index edd1611b2bb..00000000000 --- a/.unreleased/feature_5515 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5515 Make hypertables support replica identity diff --git a/.unreleased/feature_5596 b/.unreleased/feature_5596 deleted file mode 100644 index 45aebe0c07b..00000000000 --- a/.unreleased/feature_5596 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5596 Support for partial aggregations at chunk level diff --git a/.unreleased/feature_5599 b/.unreleased/feature_5599 deleted file mode 100644 index 74a113a0c9f..00000000000 --- a/.unreleased/feature_5599 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5599 Enable ChunkAppend for partially compressed chunks \ No newline at end of file diff --git a/.unreleased/feature_5758 b/.unreleased/feature_5758 deleted file mode 100644 index c3e4b2dab00..00000000000 --- a/.unreleased/feature_5758 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5758 Enable altering job schedule type through `alter_job` diff --git a/.unreleased/feature_5809 b/.unreleased/feature_5809 deleted file mode 100644 index 51a1b30a450..00000000000 --- a/.unreleased/feature_5809 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5809 Relax invalidation threshold table-level lock to row-level when refreshing a Continuous Aggregate diff --git a/.unreleased/feature_5875 b/.unreleased/feature_5875 deleted file mode 100644 index df37b7deea2..00000000000 --- a/.unreleased/feature_5875 +++ /dev/null @@ -1 +0,0 @@ -Implements: #5875 Add job exit status and runtime to log diff --git a/CHANGELOG.md b/CHANGELOG.md index 61939ed7ec4..a9cff106a80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,68 @@ `psql` with the `-X` flag to prevent any `.psqlrc` commands from accidentally triggering the load of a previous DB version.** +## 2.12.0 (2023-09-20) + +This release contains performance improvements for compressed hypertables +and continuous aggregates and bug fixes since the 2.11.2 release. +We recommend that you upgrade at the next available opportunity. + +This release moves all internal functions from the _timescaleb_internal +schema into the _timescaledb_functions schema. This separates code from +internal data objects and improves security by allowing more restrictive +permissions for the code schema. If you are calling any of those internal +functions you should adjust your code as soon as possible. This version +also includes a compatibility layer that allows calling them in the old +location but that layer will be removed in 2.14.0. + +**PostgreSQL 12 support removal announcement** +Following the deprecation announcement for PostgreSQL 12 in TimescaleDB 2.10, +PostgreSQL 12 is not supported starting with TimescaleDB 2.12. +Currently supported PostgreSQL major versions are 13, 14 and 15. +PostgreSQL 16 support will be added with a following TimescaleDB release. + +**Features** +* #5137 Insert into index during chunk compression +* #5150 MERGE support on hypertables +* #5515 Make hypertables support replica identity +* #5586 Index scan support during UPDATE/DELETE on compressed hypertables +* #5596 Support for partial aggregations at chunk level +* #5599 Enable ChunkAppend for partially compressed chunks +* #5655 Improve the number of parallel workers for decompression +* #5758 Enable altering job schedule type through `alter_job` +* #5805 Make logrepl markers for (partial) decompressions +* #5809 Relax invalidation threshold table-level lock to row-level when refreshing a Continuous Aggregate +* #5839 Support CAgg names in chunk_detailed_size +* #5852 Make set_chunk_time_interval CAggs aware +* #5868 Allow ALTER TABLE ... REPLICA IDENTITY (FULL|INDEX) on materialized hypertables (continuous aggregates) +* #5875 Add job exit status and runtime to log +* #5909 CREATE INDEX ONLY ON hypertable creates index on chunks + +**Bugfixes** +* #5860 Fix interval calculation for hierarchical CAggs +* #5894 Check unique indexes when enabling compression +* #5951 _timescaledb_internal.create_compressed_chunk doesn't account for existing uncompressed rows +* #5988 Move functions to _timescaledb_functions schema +* #5788 Chunk_create must add an existing table or fail +* #5872 Fix duplicates on partially compressed chunk reads +* #5918 Fix crash in COPY from program returning error +* #5990 Place data in first/last function in correct mctx +* #5991 Call eq_func correctly in time_bucket_gapfill +* #6015 Correct row count in EXPLAIN ANALYZE INSERT .. ON CONFLICT output +* #6035 Fix server crash on UPDATE of compressed chunk +* #6044 Fix server crash when using duplicate segmentby column +* #6045 Fix segfault in set_integer_now_func +* #6053 Fix approximate_row_count for CAggs +* #6081 Improve compressed DML datatype handling +* #6084 Propagate parameter changes to decompress child nodes + +**Thanks** +* @ajcanterbury for reporting a problem with lateral joins on compressed chunks +* @alexanderlaw for reporting multiple server crashes +* @lukaskirner for reporting a bug with monthly continuous aggregates +* @mrksngl for reporting a bug with unusual user names +* @willsbit for reporting a crash in time_bucket_gapfill + ## 2.11.2 (2023-08-09) This release contains bug fixes since the 2.11.1 release. @@ -72,7 +134,6 @@ This release includes these noteworthy features: * #5584 Reduce decompression during constraint checking * #5530 Optimize compressed chunk resorting * #5639 Support sending telemetry event reports -* #5150 MERGE support on hypertables **Bugfixes** * #5396 Fix SEGMENTBY columns predicates to be pushed down diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index d8000b74b38..43860cd8769 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -37,7 +37,8 @@ set(MOD_FILES updates/2.10.2--2.10.3.sql updates/2.10.3--2.11.0.sql updates/2.11.0--2.11.1.sql - updates/2.11.1--2.11.2.sql) + updates/2.11.1--2.11.2.sql + updates/2.11.2--2.12.0.sql) # The downgrade file to generate a downgrade script for the current version, as # specified in version.config diff --git a/sql/updates/2.11.2--2.12.0.sql b/sql/updates/2.11.2--2.12.0.sql new file mode 100644 index 00000000000..ca1f10bfc9b --- /dev/null +++ b/sql/updates/2.11.2--2.12.0.sql @@ -0,0 +1,327 @@ +DROP FUNCTION IF EXISTS @extschema@.alter_job( + INTEGER, + INTERVAL, + INTERVAL, + INTEGER, + INTERVAL, + BOOL, + JSONB, + TIMESTAMPTZ, + BOOL, + REGPROC +); + +CREATE FUNCTION @extschema@.alter_job( + job_id INTEGER, + schedule_interval INTERVAL = NULL, + max_runtime INTERVAL = NULL, + max_retries INTEGER = NULL, + retry_period INTERVAL = NULL, + scheduled BOOL = NULL, + config JSONB = NULL, + next_start TIMESTAMPTZ = NULL, + if_exists BOOL = FALSE, + check_config REGPROC = NULL, + fixed_schedule BOOL = NULL, + initial_start TIMESTAMPTZ = NULL, + timezone TEXT DEFAULT NULL +) +RETURNS TABLE (job_id INTEGER, schedule_interval INTERVAL, max_runtime INTERVAL, max_retries INTEGER, retry_period INTERVAL, scheduled BOOL, config JSONB, +next_start TIMESTAMPTZ, check_config TEXT, fixed_schedule BOOL, initial_start TIMESTAMPTZ, timezone TEXT) +AS '@MODULE_PATHNAME@', 'ts_job_alter' +LANGUAGE C VOLATILE; + +-- when upgrading from old versions on PG13 this function might not be present +-- since there is no ALTER FUNCTION IF EXISTS we have to work around it with a DO block +DO $$ +DECLARE + foid regprocedure; + funcs text[] = '{ + drop_dist_ht_invalidation_trigger, + subtract_integer_from_now, + get_approx_row_count, + chunk_status, + create_chunk,create_chunk_table, + freeze_chunk,unfreeze_chunk,drop_chunk, + attach_osm_table_chunk + }'; +BEGIN + FOR foid IN + SELECT oid FROM pg_proc WHERE proname = ANY(funcs) AND pronamespace = '_timescaledb_internal'::regnamespace + LOOP + EXECUTE format('ALTER FUNCTION %s SET SCHEMA _timescaledb_functions', foid); + END LOOP; +END; +$$; + +DROP FUNCTION IF EXISTS _timescaledb_internal.get_time_type(integer); + +ALTER FUNCTION _timescaledb_internal.insert_blocker() SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.continuous_agg_invalidation_trigger() SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.get_create_command(name) SET SCHEMA _timescaledb_functions; + +ALTER FUNCTION _timescaledb_internal.to_unix_microseconds(timestamptz) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.to_timestamp(bigint) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.to_timestamp_without_timezone(bigint) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.to_date(bigint) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.to_interval(bigint) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.interval_to_usec(interval) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.time_to_internal(anyelement) SET SCHEMA _timescaledb_functions; + +ALTER FUNCTION _timescaledb_internal.set_dist_id(uuid) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.set_peer_dist_id(uuid) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.validate_as_data_node() SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.show_connection_cache() SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.ping_data_node(name, interval) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.remote_txn_heal_data_node(oid) SET SCHEMA _timescaledb_functions; + +ALTER FUNCTION _timescaledb_internal.relation_size(regclass) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.data_node_hypertable_info(name, name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.data_node_chunk_info(name, name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.hypertable_local_size(name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.hypertable_remote_size(name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.chunks_local_size(name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.chunks_remote_size(name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.range_value_to_pretty(bigint, regtype) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.data_node_compressed_chunk_stats(name, name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.compressed_chunk_local_stats(name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.compressed_chunk_remote_stats(name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.indexes_local_size(name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.data_node_index_size(name, name, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.indexes_remote_size(name, name, name) SET SCHEMA _timescaledb_functions; + +ALTER FUNCTION _timescaledb_internal.generate_uuid() SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.get_git_commit() SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.get_os_info() SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.tsl_loaded() SET SCHEMA _timescaledb_functions; + +ALTER FUNCTION _timescaledb_internal.calculate_chunk_interval(int, bigint, bigint) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.chunks_in(record, integer[]) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.chunk_id_from_relid(oid) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.show_chunk(regclass) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.set_chunk_default_data_node(regclass, name) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.get_chunk_relstats(regclass) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.get_chunk_colstats(regclass) SET SCHEMA _timescaledb_functions; + +UPDATE _timescaledb_catalog.hypertable SET chunk_sizing_func_schema = '_timescaledb_functions' WHERE chunk_sizing_func_schema = '_timescaledb_internal' AND chunk_sizing_func_name = 'calculate_chunk_interval'; + +DO $$ +DECLARE + foid regprocedure; + kind text; + funcs text[] = '{ + policy_compression_check,policy_compression_execute,policy_compression, + policy_job_error_retention_check,policy_job_error_retention, + policy_recompression, + policy_refresh_continuous_aggregate_check,policy_refresh_continuous_aggregate, + policy_reorder_check,policy_reorder,policy_retention_check,policy_retention, + + cagg_watermark, cagg_watermark_materialized, + cagg_migrate_plan_exists, cagg_migrate_pre_validation, cagg_migrate_create_plan, cagg_migrate_execute_create_new_cagg, + cagg_migrate_execute_disable_policies, cagg_migrate_execute_enable_policies, cagg_migrate_execute_copy_policies, + cagg_migrate_execute_refresh_new_cagg, cagg_migrate_execute_copy_data, cagg_migrate_execute_override_cagg, + cagg_migrate_execute_drop_old_cagg, cagg_migrate_execute_plan, + + finalize_agg, + + hypertable_invalidation_log_delete, invalidation_cagg_log_add_entry, invalidation_hyper_log_add_entry, + invalidation_process_cagg_log, invalidation_process_hypertable_log, materialization_invalidation_log_delete, + + alter_job_set_hypertable_id, + + create_compressed_chunk, get_compressed_chunk_index_for_recompression, recompress_chunk_segmentwise, + chunk_drop_replica, chunk_index_clone, chunk_index_replace, create_chunk_replica_table, drop_stale_chunks, + chunk_constraint_add_table_constraint, hypertable_constraint_add_table_fk_constraint, + health, wait_subscription_sync + }'; +BEGIN + FOR foid, kind IN + SELECT oid, + CASE + WHEN prokind = 'f' THEN 'FUNCTION' + WHEN prokind = 'a' THEN 'AGGREGATE' + ELSE 'PROCEDURE' + END + FROM pg_proc WHERE proname = ANY(funcs) AND pronamespace = '_timescaledb_internal'::regnamespace + LOOP + EXECUTE format('ALTER %s %s SET SCHEMA _timescaledb_functions', kind, foid); + END LOOP; +END; +$$; + +UPDATE _timescaledb_config.bgw_job SET proc_schema = '_timescaledb_functions' WHERE proc_schema = '_timescaledb_internal'; +UPDATE _timescaledb_config.bgw_job SET check_schema = '_timescaledb_functions' WHERE check_schema = '_timescaledb_internal'; + +ALTER FUNCTION _timescaledb_internal.start_background_workers() SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.stop_background_workers() SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.restart_background_workers() SET SCHEMA _timescaledb_functions; + +ALTER FUNCTION _timescaledb_internal.process_ddl_event() SET SCHEMA _timescaledb_functions; + +ALTER FUNCTION _timescaledb_internal.get_partition_for_key(val anyelement) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.get_partition_hash(val anyelement) SET SCHEMA _timescaledb_functions; + +UPDATE _timescaledb_catalog.dimension SET partitioning_func_schema = '_timescaledb_functions' WHERE partitioning_func_schema = '_timescaledb_internal' AND partitioning_func IN ('get_partition_for_key','get_partition_hash'); + +ALTER FUNCTION _timescaledb_internal.finalize_agg_ffunc(internal,text,name,name,name[],bytea,anyelement) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.finalize_agg_sfunc(internal,text,name,name,name[],bytea,anyelement) SET SCHEMA _timescaledb_functions; +ALTER FUNCTION _timescaledb_internal.partialize_agg(anyelement) SET SCHEMA _timescaledb_functions; + +-- Fix osm chunk ranges +UPDATE _timescaledb_catalog.dimension_slice ds + SET range_start = 9223372036854775806 +FROM _timescaledb_catalog.chunk_constraint cc +INNER JOIN _timescaledb_catalog.chunk c ON c.id = cc.chunk_id AND c.osm_chunk +WHERE cc.dimension_slice_id = ds.id AND ds.range_start <> 9223372036854775806; + +-- OSM support - table must be rebuilt to ensure consistent attribute numbers +-- we cannot just ALTER TABLE .. ADD COLUMN +ALTER TABLE _timescaledb_config.bgw_job + DROP CONSTRAINT bgw_job_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.chunk + DROP CONSTRAINT chunk_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.chunk_index + DROP CONSTRAINT chunk_index_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.continuous_agg + DROP CONSTRAINT continuous_agg_mat_hypertable_id_fkey, + DROP CONSTRAINT continuous_agg_raw_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.continuous_aggs_bucket_function + DROP CONSTRAINT continuous_aggs_bucket_function_mat_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.continuous_aggs_invalidation_threshold + DROP CONSTRAINT continuous_aggs_invalidation_threshold_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.dimension + DROP CONSTRAINT dimension_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.hypertable + DROP CONSTRAINT hypertable_compressed_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.hypertable_compression + DROP CONSTRAINT hypertable_compression_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.hypertable_data_node + DROP CONSTRAINT hypertable_data_node_hypertable_id_fkey; +ALTER TABLE _timescaledb_catalog.tablespace + DROP CONSTRAINT tablespace_hypertable_id_fkey; + +DROP VIEW IF EXISTS timescaledb_information.hypertables; +DROP VIEW IF EXISTS timescaledb_information.job_stats; +DROP VIEW IF EXISTS timescaledb_information.jobs; +DROP VIEW IF EXISTS timescaledb_information.continuous_aggregates; +DROP VIEW IF EXISTS timescaledb_information.chunks; +DROP VIEW IF EXISTS timescaledb_information.dimensions; +DROP VIEW IF EXISTS timescaledb_information.compression_settings; +DROP VIEW IF EXISTS _timescaledb_internal.hypertable_chunk_local_size; +DROP VIEW IF EXISTS _timescaledb_internal.compressed_chunk_stats; +DROP VIEW IF EXISTS timescaledb_experimental.chunk_replication_status; +DROP VIEW IF EXISTS timescaledb_experimental.policies; + +-- recreate table +CREATE TABLE _timescaledb_catalog.hypertable_tmp AS SELECT * FROM _timescaledb_catalog.hypertable; +CREATE TABLE _timescaledb_catalog.tmp_hypertable_seq_value AS SELECT last_value, is_called FROM _timescaledb_catalog.hypertable_id_seq; + +ALTER EXTENSION timescaledb DROP TABLE _timescaledb_catalog.hypertable; +ALTER EXTENSION timescaledb DROP SEQUENCE _timescaledb_catalog.hypertable_id_seq; + +SET timescaledb.restoring = on; -- must disable the hooks otherwise we can't do anything without the table _timescaledb_catalog.hypertable + +DROP TABLE _timescaledb_catalog.hypertable; + +CREATE SEQUENCE _timescaledb_catalog.hypertable_id_seq MINVALUE 1; +SELECT setval('_timescaledb_catalog.hypertable_id_seq', last_value, is_called) FROM _timescaledb_catalog.tmp_hypertable_seq_value; +DROP TABLE _timescaledb_catalog.tmp_hypertable_seq_value; + +CREATE TABLE _timescaledb_catalog.hypertable ( + id INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('_timescaledb_catalog.hypertable_id_seq'), + schema_name name NOT NULL, + table_name name NOT NULL, + associated_schema_name name NOT NULL, + associated_table_prefix name NOT NULL, + num_dimensions smallint NOT NULL, + chunk_sizing_func_schema name NOT NULL, + chunk_sizing_func_name name NOT NULL, + chunk_target_size bigint NOT NULL, -- size in bytes + compression_state smallint NOT NULL DEFAULT 0, + compressed_hypertable_id integer, + replication_factor smallint NULL, + status integer NOT NULL DEFAULT 0 +); + +SET timescaledb.restoring = off; + +INSERT INTO _timescaledb_catalog.hypertable ( + id, + schema_name, + table_name, + associated_schema_name, + associated_table_prefix, + num_dimensions, + chunk_sizing_func_schema, + chunk_sizing_func_name, + chunk_target_size, + compression_state, + compressed_hypertable_id, + replication_factor +) +SELECT + id, + schema_name, + table_name, + associated_schema_name, + associated_table_prefix, + num_dimensions, + chunk_sizing_func_schema, + chunk_sizing_func_name, + chunk_target_size, + compression_state, + compressed_hypertable_id, + replication_factor +FROM + _timescaledb_catalog.hypertable_tmp +ORDER BY id; + +UPDATE _timescaledb_catalog.hypertable h +SET status = 3 +WHERE EXISTS ( + SELECT FROM _timescaledb_catalog.chunk c WHERE c.osm_chunk AND c.hypertable_id = h.id +); + +ALTER SEQUENCE _timescaledb_catalog.hypertable_id_seq OWNED BY _timescaledb_catalog.hypertable.id; +SELECT pg_catalog.pg_extension_config_dump('_timescaledb_catalog.hypertable', 'WHERE id >= 1'); +SELECT pg_catalog.pg_extension_config_dump('_timescaledb_catalog.hypertable_id_seq', ''); + +GRANT SELECT ON _timescaledb_catalog.hypertable TO PUBLIC; +GRANT SELECT ON _timescaledb_catalog.hypertable_id_seq TO PUBLIC; + +DROP TABLE _timescaledb_catalog.hypertable_tmp; +-- now add any constraints +ALTER TABLE _timescaledb_catalog.hypertable + ADD CONSTRAINT hypertable_associated_schema_name_associated_table_prefix_key UNIQUE (associated_schema_name, associated_table_prefix), + ADD CONSTRAINT hypertable_table_name_schema_name_key UNIQUE (table_name, schema_name), + ADD CONSTRAINT hypertable_schema_name_check CHECK (schema_name != '_timescaledb_catalog'), + ADD CONSTRAINT hypertable_dim_compress_check CHECK (num_dimensions > 0 OR compression_state = 2), + ADD CONSTRAINT hypertable_chunk_target_size_check CHECK (chunk_target_size >= 0), + ADD CONSTRAINT hypertable_compress_check CHECK ( (compression_state = 0 OR compression_state = 1 ) OR (compression_state = 2 AND compressed_hypertable_id IS NULL)), + ADD CONSTRAINT hypertable_replication_factor_check CHECK (replication_factor > 0 OR replication_factor = -1), + ADD CONSTRAINT hypertable_compressed_hypertable_id_fkey FOREIGN KEY (compressed_hypertable_id) REFERENCES _timescaledb_catalog.hypertable (id); + +GRANT SELECT ON TABLE _timescaledb_catalog.hypertable TO PUBLIC; + +-- 3. reestablish constraints on other tables +ALTER TABLE _timescaledb_config.bgw_job + ADD CONSTRAINT bgw_job_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; +ALTER TABLE _timescaledb_catalog.chunk + ADD CONSTRAINT chunk_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id); +ALTER TABLE _timescaledb_catalog.chunk_index + ADD CONSTRAINT chunk_index_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; +ALTER TABLE _timescaledb_catalog.continuous_agg + ADD CONSTRAINT continuous_agg_mat_hypertable_id_fkey FOREIGN KEY (mat_hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE, + ADD CONSTRAINT continuous_agg_raw_hypertable_id_fkey FOREIGN KEY (raw_hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; +ALTER TABLE _timescaledb_catalog.continuous_aggs_bucket_function + ADD CONSTRAINT continuous_aggs_bucket_function_mat_hypertable_id_fkey FOREIGN KEY (mat_hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; +ALTER TABLE _timescaledb_catalog.continuous_aggs_invalidation_threshold + ADD CONSTRAINT continuous_aggs_invalidation_threshold_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; +ALTER TABLE _timescaledb_catalog.dimension + ADD CONSTRAINT dimension_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; +ALTER TABLE _timescaledb_catalog.hypertable_compression + ADD CONSTRAINT hypertable_compression_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; +ALTER TABLE _timescaledb_catalog.hypertable_data_node + ADD CONSTRAINT hypertable_data_node_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id); +ALTER TABLE _timescaledb_catalog.tablespace + ADD CONSTRAINT tablespace_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; diff --git a/sql/updates/latest-dev.sql b/sql/updates/latest-dev.sql index ca1f10bfc9b..e69de29bb2d 100644 --- a/sql/updates/latest-dev.sql +++ b/sql/updates/latest-dev.sql @@ -1,327 +0,0 @@ -DROP FUNCTION IF EXISTS @extschema@.alter_job( - INTEGER, - INTERVAL, - INTERVAL, - INTEGER, - INTERVAL, - BOOL, - JSONB, - TIMESTAMPTZ, - BOOL, - REGPROC -); - -CREATE FUNCTION @extschema@.alter_job( - job_id INTEGER, - schedule_interval INTERVAL = NULL, - max_runtime INTERVAL = NULL, - max_retries INTEGER = NULL, - retry_period INTERVAL = NULL, - scheduled BOOL = NULL, - config JSONB = NULL, - next_start TIMESTAMPTZ = NULL, - if_exists BOOL = FALSE, - check_config REGPROC = NULL, - fixed_schedule BOOL = NULL, - initial_start TIMESTAMPTZ = NULL, - timezone TEXT DEFAULT NULL -) -RETURNS TABLE (job_id INTEGER, schedule_interval INTERVAL, max_runtime INTERVAL, max_retries INTEGER, retry_period INTERVAL, scheduled BOOL, config JSONB, -next_start TIMESTAMPTZ, check_config TEXT, fixed_schedule BOOL, initial_start TIMESTAMPTZ, timezone TEXT) -AS '@MODULE_PATHNAME@', 'ts_job_alter' -LANGUAGE C VOLATILE; - --- when upgrading from old versions on PG13 this function might not be present --- since there is no ALTER FUNCTION IF EXISTS we have to work around it with a DO block -DO $$ -DECLARE - foid regprocedure; - funcs text[] = '{ - drop_dist_ht_invalidation_trigger, - subtract_integer_from_now, - get_approx_row_count, - chunk_status, - create_chunk,create_chunk_table, - freeze_chunk,unfreeze_chunk,drop_chunk, - attach_osm_table_chunk - }'; -BEGIN - FOR foid IN - SELECT oid FROM pg_proc WHERE proname = ANY(funcs) AND pronamespace = '_timescaledb_internal'::regnamespace - LOOP - EXECUTE format('ALTER FUNCTION %s SET SCHEMA _timescaledb_functions', foid); - END LOOP; -END; -$$; - -DROP FUNCTION IF EXISTS _timescaledb_internal.get_time_type(integer); - -ALTER FUNCTION _timescaledb_internal.insert_blocker() SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.continuous_agg_invalidation_trigger() SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.get_create_command(name) SET SCHEMA _timescaledb_functions; - -ALTER FUNCTION _timescaledb_internal.to_unix_microseconds(timestamptz) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.to_timestamp(bigint) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.to_timestamp_without_timezone(bigint) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.to_date(bigint) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.to_interval(bigint) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.interval_to_usec(interval) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.time_to_internal(anyelement) SET SCHEMA _timescaledb_functions; - -ALTER FUNCTION _timescaledb_internal.set_dist_id(uuid) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.set_peer_dist_id(uuid) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.validate_as_data_node() SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.show_connection_cache() SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.ping_data_node(name, interval) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.remote_txn_heal_data_node(oid) SET SCHEMA _timescaledb_functions; - -ALTER FUNCTION _timescaledb_internal.relation_size(regclass) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.data_node_hypertable_info(name, name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.data_node_chunk_info(name, name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.hypertable_local_size(name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.hypertable_remote_size(name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.chunks_local_size(name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.chunks_remote_size(name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.range_value_to_pretty(bigint, regtype) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.data_node_compressed_chunk_stats(name, name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.compressed_chunk_local_stats(name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.compressed_chunk_remote_stats(name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.indexes_local_size(name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.data_node_index_size(name, name, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.indexes_remote_size(name, name, name) SET SCHEMA _timescaledb_functions; - -ALTER FUNCTION _timescaledb_internal.generate_uuid() SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.get_git_commit() SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.get_os_info() SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.tsl_loaded() SET SCHEMA _timescaledb_functions; - -ALTER FUNCTION _timescaledb_internal.calculate_chunk_interval(int, bigint, bigint) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.chunks_in(record, integer[]) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.chunk_id_from_relid(oid) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.show_chunk(regclass) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.set_chunk_default_data_node(regclass, name) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.get_chunk_relstats(regclass) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.get_chunk_colstats(regclass) SET SCHEMA _timescaledb_functions; - -UPDATE _timescaledb_catalog.hypertable SET chunk_sizing_func_schema = '_timescaledb_functions' WHERE chunk_sizing_func_schema = '_timescaledb_internal' AND chunk_sizing_func_name = 'calculate_chunk_interval'; - -DO $$ -DECLARE - foid regprocedure; - kind text; - funcs text[] = '{ - policy_compression_check,policy_compression_execute,policy_compression, - policy_job_error_retention_check,policy_job_error_retention, - policy_recompression, - policy_refresh_continuous_aggregate_check,policy_refresh_continuous_aggregate, - policy_reorder_check,policy_reorder,policy_retention_check,policy_retention, - - cagg_watermark, cagg_watermark_materialized, - cagg_migrate_plan_exists, cagg_migrate_pre_validation, cagg_migrate_create_plan, cagg_migrate_execute_create_new_cagg, - cagg_migrate_execute_disable_policies, cagg_migrate_execute_enable_policies, cagg_migrate_execute_copy_policies, - cagg_migrate_execute_refresh_new_cagg, cagg_migrate_execute_copy_data, cagg_migrate_execute_override_cagg, - cagg_migrate_execute_drop_old_cagg, cagg_migrate_execute_plan, - - finalize_agg, - - hypertable_invalidation_log_delete, invalidation_cagg_log_add_entry, invalidation_hyper_log_add_entry, - invalidation_process_cagg_log, invalidation_process_hypertable_log, materialization_invalidation_log_delete, - - alter_job_set_hypertable_id, - - create_compressed_chunk, get_compressed_chunk_index_for_recompression, recompress_chunk_segmentwise, - chunk_drop_replica, chunk_index_clone, chunk_index_replace, create_chunk_replica_table, drop_stale_chunks, - chunk_constraint_add_table_constraint, hypertable_constraint_add_table_fk_constraint, - health, wait_subscription_sync - }'; -BEGIN - FOR foid, kind IN - SELECT oid, - CASE - WHEN prokind = 'f' THEN 'FUNCTION' - WHEN prokind = 'a' THEN 'AGGREGATE' - ELSE 'PROCEDURE' - END - FROM pg_proc WHERE proname = ANY(funcs) AND pronamespace = '_timescaledb_internal'::regnamespace - LOOP - EXECUTE format('ALTER %s %s SET SCHEMA _timescaledb_functions', kind, foid); - END LOOP; -END; -$$; - -UPDATE _timescaledb_config.bgw_job SET proc_schema = '_timescaledb_functions' WHERE proc_schema = '_timescaledb_internal'; -UPDATE _timescaledb_config.bgw_job SET check_schema = '_timescaledb_functions' WHERE check_schema = '_timescaledb_internal'; - -ALTER FUNCTION _timescaledb_internal.start_background_workers() SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.stop_background_workers() SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.restart_background_workers() SET SCHEMA _timescaledb_functions; - -ALTER FUNCTION _timescaledb_internal.process_ddl_event() SET SCHEMA _timescaledb_functions; - -ALTER FUNCTION _timescaledb_internal.get_partition_for_key(val anyelement) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.get_partition_hash(val anyelement) SET SCHEMA _timescaledb_functions; - -UPDATE _timescaledb_catalog.dimension SET partitioning_func_schema = '_timescaledb_functions' WHERE partitioning_func_schema = '_timescaledb_internal' AND partitioning_func IN ('get_partition_for_key','get_partition_hash'); - -ALTER FUNCTION _timescaledb_internal.finalize_agg_ffunc(internal,text,name,name,name[],bytea,anyelement) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.finalize_agg_sfunc(internal,text,name,name,name[],bytea,anyelement) SET SCHEMA _timescaledb_functions; -ALTER FUNCTION _timescaledb_internal.partialize_agg(anyelement) SET SCHEMA _timescaledb_functions; - --- Fix osm chunk ranges -UPDATE _timescaledb_catalog.dimension_slice ds - SET range_start = 9223372036854775806 -FROM _timescaledb_catalog.chunk_constraint cc -INNER JOIN _timescaledb_catalog.chunk c ON c.id = cc.chunk_id AND c.osm_chunk -WHERE cc.dimension_slice_id = ds.id AND ds.range_start <> 9223372036854775806; - --- OSM support - table must be rebuilt to ensure consistent attribute numbers --- we cannot just ALTER TABLE .. ADD COLUMN -ALTER TABLE _timescaledb_config.bgw_job - DROP CONSTRAINT bgw_job_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.chunk - DROP CONSTRAINT chunk_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.chunk_index - DROP CONSTRAINT chunk_index_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.continuous_agg - DROP CONSTRAINT continuous_agg_mat_hypertable_id_fkey, - DROP CONSTRAINT continuous_agg_raw_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.continuous_aggs_bucket_function - DROP CONSTRAINT continuous_aggs_bucket_function_mat_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.continuous_aggs_invalidation_threshold - DROP CONSTRAINT continuous_aggs_invalidation_threshold_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.dimension - DROP CONSTRAINT dimension_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.hypertable - DROP CONSTRAINT hypertable_compressed_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.hypertable_compression - DROP CONSTRAINT hypertable_compression_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.hypertable_data_node - DROP CONSTRAINT hypertable_data_node_hypertable_id_fkey; -ALTER TABLE _timescaledb_catalog.tablespace - DROP CONSTRAINT tablespace_hypertable_id_fkey; - -DROP VIEW IF EXISTS timescaledb_information.hypertables; -DROP VIEW IF EXISTS timescaledb_information.job_stats; -DROP VIEW IF EXISTS timescaledb_information.jobs; -DROP VIEW IF EXISTS timescaledb_information.continuous_aggregates; -DROP VIEW IF EXISTS timescaledb_information.chunks; -DROP VIEW IF EXISTS timescaledb_information.dimensions; -DROP VIEW IF EXISTS timescaledb_information.compression_settings; -DROP VIEW IF EXISTS _timescaledb_internal.hypertable_chunk_local_size; -DROP VIEW IF EXISTS _timescaledb_internal.compressed_chunk_stats; -DROP VIEW IF EXISTS timescaledb_experimental.chunk_replication_status; -DROP VIEW IF EXISTS timescaledb_experimental.policies; - --- recreate table -CREATE TABLE _timescaledb_catalog.hypertable_tmp AS SELECT * FROM _timescaledb_catalog.hypertable; -CREATE TABLE _timescaledb_catalog.tmp_hypertable_seq_value AS SELECT last_value, is_called FROM _timescaledb_catalog.hypertable_id_seq; - -ALTER EXTENSION timescaledb DROP TABLE _timescaledb_catalog.hypertable; -ALTER EXTENSION timescaledb DROP SEQUENCE _timescaledb_catalog.hypertable_id_seq; - -SET timescaledb.restoring = on; -- must disable the hooks otherwise we can't do anything without the table _timescaledb_catalog.hypertable - -DROP TABLE _timescaledb_catalog.hypertable; - -CREATE SEQUENCE _timescaledb_catalog.hypertable_id_seq MINVALUE 1; -SELECT setval('_timescaledb_catalog.hypertable_id_seq', last_value, is_called) FROM _timescaledb_catalog.tmp_hypertable_seq_value; -DROP TABLE _timescaledb_catalog.tmp_hypertable_seq_value; - -CREATE TABLE _timescaledb_catalog.hypertable ( - id INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('_timescaledb_catalog.hypertable_id_seq'), - schema_name name NOT NULL, - table_name name NOT NULL, - associated_schema_name name NOT NULL, - associated_table_prefix name NOT NULL, - num_dimensions smallint NOT NULL, - chunk_sizing_func_schema name NOT NULL, - chunk_sizing_func_name name NOT NULL, - chunk_target_size bigint NOT NULL, -- size in bytes - compression_state smallint NOT NULL DEFAULT 0, - compressed_hypertable_id integer, - replication_factor smallint NULL, - status integer NOT NULL DEFAULT 0 -); - -SET timescaledb.restoring = off; - -INSERT INTO _timescaledb_catalog.hypertable ( - id, - schema_name, - table_name, - associated_schema_name, - associated_table_prefix, - num_dimensions, - chunk_sizing_func_schema, - chunk_sizing_func_name, - chunk_target_size, - compression_state, - compressed_hypertable_id, - replication_factor -) -SELECT - id, - schema_name, - table_name, - associated_schema_name, - associated_table_prefix, - num_dimensions, - chunk_sizing_func_schema, - chunk_sizing_func_name, - chunk_target_size, - compression_state, - compressed_hypertable_id, - replication_factor -FROM - _timescaledb_catalog.hypertable_tmp -ORDER BY id; - -UPDATE _timescaledb_catalog.hypertable h -SET status = 3 -WHERE EXISTS ( - SELECT FROM _timescaledb_catalog.chunk c WHERE c.osm_chunk AND c.hypertable_id = h.id -); - -ALTER SEQUENCE _timescaledb_catalog.hypertable_id_seq OWNED BY _timescaledb_catalog.hypertable.id; -SELECT pg_catalog.pg_extension_config_dump('_timescaledb_catalog.hypertable', 'WHERE id >= 1'); -SELECT pg_catalog.pg_extension_config_dump('_timescaledb_catalog.hypertable_id_seq', ''); - -GRANT SELECT ON _timescaledb_catalog.hypertable TO PUBLIC; -GRANT SELECT ON _timescaledb_catalog.hypertable_id_seq TO PUBLIC; - -DROP TABLE _timescaledb_catalog.hypertable_tmp; --- now add any constraints -ALTER TABLE _timescaledb_catalog.hypertable - ADD CONSTRAINT hypertable_associated_schema_name_associated_table_prefix_key UNIQUE (associated_schema_name, associated_table_prefix), - ADD CONSTRAINT hypertable_table_name_schema_name_key UNIQUE (table_name, schema_name), - ADD CONSTRAINT hypertable_schema_name_check CHECK (schema_name != '_timescaledb_catalog'), - ADD CONSTRAINT hypertable_dim_compress_check CHECK (num_dimensions > 0 OR compression_state = 2), - ADD CONSTRAINT hypertable_chunk_target_size_check CHECK (chunk_target_size >= 0), - ADD CONSTRAINT hypertable_compress_check CHECK ( (compression_state = 0 OR compression_state = 1 ) OR (compression_state = 2 AND compressed_hypertable_id IS NULL)), - ADD CONSTRAINT hypertable_replication_factor_check CHECK (replication_factor > 0 OR replication_factor = -1), - ADD CONSTRAINT hypertable_compressed_hypertable_id_fkey FOREIGN KEY (compressed_hypertable_id) REFERENCES _timescaledb_catalog.hypertable (id); - -GRANT SELECT ON TABLE _timescaledb_catalog.hypertable TO PUBLIC; - --- 3. reestablish constraints on other tables -ALTER TABLE _timescaledb_config.bgw_job - ADD CONSTRAINT bgw_job_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; -ALTER TABLE _timescaledb_catalog.chunk - ADD CONSTRAINT chunk_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id); -ALTER TABLE _timescaledb_catalog.chunk_index - ADD CONSTRAINT chunk_index_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; -ALTER TABLE _timescaledb_catalog.continuous_agg - ADD CONSTRAINT continuous_agg_mat_hypertable_id_fkey FOREIGN KEY (mat_hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE, - ADD CONSTRAINT continuous_agg_raw_hypertable_id_fkey FOREIGN KEY (raw_hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; -ALTER TABLE _timescaledb_catalog.continuous_aggs_bucket_function - ADD CONSTRAINT continuous_aggs_bucket_function_mat_hypertable_id_fkey FOREIGN KEY (mat_hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; -ALTER TABLE _timescaledb_catalog.continuous_aggs_invalidation_threshold - ADD CONSTRAINT continuous_aggs_invalidation_threshold_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; -ALTER TABLE _timescaledb_catalog.dimension - ADD CONSTRAINT dimension_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; -ALTER TABLE _timescaledb_catalog.hypertable_compression - ADD CONSTRAINT hypertable_compression_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; -ALTER TABLE _timescaledb_catalog.hypertable_data_node - ADD CONSTRAINT hypertable_data_node_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id); -ALTER TABLE _timescaledb_catalog.tablespace - ADD CONSTRAINT tablespace_hypertable_id_fkey FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable(id) ON DELETE CASCADE; diff --git a/version.config b/version.config index e0a2d64e926..5c1b1b53072 100644 --- a/version.config +++ b/version.config @@ -1,3 +1,3 @@ -version = 2.12.0-dev -update_from_version = 2.11.2 +version = 2.13.0-dev +update_from_version = 2.12.0 downgrade_to_version = 2.11.2