mirror of https://github.com/citusdata/citus.git
248 lines
8.7 KiB
Plaintext
248 lines
8.7 KiB
Plaintext
SHOW server_version \gset
|
|
SELECT substring(:'server_version', '\d+')::int > 12 AS server_version_above_twelve
|
|
\gset
|
|
\if :server_version_above_twelve
|
|
\else
|
|
\q
|
|
\endif
|
|
create schema test_pg13;
|
|
set search_path to test_pg13;
|
|
SET citus.shard_replication_factor to 1;
|
|
SET citus.shard_count to 2;
|
|
SET citus.next_shard_id TO 65000;
|
|
-- Ensure tuple data in explain analyze output is the same on all PG versions
|
|
SET citus.enable_binary_protocol = TRUE;
|
|
CREATE TABLE dist_table (name char, age int);
|
|
CREATE INDEX name_index on dist_table(name);
|
|
SELECT create_distributed_table('dist_table', 'name');
|
|
create_distributed_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
SET client_min_messages to DEBUG1;
|
|
SET citus.log_remote_commands to ON;
|
|
-- make sure vacuum parallel doesn't error out
|
|
VACUUM (PARALLEL 2) dist_table;
|
|
NOTICE: issuing VACUUM (PARALLEL 2) test_pg13.dist_table_65000
|
|
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
|
NOTICE: issuing VACUUM (PARALLEL 2) test_pg13.dist_table_65001
|
|
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
|
VACUUM (PARALLEL 0) dist_table;
|
|
NOTICE: issuing VACUUM (PARALLEL 0) test_pg13.dist_table_65000
|
|
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
|
NOTICE: issuing VACUUM (PARALLEL 0) test_pg13.dist_table_65001
|
|
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
|
-- This should error out since -5 is not valid.
|
|
VACUUM (PARALLEL -5) dist_table;
|
|
ERROR: parallel vacuum degree must be between 0 and 1024
|
|
-- This should error out since no number is given
|
|
VACUUM (PARALLEL) dist_table;
|
|
ERROR: parallel option requires a value between 0 and 1024
|
|
RESET client_min_messages;
|
|
RESET citus.log_remote_commands;
|
|
-- test alter table alter column drop expression
|
|
CREATE TABLE generated_col_table(a int, b int GENERATED ALWAYS AS (a * 10) STORED);
|
|
SELECT create_distributed_table('generated_col_table', 'a');
|
|
create_distributed_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
INSERT INTO generated_col_table VALUES (1);
|
|
-- Make sure that we currently error out
|
|
ALTER TABLE generated_col_table ALTER COLUMN b DROP EXPRESSION;
|
|
ERROR: alter table command is currently unsupported
|
|
DETAIL: Only ADD|DROP COLUMN, SET|DROP NOT NULL, SET|DROP DEFAULT, ADD|DROP|VALIDATE CONSTRAINT, SET (), RESET (), ATTACH|DETACH PARTITION and TYPE subcommands are supported.
|
|
-- alter view rename column works fine
|
|
CREATE VIEW v AS SELECT * FROM dist_table;
|
|
ALTER VIEW v RENAME age to new_age;
|
|
SELECT * FROM v;
|
|
name | new_age
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
-- row suffix notation works fine
|
|
CREATE TABLE ab (a int, b int);
|
|
SELECT create_distributed_table('ab','a');
|
|
create_distributed_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
INSERT INTO ab SELECT i, 2 * i FROM generate_series(1,20)i;
|
|
SELECT * FROM ab WHERE (ROW(a,b)).f1 > (ROW(10,30)).f1 ORDER BY 1,2;
|
|
a | b
|
|
---------------------------------------------------------------------
|
|
11 | 22
|
|
12 | 24
|
|
13 | 26
|
|
14 | 28
|
|
15 | 30
|
|
16 | 32
|
|
17 | 34
|
|
18 | 36
|
|
19 | 38
|
|
20 | 40
|
|
(10 rows)
|
|
|
|
SELECT * FROM ab WHERE (ROW(a,b)).f2 > (ROW(0,38)).f2 ORDER BY 1,2;
|
|
a | b
|
|
---------------------------------------------------------------------
|
|
20 | 40
|
|
(1 row)
|
|
|
|
-- test normalized
|
|
CREATE TABLE text_table (name text);
|
|
SELECT create_distributed_table('text_table', 'name');
|
|
create_distributed_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
INSERT INTO text_table VALUES ('abc');
|
|
-- not normalized
|
|
INSERT INTO text_table VALUES (U&'\0061\0308bc');
|
|
SELECT name IS NORMALIZED FROM text_table ORDER BY 1;
|
|
is_normalized
|
|
---------------------------------------------------------------------
|
|
f
|
|
t
|
|
(2 rows)
|
|
|
|
SELECT is_normalized(name) FROM text_table ORDER BY 1;
|
|
is_normalized
|
|
---------------------------------------------------------------------
|
|
f
|
|
t
|
|
(2 rows)
|
|
|
|
SELECT normalize(name) FROM text_table ORDER BY 1;
|
|
normalize
|
|
---------------------------------------------------------------------
|
|
abc
|
|
äbc
|
|
(2 rows)
|
|
|
|
INSERT INTO text_table VALUES (normalize(U&'\0061\0308bc', NFC));
|
|
-- test unicode escape
|
|
-- insert the word 'data' with unicode escapes
|
|
INSERT INTO text_table VALUES(U&'d\0061t\+000061');
|
|
-- insert the word слон
|
|
INSERT INTO text_table VALUES(U&'\0441\043B\043E\043D');
|
|
SELECT * FROM text_table ORDER BY 1;
|
|
name
|
|
---------------------------------------------------------------------
|
|
abc
|
|
äbc
|
|
data
|
|
äbc
|
|
слон
|
|
(5 rows)
|
|
|
|
-- Test that we don't propagate base types
|
|
CREATE TYPE myvarchar;
|
|
CREATE FUNCTION myvarcharin(cstring, oid, integer) RETURNS myvarchar
|
|
LANGUAGE internal IMMUTABLE PARALLEL SAFE STRICT AS 'varcharin';
|
|
NOTICE: return type myvarchar is only a shell
|
|
CREATE FUNCTION myvarcharout(myvarchar) RETURNS cstring
|
|
LANGUAGE internal IMMUTABLE PARALLEL SAFE STRICT AS 'varcharout';
|
|
NOTICE: argument type myvarchar is only a shell
|
|
CREATE TYPE myvarchar (
|
|
input = myvarcharin,
|
|
output = myvarcharout,
|
|
alignment = integer,
|
|
storage = main
|
|
);
|
|
CREATE TABLE my_table (a int, b myvarchar);
|
|
-- this will error because it seems that we don't propagate the "BASE TYPES"
|
|
-- Alter table also errors out so this doesn't seem to apply to use:
|
|
-- """Add ALTER TYPE options useful for extensions,
|
|
-- like TOAST and I/O functions control (Tomas Vondra, Tom Lane)"""
|
|
SELECT create_distributed_table('my_table', 'a');
|
|
ERROR: type "test_pg13.myvarchar" does not exist
|
|
CONTEXT: while executing command on localhost:xxxxx
|
|
CREATE TABLE test_table(a int, b tsvector);
|
|
SELECT create_distributed_table('test_table', 'a');
|
|
create_distributed_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
-- operator class options are supported
|
|
CREATE INDEX test_table_index ON test_table USING gist (b tsvector_ops(siglen = 100));
|
|
-- testing WAL
|
|
CREATE TABLE test_wal(a int, b int);
|
|
-- test WAL without ANALYZE, this should raise an error
|
|
EXPLAIN (WAL) INSERT INTO test_wal VALUES(1,11);
|
|
ERROR: EXPLAIN option WAL requires ANALYZE
|
|
-- test WAL working properly for router queries
|
|
EXPLAIN (ANALYZE TRUE, WAL TRUE, COSTS FALSE, SUMMARY FALSE, BUFFERS FALSE, TIMING FALSE)
|
|
INSERT INTO test_wal VALUES(1,11);
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Insert on test_wal (actual rows=0 loops=1)
|
|
WAL: records=1 bytes=63
|
|
-> Result (actual rows=1 loops=1)
|
|
(3 rows)
|
|
|
|
SELECT create_distributed_table('test_wal', 'a');
|
|
NOTICE: Copying data from local table...
|
|
NOTICE: copying the data has completed
|
|
DETAIL: The local data in the table is no longer visible, but is still on disk.
|
|
HINT: To remove the local data, run: SELECT truncate_local_data_after_distributing_table($$test_pg13.test_wal$$)
|
|
create_distributed_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
EXPLAIN (ANALYZE TRUE, WAL TRUE, COSTS FALSE, SUMMARY FALSE, BUFFERS FALSE, TIMING FALSE)
|
|
INSERT INTO test_wal VALUES(2,22);
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Custom Scan (Citus Adaptive) (actual rows=0 loops=1)
|
|
Task Count: 1
|
|
Tasks Shown: All
|
|
-> Task
|
|
Node: host=localhost port=xxxxx dbname=regression
|
|
-> Insert on test_wal_65013 (actual rows=0 loops=1)
|
|
WAL: records=1 bytes=63
|
|
-> Result (actual rows=1 loops=1)
|
|
(8 rows)
|
|
|
|
-- Test WAL working for multi-shard query
|
|
SET citus.explain_all_tasks TO on;
|
|
EXPLAIN (ANALYZE TRUE, WAL TRUE, COSTS FALSE, SUMMARY FALSE, BUFFERS FALSE, TIMING FALSE)
|
|
INSERT INTO test_wal VALUES(3,33),(4,44),(5,55) RETURNING *;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Custom Scan (Citus Adaptive) (actual rows=3 loops=1)
|
|
Task Count: 1
|
|
Tuple data received from nodes: 24 bytes
|
|
Tasks Shown: All
|
|
-> Task
|
|
Tuple data received from node: 24 bytes
|
|
Node: host=localhost port=xxxxx dbname=regression
|
|
-> Insert on test_wal_65012 citus_table_alias (actual rows=3 loops=1)
|
|
WAL: records=3 bytes=189
|
|
-> Values Scan on "*VALUES*" (actual rows=3 loops=1)
|
|
(10 rows)
|
|
|
|
-- make sure WAL works in distributed subplans
|
|
-- this test has different output for pg14 and here we mostly test that
|
|
-- we don't get an error, hence we use explain_has_distributed_subplan.
|
|
SELECT public.explain_has_distributed_subplan(
|
|
$$
|
|
EXPLAIN (ANALYZE TRUE, WAL TRUE, COSTS FALSE, SUMMARY FALSE, BUFFERS FALSE, TIMING FALSE)
|
|
WITH cte_1 AS (INSERT INTO test_wal VALUES(6,66),(7,77),(8,88) RETURNING *)
|
|
SELECT * FROM cte_1;
|
|
$$
|
|
);
|
|
explain_has_distributed_subplan
|
|
---------------------------------------------------------------------
|
|
t
|
|
(1 row)
|
|
|
|
SET client_min_messages TO WARNING;
|
|
drop schema test_pg13 cascade;
|