diff --git a/src/test/regress/expected/local_shard_execution.out b/src/test/regress/expected/local_shard_execution.out index 2275661bf..22d79b0f7 100644 --- a/src/test/regress/expected/local_shard_execution.out +++ b/src/test/regress/expected/local_shard_execution.out @@ -47,6 +47,20 @@ SELECT create_distributed_table('collections_list', 'key'); CREATE TABLE collections_list_0 PARTITION OF collections_list (key, ser, ts, collection_id, value) FOR VALUES IN ( 0 ); +-- create a volatile function that returns the local node id +CREATE OR REPLACE FUNCTION get_local_node_id_volatile() +RETURNS INT AS $$ +DECLARE localGroupId int; +BEGIN + SELECT groupid INTO localGroupId FROM pg_dist_local_group; + RETURN localGroupId; +END; $$ language plpgsql VOLATILE; +SELECT create_distributed_function('get_local_node_id_volatile()'); + create_distributed_function +--------------------------------------------------------------------- + +(1 row) + -- connection worker and get ready for the tests \c - - - :worker_1_port SET search_path TO local_shard_execution; @@ -634,6 +648,33 @@ PL/pgSQL function only_local_execution() line 5 at SQL statement NOTICE: executing the command locally: DELETE FROM local_shard_execution.distributed_table_1470001 distributed_table WHERE (key OPERATOR(pg_catalog.=) 1) CONTEXT: SQL statement "DELETE FROM distributed_table WHERE key = 1" PL/pgSQL function only_local_execution() line 6 at SQL statement +-- insert a row that we need in the next tests +INSERT INTO distributed_table VALUES (1, '11',21) ON CONFLICT(key) DO UPDATE SET value = '29'; +NOTICE: executing the command locally: INSERT INTO local_shard_execution.distributed_table_1470001 AS citus_table_alias (key, value, age) VALUES (1, '11'::text, 21) ON CONFLICT(key) DO UPDATE SET value = '29'::text +-- make sure that functions can use local execution +CREATE OR REPLACE PROCEDURE only_local_execution_with_function_evaluation() AS $$ + DECLARE nodeId INT; + BEGIN + -- fast path router + SELECT get_local_node_id_volatile() INTO nodeId FROM distributed_table WHERE key = 1; + IF nodeId <= 0 THEN + RAISE NOTICE 'unexpected node id'; + END IF; + + -- regular router + SELECT get_local_node_id_volatile() INTO nodeId FROM distributed_table d1 JOIN distributed_table d2 USING (key) WHERE d1.key = 1; + IF nodeId <= 0 THEN + RAISE NOTICE 'unexpected node id'; + END IF; + END; +$$ LANGUAGE plpgsql; +CALL only_local_execution_with_function_evaluation(); +NOTICE: executing the command locally: SELECT local_shard_execution.get_local_node_id_volatile() AS get_local_node_id_volatile FROM local_shard_execution.distributed_table_1470001 distributed_table WHERE (key OPERATOR(pg_catalog.=) 1) +CONTEXT: SQL statement "SELECT get_local_node_id_volatile() FROM distributed_table WHERE key = 1" +PL/pgSQL function only_local_execution_with_function_evaluation() line 5 at SQL statement +NOTICE: executing the command locally: SELECT local_shard_execution.get_local_node_id_volatile() AS get_local_node_id_volatile FROM (local_shard_execution.distributed_table_1470001 d1(key, value, age) JOIN local_shard_execution.distributed_table_1470001 d2(key, value, age) USING (key)) WHERE (d1.key OPERATOR(pg_catalog.=) 1) +CONTEXT: SQL statement "SELECT get_local_node_id_volatile() FROM distributed_table d1 JOIN distributed_table d2 USING (key) WHERE d1.key = 1" +PL/pgSQL function only_local_execution_with_function_evaluation() line 11 at SQL statement CREATE OR REPLACE PROCEDURE only_local_execution_with_params(int) AS $$ DECLARE cnt INT; BEGIN @@ -652,6 +693,29 @@ PL/pgSQL function only_local_execution_with_params(integer) line 5 at SQL statem NOTICE: executing the command locally: DELETE FROM local_shard_execution.distributed_table_1470001 distributed_table WHERE (key OPERATOR(pg_catalog.=) 1) CONTEXT: SQL statement "DELETE FROM distributed_table WHERE key = $1" PL/pgSQL function only_local_execution_with_params(integer) line 6 at SQL statement +CREATE OR REPLACE PROCEDURE only_local_execution_with_function_evaluation_param(int) AS $$ + DECLARE nodeId INT; + BEGIN + -- fast path router + SELECT get_local_node_id_volatile() INTO nodeId FROM distributed_table WHERE key = $1; + IF nodeId <= 0 THEN + RAISE NOTICE 'unexpected node id'; + END IF; + + -- regular router + SELECT get_local_node_id_volatile() INTO nodeId FROM distributed_table d1 JOIN distributed_table d2 USING (key) WHERE d1.key = $1; + IF nodeId <= 0 THEN + RAISE NOTICE 'unexpected node id'; + END IF; + END; +$$ LANGUAGE plpgsql; +CALL only_local_execution_with_function_evaluation_param(1); +NOTICE: executing the command locally: SELECT local_shard_execution.get_local_node_id_volatile() AS get_local_node_id_volatile FROM local_shard_execution.distributed_table_1470001 distributed_table WHERE (key OPERATOR(pg_catalog.=) 1) +CONTEXT: SQL statement "SELECT get_local_node_id_volatile() FROM distributed_table WHERE key = $1" +PL/pgSQL function only_local_execution_with_function_evaluation_param(integer) line 5 at SQL statement +NOTICE: executing the command locally: SELECT local_shard_execution.get_local_node_id_volatile() AS get_local_node_id_volatile FROM (local_shard_execution.distributed_table_1470001 d1(key, value, age) JOIN local_shard_execution.distributed_table_1470001 d2(key, value, age) USING (key)) WHERE (d1.key OPERATOR(pg_catalog.=) $1) +CONTEXT: SQL statement "SELECT get_local_node_id_volatile() FROM distributed_table d1 JOIN distributed_table d2 USING (key) WHERE d1.key = $1" +PL/pgSQL function only_local_execution_with_function_evaluation_param(integer) line 11 at SQL statement CREATE OR REPLACE PROCEDURE local_execution_followed_by_dist() AS $$ DECLARE cnt INT; BEGIN diff --git a/src/test/regress/expected/master_evaluation.out b/src/test/regress/expected/master_evaluation.out index 83cdbf932..75d1c403c 100644 --- a/src/test/regress/expected/master_evaluation.out +++ b/src/test/regress/expected/master_evaluation.out @@ -53,50 +53,113 @@ SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table WHERE key = (1 row) -- make sure that it is also true for fast-path router queries with paramaters -PREPARE p1(int) AS SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table WHERE key = $1; -execute p1(1); +PREPARE fast_path_router_with_param(int) AS SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table WHERE key = $1; +execute fast_path_router_with_param(1); ?column? --------------------------------------------------------------------- t (1 row) -execute p1(2); +execute fast_path_router_with_param(2); ?column? --------------------------------------------------------------------- t (1 row) -execute p1(3); +execute fast_path_router_with_param(3); ?column? --------------------------------------------------------------------- t (1 row) -execute p1(4); +execute fast_path_router_with_param(4); ?column? --------------------------------------------------------------------- t (1 row) -execute p1(5); +execute fast_path_router_with_param(5); ?column? --------------------------------------------------------------------- t (1 row) -execute p1(6); +execute fast_path_router_with_param(6); ?column? --------------------------------------------------------------------- t (1 row) -execute p1(7); +execute fast_path_router_with_param(7); ?column? --------------------------------------------------------------------- t (1 row) -execute p1(8); +execute fast_path_router_with_param(8); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +-- same query as fast_path_router_with_param, but with consts +SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table WHERE key = 1; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE router_with_param(int) AS SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table m1 JOIN master_evaluation_table m2 USING(key) WHERE key = $1; +execute router_with_param(1); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param(2); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param(3); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param(4); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param(5); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param(6); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param(7); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param(8); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +-- same query as router_with_param, but with consts +SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table m1 JOIN master_evaluation_table m2 USING(key) WHERE key = 1; ?column? --------------------------------------------------------------------- t diff --git a/src/test/regress/expected/master_evaluation_modify.out b/src/test/regress/expected/master_evaluation_modify.out new file mode 100644 index 000000000..729e39ddf --- /dev/null +++ b/src/test/regress/expected/master_evaluation_modify.out @@ -0,0 +1,1542 @@ +-- This test relies on metadata being synced +-- that's why is should be executed on MX schedule +CREATE SCHEMA master_evaluation_combinations_modify; +SET search_path TO master_evaluation_combinations_modify; +-- in this test, we are considering combinations of +-- several Citus features, and there is one prepared +-- statement for the combinations of following: +-- (a) Router Modify vs Fast Path Router Modify +-- (b) Local Execution vs Remote Execution +-- (c) Parameters on distribution key vs Parameters on non-dist key +-- vs Non-parametrized queries +-- (d) Master Function Evaluation Required vs +-- Master Function Evaluation Not Required +SET citus.next_shard_id TO 1180000; +-- create a volatile function that returns the local node id +CREATE OR REPLACE FUNCTION get_local_node_id_stable() +RETURNS INT AS $$ +DECLARE localGroupId int; +BEGIN + SELECT groupid INTO localGroupId FROM pg_dist_local_group; + RETURN localGroupId; +END; $$ language plpgsql STABLE; +SELECT create_distributed_function('get_local_node_id_stable()'); + create_distributed_function +--------------------------------------------------------------------- + +(1 row) + +-- returns 1 on coordinator +CREATE OR REPLACE FUNCTION get_constant_stable() +RETURNS INT AS $$ +BEGIN + RETURN 1; +END; $$ language plpgsql STABLE; +CREATE TYPE user_data AS (name text, age int); +SET citus.replication_model TO streaming; +SET citus.shard_replication_factor TO 1; +CREATE TABLE user_info_data (user_id int, u_data user_data); +SELECT create_distributed_table('user_info_data', 'user_id'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +-- show that local id is 0, we'll use this information +SELECT get_local_node_id_stable(); + get_local_node_id_stable +--------------------------------------------------------------------- + 0 +(1 row) + +INSERT INTO user_info_data SELECT i, ('name' || i, i % 20 + 20)::user_data FROM generate_series(0,7)i; +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param(int) AS DELETE FROM user_info_data WHERE user_id = $1 RETURNING *; +execute fast_path_router_with_param(0); + user_id | u_data +--------------------------------------------------------------------- + 0 | (name0,20) +(1 row) + +execute fast_path_router_with_param(1); + user_id | u_data +--------------------------------------------------------------------- + 1 | (name1,21) +(1 row) + +execute fast_path_router_with_param(2); + user_id | u_data +--------------------------------------------------------------------- + 2 | (name2,22) +(1 row) + +execute fast_path_router_with_param(3); + user_id | u_data +--------------------------------------------------------------------- + 3 | (name3,23) +(1 row) + +execute fast_path_router_with_param(4); + user_id | u_data +--------------------------------------------------------------------- + 4 | (name4,24) +(1 row) + +execute fast_path_router_with_param(5); + user_id | u_data +--------------------------------------------------------------------- + 5 | (name5,25) +(1 row) + +execute fast_path_router_with_param(6); + user_id | u_data +--------------------------------------------------------------------- + 6 | (name6,26) +(1 row) + +execute fast_path_router_with_param(7); + user_id | u_data +--------------------------------------------------------------------- + 7 | (name7,27) +(1 row) + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param_and_func(int) AS DELETE FROM user_info_data WHERE u_data = ('test', get_local_node_id_stable())::user_data AND user_id = $1 RETURNING *; +INSERT INTO user_info_data SELECT i, ('test', 0)::user_data FROM generate_series(0,7)i; +-- should evaluate the function on the coordinator, hence get_local_node_id_stable() returns zero +execute fast_path_router_with_param_and_func(0); + user_id | u_data +--------------------------------------------------------------------- + 0 | (test,0) +(1 row) + +execute fast_path_router_with_param_and_func(1); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,0) +(1 row) + +execute fast_path_router_with_param_and_func(2); + user_id | u_data +--------------------------------------------------------------------- + 2 | (test,0) +(1 row) + +execute fast_path_router_with_param_and_func(3); + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,0) +(1 row) + +execute fast_path_router_with_param_and_func(4); + user_id | u_data +--------------------------------------------------------------------- + 4 | (test,0) +(1 row) + +execute fast_path_router_with_param_and_func(5); + user_id | u_data +--------------------------------------------------------------------- + 5 | (test,0) +(1 row) + +execute fast_path_router_with_param_and_func(6); + user_id | u_data +--------------------------------------------------------------------- + 6 | (test,0) +(1 row) + +execute fast_path_router_with_param_and_func(7); + user_id | u_data +--------------------------------------------------------------------- + 7 | (test,0) +(1 row) + +INSERT INTO user_info_data SELECT 1, ('test' || i, 0)::user_data FROM generate_series(0,7)i; +PREPARE fast_path_router_with_param_on_non_dist_key_and_func(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 1 RETURNING *; +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test0', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test0,0) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test1', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test1,0) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test2', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test2,0) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test3', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test3,0) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test4', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test4,0) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test5', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test5,0) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test6', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test6,0) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test7', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test7,0) +(1 row) + +INSERT INTO user_info_data SELECT 1, ('test', i)::user_data FROM generate_series(0,7)i; +PREPARE fast_path_router_with_param_on_non_dist_key(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 1 RETURNING + *; +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 0)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,0) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 2)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,2) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 3)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,3) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 4)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,4) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 5)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,5) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 6)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,6) +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 7)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,7) +(1 row) + +INSERT INTO user_info_data SELECT i, ('test', i)::user_data FROM generate_series(0,7)i; +PREPARE fast_path_router_with_two_params(user_data, int) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = $2 RETURNING + *; +EXECUTE fast_path_router_with_two_params(('test', 0)::user_data, 0); + user_id | u_data +--------------------------------------------------------------------- + 0 | (test,0) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 1)::user_data, 1); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 2); + user_id | u_data +--------------------------------------------------------------------- + 2 | (test,2) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 3)::user_data, 3); + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,3) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 4)::user_data, 4); + user_id | u_data +--------------------------------------------------------------------- + 4 | (test,4) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 5)::user_data, 5); + user_id | u_data +--------------------------------------------------------------------- + 5 | (test,5) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 6)::user_data, 6); + user_id | u_data +--------------------------------------------------------------------- + 6 | (test,6) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 7)::user_data, 7); + user_id | u_data +--------------------------------------------------------------------- + 7 | (test,7) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +PREPARE fast_path_router_with_only_function AS DELETE FROM user_info_data WHERE get_local_node_id_stable() = 0 AND user_id = 1 RETURNING *; +EXECUTE fast_path_router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +ALTER TABLE user_info_data ADD COLUMN user_index INT; +PREPARE insert_with_function_and_param(user_data) AS INSERT INTO user_info_data VALUES (1, $1, get_local_node_id_stable()) RETURNING user_id; +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 1 +(1 row) + +ALTER TABLE user_info_data DROP COLUMN user_index; +TRUNCATE user_info_data; +INSERT INTO user_info_data SELECT i, ('test', i)::user_data FROM generate_series(0,7)i; +-- make sure that it is also true for non fast-path router queries with paramaters +PREPARE router_with_param(int) AS DELETE FROM user_info_data WHERE user_id = $1 AND user_id = $1 RETURNING *; +execute router_with_param(0); + user_id | u_data +--------------------------------------------------------------------- + 0 | (test,0) +(1 row) + +execute router_with_param(1); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +execute router_with_param(2); + user_id | u_data +--------------------------------------------------------------------- + 2 | (test,2) +(1 row) + +execute router_with_param(3); + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,3) +(1 row) + +execute router_with_param(4); + user_id | u_data +--------------------------------------------------------------------- + 4 | (test,4) +(1 row) + +execute router_with_param(5); + user_id | u_data +--------------------------------------------------------------------- + 5 | (test,5) +(1 row) + +execute router_with_param(6); + user_id | u_data +--------------------------------------------------------------------- + 6 | (test,6) +(1 row) + +execute router_with_param(7); + user_id | u_data +--------------------------------------------------------------------- + 7 | (test,7) +(1 row) + +-- make sure that it is also true for non fast-path router queries with paramaters +PREPARE router_with_param_and_func(int) AS DELETE FROM user_info_data WHERE u_data = ('test', get_local_node_id_stable())::user_data AND user_id = $1 AND user_id = $1 RETURNING *; +INSERT INTO user_info_data SELECT i, ('test', 0)::user_data FROM generate_series(0,7)i; +execute router_with_param_and_func(0); + user_id | u_data +--------------------------------------------------------------------- + 0 | (test,0) +(1 row) + +execute router_with_param_and_func(1); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,0) +(1 row) + +execute router_with_param_and_func(2); + user_id | u_data +--------------------------------------------------------------------- + 2 | (test,0) +(1 row) + +execute router_with_param_and_func(3); + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,0) +(1 row) + +execute router_with_param_and_func(4); + user_id | u_data +--------------------------------------------------------------------- + 4 | (test,0) +(1 row) + +execute router_with_param_and_func(5); + user_id | u_data +--------------------------------------------------------------------- + 5 | (test,0) +(1 row) + +execute router_with_param_and_func(6); + user_id | u_data +--------------------------------------------------------------------- + 6 | (test,0) +(1 row) + +execute router_with_param_and_func(7); + user_id | u_data +--------------------------------------------------------------------- + 7 | (test,0) +(1 row) + +INSERT INTO user_info_data SELECT 1, ('test' || i, 0)::user_data FROM generate_series(0,7)i; +PREPARE router_with_param_on_non_dist_key_and_func(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 1 AND user_id = 1 RETURNING *; +EXECUTE router_with_param_on_non_dist_key_and_func(('test0', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test0,0) +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('test1', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test1,0) +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('test2', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test2,0) +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('test3', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test3,0) +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('test4', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test4,0) +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('test5', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test5,0) +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('test6', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test6,0) +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('test7', get_local_node_id_stable())::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test7,0) +(1 row) + +INSERT INTO user_info_data SELECT 1, ('test', i)::user_data FROM generate_series(0,7)i; +PREPARE router_with_param_on_non_dist_key(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 1 AND user_id = 1 RETURNING *; +EXECUTE router_with_param_on_non_dist_key(('test', 0)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,0) +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('test', 2)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,2) +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('test', 3)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,3) +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('test', 4)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,4) +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('test', 5)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,5) +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('test', 6)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,6) +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('test', 7)::user_data); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,7) +(1 row) + +INSERT INTO user_info_data SELECT i, ('test', i)::user_data FROM generate_series(0,7)i; +PREPARE router_with_two_params(user_data, int) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = $2 AND user_id = $2 RETURNING + *; +EXECUTE router_with_two_params(('test', 0)::user_data, 0); + user_id | u_data +--------------------------------------------------------------------- + 0 | (test,0) +(1 row) + +EXECUTE router_with_two_params(('test', 1)::user_data, 1); + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +EXECUTE router_with_two_params(('test', 2)::user_data, 2); + user_id | u_data +--------------------------------------------------------------------- + 2 | (test,2) +(1 row) + +EXECUTE router_with_two_params(('test', 3)::user_data, 3); + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,3) +(1 row) + +EXECUTE router_with_two_params(('test', 4)::user_data, 4); + user_id | u_data +--------------------------------------------------------------------- + 4 | (test,4) +(1 row) + +EXECUTE router_with_two_params(('test', 5)::user_data, 5); + user_id | u_data +--------------------------------------------------------------------- + 5 | (test,5) +(1 row) + +EXECUTE router_with_two_params(('test', 6)::user_data, 6); + user_id | u_data +--------------------------------------------------------------------- + 6 | (test,6) +(1 row) + +EXECUTE router_with_two_params(('test', 7)::user_data, 7); + user_id | u_data +--------------------------------------------------------------------- + 7 | (test,7) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +PREPARE router_with_only_function AS DELETE FROM user_info_data WHERE get_local_node_id_stable() = 0 AND user_id = 1 AND user_id = 1 RETURNING *; +EXECUTE router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; + user_id | u_data +--------------------------------------------------------------------- + 1 | (test,1) +(1 row) + +\c - - - :worker_2_port +SET citus.log_local_commands TO ON; +SET search_path TO master_evaluation_combinations_modify; +-- returns 2 on the worker +CREATE OR REPLACE FUNCTION get_constant_stable() +RETURNS INT AS $$ +BEGIN + RETURN 2; +END; $$ language plpgsql STABLE; +-- all local values +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, '(''test3'', 3)'), (4, '(''test4'', 4)'), (7, '(''test7'', 7)'), +(9, '(''test9'', 9)'), (11, '(''test11'', 11)'), (12, '(''test12'', 12)'), +(14, '(''test14'', 14)'), (16, '(''test16'', 16)'); +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param(int) AS DELETE FROM user_info_data WHERE user_id = $1 RETURNING *; +execute fast_path_router_with_param(3); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test3',3) +(1 row) + +execute fast_path_router_with_param(4); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 4) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 4 | ('test4',4) +(1 row) + +execute fast_path_router_with_param(7); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 7) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 7 | ('test7',7) +(1 row) + +execute fast_path_router_with_param(9); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 9) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 9 | ('test9',9) +(1 row) + +execute fast_path_router_with_param(11); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 11) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 11 | ('test11',11) +(1 row) + +execute fast_path_router_with_param(12); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 12) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 12 | ('test12',12) +(1 row) + +execute fast_path_router_with_param(14); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 14) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 14 | ('test14',14) +(1 row) + +execute fast_path_router_with_param(16); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 16) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 16 | ('test16',16) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, '(''test'', 2)'), (4, '(''test'', 2)'), (7, '(''test'', 2)'), +(9, '(''test'', 9)'), (11, '(''test'', 2)'), (12, '(''test'', 2)'), +(14, '(''test'', 2)'), (16, '(''test'', 2)'); +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param_and_func(int) AS DELETE FROM user_info_data WHERE u_data = ('''test''', get_constant_stable())::user_data AND user_id = $1 RETURNING *; +execute fast_path_router_with_param_and_func(3); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +execute fast_path_router_with_param_and_func(4); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 4)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 4 | ('test',2) +(1 row) + +execute fast_path_router_with_param_and_func(7); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 7)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 7 | ('test',2) +(1 row) + +execute fast_path_router_with_param_and_func(9); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 9)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- +(0 rows) + +execute fast_path_router_with_param_and_func(11); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 11)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 11 | ('test',2) +(1 row) + +execute fast_path_router_with_param_and_func(12); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 12)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 12 | ('test',2) +(1 row) + +execute fast_path_router_with_param_and_func(14); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 14)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 14 | ('test',2) +(1 row) + +execute fast_path_router_with_param_and_func(16); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 16)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 16 | ('test',2) +(1 row) + +PREPARE fast_path_router_with_param_on_non_dist_key_and_func(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +PREPARE fast_path_router_with_param_on_non_dist_key(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,1)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,1)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,1)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,1)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,1)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,1)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,1)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, ('test', 2)), (4, ('test', 2)), (7, ('test', 2)), +(9, ('test', 2)), (11, ('test', 2)), (12, ('test', 2)), +(14, ('test', 2)), (16, ('test', 2)); +PREPARE fast_path_router_with_two_params(user_data, int) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = $2 RETURNING *; +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 3); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 4); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 4)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 4 | (test,2) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 7); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 7)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 7 | (test,2) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 9); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 9)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 9 | (test,2) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 11); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 11)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 11 | (test,2) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 12); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 12)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 12 | (test,2) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 14); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 14)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 14 | (test,2) +(1 row) + +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 16); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(test,2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 16)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 16 | (test,2) +(1 row) + +PREPARE fast_path_router_with_only_function AS DELETE FROM user_info_data WHERE get_constant_stable() = 2AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +--------------------------------------------------------------------- +\c - - - :master_port +SET search_path TO master_evaluation_combinations_modify; +ALTER TABLE user_info_data ADD COLUMN user_index INT; +\c - - - :worker_2_port +SET search_path TO master_evaluation_combinations_modify; +PREPARE insert_with_function_and_param(user_data) AS INSERT INTO user_info_data VALUES (3, $1, get_local_node_id_stable()) RETURNING user_id; +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 3 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 3 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 3 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 3 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 3 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 3 +(1 row) + +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + user_id +--------------------------------------------------------------------- + 3 +(1 row) + +\c - - - :master_port +SET search_path TO master_evaluation_combinations_modify; +ALTER TABLE user_info_data DROP COLUMN user_index; +TRUNCATE user_info_data; +\c - - - :worker_2_port +SET citus.log_local_commands TO ON; +SET search_path TO master_evaluation_combinations_modify; +-- all local values +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, '(''test3'', 3)'), (4, '(''test4'', 4)'), (7, '(''test7'', 7)'), +(9, '(''test9'', 9)'), (11, '(''test11'', 11)'), (12, '(''test12'', 12)'), +(14, '(''test14'', 14)'), (16, '(''test16'', 16)'); +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE router_with_param(int) AS DELETE FROM user_info_data WHERE user_id = $1 AND user_id = $1 RETURNING *; +execute router_with_param(3); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) $1) AND (user_id OPERATOR(pg_catalog.=) $1)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test3',3) +(1 row) + +execute router_with_param(4); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) $1) AND (user_id OPERATOR(pg_catalog.=) $1)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 4 | ('test4',4) +(1 row) + +execute router_with_param(7); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) $1) AND (user_id OPERATOR(pg_catalog.=) $1)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 7 | ('test7',7) +(1 row) + +execute router_with_param(9); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) $1) AND (user_id OPERATOR(pg_catalog.=) $1)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 9 | ('test9',9) +(1 row) + +execute router_with_param(11); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) $1) AND (user_id OPERATOR(pg_catalog.=) $1)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 11 | ('test11',11) +(1 row) + +execute router_with_param(12); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) $1) AND (user_id OPERATOR(pg_catalog.=) $1)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 12 | ('test12',12) +(1 row) + +execute router_with_param(14); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) $1) AND (user_id OPERATOR(pg_catalog.=) $1)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 14 | ('test14',14) +(1 row) + +execute router_with_param(16); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) $1) AND (user_id OPERATOR(pg_catalog.=) $1)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 16 | ('test16',16) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, '(''test'', 2)'), (4, '(''test'', 2)'), (7, '(''test'', 2)'), +(9, '(''test'', 9)'), (11, '(''test'', 2)'), (12, '(''test'', 2)'), +(14, '(''test'', 2)'), (16, '(''test'', 2)'); +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE router_with_param_and_func(int) AS DELETE FROM user_info_data WHERE u_data = ('''test''', get_constant_stable())::user_data AND user_id = $1 AND user_id = $1 RETURNING *; +execute router_with_param_and_func(3); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +execute router_with_param_and_func(4); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 4) AND (user_id OPERATOR(pg_catalog.=) 4)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 4 | ('test',2) +(1 row) + +execute router_with_param_and_func(7); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 7) AND (user_id OPERATOR(pg_catalog.=) 7)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 7 | ('test',2) +(1 row) + +execute router_with_param_and_func(9); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 9) AND (user_id OPERATOR(pg_catalog.=) 9)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- +(0 rows) + +execute router_with_param_and_func(11); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 11) AND (user_id OPERATOR(pg_catalog.=) 11)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 11 | ('test',2) +(1 row) + +execute router_with_param_and_func(12); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 12) AND (user_id OPERATOR(pg_catalog.=) 12)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 12 | ('test',2) +(1 row) + +execute router_with_param_and_func(14); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 14) AND (user_id OPERATOR(pg_catalog.=) 14)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 14 | ('test',2) +(1 row) + +execute router_with_param_and_func(16); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) '(''test'',2)'::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 16) AND (user_id OPERATOR(pg_catalog.=) 16)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 16 | ('test',2) +(1 row) + +PREPARE router_with_param_on_non_dist_key_and_func(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 3 AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, '(''test'',2)'::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | ('test',2) +(1 row) + +PREPARE router_with_param_on_non_dist_key(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 3 AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 1)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) 3) AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,1) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, ('test', 2)), (4, ('test', 2)), (7, ('test', 2)), +(9, ('test', 2)), (11, ('test', 2)), (12, ('test', 2)), +(14, ('test', 2)), (16, ('test', 2)); +PREPARE router_with_two_params(user_data, int) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = $2 AND user_id = $2 RETURNING *; +EXECUTE router_with_two_params(('test', 2)::user_data, 3); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) $2) AND (user_id OPERATOR(pg_catalog.=) $2)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +EXECUTE router_with_two_params(('test', 2)::user_data, 4); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) $2) AND (user_id OPERATOR(pg_catalog.=) $2)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 4 | (test,2) +(1 row) + +EXECUTE router_with_two_params(('test', 2)::user_data, 7); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) $2) AND (user_id OPERATOR(pg_catalog.=) $2)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 7 | (test,2) +(1 row) + +EXECUTE router_with_two_params(('test', 2)::user_data, 9); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) $2) AND (user_id OPERATOR(pg_catalog.=) $2)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 9 | (test,2) +(1 row) + +EXECUTE router_with_two_params(('test', 2)::user_data, 11); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) $2) AND (user_id OPERATOR(pg_catalog.=) $2)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 11 | (test,2) +(1 row) + +EXECUTE router_with_two_params(('test', 2)::user_data, 12); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180003 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) $2) AND (user_id OPERATOR(pg_catalog.=) $2)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 12 | (test,2) +(1 row) + +EXECUTE router_with_two_params(('test', 2)::user_data, 14); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) $2) AND (user_id OPERATOR(pg_catalog.=) $2)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 14 | (test,2) +(1 row) + +EXECUTE router_with_two_params(('test', 2)::user_data, 16); +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE ((u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations_modify.user_data) AND (user_id OPERATOR(pg_catalog.=) $2) AND (user_id OPERATOR(pg_catalog.=) $2)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 16 | (test,2) +(1 row) + +PREPARE router_with_only_function AS DELETE FROM user_info_data WHERE get_constant_stable() = 2AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +NOTICE: executing the command locally: INSERT INTO master_evaluation_combinations_modify.user_info_data_1180001 (user_id, u_data) VALUES (3, ROW('test'::text, 2)::master_evaluation_combinations_modify.user_data) +EXECUTE router_with_only_function; +NOTICE: executing the command locally: DELETE FROM master_evaluation_combinations_modify.user_info_data_1180001 user_info_data WHERE (true AND (user_id OPERATOR(pg_catalog.=) 3)) RETURNING user_id, u_data + user_id | u_data +--------------------------------------------------------------------- + 3 | (test,2) +(1 row) + +-- suppress notices +\c - - - :master_port +SET client_min_messages TO ERROR; +DROP SCHEMA master_evaluation_combinations_modify CASCADE; diff --git a/src/test/regress/expected/master_evaluation_select.out b/src/test/regress/expected/master_evaluation_select.out new file mode 100644 index 000000000..7392f479c --- /dev/null +++ b/src/test/regress/expected/master_evaluation_select.out @@ -0,0 +1,1500 @@ +-- This test relies on metadata being synced +-- that's why is should be executed on MX schedule +-- in this test, we are considering combinations of +-- several Citus features, and there is one prepared +-- statement for the combinations of following: +-- (a) Router Select vs Fast Path Router Select +-- (b) Local Execution vs Remote Execution +-- (c) Parameters on distribution key vs Parameters on non-dist key +-- vs Non-parametrized queries +-- (d) Master Function Evaluation Required vs +-- Master Function Evaluation Not Required +CREATE SCHEMA master_evaluation_combinations; +SET search_path TO master_evaluation_combinations; +SET citus.next_shard_id TO 1170000; +-- create a volatile function that returns the local node id +CREATE OR REPLACE FUNCTION get_local_node_id_volatile() +RETURNS INT AS $$ +DECLARE localGroupId int; +BEGIN + SELECT groupid INTO localGroupId FROM pg_dist_local_group; + RETURN localGroupId; +END; $$ language plpgsql VOLATILE; +SELECT create_distributed_function('get_local_node_id_volatile()'); + create_distributed_function +--------------------------------------------------------------------- + +(1 row) + +CREATE TYPE user_data AS (name text, age int); +SET citus.replication_model TO streaming; +SET citus.shard_replication_factor TO 1; +CREATE TABLE user_info_data (user_id int, u_data user_data); +SELECT create_distributed_table('user_info_data', 'user_id'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +-- show that local id is 0, we'll use this information +SELECT get_local_node_id_volatile(); + get_local_node_id_volatile +--------------------------------------------------------------------- + 0 +(1 row) + +-- load data +INSERT INTO user_info_data SELECT i, ('name' || i, i % 20 + 20)::user_data FROM generate_series(0,100)i; +-- we expect that the function is evaluated on the worker node, so we should get a row +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param(int) AS SELECT count(*) FROM user_info_data WHERE user_id = $1; +execute fast_path_router_with_param(1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(2); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(3); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(4); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(5); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(6); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(7); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(8); + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param_and_func(int) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = $1; +execute fast_path_router_with_param_and_func(1); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(2); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(3); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(4); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(5); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(6); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(7); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(8); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1 AND u_data = ('name1', 21)::user_data; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE fast_path_router_with_param_on_non_dist_key_and_func(user_data) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1 AND u_data = $1; +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +SELECT count(*) FROM user_info_data WHERE user_id = 1 AND u_data = ('name1', 21)::user_data; + count +--------------------------------------------------------------------- + 1 +(1 row) + +PREPARE fast_path_router_with_param_on_non_dist_key(user_data) AS SELECT count(*) FROM user_info_data WHERE user_id = 1 AND u_data = $1; +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +PREPARE fast_path_router_with_two_params(user_data, int) AS SELECT count(*) FROM user_info_data WHERE user_id = $2 AND u_data = $1; +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE fast_path_router_with_only_function AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1; +EXECUTE fast_path_router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = 1; + count +--------------------------------------------------------------------- + 1 +(1 row) + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE router_with_param(int) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = $1; +execute router_with_param(1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(2); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(3); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(4); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(5); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(6); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(7); + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(8); + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = 1; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE router_with_param_and_func(int) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = $1; +execute router_with_param_and_func(1); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(2); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(3); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(4); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(5); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(6); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(7); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(8); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +-- same query as router_with_param, but with consts +SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = 1; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE router_with_param_on_non_dist_key(user_data) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 1 AND u1.u_data = $1; +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 1 AND u1.u_data = ('name1', 21)::user_data; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE router_with_param_on_non_dist_key_and_func(user_data) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 1 AND u1.u_data = $1; +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = 1 AND u1.u_data = ('name1', 21)::user_data; + count +--------------------------------------------------------------------- + 1 +(1 row) + +PREPARE router_with_two_params(user_data, int) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = $2 AND u1.u_data = $1; +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING(user_id) WHERE user_id = 1; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE router_with_only_function AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING(user_id) WHERE user_id = 1; +EXECUTE router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; + ?column? +--------------------------------------------------------------------- + t +(1 row) + +\c - - - :worker_2_port +SET citus.log_local_commands TO ON; +SET search_path TO master_evaluation_combinations; +-- show that the data with user_id = 3 is local +SELECT count(*) FROM user_info_data WHERE user_id = 3; +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param(int) AS SELECT count(*) FROM user_info_data WHERE user_id = $1; +execute fast_path_router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute fast_path_router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 3; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param_and_func(int) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = $1; +execute fast_path_router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute fast_path_router_with_param_and_func(8); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 3 AND u_data = ('name3', 23)::user_data; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) ROW('name3'::text, 23)::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE fast_path_router_with_param_on_non_dist_key_and_func(user_data) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 3 AND u_data = $1; +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +SELECT count(*) FROM user_info_data WHERE user_id = 3 AND u_data = ('name3', 23)::user_data; +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) ROW('name3'::text, 23)::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +PREPARE fast_path_router_with_param_on_non_dist_key(user_data) AS SELECT count(*) FROM user_info_data WHERE user_id = 3 AND u_data = $1; +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE ((user_id OPERATOR(pg_catalog.=) 3) AND (u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +PREPARE fast_path_router_with_only_function AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 3; +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE fast_path_router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM master_evaluation_combinations.user_info_data_1170001 user_info_data WHERE (user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = 3; +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + count +--------------------------------------------------------------------- + 1 +(1 row) + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE router_with_param(int) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = $1; +execute router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) $1) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) $1) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) $1) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) $1) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) $1) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) $1) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) $1) + count +--------------------------------------------------------------------- + 1 +(1 row) + +execute router_with_param(3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) $1) + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = 3; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE router_with_param_and_func(int) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = $1; +execute router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) $1) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) $1) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) $1) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) $1) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) $1) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) $1) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) $1) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +execute router_with_param_and_func(3); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) $1) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +-- same query as router_with_param, but with consts +SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = 3; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 m1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 m2(user_id, u_data) USING (user_id)) WHERE (m1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = ('name3', 23)::user_data; +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) ROW('name3'::text, 23)::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = ('name3', 23)::user_data; +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) ROW('name3'::text, 23)::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +PREPARE router_with_param_on_non_dist_key(user_data) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = $1; +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = ('name3', 23)::user_data; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) ROW('name3'::text, 23)::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE router_with_param_on_non_dist_key_and_func(user_data) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = $1; +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = 3 AND u1.u_data = ('name3', 23)::user_data; +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) 3) AND (u1.u_data OPERATOR(pg_catalog.=) ROW('name3'::text, 23)::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +PREPARE router_with_two_params(user_data, int) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = $2 AND u1.u_data = $1; +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) $2) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) $2) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) $2) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) $2) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) $2) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) $2) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) $2) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) $2) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +NOTICE: executing the command locally: SELECT count(*) AS count FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE ((u1.user_id OPERATOR(pg_catalog.=) $2) AND (u1.u_data OPERATOR(pg_catalog.=) $1::master_evaluation_combinations.user_data)) + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING(user_id) WHERE user_id = 3; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +PREPARE router_with_only_function AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING(user_id) WHERE user_id = 3; +EXECUTE router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +EXECUTE router_with_only_function; +NOTICE: executing the command locally: SELECT (master_evaluation_combinations.get_local_node_id_volatile() OPERATOR(pg_catalog.>) 0) FROM (master_evaluation_combinations.user_info_data_1170001 u1(user_id, u_data) JOIN master_evaluation_combinations.user_info_data_1170001 u2(user_id, u_data) USING (user_id)) WHERE (u1.user_id OPERATOR(pg_catalog.=) 3) + ?column? +--------------------------------------------------------------------- + t +(1 row) + +-- suppress notices +\c - - - :master_port +SET client_min_messages TO ERROR; +DROP SCHEMA master_evaluation_combinations CASCADE; diff --git a/src/test/regress/multi_mx_schedule b/src/test/regress/multi_mx_schedule index 9a7fadb50..d3083367f 100644 --- a/src/test/regress/multi_mx_schedule +++ b/src/test/regress/multi_mx_schedule @@ -36,7 +36,8 @@ test: recursive_dml_queries_mx multi_mx_truncate_from_worker test: multi_mx_repartition_udt_prepare mx_foreign_key_to_reference_table test: multi_mx_repartition_join_w1 multi_mx_repartition_join_w2 multi_mx_repartition_udt_w1 multi_mx_repartition_udt_w2 test: multi_mx_metadata -test: multi_mx_call master_evaluation +test: master_evaluation master_evaluation_modify master_evaluation_select +test: multi_mx_call test: multi_mx_function_call_delegation test: multi_mx_modifications local_shard_execution test: multi_mx_transaction_recovery diff --git a/src/test/regress/sql/local_shard_execution.sql b/src/test/regress/sql/local_shard_execution.sql index 7e0a06e17..50fb07b06 100644 --- a/src/test/regress/sql/local_shard_execution.sql +++ b/src/test/regress/sql/local_shard_execution.sql @@ -36,6 +36,16 @@ CREATE TABLE collections_list_0 PARTITION OF collections_list (key, ser, ts, collection_id, value) FOR VALUES IN ( 0 ); +-- create a volatile function that returns the local node id +CREATE OR REPLACE FUNCTION get_local_node_id_volatile() +RETURNS INT AS $$ +DECLARE localGroupId int; +BEGIN + SELECT groupid INTO localGroupId FROM pg_dist_local_group; + RETURN localGroupId; +END; $$ language plpgsql VOLATILE; +SELECT create_distributed_function('get_local_node_id_volatile()'); + -- connection worker and get ready for the tests \c - - - :worker_1_port SET search_path TO local_shard_execution; @@ -361,6 +371,29 @@ $$ LANGUAGE plpgsql; CALL only_local_execution(); +-- insert a row that we need in the next tests +INSERT INTO distributed_table VALUES (1, '11',21) ON CONFLICT(key) DO UPDATE SET value = '29'; + +-- make sure that functions can use local execution +CREATE OR REPLACE PROCEDURE only_local_execution_with_function_evaluation() AS $$ + DECLARE nodeId INT; + BEGIN + -- fast path router + SELECT get_local_node_id_volatile() INTO nodeId FROM distributed_table WHERE key = 1; + IF nodeId <= 0 THEN + RAISE NOTICE 'unexpected node id'; + END IF; + + -- regular router + SELECT get_local_node_id_volatile() INTO nodeId FROM distributed_table d1 JOIN distributed_table d2 USING (key) WHERE d1.key = 1; + IF nodeId <= 0 THEN + RAISE NOTICE 'unexpected node id'; + END IF; + END; +$$ LANGUAGE plpgsql; + +CALL only_local_execution_with_function_evaluation(); + CREATE OR REPLACE PROCEDURE only_local_execution_with_params(int) AS $$ DECLARE cnt INT; BEGIN @@ -372,6 +405,25 @@ $$ LANGUAGE plpgsql; CALL only_local_execution_with_params(1); +CREATE OR REPLACE PROCEDURE only_local_execution_with_function_evaluation_param(int) AS $$ + DECLARE nodeId INT; + BEGIN + -- fast path router + SELECT get_local_node_id_volatile() INTO nodeId FROM distributed_table WHERE key = $1; + IF nodeId <= 0 THEN + RAISE NOTICE 'unexpected node id'; + END IF; + + -- regular router + SELECT get_local_node_id_volatile() INTO nodeId FROM distributed_table d1 JOIN distributed_table d2 USING (key) WHERE d1.key = $1; + IF nodeId <= 0 THEN + RAISE NOTICE 'unexpected node id'; + END IF; + END; +$$ LANGUAGE plpgsql; + +CALL only_local_execution_with_function_evaluation_param(1); + CREATE OR REPLACE PROCEDURE local_execution_followed_by_dist() AS $$ DECLARE cnt INT; BEGIN diff --git a/src/test/regress/sql/master_evaluation.sql b/src/test/regress/sql/master_evaluation.sql index 2c5bbc5c5..b55b2513e 100644 --- a/src/test/regress/sql/master_evaluation.sql +++ b/src/test/regress/sql/master_evaluation.sql @@ -36,16 +36,33 @@ INSERT INTO master_evaluation_table SELECT i, i FROM generate_series(0,100)i; SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table WHERE key = 1; -- make sure that it is also true for fast-path router queries with paramaters -PREPARE p1(int) AS SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table WHERE key = $1; +PREPARE fast_path_router_with_param(int) AS SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table WHERE key = $1; -execute p1(1); -execute p1(2); -execute p1(3); -execute p1(4); -execute p1(5); -execute p1(6); -execute p1(7); -execute p1(8); +execute fast_path_router_with_param(1); +execute fast_path_router_with_param(2); +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(4); +execute fast_path_router_with_param(5); +execute fast_path_router_with_param(6); +execute fast_path_router_with_param(7); +execute fast_path_router_with_param(8); + +-- same query as fast_path_router_with_param, but with consts +SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table WHERE key = 1; + +PREPARE router_with_param(int) AS SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table m1 JOIN master_evaluation_table m2 USING(key) WHERE key = $1; + +execute router_with_param(1); +execute router_with_param(2); +execute router_with_param(3); +execute router_with_param(4); +execute router_with_param(5); +execute router_with_param(6); +execute router_with_param(7); +execute router_with_param(8); + +-- same query as router_with_param, but with consts +SELECT get_local_node_id_volatile() > 0 FROM master_evaluation_table m1 JOIN master_evaluation_table m2 USING(key) WHERE key = 1; -- for multi-shard queries, we still expect the evaluation to happen on the workers SELECT count(*), max(get_local_node_id_volatile()) != 0, min(get_local_node_id_volatile()) != 0 FROM master_evaluation_table; diff --git a/src/test/regress/sql/master_evaluation_modify.sql b/src/test/regress/sql/master_evaluation_modify.sql new file mode 100644 index 000000000..35c9567d4 --- /dev/null +++ b/src/test/regress/sql/master_evaluation_modify.sql @@ -0,0 +1,502 @@ + +-- This test relies on metadata being synced +-- that's why is should be executed on MX schedule +CREATE SCHEMA master_evaluation_combinations_modify; +SET search_path TO master_evaluation_combinations_modify; + +-- in this test, we are considering combinations of +-- several Citus features, and there is one prepared +-- statement for the combinations of following: +-- (a) Router Modify vs Fast Path Router Modify +-- (b) Local Execution vs Remote Execution +-- (c) Parameters on distribution key vs Parameters on non-dist key +-- vs Non-parametrized queries +-- (d) Master Function Evaluation Required vs +-- Master Function Evaluation Not Required + +SET citus.next_shard_id TO 1180000; + +-- create a volatile function that returns the local node id +CREATE OR REPLACE FUNCTION get_local_node_id_stable() +RETURNS INT AS $$ +DECLARE localGroupId int; +BEGIN + SELECT groupid INTO localGroupId FROM pg_dist_local_group; + RETURN localGroupId; +END; $$ language plpgsql STABLE; +SELECT create_distributed_function('get_local_node_id_stable()'); + +-- returns 1 on coordinator +CREATE OR REPLACE FUNCTION get_constant_stable() +RETURNS INT AS $$ +BEGIN + RETURN 1; +END; $$ language plpgsql STABLE; + +CREATE TYPE user_data AS (name text, age int); + +SET citus.replication_model TO streaming; +SET citus.shard_replication_factor TO 1; + +CREATE TABLE user_info_data (user_id int, u_data user_data); +SELECT create_distributed_table('user_info_data', 'user_id'); + +-- show that local id is 0, we'll use this information +SELECT get_local_node_id_stable(); + + + +INSERT INTO user_info_data SELECT i, ('name' || i, i % 20 + 20)::user_data FROM generate_series(0,7)i; + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param(int) AS DELETE FROM user_info_data WHERE user_id = $1 RETURNING *; + +execute fast_path_router_with_param(0); +execute fast_path_router_with_param(1); +execute fast_path_router_with_param(2); +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(4); +execute fast_path_router_with_param(5); +execute fast_path_router_with_param(6); +execute fast_path_router_with_param(7); + + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param_and_func(int) AS DELETE FROM user_info_data WHERE u_data = ('test', get_local_node_id_stable())::user_data AND user_id = $1 RETURNING *; + +INSERT INTO user_info_data SELECT i, ('test', 0)::user_data FROM generate_series(0,7)i; + +-- should evaluate the function on the coordinator, hence get_local_node_id_stable() returns zero +execute fast_path_router_with_param_and_func(0); +execute fast_path_router_with_param_and_func(1); +execute fast_path_router_with_param_and_func(2); +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(4); +execute fast_path_router_with_param_and_func(5); +execute fast_path_router_with_param_and_func(6); +execute fast_path_router_with_param_and_func(7); + + +INSERT INTO user_info_data SELECT 1, ('test' || i, 0)::user_data FROM generate_series(0,7)i; + +PREPARE fast_path_router_with_param_on_non_dist_key_and_func(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 1 RETURNING *; +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test0', get_local_node_id_stable())::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test1', get_local_node_id_stable())::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test2', get_local_node_id_stable())::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test3', get_local_node_id_stable())::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test4', get_local_node_id_stable())::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test5', get_local_node_id_stable())::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test6', get_local_node_id_stable())::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('test7', get_local_node_id_stable())::user_data); + + +INSERT INTO user_info_data SELECT 1, ('test', i)::user_data FROM generate_series(0,7)i; + +PREPARE fast_path_router_with_param_on_non_dist_key(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 1 RETURNING + *; +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 0)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 2)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 3)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 4)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 5)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 6)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 7)::user_data); + + +INSERT INTO user_info_data SELECT i, ('test', i)::user_data FROM generate_series(0,7)i; + +PREPARE fast_path_router_with_two_params(user_data, int) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = $2 RETURNING + *; + +EXECUTE fast_path_router_with_two_params(('test', 0)::user_data, 0); +EXECUTE fast_path_router_with_two_params(('test', 1)::user_data, 1); +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 2); +EXECUTE fast_path_router_with_two_params(('test', 3)::user_data, 3); +EXECUTE fast_path_router_with_two_params(('test', 4)::user_data, 4); +EXECUTE fast_path_router_with_two_params(('test', 5)::user_data, 5); +EXECUTE fast_path_router_with_two_params(('test', 6)::user_data, 6); +EXECUTE fast_path_router_with_two_params(('test', 7)::user_data, 7); + + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); + +PREPARE fast_path_router_with_only_function AS DELETE FROM user_info_data WHERE get_local_node_id_stable() = 0 AND user_id = 1 RETURNING *; +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE fast_path_router_with_only_function; + +ALTER TABLE user_info_data ADD COLUMN user_index INT; + +PREPARE insert_with_function_and_param(user_data) AS INSERT INTO user_info_data VALUES (1, $1, get_local_node_id_stable()) RETURNING user_id; +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + +ALTER TABLE user_info_data DROP COLUMN user_index; +TRUNCATE user_info_data; + +INSERT INTO user_info_data SELECT i, ('test', i)::user_data FROM generate_series(0,7)i; + +-- make sure that it is also true for non fast-path router queries with paramaters +PREPARE router_with_param(int) AS DELETE FROM user_info_data WHERE user_id = $1 AND user_id = $1 RETURNING *; + +execute router_with_param(0); +execute router_with_param(1); +execute router_with_param(2); +execute router_with_param(3); +execute router_with_param(4); +execute router_with_param(5); +execute router_with_param(6); +execute router_with_param(7); + + +-- make sure that it is also true for non fast-path router queries with paramaters +PREPARE router_with_param_and_func(int) AS DELETE FROM user_info_data WHERE u_data = ('test', get_local_node_id_stable())::user_data AND user_id = $1 AND user_id = $1 RETURNING *; + +INSERT INTO user_info_data SELECT i, ('test', 0)::user_data FROM generate_series(0,7)i; + +execute router_with_param_and_func(0); +execute router_with_param_and_func(1); +execute router_with_param_and_func(2); +execute router_with_param_and_func(3); +execute router_with_param_and_func(4); +execute router_with_param_and_func(5); +execute router_with_param_and_func(6); +execute router_with_param_and_func(7); + + +INSERT INTO user_info_data SELECT 1, ('test' || i, 0)::user_data FROM generate_series(0,7)i; + +PREPARE router_with_param_on_non_dist_key_and_func(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 1 AND user_id = 1 RETURNING *; +EXECUTE router_with_param_on_non_dist_key_and_func(('test0', get_local_node_id_stable())::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('test1', get_local_node_id_stable())::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('test2', get_local_node_id_stable())::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('test3', get_local_node_id_stable())::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('test4', get_local_node_id_stable())::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('test5', get_local_node_id_stable())::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('test6', get_local_node_id_stable())::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('test7', get_local_node_id_stable())::user_data); + + +INSERT INTO user_info_data SELECT 1, ('test', i)::user_data FROM generate_series(0,7)i; + +PREPARE router_with_param_on_non_dist_key(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 1 AND user_id = 1 RETURNING *; +EXECUTE router_with_param_on_non_dist_key(('test', 0)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 2)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 3)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 4)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 5)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 6)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 7)::user_data); + + + +INSERT INTO user_info_data SELECT i, ('test', i)::user_data FROM generate_series(0,7)i; + +PREPARE router_with_two_params(user_data, int) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = $2 AND user_id = $2 RETURNING + *; + +EXECUTE router_with_two_params(('test', 0)::user_data, 0); +EXECUTE router_with_two_params(('test', 1)::user_data, 1); +EXECUTE router_with_two_params(('test', 2)::user_data, 2); +EXECUTE router_with_two_params(('test', 3)::user_data, 3); +EXECUTE router_with_two_params(('test', 4)::user_data, 4); +EXECUTE router_with_two_params(('test', 5)::user_data, 5); +EXECUTE router_with_two_params(('test', 6)::user_data, 6); +EXECUTE router_with_two_params(('test', 7)::user_data, 7); + +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); + +PREPARE router_with_only_function AS DELETE FROM user_info_data WHERE get_local_node_id_stable() = 0 AND user_id = 1 AND user_id = 1 RETURNING *; +EXECUTE router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data VALUES(1, ('test', 1)::user_data); +EXECUTE router_with_only_function; + +\c - - - :worker_2_port + +SET citus.log_local_commands TO ON; +SET search_path TO master_evaluation_combinations_modify; + +-- returns 2 on the worker +CREATE OR REPLACE FUNCTION get_constant_stable() +RETURNS INT AS $$ +BEGIN + RETURN 2; +END; $$ language plpgsql STABLE; + + +-- all local values +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, '(''test3'', 3)'), (4, '(''test4'', 4)'), (7, '(''test7'', 7)'), +(9, '(''test9'', 9)'), (11, '(''test11'', 11)'), (12, '(''test12'', 12)'), +(14, '(''test14'', 14)'), (16, '(''test16'', 16)'); + + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param(int) AS DELETE FROM user_info_data WHERE user_id = $1 RETURNING *; + +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(4); +execute fast_path_router_with_param(7); +execute fast_path_router_with_param(9); +execute fast_path_router_with_param(11); +execute fast_path_router_with_param(12); +execute fast_path_router_with_param(14); +execute fast_path_router_with_param(16); + + +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, '(''test'', 2)'), (4, '(''test'', 2)'), (7, '(''test'', 2)'), +(9, '(''test'', 9)'), (11, '(''test'', 2)'), (12, '(''test'', 2)'), +(14, '(''test'', 2)'), (16, '(''test'', 2)'); + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param_and_func(int) AS DELETE FROM user_info_data WHERE u_data = ('''test''', get_constant_stable())::user_data AND user_id = $1 RETURNING *; + +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(4); +execute fast_path_router_with_param_and_func(7); +execute fast_path_router_with_param_and_func(9); +execute fast_path_router_with_param_and_func(11); +execute fast_path_router_with_param_and_func(12); +execute fast_path_router_with_param_and_func(14); +execute fast_path_router_with_param_and_func(16); + +PREPARE fast_path_router_with_param_on_non_dist_key_and_func(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); + + + + +PREPARE fast_path_router_with_param_on_non_dist_key(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('test', 1)::user_data); + + + +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, ('test', 2)), (4, ('test', 2)), (7, ('test', 2)), +(9, ('test', 2)), (11, ('test', 2)), (12, ('test', 2)), +(14, ('test', 2)), (16, ('test', 2)); + +PREPARE fast_path_router_with_two_params(user_data, int) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = $2 RETURNING *; + +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 3); +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 4); +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 7); +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 9); +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 11); +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 12); +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 14); +EXECUTE fast_path_router_with_two_params(('test', 2)::user_data, 16); + + +PREPARE fast_path_router_with_only_function AS DELETE FROM user_info_data WHERE get_constant_stable() = 2AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE fast_path_router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE fast_path_router_with_only_function; + + +------- +\c - - - :master_port +SET search_path TO master_evaluation_combinations_modify; +ALTER TABLE user_info_data ADD COLUMN user_index INT; + +\c - - - :worker_2_port +SET search_path TO master_evaluation_combinations_modify; + +PREPARE insert_with_function_and_param(user_data) AS INSERT INTO user_info_data VALUES (3, $1, get_local_node_id_stable()) RETURNING user_id; +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); +EXECUTE insert_with_function_and_param(('test', 1)::user_data); + +\c - - - :master_port +SET search_path TO master_evaluation_combinations_modify; +ALTER TABLE user_info_data DROP COLUMN user_index; +TRUNCATE user_info_data; + + +\c - - - :worker_2_port +SET citus.log_local_commands TO ON; +SET search_path TO master_evaluation_combinations_modify; + +-- all local values +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, '(''test3'', 3)'), (4, '(''test4'', 4)'), (7, '(''test7'', 7)'), +(9, '(''test9'', 9)'), (11, '(''test11'', 11)'), (12, '(''test12'', 12)'), +(14, '(''test14'', 14)'), (16, '(''test16'', 16)'); + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE router_with_param(int) AS DELETE FROM user_info_data WHERE user_id = $1 AND user_id = $1 RETURNING *; + +execute router_with_param(3); +execute router_with_param(4); +execute router_with_param(7); +execute router_with_param(9); +execute router_with_param(11); +execute router_with_param(12); +execute router_with_param(14); +execute router_with_param(16); + + +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, '(''test'', 2)'), (4, '(''test'', 2)'), (7, '(''test'', 2)'), +(9, '(''test'', 9)'), (11, '(''test'', 2)'), (12, '(''test'', 2)'), +(14, '(''test'', 2)'), (16, '(''test'', 2)'); + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE router_with_param_and_func(int) AS DELETE FROM user_info_data WHERE u_data = ('''test''', get_constant_stable())::user_data AND user_id = $1 AND user_id = $1 RETURNING *; + +execute router_with_param_and_func(3); +execute router_with_param_and_func(4); +execute router_with_param_and_func(7); +execute router_with_param_and_func(9); +execute router_with_param_and_func(11); +execute router_with_param_and_func(12); +execute router_with_param_and_func(14); +execute router_with_param_and_func(16); + +PREPARE router_with_param_on_non_dist_key_and_func(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 3 AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, '(''test'', 2)'); +EXECUTE router_with_param_on_non_dist_key_and_func(('''test''', get_constant_stable())::user_data); + + + + +PREPARE router_with_param_on_non_dist_key(user_data) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = 3 AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 1)::user_data); +EXECUTE router_with_param_on_non_dist_key(('test', 1)::user_data); + + + +INSERT INTO user_info_data (user_id, u_data) VALUES +(3, ('test', 2)), (4, ('test', 2)), (7, ('test', 2)), +(9, ('test', 2)), (11, ('test', 2)), (12, ('test', 2)), +(14, ('test', 2)), (16, ('test', 2)); + +PREPARE router_with_two_params(user_data, int) AS DELETE FROM user_info_data WHERE u_data = $1 AND user_id = $2 AND user_id = $2 RETURNING *; + +EXECUTE router_with_two_params(('test', 2)::user_data, 3); +EXECUTE router_with_two_params(('test', 2)::user_data, 4); +EXECUTE router_with_two_params(('test', 2)::user_data, 7); +EXECUTE router_with_two_params(('test', 2)::user_data, 9); +EXECUTE router_with_two_params(('test', 2)::user_data, 11); +EXECUTE router_with_two_params(('test', 2)::user_data, 12); +EXECUTE router_with_two_params(('test', 2)::user_data, 14); +EXECUTE router_with_two_params(('test', 2)::user_data, 16); + + +PREPARE router_with_only_function AS DELETE FROM user_info_data WHERE get_constant_stable() = 2AND user_id = 3 RETURNING *; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE router_with_only_function; +INSERT INTO user_info_data (user_id, u_data) VALUES (3, ('test', 2)::user_data); +EXECUTE router_with_only_function; + +-- suppress notices +\c - - - :master_port +SET client_min_messages TO ERROR; +DROP SCHEMA master_evaluation_combinations_modify CASCADE; diff --git a/src/test/regress/sql/master_evaluation_select.sql b/src/test/regress/sql/master_evaluation_select.sql new file mode 100644 index 000000000..2ea2036d2 --- /dev/null +++ b/src/test/regress/sql/master_evaluation_select.sql @@ -0,0 +1,373 @@ + +-- This test relies on metadata being synced +-- that's why is should be executed on MX schedule + +-- in this test, we are considering combinations of +-- several Citus features, and there is one prepared +-- statement for the combinations of following: +-- (a) Router Select vs Fast Path Router Select +-- (b) Local Execution vs Remote Execution +-- (c) Parameters on distribution key vs Parameters on non-dist key +-- vs Non-parametrized queries +-- (d) Master Function Evaluation Required vs +-- Master Function Evaluation Not Required + +CREATE SCHEMA master_evaluation_combinations; +SET search_path TO master_evaluation_combinations; + +SET citus.next_shard_id TO 1170000; + +-- create a volatile function that returns the local node id +CREATE OR REPLACE FUNCTION get_local_node_id_volatile() +RETURNS INT AS $$ +DECLARE localGroupId int; +BEGIN + SELECT groupid INTO localGroupId FROM pg_dist_local_group; + RETURN localGroupId; +END; $$ language plpgsql VOLATILE; +SELECT create_distributed_function('get_local_node_id_volatile()'); + +CREATE TYPE user_data AS (name text, age int); + +SET citus.replication_model TO streaming; +SET citus.shard_replication_factor TO 1; + +CREATE TABLE user_info_data (user_id int, u_data user_data); +SELECT create_distributed_table('user_info_data', 'user_id'); + +-- show that local id is 0, we'll use this information +SELECT get_local_node_id_volatile(); + +-- load data +INSERT INTO user_info_data SELECT i, ('name' || i, i % 20 + 20)::user_data FROM generate_series(0,100)i; + +-- we expect that the function is evaluated on the worker node, so we should get a row +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1; + + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param(int) AS SELECT count(*) FROM user_info_data WHERE user_id = $1; + +execute fast_path_router_with_param(1); +execute fast_path_router_with_param(2); +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(4); +execute fast_path_router_with_param(5); +execute fast_path_router_with_param(6); +execute fast_path_router_with_param(7); +execute fast_path_router_with_param(8); + + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1; + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param_and_func(int) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = $1; + +execute fast_path_router_with_param_and_func(1); +execute fast_path_router_with_param_and_func(2); +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(4); +execute fast_path_router_with_param_and_func(5); +execute fast_path_router_with_param_and_func(6); +execute fast_path_router_with_param_and_func(7); +execute fast_path_router_with_param_and_func(8); + + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1 AND u_data = ('name1', 21)::user_data; + +PREPARE fast_path_router_with_param_on_non_dist_key_and_func(user_data) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1 AND u_data = $1; +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + + +SELECT count(*) FROM user_info_data WHERE user_id = 1 AND u_data = ('name1', 21)::user_data; +PREPARE fast_path_router_with_param_on_non_dist_key(user_data) AS SELECT count(*) FROM user_info_data WHERE user_id = 1 AND u_data = $1; +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name1', 21)::user_data); + + +PREPARE fast_path_router_with_two_params(user_data, int) AS SELECT count(*) FROM user_info_data WHERE user_id = $2 AND u_data = $1; + +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE fast_path_router_with_two_params(('name1', 21)::user_data, 1); + + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1; + +PREPARE fast_path_router_with_only_function AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 1; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = 1; + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE router_with_param(int) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = $1; + +execute router_with_param(1); +execute router_with_param(2); +execute router_with_param(3); +execute router_with_param(4); +execute router_with_param(5); +execute router_with_param(6); +execute router_with_param(7); +execute router_with_param(8); + + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = 1; + +PREPARE router_with_param_and_func(int) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = $1; + +execute router_with_param_and_func(1); +execute router_with_param_and_func(2); +execute router_with_param_and_func(3); +execute router_with_param_and_func(4); +execute router_with_param_and_func(5); +execute router_with_param_and_func(6); +execute router_with_param_and_func(7); +execute router_with_param_and_func(8); + +-- same query as router_with_param, but with consts +SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = 1; + + +PREPARE router_with_param_on_non_dist_key(user_data) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 1 AND u1.u_data = $1; +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name1', 21)::user_data); + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 1 AND u1.u_data = ('name1', 21)::user_data; + +PREPARE router_with_param_on_non_dist_key_and_func(user_data) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 1 AND u1.u_data = $1; +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name1', 21)::user_data); + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = 1 AND u1.u_data = ('name1', 21)::user_data; + +PREPARE router_with_two_params(user_data, int) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = $2 AND u1.u_data = $1; + +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); +EXECUTE router_with_two_params(('name1', 21)::user_data, 1); + + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING(user_id) WHERE user_id = 1; + +PREPARE router_with_only_function AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING(user_id) WHERE user_id = 1; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; + +\c - - - :worker_2_port + +SET citus.log_local_commands TO ON; +SET search_path TO master_evaluation_combinations; + +-- show that the data with user_id = 3 is local +SELECT count(*) FROM user_info_data WHERE user_id = 3; + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param(int) AS SELECT count(*) FROM user_info_data WHERE user_id = $1; + +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(3); +execute fast_path_router_with_param(3); + + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 3; + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE fast_path_router_with_param_and_func(int) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = $1; + +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(3); +execute fast_path_router_with_param_and_func(8); + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 3 AND u_data = ('name3', 23)::user_data; + +PREPARE fast_path_router_with_param_on_non_dist_key_and_func(user_data) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 3 AND u_data = $1; +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); + +SELECT count(*) FROM user_info_data WHERE user_id = 3 AND u_data = ('name3', 23)::user_data; + +PREPARE fast_path_router_with_param_on_non_dist_key(user_data) AS SELECT count(*) FROM user_info_data WHERE user_id = 3 AND u_data = $1; +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE fast_path_router_with_param_on_non_dist_key(('name3', 23)::user_data); + +PREPARE fast_path_router_with_only_function AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data WHERE user_id = 3; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; +EXECUTE fast_path_router_with_only_function; + + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = 3; + +-- make sure that it is also true for fast-path router queries with paramaters +PREPARE router_with_param(int) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = $1; + +execute router_with_param(3); +execute router_with_param(3); +execute router_with_param(3); +execute router_with_param(3); +execute router_with_param(3); +execute router_with_param(3); +execute router_with_param(3); +execute router_with_param(3); + + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = 3; + +PREPARE router_with_param_and_func(int) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = $1; + +execute router_with_param_and_func(3); +execute router_with_param_and_func(3); +execute router_with_param_and_func(3); +execute router_with_param_and_func(3); +execute router_with_param_and_func(3); +execute router_with_param_and_func(3); +execute router_with_param_and_func(3); +execute router_with_param_and_func(3); + +-- same query as router_with_param, but with consts +SELECT get_local_node_id_volatile() > 0 FROM user_info_data m1 JOIN user_info_data m2 USING(user_id) WHERE m1.user_id = 3; + + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = ('name3', 23)::user_data; + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = ('name3', 23)::user_data; + +PREPARE router_with_param_on_non_dist_key(user_data) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = $1; +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key(('name3', 23)::user_data); + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = ('name3', 23)::user_data; + +PREPARE router_with_param_on_non_dist_key_and_func(user_data) AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE u1.user_id = 3 AND u1.u_data = $1; +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); +EXECUTE router_with_param_on_non_dist_key_and_func(('name3', 23)::user_data); + +SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = 3 AND u1.u_data = ('name3', 23)::user_data; + +PREPARE router_with_two_params(user_data, int) AS SELECT count(*) FROM user_info_data u1 JOIN user_info_data u2 USING (user_id) WHERE user_id = $2 AND u1.u_data = $1; + +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); +EXECUTE router_with_two_params(('name3', 23)::user_data, 3); + +SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING(user_id) WHERE user_id = 3; + +PREPARE router_with_only_function AS SELECT get_local_node_id_volatile() > 0 FROM user_info_data u1 JOIN user_info_data u2 USING(user_id) WHERE user_id = 3; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; +EXECUTE router_with_only_function; + + +-- suppress notices +\c - - - :master_port +SET client_min_messages TO ERROR; +DROP SCHEMA master_evaluation_combinations CASCADE;