diff --git a/.unreleased/allow-alter-extension-in-transaction b/.unreleased/allow-alter-extension-in-transaction new file mode 100644 index 00000000000..d3c7f90e7ae --- /dev/null +++ b/.unreleased/allow-alter-extension-in-transaction @@ -0,0 +1 @@ +Fixes: #10313 Allow running ALTER EXTENSION timescaledb UPDATE inside a transaction block diff --git a/src/loader/loader.c b/src/loader/loader.c index 51b6a9c1453..cab81096c2b 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -392,6 +392,27 @@ should_load_on_create_extension(Node const *const utility_stmt, TsExtension cons return false; } +static bool +should_load_on_transaction(Node const *const utility_stmt) +{ + TransactionStmt *stmt = (TransactionStmt *) utility_stmt; + + /* + * Do not load the extension just to open a transaction. This lets ALTER + * EXTENSION ... UPDATE run as the first extension-touching command inside + * a transaction block instead of failing because BEGIN already loaded the + * old version. + */ + switch (stmt->kind) + { + case TRANS_STMT_BEGIN: + case TRANS_STMT_START: + return false; + default: + return true; + } +} + static bool load_utility_cmd(Node const *const utility_stmt, TsExtension const *const ext) { @@ -403,6 +424,8 @@ load_utility_cmd(Node const *const utility_stmt, TsExtension const *const ext) return should_load_on_alter_extension(utility_stmt, ext); case T_CreateExtensionStmt: return should_load_on_create_extension(utility_stmt, ext); + case T_TransactionStmt: + return should_load_on_transaction(utility_stmt); case T_DropStmt: return !drop_statement_drops_extension((DropStmt *) utility_stmt, ext); default: diff --git a/test/expected/loader-oss.out b/test/expected/loader-oss.out deleted file mode 100644 index cf47fa1bb6d..00000000000 --- a/test/expected/loader-oss.out +++ /dev/null @@ -1,560 +0,0 @@ --- This file and its contents are licensed under the Apache License 2.0. --- Please see the included NOTICE for copyright information and --- LICENSE-APACHE for a copy of the license. -\set TEST_DBNAME_2 :TEST_DBNAME _2 -\c :TEST_DBNAME :ROLE_SUPERUSER -CREATE DATABASE :"TEST_DBNAME_2"; -DROP EXTENSION timescaledb; ---no extension -SELECT * FROM test.extension; - List of installed extensions - Name | Version | Schema | Description ----------+---------+------------+------------------------------ - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language -(1 row) - -SELECT 1; - ?column? ----------- - 1 -(1 row) - -\c :TEST_DBNAME :ROLE_SUPERUSER -CREATE EXTENSION timescaledb VERSION 'mock-1'; -WARNING: mock init "mock-1" -SELECT 1; -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-1" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-1 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - -CREATE EXTENSION IF NOT EXISTS timescaledb VERSION 'mock-1'; -WARNING: mock post_analyze_hook "mock-1" -NOTICE: extension "timescaledb" already exists, skipping -CREATE EXTENSION IF NOT EXISTS timescaledb VERSION 'mock-2'; -WARNING: mock post_analyze_hook "mock-1" -NOTICE: extension "timescaledb" already exists, skipping -DROP EXTENSION timescaledb; -WARNING: mock post_analyze_hook "mock-1" -\set ON_ERROR_STOP 0 ---test that we cannot accidentally load another library version -CREATE EXTENSION IF NOT EXISTS timescaledb VERSION 'mock-2'; -ERROR: extension "timescaledb" has already been loaded with another version -\set ON_ERROR_STOP 1 -\c :TEST_DBNAME :ROLE_SUPERUSER ---no extension -SELECT * FROM test.extension; - List of installed extensions - Name | Version | Schema | Description ----------+---------+------------+------------------------------ - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language -(1 row) - -SELECT 1; - ?column? ----------- - 1 -(1 row) - -CREATE EXTENSION timescaledb VERSION 'mock-1'; -WARNING: mock init "mock-1" ---same backend as create extension; -SELECT 1; -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-1" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-1 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - ---start new backend; -\c :TEST_DBNAME :ROLE_DEFAULT_PERM_USER -SELECT 1; -WARNING: mock init "mock-1" -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - -SELECT 1; -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - ---test fn call after load -SELECT mock_function(); -WARNING: mock post_analyze_hook "mock-1" -WARNING: mock function call "mock-1" - mock_function ---------------- - -(1 row) - -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-1" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-1 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - -\c :TEST_DBNAME :ROLE_DEFAULT_PERM_USER ---test fn call as first command -SELECT mock_function(); -WARNING: mock init "mock-1" -WARNING: mock post_analyze_hook "mock-1" -WARNING: mock function call "mock-1" - mock_function ---------------- - -(1 row) - ---use guc to prevent loading -\c :TEST_DBNAME :ROLE_SUPERUSER -SET timescaledb.disable_load = 'on'; -SELECT 1; - ?column? ----------- - 1 -(1 row) - -SELECT 1; - ?column? ----------- - 1 -(1 row) - -SET timescaledb.disable_load = 'off'; -SELECT 1; -WARNING: mock init "mock-1" -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - -\set ON_ERROR_STOP 0 -SET timescaledb.disable_load = 'not bool'; -WARNING: mock post_analyze_hook "mock-1" -ERROR: parameter "timescaledb.disable_load" requires a Boolean value -\set ON_ERROR_STOP 1 -\c :TEST_DBNAME :ROLE_SUPERUSER -RESET ALL; -WARNING: mock init "mock-1" -WARNING: mock post_analyze_hook "mock-1" -SELECT 1; -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - -\c :TEST_DBNAME :ROLE_SUPERUSER -SET timescaledb.disable_load TO DEFAULT; -SELECT 1; -WARNING: mock init "mock-1" -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - -\c :TEST_DBNAME :ROLE_SUPERUSER -RESET timescaledb.disable_load; -SELECT 1; -WARNING: mock init "mock-1" -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - -\c :TEST_DBNAME :ROLE_SUPERUSER -SET timescaledb.other = 'on'; -WARNING: mock init "mock-1" -WARNING: mock post_analyze_hook "mock-1" -SELECT 1; -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - -\set ON_ERROR_STOP 0 ---cannot update extension after .so of previous version already loaded -ALTER EXTENSION timescaledb UPDATE TO 'mock-2'; -ERROR: extension "timescaledb" cannot be updated after the old version has already been loaded -\set ON_ERROR_STOP 1 -\c :TEST_DBNAME_2 :ROLE_SUPERUSER -SELECT * FROM test.extension; - List of installed extensions - Name | Version | Schema | Description ----------+---------+------------+------------------------------ - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language -(1 row) - -CREATE EXTENSION timescaledb VERSION 'mock-1'; -WARNING: mock init "mock-1" -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-1" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-1 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - ---start a new backend to update -\c :TEST_DBNAME_2 :ROLE_SUPERUSER -ALTER EXTENSION timescaledb UPDATE TO 'mock-2'; -WARNING: mock init "mock-2" -SELECT 1; -WARNING: mock post_analyze_hook "mock-2" - ?column? ----------- - 1 -(1 row) - -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-2" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-2 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - ---drop extension -DROP EXTENSION timescaledb; -WARNING: mock post_analyze_hook "mock-2" -SELECT 1; - ?column? ----------- - 1 -(1 row) - -SELECT * FROM test.extension; - List of installed extensions - Name | Version | Schema | Description ----------+---------+------------+------------------------------ - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language -(1 row) - -\c :TEST_DBNAME_2 :ROLE_SUPERUSER -CREATE EXTENSION timescaledb VERSION 'mock-2'; -WARNING: mock init "mock-2" -SELECT 1; -WARNING: mock post_analyze_hook "mock-2" - ?column? ----------- - 1 -(1 row) - -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-2" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-2 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - --- test db 1 still has old version -\c :TEST_DBNAME :ROLE_SUPERUSER -SELECT 1; -WARNING: mock init "mock-1" -WARNING: mock post_analyze_hook "mock-1" - ?column? ----------- - 1 -(1 row) - -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-1" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-1 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - ---try a broken upgrade -\c :TEST_DBNAME_2 :ROLE_SUPERUSER -SELECT * FROM test.extension; -WARNING: mock init "mock-2" -WARNING: mock post_analyze_hook "mock-2" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-2 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - -\set ON_ERROR_STOP 0 -ALTER EXTENSION timescaledb UPDATE TO 'mock-3'; -ERROR: extension "timescaledb" cannot be updated after the old version has already been loaded -\set ON_ERROR_STOP 1 ---should still be on mock-2 -SELECT 1; -WARNING: mock post_analyze_hook "mock-2" - ?column? ----------- - 1 -(1 row) - -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-2" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-2 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - ---drop extension -DROP EXTENSION timescaledb; -WARNING: mock post_analyze_hook "mock-2" -SELECT 1; - ?column? ----------- - 1 -(1 row) - -SELECT * FROM test.extension; - List of installed extensions - Name | Version | Schema | Description ----------+---------+------------+------------------------------ - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language -(1 row) - ---create extension anew, only upgrade was broken -\c :TEST_DBNAME_2 :ROLE_SUPERUSER -CREATE EXTENSION timescaledb VERSION 'mock-3'; -WARNING: mock init "mock-3" -SELECT 1; -WARNING: mock post_analyze_hook "mock-3" - ?column? ----------- - 1 -(1 row) - -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-3" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-3 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - -DROP EXTENSION timescaledb; -WARNING: mock post_analyze_hook "mock-3" -SELECT 1; - ?column? ----------- - 1 -(1 row) - ---mismatched version errors -\c :TEST_DBNAME_2 :ROLE_SUPERUSER ---mock-4 has mismatched versions, so the .so load should be fatal -SELECT format($$\! utils/test_fatal_command.sh %1$s "CREATE EXTENSION timescaledb VERSION 'mock-4'"$$, :'TEST_DBNAME_2') as command_to_run \gset -:command_to_run -FATAL: extension "timescaledb" version mismatch: shared library version mock-4-mismatch; SQL version mock-4 -server closed the connection unexpectedly - This probably means the server terminated abnormally - before or while processing the request. -connection to server was lost ---mock-4 not installed. -SELECT * FROM test.extension; - List of installed extensions - Name | Version | Schema | Description ----------+---------+------------+------------------------------ - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language -(1 row) - -\c :TEST_DBNAME_2 :ROLE_SUPERUSER ---broken version and drop -CREATE EXTENSION timescaledb VERSION 'mock-broken'; -WARNING: mock init "mock-broken" -\set ON_ERROR_STOP 0 ---intentional broken version -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-broken" -ERROR: mock broken "mock-broken" -SELECT 1; -WARNING: mock post_analyze_hook "mock-broken" -ERROR: mock broken "mock-broken" -SELECT 1; -WARNING: mock post_analyze_hook "mock-broken" -ERROR: mock broken "mock-broken" ---cannot drop extension; already loaded broken version -DROP EXTENSION timescaledb; -WARNING: mock post_analyze_hook "mock-broken" -ERROR: mock broken "mock-broken" -\set ON_ERROR_STOP 1 -\c :TEST_DBNAME_2 :ROLE_SUPERUSER ---can drop extension now. Since drop first command. -DROP EXTENSION timescaledb; -SELECT * FROM test.extension; - List of installed extensions - Name | Version | Schema | Description ----------+---------+------------+------------------------------ - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language -(1 row) - ---broken version and update to fixed -\c :TEST_DBNAME_2 :ROLE_SUPERUSER -CREATE EXTENSION timescaledb VERSION 'mock-broken'; -WARNING: mock init "mock-broken" -\set ON_ERROR_STOP 0 ---intentional broken version -SELECT 1; -WARNING: mock post_analyze_hook "mock-broken" -ERROR: mock broken "mock-broken" ---cannot update extension; already loaded bad version -ALTER EXTENSION timescaledb UPDATE TO 'mock-5'; -ERROR: extension "timescaledb" cannot be updated after the old version has already been loaded -\set ON_ERROR_STOP 1 -\c :TEST_DBNAME_2 :ROLE_SUPERUSER ---can update extension now. -ALTER EXTENSION timescaledb UPDATE TO 'mock-5'; -WARNING: mock init "mock-5" -SELECT 1; -WARNING: mock post_analyze_hook "mock-5" - ?column? ----------- - 1 -(1 row) - -SELECT mock_function(); -WARNING: mock post_analyze_hook "mock-5" -WARNING: mock function call "mock-5" - mock_function ---------------- - -(1 row) - -\c :TEST_DBNAME_2 :ROLE_SUPERUSER -ALTER EXTENSION timescaledb UPDATE TO 'mock-6'; -WARNING: mock init "mock-6" ---The mock-5->mock_6 upgrade is intentionally broken. ---The mock_function was never changed to point to mock-6 in the update script. ---Thus mock_function is defined incorrectly to point to the mock-5.so ---This will now be a FATAL error. -SELECT format($$\! utils/test_fatal_command.sh %1$s "SELECT mock_function()"$$, :'TEST_DBNAME_2') as command_to_run \gset -WARNING: mock post_analyze_hook "mock-6" -:command_to_run -WARNING: mock init "mock-6" -WARNING: mock post_analyze_hook "mock-6" -FATAL: extension "timescaledb" version mismatch: shared library version mock-5; SQL version mock-6 -server closed the connection unexpectedly - This probably means the server terminated abnormally - before or while processing the request. -connection to server was lost -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-6" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-6 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - ---TEST: create extension when old .so already loaded -\c :TEST_DBNAME :ROLE_SUPERUSER ---force load of extension with (SELECT * FROM test.extension;) -SELECT * FROM test.extension; -WARNING: mock init "mock-1" -WARNING: mock post_analyze_hook "mock-1" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-1 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - -DROP EXTENSION timescaledb; -WARNING: mock post_analyze_hook "mock-1" -SELECT * FROM test.extension; - List of installed extensions - Name | Version | Schema | Description ----------+---------+------------+------------------------------ - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language -(1 row) - -\set ON_ERROR_STOP 0 -CREATE EXTENSION timescaledb VERSION 'mock-2'; -ERROR: extension "timescaledb" has already been loaded with another version -\set ON_ERROR_STOP 1 -SELECT * FROM test.extension; - List of installed extensions - Name | Version | Schema | Description ----------+---------+------------+------------------------------ - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language -(1 row) - ---can create in a new session. -\c :TEST_DBNAME :ROLE_SUPERUSER -CREATE EXTENSION timescaledb VERSION 'mock-2'; -WARNING: mock init "mock-2" -SELECT * FROM test.extension; -WARNING: mock post_analyze_hook "mock-2" - List of installed extensions - Name | Version | Schema | Description --------------+---------+------------+------------------------------------------------------------------- - plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language - timescaledb | mock-2 | public | Enables scalable inserts and complex queries for time-series data -(2 rows) - ---make sure parallel workers started after a 'DISCARD ALL' work -CREATE TABLE test (i int, j double precision); -WARNING: mock post_analyze_hook "mock-2" -INSERT INTO test SELECT x, x+0.1 FROM generate_series(1,100) AS x; -WARNING: mock post_analyze_hook "mock-2" -DISCARD ALL; -WARNING: mock post_analyze_hook "mock-2" -SELECT set_config(CASE WHEN current_setting('server_version_num')::int < 160000 THEN 'force_parallel_mode' ELSE 'debug_parallel_query' END,'on', false); -WARNING: mock post_analyze_hook "mock-2" - set_config ------------- - on -(1 row) - -SET max_parallel_workers_per_gather = 1; -WARNING: mock post_analyze_hook "mock-2" -SELECT count(*) FROM test; -WARNING: mock post_analyze_hook "mock-2" -WARNING: mock init "mock-2" - count -------- - 100 -(1 row) - --- clean up additional database -\c :TEST_DBNAME :ROLE_SUPERUSER -DROP DATABASE :"TEST_DBNAME_2" WITH (FORCE); -WARNING: mock init "mock-2" -WARNING: mock post_analyze_hook "mock-2" diff --git a/test/expected/loader-tsl.out b/test/expected/loader.out similarity index 94% rename from test/expected/loader-tsl.out rename to test/expected/loader.out index c74687991cb..74ac0b865f3 100644 --- a/test/expected/loader-tsl.out +++ b/test/expected/loader.out @@ -191,6 +191,28 @@ SELECT * FROM test.extension; plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language timescaledb | mock-2 | public | Enables scalable inserts and complex queries for time-series data +--ALTER EXTENSION UPDATE works inside a transaction block; BEGIN must not +--load the old version before UPDATE runs as the first command. +DROP EXTENSION timescaledb; +\c :TEST_DBNAME_2 :ROLE_SUPERUSER +CREATE EXTENSION timescaledb VERSION 'mock-1'; +WARNING: mock init "mock-1" +\c :TEST_DBNAME_2 :ROLE_SUPERUSER +BEGIN; +ALTER EXTENSION timescaledb UPDATE TO 'mock-2'; +WARNING: mock init "mock-2" +COMMIT; +SELECT 1; + ?column? +---------- + 1 + +SELECT * FROM test.extension; + Name | Version | Schema | Description +-------------+---------+------------+------------------------------------------------------------------- + plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language + timescaledb | mock-2 | public | Enables scalable inserts and complex queries for time-series data + --drop extension DROP EXTENSION timescaledb; SELECT 1; diff --git a/test/sql/.gitignore b/test/sql/.gitignore index 923e845cacd..800e24ab2ae 100644 --- a/test/sql/.gitignore +++ b/test/sql/.gitignore @@ -19,4 +19,3 @@ /rowsecurity-*.sql /timestamp-*.sql /ts_merge-*.sql -/loader-*.sql diff --git a/test/sql/CMakeLists.txt b/test/sql/CMakeLists.txt index 857e4918be3..d801124ce94 100644 --- a/test/sql/CMakeLists.txt +++ b/test/sql/CMakeLists.txt @@ -85,12 +85,6 @@ set(TEST_TEMPLATES plan_expand_hypertable.sql.in ts_merge.sql.in) -# Loader test must distinguish between Apache and TSL builds so we parametrize -# this here -set(LOADER_TEST_FILE loader-${TEST_LICENSE_SUFFIX}) -configure_file(loader.sql.in - ${CMAKE_CURRENT_SOURCE_DIR}/${LOADER_TEST_FILE}.sql) - # tests that fail or are unreliable when run in parallel bgw tests need to run # first otherwise they are flaky set(SOLO_TESTS @@ -104,7 +98,7 @@ set(SOLO_TESTS telemetry net) -list(APPEND SOLO_TESTS ${LOADER_TEST_FILE}) +list(APPEND SOLO_TESTS loader) if(CMAKE_BUILD_TYPE MATCHES Debug) list( @@ -122,7 +116,7 @@ if(CMAKE_BUILD_TYPE MATCHES Debug) symbol_conflict.sql test_tss_callbacks.sql test_utils.sql - ${LOADER_TEST_FILE}.sql) + loader.sql) if(USE_TELEMETRY) list(APPEND TEST_FILES telemetry.sql) endif() diff --git a/test/sql/loader.sql.in b/test/sql/loader.sql similarity index 93% rename from test/sql/loader.sql.in rename to test/sql/loader.sql index 461ca35b941..c9be2e67718 100644 --- a/test/sql/loader.sql.in +++ b/test/sql/loader.sql @@ -93,6 +93,18 @@ ALTER EXTENSION timescaledb UPDATE TO 'mock-2'; SELECT 1; SELECT * FROM test.extension; +--ALTER EXTENSION UPDATE works inside a transaction block; BEGIN must not +--load the old version before UPDATE runs as the first command. +DROP EXTENSION timescaledb; +\c :TEST_DBNAME_2 :ROLE_SUPERUSER +CREATE EXTENSION timescaledb VERSION 'mock-1'; +\c :TEST_DBNAME_2 :ROLE_SUPERUSER +BEGIN; +ALTER EXTENSION timescaledb UPDATE TO 'mock-2'; +COMMIT; +SELECT 1; +SELECT * FROM test.extension; + --drop extension DROP EXTENSION timescaledb; SELECT 1;