mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-15 10:11:29 +08:00
Make the Scanner module more flexible by allowing optional control over when the scanned relation is opened and closed. Relations can then remain open over multiple scans, which can improve performance and efficiency. Closes #2173
122 lines
3.8 KiB
Plaintext
122 lines
3.8 KiB
Plaintext
-- 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.
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
CREATE OR REPLACE FUNCTION test.condition() RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_utils_condition' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
CREATE OR REPLACE FUNCTION test.int64_eq() RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_utils_int64_eq' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
CREATE OR REPLACE FUNCTION test.ptr_eq() RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_utils_ptr_eq' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
CREATE OR REPLACE FUNCTION test.double_eq() RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_utils_double_eq' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER;
|
|
-- We're testing that the test utils work and generate errors on
|
|
-- failing conditions
|
|
\set ON_ERROR_STOP 0
|
|
SELECT test.condition();
|
|
ERROR: TestFailure | (true_value == false_value)
|
|
SELECT test.int64_eq();
|
|
ERROR: TestFailure | (big == small) [32532978 == 3242234]
|
|
SELECT test.ptr_eq();
|
|
ERROR: TestFailure | (true_ptr == false_ptr)
|
|
SELECT test.double_eq();
|
|
ERROR: TestFailure | (big_double == small_double) [923423478.324200 == 324.300000]
|
|
\set ON_ERROR_STOP 1
|
|
-- Test debug points
|
|
--
|
|
\set ECHO all
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
CREATE OR REPLACE FUNCTION debug_point_enable(TEXT)
|
|
RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_debug_point_enable'
|
|
LANGUAGE C VOLATILE STRICT;
|
|
CREATE OR REPLACE FUNCTION debug_point_release(TEXT)
|
|
RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_debug_point_release'
|
|
LANGUAGE C VOLATILE STRICT;
|
|
-- debug point already enabled
|
|
SELECT debug_point_enable('test_debug_point');
|
|
debug_point_enable
|
|
--------------------
|
|
|
|
(1 row)
|
|
|
|
\set ON_ERROR_STOP 0
|
|
SELECT debug_point_enable('test_debug_point');
|
|
ERROR: debug point "test_debug_point" already enabled
|
|
\set ON_ERROR_STOP 1
|
|
SELECT debug_point_release('test_debug_point');
|
|
debug_point_release
|
|
---------------------
|
|
|
|
(1 row)
|
|
|
|
-- debug point not enabled
|
|
\set ON_ERROR_STOP 0
|
|
SELECT debug_point_release('test_debug_point');
|
|
WARNING: you don't own a lock of type ExclusiveLock
|
|
ERROR: cannot release debug point "test_debug_point"
|
|
\set ON_ERROR_STOP 1
|
|
-- error injections
|
|
--
|
|
CREATE OR REPLACE FUNCTION test_error_injection(TEXT)
|
|
RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_error_injection'
|
|
LANGUAGE C VOLATILE STRICT;
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER;
|
|
SELECT test_error_injection('test_error');
|
|
test_error_injection
|
|
----------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT debug_point_enable('test_error');
|
|
debug_point_enable
|
|
--------------------
|
|
|
|
(1 row)
|
|
|
|
\set ON_ERROR_STOP 0
|
|
SELECT test_error_injection('test_error');
|
|
ERROR: error injected at debug point 'test_error'
|
|
\set ON_ERROR_STOP 1
|
|
SELECT debug_point_release('test_error');
|
|
debug_point_release
|
|
---------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT test_error_injection('test_error');
|
|
test_error_injection
|
|
----------------------
|
|
|
|
(1 row)
|
|
|
|
-- Test Scanner
|
|
RESET ROLE;
|
|
CREATE OR REPLACE FUNCTION test.scanner() RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_scanner' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER;
|
|
-- Create two chunks to scan in the test
|
|
CREATE TABLE hyper (time timestamptz, temp float);
|
|
SELECT create_hypertable('hyper', 'time');
|
|
NOTICE: adding not-null constraint to column "time"
|
|
create_hypertable
|
|
--------------------
|
|
(1,public,hyper,t)
|
|
(1 row)
|
|
|
|
INSERT INTO hyper VALUES ('2021-01-01', 1.0), ('2022-01-01', 2.0);
|
|
SELECT test.scanner();
|
|
NOTICE: 1. Scan: "_timescaledb_internal._hyper_1_1_chunk"
|
|
NOTICE: 1. Scan: "_timescaledb_internal._hyper_1_2_chunk"
|
|
NOTICE: 2. Scan with filter: "_timescaledb_internal._hyper_1_1_chunk"
|
|
NOTICE: 3. ReScan: "_timescaledb_internal._hyper_1_2_chunk"
|
|
NOTICE: 4. IndexScan: "_timescaledb_internal._hyper_1_2_chunk"
|
|
scanner
|
|
---------
|
|
|
|
(1 row)
|
|
|