mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-22 13:40:56 +08:00
Prior to this change attempting to add a dimension to a distributed hypertable which currently or previously contained data would fail with an opaque error. This change will properly test distributed hypertables when adding dimensions and will print appropriate errors.
164 lines
5.2 KiB
SQL
164 lines
5.2 KiB
SQL
-- This file and its contents are licensed under the Timescale License.
|
|
-- Please see the included NOTICE for copyright information and
|
|
-- LICENSE-TIMESCALE for a copy of the license.
|
|
|
|
\c :TEST_DBNAME :ROLE_CLUSTER_SUPERUSER
|
|
|
|
-- Support for execute_sql_and_filter_server_name_on_error()
|
|
\unset ECHO
|
|
\o /dev/null
|
|
\ir include/remote_exec.sql
|
|
\ir include/filter_exec.sql
|
|
\o
|
|
\set ECHO all
|
|
|
|
-- Cleanup from other potential tests that created these databases
|
|
SET client_min_messages TO ERROR;
|
|
DROP DATABASE IF EXISTS data_node_1;
|
|
DROP DATABASE IF EXISTS data_node_2;
|
|
DROP DATABASE IF EXISTS data_node_3;
|
|
SET client_min_messages TO NOTICE;
|
|
|
|
SELECT * FROM add_data_node('data_node_1', host => 'localhost',
|
|
database => 'data_node_1');
|
|
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
|
|
database => 'data_node_2');
|
|
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
|
|
database => 'data_node_3');
|
|
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;
|
|
|
|
\des+
|
|
|
|
RESET ROLE;
|
|
CREATE FUNCTION _timescaledb_internal.invoke_distributed_commands()
|
|
RETURNS void
|
|
AS :TSL_MODULE_PATHNAME, 'ts_invoke_distributed_commands'
|
|
LANGUAGE C STRICT;
|
|
|
|
CREATE FUNCTION _timescaledb_internal.invoke_faulty_distributed_command()
|
|
RETURNS void
|
|
AS :TSL_MODULE_PATHNAME, 'ts_invoke_faulty_distributed_command'
|
|
LANGUAGE C STRICT;
|
|
SET ROLE :ROLE_1;
|
|
|
|
SELECT _timescaledb_internal.invoke_distributed_commands();
|
|
|
|
\c data_node_1
|
|
\dt
|
|
SELECT * FROM disttable1;
|
|
\c data_node_2
|
|
\dt
|
|
SELECT * FROM disttable1;
|
|
\c data_node_3
|
|
\dt
|
|
SELECT * FROM disttable1;
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
SET ROLE :ROLE_1;
|
|
|
|
-- Verify failed insert command gets fully rolled back
|
|
\set ON_ERROR_STOP 0
|
|
SELECT _timescaledb_internal.invoke_faulty_distributed_command();
|
|
\set ON_ERROR_STOP 1
|
|
|
|
\c data_node_1
|
|
SELECT * from disttable2;
|
|
\c data_node_2
|
|
SELECT * from disttable2;
|
|
|
|
-- Test connection session identity
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
\unset ECHO
|
|
\o /dev/null
|
|
\ir include/remote_exec.sql
|
|
\o
|
|
\set ECHO all
|
|
|
|
-- Register is_frontend_session() function and test that it returns false for
|
|
-- connections openned by test suite. This simualates behaviour expected
|
|
-- with a client connections.
|
|
CREATE OR REPLACE FUNCTION is_frontend_session()
|
|
RETURNS BOOL
|
|
AS :TSL_MODULE_PATHNAME, 'ts_test_is_frontend_session' LANGUAGE C;
|
|
|
|
\c data_node_1
|
|
CREATE OR REPLACE FUNCTION is_frontend_session()
|
|
RETURNS BOOL
|
|
AS :TSL_MODULE_PATHNAME, 'ts_test_is_frontend_session' LANGUAGE C;
|
|
SELECT is_frontend_session();
|
|
|
|
\c data_node_2
|
|
CREATE OR REPLACE FUNCTION is_frontend_session()
|
|
RETURNS BOOL
|
|
AS :TSL_MODULE_PATHNAME, 'ts_test_is_frontend_session' LANGUAGE C;
|
|
SELECT is_frontend_session();
|
|
|
|
\c data_node_3
|
|
CREATE OR REPLACE FUNCTION is_frontend_session()
|
|
RETURNS BOOL
|
|
AS :TSL_MODULE_PATHNAME, 'ts_test_is_frontend_session' LANGUAGE C;
|
|
SELECT is_frontend_session();
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
SET ROLE :ROLE_1;
|
|
SELECT is_frontend_session();
|
|
|
|
-- Ensure peer dist id is already set and can be set only once
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM test.remote_exec('{data_node_1}', $$ SELECT * FROM _timescaledb_internal.set_peer_dist_id('77348176-09da-4a80-bc78-e31bdf5e63ec'); $$);
|
|
\set ON_ERROR_STOP 1
|
|
|
|
-- Repeat is_frontend_session() test again, but this time using connections openned from frontend
|
|
-- to backend nodes. Must return true.
|
|
SELECT * FROM test.remote_exec(NULL, $$ SELECT is_frontend_session(); $$);
|
|
|
|
-- Test distributed_exec()
|
|
|
|
-- Make sure dist session is properly set
|
|
SELECT * FROM distributed_exec('DO $$ BEGIN ASSERT(SELECT is_frontend_session()) = true; END; $$;');
|
|
|
|
-- Test creating and dropping a table
|
|
SELECT * FROM distributed_exec('CREATE TABLE dist_test (id int)');
|
|
SELECT * FROM distributed_exec('INSERT INTO dist_test values (7)');
|
|
SELECT * FROM test.remote_exec(NULL, $$ SELECT * from dist_test; $$);
|
|
SELECT * FROM distributed_exec('DROP TABLE dist_test');
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM distributed_exec('INSERT INTO dist_test VALUES (8)', '{data_node_1}');
|
|
\set ON_ERROR_STOP 1
|
|
|
|
-- Test creating and dropping a role
|
|
CREATE ROLE dist_test_role;
|
|
-- Expect this to be an error, since data nodes are created on the same instance
|
|
\set ON_ERROR_STOP 0
|
|
SELECT test.execute_sql_and_filter_data_node_name_on_error($$
|
|
SELECT * FROM distributed_exec('CREATE ROLE dist_test_role');
|
|
$$);
|
|
\set ON_ERROR_STOP 1
|
|
SELECT * FROM test.remote_exec(NULL, $$ SELECT true from pg_catalog.pg_roles WHERE rolname = 'dist_test_role'; $$);
|
|
DROP ROLE DIST_TEST_ROLE;
|
|
\set ON_ERROR_STOP 0
|
|
SELECT test.execute_sql_and_filter_data_node_name_on_error($$
|
|
SELECT * FROM distributed_exec('DROP ROLE dist_test_role');
|
|
$$);
|
|
\set ON_ERROR_STOP 1
|
|
|
|
-- Do not allow to run distributed_exec() on a data nodes
|
|
\c data_node_1
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM distributed_exec('SELECT 1');
|
|
\set ON_ERROR_STOP 1
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
DROP DATABASE data_node_1;
|
|
DROP DATABASE data_node_2;
|
|
DROP DATABASE data_node_3;
|
|
|
|
-- Test TS execution on non-TSDB server
|
|
CREATE EXTENSION postgres_fdw;
|
|
CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw
|
|
OPTIONS (host 'foo', dbname 'foodb', port '5432');
|
|
\set ON_ERROR_STOP 0
|
|
SELECT * FROM test.remote_exec('{myserver}', $$ SELECT 1; $$);
|
|
\set ON_ERROR_STOP 1
|
|
DROP SERVER myserver;
|
|
DROP EXTENSION postgres_fdw;
|