Strip trailing whitespace and add final newline (#3186)

This brings files in line with our editorconfig file
pull/3207/head
Philip Dubé 2019-11-21 13:25:37 +00:00 committed by Jelte Fennema
parent 1d8dde232f
commit c563e0825c
274 changed files with 6482 additions and 6638 deletions

View File

@ -22,6 +22,12 @@ jobs:
- run:
name: 'Check Style'
command: citus_indent --check
- run:
name: 'Fix whitespace'
command: ci/editorconfig.sh
- run:
name: 'Check if whitespace fixing changed anything, install editorconfig if it did'
command: git diff --exit-code
- run:
name: 'Remove useless declarations'
command: ci/remove_useless_declarations.sh

View File

@ -12,12 +12,18 @@ insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
# Don't change test output files
[*.out]
# Don't change test output files, pngs or test data files
[*.{out,png,data}]
insert_final_newline = unset
trim_trailing_whitespace = unset
[*.sql]
# Don't change test/regress/output directory, this needs to be a separate rule
# for some reason
[/src/test/regress/output/**]
insert_final_newline = unset
trim_trailing_whitespace = unset
[*.sql,*.sh]
indent_style = space
indent_size = 4
tab_width = 4

View File

@ -658,4 +658,4 @@ specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.

16
ci/editorconfig.sh Executable file
View File

@ -0,0 +1,16 @@
#!/bin/sh
set -eu
for f in $(git ls-tree -r HEAD --name-only); do
if [ "$f" = "${f%.out}" ] &&
[ "$f" = "${f%.data}" ] &&
[ "$f" = "${f%.png}" ] &&
[ "$(dirname "$f")" != "src/test/regress/output" ]
then
# Trim trailing whitespace
sed -e 's/[[:space:]]*$//' -i "./$f"
# Add final newline if not there
if [ -n "$(tail -c1 "$f")" ]; then
echo >> "$f"
fi
fi
done

View File

@ -6,7 +6,7 @@ If the input query is trivial (e.g., no joins, no subqueries/ctes, single table
Distributed planning (`CreateDistributedPlan`) tries several different methods to plan the query:
1. Fast-path router planner, proceed if the query prunes down to a single shard of a single table
2. Router planner, proceed if the query prunes down to a single set of co-located shards
3. Modification planning, proceed if the query is a DML command and all joins are co-located
@ -15,7 +15,7 @@ Distributed planning (`CreateDistributedPlan`) tries several different methods t
## Fast-path router planner
By examining the query tree, if we can decide that the query hits only a single shard of a single table, we can skip calling `standard_planner()`. Later on the execution, we simply fetch the filter on the distribution key and do the pruning.
By examining the query tree, if we can decide that the query hits only a single shard of a single table, we can skip calling `standard_planner()`. Later on the execution, we simply fetch the filter on the distribution key and do the pruning.
As the name reveals, this can be considered as a sub-item of Router planner described below. The only difference is that fast-path planner doesn't rely on `standard_planner()` for collecting restriction information.

View File

@ -1,6 +1,6 @@
-- citus--7.0-1--7.0-2.sql
-- citus--7.0-1--7.0-2.sql
-- redefine shard_name as STRICT
-- redefine shard_name as STRICT
CREATE OR REPLACE FUNCTION pg_catalog.shard_name(object_name regclass, shard_id bigint)
RETURNS text
LANGUAGE C STABLE STRICT

View File

@ -1,4 +1,4 @@
-- citus-7.0-10--7.0-11
-- citus-7.0-10--7.0-11
SET search_path = 'pg_catalog';
@ -8,9 +8,9 @@ DECLARE
colocated_tables regclass[];
BEGIN
SELECT get_colocated_table_array(relation) INTO colocated_tables;
PERFORM
master_update_shard_statistics(shardid)
PERFORM
master_update_shard_statistics(shardid)
FROM
pg_dist_shard
WHERE
@ -19,7 +19,7 @@ END;
$$ LANGUAGE 'plpgsql';
COMMENT ON FUNCTION master_update_table_statistics(regclass)
IS 'updates shard statistics of the given table and its colocated tables';
CREATE OR REPLACE FUNCTION get_colocated_shard_array(bigint)
RETURNS BIGINT[]
LANGUAGE C STRICT

View File

@ -1,4 +1,4 @@
-- citus--7.0-11--7.0-12.sql
-- citus--7.0-11--7.0-12.sql
CREATE OR REPLACE FUNCTION pg_catalog.citus_create_restore_point(text)
RETURNS pg_lsn

View File

@ -1,4 +1,4 @@
-- citus--7.0-12--7.0-13.sql
-- citus--7.0-12--7.0-13.sql
SET search_path = 'pg_catalog';
@ -18,7 +18,7 @@ BEGIN
SELECT array_agg(object_identity) INTO sequence_names
FROM pg_event_trigger_dropped_objects()
WHERE object_type = 'sequence';
FOR v_obj IN SELECT * FROM pg_event_trigger_dropped_objects() JOIN
pg_dist_partition ON (logicalrelid = objid)
WHERE object_type IN ('table', 'foreign table')
@ -28,20 +28,20 @@ BEGIN
-- ensure all shards are dropped
PERFORM master_drop_all_shards(v_obj.objid, v_obj.schema_name, v_obj.object_name);
PERFORM master_drop_distributed_table_metadata(v_obj.objid, v_obj.schema_name, v_obj.object_name);
END LOOP;
IF cardinality(sequence_names) = 0 THEN
RETURN;
END IF;
PERFORM master_drop_sequences(sequence_names);
END;
$cdbdt$;
COMMENT ON FUNCTION citus_drop_trigger()
IS 'perform checks and actions at the end of DROP actions';
RESET search_path;

View File

@ -1,4 +1,4 @@
-- citus--7.0-13--7.0-14.sql
-- citus--7.0-13--7.0-14.sql
SET search_path = 'pg_catalog';

View File

@ -1,4 +1,4 @@
-- citus--7.0-14--7.0-15
-- citus--7.0-14--7.0-15
DROP FUNCTION pg_catalog.dump_local_wait_edges(int4);

View File

@ -1,4 +1,4 @@
-- citus--7.0-15--7.1-1
-- citus--7.0-15--7.1-1
SET search_path = 'pg_catalog';

View File

@ -1,4 +1,4 @@
-- citus--7.0-2--7.0-3.sql
-- citus--7.0-2--7.0-3.sql
ALTER SEQUENCE pg_catalog.pg_dist_shard_placement_placementid_seq
RENAME TO pg_dist_placement_placementid_seq;

View File

@ -1,4 +1,4 @@
-- citus--7.0-3--7.0-4.sql
-- citus--7.0-3--7.0-4.sql
SET search_path = 'pg_catalog';

View File

@ -1,4 +1,4 @@
-- citus--7.0-4--7.0-5.sql
-- citus--7.0-4--7.0-5.sql
SET search_path = 'pg_catalog';

View File

@ -1,4 +1,4 @@
-- citus--7.0-5--7.0-6
-- citus--7.0-5--7.0-6
CREATE FUNCTION pg_catalog.dump_local_wait_edges(
IN source_node_id int4,

View File

@ -1,4 +1,4 @@
-- citus--7.0-6--7.0-7
-- citus--7.0-6--7.0-7
CREATE FUNCTION citus.replace_isolation_tester_func()
RETURNS void AS $$
@ -66,7 +66,7 @@ RETURNS int4[] AS $$
-- pg says we're not blocked locally; check whether we're blocked globally.
SELECT transaction_number INTO mLocalTransactionNum
FROM get_all_active_transactions() WHERE process_id = pBlockedPid;
SELECT array_agg(process_id) INTO mRemoteBlockingPids FROM (
WITH activeTransactions AS (
SELECT process_id, transaction_number FROM get_all_active_transactions()

View File

@ -1,4 +1,4 @@
-- citus--7.0-7--7.0-8.sql
-- citus--7.0-7--7.0-8.sql
SET search_path = 'pg_catalog';

View File

@ -1,4 +1,4 @@
-- citus-7.0-8--7.0-9
-- citus-7.0-8--7.0-9
SET search_path = 'pg_catalog';

View File

@ -1,4 +1,4 @@
-- citus-7.0-9--7.0-10
-- citus-7.0-9--7.0-10
SET search_path = 'pg_catalog';

View File

@ -1,4 +1,4 @@
-- citus--7.1-1--7.1-2
-- citus--7.1-1--7.1-2
CREATE OR REPLACE FUNCTION pg_catalog.citus_version()
RETURNS text

View File

@ -1,4 +1,4 @@
-- citus--7.1-2--7.1-3
-- citus--7.1-2--7.1-3
CREATE TABLE citus.pg_dist_node_metadata(
metadata jsonb NOT NULL

View File

@ -1,4 +1,4 @@
-- citus--7.1-3--7.1-4
-- citus--7.1-3--7.1-4
CREATE TYPE citus.shard_transfer_mode AS ENUM (
'auto',

View File

@ -1,4 +1,4 @@
-- citus--7.1-4--7.2-1
-- citus--7.1-4--7.2-1
-- bump version to 7.2-1
-- bump version to 7.2-1

View File

@ -1,4 +1,4 @@
-- citus--7.2-1--7.2-2
-- citus--7.2-1--7.2-2
CREATE TYPE citus.copy_format AS ENUM ('csv', 'binary', 'text');

View File

@ -1,4 +1,4 @@
-- citus--7.2-2--7.2-3
-- citus--7.2-2--7.2-3
DROP FUNCTION pg_catalog.read_intermediate_result(text,citus.copy_format);
DROP TYPE citus.copy_format;

View File

@ -1,4 +1,4 @@
-- citus--7.2-3--7.3-1
-- citus--7.2-3--7.3-1
-- bump version to 7.3-1
-- bump version to 7.3-1

View File

@ -1,4 +1,4 @@
-- citus--7.3-1--7.3-2
-- citus--7.3-1--7.3-2
CREATE FUNCTION pg_catalog.citus_text_send_as_jsonb(text)
RETURNS bytea

View File

@ -1,4 +1,4 @@
-- citus--7.3-2--7.3-3
-- citus--7.3-2--7.3-3
-- Citus json aggregate helpers
@ -6,7 +6,7 @@ CREATE FUNCTION pg_catalog.citus_jsonb_concatenate(state jsonb, val jsonb)
RETURNS jsonb
LANGUAGE SQL
AS $function$
SELECT CASE
SELECT CASE
WHEN val IS NULL THEN state
WHEN jsonb_typeof(state) = 'null' THEN val
ELSE state || val
@ -24,7 +24,7 @@ CREATE FUNCTION pg_catalog.citus_json_concatenate(state json, val json)
RETURNS json
LANGUAGE SQL
AS $function$
SELECT CASE
SELECT CASE
WHEN val IS NULL THEN state
WHEN json_typeof(state) = 'null' THEN val
WHEN json_typeof(state) = 'object' THEN
@ -33,7 +33,7 @@ AS $function$
UNION ALL
SELECT * FROM json_each(val)
) t)
ELSE
ELSE
(SELECT json_agg(a) FROM (
SELECT json_array_elements(state) AS a
UNION ALL
@ -60,7 +60,7 @@ CREATE AGGREGATE pg_catalog.jsonb_cat_agg(jsonb) (
);
COMMENT ON AGGREGATE pg_catalog.jsonb_cat_agg(jsonb)
IS 'concatenate input jsonbs into a single jsonb';
CREATE AGGREGATE pg_catalog.json_cat_agg(json) (
SFUNC = citus_json_concatenate,
FINALFUNC = citus_json_concatenate_final,

View File

@ -1,4 +1,4 @@
-- citus--7.3-3--7.4-1
-- citus--7.3-3--7.4-1
DROP FUNCTION IF EXISTS master_expire_table_cache(regclass);
DROP FUNCTION IF EXISTS pg_catalog.worker_fetch_regular_table(text, bigint, text[], integer[]);

View File

@ -1,4 +1,4 @@
-- citus--7.4-1--7.4-2
-- citus--7.4-1--7.4-2
CREATE OR REPLACE FUNCTION pg_catalog.citus_drop_trigger()
RETURNS event_trigger

View File

@ -1,4 +1,4 @@
-- citus--7.4-2--7.4-3
-- citus--7.4-2--7.4-3
SET search_path = 'pg_catalog';
-- note that we're not dropping the older version of the function

View File

@ -1,4 +1,4 @@
-- citus--7.4-3--7.5-1
-- citus--7.4-3--7.5-1
-- bump version to 7.5-1
-- bump version to 7.5-1

View File

@ -1,4 +1,4 @@
-- citus--7.5-1--7.5-2
-- citus--7.5-1--7.5-2
SET search_path = 'pg_catalog';
-- note that we're not dropping the older version of the function

View File

@ -1,4 +1,4 @@
-- citus--7.5-2--7.5-3
-- citus--7.5-2--7.5-3
SET search_path = 'pg_catalog';
CREATE FUNCTION master_dist_authinfo_cache_invalidate()

View File

@ -1,4 +1,4 @@
-- citus--7.5-3--7.5-4
-- citus--7.5-3--7.5-4
CREATE FUNCTION pg_catalog.citus_query_stats(OUT queryid bigint,
OUT userid oid,

View File

@ -1,4 +1,4 @@
-- citus--7.5-4--7.5-5
-- citus--7.5-4--7.5-5
CREATE FUNCTION pg_catalog.citus_executor_name(executor_type int)
RETURNS TEXT
LANGUAGE plpgsql

View File

@ -1,4 +1,4 @@
-- citus--7.5-5--7.5-6
-- citus--7.5-5--7.5-6
-- Don't want this to be available to non-superusers.
REVOKE ALL ON FUNCTION pg_catalog.citus_stat_statements_reset() FROM PUBLIC;

View File

@ -1,4 +1,4 @@
-- citus--7.5-6--7.5-7
-- citus--7.5-6--7.5-7
SET search_path = 'pg_catalog';
CREATE FUNCTION pg_catalog.poolinfo_valid(text)

View File

@ -1,4 +1,4 @@
-- citus--7.5-7--8.0-1
-- citus--7.5-7--8.0-1
-- bump version to 8.0-1
-- bump version to 8.0-1

View File

@ -1,4 +1,4 @@
-- citus--7.5-7--8.0-1
-- citus--7.5-7--8.0-1
SET search_path = 'pg_catalog';
CREATE OR REPLACE FUNCTION pg_catalog.relation_is_a_known_shard(regclass)
@ -20,7 +20,7 @@ COMMENT ON FUNCTION citus_table_is_visible(oid)
-- this is the exact same query with what \d
-- command produces, except pg_table_is_visible
-- is replaced with pg_catalog.relation_is_a_known_shard(c.oid)
CREATE VIEW citus.citus_shards_on_worker AS
CREATE VIEW citus.citus_shards_on_worker AS
SELECT n.nspname as "Schema",
c.relname as "Name",
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'table' END as "Type",
@ -39,7 +39,7 @@ GRANT SELECT ON pg_catalog.citus_shards_on_worker TO public;
-- this is the exact same query with what \di
-- command produces, except pg_table_is_visible
-- is replaced with pg_catalog.relation_is_a_known_shard(c.oid)
CREATE VIEW citus.citus_shard_indexes_on_worker AS
CREATE VIEW citus.citus_shard_indexes_on_worker AS
SELECT n.nspname as "Schema",
c.relname as "Name",
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'table' END as "Type",

View File

@ -1,4 +1,4 @@
-- citus--8.0-10--8.0-11
-- citus--8.0-10--8.0-11
SET search_path = 'pg_catalog';
-- Deprecated functions

View File

@ -1,4 +1,4 @@
-- citus--8.0-11--8.0-12
-- citus--8.0-11--8.0-12
SET search_path = 'pg_catalog';
CREATE OR REPLACE FUNCTION pg_catalog.citus_stat_statements(OUT queryid bigint,

View File

@ -1,4 +1,4 @@
-- citus--8.0-12--8.0-13
-- citus--8.0-12--8.0-13
CREATE FUNCTION citus_check_defaults_for_sslmode()
RETURNS void
LANGUAGE C STRICT

View File

@ -1,4 +1,4 @@
-- citus--8.0-13--8.1-1.sql
-- citus--8.0-13--8.1-1.sql
-- bump version to 8.1-1
-- bump version to 8.1-1

View File

@ -1,4 +1,4 @@
-- citus--8.0-2--8.0-3
-- citus--8.0-2--8.0-3
SET search_path = 'pg_catalog';
CREATE FUNCTION master_remove_partition_metadata(logicalrelid regclass,

View File

@ -1,4 +1,4 @@
-- citus--8.0-3--8.0-4
-- citus--8.0-3--8.0-4
SET search_path = 'pg_catalog';
CREATE OR REPLACE FUNCTION lock_relation_if_exists(table_name text, lock_mode text)

View File

@ -1,37 +1,37 @@
-- citus--8.0-4--8.0-5.sql
-- citus--8.0-4--8.0-5.sql
SET search_path = 'pg_catalog';
DROP FUNCTION IF EXISTS get_all_active_transactions();
CREATE OR REPLACE FUNCTION get_all_active_transactions(OUT datid oid, OUT process_id int, OUT initiator_node_identifier int4, OUT worker_query BOOL,
OUT transaction_number int8, OUT transaction_stamp timestamptz)
RETURNS SETOF RECORD
LANGUAGE C STRICT AS 'MODULE_PATHNAME',
CREATE OR REPLACE FUNCTION get_all_active_transactions(OUT datid oid, OUT process_id int, OUT initiator_node_identifier int4, OUT worker_query BOOL,
OUT transaction_number int8, OUT transaction_stamp timestamptz)
RETURNS SETOF RECORD
LANGUAGE C STRICT AS 'MODULE_PATHNAME',
$$get_all_active_transactions$$;
COMMENT ON FUNCTION get_all_active_transactions(OUT datid oid, OUT datname text, OUT process_id int, OUT initiator_node_identifier int4, OUT worker_query BOOL,
OUT transaction_number int8, OUT transaction_stamp timestamptz)
COMMENT ON FUNCTION get_all_active_transactions(OUT datid oid, OUT datname text, OUT process_id int, OUT initiator_node_identifier int4, OUT worker_query BOOL,
OUT transaction_number int8, OUT transaction_stamp timestamptz)
IS 'returns distributed transaction ids of active distributed transactions';
CREATE OR REPLACE FUNCTION citus_dist_stat_activity(OUT query_hostname text, OUT query_hostport int, OUT master_query_host_name text, OUT master_query_host_port int,
OUT transaction_number int8, OUT transaction_stamp timestamptz, OUT datid oid, OUT datname name,
OUT pid int, OUT usesysid oid, OUT usename name, OUT application_name text, OUT client_addr INET,
OUT client_hostname TEXT, OUT client_port int, OUT backend_start timestamptz, OUT xact_start timestamptz,
OUT query_start timestamptz, OUT state_change timestamptz, OUT wait_event_type text, OUT wait_event text,
OUT state text, OUT backend_xid xid, OUT backend_xmin xid, OUT query text, OUT backend_type text)
RETURNS SETOF RECORD
LANGUAGE C STRICT AS 'MODULE_PATHNAME',
CREATE OR REPLACE FUNCTION citus_dist_stat_activity(OUT query_hostname text, OUT query_hostport int, OUT master_query_host_name text, OUT master_query_host_port int,
OUT transaction_number int8, OUT transaction_stamp timestamptz, OUT datid oid, OUT datname name,
OUT pid int, OUT usesysid oid, OUT usename name, OUT application_name text, OUT client_addr INET,
OUT client_hostname TEXT, OUT client_port int, OUT backend_start timestamptz, OUT xact_start timestamptz,
OUT query_start timestamptz, OUT state_change timestamptz, OUT wait_event_type text, OUT wait_event text,
OUT state text, OUT backend_xid xid, OUT backend_xmin xid, OUT query text, OUT backend_type text)
RETURNS SETOF RECORD
LANGUAGE C STRICT AS 'MODULE_PATHNAME',
$$citus_dist_stat_activity$$;
COMMENT ON FUNCTION citus_dist_stat_activity(OUT query_hostname text, OUT query_hostport int, OUT master_query_host_name text, OUT master_query_host_port int,
OUT transaction_number int8, OUT transaction_stamp timestamptz, OUT datid oid, OUT datname name,
OUT pid int, OUT usesysid oid, OUT usename name, OUT application_name text, OUT client_addr INET,
OUT client_hostname TEXT, OUT client_port int, OUT backend_start timestamptz, OUT xact_start timestamptz,
OUT query_start timestamptz, OUT state_change timestamptz, OUT wait_event_type text, OUT wait_event text,
OUT state text, OUT backend_xid xid, OUT backend_xmin xid, OUT query text, OUT backend_type text)
COMMENT ON FUNCTION citus_dist_stat_activity(OUT query_hostname text, OUT query_hostport int, OUT master_query_host_name text, OUT master_query_host_port int,
OUT transaction_number int8, OUT transaction_stamp timestamptz, OUT datid oid, OUT datname name,
OUT pid int, OUT usesysid oid, OUT usename name, OUT application_name text, OUT client_addr INET,
OUT client_hostname TEXT, OUT client_port int, OUT backend_start timestamptz, OUT xact_start timestamptz,
OUT query_start timestamptz, OUT state_change timestamptz, OUT wait_event_type text, OUT wait_event text,
OUT state text, OUT backend_xid xid, OUT backend_xmin xid, OUT query text, OUT backend_type text)
IS 'returns distributed transaction activity on distributed tables';
CREATE VIEW citus.citus_dist_stat_activity AS
@ -41,22 +41,22 @@ GRANT SELECT ON pg_catalog.citus_dist_stat_activity TO PUBLIC;
CREATE OR REPLACE FUNCTION citus_worker_stat_activity(OUT query_hostname text, OUT query_hostport int, OUT master_query_host_name text, OUT master_query_host_port int,
OUT transaction_number int8, OUT transaction_stamp timestamptz, OUT datid oid, OUT datname name,
OUT pid int, OUT usesysid oid, OUT usename name, OUT application_name text, OUT client_addr INET,
OUT client_hostname TEXT, OUT client_port int, OUT backend_start timestamptz, OUT xact_start timestamptz,
OUT query_start timestamptz, OUT state_change timestamptz, OUT wait_event_type text, OUT wait_event text,
OUT state text, OUT backend_xid xid, OUT backend_xmin xid, OUT query text, OUT backend_type text)
RETURNS SETOF RECORD
LANGUAGE C STRICT AS 'MODULE_PATHNAME',
CREATE OR REPLACE FUNCTION citus_worker_stat_activity(OUT query_hostname text, OUT query_hostport int, OUT master_query_host_name text, OUT master_query_host_port int,
OUT transaction_number int8, OUT transaction_stamp timestamptz, OUT datid oid, OUT datname name,
OUT pid int, OUT usesysid oid, OUT usename name, OUT application_name text, OUT client_addr INET,
OUT client_hostname TEXT, OUT client_port int, OUT backend_start timestamptz, OUT xact_start timestamptz,
OUT query_start timestamptz, OUT state_change timestamptz, OUT wait_event_type text, OUT wait_event text,
OUT state text, OUT backend_xid xid, OUT backend_xmin xid, OUT query text, OUT backend_type text)
RETURNS SETOF RECORD
LANGUAGE C STRICT AS 'MODULE_PATHNAME',
$$citus_worker_stat_activity$$;
COMMENT ON FUNCTION citus_worker_stat_activity(OUT query_hostname text, OUT query_hostport int, OUT master_query_host_name text, OUT master_query_host_port int,
OUT transaction_number int8, OUT transaction_stamp timestamptz, OUT datid oid, OUT datname name,
OUT pid int, OUT usesysid oid, OUT usename name, OUT application_name text, OUT client_addr INET,
OUT client_hostname TEXT, OUT client_port int, OUT backend_start timestamptz, OUT xact_start timestamptz,
OUT query_start timestamptz, OUT state_change timestamptz, OUT wait_event_type text, OUT wait_event text,
OUT state text, OUT backend_xid xid, OUT backend_xmin xid, OUT query text, OUT backend_type text)
COMMENT ON FUNCTION citus_worker_stat_activity(OUT query_hostname text, OUT query_hostport int, OUT master_query_host_name text, OUT master_query_host_port int,
OUT transaction_number int8, OUT transaction_stamp timestamptz, OUT datid oid, OUT datname name,
OUT pid int, OUT usesysid oid, OUT usename name, OUT application_name text, OUT client_addr INET,
OUT client_hostname TEXT, OUT client_port int, OUT backend_start timestamptz, OUT xact_start timestamptz,
OUT query_start timestamptz, OUT state_change timestamptz, OUT wait_event_type text, OUT wait_event text,
OUT state text, OUT backend_xid xid, OUT backend_xmin xid, OUT query text, OUT backend_type text)
IS 'returns distributed transaction activity on shards of distributed tables';
CREATE VIEW citus.citus_worker_stat_activity AS

View File

@ -1,4 +1,4 @@
-- citus--8.0-5--8.0-6
-- citus--8.0-5--8.0-6
SET search_path = 'pg_catalog';
CREATE FUNCTION get_global_active_transactions(OUT datid oid, OUT process_id int, OUT initiator_node_identifier int4, OUT worker_query BOOL, OUT transaction_number int8, OUT transaction_stamp timestamptz)
@ -42,10 +42,10 @@ RETURNS int4[] AS $$
WHERE waiting_transaction_num = mLocalTransactionNum) THEN
SELECT array_agg(pBlockedPid) INTO mRemoteBlockingPids;
END IF;
RETURN mRemoteBlockingPids;
END;
$$ LANGUAGE plpgsql;
$$ LANGUAGE plpgsql;
#include "udfs/citus_isolation_test_session_is_blocked/8.0-6.sql"

View File

@ -1,9 +1,9 @@
-- citus--8.0-6--8.0-7
-- citus--8.0-6--8.0-7
SET search_path = 'pg_catalog';
CREATE VIEW citus.citus_lock_waits AS
WITH
WITH
citus_dist_stat_activity AS
(
SELECT * FROM citus_dist_stat_activity
@ -19,7 +19,7 @@ citus_dist_stat_activity_with_node_id AS
FROM
citus_dist_stat_activity LEFT JOIN pg_dist_node
ON
citus_dist_stat_activity.master_query_host_name = pg_dist_node.nodename AND
citus_dist_stat_activity.master_query_host_name = pg_dist_node.nodename AND
citus_dist_stat_activity.master_query_host_port = pg_dist_node.nodeport
)
SELECT

View File

@ -1,14 +1,14 @@
-- citus--8.0-7--8.0-8
-- citus--8.0-7--8.0-8
SET search_path = 'pg_catalog';
DROP FUNCTION IF EXISTS pg_catalog.worker_drop_distributed_table(logicalrelid Oid);
CREATE FUNCTION worker_drop_distributed_table(table_name text)
RETURNS VOID
LANGUAGE C STRICT
AS 'MODULE_PATHNAME', $$worker_drop_distributed_table$$;
COMMENT ON FUNCTION worker_drop_distributed_table(table_name text)
IS 'drop the distributed table and its reference from metadata tables';

View File

@ -1,4 +1,4 @@
-- citus--8.0-9--8.0-10
-- citus--8.0-9--8.0-10
SET search_path = 'pg_catalog';
CREATE FUNCTION worker_execute_sql_task(jobid bigint, taskid integer, query text, binary bool)

View File

@ -1,4 +1,4 @@
-- citus--8.1-1--8.2-1.sql
-- citus--8.1-1--8.2-1.sql
-- bump version to 8.2-1
-- bump version to 8.2-1

View File

@ -1,3 +1,3 @@
-- citus--8.2-1--8.2-2.sql
-- citus--8.2-1--8.2-2.sql
DROP FUNCTION IF EXISTS pg_catalog.create_insert_proxy_for_table(regclass,regclass);

View File

@ -1,4 +1,4 @@
-- citus--8.2-2--8.2-3
-- citus--8.2-2--8.2-3
SET search_path = 'pg_catalog';

View File

@ -1,4 +1,4 @@
-- citus--8.2-3--8.2-4
-- citus--8.2-3--8.2-4
CREATE OR REPLACE FUNCTION pg_catalog.citus_executor_name(executor_type int)
RETURNS text

View File

@ -1,4 +1,4 @@
-- citus--8.2-4--8.3-1
-- citus--8.2-4--8.3-1
-- bump version to 8.3-1
-- bump version to 8.3-1

View File

@ -1,4 +1,4 @@
-- citus--8.3-1--9.0-1
-- citus--8.3-1--9.0-1
SET search_path = 'pg_catalog';
@ -77,7 +77,7 @@ CREATE TRIGGER dist_object_cache_invalidate
-- by the operator.
ALTER TABLE pg_dist_poolinfo DROP CONSTRAINT pg_dist_poolinfo_nodeid_fkey;
-- if the rebalancer extension is still around, drop it before creating Citus functions
-- if the rebalancer extension is still around, drop it before creating Citus functions
DROP EXTENSION IF EXISTS shard_rebalancer;
#include "udfs/get_rebalance_table_shards_plan/9.0-1.sql"

View File

@ -9,4 +9,3 @@ COMMENT ON FUNCTION pg_catalog.alter_role_if_exists(
role_name text,
utility_query text)
IS 'runs the utility query, if the role exists';

View File

@ -9,4 +9,3 @@ COMMENT ON FUNCTION pg_catalog.alter_role_if_exists(
role_name text,
utility_query text)
IS 'runs the utility query, if the role exists';

View File

@ -15,7 +15,7 @@ RETURNS boolean AS $$
-- number when the worker process waiting for other session.
IF EXISTS (SELECT transaction_number FROM get_global_active_transactions()
WHERE process_id = workerProcessId AND pBlockedPid = coordinatorProcessId) THEN
SELECT transaction_number INTO mBlockedTransactionNum FROM get_global_active_transactions()
SELECT transaction_number INTO mBlockedTransactionNum FROM get_global_active_transactions()
WHERE process_id = workerProcessId AND pBlockedPid = coordinatorProcessId;
ELSE
-- Check whether transactions initiated from the coordinator get locked

View File

@ -15,7 +15,7 @@ RETURNS boolean AS $$
-- number when the worker process waiting for other session.
IF EXISTS (SELECT transaction_number FROM get_global_active_transactions()
WHERE process_id = workerProcessId AND pBlockedPid = coordinatorProcessId) THEN
SELECT transaction_number INTO mBlockedTransactionNum FROM get_global_active_transactions()
SELECT transaction_number INTO mBlockedTransactionNum FROM get_global_active_transactions()
WHERE process_id = workerProcessId AND pBlockedPid = coordinatorProcessId;
ELSE
-- Check whether transactions initiated from the coordinator get locked

View File

@ -15,7 +15,7 @@ RETURNS boolean AS $$
-- number when the worker process waiting for other session.
IF EXISTS (SELECT transaction_number FROM get_global_active_transactions()
WHERE process_id = workerProcessId AND pBlockedPid = coordinatorProcessId) THEN
SELECT transaction_number INTO mBlockedTransactionNum FROM get_global_active_transactions()
SELECT transaction_number INTO mBlockedTransactionNum FROM get_global_active_transactions()
WHERE process_id = workerProcessId AND pBlockedPid = coordinatorProcessId;
ELSE
-- Check whether transactions initiated from the coordinator get locked

View File

@ -165,14 +165,14 @@ check-citus-upgrade-local:
$(citus_upgrade_check) \
--bindir=$(bindir) \
--pgxsdir=$(pgxsdir) \
--citus-old-version=$(citus-old-version)
--citus-old-version=$(citus-old-version)
check-citus-upgrade-mixed-local:
$(citus_upgrade_check) \
--bindir=$(bindir) \
--pgxsdir=$(pgxsdir) \
--citus-old-version=$(citus-old-version) \
--mixed
--mixed
clean distclean maintainer-clean:
rm -f $(output_files) $(input_files)

View File

@ -30,7 +30,6 @@ WITH cte_1 AS (
FROM tt1
WHERE value_1 >= 2
)
DELETE FROM tt2
USING cte_2
WHERE tt2.id = cte_2.cte2_id
@ -57,7 +56,6 @@ WITH cte_1 AS (
FROM tt1
WHERE value_1 >= 2
)
DELETE FROM tt2
USING cte_2
WHERE tt2.id = cte_2.cte2_id
@ -82,9 +80,8 @@ WITH cte_1(id) AS (
FROM tt1
WHERE value_1 >= 2
)
DELETE FROM tt2
USING cte_2
USING cte_2
WHERE tt2.id = cte_2.cte2_id
RETURNING cte2_id
)
@ -107,7 +104,6 @@ WITH cte_1 AS (
FROM tt1
WHERE value_1 >= 2
)
UPDATE tt2
SET value_1 = 10
FROM cte_2
@ -130,7 +126,6 @@ WITH cte_1 AS (
WITH cte_2 AS (
SELECT * FROM tt3
)
UPDATE tt2
SET value_1 = (SELECT max((json_val->>'qty')::int) FROM cte_2)
RETURNING id, value_1

View File

@ -27,25 +27,25 @@ INSERT INTO distributed_table SELECT i::text, i % 10, row_to_json(row(i, i*i)) F
INSERT INTO second_distributed_table SELECT i::text, i % 10, row_to_json(row(i, i*i)) FROM generate_series (0, 100) i;
INSERT INTO reference_table SELECT i::text, 'user_' || i FROM generate_series (0, 100) i;
INSERT INTO local_table SELECT i::text, 'user_' || i FROM generate_series (0, 100) i;
CREATE VIEW tenant_ids AS
SELECT
tenant_id, name
FROM
CREATE VIEW tenant_ids AS
SELECT
tenant_id, name
FROM
distributed_table, reference_table
WHERE
WHERE
distributed_table.dept::text = reference_table.id
ORDER BY 2 DESC, 1 DESC;
SET client_min_messages TO DEBUG1;
-- the subquery foo is recursively planned
UPDATE
reference_table
SET
name = 'new_' || name
FROM
UPDATE
reference_table
SET
name = 'new_' || name
FROM
(
SELECT
SELECT
avg(second_distributed_table.tenant_id::int) as avg_tenant_id
FROM
FROM
second_distributed_table
) as foo
WHERE
@ -61,27 +61,27 @@ DEBUG: Plan 4 query after replacing subqueries and CTEs: UPDATE recursive_dml_q
-- the subquery foo is recursively planned
-- but note that the subquery foo itself is pushdownable
UPDATE
second_distributed_table
SET
UPDATE
second_distributed_table
SET
dept = foo.max_dept * 2
FROM
FROM
(
SELECT DISTINCT ON (tenant_id) tenant_id, max(dept) as max_dept FROM
SELECT DISTINCT ON (tenant_id) tenant_id, max(dept) as max_dept FROM
(
SELECT
SELECT
second_distributed_table.dept, second_distributed_table.tenant_id
FROM
FROM
second_distributed_table, distributed_table
WHERE
WHERE
distributed_table.tenant_id = second_distributed_table.tenant_id
) foo_inner
GROUP BY
tenant_id
tenant_id
ORDER BY 1 DESC
) as foo
WHERE
foo.tenant_id != second_distributed_table.tenant_id
foo.tenant_id != second_distributed_table.tenant_id
AND second_distributed_table.dept IN (2)
RETURNING
second_distributed_table.tenant_id, second_distributed_table.dept;
@ -103,29 +103,29 @@ DEBUG: Plan 6 query after replacing subqueries and CTEs: UPDATE recursive_dml_q
-- the subquery foo is recursively planned
-- and foo itself is a non colocated subquery and recursively planned
UPDATE
second_distributed_table
SET
UPDATE
second_distributed_table
SET
dept = foo.tenant_id::int / 4
FROM
FROM
(
SELECT DISTINCT foo_inner_1.tenant_id FROM
SELECT DISTINCT foo_inner_1.tenant_id FROM
(
SELECT
SELECT
second_distributed_table.dept, second_distributed_table.tenant_id
FROM
FROM
second_distributed_table, distributed_table
WHERE
WHERE
distributed_table.tenant_id = second_distributed_table.tenant_id
AND
second_distributed_table.dept IN (3,4)
) foo_inner_1,
(
SELECT
second_distributed_table.tenant_id
FROM
SELECT
second_distributed_table.tenant_id
FROM
second_distributed_table, distributed_table
WHERE
WHERE
distributed_table.tenant_id = second_distributed_table.tenant_id
AND
second_distributed_table.dept IN (4,5)
@ -133,21 +133,21 @@ FROM
WHERE foo_inner_1.tenant_id != foo_inner_2.tenant_id
) as foo
WHERE
foo.tenant_id != second_distributed_table.tenant_id
foo.tenant_id != second_distributed_table.tenant_id
AND second_distributed_table.dept IN (3);
DEBUG: generating subplan 8_1 for subquery SELECT second_distributed_table.tenant_id FROM recursive_dml_queries.second_distributed_table, recursive_dml_queries.distributed_table WHERE ((distributed_table.tenant_id OPERATOR(pg_catalog.=) second_distributed_table.tenant_id) AND (second_distributed_table.dept OPERATOR(pg_catalog.=) ANY (ARRAY[4, 5])))
DEBUG: generating subplan 8_2 for subquery SELECT DISTINCT foo_inner_1.tenant_id FROM (SELECT second_distributed_table.dept, second_distributed_table.tenant_id FROM recursive_dml_queries.second_distributed_table, recursive_dml_queries.distributed_table WHERE ((distributed_table.tenant_id OPERATOR(pg_catalog.=) second_distributed_table.tenant_id) AND (second_distributed_table.dept OPERATOR(pg_catalog.=) ANY (ARRAY[3, 4])))) foo_inner_1, (SELECT intermediate_result.tenant_id FROM read_intermediate_result('8_1'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text)) foo_inner_2 WHERE (foo_inner_1.tenant_id OPERATOR(pg_catalog.<>) foo_inner_2.tenant_id)
DEBUG: Plan 8 query after replacing subqueries and CTEs: UPDATE recursive_dml_queries.second_distributed_table SET dept = ((foo.tenant_id)::integer OPERATOR(pg_catalog./) 4) FROM (SELECT intermediate_result.tenant_id FROM read_intermediate_result('8_2'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text)) foo WHERE ((foo.tenant_id OPERATOR(pg_catalog.<>) second_distributed_table.tenant_id) AND (second_distributed_table.dept OPERATOR(pg_catalog.=) 3))
-- we currently do not allow local tables in modification queries
UPDATE
distributed_table
SET
UPDATE
distributed_table
SET
dept = avg_tenant_id::int
FROM
FROM
(
SELECT
SELECT
avg(local_table.id::int) as avg_tenant_id
FROM
FROM
local_table
) as foo
WHERE
@ -162,15 +162,15 @@ DEBUG: Plan 11 query after replacing subqueries and CTEs: UPDATE recursive_dml_
(1 row)
-- we currently do not allow views in modification queries
UPDATE
distributed_table
SET
UPDATE
distributed_table
SET
dept = avg_tenant_id::int
FROM
FROM
(
SELECT
SELECT
avg(tenant_id::int) as avg_tenant_id
FROM
FROM
tenant_ids
) as foo
WHERE
@ -184,32 +184,32 @@ DEBUG: Plan 12 query after replacing subqueries and CTEs: UPDATE recursive_dml_
50 | 50 | {"f1": 50, "f2": 2500}
(1 row)
-- there is a lateral join (e.g., corrolated subquery) thus the subqueries cannot be
-- there is a lateral join (e.g., corrolated subquery) thus the subqueries cannot be
-- recursively planned
UPDATE
second_distributed_table
SET
UPDATE
second_distributed_table
SET
dept = foo.tenant_id::int / 4
FROM
FROM
(
SELECT DISTINCT foo_inner_1.tenant_id FROM
SELECT DISTINCT foo_inner_1.tenant_id FROM
(
SELECT
SELECT
second_distributed_table.dept, second_distributed_table.tenant_id
FROM
FROM
second_distributed_table, distributed_table
WHERE
WHERE
distributed_table.tenant_id = second_distributed_table.tenant_id
AND
second_distributed_table.dept IN (3,4)
)
)
foo_inner_1 JOIN LATERAL
(
SELECT
second_distributed_table.tenant_id
FROM
SELECT
second_distributed_table.tenant_id
FROM
second_distributed_table, distributed_table
WHERE
WHERE
distributed_table.tenant_id = second_distributed_table.tenant_id
AND foo_inner_1.dept = second_distributed_table.dept
AND
@ -222,55 +222,54 @@ ERROR: complex joins are only supported when all distributed tables are joined
-- again a corrolated subquery
-- this time distribution key eq. exists
-- however recursive planning is prevented due to correlated subqueries
UPDATE
second_distributed_table
SET
UPDATE
second_distributed_table
SET
dept = foo.tenant_id::int / 4
FROM
FROM
(
SELECT baz.tenant_id FROM
SELECT baz.tenant_id FROM
(
SELECT
SELECT
second_distributed_table.dept, second_distributed_table.tenant_id
FROM
FROM
second_distributed_table, distributed_table as d1
WHERE
WHERE
d1.tenant_id = second_distributed_table.tenant_id
AND
second_distributed_table.dept IN (3,4)
AND
second_distributed_table.tenant_id IN
AND
second_distributed_table.tenant_id IN
(
SELECT s2.tenant_id
FROM second_distributed_table as s2
GROUP BY d1.tenant_id, s2.tenant_id
)
)
) as baz
) as foo WHERE second_distributed_table.tenant_id = foo.tenant_id
RETURNING *;
ERROR: complex joins are only supported when all distributed tables are joined on their distribution columns with equal operator
-- we don't support subqueries/CTEs inside VALUES
INSERT INTO
second_distributed_table (tenant_id, dept)
INSERT INTO
second_distributed_table (tenant_id, dept)
VALUES ('3', (WITH vals AS (SELECT 3) select * from vals));
DEBUG: generating subplan 18_1 for CTE vals: SELECT 3
DEBUG: Plan 18 query after replacing subqueries and CTEs: INSERT INTO recursive_dml_queries.second_distributed_table (tenant_id, dept) VALUES ('3'::text, (SELECT vals."?column?" FROM (SELECT intermediate_result."?column?" FROM read_intermediate_result('18_1'::text, 'binary'::citus_copy_format) intermediate_result("?column?" integer)) vals))
ERROR: subqueries are not supported within INSERT queries
HINT: Try rewriting your queries with 'INSERT INTO ... SELECT' syntax.
INSERT INTO
second_distributed_table (tenant_id, dept)
INSERT INTO
second_distributed_table (tenant_id, dept)
VALUES ('3', (SELECT 3));
ERROR: subqueries are not supported within INSERT queries
HINT: Try rewriting your queries with 'INSERT INTO ... SELECT' syntax.
-- DML with an unreferenced SELECT CTE
WITH cte_1 AS (
WITH cte_2 AS (
SELECT tenant_id as cte2_id
FROM second_distributed_table
SELECT tenant_id as cte2_id
FROM second_distributed_table
WHERE dept >= 2
)
UPDATE distributed_table
UPDATE distributed_table
SET dept = 10
RETURNING *
)
@ -282,12 +281,11 @@ DEBUG: generating subplan 20_1 for CTE cte_1: WITH cte_2 AS (SELECT second_dist
DEBUG: Plan 20 query after replacing subqueries and CTEs: UPDATE recursive_dml_queries.distributed_table SET dept = 5 FROM (SELECT intermediate_result.tenant_id, intermediate_result.dept, intermediate_result.info FROM read_intermediate_result('20_1'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text, dept integer, info jsonb)) cte_1 WHERE (distributed_table.tenant_id OPERATOR(pg_catalog.<) cte_1.tenant_id)
WITH cte_1 AS (
WITH cte_2 AS (
SELECT tenant_id as cte2_id
FROM second_distributed_table
SELECT tenant_id as cte2_id
FROM second_distributed_table
WHERE dept >= 2
)
UPDATE distributed_table
UPDATE distributed_table
SET dept = 10
RETURNING *
)
@ -299,13 +297,13 @@ DEBUG: generating subplan 22_1 for CTE cte_1: WITH cte_2 AS (SELECT second_dist
DEBUG: Plan 22 query after replacing subqueries and CTEs: UPDATE recursive_dml_queries.distributed_table SET dept = 5 FROM (SELECT intermediate_result.tenant_id, intermediate_result.dept, intermediate_result.info FROM read_intermediate_result('22_1'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text, dept integer, info jsonb)) cte_1 WHERE (distributed_table.tenant_id OPERATOR(pg_catalog.<) cte_1.tenant_id)
-- we don't support updating local table with a join with
-- distributed tables
UPDATE
local_table
SET
UPDATE
local_table
SET
id = 'citus_test'
FROM
FROM
distributed_table
WHERE
WHERE
distributed_table.tenant_id = local_table.id;
ERROR: relation local_table is not distributed
RESET client_min_messages;

View File

@ -4,7 +4,6 @@
-- master_disable_node and master_add_inactive_node can not be
-- tested as they don't create network activity
--
SELECT citus.mitmproxy('conn.allow()');
mitmproxy
-----------

View File

@ -87,7 +87,6 @@ ERROR: connection error: localhost:9060
DETAIL: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
-- kill at the third copy (pull)
SELECT citus.mitmproxy('conn.onQuery(query="SELECT DISTINCT users_table.user").kill()');
mitmproxy

View File

@ -29,7 +29,7 @@ SELECT create_distributed_table('second_distributed_table','key');
INSERT INTO reference_table VALUES (1);
INSERT INTO distributed_table VALUES (1, '1', 20);
INSERT INTO second_distributed_table VALUES (1, '1');
-- a simple test for
-- a simple test for
CREATE TABLE collections_list (
key bigserial,
ser bigserial,
@ -44,7 +44,7 @@ SELECT create_distributed_table('collections_list', 'key');
(1 row)
CREATE TABLE collections_list_0
CREATE TABLE collections_list_0
PARTITION OF collections_list (key, ser, ts, collection_id, value)
FOR VALUES IN ( 0 );
-- connection worker and get ready for the tests
@ -54,19 +54,19 @@ SET search_path TO local_shard_execution;
-- on the distributed tables (e.g., WHERE key = 1), we'll hit a shard
-- placement which is local to this not
CREATE OR REPLACE FUNCTION shard_of_distribution_column_is_local(dist_key int) RETURNS bool AS $$
DECLARE shard_is_local BOOLEAN := FALSE;
BEGIN
WITH local_shard_ids AS (SELECT get_shard_id_for_distribution_column('local_shard_execution.distributed_table', dist_key)),
all_local_shard_ids_on_node AS (SELECT shardid FROM pg_dist_placement WHERE groupid IN (SELECT groupid FROM pg_dist_local_group))
SELECT
SELECT
true INTO shard_is_local
FROM
local_shard_ids
WHERE
get_shard_id_for_distribution_column IN (SELECT * FROM all_local_shard_ids_on_node);
FROM
local_shard_ids
WHERE
get_shard_id_for_distribution_column IN (SELECT * FROM all_local_shard_ids_on_node);
IF shard_is_local IS NULL THEN
shard_is_local = FALSE;
@ -76,7 +76,7 @@ CREATE OR REPLACE FUNCTION shard_of_distribution_column_is_local(dist_key int) R
END;
$$ LANGUAGE plpgsql;
-- pick some example values that reside on the shards locally and remote
-- distribution key values of 1,6, 500 and 701 are LOCAL to shards,
-- distribution key values of 1,6, 500 and 701 are LOCAL to shards,
-- we'll use these values in the tests
SELECT shard_of_distribution_column_is_local(1);
shard_of_distribution_column_is_local
@ -102,7 +102,7 @@ SELECT shard_of_distribution_column_is_local(701);
t
(1 row)
-- distribution key values of 11 and 12 are REMOTE to shards
-- distribution key values of 11 and 12 are REMOTE to shards
SELECT shard_of_distribution_column_is_local(11);
shard_of_distribution_column_is_local
---------------------------------------
@ -118,7 +118,7 @@ SELECT shard_of_distribution_column_is_local(12);
--- enable logging to see which tasks are executed locally
SET client_min_messages TO LOG;
SET citus.log_local_commands TO ON;
-- first, make sure that local execution works fine
-- first, make sure that local execution works fine
-- with simple queries that are not in transcation blocks
SELECT count(*) FROM distributed_table WHERE key = 1;
LOG: executing the command locally: SELECT count(*) AS count FROM local_shard_execution.distributed_table_1470001 distributed_table WHERE (key OPERATOR(pg_catalog.=) 1)
@ -167,15 +167,15 @@ DELETE FROM second_distributed_table;
-- load some more data for the following tests
INSERT INTO second_distributed_table VALUES (1, '1');
LOG: executing the command locally: INSERT INTO local_shard_execution.second_distributed_table_1470005 (key, value) VALUES (1, '1'::text)
-- INSERT .. SELECT hitting a single single (co-located) shard(s) should
-- INSERT .. SELECT hitting a single single (co-located) shard(s) should
-- be executed locally
INSERT INTO distributed_table
SELECT
distributed_table.*
FROM
distributed_table, second_distributed_table
WHERE
distributed_table.key = 1 and distributed_table.key=second_distributed_table.key
INSERT INTO distributed_table
SELECT
distributed_table.*
FROM
distributed_table, second_distributed_table
WHERE
distributed_table.key = 1 and distributed_table.key=second_distributed_table.key
ON CONFLICT(key) DO UPDATE SET value = '22'
RETURNING *;
LOG: executing the command locally: INSERT INTO local_shard_execution.distributed_table_1470001 AS citus_table_alias (key, value, age) SELECT distributed_table.key, distributed_table.value, distributed_table.age FROM local_shard_execution.distributed_table_1470001 distributed_table, local_shard_execution.second_distributed_table_1470005 second_distributed_table WHERE (((distributed_table.key OPERATOR(pg_catalog.=) 1) AND (distributed_table.key OPERATOR(pg_catalog.=) second_distributed_table.key)) AND ((worker_hash(distributed_table.key) OPERATOR(pg_catalog.>=) '-2147483648'::integer) AND (worker_hash(distributed_table.key) OPERATOR(pg_catalog.<=) '-1073741825'::integer))) ON CONFLICT(key) DO UPDATE SET value = '22'::text RETURNING citus_table_alias.key, citus_table_alias.value, citus_table_alias.age
@ -185,13 +185,13 @@ LOG: executing the command locally: INSERT INTO local_shard_execution.distribut
(1 row)
-- INSERT .. SELECT hitting multi-shards should go thourgh distributed execution
INSERT INTO distributed_table
SELECT
distributed_table.*
FROM
distributed_table, second_distributed_table
WHERE
distributed_table.key != 1 and distributed_table.key=second_distributed_table.key
INSERT INTO distributed_table
SELECT
distributed_table.*
FROM
distributed_table, second_distributed_table
WHERE
distributed_table.key != 1 and distributed_table.key=second_distributed_table.key
ON CONFLICT(key) DO UPDATE SET value = '22'
RETURNING *;
key | value | age
@ -251,11 +251,11 @@ LOG: executing the command locally: SELECT key, value, age FROM local_shard_exe
COPY reference_table FROM STDIN;
COPY distributed_table FROM STDIN WITH CSV;
COPY second_distributed_table FROM STDIN WITH CSV;
-- the behaviour in transaction blocks is the following:
-- the behaviour in transaction blocks is the following:
-- (a) Unless the first query is a local query, always use distributed execution.
-- (b) If the executor has used local execution, it has to use local execution
-- for the remaining of the transaction block. If that's not possible, the
-- executor has to error out (e.g., TRUNCATE is a utility command and we
-- (b) If the executor has used local execution, it has to use local execution
-- for the remaining of the transaction block. If that's not possible, the
-- executor has to error out (e.g., TRUNCATE is a utility command and we
-- currently do not support local execution of utility commands)
-- rollback should be able to rollback local execution
BEGIN;
@ -322,14 +322,14 @@ SELECT count(*) FROM second_distributed_table;
-- that has done before
BEGIN;
-- INSERT is executed locally
INSERT INTO distributed_table VALUES (1, '11',21) ON CONFLICT(key) DO UPDATE SET value = '23' RETURNING *;
INSERT INTO distributed_table VALUES (1, '11',21) ON CONFLICT(key) DO UPDATE SET value = '23' RETURNING *;
LOG: 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 = '23'::text RETURNING citus_table_alias.key, citus_table_alias.value, citus_table_alias.age
key | value | age
-----+-------+-----
1 | 23 | 20
(1 row)
-- since the INSERT is executed locally, the SELECT should also be
-- since the INSERT is executed locally, the SELECT should also be
-- executed locally and see the changes
SELECT * FROM distributed_table WHERE key = 1 ORDER BY 1,2,3;
LOG: executing the command locally: SELECT key, value, age FROM local_shard_execution.distributed_table_1470001 distributed_table WHERE (key OPERATOR(pg_catalog.=) 1) ORDER BY key, value, age
@ -370,7 +370,7 @@ LOG: executing the command locally: SELECT key, value, age FROM local_shard_exe
(0 rows)
-- if we start with a distributed execution, we should keep
-- using that and never switch back to local execution
-- using that and never switch back to local execution
BEGIN;
DELETE FROM distributed_table WHERE value = '11';
-- although this command could have been executed
@ -517,8 +517,7 @@ LOG: executing the command locally: SELECT count(*) AS count FROM local_shard_e
0
(1 row)
INSERT INTO distributed_table (key) SELECT i FROM generate_series(1,10)i;
INSERT INTO distributed_table (key) SELECT i FROM generate_series(1,10)i;
ERROR: cannot execute command because a local execution has already been done in the transaction
DETAIL: Some parallel commands cannot be executed if a previous command has already been executed locally
HINT: Try re-running the transaction with "SET LOCAL citus.enable_local_execution TO OFF;"
@ -532,8 +531,7 @@ LOG: executing the command locally: SELECT count(*) AS count FROM local_shard_e
0
(1 row)
INSERT INTO distributed_table (key) SELECT key+1 FROM distributed_table;
INSERT INTO distributed_table (key) SELECT key+1 FROM distributed_table;
ERROR: cannot execute command because a local execution has already been done in the transaction
DETAIL: Some parallel commands cannot be executed if a previous command has already been executed locally
HINT: Try re-running the transaction with "SET LOCAL citus.enable_local_execution TO OFF;"
@ -584,7 +582,7 @@ CREATE OR REPLACE PROCEDURE only_local_execution() AS $$
BEGIN
INSERT INTO distributed_table VALUES (1, '11',21) ON CONFLICT(key) DO UPDATE SET value = '29';
SELECT count(*) INTO cnt FROM distributed_table WHERE key = 1;
DELETE FROM distributed_table WHERE key = 1;
DELETE FROM distributed_table WHERE key = 1;
END;
$$ LANGUAGE plpgsql;
CALL only_local_execution();
@ -666,11 +664,11 @@ SELECT * FROM local_insert, distributed_local_mixed ORDER BY 1,2,3,4,5;
-- router CTE pushdown
WITH all_data AS (SELECT * FROM distributed_table WHERE key = 1)
SELECT
count(*)
FROM
distributed_table, all_data
WHERE
SELECT
count(*)
FROM
distributed_table, all_data
WHERE
distributed_table.key = all_data.key AND distributed_table.key = 1;
LOG: executing the command locally: WITH all_data AS (SELECT distributed_table_1.key, distributed_table_1.value, distributed_table_1.age FROM local_shard_execution.distributed_table_1470001 distributed_table_1 WHERE (distributed_table_1.key OPERATOR(pg_catalog.=) 1)) SELECT count(*) AS count FROM local_shard_execution.distributed_table_1470001 distributed_table, all_data WHERE ((distributed_table.key OPERATOR(pg_catalog.=) all_data.key) AND (distributed_table.key OPERATOR(pg_catalog.=) 1))
count
@ -684,13 +682,13 @@ INSERT INTO distributed_table VALUES (2, '29', 29);
INSERT INTO second_distributed_table VALUES (2, '29');
-- single shard that is not a local query followed by a local query
WITH all_data AS (SELECT * FROM second_distributed_table WHERE key = 2)
SELECT
SELECT
distributed_table.key
FROM
distributed_table, all_data
WHERE
FROM
distributed_table, all_data
WHERE
distributed_table.value = all_data.value AND distributed_table.key = 1
ORDER BY
ORDER BY
1 DESC;
key
-----
@ -699,15 +697,15 @@ ORDER BY
-- multi-shard CTE is followed by a query which could be executed locally, but
-- since the query started with a parallel query, it doesn't use local execution
-- note that if we allow Postgres to inline the CTE (e.g., not have the EXISTS
-- subquery), then it'd pushdown the filters and the query becomes single-shard,
-- note that if we allow Postgres to inline the CTE (e.g., not have the EXISTS
-- subquery), then it'd pushdown the filters and the query becomes single-shard,
-- locally executable query
WITH all_data AS (SELECT * FROM distributed_table)
SELECT
count(*)
FROM
distributed_table, all_data
WHERE
SELECT
count(*)
FROM
distributed_table, all_data
WHERE
distributed_table.key = all_data.key AND distributed_table.key = 1
AND EXISTS (SELECT * FROM all_data);
count
@ -719,11 +717,11 @@ WHERE
-- a subquery that needs to be recursively planned and a parallel
-- query, so do not use local execution
WITH all_data AS (SELECT age FROM distributed_table)
SELECT
count(*)
FROM
distributed_table, all_data
WHERE
SELECT
count(*)
FROM
distributed_table, all_data
WHERE
distributed_table.key = all_data.age AND distributed_table.key = 1;
count
-------
@ -754,7 +752,7 @@ LOG: executing the command locally: INSERT INTO local_shard_execution.distribut
5 | 55 | 22
(2 rows)
-- distributed execution of multi-rows INSERTs, where some part of the execution
-- distributed execution of multi-rows INSERTs, where some part of the execution
-- could have been done via local execution but the executor choose the other way around
-- because the command is a multi-shard query
INSERT INTO distributed_table VALUES (1, '11',21), (2,'22',22), (3,'33',33), (4,'44',44),(5,'55',55) ON CONFLICT(key) DO UPDATE SET value = (EXCLUDED.value::int + 1)::text RETURNING *;
@ -866,8 +864,8 @@ LOG: executing the command locally: SELECT count(*) AS count FROM local_shard_e
4
(1 row)
COMMIT;
-- failures of local execution should rollback both the
COMMIT;
-- failures of local execution should rollback both the
-- local execution and remote executions
-- fail on a local execution
BEGIN;
@ -948,7 +946,6 @@ LOG: executing the command locally: DELETE FROM local_shard_execution.distribut
LOG: executing the command locally: DELETE FROM local_shard_execution.distributed_table_1470003 distributed_table WHERE (value OPERATOR(pg_catalog.<>) '123123213123213'::text)
ROLLBACK;
BEGIN;
DELETE FROM reference_table WHERE key = 500 RETURNING *;
LOG: executing the command locally: DELETE FROM local_shard_execution.reference_table_1470000 reference_table WHERE (key OPERATOR(pg_catalog.=) 500) RETURNING key
key
@ -985,7 +982,7 @@ BEGIN;
ROLLBACK;
-- probably not a realistic case since views are not very
-- well supported with MX
CREATE VIEW v_local_query_execution AS
CREATE VIEW v_local_query_execution AS
SELECT * FROM distributed_table WHERE key = 500;
SELECT * FROM v_local_query_execution;
LOG: executing the command locally: SELECT key, value, age FROM (SELECT distributed_table.key, distributed_table.value, distributed_table.age FROM local_shard_execution.distributed_table_1470003 distributed_table WHERE (distributed_table.key OPERATOR(pg_catalog.=) 500)) v_local_query_execution
@ -996,7 +993,7 @@ LOG: executing the command locally: SELECT key, value, age FROM (SELECT distrib
-- similar test, but this time the view itself is a non-local
-- query, but the query on the view is local
CREATE VIEW v_local_query_execution_2 AS
CREATE VIEW v_local_query_execution_2 AS
SELECT * FROM distributed_table;
SELECT * FROM v_local_query_execution_2 WHERE key = 500;
LOG: executing the command locally: SELECT key, value, age FROM (SELECT distributed_table.key, distributed_table.value, distributed_table.age FROM local_shard_execution.distributed_table_1470003 distributed_table) v_local_query_execution_2 WHERE (key OPERATOR(pg_catalog.=) 500)
@ -1016,19 +1013,15 @@ BEGIN;
(1 row)
DELETE FROM distributed_table WHERE key = 500;
ROLLBACK TO SAVEPOINT my_savepoint;
DELETE FROM distributed_table WHERE key = 500;
COMMIT;
-- even if we switch from local execution -> remote execution,
-- we are able to use local execution after rollback
BEGIN;
SAVEPOINT my_savepoint;
DELETE FROM distributed_table WHERE key = 500;
LOG: executing the command locally: DELETE FROM local_shard_execution.distributed_table_1470003 distributed_table WHERE (key OPERATOR(pg_catalog.=) 500)
SELECT count(*) FROM distributed_table;
LOG: executing the command locally: SELECT count(*) AS count FROM local_shard_execution.distributed_table_1470001 distributed_table WHERE true
LOG: executing the command locally: SELECT count(*) AS count FROM local_shard_execution.distributed_table_1470003 distributed_table WHERE true
@ -1038,7 +1031,6 @@ LOG: executing the command locally: SELECT count(*) AS count FROM local_shard_e
(1 row)
ROLLBACK TO SAVEPOINT my_savepoint;
DELETE FROM distributed_table WHERE key = 500;
LOG: executing the command locally: DELETE FROM local_shard_execution.distributed_table_1470003 distributed_table WHERE (key OPERATOR(pg_catalog.=) 500)
COMMIT;
@ -1079,7 +1071,7 @@ LOG: executing the command locally: SELECT key, ser, ts, collection_id, value F
COMMIT;
-- the final queries for the following CTEs are going to happen on the intermediate results only
-- one of them will be executed remotely, and the other is locally
-- one of them will be executed remotely, and the other is locally
-- Citus currently doesn't allow using task_assignment_policy for intermediate results
WITH distributed_local_mixed AS (INSERT INTO reference_table VALUES (1000) RETURNING *) SELECT * FROM distributed_local_mixed;
LOG: executing the command locally: INSERT INTO local_shard_execution.reference_table_1470000 (key) VALUES (1000) RETURNING key
@ -1131,10 +1123,10 @@ LOG: executing the command locally: DELETE FROM local_shard_execution.reference
COMMIT;
\c - - - :master_port
-- local execution with custom type
-- local execution with custom type
SET citus.replication_model TO "streaming";
SET citus.shard_replication_factor TO 1;
CREATE TYPE invite_resp AS ENUM ('yes', 'no', 'maybe');
CREATE TYPE invite_resp AS ENUM ('yes', 'no', 'maybe');
CREATE TABLE event_responses (
event_id int,
user_id int,

View File

@ -58,7 +58,7 @@ FROM (
AND e.event_type IN (3, 4)
)
) t1 LEFT JOIN (
SELECT DISTINCT user_id,
SELECT DISTINCT user_id,
'Has done event'::TEXT AS hasdone_event
FROM events_table AS e
WHERE e.user_id >= 1
@ -127,7 +127,7 @@ SELECT
users_table
WHERE
user_id >= 1 AND
user_id <= 3 AND
user_id <= 3 AND
users_table.value_1 > 3 AND users_table.value_1 < 5
GROUP BY
user_id
@ -170,7 +170,6 @@ FROM (
max(u.time) as user_lastseen,
array_agg(event_type ORDER BY u.time) AS event_array
FROM (
SELECT user_id, time
FROM users_table
WHERE
@ -205,9 +204,8 @@ FROM users_table
WHERE user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 1 AND value_1 <= 2)
AND user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 3 AND value_1 <= 4)
AND user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 5 AND value_1 <= 6);
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
count | count | avg
-------+-------+--------------------
5 | 5 | 3.8000000000000000
@ -300,7 +298,6 @@ SELECT user_id, value_2 FROM users_table WHERE
value_2 >= 3
AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 1 AND event_type <= 3 AND value_3 > 1 AND user_id=users_table.user_id)
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type > 3 AND event_type <= 4 AND value_3 > 1 AND user_id=users_table.user_id);
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
count | count | avg
@ -315,21 +312,20 @@ SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
------------------------------------
TRUNCATE agg_results;
INSERT INTO agg_results(user_id, value_2_agg)
SELECT user_id,
value_2
SELECT user_id,
value_2
FROM users_table
WHERE value_1 > 1
AND value_1 < 3
AND value_1 < 3
AND value_2 >= 1
AND EXISTS (SELECT user_id
AND EXISTS (SELECT user_id
FROM events_table
WHERE event_type > 1
AND event_type < 3
WHERE event_type > 1
AND event_type < 3
AND value_3 > 1
AND user_id = users_table.user_id
GROUP BY user_id
AND user_id = users_table.user_id
GROUP BY user_id
HAVING Count(*) > 2);
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
count | count | avg
@ -337,7 +333,6 @@ SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
4 | 2 | 3.5000000000000000
(1 row)
------------------------------------
------------------------------------
-- Find me all users_table who logged in more than once
@ -348,7 +343,7 @@ INSERT INTO agg_results(user_id, value_1_agg)
SELECT user_id, value_1 from
(
SELECT user_id, value_1 From users_table
WHERE value_2 > 1 and user_id = 1 GROUP BY value_1, user_id HAVING count(*) > 1
WHERE value_2 > 1 and user_id = 1 GROUP BY value_1, user_id HAVING count(*) > 1
) as a;
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
@ -372,8 +367,7 @@ And user_id in
(select user_id
From users_table
Where value_1 = 2
And value_2 > 1);
And value_2 > 1);
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
count | count | avg
@ -398,23 +392,21 @@ SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
34 | 6 | 3.4411764705882353
(1 row)
------------------------------------
------------------------------------
-- Find me all the users_table who has done some event more than three times
------------------------------------
------------------------------------
------------------------------------
TRUNCATE agg_results;
INSERT INTO agg_results(user_id)
select user_id from
(
select
select
user_id
from
from
events_table
where event_type = 4 group by user_id having count(*) > 3
) as a;
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
count | count | avg
@ -422,7 +414,6 @@ SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
4 | 4 | 2.5000000000000000
(1 row)
------------------------------------
------------------------------------
-- Find my assets that have the highest probability and fetch their metadata
@ -432,17 +423,17 @@ TRUNCATE agg_results;
INSERT INTO agg_results(user_id, value_1_agg, value_3_agg)
SELECT
users_table.user_id, users_table.value_1, prob
FROM
FROM
users_table
JOIN
(SELECT
JOIN
(SELECT
ma.user_id, (GREATEST(coalesce(ma.value_4, 0.0) / 250 + GREATEST(1.0))) / 2 AS prob
FROM
FROM
users_table AS ma, events_table as short_list
WHERE
WHERE
short_list.user_id = ma.user_id and ma.value_1 < 3 and short_list.event_type < 3
) temp
ON users_table.user_id = temp.user_id
) temp
ON users_table.user_id = temp.user_id
WHERE users_table.value_1 < 3;
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
@ -456,17 +447,17 @@ TRUNCATE agg_results;
INSERT INTO agg_results(user_id)
SELECT
DISTINCT users_ids.user_id
FROM
FROM
(SELECT DISTINCT user_id FROM users_table) as users_ids
JOIN
(SELECT
JOIN
(SELECT
ma.user_id, ma.value_1, (GREATEST(coalesce(ma.value_4 / 250, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM
FROM
users_table AS ma, events_table as short_list
WHERE
WHERE
short_list.user_id = ma.user_id and ma.value_1 < 3 and short_list.event_type < 2
) temp
ON users_ids.user_id = temp.user_id
) temp
ON users_ids.user_id = temp.user_id
WHERE temp.value_1 < 3;
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results;
@ -480,17 +471,17 @@ TRUNCATE agg_results;
INSERT INTO agg_results(user_id, value_1_agg, value_2_agg)
SELECT
DISTINCT ON (users_ids.user_id) users_ids.user_id, temp.value_1, prob
FROM
FROM
(SELECT DISTINCT user_id FROM users_table) as users_ids
JOIN
(SELECT
JOIN
(SELECT
ma.user_id, ma.value_1, (GREATEST(coalesce(ma.value_4 / 250, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM
FROM
users_table AS ma, events_table as short_list
WHERE
WHERE
short_list.user_id = ma.user_id and ma.value_1 < 3 and short_list.event_type < 2
) temp
ON users_ids.user_id = temp.user_id
) temp
ON users_ids.user_id = temp.user_id
WHERE temp.value_1 < 3
ORDER BY 1, 2;
SELECT count(*), count(DISTINCT user_id), avg(user_id), avg(value_1_agg) FROM agg_results;
@ -504,16 +495,16 @@ TRUNCATE agg_results;
INSERT INTO agg_results(user_id, value_1_agg, value_2_agg)
SELECT
DISTINCT ON (users_ids.user_id) users_ids.user_id, temp.value_1, prob
FROM
FROM
(SELECT DISTINCT ON (user_id) user_id, value_2 FROM users_table ORDER BY 1,2) as users_ids
JOIN
(SELECT
JOIN
(SELECT
ma.user_id, ma.value_1, (GREATEST(coalesce(ma.value_4 / 250, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM
FROM
users_table AS ma, events_table as short_list
WHERE
WHERE
short_list.user_id = ma.user_id and ma.value_1 < 10 and short_list.event_type < 2
) temp
) temp
ON users_ids.user_id = temp.user_id
ORDER BY 1, 2;
SELECT count(*), count(DISTINCT user_id), avg(user_id), avg(value_1_agg) FROM agg_results;

View File

@ -41,8 +41,8 @@ FROM (
SELECT u.user_id, e.event_type::text AS event, e.time
FROM users_table AS u,
events_table AS e
WHERE u.user_id = e.user_id AND
(u.user_id = 1 OR u.user_id = 2) AND
WHERE u.user_id = e.user_id AND
(u.user_id = 1 OR u.user_id = 2) AND
(e.user_id = 1 OR e.user_id = 2)
AND e.event_type IN (1, 2)
) t
@ -90,10 +90,9 @@ FROM (
AND e.event_type IN (3, 4)
)
) t1 LEFT JOIN (
SELECT DISTINCT user_id,
SELECT DISTINCT user_id,
'Has done event'::TEXT AS hasdone_event
FROM events_table AS e
WHERE e.user_id >= 1
AND e.user_id <= 2
AND e.event_type IN (5, 6)
@ -133,11 +132,10 @@ FROM (
AND e.event_type IN (3, 4)
)
) t1 LEFT JOIN (
SELECT DISTINCT user_id,
SELECT DISTINCT user_id,
'Has done event'::TEXT AS hasdone_event
FROM events_table AS e
WHERE
WHERE
(e.user_id = 2 OR e.user_id = 3)
AND e.event_type IN (4, 5)
) t2 ON (t1.user_id = t2.user_id)
@ -170,7 +168,6 @@ FROM (
max(u.time) as user_lastseen,
array_agg(event_type ORDER BY u.time) AS event_array
FROM (
SELECT user_id, time
FROM users_table
WHERE
@ -213,7 +210,6 @@ FROM (
max(u.time) as user_lastseen,
array_agg(event_type ORDER BY u.time) AS event_array
FROM (
SELECT user_id, time
FROM users_table
WHERE
@ -251,9 +247,8 @@ WHERE user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 1 AND value_1
AND user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 3 AND value_1 <= 4)
AND user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 5 AND value_1 <= 6)
AND user_id = 1;
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
count | count | avg
-------+-------+------------------------
1 | 1 | 1.00000000000000000000
@ -272,9 +267,8 @@ WHERE user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 1 AND value_1
AND user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 3 AND value_1 <= 4 AND (user_id = 1 OR user_id = 2))
AND user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 5 AND value_1 <= 6 AND (user_id = 1 OR user_id = 2))
AND (user_id = 1 OR user_id = 2);
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
count | count | avg
-------+-------+------------------------
1 | 1 | 1.00000000000000000000
@ -330,7 +324,6 @@ SELECT user_id, value_2 FROM users_table WHERE
AND user_id = 1
AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 1 AND event_type <= 3 AND value_3 > 1 AND user_id=users_table.user_id)
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type > 4 AND event_type <= 5 AND value_3 > 4 AND user_id=users_table.user_id);
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
count | count | avg
@ -350,7 +343,6 @@ SELECT user_id, value_2 FROM users_table WHERE
AND (user_id = 1 OR user_id = 2)
AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 1 AND event_type <= 3 AND value_3 > 1 AND user_id=users_table.user_id AND (user_id = 1 OR user_id = 2))
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type > 4 AND event_type <= 5 AND value_3 > 4 AND user_id=users_table.user_id AND (user_id = 1 OR user_id = 2));
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
count | count | avg
@ -365,23 +357,22 @@ SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
------------------------------------
TRUNCATE agg_results_second;
INSERT INTO agg_results_second(user_id, value_2_agg)
SELECT user_id,
value_2
SELECT user_id,
value_2
FROM users_table
WHERE value_1 > 1
AND value_1 < 3
AND value_2 >= 1
AND value_2 >= 1
AND user_id = 3
AND EXISTS (SELECT user_id
AND EXISTS (SELECT user_id
FROM events_table
WHERE event_type > 1
AND event_type < 3
WHERE event_type > 1
AND event_type < 3
AND value_3 > 1
AND user_id = users_table.user_id
AND user_id = 3
GROUP BY user_id
GROUP BY user_id
HAVING Count(*) > 2);
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
count | count | avg
@ -396,22 +387,21 @@ SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
------------------------------------
TRUNCATE agg_results_second;
INSERT INTO agg_results_second(user_id, value_2_agg)
SELECT user_id,
value_2
SELECT user_id,
value_2
FROM users_table
WHERE value_1 > 1
AND value_1 < 3
AND value_2 >= 1
AND (user_id = 3 or user_id = 4)
AND EXISTS (SELECT user_id
AND EXISTS (SELECT user_id
FROM events_table
WHERE event_type = 2
AND value_3 > 1
WHERE event_type = 2
AND value_3 > 1
AND user_id = users_table.user_id
AND (user_id = 3 or user_id = 4)
GROUP BY user_id
GROUP BY user_id
HAVING Count(*) > 2);
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
count | count | avg
@ -419,4 +409,3 @@ SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM agg_results_second;
4 | 2 | 3.5000000000000000
(1 row)

View File

@ -7,9 +7,9 @@ SET citus.next_shard_id TO 1240000;
-- test with invalid port, prevent OS dependent warning from being displayed
SET client_min_messages to ERROR;
-- PG 9.5 does not show context for plpgsql raise
-- message whereas PG 9.6 shows. disabling it
-- message whereas PG 9.6 shows. disabling it
-- for this test only to have consistent behavior
-- b/w PG 9.6+ and PG 9.5.
-- b/w PG 9.6+ and PG 9.5.
\set SHOW_CONTEXT never
SELECT * FROM master_run_on_worker(ARRAY['localhost']::text[], ARRAY['666']::int[],
ARRAY['select count(*) from pg_dist_shard']::text[],
@ -61,7 +61,6 @@ SELECT * FROM master_run_on_worker(ARRAY[:node_name]::text[], ARRAY[:node_port]:
localhost | 57637 | f | expected a single row in query result
(1 row)
-- send multiple queries
SELECT * FROM master_run_on_worker(ARRAY[:node_name, :node_name]::text[],
ARRAY[:node_port, :node_port]::int[],
@ -185,7 +184,6 @@ SELECT * FROM master_run_on_worker(ARRAY[:node_name]::text[], ARRAY[:node_port]:
localhost | 57637 | t | DROP TABLE
(1 row)
-- verify table is dropped
SELECT * FROM master_run_on_worker(ARRAY[:node_name]::text[], ARRAY[:node_port]::int[],
ARRAY['select count(*) from second_table']::text[],
@ -226,7 +224,6 @@ SELECT * FROM master_run_on_worker(ARRAY[:node_name]::text[], ARRAY[:node_port]:
localhost | 57637 | f | expected a single row in query result
(1 row)
-- send multiple queries
SELECT * FROM master_run_on_worker(ARRAY[:node_name, :node_name]::text[],
ARRAY[:node_port, :node_port]::int[],

View File

@ -223,9 +223,7 @@ SELECT shardmaxvalue::integer - shardminvalue::integer AS shard_size
DELETE FROM pg_dist_shard_placement
WHERE shardid IN (SELECT shardid FROM pg_dist_shard
WHERE logicalrelid = 'foreign_table_to_distribute'::regclass);
DELETE FROM pg_dist_shard
WHERE logicalrelid = 'foreign_table_to_distribute'::regclass;
DELETE FROM pg_dist_partition
WHERE logicalrelid = 'foreign_table_to_distribute'::regclass;

View File

@ -1,6 +1,6 @@
--
-- MULTI_DISTRIBUTED_TRANSACTION_ID
--
--
-- Unit tests for distributed transaction id functionality
--
-- get the current transaction id, which should be uninitialized
@ -17,7 +17,6 @@ SELECT initiator_node_identifier, transaction_number, transaction_stamp FROM get
(1 row)
BEGIN;
-- we should still see the uninitialized values
SELECT initiator_node_identifier, transaction_number, transaction_stamp, (process_id = pg_backend_pid()) FROM get_current_transaction_id();
initiator_node_identifier | transaction_number | transaction_stamp | ?column?
@ -52,7 +51,6 @@ SELECT initiator_node_identifier, transaction_number, transaction_stamp, (proces
-- also see that ROLLBACK (i.e., failures in the transaction) clears the shared memory
BEGIN;
-- we should still see the uninitialized values
SELECT initiator_node_identifier, transaction_number, transaction_stamp, (process_id = pg_backend_pid()) FROM get_current_transaction_id();
initiator_node_identifier | transaction_number | transaction_stamp | ?column?
@ -79,7 +77,6 @@ COMMIT;
-- we should also see that a new connection means an uninitialized transaction id
BEGIN;
SELECT assign_distributed_transaction_id(52, 52, '2015-01-01 00:00:00+0');
assign_distributed_transaction_id
-----------------------------------
@ -126,7 +123,7 @@ ROLLBACK PREPARED 'dist_xact_id_test';
-- set back to the original zone
SET TIME ZONE DEFAULT;
-- parallel safe wrapper for getting the current transaction number
CREATE OR REPLACE FUNCTION parallel_worker_transaction_id_test()
CREATE OR REPLACE FUNCTION parallel_worker_transaction_id_test()
RETURNS bigint STRICT VOLATILE PARALLEL SAFE AS $$
SELECT transaction_number FROM get_current_transaction_id();
$$ LANGUAGE sql;

View File

@ -161,7 +161,7 @@ SELECT get_referencing_relation_id_list::regclass FROM get_referencing_relation_
----------------------------------
(0 rows)
-- some tests within transction blocks to make sure that
-- some tests within transction blocks to make sure that
-- cache invalidation works fine
CREATE TABLE test_1 (id int UNIQUE);
CREATE TABLE test_2 (id int UNIQUE);
@ -198,17 +198,17 @@ SELECT create_distributed_Table('test_5', 'id');
(1 row)
CREATE VIEW referential_integrity_summary AS
WITH RECURSIVE referential_integrity_summary(n, table_name, referencing_relations, referenced_relations) AS
CREATE VIEW referential_integrity_summary AS
WITH RECURSIVE referential_integrity_summary(n, table_name, referencing_relations, referenced_relations) AS
(
SELECT 0,'0','{}'::regclass[],'{}'::regclass[]
UNION ALL
SELECT
n + 1,
'test_' || n + 1|| '' as table_name,
(SELECT array_agg(get_referencing_relation_id_list::regclass ORDER BY 1) FROM get_referencing_relation_id_list(('test_' || (n +1) ) ::regclass)) as referencing_relations,
SELECT
n + 1,
'test_' || n + 1|| '' as table_name,
(SELECT array_agg(get_referencing_relation_id_list::regclass ORDER BY 1) FROM get_referencing_relation_id_list(('test_' || (n +1) ) ::regclass)) as referencing_relations,
(SELECT array_agg(get_referenced_relation_id_list::regclass ORDER BY 1) FROM get_referenced_relation_id_list(('test_' || (n +1) ) ::regclass)) as referenced_by_relations
FROM referential_integrity_summary, pg_class
FROM referential_integrity_summary, pg_class
WHERE
pg_class.relname = ('test_' || (n +1))
AND n < 5
@ -216,7 +216,7 @@ CREATE VIEW referential_integrity_summary AS
SELECT * FROM referential_integrity_summary WHERE n != 0 ORDER BY 1;
-- make sure that invalidation through ALTER TABLE works fine
BEGIN;
ALTER TABLE test_2 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_1(id);
ALTER TABLE test_2 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_1(id);
SELECT * FROM referential_integrity_summary;
n | table_name | referencing_relations | referenced_relations
---+------------+-----------------------+----------------------
@ -263,7 +263,7 @@ BEGIN;
ROLLBACK;
-- similar test, but slightly different order of creating foreign keys
BEGIN;
ALTER TABLE test_2 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_1(id);
ALTER TABLE test_2 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_1(id);
SELECT * FROM referential_integrity_summary;
n | table_name | referencing_relations | referenced_relations
---+------------+-----------------------+----------------------
@ -310,7 +310,7 @@ BEGIN;
ROLLBACK;
-- make sure that DROP CONSTRAINT works invalidates the cache correctly
BEGIN;
ALTER TABLE test_2 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_1(id);
ALTER TABLE test_2 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_1(id);
ALTER TABLE test_3 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_2(id);
ALTER TABLE test_4 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_3(id);
ALTER TABLE test_5 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_4(id);
@ -412,7 +412,7 @@ COMMIT;
-- DROP TABLE works expected
-- re-create the constraints
BEGIN;
ALTER TABLE test_2 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_1(id);
ALTER TABLE test_2 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_1(id);
ALTER TABLE test_3 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_2(id);
ALTER TABLE test_4 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_3(id);
ALTER TABLE test_5 ADD CONSTRAINT fkey_1 FOREIGN KEY(id) REFERENCES test_4(id);
@ -601,7 +601,6 @@ drop cascades to table test_8
---------------------------------
(0 rows)
ROLLBACK;
SET search_path TO public;
DROP SCHEMA fkey_graph CASCADE;

View File

@ -73,10 +73,10 @@ SET client_min_messages TO INFO;
SELECT
raw_events_first.user_id
FROM
raw_events_first, raw_events_second
raw_events_first, raw_events_second
WHERE
raw_events_first.user_id = raw_events_second.user_id
ORDER BY
ORDER BY
user_id DESC;
user_id
---------
@ -161,10 +161,10 @@ INSERT INTO raw_events_first (user_id, time, value_1, value_2, value_3, value_4)
(8, now(), 80, 800, 8000, 80000);
-- reorder columns
SET client_min_messages TO DEBUG2;
INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time)
SELECT
value_2, value_1, value_3, value_4, user_id, time
FROM
INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time)
SELECT
value_2, value_1, value_3, value_4, user_id, time
FROM
raw_events_first
WHERE
user_id = 8;
@ -174,10 +174,10 @@ DEBUG: Skipping target shard interval 13300006 since SELECT query for it pruned
DEBUG: Skipping target shard interval 13300007 since SELECT query for it pruned away
DEBUG: Plan is router executable
-- a zero shard select
INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time)
SELECT
value_2, value_1, value_3, value_4, user_id, time
FROM
INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time)
SELECT
value_2, value_1, value_3, value_4, user_id, time
FROM
raw_events_first
WHERE
false;
@ -187,10 +187,10 @@ DEBUG: Skipping target shard interval 13300006 since SELECT query for it pruned
DEBUG: Skipping target shard interval 13300007 since SELECT query for it pruned away
DEBUG: Plan is router executable
-- another zero shard select
INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time)
SELECT
value_2, value_1, value_3, value_4, user_id, time
FROM
INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time)
SELECT
value_2, value_1, value_3, value_4, user_id, time
FROM
raw_events_first
WHERE
0 != 0;
@ -205,13 +205,13 @@ INSERT INTO raw_events_first (user_id, time, value_1, value_2, value_3, value_4)
(9, now(), 90, 900, 9000, 90000);
-- show that RETURNING also works
SET client_min_messages TO DEBUG2;
INSERT INTO raw_events_second (user_id, value_1, value_3)
SELECT
INSERT INTO raw_events_second (user_id, value_1, value_3)
SELECT
user_id, value_1, value_3
FROM
raw_events_first
raw_events_first
WHERE
value_3 = 9000
value_3 = 9000
RETURNING *;
DEBUG: distributed statement: INSERT INTO public.raw_events_second_13300004 AS citus_table_alias (user_id, value_1, value_3) SELECT user_id, value_1, value_3 FROM public.raw_events_first_13300000 raw_events_first WHERE ((value_3 OPERATOR(pg_catalog.=) (9000)::double precision) AND ((worker_hash(user_id) OPERATOR(pg_catalog.>=) '-2147483648'::integer) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) '-1073741825'::integer))) RETURNING citus_table_alias.user_id, citus_table_alias."time", citus_table_alias.value_1, citus_table_alias.value_2, citus_table_alias.value_3, citus_table_alias.value_4
DEBUG: distributed statement: INSERT INTO public.raw_events_second_13300005 AS citus_table_alias (user_id, value_1, value_3) SELECT user_id, value_1, value_3 FROM public.raw_events_first_13300001 raw_events_first WHERE ((value_3 OPERATOR(pg_catalog.=) (9000)::double precision) AND ((worker_hash(user_id) OPERATOR(pg_catalog.>=) '-1073741824'::integer) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) '-1'::integer))) RETURNING citus_table_alias.user_id, citus_table_alias."time", citus_table_alias.value_1, citus_table_alias.value_2, citus_table_alias.value_3, citus_table_alias.value_4
@ -225,13 +225,13 @@ DEBUG: Plan is router executable
-- hits two shards
\set VERBOSITY TERSE
INSERT INTO raw_events_second (user_id, value_1, value_3)
SELECT
INSERT INTO raw_events_second (user_id, value_1, value_3)
SELECT
user_id, value_1, value_3
FROM
raw_events_first
raw_events_first
WHERE
user_id = 9 OR user_id = 16
user_id = 9 OR user_id = 16
RETURNING *;
DEBUG: Skipping target shard interval 13300004 since SELECT query for it pruned away
DEBUG: distributed statement: INSERT INTO public.raw_events_second_13300005 AS citus_table_alias (user_id, value_1, value_3) SELECT user_id, value_1, value_3 FROM public.raw_events_first_13300001 raw_events_first WHERE (((user_id OPERATOR(pg_catalog.=) 9) OR (user_id OPERATOR(pg_catalog.=) 16)) AND ((worker_hash(user_id) OPERATOR(pg_catalog.>=) '-1073741824'::integer) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) '-1'::integer))) RETURNING citus_table_alias.user_id, citus_table_alias."time", citus_table_alias.value_1, citus_table_alias.value_2, citus_table_alias.value_3, citus_table_alias.value_4
@ -240,9 +240,9 @@ DEBUG: distributed statement: INSERT INTO public.raw_events_second_13300007 AS
DEBUG: Plan is router executable
ERROR: duplicate key value violates unique constraint "raw_events_second_user_id_value_1_key_13300007"
-- now do some aggregations
INSERT INTO agg_events
INSERT INTO agg_events
SELECT
user_id, sum(value_1), avg(value_2), sum(value_3), count(value_4)
user_id, sum(value_1), avg(value_2), sum(value_3), count(value_4)
FROM
raw_events_first
GROUP BY
@ -253,7 +253,7 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300010 AS citus_t
DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_table_alias (user_id, value_1_agg, value_2_agg, value_3_agg, value_4_agg) SELECT user_id, sum(value_1) AS sum, avg(value_2) AS avg, sum(value_3) AS sum, count(value_4) AS count FROM public.raw_events_first_13300003 raw_events_first WHERE ((worker_hash(user_id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) 2147483647)) GROUP BY user_id
DEBUG: Plan is router executable
-- group by column not exists on the SELECT target list
INSERT INTO agg_events (value_3_agg, value_4_agg, value_1_agg, user_id)
INSERT INTO agg_events (value_3_agg, value_4_agg, value_1_agg, user_id)
SELECT
sum(value_3), count(value_4), sum(value_1), user_id
FROM
@ -268,16 +268,16 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_t
DEBUG: Plan is router executable
ERROR: duplicate key value violates unique constraint "agg_events_user_id_value_1_agg_key_13300008"
-- some subquery tests
INSERT INTO agg_events
(value_1_agg,
user_id)
SELECT SUM(value_1),
id
FROM (SELECT raw_events_second.user_id AS id,
raw_events_second.value_1
FROM raw_events_first,
raw_events_second
WHERE raw_events_first.user_id = raw_events_second.user_id) AS foo
INSERT INTO agg_events
(value_1_agg,
user_id)
SELECT SUM(value_1),
id
FROM (SELECT raw_events_second.user_id AS id,
raw_events_second.value_1
FROM raw_events_first,
raw_events_second
WHERE raw_events_first.user_id = raw_events_second.user_id) AS foo
GROUP BY id
ORDER BY id;
DEBUG: distributed statement: INSERT INTO public.agg_events_13300008 AS citus_table_alias (user_id, value_1_agg) SELECT id, sum(value_1) AS sum FROM (SELECT raw_events_second.user_id AS id, raw_events_second.value_1 FROM public.raw_events_first_13300000 raw_events_first, public.raw_events_second_13300004 raw_events_second WHERE (raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id)) foo WHERE ((worker_hash(id) OPERATOR(pg_catalog.>=) '-2147483648'::integer) AND (worker_hash(id) OPERATOR(pg_catalog.<=) '-1073741825'::integer)) GROUP BY id ORDER BY id
@ -286,20 +286,20 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300010 AS citus_t
DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_table_alias (user_id, value_1_agg) SELECT id, sum(value_1) AS sum FROM (SELECT raw_events_second.user_id AS id, raw_events_second.value_1 FROM public.raw_events_first_13300003 raw_events_first, public.raw_events_second_13300007 raw_events_second WHERE (raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id)) foo WHERE ((worker_hash(id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(id) OPERATOR(pg_catalog.<=) 2147483647)) GROUP BY id ORDER BY id
DEBUG: Plan is router executable
ERROR: duplicate key value violates unique constraint "agg_events_user_id_value_1_agg_key_13300008"
-- subquery one more level depth
INSERT INTO agg_events
(value_4_agg,
value_1_agg,
user_id)
SELECT v4,
v1,
id
FROM (SELECT SUM(raw_events_second.value_4) AS v4,
SUM(raw_events_first.value_1) AS v1,
raw_events_second.user_id AS id
FROM raw_events_first,
raw_events_second
WHERE raw_events_first.user_id = raw_events_second.user_id
-- subquery one more level depth
INSERT INTO agg_events
(value_4_agg,
value_1_agg,
user_id)
SELECT v4,
v1,
id
FROM (SELECT SUM(raw_events_second.value_4) AS v4,
SUM(raw_events_first.value_1) AS v1,
raw_events_second.user_id AS id
FROM raw_events_first,
raw_events_second
WHERE raw_events_first.user_id = raw_events_second.user_id
GROUP BY raw_events_second.user_id) AS foo
ORDER BY id;
DEBUG: distributed statement: INSERT INTO public.agg_events_13300008 AS citus_table_alias (user_id, value_1_agg, value_4_agg) SELECT id, v1, v4 FROM (SELECT sum(raw_events_second.value_4) AS v4, sum(raw_events_first.value_1) AS v1, raw_events_second.user_id AS id FROM public.raw_events_first_13300000 raw_events_first, public.raw_events_second_13300004 raw_events_second WHERE (raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id) GROUP BY raw_events_second.user_id) foo WHERE ((worker_hash(id) OPERATOR(pg_catalog.>=) '-2147483648'::integer) AND (worker_hash(id) OPERATOR(pg_catalog.<=) '-1073741825'::integer)) ORDER BY id
@ -451,19 +451,19 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300010 AS citus_t
DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_table_alias (user_id) SELECT f2.id FROM ((SELECT foo.id FROM (SELECT reference_table.user_id AS id FROM public.raw_events_first_13300003 raw_events_first, public.reference_table_13300012 reference_table WHERE (raw_events_first.user_id OPERATOR(pg_catalog.=) reference_table.user_id)) foo) f JOIN (SELECT foo2.v4, foo2.v1, foo2.id FROM (SELECT sum(raw_events_second.value_4) AS v4, sum(raw_events_first.value_1) AS v1, raw_events_second.user_id AS id FROM public.raw_events_first_13300003 raw_events_first, public.raw_events_second_13300007 raw_events_second WHERE (raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id) GROUP BY raw_events_second.user_id HAVING (sum(raw_events_second.value_4) OPERATOR(pg_catalog.>) (1000)::numeric)) foo2) f2 ON ((f.id OPERATOR(pg_catalog.=) f2.id))) WHERE ((f.id OPERATOR(pg_catalog.=) ANY (SELECT raw_events_second.user_id FROM public.raw_events_second_13300007 raw_events_second)) AND ((worker_hash(f2.id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(f2.id) OPERATOR(pg_catalog.<=) 2147483647)))
DEBUG: Plan is router executable
-- some UPSERTS
INSERT INTO agg_events AS ae
INSERT INTO agg_events AS ae
(
user_id,
value_1_agg,
agg_time
)
)
SELECT user_id,
value_1,
time
FROM raw_events_first
ON conflict (user_id, value_1_agg)
DO UPDATE
SET agg_time = EXCLUDED.agg_time
SET agg_time = EXCLUDED.agg_time
WHERE ae.agg_time < EXCLUDED.agg_time;
DEBUG: distributed statement: INSERT INTO public.agg_events_13300008 AS ae (user_id, value_1_agg, agg_time) SELECT user_id, value_1, "time" FROM public.raw_events_first_13300000 raw_events_first WHERE ((worker_hash(user_id) OPERATOR(pg_catalog.>=) '-2147483648'::integer) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) '-1073741825'::integer)) ON CONFLICT(user_id, value_1_agg) DO UPDATE SET agg_time = excluded.agg_time WHERE (ae.agg_time OPERATOR(pg_catalog.<) excluded.agg_time)
DEBUG: distributed statement: INSERT INTO public.agg_events_13300009 AS ae (user_id, value_1_agg, agg_time) SELECT user_id, value_1, "time" FROM public.raw_events_first_13300001 raw_events_first WHERE ((worker_hash(user_id) OPERATOR(pg_catalog.>=) '-1073741824'::integer) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) '-1'::integer)) ON CONFLICT(user_id, value_1_agg) DO UPDATE SET agg_time = excluded.agg_time WHERE (ae.agg_time OPERATOR(pg_catalog.<) excluded.agg_time)
@ -471,19 +471,19 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300010 AS ae (use
DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS ae (user_id, value_1_agg, agg_time) SELECT user_id, value_1, "time" FROM public.raw_events_first_13300003 raw_events_first WHERE ((worker_hash(user_id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) 2147483647)) ON CONFLICT(user_id, value_1_agg) DO UPDATE SET agg_time = excluded.agg_time WHERE (ae.agg_time OPERATOR(pg_catalog.<) excluded.agg_time)
DEBUG: Plan is router executable
-- upserts with returning
INSERT INTO agg_events AS ae
(
user_id,
value_1_agg,
agg_time
)
SELECT user_id,
value_1,
time
FROM raw_events_first
INSERT INTO agg_events AS ae
(
user_id,
value_1_agg,
agg_time
)
SELECT user_id,
value_1,
time
FROM raw_events_first
ON conflict (user_id, value_1_agg)
DO UPDATE
SET agg_time = EXCLUDED.agg_time
SET agg_time = EXCLUDED.agg_time
WHERE ae.agg_time < EXCLUDED.agg_time
RETURNING user_id, value_1_agg;
DEBUG: distributed statement: INSERT INTO public.agg_events_13300008 AS ae (user_id, value_1_agg, agg_time) SELECT user_id, value_1, "time" FROM public.raw_events_first_13300000 raw_events_first WHERE ((worker_hash(user_id) OPERATOR(pg_catalog.>=) '-2147483648'::integer) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) '-1073741825'::integer)) ON CONFLICT(user_id, value_1_agg) DO UPDATE SET agg_time = excluded.agg_time WHERE (ae.agg_time OPERATOR(pg_catalog.<) excluded.agg_time) RETURNING ae.user_id, ae.value_1_agg
@ -584,10 +584,10 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_t
DEBUG: Plan is router executable
SET client_min_messages TO INFO;
-- see that the results are different from the SELECT query
SELECT
SELECT
user_id, value_1_agg
FROM
agg_events
FROM
agg_events
ORDER BY
user_id, value_1_agg;
user_id | value_1_agg
@ -770,7 +770,6 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300009 AS citus_t
DEBUG: distributed statement: INSERT INTO public.agg_events_13300010 AS citus_table_alias (user_id) SELECT raw_events_first.user_id FROM (public.raw_events_first_13300002 raw_events_first LEFT JOIN public.raw_events_second_13300006 raw_events_second ON ((raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE ((worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.>=) 0) AND (worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.<=) 1073741823))
DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_table_alias (user_id) SELECT raw_events_first.user_id FROM (public.raw_events_first_13300003 raw_events_first LEFT JOIN public.raw_events_second_13300007 raw_events_second ON ((raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE ((worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.<=) 2147483647))
DEBUG: Plan is router executable
INSERT INTO agg_events (user_id)
SELECT
raw_events_second.user_id
@ -781,7 +780,6 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300009 AS citus_t
DEBUG: distributed statement: INSERT INTO public.agg_events_13300010 AS citus_table_alias (user_id) SELECT raw_events_second.user_id FROM (public.reference_table_13300012 reference_table LEFT JOIN public.raw_events_second_13300006 raw_events_second ON ((reference_table.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE ((worker_hash(raw_events_second.user_id) OPERATOR(pg_catalog.>=) 0) AND (worker_hash(raw_events_second.user_id) OPERATOR(pg_catalog.<=) 1073741823))
DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_table_alias (user_id) SELECT raw_events_second.user_id FROM (public.reference_table_13300012 reference_table LEFT JOIN public.raw_events_second_13300007 raw_events_second ON ((reference_table.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE ((worker_hash(raw_events_second.user_id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(raw_events_second.user_id) OPERATOR(pg_catalog.<=) 2147483647))
DEBUG: Plan is router executable
INSERT INTO agg_events (user_id)
SELECT
raw_events_first.user_id
@ -793,7 +791,6 @@ DEBUG: Skipping target shard interval 13300009 since SELECT query for it pruned
DEBUG: Skipping target shard interval 13300010 since SELECT query for it pruned away
DEBUG: Skipping target shard interval 13300011 since SELECT query for it pruned away
DEBUG: Plan is router executable
INSERT INTO agg_events (user_id)
SELECT
raw_events_first.user_id
@ -805,7 +802,6 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300009 AS citus_t
DEBUG: distributed statement: INSERT INTO public.agg_events_13300010 AS citus_table_alias (user_id) SELECT raw_events_first.user_id FROM (public.raw_events_first_13300002 raw_events_first LEFT JOIN (SELECT NULL::integer AS user_id, NULL::timestamp without time zone AS "time", NULL::integer AS value_1, NULL::integer AS value_2, NULL::double precision AS value_3, NULL::bigint AS value_4 WHERE false) raw_events_second(user_id, "time", value_1, value_2, value_3, value_4) ON ((raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE (((raw_events_second.user_id OPERATOR(pg_catalog.=) 10) OR (raw_events_second.user_id OPERATOR(pg_catalog.=) 11)) AND ((worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.>=) 0) AND (worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.<=) 1073741823)))
DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_table_alias (user_id) SELECT raw_events_first.user_id FROM (public.raw_events_first_13300003 raw_events_first LEFT JOIN public.raw_events_second_13300007 raw_events_second ON ((raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE (((raw_events_second.user_id OPERATOR(pg_catalog.=) 10) OR (raw_events_second.user_id OPERATOR(pg_catalog.=) 11)) AND ((worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.<=) 2147483647)))
DEBUG: Plan is router executable
INSERT INTO agg_events (user_id)
SELECT
raw_events_first.user_id
@ -817,7 +813,6 @@ DEBUG: Skipping target shard interval 13300009 since SELECT query for it pruned
DEBUG: Skipping target shard interval 13300010 since SELECT query for it pruned away
DEBUG: Skipping target shard interval 13300011 since SELECT query for it pruned away
DEBUG: Plan is router executable
INSERT INTO agg_events (user_id)
SELECT
raw_events_first.user_id
@ -829,7 +824,6 @@ DEBUG: Skipping target shard interval 13300009 since SELECT query for it pruned
DEBUG: Skipping target shard interval 13300010 since SELECT query for it pruned away
DEBUG: Skipping target shard interval 13300011 since SELECT query for it pruned away
DEBUG: Plan is router executable
INSERT INTO agg_events (user_id)
SELECT
raw_events_first.user_id
@ -841,7 +835,6 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300009 AS citus_t
DEBUG: distributed statement: INSERT INTO public.agg_events_13300010 AS citus_table_alias (user_id) SELECT raw_events_first.user_id FROM (public.raw_events_first_13300002 raw_events_first LEFT JOIN public.raw_events_second_13300006 raw_events_second ON ((raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE ((raw_events_first.user_id OPERATOR(pg_catalog.=) ANY (ARRAY[19, 20, 21])) AND ((worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.>=) 0) AND (worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.<=) 1073741823)))
DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_table_alias (user_id) SELECT raw_events_first.user_id FROM ((SELECT NULL::integer AS user_id, NULL::timestamp without time zone AS "time", NULL::integer AS value_1, NULL::integer AS value_2, NULL::double precision AS value_3, NULL::bigint AS value_4 WHERE false) raw_events_first(user_id, "time", value_1, value_2, value_3, value_4) LEFT JOIN public.raw_events_second_13300007 raw_events_second ON ((raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE ((raw_events_first.user_id OPERATOR(pg_catalog.=) ANY (ARRAY[19, 20, 21])) AND ((worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.<=) 2147483647)))
DEBUG: Plan is router executable
INSERT INTO agg_events (user_id)
SELECT
raw_events_first.user_id
@ -853,7 +846,6 @@ DEBUG: distributed statement: INSERT INTO public.agg_events_13300009 AS citus_t
DEBUG: distributed statement: INSERT INTO public.agg_events_13300010 AS citus_table_alias (user_id) SELECT raw_events_first.user_id FROM (public.raw_events_first_13300002 raw_events_first JOIN public.raw_events_second_13300006 raw_events_second ON ((raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE ((raw_events_second.user_id OPERATOR(pg_catalog.=) ANY (ARRAY[19, 20, 21])) AND ((worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.>=) 0) AND (worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.<=) 1073741823)))
DEBUG: distributed statement: INSERT INTO public.agg_events_13300011 AS citus_table_alias (user_id) SELECT raw_events_first.user_id FROM (public.raw_events_first_13300003 raw_events_first JOIN (SELECT NULL::integer AS user_id, NULL::timestamp without time zone AS "time", NULL::integer AS value_1, NULL::integer AS value_2, NULL::double precision AS value_3, NULL::bigint AS value_4 WHERE false) raw_events_second(user_id, "time", value_1, value_2, value_3, value_4) ON ((raw_events_first.user_id OPERATOR(pg_catalog.=) raw_events_second.user_id))) WHERE ((raw_events_second.user_id OPERATOR(pg_catalog.=) ANY (ARRAY[19, 20, 21])) AND ((worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(raw_events_first.user_id) OPERATOR(pg_catalog.<=) 2147483647)))
DEBUG: Plan is router executable
-- the following is a very tricky query for Citus
-- although we do not support pushing down JOINs on non-partition
-- columns here it is safe to push it down given that we're looking for
@ -861,16 +853,15 @@ DEBUG: Plan is router executable
-- Note that the query always hits the same shard on raw_events_second
-- and this query wouldn't have worked if we're to use different worker
-- count or shard replication factor
INSERT INTO agg_events
(user_id)
SELECT raw_events_first.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_second.user_id = raw_events_first.value_1
AND raw_events_first.value_1 = 12;
INSERT INTO agg_events
(user_id)
SELECT raw_events_first.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_second.user_id = raw_events_first.value_1
AND raw_events_first.value_1 = 12;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- some unsupported LEFT/INNER JOINs
-- JOIN on one table with partition column other is not
INSERT INTO agg_events (user_id)
@ -880,7 +871,6 @@ DETAIL: Select query cannot be pushed down to the worker.
raw_events_first LEFT JOIN raw_events_second ON raw_events_first.user_id = raw_events_second.value_1;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- same as the above with INNER JOIN
INSERT INTO agg_events (user_id)
SELECT
@ -889,17 +879,15 @@ DETAIL: Select query cannot be pushed down to the worker.
raw_events_first INNER JOIN raw_events_second ON raw_events_first.user_id = raw_events_second.value_1;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- a not meaningful query
INSERT INTO agg_events
(user_id)
SELECT raw_events_second.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_first.user_id = raw_events_first.value_1;
INSERT INTO agg_events
(user_id)
SELECT raw_events_second.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_first.user_id = raw_events_first.value_1;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- both tables joined on non-partition columns
INSERT INTO agg_events (user_id)
SELECT
@ -908,7 +896,6 @@ DETAIL: Select query cannot be pushed down to the worker.
raw_events_first LEFT JOIN raw_events_second ON raw_events_first.value_1 = raw_events_second.value_1;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- same as the above with INNER JOIN
INSERT INTO agg_events (user_id)
SELECT
@ -917,7 +904,6 @@ DETAIL: Select query cannot be pushed down to the worker.
raw_events_first INNER JOIN raw_events_second ON raw_events_first.value_1 = raw_events_second.value_1;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- even if there is a filter on the partition key, since the join is not on the partition key we reject
-- this query
INSERT INTO agg_events (user_id)
@ -925,11 +911,10 @@ SELECT
raw_events_first.user_id
FROM
raw_events_first LEFT JOIN raw_events_second ON raw_events_first.user_id = raw_events_second.value_1
WHERE
WHERE
raw_events_first.user_id = 10;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- same as the above with INNER JOIN
INSERT INTO agg_events (user_id)
SELECT
@ -939,7 +924,6 @@ DETAIL: Select query cannot be pushed down to the worker.
WHERE raw_events_first.user_id = 10;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- make things a bit more complicate with IN clauses
INSERT INTO agg_events (user_id)
SELECT
@ -949,32 +933,29 @@ DETAIL: Select query cannot be pushed down to the worker.
WHERE raw_events_first.value_1 IN (10, 11,12) OR raw_events_second.user_id IN (1,2,3,4);
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- implicit join on non partition column should also not be pushed down
INSERT INTO agg_events
(user_id)
SELECT raw_events_first.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_second.user_id = raw_events_first.value_1;
INSERT INTO agg_events
(user_id)
SELECT raw_events_first.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_second.user_id = raw_events_first.value_1;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- the following is again a tricky query for Citus
-- if the given filter was on value_1 as shown in the above, Citus could
-- push it down. But here the query is refused
INSERT INTO agg_events
(user_id)
SELECT raw_events_first.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_second.user_id = raw_events_first.value_1
INSERT INTO agg_events
(user_id)
SELECT raw_events_first.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_second.user_id = raw_events_first.value_1
AND raw_events_first.value_2 = 12;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- lets do some unsupported query tests with subqueries
-- foo is not joined on the partition key so the query is not
-- foo is not joined on the partition key so the query is not
-- pushed down
INSERT INTO agg_events
(user_id, value_4_agg)
@ -1008,17 +989,17 @@ ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- if the given filter was on value_1 as shown in the above, Citus could
-- push it down. But here the query is refused
INSERT INTO agg_events
(user_id)
SELECT raw_events_first.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_second.user_id = raw_events_first.value_1
INSERT INTO agg_events
(user_id)
SELECT raw_events_first.user_id
FROM raw_events_first,
raw_events_second
WHERE raw_events_second.user_id = raw_events_first.value_1
AND raw_events_first.value_2 = 12;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- lets do some unsupported query tests with subqueries
-- foo is not joined on the partition key so the query is not
-- foo is not joined on the partition key so the query is not
-- pushed down
INSERT INTO agg_events
(user_id, value_4_agg)
@ -1177,7 +1158,7 @@ INSERT INTO agg_events
SELECT SUM(value_3),
Count(value_4),
user_id,
SUM(value_1),
SUM(value_1),
value_2
FROM raw_events_first
GROUP BY user_id,
@ -1438,7 +1419,7 @@ ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- not supported subqueries in WHERE clause
-- since the selected value in the WHERE is not
-- partition key
-- partition key
INSERT INTO raw_events_second
(user_id)
SELECT user_id
@ -1525,7 +1506,7 @@ DEBUG: distributed statement: INSERT INTO public.raw_events_second_13300005 AS
DEBUG: distributed statement: INSERT INTO public.raw_events_second_13300006 AS citus_table_alias (user_id) SELECT user_id FROM public.raw_events_first_13300002 raw_events_first WHERE ((NOT (EXISTS (SELECT 1 FROM public.raw_events_second_13300006 raw_events_second WHERE (raw_events_second.user_id OPERATOR(pg_catalog.=) raw_events_first.user_id)))) AND ((worker_hash(user_id) OPERATOR(pg_catalog.>=) 0) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) 1073741823)))
DEBUG: distributed statement: INSERT INTO public.raw_events_second_13300007 AS citus_table_alias (user_id) SELECT user_id FROM public.raw_events_first_13300003 raw_events_first WHERE ((NOT (EXISTS (SELECT 1 FROM public.raw_events_second_13300007 raw_events_second WHERE (raw_events_second.user_id OPERATOR(pg_catalog.=) raw_events_first.user_id)))) AND ((worker_hash(user_id) OPERATOR(pg_catalog.>=) 1073741824) AND (worker_hash(user_id) OPERATOR(pg_catalog.<=) 2147483647)))
DEBUG: Plan is router executable
-- more complex LEFT JOINs
-- more complex LEFT JOINs
INSERT INTO agg_events
(user_id, value_4_agg)
SELECT
@ -1705,39 +1686,39 @@ TRUNCATE raw_events_first;
-- we don't support LIMIT for subquery pushdown, but
-- we recursively plan the query and run it via coordinator
INSERT INTO agg_events(user_id)
SELECT user_id
FROM users_table
WHERE user_id
IN (SELECT
user_id
SELECT user_id
FROM users_table
WHERE user_id
IN (SELECT
user_id
FROM (
(
SELECT
user_id
SELECT
user_id
FROM
(
SELECT
e1.user_id
FROM
users_table u1, events_table e1
WHERE
SELECT
e1.user_id
FROM
users_table u1, events_table e1
WHERE
e1.user_id = u1.user_id LIMIT 3
) as f_inner
)
) AS f2);
) AS f2);
-- Altering a table and selecting from it using a multi-shard statement
-- in the same transaction is allowed because we will use the same
-- connections for all co-located placements.
BEGIN;
ALTER TABLE raw_events_second DROP COLUMN value_4;
INSERT INTO raw_events_first SELECT * FROM raw_events_second;
INSERT INTO raw_events_first SELECT * FROM raw_events_second;
ROLLBACK;
-- Alterating a table and selecting from it using a single-shard statement
-- in the same transaction is disallowed because we will use a different
-- connection.
BEGIN;
ALTER TABLE raw_events_second DROP COLUMN value_4;
INSERT INTO raw_events_first SELECT * FROM raw_events_second WHERE user_id = 100;
INSERT INTO raw_events_first SELECT * FROM raw_events_second WHERE user_id = 100;
ROLLBACK;
-- Altering a reference table and then performing an INSERT ... SELECT which
-- joins with the reference table is allowed, since the INSERT ... SELECT
@ -1897,17 +1878,17 @@ INSERT INTO insert_select_varchar_test (key, value)
SELECT *, 100
FROM (SELECT f1.key
FROM (SELECT key
FROM insert_select_varchar_test
FROM insert_select_varchar_test
GROUP BY 1
HAVING Count(key) < 3) AS f1,
(SELECT key
FROM insert_select_varchar_test
GROUP BY 1
HAVING Sum(COALESCE(insert_select_varchar_test.value, 0)) >
20.0)
AS f2
WHERE f1.key = f2.key
GROUP BY 1) AS foo;
HAVING Count(key) < 3) AS f1,
(SELECT key
FROM insert_select_varchar_test
GROUP BY 1
HAVING Sum(COALESCE(insert_select_varchar_test.value, 0)) >
20.0)
AS f2
WHERE f1.key = f2.key
GROUP BY 1) AS foo;
SELECT * FROM insert_select_varchar_test ORDER BY 1 DESC, 2 DESC;
key | value
--------+-------
@ -1920,7 +1901,7 @@ SELECT * FROM insert_select_varchar_test ORDER BY 1 DESC, 2 DESC;
-- this test is mostly importantly intended for deparsing the query correctly
-- but still it is preferable to have this test here instead of multi_deparse_shard_query
CREATE TABLE table_with_defaults
(
(
store_id int,
first_name text,
default_1 int DEFAULT 1,
@ -2101,10 +2082,10 @@ SELECT create_distributed_table('table_with_starts_with_defaults', 'c');
(1 row)
SET client_min_messages TO DEBUG;
INSERT INTO text_table (part_col)
SELECT
INSERT INTO text_table (part_col)
SELECT
CASE WHEN part_col = 'onder' THEN 'marco'
END
END
FROM text_table ;
DEBUG: cannot perform distributed INSERT INTO ... SELECT because the partition columns in the source table and subquery do not match
DETAIL: Subquery contains a case expression in the same position as the target table's partition column.
@ -2166,7 +2147,7 @@ DEBUG: Collecting INSERT ... SELECT results on coordinator
DEBUG: Router planner cannot handle multi-shard select queries
RESET client_min_messages;
insert into table_with_starts_with_defaults (b,c) select b,c FROM table_with_starts_with_defaults;
-- Test on partition column without native hash function
-- Test on partition column without native hash function
CREATE TABLE raw_table
(
id BIGINT,
@ -2774,9 +2755,9 @@ SELECT * FROM coerce_agg ORDER BY 1 DESC, 2 DESC;
-- INSERT..SELECT + prepared statements + recursive planning
BEGIN;
PREPARE prepared_recursive_insert_select AS
INSERT INTO users_table
SELECT * FROM users_table
PREPARE prepared_recursive_insert_select AS
INSERT INTO users_table
SELECT * FROM users_table
WHERE value_1 IN (SELECT value_2 FROM events_table OFFSET 0);
EXECUTE prepared_recursive_insert_select;
EXECUTE prepared_recursive_insert_select;

View File

@ -4,7 +4,7 @@
------------------------------------
------------------------------------
CREATE TABLE test_table_1(id int);
INSERT INTO test_table_1
INSERT INTO test_table_1
SELECT user_id FROM users_table;
ERROR: cannot INSERT rows from a distributed query into a local table
HINT: Consider using CREATE TEMPORARY TABLE tmp AS SELECT ... and inserting from the temporary table.
@ -67,10 +67,9 @@ FROM (
AND e.event_type IN (103, 104, 105)
)
) t1 LEFT JOIN (
SELECT DISTINCT user_id,
SELECT DISTINCT user_id,
'Has done event'::TEXT AS hasdone_event
FROM events_table AS e
WHERE e.user_id >= 10
AND e.user_id <= 25
AND e.event_type IN (106, 107, 108)
@ -108,10 +107,9 @@ FROM (
AND e.event_type IN (103, 104, 105)
)
) t1 LEFT JOIN (
SELECT DISTINCT user_id,
SELECT DISTINCT user_id,
'Has done event'::TEXT AS hasdone_event
FROM events_table AS e
WHERE e.user_id >= 10
AND e.user_id <= 25
AND e.event_type IN (106, 107, 108)
@ -151,10 +149,9 @@ FROM (
AND e.event_type IN (103, 104, 105)
)
) t1 LEFT JOIN (
SELECT DISTINCT user_id,
SELECT DISTINCT user_id,
'Has done event'::TEXT AS hasdone_event
FROM events_table AS e
WHERE e.user_id >= 10
AND e.user_id <= 25
AND e.event_type IN (106, 107, 108)
@ -225,7 +222,7 @@ SELECT
users_table
WHERE
user_id >= 10 AND
user_id <= 70 AND
user_id <= 70 AND
users_table.value_1 > 15 AND users_table.value_1 < 17
GROUP BY
user_id
@ -295,7 +292,7 @@ SELECT
users_table
WHERE
user_id >= 10 AND
user_id <= 70 AND
user_id <= 70 AND
users_table.value_1 > 15 AND users_table.value_1 < 17
GROUP BY
user_id
@ -340,7 +337,6 @@ FROM (
max(u.time) as user_lastseen,
array_agg(event_type ORDER BY u.time) AS event_array
FROM (
SELECT user_id, time
FROM users_table
WHERE
@ -370,7 +366,6 @@ FROM (
max(u.time) as user_lastseen,
array_agg(event_type ORDER BY u.time) AS event_array
FROM (
SELECT user_id, time
FROM users_table
WHERE
@ -400,7 +395,6 @@ FROM (
max(u.time) as user_lastseen,
array_agg(event_type ORDER BY u.time) AS event_array
FROM (
SELECT user_id, time, value_3 as val_3
FROM users_table
WHERE
@ -519,7 +513,6 @@ SELECT user_id, value_2 FROM users_table WHERE
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type > 300 AND event_type <= 350 AND value_3 > 100 AND user_id=users_table.user_id);
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
------------------------------------
------------------------------------
-- Customers who have done X more than 2 times, and satisfy other customer specific criteria
@ -527,55 +520,55 @@ DETAIL: Select query cannot be pushed down to the worker.
------------------------------------
-- not pushable since the second join is not an equi join
INSERT INTO agg_results_third(user_id, value_2_agg)
SELECT user_id,
value_2
SELECT user_id,
value_2
FROM users_table
WHERE value_1 > 100
AND value_1 < 124
AND value_2 >= 5
AND EXISTS (SELECT user_id
WHERE value_1 > 100
AND value_1 < 124
AND value_2 >= 5
AND EXISTS (SELECT user_id
FROM events_table
WHERE event_type > 100
AND event_type < 124
AND value_3 > 100
AND user_id != users_table.user_id
GROUP BY user_id
WHERE event_type > 100
AND event_type < 124
AND value_3 > 100
AND user_id != users_table.user_id
GROUP BY user_id
HAVING Count(*) > 2);
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- not pushable since the second join is not on the partition key
INSERT INTO agg_results_third(user_id, value_2_agg)
SELECT user_id,
value_2
SELECT user_id,
value_2
FROM users_table
WHERE value_1 > 100
AND value_1 < 124
AND value_2 >= 5
AND EXISTS (SELECT user_id
WHERE value_1 > 100
AND value_1 < 124
AND value_2 >= 5
AND EXISTS (SELECT user_id
FROM events_table
WHERE event_type > 100
AND event_type < 124
AND value_3 > 100
AND event_type = users_table.user_id
GROUP BY user_id
WHERE event_type > 100
AND event_type < 124
AND value_3 > 100
AND event_type = users_table.user_id
GROUP BY user_id
HAVING Count(*) > 2);
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- not pushable since the second join is not on the partition key
INSERT INTO agg_results_third(user_id, value_2_agg)
SELECT user_id,
value_2
SELECT user_id,
value_2
FROM users_table
WHERE value_1 > 100
AND value_1 < 124
AND value_2 >= 5
AND EXISTS (SELECT user_id
WHERE value_1 > 100
AND value_1 < 124
AND value_2 >= 5
AND EXISTS (SELECT user_id
FROM events_table
WHERE event_type > 100
AND event_type < 124
AND value_3 > 100
AND user_id = users_table.value_1
GROUP BY user_id
WHERE event_type > 100
AND event_type < 124
AND value_3 > 100
AND user_id = users_table.value_1
GROUP BY user_id
HAVING Count(*) > 2);
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
@ -594,7 +587,7 @@ And user_id NOT in
(select user_id
From users_table
Where value_1 = 15
And value_2 > 25);
And value_2 > 25);
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- not pushable since we're not selecting the partition key
@ -607,10 +600,9 @@ And user_id in
(select value_3
From users_table
Where value_1 = 15
And value_2 > 25);
And value_2 > 25);
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- not pushable since we're not selecting the partition key
-- from the events table
INSERT INTO agg_results_third(user_id)
@ -622,7 +614,7 @@ And event_type in
(select user_id
From users_table
Where value_1 = 15
And value_2 > 25);
And value_2 > 25);
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
------------------------------------
@ -660,17 +652,17 @@ DETAIL: Select query cannot be pushed down to the worker.
INSERT INTO agg_results_third(user_id, value_1_agg, value_3_agg)
SELECT
users_table.user_id, users_table.value_1, prob
FROM
FROM
users_table
JOIN
(SELECT
JOIN
(SELECT
ma.user_id, (GREATEST(coalesce(ma.value_4 / 250, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM
FROM
users_table AS ma, events_table as short_list
WHERE
WHERE
short_list.user_id != ma.user_id and ma.value_1 < 50 and short_list.event_type < 50
) temp
ON users_table.user_id = temp.user_id
) temp
ON users_table.user_id = temp.user_id
WHERE users_table.value_1 < 50;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
@ -678,17 +670,17 @@ DETAIL: Select query cannot be pushed down to the worker.
INSERT INTO agg_results_third(user_id, value_1_agg, value_3_agg)
SELECT
users_table.user_id, users_table.value_1, prob
FROM
FROM
users_table
JOIN
(SELECT
JOIN
(SELECT
ma.user_id, (GREATEST(coalesce(ma.value_4 / 250, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM
FROM
users_table AS ma, events_table as short_list
WHERE
WHERE
short_list.user_id = ma.value_2 and ma.value_1 < 50 and short_list.event_type < 50
) temp
ON users_table.user_id = temp.user_id
) temp
ON users_table.user_id = temp.user_id
WHERE users_table.value_1 < 50;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.

View File

@ -10,7 +10,7 @@ SELECT json_agg(value) FROM (
) t
$$;
-- Check multi_cat_agg() aggregate which is used to implement json_agg()
SELECT json_cat_agg(i) FROM
SELECT json_cat_agg(i) FROM
(VALUES ('[1,{"a":2}]'::json), ('[null]'::json), (NULL), ('["3",5,4]'::json)) AS t(i);
json_cat_agg
-------------------------------
@ -141,7 +141,6 @@ SELECT json_agg(case when l_quantity > 20 then l_quantity else NULL end)
[null, 36.00, null, 28.00, 24.00, 32.00, 38.00, 45.00, 49.00, 27.00, null, 28.00, 26.00, 30.00]
(1 row)
-- Check that we can execute json_agg() with an expression containing different types
SELECT json_agg(case when l_quantity > 20 then to_json(l_quantity) else '"f"'::json end)
FROM lineitem WHERE l_orderkey < 5;
@ -150,7 +149,6 @@ SELECT json_agg(case when l_quantity > 20 then to_json(l_quantity) else '"f"'::j
["f", 36.00, "f", 28.00, 24.00, 32.00, 38.00, 45.00, 49.00, 27.00, "f", 28.00, 26.00, 30.00]
(1 row)
-- Check that we can execute json_agg() with an expression containing json arrays
SELECT json_agg(json_build_array(l_quantity, l_shipdate))
FROM lineitem WHERE l_orderkey < 3;
@ -159,7 +157,6 @@ SELECT json_agg(json_build_array(l_quantity, l_shipdate))
[[17.00, "1996-03-13"], [36.00, "1996-04-12"], [8.00, "1996-01-29"], [28.00, "1996-04-21"], [24.00, "1996-03-30"], [32.00, "1996-01-30"], [38.00, "1997-01-28"]]
(1 row)
-- Check that we can execute json_agg() with an expression containing arrays
SELECT json_agg(ARRAY[l_quantity, l_orderkey])
FROM lineitem WHERE l_orderkey < 3;

View File

@ -15,7 +15,7 @@ SELECT json_object_agg(key, value) FROM (
) t
$$;
-- Check multi_cat_agg() aggregate which is used to implement json_object_agg()
SELECT json_cat_agg(i) FROM
SELECT json_cat_agg(i) FROM
(VALUES ('{"c":[], "b":2}'::json), (NULL), ('{"d":null, "a":{"b":3}, "b":2}'::json)) AS t(i);
json_cat_agg
-----------------------------------------------------------
@ -30,7 +30,7 @@ ERROR: json_object_agg with order by is unsupported
SELECT json_object_agg(distinct l_orderkey, l_shipmode ORDER BY l_orderkey) FROM lineitem;
ERROR: json_object_agg with order by is unsupported
-- Check json_object_agg() for different data types and LIMIT clauses
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_partkey))
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_partkey))
FROM lineitem GROUP BY l_orderkey
ORDER BY l_orderkey LIMIT 10;
keys_sort
@ -47,7 +47,7 @@ SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_partk
{ "341" : 88362, "342" : 89414, "343" : 169544 }
(10 rows)
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_extendedprice))
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_extendedprice))
FROM lineitem GROUP BY l_orderkey
ORDER BY l_orderkey LIMIT 10;
keys_sort
@ -64,7 +64,7 @@ SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_exten
{ "341" : 17554.68, "342" : 30875.02, "343" : 9681.24 }
(10 rows)
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_shipmode))
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_shipmode))
FROM lineitem GROUP BY l_orderkey
ORDER BY l_orderkey LIMIT 10;
keys_sort
@ -81,7 +81,7 @@ SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_shipm
{ "341" : "REG AIR ", "342" : "FOB ", "343" : "FOB " }
(10 rows)
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_shipdate))
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_shipdate))
FROM lineitem GROUP BY l_orderkey
ORDER BY l_orderkey LIMIT 10;
keys_sort
@ -109,8 +109,8 @@ SELECT count_keys(json_object_agg(l_shipdate, l_orderkey)) FROM lineitem;
-- shards and contain different aggregates, filter clauses and other complex
-- expressions. Note that the l_orderkey ranges are such that the matching rows
-- lie in different shards.
SELECT l_quantity, count(*), avg(l_extendedprice),
keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_shipdate))
SELECT l_quantity, count(*), avg(l_extendedprice),
keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_shipdate))
FROM lineitem
WHERE l_quantity < 5 AND l_orderkey > 5000 AND l_orderkey < 5300
GROUP BY l_quantity ORDER BY l_quantity;
@ -122,7 +122,7 @@ SELECT l_quantity, count(*), avg(l_extendedprice),
4.00 | 4 | 5795.6800000000000000 | { "50313" : "1994-12-26", "50622" : "1993-02-06", "50891" : "1992-09-18", "51893" : "1993-12-21" }
(4 rows)
SELECT l_quantity, keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text,
SELECT l_quantity, keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text,
extract (month FROM o_orderdate)))
FROM lineitem, orders WHERE l_orderkey = o_orderkey AND l_quantity < 5
AND l_orderkey > 5000 AND l_orderkey < 5300 GROUP BY l_quantity ORDER BY l_quantity;
@ -134,7 +134,7 @@ SELECT l_quantity, keys_sort(json_object_agg(l_orderkey::text || l_linenumber::t
4.00 | { "50313" : 12, "50622" : 10, "50891" : 7, "51893" : 11 }
(4 rows)
SELECT l_quantity, keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_orderkey * 2 + 1))
SELECT l_quantity, keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, l_orderkey * 2 + 1))
FROM lineitem WHERE l_quantity < 5
AND octet_length(l_comment) + octet_length('randomtext'::text) > 40
AND l_orderkey > 5000 AND l_orderkey < 6000 GROUP BY l_quantity ORDER BY l_quantity;
@ -147,7 +147,7 @@ SELECT l_quantity, keys_sort(json_object_agg(l_orderkey::text || l_linenumber::t
(4 rows)
-- Check that we can execute json_object_agg() with an expression containing NULL values
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text,
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text,
case when l_quantity > 20 then l_quantity else NULL end))
FROM lineitem WHERE l_orderkey < 5;
keys_sort
@ -155,9 +155,8 @@ SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text,
{ "11" : null, "12" : 36.00, "13" : null, "14" : 28.00, "15" : 24.00, "16" : 32.00, "21" : 38.00, "31" : 45.00, "32" : 49.00, "33" : 27.00, "34" : null, "35" : 28.00, "36" : 26.00, "41" : 30.00 }
(1 row)
-- Check that we can execute json_object_agg() with an expression containing different types
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text,
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text,
case when l_quantity > 20 then to_json(l_quantity) else '"f"'::json end))
FROM lineitem WHERE l_orderkey < 5;
keys_sort
@ -165,7 +164,6 @@ SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text,
{ "11" : "f", "12" : 36.00, "13" : "f", "14" : 28.00, "15" : 24.00, "16" : 32.00, "21" : 38.00, "31" : 45.00, "32" : 49.00, "33" : 27.00, "34" : "f", "35" : 28.00, "36" : 26.00, "41" : 30.00 }
(1 row)
-- Check that we can execute json_object_agg() with an expression containing json arrays
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, json_build_array(l_quantity, l_shipdate)))
FROM lineitem WHERE l_orderkey < 3;
@ -174,7 +172,6 @@ SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, json_bu
{ "11" : [17.00, "1996-03-13"], "12" : [36.00, "1996-04-12"], "13" : [8.00, "1996-01-29"], "14" : [28.00, "1996-04-21"], "15" : [24.00, "1996-03-30"], "16" : [32.00, "1996-01-30"], "21" : [38.00, "1997-01-28"] }
(1 row)
-- Check that we can execute json_object_agg() with an expression containing arrays
SELECT keys_sort(json_object_agg(l_orderkey::text || l_linenumber::text, ARRAY[l_quantity, l_orderkey]))
FROM lineitem WHERE l_orderkey < 3;

View File

@ -10,7 +10,7 @@ SELECT jsonb_agg(value) FROM (
) t
$$;
-- Check multi_cat_agg() aggregate which is used to implement jsonb_agg()
SELECT jsonb_cat_agg(i) FROM
SELECT jsonb_cat_agg(i) FROM
(VALUES ('[1,{"a":2}]'::jsonb), ('[null]'::jsonb), (NULL), ('["3",5,4]'::jsonb)) AS t(i);
jsonb_cat_agg
--------------------------------
@ -141,7 +141,6 @@ SELECT jsonb_agg(case when l_quantity > 20 then l_quantity else NULL end)
[null, 36.00, null, 28.00, 24.00, 32.00, 38.00, 45.00, 49.00, 27.00, null, 28.00, 26.00, 30.00]
(1 row)
-- Check that we can execute jsonb_agg() with an expression containing different types
SELECT jsonb_agg(case when l_quantity > 20 then to_jsonb(l_quantity) else '"f"'::jsonb end)
FROM lineitem WHERE l_orderkey < 5;
@ -150,7 +149,6 @@ SELECT jsonb_agg(case when l_quantity > 20 then to_jsonb(l_quantity) else '"f"':
["f", 36.00, "f", 28.00, 24.00, 32.00, 38.00, 45.00, 49.00, 27.00, "f", 28.00, 26.00, 30.00]
(1 row)
-- Check that we can execute jsonb_agg() with an expression containing jsonb arrays
SELECT jsonb_agg(jsonb_build_array(l_quantity, l_shipdate))
FROM lineitem WHERE l_orderkey < 3;
@ -159,7 +157,6 @@ SELECT jsonb_agg(jsonb_build_array(l_quantity, l_shipdate))
[[17.00, "1996-03-13"], [36.00, "1996-04-12"], [8.00, "1996-01-29"], [28.00, "1996-04-21"], [24.00, "1996-03-30"], [32.00, "1996-01-30"], [38.00, "1997-01-28"]]
(1 row)
-- Check that we can execute jsonb_agg() with an expression containing arrays
SELECT jsonb_agg(ARRAY[l_quantity, l_orderkey])
FROM lineitem WHERE l_orderkey < 3;

View File

@ -8,7 +8,7 @@ AS $$
SELECT count(*) FROM (SELECT * FROM jsonb_object_keys($1)) t
$$;
-- Check multi_cat_agg() aggregate which is used to implement jsonb_object_agg()
SELECT jsonb_cat_agg(i) FROM
SELECT jsonb_cat_agg(i) FROM
(VALUES ('{"c":[], "b":2}'::jsonb), (NULL), ('{"d":null, "a":{"b":3}, "b":2}'::jsonb)) AS t(i);
jsonb_cat_agg
---------------------------------------------
@ -23,7 +23,7 @@ ERROR: jsonb_object_agg with order by is unsupported
SELECT jsonb_object_agg(distinct l_orderkey, l_shipmode ORDER BY l_orderkey) FROM lineitem;
ERROR: jsonb_object_agg with order by is unsupported
-- Check jsonb_object_agg() for different data types and LIMIT clauses
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_partkey)
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_partkey)
FROM lineitem GROUP BY l_orderkey
ORDER BY l_orderkey LIMIT 10;
jsonb_object_agg
@ -40,7 +40,7 @@ SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_partkey)
{"341": 88362, "342": 89414, "343": 169544}
(10 rows)
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_extendedprice)
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_extendedprice)
FROM lineitem GROUP BY l_orderkey
ORDER BY l_orderkey LIMIT 10;
jsonb_object_agg
@ -57,7 +57,7 @@ SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_extendedprice)
{"341": 17554.68, "342": 30875.02, "343": 9681.24}
(10 rows)
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_shipmode)
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_shipmode)
FROM lineitem GROUP BY l_orderkey
ORDER BY l_orderkey LIMIT 10;
jsonb_object_agg
@ -74,7 +74,7 @@ SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_shipmode)
{"341": "REG AIR ", "342": "FOB ", "343": "FOB "}
(10 rows)
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_shipdate)
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_shipdate)
FROM lineitem GROUP BY l_orderkey
ORDER BY l_orderkey LIMIT 10;
jsonb_object_agg
@ -102,8 +102,8 @@ SELECT count_keys(jsonb_object_agg(l_shipdate, l_orderkey)) FROM lineitem;
-- shards and contain different aggregates, filter clauses and other complex
-- expressions. Note that the l_orderkey ranges are such that the matching rows
-- lie in different shards.
SELECT l_quantity, count(*), avg(l_extendedprice),
jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_shipdate)
SELECT l_quantity, count(*), avg(l_extendedprice),
jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_shipdate)
FROM lineitem
WHERE l_quantity < 5 AND l_orderkey > 5000 AND l_orderkey < 5300
GROUP BY l_quantity ORDER BY l_quantity;
@ -115,7 +115,7 @@ SELECT l_quantity, count(*), avg(l_extendedprice),
4.00 | 4 | 5795.6800000000000000 | {"50313": "1994-12-26", "50622": "1993-02-06", "50891": "1992-09-18", "51893": "1993-12-21"}
(4 rows)
SELECT l_quantity, jsonb_object_agg(l_orderkey::text || l_linenumber::text,
SELECT l_quantity, jsonb_object_agg(l_orderkey::text || l_linenumber::text,
extract (month FROM o_orderdate))
FROM lineitem, orders WHERE l_orderkey = o_orderkey AND l_quantity < 5
AND l_orderkey > 5000 AND l_orderkey < 5300 GROUP BY l_quantity ORDER BY l_quantity;
@ -127,7 +127,7 @@ SELECT l_quantity, jsonb_object_agg(l_orderkey::text || l_linenumber::text,
4.00 | {"50313": 12, "50622": 10, "50891": 7, "51893": 11}
(4 rows)
SELECT l_quantity, jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_orderkey * 2 + 1)
SELECT l_quantity, jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_orderkey * 2 + 1)
FROM lineitem WHERE l_quantity < 5
AND octet_length(l_comment) + octet_length('randomtext'::text) > 40
AND l_orderkey > 5000 AND l_orderkey < 6000 GROUP BY l_quantity ORDER BY l_quantity;
@ -140,7 +140,7 @@ SELECT l_quantity, jsonb_object_agg(l_orderkey::text || l_linenumber::text, l_or
(4 rows)
-- Check that we can execute jsonb_object_agg() with an expression containing NULL values
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text,
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text,
case when l_quantity > 20 then l_quantity else NULL end)
FROM lineitem WHERE l_orderkey < 5;
jsonb_object_agg
@ -148,9 +148,8 @@ SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text,
{"11": null, "12": 36.00, "13": null, "14": 28.00, "15": 24.00, "16": 32.00, "21": 38.00, "31": 45.00, "32": 49.00, "33": 27.00, "34": null, "35": 28.00, "36": 26.00, "41": 30.00}
(1 row)
-- Check that we can execute jsonb_object_agg() with an expression containing different types
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text,
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text,
case when l_quantity > 20 then to_jsonb(l_quantity) else '"f"'::jsonb end)
FROM lineitem WHERE l_orderkey < 5;
jsonb_object_agg
@ -158,7 +157,6 @@ SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text,
{"11": "f", "12": 36.00, "13": "f", "14": 28.00, "15": 24.00, "16": 32.00, "21": 38.00, "31": 45.00, "32": 49.00, "33": 27.00, "34": "f", "35": 28.00, "36": 26.00, "41": 30.00}
(1 row)
-- Check that we can execute jsonb_object_agg() with an expression containing jsonb arrays
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, jsonb_build_array(l_quantity, l_shipdate))
FROM lineitem WHERE l_orderkey < 3;
@ -167,7 +165,6 @@ SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, jsonb_build_arra
{"11": [17.00, "1996-03-13"], "12": [36.00, "1996-04-12"], "13": [8.00, "1996-01-29"], "14": [28.00, "1996-04-21"], "15": [24.00, "1996-03-30"], "16": [32.00, "1996-01-30"], "21": [38.00, "1997-01-28"]}
(1 row)
-- Check that we can execute jsonb_object_agg() with an expression containing arrays
SELECT jsonb_object_agg(l_orderkey::text || l_linenumber::text, ARRAY[l_quantity, l_orderkey])
FROM lineitem WHERE l_orderkey < 3;

View File

@ -15,7 +15,6 @@ SELECT start_metadata_sync_to_node('localhost', :worker_1_port);
-- 1-) Distributing partitioned table
-- create partitioned table
CREATE TABLE partitioning_test(id int, time date) PARTITION BY RANGE (time);
-- create its partitions
CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01');
CREATE TABLE partitioning_test_2010 PARTITION OF partitioning_test FOR VALUES FROM ('2010-01-01') TO ('2011-01-01');
@ -45,11 +44,11 @@ SELECT * FROM partitioning_test ORDER BY 1;
(4 rows)
-- see from MX node, partitioned table and its partitions are distributed
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010')
ORDER BY 1;
logicalrelid
@ -59,9 +58,9 @@ ORDER BY 1;
partitioning_test_2010
(3 rows)
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
WHERE logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010')
GROUP BY
logicalrelid
@ -89,11 +88,11 @@ SET citus.shard_replication_factor TO 1;
CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01');
-- see from MX node, new partition is automatically distributed as well
\c - - - :worker_1_port
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
logicalrelid IN ('partitioning_test', 'partitioning_test_2011')
ORDER BY 1;
logicalrelid
@ -102,9 +101,9 @@ ORDER BY 1;
partitioning_test_2011
(2 rows)
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
WHERE logicalrelid IN ('partitioning_test', 'partitioning_test_2011')
GROUP BY
logicalrelid
@ -137,11 +136,11 @@ ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_2012 FOR VALUES
NOTICE: Copying data from local table...
-- see from MX node, attached partition is distributed as well
\c - - - :worker_1_port
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
logicalrelid IN ('partitioning_test', 'partitioning_test_2012')
ORDER BY 1;
logicalrelid
@ -150,9 +149,9 @@ ORDER BY 1;
partitioning_test_2012
(2 rows)
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
WHERE logicalrelid IN ('partitioning_test', 'partitioning_test_2012')
GROUP BY
logicalrelid

View File

@ -47,7 +47,7 @@ CREATE TABLE repartition_udt_other (
udtcol test_udt,
txtcol text
);
-- Connect directly to a worker, create and drop the type, then
-- Connect directly to a worker, create and drop the type, then
-- proceed with type creation as above; thus the OIDs will be different.
-- so that the OID is off.
\c - - - :worker_1_port
@ -194,6 +194,5 @@ LOG: join order: [ "repartition_udt" ][ dual partition join "repartition_udt_ot
6 | (2,3) | foo | 12 | (2,3) | foo
(5 rows)
\c - - - :worker_1_port
\c - - - :worker_2_port

View File

@ -65,8 +65,8 @@ DEBUG: Plan is router executable
DETAIL: distribution column value: 10
-- single-shard tests
-- many of the tests in this file is intended for testing non-fast-path
-- router planner, so we're explicitly disabling it in this file.
-- We've bunch of other tests that triggers fast-path-router
-- router planner, so we're explicitly disabling it in this file.
-- We've bunch of other tests that triggers fast-path-router
SET citus.enable_fast_path_router_planner TO false;
-- test simple select for a single row
SELECT * FROM articles_hash_mx WHERE author_id = 10 AND id = 50;
@ -195,7 +195,7 @@ DETAIL: distribution column value: 1
-- query is a single shard query but can't do shard pruning,
-- not router-plannable due to <= and IN
SELECT * FROM articles_hash_mx WHERE author_id <= 1;
SELECT * FROM articles_hash_mx WHERE author_id <= 1;
DEBUG: Router planner cannot handle multi-shard select queries
id | author_id | title | word_count
----+-----------+--------------+------------
@ -206,7 +206,7 @@ DEBUG: Router planner cannot handle multi-shard select queries
41 | 1 | aznavour | 11814
(5 rows)
SELECT * FROM articles_hash_mx WHERE author_id IN (1, 3);
SELECT * FROM articles_hash_mx WHERE author_id IN (1, 3);
DEBUG: Creating router plan
DEBUG: Plan is router executable
id | author_id | title | word_count
@ -335,7 +335,7 @@ DETAIL: distribution column value: 3
WITH RECURSIVE hierarchy as (
SELECT *, 1 AS level
FROM company_employees_mx
WHERE company_id = 1 and manager_id = 0
WHERE company_id = 1 and manager_id = 0
UNION
SELECT ce.*, (h.level+1)
FROM hierarchy h JOIN company_employees_mx ce
@ -358,7 +358,7 @@ DETAIL: distribution column value: 1
WITH RECURSIVE hierarchy as (
SELECT *, 1 AS level
FROM company_employees_mx
WHERE company_id = 1 and manager_id = 0
WHERE company_id = 1 and manager_id = 0
UNION
SELECT ce.*, (h.level+1)
FROM hierarchy h JOIN company_employees_mx ce
@ -373,7 +373,7 @@ ERROR: recursive CTEs are not supported in distributed queries
WITH RECURSIVE hierarchy as (
SELECT *, 1 AS level
FROM company_employees_mx
WHERE company_id = 3 and manager_id = 0
WHERE company_id = 3 and manager_id = 0
UNION
SELECT ce.*, (h.level+1)
FROM hierarchy h JOIN company_employees_mx ce
@ -488,7 +488,7 @@ DEBUG: push down of limit count: 5
(5 rows)
SELECT articles_hash_mx.id,test.word_count
FROM articles_hash_mx, (SELECT id, word_count FROM articles_hash_mx) AS test
FROM articles_hash_mx, (SELECT id, word_count FROM articles_hash_mx) AS test
WHERE test.id = articles_hash_mx.id and articles_hash_mx.author_id = 1
ORDER BY articles_hash_mx.id;
DEBUG: Router planner cannot handle multi-shard select queries
@ -591,7 +591,7 @@ DETAIL: distribution column value: 10
10 | 6363
(3 rows)
-- following join is router plannable since the same worker
-- following join is router plannable since the same worker
-- has both shards
SELECT a.author_id as first_author, b.word_count as second_word_count
FROM articles_hash_mx a, articles_single_shard_hash_mx b
@ -607,7 +607,6 @@ DETAIL: distribution column value: 10
10 | 19519
(3 rows)
-- following join is not router plannable since there are no
-- workers containing both shards, but will work through recursive
-- planning
@ -675,7 +674,6 @@ DETAIL: distribution column value: 1
21 | 1 | arcading | 5890
(2 rows)
-- single shard select with group by on non-partition column is router plannable
SELECT id
FROM articles_hash_mx
@ -749,7 +747,6 @@ DETAIL: distribution column value: 1
11814
(1 row)
-- router plannable union queries are supported
SELECT * FROM (
SELECT * FROM articles_hash_mx WHERE author_id = 1
@ -913,7 +910,6 @@ DEBUG: Router planner cannot handle multi-shard select queries
41 | 1 | aznavour | 11814
(5 rows)
-- router plannable
SELECT *
FROM articles_hash_mx
@ -966,7 +962,6 @@ DEBUG: Router planner cannot handle multi-shard select queries
41 | 1 | aznavour | 11814
(5 rows)
-- router plannable due to abs(-1) getting converted to 1 by postgresql
SELECT *
FROM articles_hash_mx
@ -1123,7 +1118,7 @@ DETAIL: distribution column value: 1
(3 rows)
-- window functions are supported if query is router plannable
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
FROM articles_hash_mx
WHERE author_id = 5;
DEBUG: Creating router plan
@ -1138,7 +1133,7 @@ DETAIL: distribution column value: 5
aminate | aruru | 11389
(5 rows)
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
FROM articles_hash_mx
WHERE author_id = 5
ORDER BY word_count DESC;
@ -1184,8 +1179,8 @@ DETAIL: distribution column value: 1
41 | 11814 | 7178.8000000000000000
(5 rows)
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash_mx
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash_mx
WHERE author_id = 1;
DEBUG: Creating router plan
DEBUG: Plan is router executable
@ -1206,16 +1201,16 @@ SELECT id, MIN(id) over (order by word_count)
DEBUG: Router planner cannot handle multi-shard select queries
ERROR: could not run distributed query because the window function that is used cannot be pushed down
HINT: Window functions are supported in two ways. Either add an equality filter on the distributed tables' partition column or use the window functions with a PARTITION BY clause containing the distribution column
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
FROM articles_hash_mx
WHERE author_id = 5 or author_id = 2;
DEBUG: Router planner cannot handle multi-shard select queries
ERROR: could not run distributed query because the window function that is used cannot be pushed down
HINT: Window functions are supported in two ways. Either add an equality filter on the distributed tables' partition column or use the window functions with a PARTITION BY clause containing the distribution column
-- complex query hitting a single shard
-- complex query hitting a single shard
SELECT
count(DISTINCT CASE
WHEN
WHEN
word_count > 100
THEN
id
@ -1237,7 +1232,7 @@ DETAIL: distribution column value: 5
-- same query is not router plannable if hits multiple shards
SELECT
count(DISTINCT CASE
WHEN
WHEN
word_count > 100
THEN
id
@ -1285,7 +1280,7 @@ DETAIL: distribution column value: 1
END;
-- cursor queries are router plannable
BEGIN;
DECLARE test_cursor CURSOR FOR
DECLARE test_cursor CURSOR FOR
SELECT *
FROM articles_hash_mx
WHERE author_id = 1
@ -1326,7 +1321,6 @@ DETAIL: distribution column value: 1
21 1 arcading 5890
31 1 athwartships 7271
41 1 aznavour 11814
-- table creation queries inside can be router plannable
CREATE TEMP TABLE temp_articles_hash_mx as
SELECT *
@ -1474,7 +1468,6 @@ SET client_min_messages to 'DEBUG2';
CREATE MATERIALIZED VIEW mv_articles_hash_mx_error AS
SELECT * FROM articles_hash_mx WHERE author_id in (1,2);
DEBUG: Router planner cannot handle multi-shard select queries
-- router planner/executor is disabled for task-tracker executor
-- following query is router plannable, but router planner is disabled
-- TODO: Uncomment once we fix task-tracker issue

View File

@ -145,7 +145,6 @@ WHERE colocationid IN
10004 | 1 | -1 | 0
(1 row)
\c - - - :worker_1_port
SELECT COUNT(*) FROM pg_dist_node WHERE nodeport = :worker_2_port;
count
@ -164,7 +163,6 @@ WHERE
1380000 | 1 | 0 | localhost | 57638
(1 row)
\c - - - :master_port
SELECT master_remove_node('localhost', :worker_2_port);
master_remove_node
@ -217,7 +215,6 @@ WHERE
---------+------------+-------------+----------+----------
(0 rows)
\c - - - :master_port
-- remove same node twice
SELECT master_remove_node('localhost', :worker_2_port);
@ -281,7 +278,6 @@ WHERE colocationid IN
10004 | 1 | -1 | 0
(1 row)
\c - - - :worker_1_port
SELECT COUNT(*) FROM pg_dist_node WHERE nodeport = :worker_2_port;
count
@ -300,7 +296,6 @@ WHERE
1380000 | 1 | 0 | localhost | 57638
(1 row)
\c - - - :master_port
BEGIN;
SELECT master_remove_node('localhost', :worker_2_port);
@ -357,7 +352,6 @@ WHERE
1380000 | 1 | 0 | localhost | 57638
(1 row)
\c - - - :master_port
-- remove node in a transaction and COMMIT
-- status before master_remove_node
@ -389,7 +383,6 @@ WHERE colocationid IN
10004 | 1 | -1 | 0
(1 row)
\c - - - :worker_1_port
SELECT COUNT(*) FROM pg_dist_node WHERE nodeport = :worker_2_port;
count
@ -408,7 +401,6 @@ WHERE
1380000 | 1 | 0 | localhost | 57638
(1 row)
\c - - - :master_port
BEGIN;
SELECT master_remove_node('localhost', :worker_2_port);
@ -446,7 +438,6 @@ WHERE colocationid IN
10004 | 1 | -1 | 0
(1 row)
\c - - - :worker_1_port
SELECT COUNT(*) FROM pg_dist_node WHERE nodeport = :worker_2_port;
count
@ -464,7 +455,6 @@ WHERE
---------+------------+-------------+----------+----------
(0 rows)
\c - - - :master_port
-- re-add the node for next tests
SELECT 1 FROM master_add_node('localhost', :worker_2_port);
@ -522,9 +512,7 @@ WHERE
1380000 | 1 | 0 | localhost | 57638
(1 row)
\c - - - :master_port
\c - - - :master_port
BEGIN;
INSERT INTO remove_node_reference_table VALUES(1);
SELECT master_remove_node('localhost', :worker_2_port);
@ -586,14 +574,12 @@ WHERE
---------+------------+-------------+----------+----------
(0 rows)
SELECT * FROM remove_node_reference_table;
column1
---------
1
(1 row)
\c - - - :master_port
-- re-add the node for next tests
SELECT 1 FROM master_add_node('localhost', :worker_2_port);
@ -651,7 +637,6 @@ WHERE
1380000 | 1 | 0 | localhost | 57638
(1 row)
\c - - - :master_port
BEGIN;
ALTER TABLE remove_node_reference_table ADD column2 int;
@ -690,7 +675,6 @@ WHERE colocationid IN
10004 | 1 | -1 | 0
(1 row)
\c - - - :worker_1_port
SELECT COUNT(*) FROM pg_dist_node WHERE nodeport = :worker_2_port;
count
@ -708,7 +692,6 @@ WHERE
---------+------------+-------------+----------+----------
(0 rows)
\c - - - :master_port
SET citus.next_shard_id TO 1380001;
-- verify table structure is changed
@ -844,7 +827,6 @@ WHERE colocationid IN
10004 | 1 | -1 | 0
(1 row)
\c - - - :worker_1_port
SELECT COUNT(*) FROM pg_dist_node WHERE nodeport = :worker_2_port;
count
@ -918,9 +900,7 @@ WHERE
---------+------------+-------------+----------+----------
(0 rows)
\c - - - :master_port
\c - - - :master_port
-- re-add the node for next tests
SELECT 1 FROM master_add_node('localhost', :worker_2_port);
NOTICE: Replicating reference table "remove_node_reference_table" to the node localhost:57638
@ -983,9 +963,7 @@ ORDER BY shardid ASC;
1380002 | 1 | 0 | localhost | 57638
(2 rows)
\c - - - :master_port
\c - - - :master_port
SELECT master_disable_node('localhost', :worker_2_port);
master_disable_node
---------------------
@ -1037,7 +1015,6 @@ WHERE
---------+------------+-------------+----------+----------
(0 rows)
\c - - - :master_port
-- re-add the node for next tests
SELECT 1 FROM master_activate_node('localhost', :worker_2_port);

View File

@ -255,7 +255,7 @@ DETAIL: distribution column value: 1
-- query is a single shard query but can't do shard pruning,
-- not router-plannable due to <= and IN
SELECT * FROM articles_hash WHERE author_id <= 1;
SELECT * FROM articles_hash WHERE author_id <= 1;
DEBUG: Router planner cannot handle multi-shard select queries
id | author_id | title | word_count
----+-----------+--------------+------------
@ -266,7 +266,7 @@ DEBUG: Router planner cannot handle multi-shard select queries
41 | 1 | aznavour | 11814
(5 rows)
SELECT * FROM articles_hash WHERE author_id IN (1, 3);
SELECT * FROM articles_hash WHERE author_id IN (1, 3);
DEBUG: Creating router plan
DEBUG: Plan is router executable
id | author_id | title | word_count
@ -359,7 +359,7 @@ DEBUG: Plan is router executable
(0 rows)
-- recursive CTEs are supported when filtered on partition column
CREATE TABLE company_employees (company_id int, employee_id int, manager_id int);
CREATE TABLE company_employees (company_id int, employee_id int, manager_id int);
SELECT master_create_distributed_table('company_employees', 'company_id', 'hash');
master_create_distributed_table
---------------------------------
@ -408,7 +408,7 @@ DETAIL: distribution column value: 3
WITH RECURSIVE hierarchy as (
SELECT *, 1 AS level
FROM company_employees
WHERE company_id = 1 and manager_id = 0
WHERE company_id = 1 and manager_id = 0
UNION
SELECT ce.*, (h.level+1)
FROM hierarchy h JOIN company_employees ce
@ -431,7 +431,7 @@ DETAIL: distribution column value: 1
WITH RECURSIVE hierarchy as (
SELECT *, 1 AS level
FROM company_employees
WHERE company_id = 1 and manager_id = 0
WHERE company_id = 1 and manager_id = 0
UNION
SELECT ce.*, (h.level+1)
FROM hierarchy h JOIN company_employees ce
@ -445,7 +445,7 @@ ERROR: recursive CTEs are not supported in distributed queries
WITH RECURSIVE hierarchy as (
SELECT *, 1 AS level
FROM company_employees
WHERE company_id = 3 and manager_id = 0
WHERE company_id = 3 and manager_id = 0
UNION
SELECT ce.*, (h.level+1)
FROM hierarchy h JOIN company_employees ce
@ -647,7 +647,7 @@ DEBUG: push down of limit count: 5
(5 rows)
SELECT articles_hash.id,test.word_count
FROM articles_hash, (SELECT id, word_count FROM articles_hash) AS test
FROM articles_hash, (SELECT id, word_count FROM articles_hash) AS test
WHERE test.id = articles_hash.id and articles_hash.author_id = 1
ORDER BY articles_hash.id;
DEBUG: Router planner cannot handle multi-shard select queries
@ -751,7 +751,7 @@ DETAIL: distribution column value: 10
10 | 6363
(3 rows)
-- following join is router plannable since the same worker
-- following join is router plannable since the same worker
-- has both shards
SELECT a.author_id as first_author, b.word_count as second_word_count
FROM articles_hash a, articles_single_shard_hash b
@ -767,7 +767,6 @@ DETAIL: distribution column value: 10
10 | 19519
(3 rows)
-- following join is not router plannable since there are no
-- workers containing both shards, but will work through recursive
-- planning
@ -835,7 +834,6 @@ DETAIL: distribution column value: 1
21 | 1 | arcading | 5890
(2 rows)
-- single shard select with group by on non-partition column is router plannable
SELECT id
FROM articles_hash
@ -1094,7 +1092,6 @@ DEBUG: Router planner cannot handle multi-shard select queries
41 | 1 | aznavour | 11814
(5 rows)
-- router plannable
SELECT *
FROM articles_hash
@ -1147,7 +1144,6 @@ DEBUG: Router planner cannot handle multi-shard select queries
41 | 1 | aznavour | 11814
(5 rows)
-- router plannable due to abs(-1) getting converted to 1 by postgresql
SELECT *
FROM articles_hash
@ -1304,7 +1300,7 @@ DETAIL: distribution column value: 1
(3 rows)
-- window functions are supported if query is router plannable
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
FROM articles_hash
WHERE author_id = 5;
DEBUG: Creating router plan
@ -1319,7 +1315,7 @@ DETAIL: distribution column value: 5
aminate | aruru | 11389
(5 rows)
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
FROM articles_hash
WHERE author_id = 5
ORDER BY word_count DESC;
@ -1365,8 +1361,8 @@ DETAIL: distribution column value: 1
41 | 11814 | 7178.8000000000000000
(5 rows)
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash
WHERE author_id = 1;
DEBUG: Creating router plan
DEBUG: Plan is router executable
@ -1387,14 +1383,14 @@ SELECT id, MIN(id) over (order by word_count)
DEBUG: Router planner cannot handle multi-shard select queries
ERROR: could not run distributed query because the window function that is used cannot be pushed down
HINT: Window functions are supported in two ways. Either add an equality filter on the distributed tables' partition column or use the window functions with a PARTITION BY clause containing the distribution column
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
FROM articles_hash
WHERE author_id = 5 or author_id = 2;
DEBUG: Router planner cannot handle multi-shard select queries
ERROR: could not run distributed query because the window function that is used cannot be pushed down
HINT: Window functions are supported in two ways. Either add an equality filter on the distributed tables' partition column or use the window functions with a PARTITION BY clause containing the distribution column
-- where false queries are router plannable
SELECT *
SELECT *
FROM articles_hash
WHERE false;
DEBUG: Creating router plan
@ -1403,7 +1399,7 @@ DEBUG: Plan is router executable
----+-----------+-------+------------
(0 rows)
SELECT *
SELECT *
FROM articles_hash
WHERE author_id = 1 and false;
DEBUG: Creating router plan
@ -1412,7 +1408,7 @@ DEBUG: Plan is router executable
----+-----------+-------+------------
(0 rows)
SELECT *
SELECT *
FROM articles_hash
WHERE author_id = 1 and 1=0;
DEBUG: Creating router plan
@ -1430,7 +1426,7 @@ DEBUG: Plan is router executable
--------------+-------------------
(0 rows)
SELECT *
SELECT *
FROM articles_hash
WHERE null;
DEBUG: Creating router plan
@ -1440,7 +1436,7 @@ DEBUG: Plan is router executable
(0 rows)
-- where false with immutable function returning false
SELECT *
SELECT *
FROM articles_hash a
WHERE a.author_id = 10 and int4eq(1, 2);
DEBUG: Creating router plan
@ -1449,7 +1445,7 @@ DEBUG: Plan is router executable
----+-----------+-------+------------
(0 rows)
SELECT *
SELECT *
FROM articles_hash a
WHERE int4eq(1, 2);
DEBUG: Creating router plan
@ -1484,7 +1480,7 @@ DEBUG: Plan is router executable
-- partition_column is null clause does not prune out any shards,
-- all shards remain after shard pruning, not router plannable
SELECT *
SELECT *
FROM articles_hash a
WHERE a.author_id is null;
DEBUG: Router planner cannot handle multi-shard select queries
@ -1494,7 +1490,7 @@ DEBUG: Router planner cannot handle multi-shard select queries
-- partition_column equals to null clause prunes out all shards
-- no shards after shard pruning, router plannable
SELECT *
SELECT *
FROM articles_hash a
WHERE a.author_id = null;
DEBUG: Creating router plan
@ -1504,7 +1500,7 @@ DEBUG: Plan is router executable
(0 rows)
-- stable function returning bool
SELECT *
SELECT *
FROM articles_hash a
WHERE date_ne_timestamp('1954-04-11', '1954-04-11'::timestamp);
DEBUG: Creating router plan
@ -1597,7 +1593,7 @@ DEBUG: Plan is router executable
WITH RECURSIVE hierarchy as (
SELECT *, 1 AS level
FROM company_employees
WHERE company_id = 1 and manager_id = 0
WHERE company_id = 1 and manager_id = 0
UNION
SELECT ce.*, (h.level+1)
FROM hierarchy h JOIN company_employees ce
@ -1615,7 +1611,7 @@ DETAIL: distribution column value: 1
WITH RECURSIVE hierarchy as (
SELECT *, 1 AS level
FROM company_employees
WHERE company_id = 1 and manager_id = 0
WHERE company_id = 1 and manager_id = 0
UNION
SELECT ce.*, (h.level+1)
FROM hierarchy h JOIN company_employees ce
@ -1650,8 +1646,8 @@ DETAIL: distribution column value: 1
(0 rows)
-- window functions with where false
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash
WHERE author_id = 1 and 1=0;
DEBUG: Creating router plan
DEBUG: Plan is router executable
@ -1661,7 +1657,7 @@ DEBUG: Plan is router executable
-- function calls in WHERE clause with non-relational arguments
SELECT author_id FROM articles_hash
WHERE
WHERE
substring('hello world', 1, 5) = 'hello'
ORDER BY
author_id
@ -1675,7 +1671,7 @@ DEBUG: push down of limit count: 1
-- when expression evaluates to false
SELECT author_id FROM articles_hash
WHERE
WHERE
substring('hello world', 1, 4) = 'hello'
ORDER BY
author_id
@ -1686,9 +1682,8 @@ DEBUG: Plan is router executable
-----------
(0 rows)
-- verify range partitioned tables can be used in router plannable queries
-- just 4 shards to be created for each table to make sure
-- just 4 shards to be created for each table to make sure
-- they are 'co-located' pairwise
SET citus.shard_replication_factor TO 1;
SELECT master_create_distributed_table('authors_range', 'id', 'range');
@ -1743,7 +1738,7 @@ DEBUG: Plan is router executable
(0 rows)
-- single shard joins on range partitioned table are router plannable
SELECT * FROM articles_range ar join authors_range au on (ar.author_id = au.id)
SELECT * FROM articles_range ar join authors_range au on (ar.author_id = au.id)
WHERE ar.author_id = 1;
DEBUG: Creating router plan
DEBUG: Plan is router executable
@ -1801,7 +1796,7 @@ DETAIL: Creating dependency on merge taskId 20
-- This query was intended to test "this is a bug, it is a single shard join
-- query but not router plannable". To run it using repartition join logic we
-- change the join columns.
SELECT * FROM articles_range ar join authors_range au on (ar.title = au.name)
SELECT * FROM articles_range ar join authors_range au on (ar.title = au.name)
WHERE ar.author_id = 1 or au.id = 5;
DEBUG: Router planner cannot handle multi-shard select queries
DEBUG: join prunable for task partitionId 0 and 1
@ -1838,7 +1833,7 @@ DETAIL: Creating dependency on merge taskId 20
RESET citus.task_executor_type;
-- bogus query, join on non-partition column, but router plannable due to filters
SELECT * FROM articles_range ar join authors_range au on (ar.id = au.id)
SELECT * FROM articles_range ar join authors_range au on (ar.id = au.id)
WHERE ar.author_id = 1 and au.id < 10;
DEBUG: Creating router plan
DEBUG: Plan is router executable
@ -1916,7 +1911,6 @@ DEBUG: Router planner cannot handle multi-shard select queries
----+-----------+-------+------------+------+----
(0 rows)
-- following is a bug, function should have been
-- evaluated at master before going to worker
-- need to use a append distributed table here
@ -1948,7 +1942,7 @@ SET client_min_messages TO ERROR;
\set VERBOSITY terse
SELECT raise_failed_execution_router($$
SELECT author_id FROM articles_append
WHERE
WHERE
substring('articles_append'::regclass::text, 1, 5) = 'hello'
ORDER BY
author_id
@ -1958,7 +1952,7 @@ ERROR: Task failed to execute
-- same query with where false but evaluation left to worker
SELECT raise_failed_execution_router($$
SELECT author_id FROM articles_append
WHERE
WHERE
substring('articles_append'::regclass::text, 1, 4) = 'hello'
ORDER BY
author_id
@ -1968,7 +1962,7 @@ ERROR: Task failed to execute
-- same query on router planner with where false but evaluation left to worker
SELECT raise_failed_execution_router($$
SELECT author_id FROM articles_single_shard_hash
WHERE
WHERE
substring('articles_single_shard_hash'::regclass::text, 1, 4) = 'hello'
ORDER BY
author_id
@ -1977,7 +1971,7 @@ $$);
ERROR: Task failed to execute
SELECT raise_failed_execution_router($$
SELECT author_id FROM articles_hash
WHERE
WHERE
author_id = 1
AND substring('articles_hash'::regclass::text, 1, 5) = 'hello'
ORDER BY
@ -1993,7 +1987,7 @@ BEGIN
RETURN md5($1::text);
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
-- not router plannable, returns all rows
-- not router plannable, returns all rows
SELECT * FROM articles_hash
WHERE
someDummyFunction('articles_hash') = md5('articles_hash')
@ -2024,10 +2018,10 @@ ERROR: Task failed to execute
SET client_min_messages TO 'NOTICE';
DROP FUNCTION someDummyFunction(regclass);
SET client_min_messages TO 'DEBUG2';
-- complex query hitting a single shard
-- complex query hitting a single shard
SELECT
count(DISTINCT CASE
WHEN
WHEN
word_count > 100
THEN
id
@ -2049,7 +2043,7 @@ DETAIL: distribution column value: 5
-- same query is not router plannable if hits multiple shards
SELECT
count(DISTINCT CASE
WHEN
WHEN
word_count > 100
THEN
id
@ -2117,7 +2111,7 @@ DETAIL: distribution column value: 1
END;
-- cursor queries are router plannable
BEGIN;
DECLARE test_cursor CURSOR FOR
DECLARE test_cursor CURSOR FOR
SELECT *
FROM articles_hash
WHERE author_id = 1
@ -2166,7 +2160,6 @@ DETAIL: distribution column value: 1
21 1 arcading 5890
31 1 athwartships 7271
41 1 aznavour 11814
-- table creation queries inside can be router plannable
CREATE TEMP TABLE temp_articles_hash as
SELECT *

View File

@ -2,12 +2,12 @@ CREATE SCHEMA fast_path_router_select;
SET search_path TO fast_path_router_select;
SET citus.next_shard_id TO 1840000;
-- all the tests in this file is intended for testing fast-path
-- router planner, so we're explicitly enabling itin this file.
-- We've bunch of other tests that triggers non-fast-path-router
-- router planner, so we're explicitly enabling itin this file.
-- We've bunch of other tests that triggers non-fast-path-router
-- planner (note this is already true by default)
SET citus.enable_fast_path_router_planner TO true;
-- ===================================================================
-- test router planner functionality for via fast path on
-- test router planner functionality for via fast path on
-- single shard select queries
-- ===================================================================
CREATE TABLE articles_hash (
@ -161,7 +161,7 @@ DETAIL: distribution column value: 1
(1 row)
-- fast path planner only support = operator
SELECT * FROM articles_hash WHERE author_id <= 1;
SELECT * FROM articles_hash WHERE author_id <= 1;
DEBUG: Router planner cannot handle multi-shard select queries
id | author_id | title | word_count
----+-----------+--------------+------------
@ -172,7 +172,7 @@ DEBUG: Router planner cannot handle multi-shard select queries
41 | 1 | aznavour | 11814
(5 rows)
SELECT * FROM articles_hash WHERE author_id IN (1, 3);
SELECT * FROM articles_hash WHERE author_id IN (1, 3);
DEBUG: Creating router plan
DEBUG: Plan is router executable
id | author_id | title | word_count
@ -221,7 +221,7 @@ DETAIL: distribution column value: 1
(5 rows)
-- this is a different case where each CTE is recursively planned and those goes
-- through the fast-path router planner, but the top level join is not
-- through the fast-path router planner, but the top level join is not
WITH id_author AS ( SELECT id, author_id FROM articles_hash WHERE author_id = 1),
id_title AS (SELECT id, title from articles_hash WHERE author_id = 2)
SELECT * FROM id_author, id_title WHERE id_author.id = id_title.id;
@ -243,7 +243,7 @@ DEBUG: Plan is router executable
----+-----------+----+-------
(0 rows)
CREATE TABLE company_employees (company_id int, employee_id int, manager_id int);
CREATE TABLE company_employees (company_id int, employee_id int, manager_id int);
SELECT master_create_distributed_table('company_employees', 'company_id', 'hash');
master_create_distributed_table
---------------------------------
@ -296,7 +296,7 @@ DETAIL: distribution column value: 3
WITH RECURSIVE hierarchy as (
SELECT *, 1 AS level
FROM company_employees
WHERE company_id = 1 and manager_id = 0
WHERE company_id = 1 and manager_id = 0
UNION
SELECT ce.*, (h.level+1)
FROM hierarchy h JOIN company_employees ce
@ -428,7 +428,7 @@ DEBUG: push down of limit count: 5
(5 rows)
SELECT articles_hash.id,test.word_count
FROM articles_hash, (SELECT id, word_count FROM articles_hash) AS test
FROM articles_hash, (SELECT id, word_count FROM articles_hash) AS test
WHERE test.id = articles_hash.id and articles_hash.author_id = 1
ORDER BY articles_hash.id;
DEBUG: Router planner cannot handle multi-shard select queries
@ -568,7 +568,6 @@ DETAIL: distribution column value: 1
21 | 1 | arcading | 5890
(2 rows)
-- single shard select with group by on non-partition column goes through fast-path planning
SELECT id
FROM articles_hash
@ -698,7 +697,7 @@ DETAIL: distribution column value: 1
-- Test various filtering options for router plannable check
SET client_min_messages to 'DEBUG2';
-- cannot go through fast-path if there is
-- cannot go through fast-path if there is
-- explicit coercion
SELECT *
FROM articles_hash
@ -715,7 +714,7 @@ DETAIL: distribution column value: 1
41 | 1 | aznavour | 11814
(5 rows)
-- can go through fast-path if there is
-- can go through fast-path if there is
-- implicit coercion
-- This doesn't work see the related issue
-- reported https://github.com/citusdata/citus/issues/2605
@ -765,7 +764,6 @@ DEBUG: Router planner cannot handle multi-shard select queries
41 | 1 | aznavour | 11814
(5 rows)
-- goes through fast-path planning because
-- the dist. key is ANDed with the rest of the
-- filters
@ -822,9 +820,8 @@ DEBUG: Router planner cannot handle multi-shard select queries
41 | 1 | aznavour | 11814
(5 rows)
-- Citus does not qualify this as a fast-path because
-- dist_key = func()
-- dist_key = func()
SELECT *
FROM articles_hash
WHERE author_id = abs(-1);
@ -841,7 +838,7 @@ DETAIL: distribution column value: 1
(5 rows)
-- Citus does not qualify this as a fast-path because
-- dist_key = func()
-- dist_key = func()
SELECT *
FROM articles_hash
WHERE 1 = abs(author_id);
@ -856,7 +853,7 @@ DEBUG: Router planner cannot handle multi-shard select queries
(5 rows)
-- Citus does not qualify this as a fast-path because
-- dist_key = func()
-- dist_key = func()
SELECT *
FROM articles_hash
WHERE author_id = abs(author_id - 2);
@ -1058,7 +1055,7 @@ DETAIL: distribution column value: 1
(3 rows)
-- window functions are supported with fast-path router plannable
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
FROM articles_hash
WHERE author_id = 5;
DEBUG: Distributed planning for a fast-path router query
@ -1074,7 +1071,7 @@ DETAIL: distribution column value: 5
aminate | aruru | 11389
(5 rows)
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
SELECT LAG(title, 1) over (ORDER BY word_count) prev, title, word_count
FROM articles_hash
WHERE author_id = 5
ORDER BY word_count DESC;
@ -1123,8 +1120,8 @@ DETAIL: distribution column value: 1
41 | 11814 | 7178.8000000000000000
(5 rows)
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash
WHERE author_id = 1;
DEBUG: Distributed planning for a fast-path router query
DEBUG: Creating router plan
@ -1142,7 +1139,7 @@ DETAIL: distribution column value: 1
-- some more tests on complex target lists
SELECT DISTINCT ON (author_id, id) author_id, id,
MIN(id) over (order by avg(word_count)) * AVG(id * 5.2 + (1.0/max(word_count))) over (order by max(word_count)) as t1,
count(*) FILTER (WHERE title LIKE 'al%') as cnt_with_filter,
count(*) FILTER (WHERE title LIKE 'al%') as cnt_with_filter,
count(*) FILTER (WHERE '0300030' LIKE '%3%') as cnt_with_filter_2,
avg(case when id > 2 then char_length(word_count::text) * (id * strpos(word_count::text, '1')) end) as case_cnt,
COALESCE(strpos(avg(word_count)::text, '1'), 20)
@ -1165,7 +1162,7 @@ DETAIL: distribution column value: 1
(5 rows)
-- where false queries are router plannable but not fast-path
SELECT *
SELECT *
FROM articles_hash
WHERE false;
DEBUG: Creating router plan
@ -1175,7 +1172,7 @@ DEBUG: Plan is router executable
(0 rows)
-- fast-path with false
SELECT *
SELECT *
FROM articles_hash
WHERE author_id = 1 and false;
DEBUG: Distributed planning for a fast-path router query
@ -1186,7 +1183,7 @@ DEBUG: Plan is router executable
(0 rows)
-- fast-path with false
SELECT *
SELECT *
FROM articles_hash
WHERE author_id = 1 and 1=0;
DEBUG: Distributed planning for a fast-path router query
@ -1197,7 +1194,7 @@ DETAIL: distribution column value: 1
----+-----------+-------+------------
(0 rows)
SELECT *
SELECT *
FROM articles_hash
WHERE null and author_id = 1;
DEBUG: Distributed planning for a fast-path router query
@ -1209,7 +1206,7 @@ DEBUG: Plan is router executable
-- we cannot qualify dist_key = X operator Y via
-- fast-path planning
SELECT *
SELECT *
FROM articles_hash
WHERE author_id = 1 + 1;
DEBUG: Creating router plan
@ -1226,7 +1223,7 @@ DETAIL: distribution column value: 2
-- where false with immutable function returning false
-- goes through fast-path
SELECT *
SELECT *
FROM articles_hash a
WHERE a.author_id = 10 and int4eq(1, 2);
DEBUG: Distributed planning for a fast-path router query
@ -1240,7 +1237,7 @@ DETAIL: distribution column value: 10
-- partition_column is null clause does not prune out any shards,
-- all shards remain after shard pruning, not router plannable
-- not fast-path router either
SELECT *
SELECT *
FROM articles_hash a
WHERE a.author_id is null;
DEBUG: Router planner cannot handle multi-shard select queries
@ -1251,7 +1248,7 @@ DEBUG: Router planner cannot handle multi-shard select queries
-- partition_column equals to null clause prunes out all shards
-- no shards after shard pruning, router plannable
-- not fast-path router either
SELECT *
SELECT *
FROM articles_hash a
WHERE a.author_id = null;
DEBUG: Creating router plan
@ -1295,8 +1292,8 @@ DEBUG: Plan is router executable
(0 rows)
-- window functions with where false
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash
SELECT word_count, rank() OVER (PARTITION BY author_id ORDER BY word_count)
FROM articles_hash
WHERE author_id = 1 and 1=0;
DEBUG: Distributed planning for a fast-path router query
DEBUG: Creating router plan
@ -1331,7 +1328,7 @@ END;
$$LANGUAGE plpgsql;
SET client_min_messages TO ERROR;
\set VERBOSITY terse
-- fast path router plannable, but errors
-- fast path router plannable, but errors
SELECT raise_failed_execution_f_router($$
SELECT * FROM articles_hash
WHERE
@ -1350,7 +1347,7 @@ SET client_min_messages TO 'DEBUG2';
-- complex query hitting a single shard and a fast-path
SELECT
count(DISTINCT CASE
WHEN
WHEN
word_count > 100
THEN
id
@ -1414,7 +1411,7 @@ END;
WARNING: there is no transaction in progress
-- cursor queries are fast-path router plannable
BEGIN;
DECLARE test_cursor CURSOR FOR
DECLARE test_cursor CURSOR FOR
SELECT *
FROM articles_hash
WHERE author_id = 1
@ -1465,7 +1462,6 @@ DETAIL: distribution column value: 1
21 1 arcading 5890
31 1 athwartships 7271
41 1 aznavour 11814
-- table creation queries inside can be fast-path router plannable
CREATE TEMP TABLE temp_articles_hash as
SELECT *
@ -1659,8 +1655,8 @@ BEGIN
return max_id;
END;
$$ LANGUAGE plpgsql;
-- we don't want too many details. though we're omitting
-- "DETAIL: distribution column value:", we see it acceptable
-- we don't want too many details. though we're omitting
-- "DETAIL: distribution column value:", we see it acceptable
-- since the query results verifies the correctness
\set VERBOSITY terse
SELECT author_articles_max_id();
@ -1936,7 +1932,7 @@ DEBUG: Plan is router executable
-- insert .. select via coordinator could also
-- use fast-path queries
PREPARE insert_sel(int, int) AS
INSERT INTO articles_hash
INSERT INTO articles_hash
SELECT * FROM articles_hash WHERE author_id = $2 AND word_count = $1 OFFSET 0;
EXECUTE insert_sel(1,1);
DEBUG: OFFSET clauses are not allowed in distributed INSERT ... SELECT queries
@ -1983,10 +1979,10 @@ DETAIL: distribution column value: 1
-- one final interesting preperad statement
-- where one of the filters is on the target list
PREPARE fast_path_agg_filter(int, int) AS
SELECT
count(*) FILTER (WHERE word_count=$1)
FROM
articles_hash
SELECT
count(*) FILTER (WHERE word_count=$1)
FROM
articles_hash
WHERE author_id = $2;
EXECUTE fast_path_agg_filter(1,1);
DEBUG: Distributed planning for a fast-path router query
@ -2050,7 +2046,7 @@ DETAIL: distribution column value: 6
(1 row)
-- views internally become subqueries, so not fast-path router query
CREATE VIEW test_view AS
CREATE VIEW test_view AS
SELECT * FROM articles_hash WHERE author_id = 1;
SELECT * FROM test_view;
DEBUG: Creating router plan
@ -2131,7 +2127,7 @@ CREATE TABLE collections_list (
collection_id integer,
value numeric
) PARTITION BY LIST (collection_id );
CREATE TABLE collections_list_1
CREATE TABLE collections_list_1
PARTITION OF collections_list (key, ts, collection_id, value)
FOR VALUES IN ( 1 );
CREATE TABLE collections_list_2

View File

@ -10,7 +10,7 @@ SELECT DISTINCT l_orderkey, now() FROM lineitem_hash_part LIMIT 0;
------------+-----
(0 rows)
SELECT DISTINCT l_partkey, 1 + (random() * 0)::int FROM lineitem_hash_part ORDER BY 1 DESC LIMIT 3;
SELECT DISTINCT l_partkey, 1 + (random() * 0)::int FROM lineitem_hash_part ORDER BY 1 DESC LIMIT 3;
l_partkey | ?column?
-----------+----------
199973 | 1
@ -152,9 +152,9 @@ SELECT DISTINCT l_shipmode FROM lineitem_hash_part ORDER BY 1 DESC;
AIR
(7 rows)
-- distinct with multiple columns
-- distinct with multiple columns
SELECT DISTINCT l_orderkey, o_orderdate
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
WHERE l_orderkey < 10
ORDER BY l_orderkey;
l_orderkey | o_orderdate
@ -199,7 +199,6 @@ SELECT DISTINCT l_orderkey, count(*)
197 | 6
(19 rows)
-- explain the query to see actual plan
EXPLAIN (COSTS FALSE)
SELECT DISTINCT l_orderkey, count(*)
@ -272,8 +271,7 @@ SELECT DISTINCT count(*)
4
(4 rows)
-- explain the query to see actual plan. We expect to see Aggregate node having
-- explain the query to see actual plan. We expect to see Aggregate node having
-- group by key on count(*) column, since columns in the Group By doesn't guarantee
-- the uniqueness of the result.
EXPLAIN (COSTS FALSE)
@ -350,7 +348,6 @@ SELECT DISTINCT l_suppkey, count(*)
14 | 1
(10 rows)
-- explain the query to see actual plan. Similar to the explain of the query above.
EXPLAIN (COSTS FALSE)
SELECT DISTINCT l_suppkey, count(*)
@ -377,7 +374,7 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(15 rows)
-- check the plan if the hash aggreate is disabled. Similar to the explain of
-- check the plan if the hash aggreate is disabled. Similar to the explain of
-- the query above.
SET enable_hashagg TO off;
EXPLAIN (COSTS FALSE)
@ -430,7 +427,6 @@ SELECT DISTINCT l_suppkey, avg(l_partkey)
12 | 17510.0000000000000000
(10 rows)
-- explain the query to see actual plan. Similar to the explain of the query above.
-- Only aggregate functions will be changed.
EXPLAIN (COSTS FALSE)
@ -510,7 +506,6 @@ SELECT DISTINCT ON (l_suppkey) avg(l_partkey)
77506.000000000000
(10 rows)
-- explain the query to see actual plan. We expect to see sort+unique to handle
-- distinct on.
EXPLAIN (COSTS FALSE)
@ -537,7 +532,7 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(14 rows)
-- check the plan if the hash aggreate is disabled. We expect to see sort+unique to
-- check the plan if the hash aggreate is disabled. We expect to see sort+unique to
-- handle distinct on.
SET enable_hashagg TO off;
EXPLAIN (COSTS FALSE)
@ -587,7 +582,6 @@ SELECT DISTINCT avg(ceil(l_partkey / 2))
122
(10 rows)
-- explain the query to see actual plan
EXPLAIN (COSTS FALSE)
SELECT DISTINCT avg(ceil(l_partkey / 2))
@ -622,7 +616,7 @@ EXPLAIN (COSTS FALSE)
FROM lineitem_hash_part
GROUP BY l_suppkey, l_linenumber
ORDER BY 1
LIMIT 10;
LIMIT 10;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Limit
@ -645,11 +639,10 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(18 rows)
SET enable_hashagg TO on;
SET enable_hashagg TO on;
-- expression among aggregations.
SELECT DISTINCT sum(l_suppkey) + count(l_partkey) AS dis
FROM lineitem_hash_part
SELECT DISTINCT sum(l_suppkey) + count(l_partkey) AS dis
FROM lineitem_hash_part
GROUP BY l_suppkey, l_linenumber
ORDER BY 1
LIMIT 10;
@ -667,11 +660,10 @@ SELECT DISTINCT sum(l_suppkey) + count(l_partkey) AS dis
15
(10 rows)
-- explain the query to see actual plan
EXPLAIN (COSTS FALSE)
SELECT DISTINCT sum(l_suppkey) + count(l_partkey) AS dis
FROM lineitem_hash_part
SELECT DISTINCT sum(l_suppkey) + count(l_partkey) AS dis
FROM lineitem_hash_part
GROUP BY l_suppkey, l_linenumber
ORDER BY 1
LIMIT 10;
@ -698,11 +690,11 @@ EXPLAIN (COSTS FALSE)
-- to a bug right now, expectation must be corrected after fixing it.
SET enable_hashagg TO off;
EXPLAIN (COSTS FALSE)
SELECT DISTINCT sum(l_suppkey) + count(l_partkey) AS dis
FROM lineitem_hash_part
SELECT DISTINCT sum(l_suppkey) + count(l_partkey) AS dis
FROM lineitem_hash_part
GROUP BY l_suppkey, l_linenumber
ORDER BY 1
LIMIT 10;
LIMIT 10;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------
Limit
@ -725,13 +717,11 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(18 rows)
SET enable_hashagg TO on;
SET enable_hashagg TO on;
-- distinct on all columns, note Group By columns guarantees uniqueness of the
-- result list.
SELECT DISTINCT *
FROM lineitem_hash_part
-- result list.
SELECT DISTINCT *
FROM lineitem_hash_part
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
ORDER BY 1,2
LIMIT 10;
@ -749,12 +739,11 @@ SELECT DISTINCT *
3 | 29380 | 1883 | 4 | 2.00 | 2618.76 | 0.01 | 0.06 | A | F | 12-04-1993 | 01-07-1994 | 01-01-1994 | NONE | TRUCK | y. fluffily pending d
(10 rows)
-- explain the query to see actual plan. We expect to see only one aggregation
-- node since group by columns guarantees the uniqueness.
EXPLAIN (COSTS FALSE)
SELECT DISTINCT *
FROM lineitem_hash_part
SELECT DISTINCT *
FROM lineitem_hash_part
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
ORDER BY 1,2
LIMIT 10;
@ -779,15 +768,15 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(17 rows)
-- check the plan if the hash aggreate is disabled. We expect to see only one
-- check the plan if the hash aggreate is disabled. We expect to see only one
-- aggregation node since group by columns guarantees the uniqueness.
SET enable_hashagg TO off;
EXPLAIN (COSTS FALSE)
SELECT DISTINCT *
FROM lineitem_hash_part
SELECT DISTINCT *
FROM lineitem_hash_part
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
ORDER BY 1,2
LIMIT 10;
LIMIT 10;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit
@ -811,7 +800,6 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(19 rows)
SET enable_hashagg TO on;
-- distinct on count distinct
SELECT DISTINCT count(DISTINCT l_partkey), count(DISTINCT l_shipmode)
@ -847,7 +835,6 @@ SELECT DISTINCT count(DISTINCT l_partkey), count(DISTINCT l_shipmode)
7 | 7
(25 rows)
-- explain the query to see actual plan. We expect to see aggregation plan for
-- the outer distinct.
EXPLAIN (COSTS FALSE)
@ -875,7 +862,7 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(16 rows)
-- check the plan if the hash aggreate is disabled. We expect to see sort + unique
-- check the plan if the hash aggreate is disabled. We expect to see sort + unique
-- plans for the outer distinct.
SET enable_hashagg TO off;
EXPLAIN (COSTS FALSE)
@ -906,11 +893,10 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(19 rows)
SET enable_hashagg TO on;
-- distinct on aggregation with filter and expression
SELECT DISTINCT ceil(count(case when l_partkey > 100000 THEN 1 ELSE 0 END) / 2) AS count
FROM lineitem_hash_part
SELECT DISTINCT ceil(count(case when l_partkey > 100000 THEN 1 ELSE 0 END) / 2) AS count
FROM lineitem_hash_part
GROUP BY l_suppkey
ORDER BY 1;
count
@ -922,11 +908,10 @@ SELECT DISTINCT ceil(count(case when l_partkey > 100000 THEN 1 ELSE 0 END) / 2)
4
(5 rows)
-- explain the query to see actual plan
EXPLAIN (COSTS FALSE)
SELECT DISTINCT ceil(count(case when l_partkey > 100000 THEN 1 ELSE 0 END) / 2) AS count
FROM lineitem_hash_part
SELECT DISTINCT ceil(count(case when l_partkey > 100000 THEN 1 ELSE 0 END) / 2) AS count
FROM lineitem_hash_part
GROUP BY l_suppkey
ORDER BY 1;
QUERY PLAN
@ -950,8 +935,8 @@ EXPLAIN (COSTS FALSE)
-- check the plan if the hash aggreate is disabled
SET enable_hashagg TO off;
EXPLAIN (COSTS FALSE)
SELECT DISTINCT ceil(count(case when l_partkey > 100000 THEN 1 ELSE 0 END) / 2) AS count
FROM lineitem_hash_part
SELECT DISTINCT ceil(count(case when l_partkey > 100000 THEN 1 ELSE 0 END) / 2) AS count
FROM lineitem_hash_part
GROUP BY l_suppkey
ORDER BY 1;
QUERY PLAN
@ -975,13 +960,11 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(17 rows)
SET enable_hashagg TO on;
-- explain the query to see actual plan with array_agg aggregation.
-- explain the query to see actual plan with array_agg aggregation.
EXPLAIN (COSTS FALSE)
SELECT DISTINCT array_agg(l_linenumber), array_length(array_agg(l_linenumber), 1)
FROM lineitem_hash_part
FROM lineitem_hash_part
GROUP BY l_orderkey
ORDER BY 2
LIMIT 15;
@ -1006,11 +989,11 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(17 rows)
-- check the plan if the hash aggreate is disabled.
-- check the plan if the hash aggreate is disabled.
SET enable_hashagg TO off;
EXPLAIN (COSTS FALSE)
SELECT DISTINCT array_agg(l_linenumber), array_length(array_agg(l_linenumber), 1)
FROM lineitem_hash_part
FROM lineitem_hash_part
GROUP BY l_orderkey
ORDER BY 2
LIMIT 15;
@ -1038,13 +1021,12 @@ EXPLAIN (COSTS FALSE)
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
(20 rows)
SET enable_hashagg TO on;
-- distinct on non-partition column with aggregate
-- this is the same as non-distinct version due to group by
SELECT DISTINCT l_partkey, count(*)
FROM lineitem_hash_part
GROUP BY 1
GROUP BY 1
HAVING count(*) > 2
ORDER BY 1;
l_partkey | count
@ -1062,12 +1044,11 @@ SELECT DISTINCT l_partkey, count(*)
199146 | 3
(11 rows)
-- explain the query to see actual plan
EXPLAIN (COSTS FALSE)
SELECT DISTINCT l_partkey, count(*)
FROM lineitem_hash_part
GROUP BY 1
GROUP BY 1
HAVING count(*) > 2
ORDER BY 1;
QUERY PLAN
@ -1091,7 +1072,7 @@ EXPLAIN (COSTS FALSE)
SELECT DISTINCT l_partkey, avg(l_linenumber)
FROM lineitem_hash_part
WHERE l_partkey < 500
GROUP BY 1
GROUP BY 1
HAVING avg(l_linenumber) > 2
ORDER BY 1;
l_partkey | avg
@ -1137,7 +1118,6 @@ SELECT DISTINCT l_partkey, l_suppkey
197921 | 441
(15 rows)
EXPLAIN (COSTS FALSE)
SELECT DISTINCT l_partkey, l_suppkey
FROM lineitem_hash_part
@ -1180,7 +1160,6 @@ SELECT DISTINCT ON (l_orderkey) l_orderkey, l_partkey, l_suppkey
34 | 88362 | 871
(10 rows)
EXPLAIN (COSTS FALSE)
SELECT DISTINCT ON (l_orderkey) l_orderkey, l_partkey, l_suppkey
FROM lineitem_hash_part
@ -1261,7 +1240,7 @@ EXPLAIN (COSTS FALSE)
-- distinct on with joins
-- each customer's first order key
SELECT DISTINCT ON (o_custkey) o_custkey, l_orderkey
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
WHERE o_custkey < 15
ORDER BY 1,2;
o_custkey | l_orderkey
@ -1281,7 +1260,7 @@ SELECT DISTINCT ON (o_custkey) o_custkey, l_orderkey
SELECT coordinator_plan($Q$
EXPLAIN (COSTS FALSE)
SELECT DISTINCT ON (o_custkey) o_custkey, l_orderkey
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
WHERE o_custkey < 15
ORDER BY 1,2;
$Q$);
@ -1299,7 +1278,7 @@ $Q$);
SELECT coordinator_plan($Q$
EXPLAIN (COSTS FALSE)
SELECT DISTINCT ON (o_custkey) o_custkey, l_orderkey
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
WHERE o_custkey < 15;
$Q$);
coordinator_plan
@ -1313,7 +1292,7 @@ $Q$);
-- each customer's each order's first l_partkey
SELECT DISTINCT ON (o_custkey, l_orderkey) o_custkey, l_orderkey, l_linenumber, l_partkey
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
WHERE o_custkey < 20
ORDER BY 1,2,3;
o_custkey | l_orderkey | l_linenumber | l_partkey
@ -1360,7 +1339,7 @@ SELECT DISTINCT ON (o_custkey, l_orderkey) o_custkey, l_orderkey, l_linenumber,
SELECT coordinator_plan($Q$
EXPLAIN (COSTS FALSE)
SELECT DISTINCT ON (o_custkey, l_orderkey) o_custkey, l_orderkey, l_linenumber, l_partkey
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
WHERE o_custkey < 20;
$Q$);
coordinator_plan
@ -1374,7 +1353,7 @@ $Q$);
-- each customer's each order's last l_partkey
SELECT DISTINCT ON (o_custkey, l_orderkey) o_custkey, l_orderkey, l_linenumber, l_partkey
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
FROM lineitem_hash_part JOIN orders_hash_part ON (l_orderkey = o_orderkey)
WHERE o_custkey < 15
ORDER BY 1,2,3 DESC;
o_custkey | l_orderkey | l_linenumber | l_partkey

File diff suppressed because it is too large Load Diff

View File

@ -374,7 +374,6 @@ DEBUG: Plan is router executable
5
(1 row)
-- union involving reference table and distributed table subqueries
-- is supported with pulling data to coordinator
SELECT * FROM
@ -1512,7 +1511,7 @@ ORDER BY 1 LIMIT 3;
-- should be able to pushdown since one of the subqueries has distinct on reference tables
-- and there is only reference table in that subquery
SELECT
SELECT
distinct_users, event_type, time
FROM
(SELECT user_id, time, event_type FROM events_table) as events_dist INNER JOIN
@ -1530,11 +1529,11 @@ OFFSET 0;
(5 rows)
-- the same query wuth multiple reference tables in the subquery
SELECT
SELECT
distinct_users, event_type, time
FROM
(SELECT user_id, time, event_type FROM events_table) as events_dist INNER JOIN
(SELECT DISTINCT users_reference_table.user_id as distinct_users FROM users_reference_table, events_reference_table
(SELECT DISTINCT users_reference_table.user_id as distinct_users FROM users_reference_table, events_reference_table
WHERE events_reference_table.user_id = users_reference_table.user_id AND events_reference_table.event_type IN (1,2,3,4)) users_ref
ON (events_dist.user_id = users_ref.distinct_users)
ORDER BY time DESC
@ -1550,7 +1549,7 @@ OFFSET 0;
(5 rows)
-- similar query as the above, but with group bys
SELECT
SELECT
distinct_users, event_type, time
FROM
(SELECT user_id, time, event_type FROM events_table) as events_dist INNER JOIN
@ -1587,7 +1586,7 @@ SELECT * FROM
---------
(0 rows)
-- similiar to the above examples, this time there is a subquery
-- similiar to the above examples, this time there is a subquery
-- whose output is not in the DISTINCT clause
SELECT * FROM
(
@ -1608,8 +1607,8 @@ ORDER BY 1;
SELECT * FROM
(
SELECT DISTINCT users_reference_table.user_id, us_events.user_id FROM users_reference_table, (SELECT user_id, random() FROM events_table WHERE event_type IN (2,3)) as us_events WHERE users_reference_table.user_id = us_events.user_id
) as foo
ORDER BY 1 DESC
) as foo
ORDER BY 1 DESC
LIMIT 4;
user_id | user_id
---------+---------
@ -1624,15 +1623,15 @@ LIMIT 4;
-- is disabled
SELECT * FROM
(
SELECT
DISTINCT users_reference_table.user_id, us_events.value_4
FROM
users_reference_table,
(SELECT user_id, value_4, random() FROM events_table WHERE event_type IN (2,3)) as us_events
WHERE
SELECT
DISTINCT users_reference_table.user_id, us_events.value_4
FROM
users_reference_table,
(SELECT user_id, value_4, random() FROM events_table WHERE event_type IN (2,3)) as us_events
WHERE
users_reference_table.user_id = us_events.user_id
) as foo
ORDER BY 1 DESC
) as foo
ORDER BY 1 DESC
LIMIT 4;
user_id | value_4
---------+---------
@ -1644,7 +1643,6 @@ LIMIT 4;
-- test the read_intermediate_result() for GROUP BYs
BEGIN;
SELECT broadcast_intermediate_result('squares', 'SELECT s, s*s FROM generate_series(1,200) s');
broadcast_intermediate_result
-------------------------------
@ -1652,15 +1650,15 @@ SELECT broadcast_intermediate_result('squares', 'SELECT s, s*s FROM generate_ser
(1 row)
-- single appereance of read_intermediate_result
SELECT
DISTINCT user_id
FROM
users_table
JOIN
(SELECT
max(res.val) as mx
FROM
read_intermediate_result('squares', 'binary') AS res (val int, val_square int)
SELECT
DISTINCT user_id
FROM
users_table
JOIN
(SELECT
max(res.val) as mx
FROM
read_intermediate_result('squares', 'binary') AS res (val int, val_square int)
GROUP BY res.val_square) squares
ON (mx = user_id)
ORDER BY 1
@ -1692,15 +1690,15 @@ LIMIT 5;
(5 rows)
-- single appereance of read_intermediate_result but inside a subquery
SELECT
DISTINCT user_id
FROM
users_table
SELECT
DISTINCT user_id
FROM
users_table
JOIN (
SELECT *,random() FROM (SELECT
max(res.val) as mx
FROM
(SELECT val, val_square FROM read_intermediate_result('squares', 'binary') AS res (val int, val_square int)) res
SELECT *,random() FROM (SELECT
max(res.val) as mx
FROM
(SELECT val, val_square FROM read_intermediate_result('squares', 'binary') AS res (val int, val_square int)) res
GROUP BY res.val_square) foo)
squares
ON (mx = user_id)
@ -1716,16 +1714,16 @@ LIMIT 5;
(5 rows)
-- multiple read_intermediate_results in the same subquery is OK
SELECT
DISTINCT user_id
FROM
users_table
JOIN
(SELECT
max(res.val) as mx
FROM
SELECT
DISTINCT user_id
FROM
users_table
JOIN
(SELECT
max(res.val) as mx
FROM
read_intermediate_result('squares', 'binary') AS res (val int, val_square int),
read_intermediate_result('squares', 'binary') AS res2 (val int, val_square int)
read_intermediate_result('squares', 'binary') AS res2 (val int, val_square int)
WHERE res.val = res2.val_square
GROUP BY res2.val_square) squares
ON (mx = user_id)
@ -1738,19 +1736,19 @@ LIMIT 5;
(2 rows)
-- mixed recurring tuples should be supported
SELECT
DISTINCT user_id
FROM
users_table
JOIN
(SELECT
max(res.val) as mx
FROM
read_intermediate_result('squares', 'binary') AS res (val int, val_square int),
SELECT
DISTINCT user_id
FROM
users_table
JOIN
(SELECT
max(res.val) as mx
FROM
read_intermediate_result('squares', 'binary') AS res (val int, val_square int),
generate_series(0, 10) i
WHERE
res.val = i
GROUP BY
GROUP BY
i) squares
ON (mx = user_id)
ORDER BY 1
@ -1766,16 +1764,16 @@ LIMIT 5;
-- should recursively plan since
-- there are no columns on the GROUP BY from the distributed table
SELECT
DISTINCT user_id
FROM
SELECT
DISTINCT user_id
FROM
users_reference_table
JOIN
(SELECT
max(val_square) as mx
FROM
read_intermediate_result('squares', 'binary') AS res (val int, val_square int), events_table
WHERE
JOIN
(SELECT
max(val_square) as mx
FROM
read_intermediate_result('squares', 'binary') AS res (val int, val_square int), events_table
WHERE
events_table.user_id = res.val GROUP BY res.val) squares
ON (mx = user_id)
ORDER BY 1
@ -1788,14 +1786,14 @@ LIMIT 5;
ROLLBACK;
-- should work since we're using an immutable function as recurring tuple
SELECT
DISTINCT user_id
FROM
users_table
JOIN
(SELECT
max(i+5)as mx
FROM
SELECT
DISTINCT user_id
FROM
users_table
JOIN
(SELECT
max(i+5)as mx
FROM
generate_series(0, 10) as i GROUP BY i) squares
ON (mx = user_id)
ORDER BY 1
@ -1806,20 +1804,20 @@ LIMIT 5;
6
(2 rows)
-- should recursively plan since we're
-- should recursively plan since we're
-- using an immutable function as recurring tuple
-- along with a distributed table, where GROUP BY is
-- along with a distributed table, where GROUP BY is
-- on the recurring tuple
SELECT
DISTINCT user_id
FROM
SELECT
DISTINCT user_id
FROM
users_reference_table
JOIN
(SELECT
max(i+5)as mx
FROM
generate_series(0, 10) as i, events_table
WHERE
JOIN
(SELECT
max(i+5)as mx
FROM
generate_series(0, 10) as i, events_table
WHERE
events_table.user_id = i GROUP BY i) squares
ON (mx = user_id)
ORDER BY 1

View File

@ -228,7 +228,6 @@ ORDER BY shardid;
1360009 | t
(1 row)
DROP TABLE upgrade_reference_table_append;
-- test valid cases, shard exists at one worker
CREATE TABLE upgrade_reference_table_one_worker(column1 int);
@ -341,7 +340,6 @@ ORDER BY shardid;
1360010 | t
(1 row)
DROP TABLE upgrade_reference_table_one_worker;
-- test valid cases, shard exists at both workers but one is unhealthy
SET citus.shard_replication_factor TO 2;
@ -458,7 +456,6 @@ ORDER BY shardid;
1360011 | t
(1 row)
DROP TABLE upgrade_reference_table_one_unhealthy;
-- test valid cases, shard exists at both workers and both are healthy
CREATE TABLE upgrade_reference_table_both_healthy(column1 int);
@ -570,7 +567,6 @@ ORDER BY shardid;
1360012 | t
(1 row)
DROP TABLE upgrade_reference_table_both_healthy;
-- test valid cases, do it in transaction and ROLLBACK
SET citus.shard_replication_factor TO 1;
@ -686,7 +682,6 @@ ORDER BY shardid;
1360013 | f
(1 row)
DROP TABLE upgrade_reference_table_transaction_rollback;
-- test valid cases, do it in transaction and COMMIT
SET citus.shard_replication_factor TO 1;
@ -872,11 +867,9 @@ ORDER BY shardid;
1360015
(1 row)
SELECT upgrade_to_reference_table('upgrade_reference_table_mx');
ERROR: cannot upgrade to reference table
DETAIL: Upgrade is only supported for statement-based replicated tables but "upgrade_reference_table_mx" is streaming replicated
-- situation after upgrade_reference_table
SELECT
partmethod, (partkey IS NULL) as partkeyisnull, colocationid, repmodel
@ -937,10 +930,9 @@ SELECT create_distributed_table('upgrade_reference_table_mx', 'column1');
(1 row)
UPDATE pg_dist_shard_placement SET shardstate = 3
WHERE nodeport = :worker_2_port AND
UPDATE pg_dist_shard_placement SET shardstate = 3
WHERE nodeport = :worker_2_port AND
shardid IN (SELECT shardid FROM pg_dist_shard WHERE logicalrelid='upgrade_reference_table_mx'::regclass);
SELECT start_metadata_sync_to_node('localhost', :worker_1_port);
start_metadata_sync_to_node
-----------------------------
@ -995,7 +987,6 @@ ORDER BY shardid;
1360016
(1 row)
SET client_min_messages TO WARNING;
SELECT upgrade_to_reference_table('upgrade_reference_table_mx');
upgrade_to_reference_table
@ -1003,7 +994,6 @@ SELECT upgrade_to_reference_table('upgrade_reference_table_mx');
(1 row)
-- situation after upgrade_reference_table
SELECT
partmethod, (partkey IS NULL) as partkeyisnull, colocationid, repmodel
@ -1052,7 +1042,6 @@ ORDER BY shardid;
1360016 | t
(1 row)
-- situation on metadata worker
\c - - - :worker_1_port
SELECT
@ -1091,7 +1080,6 @@ ORDER BY shardid;
1360016 | t
(1 row)
\c - - - :master_port
DROP TABLE upgrade_reference_table_mx;
SELECT stop_metadata_sync_to_node('localhost', :worker_1_port);

View File

@ -51,7 +51,6 @@ BEGIN;
(1 row)
-- we can even run queries (sequentially) over the distributed table
SELECT * FROM dist_table;
key | value
@ -103,7 +102,7 @@ SELECT run_command_on_workers($$SELECT extversion FROM pg_extension WHERE extnam
-- now, update to a newer version
ALTER EXTENSION isn UPDATE TO '1.2';
-- show that ALTER EXTENSION is propagated
-- show that ALTER EXTENSION is propagated
SELECT run_command_on_workers($$SELECT extversion FROM pg_extension WHERE extname = 'isn'$$);
run_command_on_workers
-------------------------
@ -145,8 +144,8 @@ DROP EXTENSION isn CASCADE;
-- restore client_min_messages after DROP EXTENSION
RESET client_min_messages;
-- now make sure that the reference tables depending on an extension can be succesfully created.
-- we should also ensure that we replicate this reference table (and hence the extension)
-- to new nodes after calling master_activate_node.
-- we should also ensure that we replicate this reference table (and hence the extension)
-- to new nodes after calling master_activate_node.
-- now, first drop seg and existing objects before next test
SET client_min_messages TO WARNING;
DROP EXTENSION seg CASCADE;
@ -207,7 +206,7 @@ SELECT run_command_on_workers($$SELECT extversion FROM pg_extension WHERE extnam
(2 rows)
-- and similarly check for the reference table
select count(*) from pg_dist_partition where partmethod='n' and logicalrelid='ref_table_2'::regclass;
select count(*) from pg_dist_partition where partmethod='n' and logicalrelid='ref_table_2'::regclass;
count
-------
1
@ -241,7 +240,7 @@ SELECT run_command_on_workers($$SELECT count(*) FROM pg_extension WHERE extname
(2 rows)
-- give a notice for the following commands saying that it is not
-- propagated to the workers. the user should run it manually on the workers
-- propagated to the workers. the user should run it manually on the workers
CREATE TABLE t1 (A int);
CREATE VIEW v1 AS select * from t1;
ALTER EXTENSION seg ADD VIEW v1;
@ -346,8 +345,8 @@ BEGIN;
SET citus.shard_replication_factor TO 1;
CREATE EXTENSION seg;
CREATE EXTENSION isn;
CREATE TYPE test_type AS (a int, b seg);
CREATE TYPE test_type_2 AS (a int, b test_type);
CREATE TYPE test_type AS (a int, b seg);
CREATE TYPE test_type_2 AS (a int, b test_type);
CREATE TABLE t2 (a int, b test_type_2, c issn);
SELECT create_distributed_table('t2', 'a');
create_distributed_table
@ -355,8 +354,7 @@ BEGIN;
(1 row)
CREATE TYPE test_type_3 AS (a int, b test_type, c issn);
CREATE TYPE test_type_3 AS (a int, b test_type, c issn);
CREATE TABLE t3 (a int, b test_type_3);
SELECT create_reference_table('t3');
create_reference_table

View File

@ -1,8 +1,8 @@
--
--
-- Tests sequential and parallel DDL command execution
-- in combination with 1PC and 2PC
-- Note: this test should not be executed in parallel with
-- other tests since we're relying on disabling 2PC recovery
-- other tests since we're relying on disabling 2PC recovery
--
-- We're also setting force_max_query_parallelization throughout
-- the tests because the test file has the assumption that
@ -29,7 +29,7 @@ $$
LANGUAGE 'plpgsql' IMMUTABLE;
-- this function simply checks the equality of the number of transactions in the
-- pg_dist_transaction and number of shard placements for a distributed table
-- The function is useful to ensure that a single connection is opened per
-- The function is useful to ensure that a single connection is opened per
-- shard placement in a distributed transaction
CREATE OR REPLACE FUNCTION distributed_2PCs_are_equal_to_placement_count()
RETURNS bool AS
@ -184,7 +184,7 @@ SELECT distributed_2PCs_are_equal_to_worker_count();
t
(1 row)
-- tables with replication factor > 1 should also obey
-- tables with replication factor > 1 should also obey
-- both multi_shard_commit_protocol and multi_shard_modify_mode
SET citus.shard_replication_factor TO 2;
CREATE TABLE test_table_rep_2 (a int);
@ -194,7 +194,6 @@ SELECT create_distributed_table('test_table_rep_2', 'a');
(1 row)
-- 1PC should never use 2PC with rep > 1
SET citus.multi_shard_commit_protocol TO '1pc';
SET citus.multi_shard_modify_mode TO 'sequential';

View File

@ -26,19 +26,19 @@ WITH cte AS (
)
SELECT dist_cte.user_id FROM local_cte JOIN dist_cte ON dist_cte.user_id=local_cte.user_id
)
SELECT
count(*)
FROM
SELECT
count(*)
FROM
cte,
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
ORDER BY 1 DESC LIMIT 5
) as foo
) as foo
WHERE foo.user_id = cte.user_id;
DEBUG: generating subplan 3_1 for CTE cte: WITH local_cte AS (SELECT users_table_local.user_id, users_table_local."time", users_table_local.value_1, users_table_local.value_2, users_table_local.value_3, users_table_local.value_4 FROM subquery_and_ctes.users_table_local), dist_cte AS (SELECT events_table.user_id FROM subquery_and_ctes.events_table) SELECT dist_cte.user_id FROM (local_cte JOIN dist_cte ON ((dist_cte.user_id OPERATOR(pg_catalog.=) local_cte.user_id)))
DEBUG: generating subplan 4_1 for CTE local_cte: SELECT user_id, "time", value_1, value_2, value_3, value_4 FROM subquery_and_ctes.users_table_local
@ -125,8 +125,8 @@ FROM cte1 WHERE dt.id = 1;
DEBUG: generating subplan 16_1 for CTE cte1: SELECT id, value FROM subquery_and_ctes.func() func(id, value)
DEBUG: Plan 16 query after replacing subqueries and CTEs: UPDATE subquery_and_ctes.dist_table dt SET value = cte1.value FROM (SELECT intermediate_result.id, intermediate_result.value FROM read_intermediate_result('16_1'::text, 'binary'::citus_copy_format) intermediate_result(id integer, value integer)) cte1 WHERE (dt.id OPERATOR(pg_catalog.=) 1)
-- CTEs are recursively planned, and subquery foo is also recursively planned
-- final plan becomes a real-time plan since we also have events_table in the
-- range table entries
-- final plan becomes a real-time plan since we also have events_table in the
-- range table entries
WITH cte AS (
WITH local_cte AS (
SELECT * FROM users_table_local
@ -136,16 +136,16 @@ WITH cte AS (
)
SELECT dist_cte.user_id FROM local_cte JOIN dist_cte ON dist_cte.user_id=local_cte.user_id
)
SELECT
count(*)
FROM
SELECT
count(*)
FROM
cte,
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
ORDER BY 1 DESC LIMIT 5
) as foo, events_table
@ -163,7 +163,7 @@ DEBUG: Plan 17 query after replacing subqueries and CTEs: SELECT count(*) AS co
(1 row)
-- CTEs are replaced and subquery in WHERE is also replaced
-- but the query is still real-time query since users_table is in the
-- but the query is still real-time query since users_table is in the
-- range table list
WITH cte AS (
WITH local_cte AS (
@ -176,7 +176,7 @@ WITH cte AS (
)
SELECT DISTINCT cte.user_id
FROM users_table, cte
WHERE
WHERE
users_table.user_id = cte.user_id AND
users_table.user_id IN (SELECT DISTINCT value_2 FROM users_table WHERE value_1 >= 1 AND value_1 <= 20 ORDER BY 1 LIMIT 5)
ORDER BY 1 DESC;
@ -208,7 +208,7 @@ WITH cte AS (
)
SELECT DISTINCT cte.user_id
FROM cte
WHERE
WHERE
cte.user_id IN (SELECT DISTINCT user_id FROM users_table WHERE value_1 >= 1 AND value_1 <= 20)
ORDER BY 1 DESC;
DEBUG: generating subplan 25_1 for CTE cte: WITH local_cte AS (SELECT users_table_local.user_id, users_table_local."time", users_table_local.value_1, users_table_local.value_2, users_table_local.value_3, users_table_local.value_4 FROM subquery_and_ctes.users_table_local), dist_cte AS (SELECT events_table.user_id FROM subquery_and_ctes.events_table) SELECT dist_cte.user_id FROM (local_cte JOIN dist_cte ON ((dist_cte.user_id OPERATOR(pg_catalog.=) local_cte.user_id)))
@ -234,12 +234,12 @@ SELECT
FROM
(
WITH cte AS (
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
) SELECT * FROM cte ORDER BY 1 DESC
) as foo
@ -263,25 +263,24 @@ SELECT
FROM
(
WITH cte AS (
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
) SELECT * FROM cte ORDER BY 1 DESC
) as foo,
) as foo,
(
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
) as bar
) as bar
WHERE foo.user_id = bar.user_id
ORDER BY 1 DESC;
DEBUG: generating subplan 31_1 for CTE cte: SELECT DISTINCT users_table.user_id FROM subquery_and_ctes.users_table, subquery_and_ctes.events_table WHERE ((users_table.user_id OPERATOR(pg_catalog.=) events_table.user_id) AND (events_table.event_type OPERATOR(pg_catalog.=) ANY (ARRAY[1, 2, 3, 4])))
@ -303,38 +302,37 @@ SELECT
FROM
(
WITH cte AS (
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
) SELECT * FROM cte ORDER BY 1 DESC
) as foo,
) as foo,
(
SELECT
SELECT
users_table.user_id, some_events.event_type
FROM
users_table,
FROM
users_table,
(
WITH cte AS (
SELECT
SELECT
event_type, users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
value_1 IN (1,2)
) SELECT * FROM cte ORDER BY 1 DESC
) as some_events
WHERE
users_table.user_id = some_events.user_id AND
WHERE
users_table.user_id = some_events.user_id AND
event_type IN (1,2,3,4)
ORDER BY 2,1
LIMIT 2
) as bar
) as bar
WHERE foo.user_id = bar.user_id
ORDER BY 1 DESC LIMIT 5;
DEBUG: generating subplan 33_1 for CTE cte: SELECT DISTINCT users_table.user_id FROM subquery_and_ctes.users_table, subquery_and_ctes.events_table WHERE ((users_table.user_id OPERATOR(pg_catalog.=) events_table.user_id) AND (events_table.event_type OPERATOR(pg_catalog.=) ANY (ARRAY[1, 2, 3, 4])))
@ -347,10 +345,10 @@ DEBUG: Plan 33 query after replacing subqueries and CTEs: SELECT DISTINCT bar.u
1
(1 row)
-- CTEs on the different parts of the query is replaced
-- CTEs on the different parts of the query is replaced
-- and subquery foo is also replaced since it contains
-- DISTINCT on a non-partition key
SELECT * FROM
-- DISTINCT on a non-partition key
SELECT * FROM
(
WITH cte AS (
WITH local_cte AS (
@ -363,16 +361,16 @@ SELECT * FROM
)
SELECT DISTINCT cte.user_id
FROM users_table, cte
WHERE
WHERE
users_table.user_id = cte.user_id AND
users_table.user_id IN
users_table.user_id IN
(WITH cte_in_where AS (SELECT DISTINCT value_2 FROM users_table WHERE value_1 >= 1 AND value_1 <= 20 ORDER BY 1 LIMIT 5) SELECT * FROM cte_in_where)
ORDER BY 1 DESC
) as foo,
events_table
WHERE
) as foo,
events_table
WHERE
foo.user_id = events_table.value_2
ORDER BY 3 DESC, 2 DESC, 1 DESC
ORDER BY 3 DESC, 2 DESC, 1 DESC
LIMIT 5;
DEBUG: generating subplan 37_1 for CTE cte: WITH local_cte AS (SELECT users_table_local.user_id, users_table_local."time", users_table_local.value_1, users_table_local.value_2, users_table_local.value_3, users_table_local.value_4 FROM subquery_and_ctes.users_table_local), dist_cte AS (SELECT events_table.user_id FROM subquery_and_ctes.events_table) SELECT dist_cte.user_id FROM (local_cte JOIN dist_cte ON ((dist_cte.user_id OPERATOR(pg_catalog.=) local_cte.user_id)))
DEBUG: generating subplan 38_1 for CTE local_cte: SELECT user_id, "time", value_1, value_2, value_3, value_4 FROM subquery_and_ctes.users_table_local
@ -398,30 +396,30 @@ WITH cte AS (
SELECT * FROM users_table_local
),
dist_cte AS (
SELECT
SELECT
user_id
FROM
events_table,
FROM
events_table,
(SELECT DISTINCT value_2 FROM users_table OFFSET 0) as foo
WHERE
WHERE
events_table.user_id = foo.value_2 AND
events_table.user_id IN (SELECT DISTINCT value_1 FROM users_table ORDER BY 1 LIMIT 3)
)
SELECT dist_cte.user_id FROM local_cte JOIN dist_cte ON dist_cte.user_id=local_cte.user_id
)
SELECT
count(*)
FROM
SELECT
count(*)
FROM
cte,
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
ORDER BY 1 DESC LIMIT 5
) as foo
) as foo
WHERE foo.user_id = cte.user_id;
DEBUG: generating subplan 42_1 for CTE cte: WITH local_cte AS (SELECT users_table_local.user_id, users_table_local."time", users_table_local.value_1, users_table_local.value_2, users_table_local.value_3, users_table_local.value_4 FROM subquery_and_ctes.users_table_local), dist_cte AS (SELECT events_table.user_id FROM subquery_and_ctes.events_table, (SELECT DISTINCT users_table.value_2 FROM subquery_and_ctes.users_table OFFSET 0) foo WHERE ((events_table.user_id OPERATOR(pg_catalog.=) foo.value_2) AND (events_table.user_id OPERATOR(pg_catalog.=) ANY (SELECT DISTINCT users_table.value_1 FROM subquery_and_ctes.users_table ORDER BY users_table.value_1 LIMIT 3)))) SELECT dist_cte.user_id FROM (local_cte JOIN dist_cte ON ((dist_cte.user_id OPERATOR(pg_catalog.=) local_cte.user_id)))
DEBUG: generating subplan 43_1 for CTE local_cte: SELECT user_id, "time", value_1, value_2, value_3, value_4 FROM subquery_and_ctes.users_table_local
@ -440,41 +438,41 @@ DEBUG: Plan 42 query after replacing subqueries and CTEs: SELECT count(*) AS co
(1 row)
-- the same query, but this time the CTEs also live inside a subquery
SELECT
*
FROM
SELECT
*
FROM
(
WITH cte AS (
WITH local_cte AS (
SELECT * FROM users_table_local
),
dist_cte AS (
SELECT
SELECT
user_id
FROM
events_table,
FROM
events_table,
(SELECT DISTINCT value_2 FROM users_table OFFSET 0) as foo
WHERE
WHERE
events_table.user_id = foo.value_2 AND
events_table.user_id IN (SELECT DISTINCT value_1 FROM users_table ORDER BY 1 LIMIT 3)
)
SELECT dist_cte.user_id FROM local_cte JOIN dist_cte ON dist_cte.user_id=local_cte.user_id
)
SELECT
SELECT
count(*) as cnt
FROM
FROM
cte,
(SELECT
DISTINCT users_table.user_id
FROM
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
ORDER BY 1 DESC LIMIT 5
) as foo
) as foo
WHERE foo.user_id = cte.user_id
) as foo, users_table WHERE foo.cnt > users_table.value_2
) as foo, users_table WHERE foo.cnt > users_table.value_2
ORDER BY 3 DESC, 1 DESC, 2 DESC, 4 DESC
LIMIT 5;
DEBUG: generating subplan 48_1 for CTE cte: WITH local_cte AS (SELECT users_table_local.user_id, users_table_local."time", users_table_local.value_1, users_table_local.value_2, users_table_local.value_3, users_table_local.value_4 FROM subquery_and_ctes.users_table_local), dist_cte AS (SELECT events_table.user_id FROM subquery_and_ctes.events_table, (SELECT DISTINCT users_table.value_2 FROM subquery_and_ctes.users_table OFFSET 0) foo WHERE ((events_table.user_id OPERATOR(pg_catalog.=) foo.value_2) AND (events_table.user_id OPERATOR(pg_catalog.=) ANY (SELECT DISTINCT users_table.value_1 FROM subquery_and_ctes.users_table ORDER BY users_table.value_1 LIMIT 3)))) SELECT dist_cte.user_id FROM (local_cte JOIN dist_cte ON ((dist_cte.user_id OPERATOR(pg_catalog.=) local_cte.user_id)))
@ -505,25 +503,24 @@ SELECT
FROM
(
WITH RECURSIVE cte AS (
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
) SELECT * FROM cte ORDER BY 1 DESC
) as foo,
) as foo,
(
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
) as bar
) as bar
WHERE foo.user_id = bar.user_id
ORDER BY 1 DESC;
ERROR: recursive CTEs are not supported in distributed queries

View File

@ -1,5 +1,5 @@
-- ===================================================================
-- test recursive planning functionality with complex target entries
-- test recursive planning functionality with complex target entries
-- and some utilities
-- ===================================================================
CREATE SCHEMA subquery_complex;
@ -11,7 +11,7 @@ SELECT
FROM
events_table
WHERE
user_id IN (SELECT user_id FROM users_table GROUP BY user_id ORDER BY count(*) DESC LIMIT 20)
user_id IN (SELECT user_id FROM users_table GROUP BY user_id ORDER BY count(*) DESC LIMIT 20)
GROUP BY
event_type
ORDER BY 1 DESC, 2 DESC
@ -63,8 +63,8 @@ FROM
SELECT count(distinct value_2) as cnt_2 FROM users_table ORDER BY 1 DESC LIMIT 4
) as baz,
(
SELECT user_id, sum(distinct value_2) as sum FROM users_table GROUP BY user_id ORDER BY 1 DESC LIMIT 4
) as bat, events_table
SELECT user_id, sum(distinct value_2) as sum FROM users_table GROUP BY user_id ORDER BY 1 DESC LIMIT 4
) as bat, events_table
WHERE foo.avg != bar.cnt_1 AND baz.cnt_2 = events_table.event_type
ORDER BY 1 DESC;
DEBUG: push down of limit count: 3
@ -85,29 +85,29 @@ SELECT
*
FROM
(
SELECT
SELECT
min(user_id) * 2, max(user_id) / 2, sum(user_id), count(user_id)::float, avg(user_id)::bigint
FROM
users_table
ORDER BY 1 DESC
FROM
users_table
ORDER BY 1 DESC
LIMIT 3
) as foo,
(
SELECT
SELECT
min(value_3) * 2, max(value_3) / 2, sum(value_3), count(value_3), avg(value_3)
FROM
users_table
ORDER BY 1 DESC
FROM
users_table
ORDER BY 1 DESC
LIMIT 3
) as bar,
(
SELECT
min(time), max(time), count(time),
count(*) FILTER (WHERE user_id = 3) as cnt_with_filter,
SELECT
min(time), max(time), count(time),
count(*) FILTER (WHERE user_id = 3) as cnt_with_filter,
count(*) FILTER (WHERE user_id::text LIKE '%3%') as cnt_with_filter_2
FROM
users_table
ORDER BY 1 DESC
FROM
users_table
ORDER BY 1 DESC
LIMIT 3
) as baz
ORDER BY 1 DESC;
@ -135,11 +135,11 @@ FROM
SELECT sum(user_id * (5.0 / (value_1 + value_2 + 0.1)) * value_3) as cnt_1 FROM users_table ORDER BY 1 DESC LIMIT 3
) as bar,
(
SELECT
SELECT
avg(case
when user_id > 4
then value_1
end) as cnt_2,
end) as cnt_2,
avg(case
when user_id > 500
then value_1
@ -152,16 +152,16 @@ FROM
end) as sum_1,
extract(year FROM max(time)) as l_year,
strpos(max(user_id)::text, '1') as pos
FROM
users_table
ORDER BY
1 DESC
FROM
users_table
ORDER BY
1 DESC
LIMIT 4
) as baz,
) as baz,
(
SELECT COALESCE(value_3, 20) AS count_pay FROM users_table ORDER BY 1 OFFSET 20 LIMIT 5
) as tar,
events_table
events_table
WHERE foo.avg != bar.cnt_1 AND baz.cnt_2 != events_table.event_type
ORDER BY 1 DESC;
DEBUG: push down of limit count: 3
@ -245,7 +245,7 @@ FROM (
sum(value_1) > 10
ORDER BY (sum(value_3) - avg(value_1) - COALESCE(array_upper(ARRAY[max(user_id)],1) * 5,0)) DESC
LIMIT 3
) as c
) as c
WHERE b.value_2 != a.user_id
ORDER BY 3 DESC, 2 DESC, 1 DESC
LIMIT 5;
@ -267,20 +267,20 @@ DEBUG: Plan 21 query after replacing subqueries and CTEs: SELECT a.user_id, b.v
SELECT
bar.user_id
FROM
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND
event_type IN (1,2,3,4)
ORDER BY 1 DESC LIMIT 5
) as foo,
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
(SELECT
DISTINCT users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND false AND
event_type IN (1,2,3,4)
ORDER BY 1 DESC LIMIT 5
@ -296,7 +296,7 @@ DEBUG: Plan 25 query after replacing subqueries and CTEs: SELECT bar.user_id FR
(0 rows)
-- window functions tests, both is recursively planned
SELECT * FROM
SELECT * FROM
(
SELECT
user_id, time, rnk
@ -325,7 +325,7 @@ SELECT * FROM
*, rank() OVER my_win as rnk
FROM
events_table
WHERE
WHERE
user_id = 3
WINDOW my_win AS (PARTITION BY event_type ORDER BY time DESC)
) as foo
@ -343,14 +343,13 @@ DEBUG: Plan 28 query after replacing subqueries and CTEs: SELECT foo.user_id, f
-- cursor test
BEGIN;
DECLARE recursive_subquery CURSOR FOR
DECLARE recursive_subquery CURSOR FOR
SELECT
event_type, count(distinct value_2)
FROM
events_table
WHERE
user_id IN (SELECT user_id FROM users_table GROUP BY user_id ORDER BY count(*) DESC LIMIT 20)
user_id IN (SELECT user_id FROM users_table GROUP BY user_id ORDER BY count(*) DESC LIMIT 20)
GROUP BY
event_type
ORDER BY 1 DESC, 2 DESC
@ -384,14 +383,13 @@ DEBUG: Plan 31 query after replacing subqueries and CTEs: SELECT event_type, co
COMMIT;
-- cursor test with FETCH ALL
BEGIN;
DECLARE recursive_subquery CURSOR FOR
DECLARE recursive_subquery CURSOR FOR
SELECT
event_type, count(distinct value_2)
FROM
events_table
WHERE
user_id IN (SELECT user_id FROM users_table GROUP BY user_id ORDER BY count(*) DESC LIMIT 20)
user_id IN (SELECT user_id FROM users_table GROUP BY user_id ORDER BY count(*) DESC LIMIT 20)
GROUP BY
event_type
ORDER BY 1 DESC, 2 DESC

View File

@ -4,13 +4,13 @@
CREATE SCHEMA subquery_in_where;
SET search_path TO subquery_in_where, public;
SET client_min_messages TO DEBUG1;
--CTEs can be used as a recurring tuple with subqueries in WHERE
--CTEs can be used as a recurring tuple with subqueries in WHERE
WITH event_id
AS (SELECT user_id AS events_user_id,
time AS events_time,
AS (SELECT user_id AS events_user_id,
time AS events_time,
event_type
FROM events_table)
SELECT Count(*)
FROM events_table)
SELECT Count(*)
FROM event_id
WHERE events_user_id IN (SELECT user_id
FROM users_table);
@ -22,27 +22,27 @@ DEBUG: Plan 1 query after replacing subqueries and CTEs: SELECT count(*) AS cou
101
(1 row)
--Correlated subqueries can not be used in WHERE clause
WITH event_id
AS (SELECT user_id AS events_user_id,
time AS events_time,
event_type
FROM events_table)
SELECT Count(*)
FROM event_id
WHERE events_user_id IN (SELECT user_id
FROM users_table
WHERE users_table.time = events_time);
--Correlated subqueries can not be used in WHERE clause
WITH event_id
AS (SELECT user_id AS events_user_id,
time AS events_time,
event_type
FROM events_table)
SELECT Count(*)
FROM event_id
WHERE events_user_id IN (SELECT user_id
FROM users_table
WHERE users_table.time = events_time);
DEBUG: generating subplan 4_1 for CTE event_id: SELECT user_id AS events_user_id, "time" AS events_time, event_type FROM public.events_table
DEBUG: Plan 4 query after replacing subqueries and CTEs: SELECT count(*) AS count FROM (SELECT intermediate_result.events_user_id, intermediate_result.events_time, intermediate_result.event_type FROM read_intermediate_result('4_1'::text, 'binary'::citus_copy_format) intermediate_result(events_user_id integer, events_time timestamp without time zone, event_type integer)) event_id WHERE (events_user_id OPERATOR(pg_catalog.=) ANY (SELECT users_table.user_id FROM public.users_table WHERE (users_table."time" OPERATOR(pg_catalog.=) event_id.events_time)))
ERROR: cannot pushdown the subquery
DETAIL: Complex subqueries and CTEs are not allowed in the FROM clause when the query has subqueries in the WHERE clause and it references a column from another query
-- Recurring tuples as empty join tree
SELECT *
-- Recurring tuples as empty join tree
SELECT *
FROM (SELECT 1 AS id, 2 AS value_1, 3 AS value_3
UNION ALL SELECT 2 as id, 3 as value_1, 4 as value_3) AS tt1
WHERE id IN (SELECT user_id
FROM events_table);
UNION ALL SELECT 2 as id, 3 as value_1, 4 as value_3) AS tt1
WHERE id IN (SELECT user_id
FROM events_table);
DEBUG: generating subplan 6_1 for subquery SELECT 1 AS id, 2 AS value_1, 3 AS value_3 UNION ALL SELECT 2 AS id, 3 AS value_1, 4 AS value_3
DEBUG: generating subplan 6_2 for subquery SELECT user_id FROM public.events_table
DEBUG: Plan 6 query after replacing subqueries and CTEs: SELECT id, value_1, value_3 FROM (SELECT intermediate_result.id, intermediate_result.value_1, intermediate_result.value_3 FROM read_intermediate_result('6_1'::text, 'binary'::citus_copy_format) intermediate_result(id integer, value_1 integer, value_3 integer)) tt1 WHERE (id OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.user_id FROM read_intermediate_result('6_2'::text, 'binary'::citus_copy_format) intermediate_result(user_id integer)))
@ -55,12 +55,12 @@ DEBUG: Plan 6 query after replacing subqueries and CTEs: SELECT id, value_1, va
-- Recurring tuples in from clause as CTE and SET operation in WHERE clause
SELECT Count(*)
FROM (WITH event_id AS
(SELECT user_id AS events_user_id, time AS events_time, event_type
(SELECT user_id AS events_user_id, time AS events_time, event_type
FROM events_table)
SELECT events_user_id, events_time, event_type
FROM event_id
FROM event_id
ORDER BY 1,2,3
LIMIT 10) AS sub_table
LIMIT 10) AS sub_table
WHERE events_user_id IN (
(SELECT user_id
FROM users_table
@ -218,7 +218,7 @@ FROM
user_id as events_user_id, time as events_time, event_type
FROM
events_table
ORDER BY
ORDER BY
1,2,3
LIMIT
10
@ -628,7 +628,6 @@ DEBUG: Plan 65 query after replacing subqueries and CTEs: SELECT generate_serie
3
(3 rows)
-- Local tables also planned recursively, so using it as part of the FROM clause
-- make the clause recurring
CREATE TABLE local_table(id int, value_1 int);
@ -656,7 +655,6 @@ DEBUG: Plan 67 query after replacing subqueries and CTEs: SELECT id, value_1 FR
2 | 2
(2 rows)
-- Use local table in WHERE clause
SELECT
COUNT(*)
@ -667,7 +665,7 @@ FROM
users_table
ORDER BY
user_id
LIMIT
LIMIT
10) as sub_table
WHERE
user_id

View File

@ -6,7 +6,6 @@ SET search_path TO subquery_and_partitioning, public;
CREATE TABLE users_table_local AS SELECT * FROM users_table;
CREATE TABLE events_table_local AS SELECT * FROM events_table;
CREATE TABLE partitioning_test(id int, value_1 int, time date) PARTITION BY RANGE (time);
-- create its partitions
CREATE TABLE partitioning_test_2017 PARTITION OF partitioning_test FOR VALUES FROM ('2017-01-01') TO ('2018-01-01');
CREATE TABLE partitioning_test_2010 PARTITION OF partitioning_test FOR VALUES FROM ('2010-01-01') TO ('2011-01-01');
@ -30,9 +29,9 @@ SET client_min_messages TO DEBUG1;
SELECT
id
FROM
(SELECT
DISTINCT partitioning_test.id
FROM
(SELECT
DISTINCT partitioning_test.id
FROM
partitioning_test
LIMIT 5
) as foo
@ -52,15 +51,15 @@ DEBUG: Plan 3 query after replacing subqueries and CTEs: SELECT id FROM (SELECT
SELECT
*
FROM
(SELECT
DISTINCT partitioning_test.id
FROM
(SELECT
DISTINCT partitioning_test.id
FROM
partitioning_test
LIMIT 5
) as foo,
(SELECT
DISTINCT partitioning_test.time
FROM
(SELECT
DISTINCT partitioning_test.time
FROM
partitioning_test
LIMIT 5
) as bar
@ -80,17 +79,17 @@ DEBUG: Plan 5 query after replacing subqueries and CTEs: SELECT foo.id, bar."ti
SELECT
*
FROM
(SELECT
DISTINCT partitioning_test.time
FROM
(SELECT
DISTINCT partitioning_test.time
FROM
partitioning_test
ORDER BY 1 DESC
LIMIT 5
) as foo,
(
SELECT
DISTINCT partitioning_test.id
FROM
SELECT
DISTINCT partitioning_test.id
FROM
partitioning_test
) as bar
WHERE date_part('day', foo.time) = bar.id
@ -109,19 +108,19 @@ DEBUG: push down of limit count: 3
SELECT
*
FROM
(SELECT
DISTINCT partitioning_test.time
FROM
(SELECT
DISTINCT partitioning_test.time
FROM
partitioning_test
ORDER BY 1 DESC
LIMIT 5
) as foo,
(
SELECT
DISTINCT partitioning_test.id
FROM
SELECT
DISTINCT partitioning_test.id
FROM
partitioning_test
) as bar,
) as bar,
partitioning_test
WHERE date_part('day', foo.time) = bar.id AND partitioning_test.id = bar.id
ORDER BY 2 DESC, 1 DESC
@ -138,7 +137,7 @@ DEBUG: push down of limit count: 3
-- subquery in WHERE clause
SELECT DISTINCT id
FROM partitioning_test
WHERE
WHERE
id IN (SELECT DISTINCT date_part('day', time) FROM partitioning_test);
DEBUG: generating subplan 12_1 for subquery SELECT DISTINCT date_part('day'::text, "time") AS date_part FROM subquery_and_partitioning.partitioning_test
DEBUG: Plan 12 query after replacing subqueries and CTEs: SELECT DISTINCT id FROM subquery_and_partitioning.partitioning_test WHERE ((id)::double precision OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.date_part FROM read_intermediate_result('12_1'::text, 'binary'::citus_copy_format) intermediate_result(date_part double precision)))
@ -149,16 +148,16 @@ DEBUG: Plan 12 query after replacing subqueries and CTEs: SELECT DISTINCT id FR
-- repartition subquery
SET citus.enable_repartition_joins to ON;
SELECT
count(*)
SELECT
count(*)
FROM
(
SELECT DISTINCT p1.value_1 FROM partitioning_test as p1, partitioning_test as p2 WHERE p1.id = p2.value_1
) as foo,
) as foo,
(
SELECT user_id FROM users_table
) as bar
WHERE foo.value_1 = bar.user_id;
WHERE foo.value_1 = bar.user_id;
DEBUG: cannot use adaptive executor with repartition jobs
HINT: Since you enabled citus.enable_repartition_joins Citus chose to use task-tracker.
DEBUG: generating subplan 14_1 for subquery SELECT DISTINCT p1.value_1 FROM subquery_and_partitioning.partitioning_test p1, subquery_and_partitioning.partitioning_test p2 WHERE (p1.id OPERATOR(pg_catalog.=) p2.value_1)
@ -170,40 +169,40 @@ DEBUG: Plan 14 query after replacing subqueries and CTEs: SELECT count(*) AS co
SET citus.enable_repartition_joins to OFF;
-- subquery, cte, view and non-partitioned tables
CREATE VIEW subquery_and_ctes AS
SELECT
*
FROM
CREATE VIEW subquery_and_ctes AS
SELECT
*
FROM
(
WITH cte AS (
WITH local_cte AS (
SELECT * FROM users_table_local
),
dist_cte AS (
SELECT
SELECT
user_id
FROM
events_table,
FROM
events_table,
(SELECT DISTINCT value_1 FROM partitioning_test OFFSET 0) as foo
WHERE
WHERE
events_table.user_id = foo.value_1 AND
events_table.user_id IN (SELECT DISTINCT value_1 FROM users_table ORDER BY 1 LIMIT 3)
)
SELECT dist_cte.user_id FROM local_cte join dist_cte on dist_cte.user_id=local_cte.user_id
)
SELECT
SELECT
count(*) as cnt
FROM
FROM
cte,
(SELECT
DISTINCT events_table.user_id
FROM
(SELECT
DISTINCT events_table.user_id
FROM
partitioning_test, events_table
WHERE
events_table.user_id = partitioning_test.id AND
WHERE
events_table.user_id = partitioning_test.id AND
event_type IN (1,2,3,4)
ORDER BY 1 DESC LIMIT 5
) as foo
) as foo
WHERE foo.user_id = cte.user_id
) as foo, users_table WHERE foo.cnt > users_table.value_2;
SELECT * FROM subquery_and_ctes
@ -235,27 +234,27 @@ DEBUG: push down of limit count: 5
SELECT count(*)
FROM
(
SELECT avg(min) FROM
SELECT avg(min) FROM
(
SELECT min(partitioning_test.value_1) FROM
(
SELECT avg(event_type) as avg_ev_type FROM
SELECT avg(event_type) as avg_ev_type FROM
(
SELECT
max(value_1) as mx_val_1
SELECT
max(value_1) as mx_val_1
FROM (
SELECT
SELECT
avg(event_type) as avg
FROM
(
SELECT
cnt
FROM
SELECT
cnt
FROM
(SELECT count(*) as cnt, value_1 FROM partitioning_test GROUP BY value_1) as level_1, users_table
WHERE
WHERE
users_table.user_id = level_1.cnt
) as level_2, events_table
WHERE events_table.user_id = level_2.cnt
WHERE events_table.user_id = level_2.cnt
GROUP BY level_2.cnt
) as level_3, users_table
WHERE user_id = level_3.avg
@ -264,9 +263,9 @@ FROM
WHERE level_4.mx_val_1 = events_table.user_id
GROUP BY level_4.mx_val_1
) as level_5, partitioning_test
WHERE
WHERE
level_5.avg_ev_type = partitioning_test.id
GROUP BY
GROUP BY
level_5.avg_ev_type
) as level_6, users_table WHERE users_table.user_id = level_6.min
GROUP BY users_table.value_1

View File

@ -29,7 +29,7 @@ SET client_min_messages TO DEBUG1;
WITH ids_to_delete AS (
SELECT tenant_id FROM distributed_table WHERE dept = 1
)
DELETE FROM reference_table WHERE id IN (SELECT tenant_id FROM ids_to_delete);
DELETE FROM reference_table WHERE id IN (SELECT tenant_id FROM ids_to_delete);
DEBUG: generating subplan 4_1 for CTE ids_to_delete: SELECT tenant_id FROM with_dml.distributed_table WHERE (dept OPERATOR(pg_catalog.=) 1)
DEBUG: Plan 4 query after replacing subqueries and CTEs: DELETE FROM with_dml.reference_table WHERE (id OPERATOR(pg_catalog.=) ANY (SELECT ids_to_delete.tenant_id FROM (SELECT intermediate_result.tenant_id FROM read_intermediate_result('4_1'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text)) ids_to_delete))
-- update the name of the users whose dept is 2
@ -40,11 +40,11 @@ UPDATE reference_table SET name = 'new_' || name WHERE id IN (SELECT tenant_id F
DEBUG: generating subplan 6_1 for CTE ids_to_update: SELECT tenant_id FROM with_dml.distributed_table WHERE (dept OPERATOR(pg_catalog.=) 2)
DEBUG: Plan 6 query after replacing subqueries and CTEs: UPDATE with_dml.reference_table SET name = ('new_'::text OPERATOR(pg_catalog.||) name) WHERE (id OPERATOR(pg_catalog.=) ANY (SELECT ids_to_update.tenant_id FROM (SELECT intermediate_result.tenant_id FROM read_intermediate_result('6_1'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text)) ids_to_update))
-- now the CTE is also modifying
WITH ids_deleted_3 AS
WITH ids_deleted_3 AS
(
DELETE FROM distributed_table WHERE dept = 3 RETURNING tenant_id
),
ids_deleted_4 AS
ids_deleted_4 AS
(
DELETE FROM distributed_table WHERE dept = 4 RETURNING tenant_id
)
@ -54,15 +54,15 @@ DEBUG: generating subplan 8_2 for CTE ids_deleted_4: DELETE FROM with_dml.distr
DEBUG: generating subplan 8_3 for subquery SELECT ids_deleted_3.tenant_id FROM (SELECT intermediate_result.tenant_id FROM read_intermediate_result('8_1'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text)) ids_deleted_3 UNION SELECT ids_deleted_4.tenant_id FROM (SELECT intermediate_result.tenant_id FROM read_intermediate_result('8_2'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text)) ids_deleted_4
DEBUG: Plan 8 query after replacing subqueries and CTEs: DELETE FROM with_dml.reference_table WHERE (id OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.tenant_id FROM read_intermediate_result('8_3'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text)))
-- now the final UPDATE command is pushdownable
WITH ids_to_delete AS
WITH ids_to_delete AS
(
SELECT tenant_id FROM distributed_table WHERE dept = 5
)
UPDATE
distributed_table
SET
UPDATE
distributed_table
SET
dept = dept + 1
FROM
FROM
ids_to_delete, (SELECT tenant_id FROM distributed_table WHERE tenant_id::int < 60) as some_tenants
WHERE
some_tenants.tenant_id = ids_to_delete.tenant_id
@ -72,25 +72,25 @@ DEBUG: generating subplan 12_1 for CTE ids_to_delete: SELECT tenant_id FROM wit
DEBUG: Plan 12 query after replacing subqueries and CTEs: UPDATE with_dml.distributed_table SET dept = (distributed_table.dept OPERATOR(pg_catalog.+) 1) FROM (SELECT intermediate_result.tenant_id FROM read_intermediate_result('12_1'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text)) ids_to_delete, (SELECT distributed_table_1.tenant_id FROM with_dml.distributed_table distributed_table_1 WHERE ((distributed_table_1.tenant_id)::integer OPERATOR(pg_catalog.<) 60)) some_tenants WHERE ((some_tenants.tenant_id OPERATOR(pg_catalog.=) ids_to_delete.tenant_id) AND (distributed_table.tenant_id OPERATOR(pg_catalog.=) some_tenants.tenant_id) AND (EXISTS (SELECT ids_to_delete_1.tenant_id FROM (SELECT intermediate_result.tenant_id FROM read_intermediate_result('12_1'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text)) ids_to_delete_1)))
-- this query errors out since we've some hard
-- errors in the INSERT ... SELECT pushdown
-- which prevents to fallback to recursive planning
WITH ids_to_upsert AS
-- which prevents to fallback to recursive planning
WITH ids_to_upsert AS
(
SELECT tenant_id FROM distributed_table WHERE dept > 7
)
INSERT INTO distributed_table
INSERT INTO distributed_table
SELECT distributed_table.tenant_id FROM ids_to_upsert, distributed_table
WHERE distributed_table.tenant_id = ids_to_upsert.tenant_id
ON CONFLICT (tenant_id) DO UPDATE SET dept = 8;
ERROR: cannot perform distributed planning for the given modification
DETAIL: Select query cannot be pushed down to the worker.
-- the following query is very similar to the above one
-- but this time the query is pulled to coordinator since
-- but this time the query is pulled to coordinator since
-- we return before hitting any hard errors
WITH ids_to_insert AS
WITH ids_to_insert AS
(
SELECT (tenant_id::int * 100)::text as tenant_id FROM distributed_table WHERE dept > 7
)
INSERT INTO distributed_table
INSERT INTO distributed_table
SELECT DISTINCT ids_to_insert.tenant_id FROM ids_to_insert, distributed_table
WHERE distributed_table.tenant_id < ids_to_insert.tenant_id;
DEBUG: cannot perform distributed INSERT INTO ... SELECT because the partition columns in the source table and subquery do not match
@ -108,7 +108,7 @@ DEBUG: Plan 16 query after replacing subqueries and CTEs: SELECT tenant_id FROM
-- since COPY cannot be executed
SET citus.force_max_query_parallelization TO on;
WITH copy_to_other_table AS (
INSERT INTO distributed_table
INSERT INTO distributed_table
SELECT *
FROM second_distributed_table
WHERE dept = 3
@ -116,10 +116,10 @@ WITH copy_to_other_table AS (
RETURNING *
),
main_table_deleted AS (
DELETE
FROM distributed_table
DELETE
FROM distributed_table
WHERE dept < 10
AND NOT EXISTS (SELECT 1 FROM second_distributed_table
AND NOT EXISTS (SELECT 1 FROM second_distributed_table
WHERE second_distributed_table.dept = 1
AND second_distributed_table.tenant_id = distributed_table.tenant_id)
RETURNING *
@ -127,7 +127,7 @@ main_table_deleted AS (
INSERT INTO second_distributed_table
SELECT *
FROM main_table_deleted
EXCEPT
EXCEPT
SELECT *
FROM copy_to_other_table;
DEBUG: distributed INSERT ... SELECT can only select from distributed tables
@ -138,20 +138,19 @@ DEBUG: generating subplan 20_3 for subquery SELECT main_table_deleted.tenant_id
DEBUG: Plan 20 query after replacing subqueries and CTEs: SELECT tenant_id, dept FROM (SELECT intermediate_result.tenant_id, intermediate_result.dept FROM read_intermediate_result('20_3'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id text, dept integer)) citus_insert_select_subquery
SET citus.force_max_query_parallelization TO off;
-- CTE inside the UPDATE statement
UPDATE
second_distributed_table
SET dept =
UPDATE
second_distributed_table
SET dept =
(WITH vals AS (
SELECT DISTINCT tenant_id::int FROM distributed_table
) select * from vals where tenant_id = 8 )
) select * from vals where tenant_id = 8 )
WHERE dept = 8;
DEBUG: generating subplan 24_1 for CTE vals: SELECT DISTINCT (tenant_id)::integer AS tenant_id FROM with_dml.distributed_table
DEBUG: Plan 24 query after replacing subqueries and CTEs: UPDATE with_dml.second_distributed_table SET dept = (SELECT vals.tenant_id FROM (SELECT intermediate_result.tenant_id FROM read_intermediate_result('24_1'::text, 'binary'::citus_copy_format) intermediate_result(tenant_id integer)) vals WHERE (vals.tenant_id OPERATOR(pg_catalog.=) 8)) WHERE (dept OPERATOR(pg_catalog.=) 8)
-- Subquery inside the UPDATE statement
UPDATE
second_distributed_table
SET dept =
UPDATE
second_distributed_table
SET dept =
(SELECT DISTINCT tenant_id::int FROM distributed_table WHERE tenant_id = '9')
WHERE dept = 8;
DEBUG: generating subplan 26_1 for subquery SELECT DISTINCT (tenant_id)::integer AS tenant_id FROM with_dml.distributed_table WHERE (tenant_id OPERATOR(pg_catalog.=) '9'::text)

View File

@ -10,9 +10,9 @@ SELECT create_reference_table('with_join.reference_table');
INSERT INTO reference_table VALUES (6), (7);
SET citus.enable_repartition_joins TO on;
-- Two colocated CTE under a non-colocated join
-- Two colocated CTE under a non-colocated join
WITH colocated_1 AS (
SELECT
SELECT
users_table.user_id, events_table.value_2
FROM
users_table, events_table
@ -20,14 +20,14 @@ WITH colocated_1 AS (
users_table.user_id = events_table.user_id AND event_type IN (1, 2, 3)
),
colocated_2 AS (
SELECT
SELECT
users_table.user_id, events_table.value_2
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.user_id AND event_type IN (4, 5, 6)
)
SELECT colocated_1.user_id, count(*)
SELECT colocated_1.user_id, count(*)
FROM
colocated_1, colocated_2
WHERE
@ -46,9 +46,9 @@ ORDER BY
6 | 6710
(6 rows)
-- Two non-colocated CTE under a co-located join
-- Two non-colocated CTE under a co-located join
WITH non_colocated_1 AS (
SELECT
SELECT
users_table.user_id
FROM
users_table, events_table
@ -56,14 +56,14 @@ WITH non_colocated_1 AS (
users_table.user_id = events_table.value_2 AND event_type IN (1, 2, 3)
),
non_colocated_2 AS (
SELECT
SELECT
users_table.user_id
FROM
users_table, events_table
WHERE
users_table.user_id = events_table.value_2 AND event_type IN (4, 5, 6)
)
SELECT non_colocated_1.user_id, count(*)
SELECT non_colocated_1.user_id, count(*)
FROM
non_colocated_1, non_colocated_2
WHERE
@ -81,7 +81,6 @@ ORDER BY
1 | 6272
(5 rows)
-- Subqueries in WHERE and FROM are mixed
-- In this query, only subquery in WHERE is not a colocated join
-- but we're able to recursively plan that as well
@ -121,12 +120,12 @@ WITH users_events AS (
event_type
FROM
events_table
WHERE
user_id < 100
GROUP BY
1
ORDER BY
1
WHERE
user_id < 100
GROUP BY
1
ORDER BY
1
LIMIT 10
)
SELECT
@ -139,9 +138,9 @@ SELECT
DISTINCT uid
FROM
users_events
ORDER BY
ORDER BY
1 DESC
LIMIT
LIMIT
5;
uid
-----
@ -162,9 +161,9 @@ FROM
cte
LEFT JOIN
events_table ON cte.user_id = events_table.user_id
ORDER BY
ORDER BY
1,2,3
LIMIT
LIMIT
5;
ERROR: cannot pushdown the subquery
DETAIL: Complex subqueries and CTEs cannot be in the outer part of the outer join
@ -178,9 +177,9 @@ FROM
cte
RIGHT JOIN
events_table ON cte.user_id = events_table.user_id
ORDER BY
ORDER BY
1,2,3
LIMIT
LIMIT
5;
user_id | time | event_type
---------+---------------------------------+------------
@ -198,12 +197,12 @@ WITH cte AS (
SELECT
cte.user_id, cte.time, events_table.event_type
FROM
events_table
events_table
LEFT JOIN
cte ON cte.user_id = events_table.user_id
ORDER BY
ORDER BY
1,2,3
LIMIT
LIMIT
5;
user_id | time | event_type
---------+---------------------------------+------------
@ -221,12 +220,12 @@ WITH cte AS (
SELECT
cte.user_id, cte.time, events_table.event_type
FROM
events_table
events_table
RIGHT JOIN
cte ON cte.user_id = events_table.user_id
ORDER BY
ORDER BY
1,2,3
LIMIT
LIMIT
5;
ERROR: cannot pushdown the subquery
DETAIL: Complex subqueries and CTEs cannot be in the outer part of the outer join
@ -237,12 +236,12 @@ WITH cte AS (
SELECT
cte.user_id, cte.time, events_table.event_type
FROM
events_table
events_table
FULL JOIN
cte ON cte.user_id = events_table.user_id
ORDER BY
ORDER BY
1,2,3
LIMIT
LIMIT
5;
ERROR: cannot pushdown the subquery
DETAIL: Complex subqueries and CTEs cannot be in the outer part of the outer join

View File

@ -42,9 +42,9 @@ WITH users_events AS (
WHERE
u_events.user_id = events_table.user_id
)
SELECT
*
FROM
SELECT
*
FROM
users_events
ORDER BY
1, 2
@ -92,17 +92,16 @@ WITH users_events AS (
GROUP BY
users_table.user_id,
events_table.event_type
)
SELECT
SELECT
uid, event_type, value_2, value_3
FROM
(
(
SELECT
SELECT
user_id as uid
FROM
users_events
FROM
users_events
) users
join
events_table
@ -110,45 +109,45 @@ WITH users_events AS (
users.uid = events_table.event_type
) a
)
SELECT
*
FROM
SELECT
*
FROM
users_events
ORDER BY
1, 3, 2, 4
LIMIT 100
)
SELECT
*
FROM
SELECT
*
FROM
users_events
LIMIT 90
)
SELECT
*
FROM
SELECT
*
FROM
users_events
LIMIT 50
)
SELECT
SELECT
uid, event_type, value_2, sum(value_3) as sum_3
FROM
FROM
users_events
GROUP BY
1, 2, 3
LIMIT 40
)
SELECT
SELECT
uid, event_type, sum(value_2) as sum_2, sum(sum_3) as sum_3
FROM
FROM
users_events
GROUP BY
1, 2
LIMIT 30
LIMIT 30
)
SELECT
SELECT
uid, avg(event_type), sum(sum_2), sum(sum_3)
FROM
FROM
users_events
GROUP BY
1;
@ -210,7 +209,7 @@ WITH users_events AS (
*
FROM
users_events_2_3
UNION
UNION
SELECT
*
FROM
@ -221,8 +220,8 @@ WITH users_events AS (
FROM
merged_users
)
SELECT
*
SELECT
*
FROM
users_events
ORDER BY
@ -305,14 +304,14 @@ WITH users_events AS (
*
FROM
users_events_2_3
UNION
UNION
SELECT
*
FROM
users_events_4
)
SELECT
*
SELECT
*
FROM
users_events
ORDER BY

Some files were not shown because too many files have changed in this diff Show More