mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-16 02:23:49 +08:00
We currently check and throw an error if the version loaded in the client is different from the installed extension version, however there is no way to recover from this state in a backend. (There is no way to load the new version as we cannot unload the old and no commands can be effectively run). Now, we instead throw a FATAL error which will cause the client to reconnect so it can load the proper extension version.
214 lines
5.0 KiB
SQL
214 lines
5.0 KiB
SQL
-- 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
|
|
\dx
|
|
SELECT 1;
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
CREATE EXTENSION timescaledb VERSION 'mock-1';
|
|
SELECT 1;
|
|
\dx
|
|
|
|
CREATE EXTENSION IF NOT EXISTS timescaledb VERSION 'mock-1';
|
|
CREATE EXTENSION IF NOT EXISTS timescaledb VERSION 'mock-2';
|
|
|
|
DROP EXTENSION timescaledb;
|
|
\set ON_ERROR_STOP 0
|
|
--test that we cannot accidentally load another library version
|
|
CREATE EXTENSION IF NOT EXISTS timescaledb VERSION 'mock-2';
|
|
\set ON_ERROR_STOP 1
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
--no extension
|
|
\dx
|
|
SELECT 1;
|
|
|
|
CREATE EXTENSION timescaledb VERSION 'mock-1';
|
|
--same backend as create extension;
|
|
SELECT 1;
|
|
\dx
|
|
|
|
--start new backend;
|
|
\c :TEST_DBNAME :ROLE_DEFAULT_PERM_USER
|
|
|
|
SELECT 1;
|
|
SELECT 1;
|
|
--test fn call after load
|
|
SELECT mock_function();
|
|
\dx
|
|
|
|
\c :TEST_DBNAME :ROLE_DEFAULT_PERM_USER
|
|
--test fn call as first command
|
|
SELECT mock_function();
|
|
|
|
--use guc to prevent loading
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
SET timescaledb.disable_load = 'on';
|
|
SELECT 1;
|
|
SELECT 1;
|
|
SET timescaledb.disable_load = 'off';
|
|
SELECT 1;
|
|
\set ON_ERROR_STOP 0
|
|
SET timescaledb.disable_load = 'not bool';
|
|
\set ON_ERROR_STOP 1
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
RESET ALL;
|
|
SELECT 1;
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
SET timescaledb.disable_load TO DEFAULT;
|
|
SELECT 1;
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
RESET timescaledb.disable_load;
|
|
SELECT 1;
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
SET timescaledb.other = 'on';
|
|
SELECT 1;
|
|
|
|
\set ON_ERROR_STOP 0
|
|
--cannot update extension after .so of previous version already loaded
|
|
ALTER EXTENSION timescaledb UPDATE TO 'mock-2';
|
|
\set ON_ERROR_STOP 1
|
|
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
\dx
|
|
CREATE EXTENSION timescaledb VERSION 'mock-1';
|
|
\dx
|
|
--start a new backend to update
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
ALTER EXTENSION timescaledb UPDATE TO 'mock-2';
|
|
SELECT 1;
|
|
\dx
|
|
|
|
--drop extension
|
|
DROP EXTENSION timescaledb;
|
|
SELECT 1;
|
|
\dx
|
|
|
|
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
CREATE EXTENSION timescaledb VERSION 'mock-2';
|
|
SELECT 1;
|
|
\dx
|
|
|
|
-- test db 1 still has old version
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
SELECT 1;
|
|
\dx
|
|
|
|
--try a broken upgrade
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
\dx
|
|
\set ON_ERROR_STOP 0
|
|
ALTER EXTENSION timescaledb UPDATE TO 'mock-3';
|
|
\set ON_ERROR_STOP 1
|
|
--should still be on mock-2
|
|
SELECT 1;
|
|
\dx
|
|
|
|
--drop extension
|
|
DROP EXTENSION timescaledb;
|
|
SELECT 1;
|
|
\dx
|
|
|
|
--create extension anew, only upgrade was broken
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
CREATE EXTENSION timescaledb VERSION 'mock-3';
|
|
SELECT 1;
|
|
\dx
|
|
DROP EXTENSION timescaledb;
|
|
SELECT 1;
|
|
|
|
--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
|
|
--mock-4 not installed.
|
|
\dx
|
|
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
--broken version and drop
|
|
CREATE EXTENSION timescaledb VERSION 'mock-broken';
|
|
|
|
\set ON_ERROR_STOP 0
|
|
--intentional broken version
|
|
\dx
|
|
SELECT 1;
|
|
SELECT 1;
|
|
--cannot drop extension; already loaded broken version
|
|
DROP EXTENSION timescaledb;
|
|
\set ON_ERROR_STOP 1
|
|
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
--can drop extension now. Since drop first command.
|
|
DROP EXTENSION timescaledb;
|
|
\dx
|
|
|
|
--broken version and update to fixed
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
CREATE EXTENSION timescaledb VERSION 'mock-broken';
|
|
\set ON_ERROR_STOP 0
|
|
--intentional broken version
|
|
SELECT 1;
|
|
--cannot update extension; already loaded bad version
|
|
ALTER EXTENSION timescaledb UPDATE TO 'mock-5';
|
|
\set ON_ERROR_STOP 1
|
|
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
--can update extension now.
|
|
ALTER EXTENSION timescaledb UPDATE TO 'mock-5';
|
|
SELECT 1;
|
|
SELECT mock_function();
|
|
|
|
\c :TEST_DBNAME_2 :ROLE_SUPERUSER
|
|
ALTER EXTENSION timescaledb UPDATE TO '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
|
|
:command_to_run
|
|
\dx
|
|
|
|
--TEST: create extension when old .so already loaded
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
--force load of extension with (\dx)
|
|
\dx
|
|
DROP EXTENSION timescaledb;
|
|
\dx
|
|
|
|
\set ON_ERROR_STOP 0
|
|
CREATE EXTENSION timescaledb VERSION 'mock-2';
|
|
\set ON_ERROR_STOP 1
|
|
\dx
|
|
--can create in a new session.
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
CREATE EXTENSION timescaledb VERSION 'mock-2';
|
|
\dx
|
|
|
|
--make sure parallel workers started after a 'DISCARD ALL' work
|
|
CREATE TABLE test (i int, j double precision);
|
|
INSERT INTO test SELECT x, x+0.1 FROM generate_series(1,100) AS x;
|
|
|
|
DISCARD ALL;
|
|
SET force_parallel_mode = 'on';
|
|
SET max_parallel_workers_per_gather = 1;
|
|
SELECT count(*) FROM test;
|
|
|
|
-- clean up additional database
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
DROP DATABASE :TEST_DBNAME_2;
|
|
|