diff --git a/src/test/regress/expected/multi_subquery_behavioral_analytics.out b/src/test/regress/expected/multi_subquery_behavioral_analytics.out index f510949ef..f6b1638a2 100644 --- a/src/test/regress/expected/multi_subquery_behavioral_analytics.out +++ b/src/test/regress/expected/multi_subquery_behavioral_analytics.out @@ -382,7 +382,12 @@ ORDER BY ( SELECT users_table.user_id, - CASE WHEN events_table.event_type > 10 AND events_table.event_type < 12 THEN 'action=>1' ELSE 'action=>2' END AS event, + CASE + WHEN + events_table.event_type > 10 AND events_table.event_type < 12 + THEN 'action=>1' + ELSE 'action=>2' + END AS event, events_table.time FROM users_table, @@ -557,7 +562,7 @@ HINT: Consider joining tables on partition column and have equal filter on join SELECT user_id, value_2 FROM users_table WHERE value_1 > 101 AND value_1 < 110 AND value_2 >= 5 - AND EXISTS (SELECT user_id FROM events_table WHERE event_type>101 AND event_type < 110 AND value_3 > 100 AND user_id=users_table.user_id); + AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 101 AND event_type < 110 AND value_3 > 100 AND user_id = users_table.user_id); ERROR: could not run distributed query with join types other than INNER or OUTER JOINS HINT: Consider joining tables on partition column and have equal filter on joining columns. ------------------------------------ @@ -567,7 +572,7 @@ HINT: Consider joining tables on partition column and have equal filter on join SELECT user_id, value_2 FROM users_table WHERE value_1 = 101 AND value_2 >= 5 - AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id=users_table.user_id); + AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id = users_table.user_id); ERROR: could not run distributed query with subquery outside the FROM clause HINT: Consider using an equality filter on the distributed table's partition column. ------------------------------------ @@ -577,8 +582,8 @@ HINT: Consider using an equality filter on the distributed table's partition co SELECT user_id, value_2 FROM users_table WHERE value_1 > 100 AND value_2 >= 5 - AND EXISTS (SELECT user_id FROM events_table WHERE event_type!=100 AND value_3 > 100 AND user_id=users_table.user_id) - AND EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id=users_table.user_id); + AND EXISTS (SELECT user_id FROM events_table WHERE event_type != 100 AND value_3 > 100 AND user_id = users_table.user_id) + AND EXISTS (SELECT user_id FROM events_table WHERE event_type = 101 AND value_3 > 100 AND user_id = users_table.user_id); ERROR: could not run distributed query with join types other than INNER or OUTER JOINS HINT: Consider joining tables on partition column and have equal filter on joining columns. ------------------------------------ @@ -587,8 +592,8 @@ HINT: Consider joining tables on partition column and have equal filter on join ------------------------------------ SELECT user_id, value_2 FROM users_table WHERE value_2 >= 5 - AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 100 AND event_type <= 300 AND value_3 > 100 AND user_id=users_table.user_id) - 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); + AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 100 AND event_type <= 300 AND value_3 > 100 AND user_id = users_table.user_id) + 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: could not run distributed query with join types other than INNER or OUTER JOINS HINT: Consider joining tables on partition column and have equal filter on joining columns. ------------------------------------ @@ -616,10 +621,17 @@ HINT: Consider using an equality filter on the distributed table's partition co ------------------------------------ SELECT user_id, value_1 from ( - SELECT user_id, value_1 From users_table - WHERE value_2 > 100 and user_id = 15 GROUP BY value_1, user_id HAVING count(*) > 1 + SELECT + user_id, value_1 From users_table + WHERE + value_2 > 100 and user_id = 15 + GROUP BY + value_1, user_id + HAVING + count(*) > 1 ) AS a -ORDER BY user_id ASC, value_1 ASC; +ORDER BY + user_id ASC, value_1 ASC; user_id | value_1 ---------+--------- 15 | 212 @@ -633,10 +645,16 @@ ORDER BY user_id ASC, value_1 ASC; -- same query with additional filter to make it not router plannable SELECT user_id, value_1 from ( - SELECT user_id, value_1 From users_table - WHERE value_2 > 100 and (user_id = 15 OR user_id = 16) GROUP BY value_1, user_id HAVING count(*) > 1 + SELECT + user_id, value_1 From users_table + WHERE + value_2 > 100 and (user_id = 15 OR user_id = 16) + GROUP BY + value_1, user_id + HAVING count(*) > 1 ) AS a -ORDER BY user_id ASC, value_1 ASC; +ORDER BY + user_id ASC, value_1 ASC; user_id | value_1 ---------+--------- 15 | 212 @@ -658,12 +676,15 @@ ORDER BY user_id ASC, value_1 ASC; SELECT user_id FROM events_table WHERE - event_type = 16 AND value_2 > 50 -AND user_id IN - (SELECT user_id - FROM users_table - WHERE - value_1 = 15 AND value_2 > 25); + event_type = 16 AND value_2 > 50 AND + user_id IN + (SELECT + user_id + FROM + users_table + WHERE + value_1 = 15 AND value_2 > 25 + ); ERROR: could not run distributed query with join types other than INNER or OUTER JOINS HINT: Consider joining tables on partition column and have equal filter on joining columns. ------------------------------------ @@ -684,10 +705,15 @@ SELECT user_id FROM user_id FROM events_table - WHERE event_type = 901 - GROUP BY user_id HAVING count(*) > 3 + WHERE + event_type = 901 + GROUP BY + user_id + HAVING + count(*) > 3 ) AS a -ORDER BY user_id; +ORDER BY + user_id; user_id --------- 57 @@ -710,7 +736,8 @@ FROM 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 - WHERE users_table.value_1 < 50; + WHERE + users_table.value_1 < 50; -- get some statistics from the aggregated results to ensure the results are correct SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets; count | count | avg @@ -723,13 +750,17 @@ DROP TABLE assets; -- original query that fails SELECT count(*) FROM ( -SELECT user_id -FROM users_table -WHERE (value_1 = '5' - OR value_1 = '13') -AND user_id NOT IN (select user_id from users_table where value_1 = '3') -GROUP BY user_id -HAVING count(distinct value_1) = 2 + SELECT + user_id + FROM + users_table + WHERE + (value_1 = '5' OR value_1 = '13') AND + user_id NOT IN (select user_id from users_table where value_1 = '3') + GROUP BY + user_id + HAVING + count(distinct value_1) = 2 ) as foo; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. @@ -742,8 +773,10 @@ SELECT subquery_count FROM users_table WHERE (value_1 = '5' OR value_1 = '13') - GROUP BY user_id - HAVING count(distinct value_1) = 2) as a + GROUP BY + user_id + HAVING + count(distinct value_1) = 2) as a LEFT JOIN (SELECT user_id @@ -751,8 +784,14 @@ SELECT subquery_count FROM users_table WHERE (value_1 = '3') - GROUP BY user_id) as b on a.user_id = b.user_id WHERE b.user_id IS NULL - GROUP BY a.user_id) AS inner_subquery; + GROUP BY + user_id) as b + ON a.user_id = b.user_id + WHERE + b.user_id IS NULL + GROUP BY + a.user_id + ) AS inner_subquery; subquery_count ---------------- 1 @@ -767,8 +806,10 @@ FROM ( users_table WHERE (value_1 = '5' OR value_1 = '13') - GROUP BY user_id - HAVING count(distinct value_1) = 2 + GROUP BY + user_id + HAVING + count(distinct value_1) = 2 ) as a LEFT JOIN ( SELECT @@ -777,10 +818,13 @@ FROM ( users_table WHERE (value_1 = '3') - GROUP BY user_id) AS b + GROUP BY + user_id) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NULL -GROUP BY a.user_id; +WHERE + b.user_id IS NULL +GROUP BY + a.user_id; subquery_count ---------------- 1 @@ -849,9 +893,11 @@ FROM ( ORDER BY time LIMIT 1 ) e5 ON true -where e1.user_id = 1 -group by e1.user_id -limit 1; +WHERE + e1.user_id = 1 +GROUP BY + e1.user_id +LIMIT 1; user_id | viewed_homepage | use_demo | entered_credit_card | submit_card_info | see_bought_screen ---------+-----------------+----------+---------------------+------------------+------------------- 1 | 1 | | | | @@ -1015,14 +1061,16 @@ LIMIT 15; -- avg expression used on order by SELECT a.user_id, avg(b.value_2) as subquery_avg FROM ( - SELECT + SELECT user_id FROM - users_table - WHERE - (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN ( SELECT @@ -1032,9 +1080,12 @@ FROM ( WHERE (value_1 > 3)) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NOT NULL -GROUP BY a.user_id -ORDER BY avg(b.value_3), 2, 1 +WHERE + b.user_id IS NOT NULL +GROUP BY + a.user_id +ORDER BY + avg(b.value_3), 2, 1 LIMIT 5; user_id | subquery_avg ---------+---------------------- @@ -1045,14 +1096,14 @@ LIMIT 5; 77 | 449.9313725490196078 (5 rows) --- add having +-- add having to the same query SELECT a.user_id, avg(b.value_2) as subquery_avg FROM ( SELECT user_id FROM - users_table - WHERE + users_table + WHERE (value_1 > 5) GROUP BY user_id HAVING count(distinct value_1) > 88 @@ -1065,10 +1116,14 @@ FROM ( WHERE (value_1 > 3)) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NOT NULL -GROUP BY a.user_id -HAVING sum(b.value_3) > 50000 -ORDER BY avg(b.value_3), 2, 1 +WHERE + b.user_id IS NOT NULL +GROUP BY + a.user_id +HAVING + sum(b.value_3) > 50000 +ORDER BY + avg(b.value_3), 2, 1 LIMIT 5; user_id | subquery_avg ---------+---------------------- @@ -1082,21 +1137,33 @@ LIMIT 5; -- avg on the value_3 is not a resjunk SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3) FROM - (SELECT user_id - FROM users_table - WHERE (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + (SELECT + user_id + FROM + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN - (SELECT user_id, value_2, value_3 - FROM users_table - WHERE (value_1 > 3) + ( + SELECT + user_id, value_2, value_3 + FROM + users_table + WHERE + (value_1 > 3) ) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NOT NULL -GROUP BY a.user_id -ORDER BY avg(b.value_3) DESC, 2, 1 +WHERE + b.user_id IS NOT NULL +GROUP BY + a.user_id +ORDER BY + avg(b.value_3) DESC, 2, 1 LIMIT 5; user_id | subquery_avg | avg ---------+----------------------+------------------ @@ -1113,18 +1180,25 @@ SELECT u.user_id, sub.value_2, sub.value_3, COUNT(e2.user_id) counts FROM users_table u LEFT OUTER JOIN LATERAL - (SELECT * - FROM events_table e1 - WHERE e1.user_id = u.user_id - ORDER BY e1.value_3 DESC - LIMIT 1 + (SELECT + * + FROM + events_table e1 + WHERE + e1.user_id = u.user_id + ORDER BY + e1.value_3 DESC + LIMIT 1 ) sub ON true LEFT OUTER JOIN events_table e2 - ON e2.user_id = sub.user_id -WHERE e2.value_2 > 10 and e2.value_2 < 50 AND u.value_2 > 10 and u.value_2 < 50 -GROUP BY u.user_id, sub.value_2, sub.value_3 -ORDER BY 4 DESC, 1 DESC, 2 ASC, 3 ASC + ON e2.user_id = sub.user_id +WHERE + e2.value_2 > 10 AND e2.value_2 < 50 AND u.value_2 > 10 AND u.value_2 < 50 +GROUP BY + u.user_id, sub.value_2, sub.value_3 +ORDER BY + 4 DESC, 1 DESC, 2 ASC, 3 ASC LIMIT 10; user_id | value_2 | value_3 | counts ---------+---------+---------+-------- @@ -1146,12 +1220,16 @@ SELECT count(*) as users_count FROM events_table JOIN - (SELECT DISTINCT user_id - FROM users_table - ) as distinct_users - ON distinct_users.user_id = events_table.user_id -GROUP BY distinct_users.user_id -ORDER BY users_count desc, avg_type DESC + (SELECT + DISTINCT user_id + FROM + users_table + ) as distinct_users + ON distinct_users.user_id = events_table.user_id +GROUP BY + distinct_users.user_id +ORDER BY + users_count desc, avg_type DESC LIMIT 5; avg_type | users_count ----------------------+------------- @@ -1170,13 +1248,17 @@ FROM events_table JOIN (SELECT distinct_users.user_id, count(1) as ct FROM - (SELECT user_id - FROM users_table + (SELECT + user_id + FROM + users_table ) as distinct_users - GROUP BY distinct_users.user_id + GROUP BY + distinct_users.user_id ) as users_count ON users_count.user_id = events_table.user_id -ORDER BY users_count.ct desc, event_type DESC +ORDER BY + users_count.ct desc, event_type DESC LIMIT 5; event_type | ct ------------+----- @@ -1190,17 +1272,25 @@ LIMIT 5; --- now, test (subquery JOIN subquery) SELECT n1.user_id, count_1, total_count FROM - (SELECT user_id, count(1) as count_1 - FROM users_table - GROUP BY user_id + (SELECT + user_id, count(1) as count_1 + FROM + users_table + GROUP BY + user_id ) n1 INNER JOIN - (SELECT user_id, count(1) as total_count - FROM events_table - GROUP BY user_id, event_type + ( + SELECT + user_id, count(1) as total_count + FROM + events_table + GROUP BY + user_id, event_type ) n2 ON (n2.user_id = n1.user_id) -ORDER BY total_count DESC, count_1 DESC, 1 DESC +ORDER BY + total_count DESC, count_1 DESC, 1 DESC LIMIT 10; user_id | count_1 | total_count ---------+---------+------------- @@ -1218,17 +1308,26 @@ LIMIT 10; SELECT a.user_id, avg(b.value_2) as subquery_avg FROM - (SELECT user_id - FROM users_table - WHERE (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + (SELECT + user_id + FROM + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN - (SELECT DISTINCT ON (user_id) user_id, value_2, value_3 - FROM users_table - WHERE (value_1 > 3) - ORDER BY 1,2,3 + (SELECT + DISTINCT ON (user_id) user_id, value_2, value_3 + FROM + users_table + WHERE + (value_1 > 3) + ORDER BY + 1,2,3 ) AS b ON a.user_id = b.user_id WHERE b.user_id IS NOT NULL @@ -1248,17 +1347,26 @@ LIMIT 5; -- when used in target list SELECT a.user_id, avg(b.value_2) as subquery_avg FROM - (SELECT user_id - FROM users_table - WHERE (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + (SELECT + user_id + FROM + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN - (SELECT DISTINCT ON (value_2) value_2 , user_id, value_3 - FROM users_table - WHERE (value_1 > 3) - ORDER BY 1,2,3 + (SELECT + DISTINCT ON (value_2) value_2 , user_id, value_3 + FROM + users_table + WHERE + (value_1 > 3) + ORDER BY + 1,2,3 ) AS b USING (user_id) GROUP BY user_id; @@ -1266,22 +1374,34 @@ ERROR: cannot push down this subquery DETAIL: Distinct on columns without partition column is currently unsupported SELECT a.user_id, avg(b.value_2) as subquery_avg FROM - (SELECT user_id - FROM users_table - WHERE (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + (SELECT + user_id + FROM + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN - (SELECT DISTINCT ON (value_2, user_id) value_2 , user_id, value_3 - FROM users_table - WHERE (value_1 > 3) - ORDER BY 1,2,3 + (SELECT + DISTINCT ON (value_2, user_id) value_2 , user_id, value_3 + FROM + users_table + WHERE + (value_1 > 3) + ORDER BY + 1,2,3 ) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NOT NULL -GROUP BY a.user_id -ORDER BY avg(b.value_3), 2, 1 +WHERE + b.user_id IS NOT NULL +GROUP BY + a.user_id +ORDER BY + avg(b.value_3), 2, 1 LIMIT 5; user_id | subquery_avg ---------+---------------------- @@ -1297,22 +1417,30 @@ FROM (SELECT * FROM ( - (SELECT event_type, user_id as a_user_id FROM events_table) AS a - JOIN - (SELECT - ma.user_id AS user_id, ma.value_2 AS value_2, - (GREATEST(coalesce((ma.value_3 * ma.value_2 ) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob - FROM users_table AS ma - WHERE (ma.value_2 > 100) - ORDER BY prob DESC, user_id DESC - LIMIT 10 - ) AS ma - ON (a.a_user_id = ma.user_id) - ) AS inner_sub - ORDER BY prob DESC, user_id DESC + (SELECT + event_type, user_id as a_user_id + FROM + events_table) AS a + JOIN + (SELECT + ma.user_id AS user_id, ma.value_2 AS value_2, + (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob + FROM + users_table AS ma + WHERE + (ma.value_2 > 100) + ORDER BY + prob DESC, user_id DESC + LIMIT 10 + ) AS ma + ON (a.a_user_id = ma.user_id) + ) AS inner_sub + ORDER BY + prob DESC, user_id DESC LIMIT 10 ) AS outer_sub -ORDER BY prob DESC, event_type DESC, user_id DESC +ORDER BY + prob DESC, event_type DESC, user_id DESC LIMIT 10; user_id | event_type ---------+------------ @@ -1332,18 +1460,25 @@ LIMIT 10; -- ordering difference in the previous one's inner query SELECT user_id, event_type FROM - (SELECT event_type, user_id as a_user_id FROM events_table) AS a - JOIN - (SELECT - ma.user_id AS user_id, ma.value_2 AS value_2, - (GREATEST(coalesce((ma.value_3 * ma.value_2 ) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob - FROM users_table AS ma - WHERE (ma.value_2 > 100) - ORDER BY prob DESC, user_id DESC + (SELECT + event_type, user_id as a_user_id + FROM + events_table) AS a + JOIN + (SELECT + ma.user_id AS user_id, ma.value_2 AS value_2, + (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob + FROM + users_table AS ma + WHERE + (ma.value_2 > 100) + ORDER BY + prob DESC, user_id DESC LIMIT 10 ) AS ma ON (a.a_user_id = ma.user_id) -ORDER BY prob DESC, event_type DESC, user_id DESC +ORDER BY + prob DESC, event_type DESC, user_id DESC LIMIT 10; user_id | event_type ---------+------------ @@ -1365,22 +1500,31 @@ FROM (SELECT * FROM ( - (SELECT event_type, user_id as a_user_id FROM events_table) AS a - JOIN - (SELECT - ma.user_id AS user_id, ma.value_2 AS value_2, - (GREATEST(coalesce((ma.value_3 * ma.value_2 ) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob - FROM users_table AS ma - WHERE (ma.value_2 > 100) - ORDER BY prob DESC, user_id DESC - LIMIT 10 - ) AS ma - ON (a.a_user_id = ma.user_id) - ) AS inner_sub - ORDER BY prob DESC, event_type DESC, user_id DESC + (SELECT + event_type, user_id as a_user_id + FROM + events_table + ) AS a + JOIN + (SELECT + ma.user_id AS user_id, ma.value_2 AS value_2, + (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob + FROM + users_table AS ma + WHERE + (ma.value_2 > 100) + ORDER BY + prob DESC, user_id DESC + LIMIT 10 + ) AS ma + ON (a.a_user_id = ma.user_id) + ) AS inner_sub + ORDER BY + prob DESC, event_type DESC, user_id DESC LIMIT 10 ) AS outer_sub -ORDER BY prob DESC, event_type DESC, user_id DESC +ORDER BY + prob DESC, event_type DESC, user_id DESC LIMIT 10; user_id | event_type ---------+------------ @@ -1422,81 +1566,64 @@ CREATE OR REPLACE FUNCTION array_index(ANYARRAY, ANYELEMENT) $$ LANGUAGE sql; SELECT * FROM - (SELECT * - FROM - ( - (SELECT - user_id AS user_id_e, - event_type as event_type_e - FROM - events_table - ) AS ma_e - JOIN - (SELECT - value_2, - value_3, - user_id - FROM - (SELECT * - FROM - ( - (SELECT user_id_p AS user_id - FROM - (SELECT * - FROM - ( - (SELECT user_id AS user_id_p - FROM events_table - WHERE (event_type IN (1, 2, 3, 4, 5)) - ) AS ma_p - JOIN - (SELECT user_id AS user_id_a - FROM users_table - WHERE (value_2 % 5 = 1) - ) AS a - ON (a.user_id_a = ma_p.user_id_p) - ) - ) AS a_ma_p - ) AS inner_filter_q - JOIN - (SELECT - value_2, - value_3, - user_id AS user_id_ck - FROM events_table - WHERE event_type = ANY(ARRAY [10, 11, 12]) - ORDER BY - value_3 ASC, - user_id_ck DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10 - ) AS ma_ck - ON (ma_ck.user_id_ck = inner_filter_q.user_id) - ) AS inner_sub_q - ORDER BY - value_3 ASC, - user_id_ck DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10 - ) AS outer_sub_q - ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10) AS inner_search_q - ON (ma_e.user_id_e = inner_search_q.user_id) - ) AS outer_inner_sub_q - ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, - event_type_e DESC - LIMIT 10) AS outer_outer_sub_q -ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, - event_type_e DESC + (SELECT * + FROM ( + (SELECT user_id AS user_id_e, + event_type AS event_type_e + FROM events_table ) AS ma_e + JOIN + (SELECT value_2, + value_3, + user_id + FROM + (SELECT * + FROM ( + (SELECT user_id_p AS user_id + FROM + (SELECT * + FROM ( + (SELECT + user_id AS user_id_p + FROM + events_table + WHERE + (event_type IN (1,2,3,4,5)) ) AS ma_p + JOIN + (SELECT + user_id AS user_id_a + FROM + users_table + WHERE + (value_2 % 5 = 1) ) AS a + ON (a.user_id_a = ma_p.user_id_p) ) ) AS a_ma_p ) AS inner_filter_q + JOIN + (SELECT + value_2, value_3, user_id AS user_id_ck + FROM + events_table + WHERE + event_type = ANY(ARRAY [10, 11, 12]) + ORDER BY + value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10 ) + AS ma_ck ON (ma_ck.user_id_ck = inner_filter_q.user_id) ) + AS inner_sub_q + ORDER BY + value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10 ) + AS outer_sub_q + ORDER BY + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10) + AS inner_search_q + ON (ma_e.user_id_e = inner_search_q.user_id) ) + AS outer_inner_sub_q + ORDER BY + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC + LIMIT 10) +AS outer_outer_sub_q +ORDER BY + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC LIMIT 10; user_id_e | event_type_e | value_2 | value_3 | user_id -----------+--------------+---------+---------+--------- @@ -1518,71 +1645,68 @@ SELECT * FROM ( (SELECT - user_id AS user_id_e, - event_type as event_type_e - FROM - events_table - ) AS ma_e - JOIN - (SELECT - value_2, - value_3, - user_id - FROM - (SELECT * + user_id AS user_id_e, event_type as event_type_e + FROM + events_table + ) AS ma_e + JOIN + (SELECT + value_2, value_3, user_id + FROM + (SELECT + * + FROM + ( + (SELECT + user_id_p AS user_id FROM - ( - (SELECT user_id_p AS user_id - FROM - (SELECT * - FROM - ( - (SELECT user_id AS user_id_p - FROM events_table - WHERE (event_type IN (1, 2, 3, 4, 5)) - ) AS ma_p - JOIN - (SELECT user_id AS user_id_a - FROM users_table - WHERE (value_2 % 5 = 1) - ) AS a - ON (a.user_id_a = ma_p.user_id_p) - ) - ) AS a_ma_p - ) AS inner_filter_q - JOIN - (SELECT - value_2, - value_3, - user_id AS user_id_ck - FROM events_table - WHERE event_type = ANY(ARRAY [10, 11, 12]) - ORDER BY - value_3 ASC, - user_id_ck DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10 - ) AS ma_ck - ON (ma_ck.user_id_ck = inner_filter_q.user_id) - ) AS inner_sub_q - ORDER BY - value_3 ASC, - user_id_ck DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10 - ) AS outer_sub_q - ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10) AS inner_search_q - ON (ma_e.user_id_e = inner_search_q.user_id) - ) AS outer_inner_sub_q + (SELECT + * + FROM + ( + (SELECT + user_id AS user_id_p + FROM + events_table + WHERE + (event_type IN (1, 2, 3, 4, 5)) + ) AS ma_p + JOIN + (SELECT + user_id AS user_id_a + FROM + users_table + WHERE + (value_2 % 5 = 1) + ) AS a + ON (a.user_id_a = ma_p.user_id_p) + ) + ) AS a_ma_p + ) AS inner_filter_q + JOIN + (SELECT + value_2, value_3, user_id AS user_id_ck + FROM + events_table + WHERE + event_type = ANY(ARRAY [10, 11, 12]) + ORDER BY + value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10 + ) AS ma_ck + ON (ma_ck.user_id_ck = inner_filter_q.user_id) + ) AS inner_sub_q + ORDER BY + value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10 + ) AS outer_sub_q + ORDER BY + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10) AS inner_search_q + ON (ma_e.user_id_e = inner_search_q.user_id) + ) AS outer_inner_sub_q ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, - event_type_e DESC + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC LIMIT 10; user_id_e | event_type_e | value_2 | value_3 | user_id -----------+--------------+---------+---------+--------- @@ -1679,11 +1803,13 @@ SELECT user_id, array_length(events_table, 1) FROM ( SELECT user_id, array_agg(event ORDER BY time) AS events_table 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 e.event_type IN (100, 101, 102) + 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 e.event_type IN (100, 101, 102) ) t GROUP BY user_id ) q @@ -1705,11 +1831,13 @@ SELECT user_id, array_length(events_table, 1) FROM ( SELECT user_id, array_agg(event ORDER BY time) AS events_table 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 e.event_type IN (100, 101, 102) + 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 e.event_type IN (100, 101, 102) ) t GROUP BY user_id ) q @@ -1731,11 +1859,13 @@ SELECT user_id, array_length(events_table, 1) FROM ( SELECT user_id, array_agg(event ORDER BY time) AS events_table 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 e.event_type IN (100, 101, 102) + 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 e.event_type IN (100, 101, 102) ) t GROUP BY user_id ) q @@ -1757,11 +1887,13 @@ SELECT user_id, array_length(events_table, 1) FROM ( SELECT user_id, array_agg(event ORDER BY time) AS events_table 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 e.event_type IN (100, 101, 102) + 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 e.event_type IN (100, 101, 102) ) t GROUP BY user_id ) q diff --git a/src/test/regress/expected/multi_subquery_complex_queries.out b/src/test/regress/expected/multi_subquery_complex_queries.out index 636a0f553..7c00c868f 100644 --- a/src/test/regress/expected/multi_subquery_complex_queries.out +++ b/src/test/regress/expected/multi_subquery_complex_queries.out @@ -15,47 +15,62 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; types | sumofeventtype -------+---------------- 0 | 115 @@ -69,48 +84,58 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; types | sumofeventtype -------+---------------- 0 | 115 @@ -125,48 +150,58 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."user_id" * 2 - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."user_id" * 2 + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- not supported since events_subquery_2 doesn't have partition key on the target list @@ -174,126 +209,81 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."value_2" as user_id - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."value_2" as user_id + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. --- not supported since events_subquery_2 doesn't have partition key on the target list -SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType -FROM - ( SELECT *, random() - FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT * - FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 - GROUP BY "t1"."user_id") AS t) "q" -INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; - types | sumofeventtype --------+---------------- - 0 | 115 - 1 | 82 - 2 | 160 - 3 | 158 -(4 rows) - -- we can support arbitrary subqueries within UNIONs SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT *, random() - FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT + *, random() + FROM + (SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT * - FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events + FROM ( + (SELECT + * + FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION (SELECT * FROM @@ -315,22 +305,35 @@ FROM UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) + ) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; types | sumofeventtype -------+---------------- 0 | 115 @@ -341,25 +344,24 @@ ORDER BY types; -- not supported since events_subquery_5 is not joined on partition key SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT *, random() - FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT + *, random() + FROM + (SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT * - FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events + FROM ( + (SELECT + * + FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION (SELECT * FROM @@ -381,22 +383,35 @@ FROM UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) + ) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- not supported since the join is not equi join @@ -404,47 +419,62 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id != q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id != q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- not supported since subquery 3 includes a JOIN with non-equi join @@ -452,48 +482,62 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events", users_table as "users" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) AND users.user_id != events.user_id ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."time", 1 AS event, "events"."value_2" as user_id - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events", users_table as "users" - WHERE event_type IN (20, 21, 22, 23, 24, 25) AND users.user_id != events.user_id) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- similar query with more union statements (to enable UNION tree become larger) @@ -501,58 +545,72 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 4 AS event - FROM events_table as "events" - WHERE event_type IN (31, 32, 33, 34, 35, 36)) events_subquery_5) + (SELECT + "events"."user_id", "events"."time", 4 AS event + FROM + events_table as "events" + WHERE + event_type IN (31, 32, 33, 34, 35, 36)) events_subquery_5) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 5 AS event - FROM events_table as "events" - WHERE event_type IN (37, 38, 39, 40, 41, 42)) events_subquery_6) + (SELECT + "events"."user_id", "events"."time", 5 AS event + FROM + events_table as "events" + WHERE + event_type IN (37, 38, 39, 40, 41, 42)) events_subquery_6) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 6 AS event - FROM events_table as "events" - WHERE event_type IN (50, 51, 52, 53, 54, 55)) events_subquery_6) + (SELECT + "events"."user_id", "events"."time", 6 AS event + FROM + events_table as "events" + WHERE + event_type IN (50, 51, 52, 53, 54, 55)) events_subquery_6) ) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN @@ -579,40 +637,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION ALL - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION ALL + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN (SELECT "users"."user_id" @@ -633,46 +696,54 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION ALL (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t +ON (t.user_id = q.user_id)) as final_query GROUP BY types ORDER BY types; types | sumofeventtype @@ -688,40 +759,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION ALL - (SELECT * - FROM - (SELECT "events"."value_2", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."value_2", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION ALL + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN (SELECT "users"."user_id" @@ -737,46 +813,54 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION ALL (SELECT * FROM - (SELECT "events"."time", 3 AS event, 2 * "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" * 2 + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t +ON (t.user_id = q.user_id)) as final_query GROUP BY types ORDER BY types; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys @@ -784,60 +868,75 @@ DETAIL: Each relation should be joined with at least one another relation using -- union all with inner and left joins SELECT user_id, count(*) as cnt FROM - (SELECT first_query.user_id, - Random() + (SELECT first_query.user_id, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" + FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "first_query" INNER JOIN (SELECT "t"."user_id" FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t - LEFT OUTER JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + LEFT OUTER JOIN ( - SELECT DISTINCT "events"."user_id" as user_id - FROM events_table as "events" - WHERE event_type IN (35, 36, 37, 38) - GROUP BY user_id + SELECT + DISTINCT "events"."user_id" as user_id + FROM + events_table as "events" + WHERE + event_type IN (35, 36, 37, 38) + GROUP BY + user_id ) as t2 - on (t2.user_id = t.user_id) WHERE t2.user_id is NULL) as second_query - ON ("first_query".user_id = "second_query".user_id)) as final_query -GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; + ON (t2.user_id = t.user_id) WHERE t2.user_id is NULL) as second_query + ON ("first_query".user_id = "second_query".user_id)) as final_query +GROUP BY + user_id ORDER BY cnt DESC, user_id DESC +LIMIT 10; user_id | cnt ---------+----- 27 | 35 @@ -856,60 +955,75 @@ GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; -- union all with inner and left joins SELECT user_id, count(*) as cnt FROM - (SELECT first_query.user_id, - Random() + (SELECT first_query.user_id, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" + FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "first_query" INNER JOIN (SELECT "t"."user_id" FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t - LEFT OUTER JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + LEFT OUTER JOIN ( - SELECT DISTINCT "events"."user_id" as user_id - FROM events_table as "events" - WHERE event_type IN (35, 36, 37, 38) - GROUP BY user_id + SELECT + DISTINCT "events"."user_id" as user_id + FROM + events_table as "events" + WHERE + event_type IN (35, 36, 37, 38) + GROUP BY + user_id ) as t2 - on (t2.user_id > t.user_id) WHERE t2.user_id is NULL) as second_query - ON ("first_query".user_id = "second_query".user_id)) as final_query -GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; + ON (t2.user_id > t.user_id) WHERE t2.user_id is NULL) as second_query + ON ("first_query".user_id = "second_query".user_id)) as final_query +GROUP BY + user_id ORDER BY cnt DESC, user_id DESC +LIMIT 10; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- @@ -917,60 +1031,75 @@ DETAIL: Each relation should be joined with at least one another relation using -- SELECT user_id, count(*) as cnt FROM - (SELECT first_query.user_id, - Random() + (SELECT first_query.user_id, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" + FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "first_query" INNER JOIN (SELECT "t"."user_id" FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t - LEFT OUTER JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + LEFT OUTER JOIN ( - SELECT DISTINCT "events"."user_id" as user_id - FROM events_table as "events" - WHERE event_type IN (35, 36, 37, 38) - GROUP BY user_id + SELECT + DISTINCT "events"."user_id" as user_id + FROM + events_table as "events" + WHERE + event_type IN (35, 36, 37, 38) + GROUP BY + user_id ) as t2 - on (t2.user_id = t.user_id) WHERE t2.user_id is NULL) as second_query - ON ("first_query".user_id = "second_query".user_id)) as final_query -GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; + ON (t2.user_id = t.user_id) WHERE t2.user_id is NULL) as second_query + ON ("first_query".user_id = "second_query".user_id)) as final_query +GROUP BY + user_id ORDER BY cnt DESC, user_id DESC +LIMIT 10; user_id | cnt ---------+----- 27 | 35 @@ -985,106 +1114,44 @@ GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; 59 | 10 (10 rows) - -- - -- Unions, left / inner joins - -- -SELECT user_id, count(*) as cnt -FROM - (SELECT first_query.user_id, - Random() - FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT * - FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 - GROUP BY "t1"."user_id") AS t) "first_query" -INNER JOIN - (SELECT "t"."user_id" - FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t - left OUTER JOIN - (SELECT DISTINCT("events"."user_id") - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13) - GROUP BY user_id - ) as t2 on t2.user_id = t.user_id where t2.user_id is NULL) as second_query - ON ("first_query".user_id = "second_query".user_id)) as final_query -GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; - user_id | cnt ----------+----- - 66 | 15 - 23 | 12 - 98 | 9 - 22 | 9 - 83 | 8 - 78 | 8 - 32 | 8 - 89 | 6 - 80 | 6 - 75 | 6 -(10 rows) - -- Simple LATERAL JOINs with GROUP BYs in each side SELECT * FROM (SELECT "some_users_data".user_id, lastseen FROM - (SELECT user_id, - Max(time) AS lastseen + (SELECT user_id, max(time) AS lastseen FROM - (SELECT user_id, - time + (SELECT user_id, time FROM - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40) "events_1" - ORDER BY time DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40) "events_1" + ORDER BY + time DESC LIMIT 1000) "recent_events_1" - GROUP BY user_id - ORDER BY max(time) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(time) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 50 and users.value_2 < 55 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 50 and users.value_2 < 55 + LIMIT 1) "some_users_data" + ON TRUE + ORDER BY + lastseen DESC LIMIT 50) "some_users" - order BY user_id - limit 50; +order BY + user_id +LIMIT 50; user_id | lastseen ---------+--------------------------------- 19 | Tue Jan 21 05:23:09.26298 2014 @@ -1098,27 +1165,35 @@ FROM -- same query with subuqery joins in topmost select SELECT "some_users_data".user_id, lastseen FROM - (SELECT user_id, - Max(TIME) AS lastseen + (SELECT user_id, max(time) AS lastseen FROM - (SELECT user_id, - TIME + (SELECT user_id, time FROM - (SELECT user_id, - TIME - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40) "events_1" - ORDER BY TIME DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40) "events_1" + ORDER BY + time DESC LIMIT 1000) "recent_events_1" - GROUP BY user_id - ORDER BY max(TIME) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(TIME) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 50 and users.value_2 < 55 - LIMIT 1) "some_users_data" ON TRUE -ORDER BY user_id + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 50 and users.value_2 < 55 + LIMIT 1) "some_users_data" + ON TRUE +ORDER BY + user_id limit 50; user_id | lastseen ---------+--------------------------------- @@ -1131,104 +1206,134 @@ limit 50; (6 rows) -- not supported since JOIN is not on the partition key -SELECT * +SELECT "some_users_data".user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen - FROM - (SELECT user_id, - Max(time) AS lastseen + (SELECT user_id, max(time) AS lastseen FROM - (SELECT user_id, - time + (SELECT user_id, time FROM - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40) "events_1" - ORDER BY time DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40) "events_1" + ORDER BY + time DESC LIMIT 1000) "recent_events_1" - GROUP BY user_id - ORDER BY max(time) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(TIME) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."value_1" = "some_recent_users"."user_id" - AND users.value_2 > 50 and users.value_2 < 55 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC - LIMIT 50) "some_users" - order BY user_id - limit 50; + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."value_1" = "some_recent_users"."user_id" AND + users.value_2 > 50 and users.value_2 < 55 + LIMIT 1) "some_users_data" + ON TRUE +ORDER BY + user_id +limit 50; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- not supported since JOIN is not on the partition key -- see (2 * user_id as user_id) target list element -SELECT * +SELECT "some_users_data".user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen - FROM - (SELECT 2 * user_id as user_id, - (time) AS lastseen + (SELECT 2 * user_id as user_id, max(time) AS lastseen FROM - (SELECT user_id, - time + (SELECT user_id, time FROM - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40) "events_1" - ORDER BY time DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40) "events_1" + ORDER BY + time DESC LIMIT 1000) "recent_events_1" - ) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(TIME) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 50 and users.value_2 < 55 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC - LIMIT 50) "some_users" - order BY user_id - limit 50; + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 50 and users.value_2 < 55 + LIMIT 1) "some_users_data" + ON TRUE +ORDER BY + user_id +limit 50; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- LATERAL JOINs used with INNER JOINs SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 - ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) filter_users_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) + filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE - ORDER BY time DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 AND + user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" + ON TRUE + ORDER BY + time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" + ON TRUE + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; user_id | lastseen ---------+--------------------------------- 15 | Tue Jan 21 02:25:36.136461 2014 @@ -1249,37 +1354,50 @@ limit 10; -- SELECT "some_users_data".user_id, MAX(lastseen), count(*) FROM - (SELECT filter_users_1.user_id, - TIME AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) filter_users_1 JOIN LATERAL - (SELECT user_id, - TIME - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY TIME DESC - LIMIT 1) "last_events_1" ON TRUE - ORDER BY TIME DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true + ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true GROUP BY 1 ORDER BY 2, 1 DESC -limit 10; +LIMIT 10; user_id | max | count ---------+---------------------------------+------- 15 | Tue Jan 21 02:25:36.136461 2014 | 10 @@ -1290,186 +1408,265 @@ limit 10; -- not supported since the inner JOIN is not equi join SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id != "user_where_1_join_1".user_id)) filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- not supported since the inner JOIN is not on the partition key SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id", "users"."value_1" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id", "users"."value_1" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id = "user_where_1_join_1".value_1)) filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- not supported since upper LATERAL JOIN is not equi join SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id", "users"."value_1" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id", "users"."value_1" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id != filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id != filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- not supported since lower LATERAL JOIN is not on the partition key SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id", "users"."value_1" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id", "users"."value_1" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."value_1" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."value_1" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- NESTED INNER JOINs SELECT count(*) AS value, "generated_group_field" FROM - (SELECT DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" + (SELECT + DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" FROM - (SELECT "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" + (SELECT + "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" FROM - (SELECT * + (SELECT + * FROM - (SELECT "events"."time", "events"."user_id", "events"."value_2" - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40 and event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" - inner JOIN + (SELECT + "events"."time", "events"."user_id", "events"."value_2" + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40 AND event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" + INNER JOIN (SELECT user_where_1_1.real_user_id FROM - (SELECT "users"."user_id" as real_user_id - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 + (SELECT + "users"."user_id" as real_user_id + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 ON ("user_where_1_1".real_user_id = "user_where_1_join_1".user_id)) "user_filters_1" - ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" - GROUP BY "generated_group_field" ORDER BY generated_group_field DESC, value DESC; + ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" +GROUP BY + "generated_group_field" +ORDER BY + generated_group_field DESC, value DESC; value | generated_group_field -------+----------------------- 1 | 966 @@ -1494,82 +1691,122 @@ SELECT SELECT count(*) AS value, "generated_group_field" FROM - (SELECT DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" + (SELECT + DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" FROM - (SELECT "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" + (SELECT + "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" FROM - (SELECT * + (SELECT + * FROM - (SELECT "events"."time", "events"."user_id", "events"."value_2" - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40 and event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" - inner JOIN + (SELECT + "events"."time", "events"."user_id", "events"."value_2" + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40 AND event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" + INNER JOIN (SELECT user_where_1_1.real_user_id FROM - (SELECT "users"."user_id" as real_user_id - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 + (SELECT + "users"."user_id" as real_user_id + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 - ON ("user_where_1_1".real_user_id = "user_where_1_join_1".user_id)) "user_filters_1" - ON ("temp_data_queries".value_2 = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" - GROUP BY "generated_group_field" ORDER BY generated_group_field DESC, value DESC; + (SELECT + "users"."user_id", "users"."value_2" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 + ON ("user_where_1_1".real_user_id = "user_where_1_join_1".value_2)) "user_filters_1" + ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" +GROUP BY + "generated_group_field" +ORDER BY + generated_group_field DESC, value DESC; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- not supported since the first inner join is not an equi join SELECT count(*) AS value, "generated_group_field" FROM - (SELECT DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" + (SELECT + DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" FROM - (SELECT "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" + (SELECT + "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" FROM - (SELECT * + (SELECT + * FROM - (SELECT "events"."time", "events"."user_id", "events"."value_2" - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40 and event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" - inner JOIN + (SELECT + "events"."time", "events"."user_id", "events"."value_2" + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40 AND event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" + INNER JOIN (SELECT user_where_1_1.real_user_id FROM - (SELECT "users"."user_id" as real_user_id - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 + (SELECT + "users"."user_id" as real_user_id + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 + (SELECT + "users"."user_id", "users"."value_2" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 ON ("user_where_1_1".real_user_id >= "user_where_1_join_1".user_id)) "user_filters_1" - ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" - GROUP BY "generated_group_field" ORDER BY generated_group_field DESC, value DESC; + ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" +GROUP BY + "generated_group_field" +ORDER BY + generated_group_field DESC, value DESC; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- single level inner joins SELECT "value_3", count(*) AS cnt FROM - (SELECT "value_3", "user_id", random() + (SELECT + "value_3", "user_id", random() FROM - (SELECT users_in_segment_1.user_id, value_3 + (SELECT + users_in_segment_1.user_id, value_3 FROM - (SELECT user_id, value_3 * 2 as value_3 + (SELECT + user_id, value_3 * 2 as value_3 FROM - (SELECT user_id, value_3 + (SELECT + user_id, value_3 FROM - (SELECT "users"."user_id", value_3 - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 30 + (SELECT + "users"."user_id", value_3 + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 30 ) simple_user_where_1 ) all_buckets_1 ) users_in_segment_1 JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 60 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 60 ) some_users_data ON ("users_in_segment_1".user_id = "some_users_data".user_id) ) segmentalias_1) "tempQuery" @@ -1593,58 +1830,83 @@ ORDER BY cnt, value_3 DESC LIMIT 10; SELECT "value_3", count(*) AS cnt FROM -(SELECT "value_3", "user_id", random() - FROM - (SELECT users_in_segment_1.user_id, value_3 - FROM - (SELECT user_id, value_3 * 2 as value_3 - FROM - (SELECT user_id, value_3 - FROM - (SELECT "users"."user_id", value_3 - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 30) simple_user_where_1) all_buckets_1) users_in_segment_1 - JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 60) some_users_data - ON (true)) segmentalias_1) "tempQuery" - GROUP BY "value_3" ORDER BY cnt, value_3 DESC LIMIT 10; + (SELECT + "value_3", "user_id", random() + FROM + (SELECT + users_in_segment_1.user_id, value_3 + FROM + (SELECT + user_id, value_3 * 2 as value_3 + FROM + (SELECT + user_id, value_3 + FROM + (SELECT + "users"."user_id", value_3 + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 30 + ) simple_user_where_1 + ) all_buckets_1 + ) users_in_segment_1 + JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 60 + ) some_users_data + ON (true) + ) segmentalias_1) "tempQuery" +GROUP BY "value_3" +ORDER BY cnt, value_3 DESC LIMIT 10; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- nested LATERAL JOINs SELECT * FROM - (SELECT "some_users_data".user_id, - "some_recent_users".value_3 + (SELECT "some_users_data".user_id, "some_recent_users".value_3 FROM - (SELECT filter_users_1.user_id, - value_3 + (SELECT + filter_users_1.user_id, value_3 FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 20 and user_id < 70 and users.value_2 = 200) filter_users_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 20 and user_id < 70 and users.value_2 = 200) filter_users_1 JOIN LATERAL - (SELECT user_id, - value_3 - FROM events_table as "events" - WHERE user_id > 20 and user_id < 70 - AND ("events".user_id = "filter_users_1".user_id) - ORDER BY value_3 DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, value_3 + FROM + events_table as "events" + WHERE + user_id > 20 and user_id < 70 AND + ("events".user_id = "filter_users_1".user_id) + ORDER BY + value_3 DESC + LIMIT 1) "last_events_1" ON true ORDER BY value_3 DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 200 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY value_3 DESC - LIMIT 10) "some_users" - order BY + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 200 + LIMIT 1) "some_users_data" ON true + ORDER BY + value_3 DESC +LIMIT 10) "some_users" +ORDER BY value_3 DESC - limit 10; +LIMIT 10; user_id | value_3 ---------+--------- 44 | 998 @@ -1658,31 +1920,43 @@ FROM -- nested lateral join at top most level SELECT "some_users_data".user_id, "some_recent_users".value_3 FROM - (SELECT filter_users_1.user_id, value_3 + (SELECT + filter_users_1.user_id, value_3 FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 20 and user_id < 70 and users.value_2 = 200 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 20 and user_id < 70 and users.value_2 = 200 ) filter_users_1 JOIN LATERAL - (SELECT user_id, value_3 - FROM events_table as "events" - WHERE user_id > 20 and user_id < 70 - AND ("events".user_id = "filter_users_1".user_id) - ORDER BY value_3 DESC + (SELECT + user_id, value_3 + FROM + events_table as "events" + WHERE + user_id > 20 and user_id < 70 AND + ("events".user_id = "filter_users_1".user_id) + ORDER BY + value_3 DESC LIMIT 1 - ) "last_events_1" ON TRUE + ) "last_events_1" ON true ORDER BY value_3 DESC LIMIT 10 ) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 200 + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 200 LIMIT 1 - ) "some_users_data" ON TRUE -ORDER BY value_3 DESC, user_id ASC + ) "some_users_data" ON true +ORDER BY + value_3 DESC, user_id ASC LIMIT 10; user_id | value_3 ---------+--------- @@ -1697,36 +1971,45 @@ LIMIT 10; -- longer nested lateral joins SELECT * FROM - (SELECT "some_users_data".user_id, - "some_recent_users".value_3 + (SELECT "some_users_data".user_id, "some_recent_users".value_3 FROM - (SELECT filter_users_1.user_id, - value_3 + (SELECT filter_users_1.user_id, value_3 FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 20 and user_id < 70 and users.value_2 = 200) filter_users_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 20 and user_id < 70 and users.value_2 = 200) filter_users_1 JOIN LATERAL - (SELECT user_id, - value_3 - FROM events_table as "events" - WHERE user_id > 20 and user_id < 70 - AND ("events".user_id = "filter_users_1".user_id) - ORDER BY value_3 DESC - LIMIT 1) "last_events_1" ON TRUE - ORDER BY value_3 DESC + (SELECT + user_id, value_3 + FROM + events_table as "events" + WHERE + user_id > 20 and user_id < 70 AND + ("events".user_id = "filter_users_1".user_id) + ORDER BY + value_3 DESC + LIMIT 1) "last_events_1" ON true + ORDER BY + value_3 DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 200 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY value_3 DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 200 + LIMIT 1) "some_users_data" ON true + ORDER BY + value_3 DESC LIMIT 10) "some_users" - order BY +ORDER BY value_3 DESC - limit 10; +LIMIT 10; user_id | value_3 ---------+--------- 44 | 998 @@ -1742,26 +2025,37 @@ SELECT "some_users_data".user_id, "some_recent_users".value_3 FROM (SELECT filter_users_1.user_id, value_3 FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 20 and user_id < 70 and users.value_2 = 200 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 20 and user_id < 70 and users.value_2 = 200 ) filter_users_1 JOIN LATERAL - (SELECT user_id, value_3 - FROM events_table as "events" - WHERE user_id > 20 and user_id < 70 - AND ("events".user_id = "filter_users_1".user_id) - ORDER BY value_3 DESC + (SELECT + user_id, value_3 + FROM + events_table as "events" + WHERE + user_id > 20 and user_id < 70 + AND + ("events".user_id = "filter_users_1".user_id) + ORDER BY + value_3 DESC LIMIT 1 ) "last_events_1" ON TRUE ORDER BY value_3 DESC LIMIT 10 ) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 200 + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 200 LIMIT 1 ) "some_users_data" ON TRUE ORDER BY value_3 DESC @@ -1780,27 +2074,38 @@ LIMIT 10; SELECT count(*) AS cnt, "generated_group_field" FROM - (SELECT "eventQuery"."user_id", random(), generated_group_field + (SELECT + "eventQuery"."user_id", random(), generated_group_field FROM - (SELECT "multi_group_wrapper_1".*, generated_group_field, random() + (SELECT + "multi_group_wrapper_1".*, generated_group_field, random() FROM (SELECT * FROM - (SELECT "events"."time", "events"."user_id" as event_user_id - FROM events_table as "events" - WHERE user_id > 80) "temp_data_queries" - INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 80 and value_2 = 5) "user_filters_1" - on ("temp_data_queries".event_user_id = "user_filters_1".user_id)) AS "multi_group_wrapper_1" + (SELECT + "events"."time", "events"."user_id" as event_user_id + FROM + events_table as "events" + WHERE + user_id > 80) "temp_data_queries" + INNER JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 80 and value_2 = 5) "user_filters_1" + ON ("temp_data_queries".event_user_id = "user_filters_1".user_id)) AS "multi_group_wrapper_1" LEFT JOIN - (SELECT "users"."user_id" AS "user_id", value_2 AS "generated_group_field" - FROM users_table as "users") "left_group_by_1" - on ("left_group_by_1".user_id = "multi_group_wrapper_1".event_user_id)) "eventQuery") "pushedDownQuery" + (SELECT + "users"."user_id" AS "user_id", value_2 AS "generated_group_field" + FROM + users_table as "users") "left_group_by_1" + ON ("left_group_by_1".user_id = "multi_group_wrapper_1".event_user_id)) "eventQuery") "pushedDownQuery" group BY "generated_group_field" - ORDER BY cnt DESC, generated_group_field ASC + ORDER BY + cnt DESC, generated_group_field ASC LIMIT 10; cnt | generated_group_field -----+----------------------- @@ -1820,15 +2125,20 @@ count(*) AS cnt, "generated_group_field" SELECT count(*) AS cnt, user_id FROM - (SELECT "eventQuery"."user_id", random() + (SELECT + "eventQuery"."user_id", random() FROM - (SELECT "events"."user_id" - FROM events_table "events" - WHERE event_type IN (10, 20, 30, 40, 50, 60, 70, 80, 90)) "eventQuery") "pushedDownQuery" - GROUP BY - "user_id" - ORDER BY cnt DESC, user_id DESC - LIMIT 10; + (SELECT + "events"."user_id" + FROM + events_table "events" + WHERE + event_type IN (10, 20, 30, 40, 50, 60, 70, 80, 90)) "eventQuery") "pushedDownQuery" +GROUP BY + "user_id" +ORDER BY + cnt DESC, user_id DESC +LIMIT 10; cnt | user_id -----+--------- 4 | 24 @@ -1846,32 +2156,41 @@ FROM -- lateral joins in the nested manner SELECT * FROM - (SELECT "some_users_data".user_id, value_2 + (SELECT + "some_users_data".user_id, value_2 FROM - (SELECT user_id, - Max(value_2) AS value_2 + (SELECT user_id, max(value_2) AS value_2 FROM - (SELECT user_id, - value_2 + (SELECT user_id, value_2 FROM - (SELECT user_id, - value_2 - FROM events_table as "events" - WHERE user_id > 10 and user_id < 20) "events_1" - ORDER BY value_2 DESC + (SELECT + user_id, value_2 + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 20) "events_1" + ORDER BY + value_2 DESC LIMIT 10000) "recent_events_1" - GROUP BY user_id - ORDER BY max(value_2) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(value_2) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND value_2 > 75 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY value_2 DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + value_2 > 75 + LIMIT 1) "some_users_data" ON true + ORDER BY + value_2 DESC LIMIT 10) "some_users" - order BY value_2 DESC, user_id DESC - limit 10; +ORDER BY + value_2 DESC, user_id DESC +LIMIT 10; user_id | value_2 ---------+--------- 13 | 998 @@ -1888,32 +2207,41 @@ FROM -- not supported since join is not on the partition key SELECT * FROM - (SELECT "some_users_data".user_id, value_2 + (SELECT + "some_users_data".user_id, value_2 FROM - (SELECT user_id, - Max(value_2) AS value_2 + (SELECT user_id, max(value_2) AS value_2 FROM - (SELECT user_id, - value_2 + (SELECT user_id, value_2 FROM - (SELECT user_id, - value_2 - FROM events_table as "events" - WHERE user_id > 10 and user_id < 20) "events_1" - ORDER BY value_2 DESC + (SELECT + user_id, value_2 + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 20) "events_1" + ORDER BY + value_2 DESC LIMIT 10000) "recent_events_1" - GROUP BY user_id - ORDER BY max(value_2) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(value_2) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."value_2" = "some_recent_users"."user_id" - AND value_2 > 75 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY value_2 DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."value_2" = "some_recent_users"."user_id" AND + value_2 > 75 + LIMIT 1) "some_users_data" ON true + ORDER BY + value_2 DESC LIMIT 10) "some_users" - order BY value_2 DESC, user_id DESC - limit 10; +ORDER BY + value_2 DESC, user_id DESC +LIMIT 10; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. -- lets test some unsupported set operations @@ -1922,47 +2250,62 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION - (SELECT * + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - INTERSECT - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + INTERSECT + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; ERROR: cannot push down this subquery DETAIL: Intersect and Except are currently unsupported -- not supported due to offset @@ -1970,47 +2313,62 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13) ) events_subquery_4) OFFSET 3 ) t1 + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) OFFSET 3) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; ERROR: cannot push down this subquery DETAIL: Offset clause is currently unsupported -- not supported due to window functions @@ -2031,42 +2389,59 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT 1, now(), 3 AS event) events_subquery_4)) t1 + (SELECT + * + FROM + (SELECT + 1 as user_id, now(), 3 AS event + ) events_subquery_4) OFFSET 3) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; ERROR: cannot push down this subquery DETAIL: Subqueries without relations are unsupported -- similar to the above, but constant rte is on the right side of the query @@ -2074,42 +2449,54 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION ALL - (SELECT * + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION ALL - (SELECT * + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION ALL - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION + (SELECT + * + FROM + (SELECT + 1 as user_id, now(), 3 AS event + ) events_subquery_4) OFFSET 3) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT random()::int as user_id) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT random()::int as user_id) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; ERROR: cannot push down this subquery DETAIL: Subqueries without relations are unsupported SET citus.enable_router_execution TO TRUE; diff --git a/src/test/regress/expected/multi_subquery_union.out b/src/test/regress/expected/multi_subquery_union.out index f6ea5e9ac..0a858baf7 100644 --- a/src/test/regress/expected/multi_subquery_union.out +++ b/src/test/regress/expected/multi_subquery_union.out @@ -191,32 +191,40 @@ FROM ( ( SELECT user_id, sum(counter) FROM - ( SELECT user_id, - sum(value_2) AS counter - FROM users_table - GROUP BY user_id - + (SELECT + user_id, sum(value_2) AS counter + FROM + users_table + GROUP BY + user_id UNION - SELECT user_id, - sum(value_2) AS counter - FROM events_table - GROUP BY user_id ) user_id_1 - GROUP BY user_id) + SELECT + user_id, sum(value_2) AS counter + FROM + events_table + GROUP BY + user_id) user_id_1 + GROUP BY + user_id) UNION - ( SELECT user_id, - sum(counter) + (SELECT + user_id, sum(counter) FROM - ( SELECT - user_id, sum(value_2) AS counter - FROM users_table - GROUP BY user_id - + (SELECT + user_id, sum(value_2) AS counter + FROM + users_table + GROUP BY + user_id UNION - SELECT user_id, sum(value_2) AS counter - - FROM events_table - GROUP BY user_id) user_id_2 - GROUP BY user_id)) AS ftop + SELECT + user_id, sum(value_2) AS counter + FROM + events_table + GROUP BY + user_id) user_id_2 + GROUP BY + user_id)) AS ftop ORDER BY 2 DESC, 1 DESC LIMIT 5; user_id | sum @@ -233,40 +241,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" ) as final_query GROUP BY types @@ -283,36 +296,41 @@ ORDER BY types; -- but wrapper unions are removed from the inner part of the query SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT *, random() + (SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + (SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15)) + (SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events + FROM( + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) UNION - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) UNION - - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) UNION - - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13))) t1 GROUP BY "t1"."user_id") AS t) "q" ) as final_query GROUP BY types @@ -328,35 +346,37 @@ ORDER BY types; -- again excatly the same query with top level wrapper removed SELECT ("q"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) - ) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) UNION - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) UNION - - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) UNION - - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13))) t1 GROUP BY "t1"."user_id") AS t) "q" GROUP BY types ORDER BY types; @@ -375,27 +395,36 @@ FROM FROM ( SELECT "t1"."user_id" FROM ( - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) - ) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) UNION - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) UNION - - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) UNION - - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 - ) AS t) "q" ORDER BY 1 LIMIT 5; + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13))) t1 + ) AS t) "q" +ORDER BY 1 +LIMIT 5; user_id --------- 0 @@ -408,35 +437,37 @@ FROM -- a very similar query UNION ALL SELECT ("q"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) - ) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) UNION ALL - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) UNION ALL - - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) UNION ALL - - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13))) t1 GROUP BY "t1"."user_id") AS t) "q" GROUP BY types ORDER BY types; @@ -551,13 +582,13 @@ FROM (SELECT value_3, user_id FROM events_table where event_type IN (1, 2, 3, 4, 5)) UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (6, 7, 8, 9, 10)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (11, 12, 13, 14, 15)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (16, 17, 18, 19, 20)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (21, 22, 23, 24, 25)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (26, 27, 28, 29, 30)) ) b ORDER BY 1 DESC, 2 DESC @@ -579,13 +610,13 @@ FROM (SELECT value_3, user_id FROM events_table where event_type IN (1, 2, 3, 4, 5)) UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (6, 7, 8, 9, 10)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (11, 12, 13, 14, 15)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (16, 17, 18, 19, 20)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (21, 22, 23, 24, 25)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (26, 27, 28, 29, 30)) ) b GROUP BY user_id @@ -619,9 +650,9 @@ FROM ( SELECT user_id, sum(value_2) AS counter FROM users_table where value_1 < 40 and value_1 < 60 GROUP BY user_id HAVING sum(value_2) > 500 UNION SELECT user_id, sum(value_2) AS counter FROM users_table where value_1 < 60 and value_1 < 80 GROUP BY user_id HAVING sum(value_2) > 500 - UNION + UNION SELECT user_id, sum(value_2) AS counter FROM users_table where value_1 < 80 and value_1 < 100 GROUP BY user_id HAVING sum(value_2) > 500 - UNION + UNION SELECT 2 * user_id, sum(value_2) AS counter FROM users_table where value_1 < 100 and value_1 < 120 GROUP BY user_id HAVING sum(value_2) > 500 ) user_id GROUP BY user_id ORDER BY 1 DESC LIMIT 5; @@ -634,7 +665,7 @@ SELECT * FROM SELECT user_id, sum(counter) FROM ( SELECT user_id, sum(value_2) AS counter FROM users_table GROUP BY user_id - UNION + UNION SELECT user_id, sum(value_2) AS counter FROM events_table GROUP BY user_id ) user_id_1 GROUP BY user_id @@ -655,7 +686,7 @@ DETAIL: Intersect and Except are currently unsupported SELECT user_id, sum(counter) FROM ( SELECT user_id, sum(value_2) AS counter FROM users_table GROUP BY user_id - UNION + UNION SELECT events_table.user_id, sum(events_table.value_2) AS counter FROM events_table, users_table WHERE users_table.user_id > events_table.user_id GROUP BY 1 ) user_id GROUP BY user_id; @@ -668,7 +699,7 @@ SELECT * FROM SELECT user_id, sum(counter) FROM ( SELECT user_id, sum(value_2) AS counter FROM users_table GROUP BY user_id - UNION + UNION SELECT user_id, sum(value_2) AS counter FROM events_table GROUP BY user_id ) user_id_1 GROUP BY user_id @@ -701,32 +732,40 @@ FROM ( ( SELECT user_id, sum(counter) FROM - ( SELECT user_id, - sum(value_2) AS counter - FROM users_table - GROUP BY user_id - + (SELECT + user_id, sum(value_2) AS counter + FROM + users_table + GROUP BY + user_id UNION - SELECT user_id, - sum(value_2) AS counter - FROM events_table - GROUP BY user_id ) user_id_1 - GROUP BY user_id) + SELECT + user_id, sum(value_2) AS counter + FROM + events_table + GROUP BY + user_id) user_id_1 + GROUP BY + user_id) UNION - ( SELECT user_id, - sum(counter) + (SELECT + user_id, sum(counter) FROM - ( SELECT sum(value_2) AS counter, - user_id - FROM users_table - GROUP BY user_id - + (SELECT + sum(value_2) AS counter, user_id + FROM + users_table + GROUP BY + user_id UNION - SELECT user_id, - sum(value_2) AS counter - FROM events_table - GROUP BY user_id) user_id_2 - GROUP BY user_id)) AS ftop; + SELECT + user_id, sum(value_2) AS counter + FROM + events_table + GROUP BY + user_id) user_id_2 + GROUP BY + user_id)) AS ftop; ERROR: cannot pushdown the subquery since all leaves of the UNION does not include partition key at the same position DETAIL: Each leaf query of the UNION should return partition key at the same position on its target list. -- some UNION all queries that are going to be pulled up @@ -748,13 +787,13 @@ FROM (SELECT value_3, user_id FROM events_table where event_type IN (1, 2, 3, 4, 5)) UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (6, 7, 8, 9, 10)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (11, 12, 13, 14, 15)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (16, 17, 18, 19, 20)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (21, 22, 23, 24, 25)) - UNION ALL + UNION ALL (SELECT value_3, value_2 FROM events_table where event_type IN (26, 27, 28, 29, 30)) ) b ORDER BY 1 DESC, 2 DESC @@ -802,44 +841,59 @@ FROM (SELECT value_3, user_id FROM events_table where event_type IN (1, 2, 3, 4, 5)) UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (6, 7, 8, 9, 10)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (11, 12, 13, 14, 15)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (16, 17, 18, 19, 20)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (21, 22, 23, 24, 25)) - UNION ALL + UNION ALL (SELECT 1, 2) ) b ORDER BY 1 DESC, 2 DESC LIMIT 5; ERROR: cannot push down this subquery DETAIL: Subqueries without relations are unsupported -SELECT ("q"."event_types") as types, count(*) AS sumOfEventType +SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT *, random() + FROM + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT "events"."user_id", "events"."time", 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) - ) - UNION - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) - UNION - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) - UNION - (SELECT 1, now(), 3 AS event)) t1 + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1) + UNION + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION + (SELECT * + FROM + (SELECT 1, now(), 3 AS event) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" +) as final_query GROUP BY types ORDER BY types; ERROR: cannot push down this subquery diff --git a/src/test/regress/input/multi_subquery.source b/src/test/regress/input/multi_subquery.source index 94fb2c806..380123cc2 100644 --- a/src/test/regress/input/multi_subquery.source +++ b/src/test/regress/input/multi_subquery.source @@ -170,32 +170,29 @@ FROM GROUP BY l_orderkey) AS unit_prices; --- Check that we error out if there is union all. --- TEMPORARLY DISABLE UNION ALL --- SELECT count(*) FROM --- ( --- (SELECT l_orderkey FROM lineitem_subquery) UNION ALL --- (SELECT 1::bigint) ---) b; +-- Check that we error out if there is non relation subqueries +SELECT count(*) FROM +( + (SELECT l_orderkey FROM lineitem_subquery) UNION ALL + (SELECT 1::bigint) +) b; + ---- --- TEMPORARLY DISABLE UNIONS WITHOUT JOINS ---- -- Check that we error out if queries in union do not include partition columns. ---SELECT count(*) FROM ---( - -- (SELECT l_orderkey FROM lineitem_subquery) UNION - -- (SELECT l_partkey FROM lineitem_subquery) ---) b; +SELECT count(*) FROM +( + (SELECT l_orderkey FROM lineitem_subquery) UNION + (SELECT l_partkey FROM lineitem_subquery) +) b; -- Check that we run union queries if partition column is selected. ---SELECT count(*) FROM ---( - -- (SELECT l_orderkey FROM lineitem_subquery) UNION - -- (SELECT l_orderkey FROM lineitem_subquery) ---) b; +SELECT count(*) FROM +( + (SELECT l_orderkey FROM lineitem_subquery) UNION + (SELECT l_orderkey FROM lineitem_subquery) +) b; -- Check that we error out if inner query has limit but outer quers has not. SELECT avg(o_totalprice/l_quantity) @@ -273,23 +270,23 @@ WHERE -- Check that if subquery is pulled, we don't error and run query properly. ---SELECT count(*) FROM ---( - --SELECT l_orderkey FROM ( - --(SELECT l_orderkey FROM lineitem_subquery) UNION - --(SELECT l_orderkey FROM lineitem_subquery) - --) a - --WHERE l_orderkey = 1 ---) b; +SELECT count(*) FROM +( + SELECT l_orderkey FROM ( + (SELECT l_orderkey FROM lineitem_subquery) UNION + (SELECT l_orderkey FROM lineitem_subquery) + ) a + WHERE l_orderkey = 1 +) b; ---SELECT count(*) FROM ---( - --SELECT * FROM ( - --(SELECT * FROM lineitem_subquery) UNION - --(SELECT * FROM lineitem_subquery) - --) a - --WHERE l_orderkey = 1 ---) b; +SELECT count(*) FROM +( + SELECT * FROM ( + (SELECT * FROM lineitem_subquery) UNION + (SELECT * FROM lineitem_subquery) + ) a + WHERE l_orderkey = 1 +) b; SELECT max(l_orderkey) FROM ( diff --git a/src/test/regress/output/multi_subquery.source b/src/test/regress/output/multi_subquery.source index 7b8c2a56b..f4f7be282 100644 --- a/src/test/regress/output/multi_subquery.source +++ b/src/test/regress/output/multi_subquery.source @@ -174,28 +174,33 @@ FROM l_orderkey) AS unit_prices; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. --- Check that we error out if there is union all. --- TEMPORARLY DISABLE UNION ALL --- SELECT count(*) FROM --- ( --- (SELECT l_orderkey FROM lineitem_subquery) UNION ALL --- (SELECT 1::bigint) ---) b; ---- --- TEMPORARLY DISABLE UNIONS WITHOUT JOINS ---- +-- Check that we error out if there is non relation subqueries +SELECT count(*) FROM +( + (SELECT l_orderkey FROM lineitem_subquery) UNION ALL + (SELECT 1::bigint) +) b; +ERROR: cannot push down this subquery +DETAIL: Subqueries without relations are unsupported -- Check that we error out if queries in union do not include partition columns. ---SELECT count(*) FROM ---( - -- (SELECT l_orderkey FROM lineitem_subquery) UNION - -- (SELECT l_partkey FROM lineitem_subquery) ---) b; +SELECT count(*) FROM +( + (SELECT l_orderkey FROM lineitem_subquery) UNION + (SELECT l_partkey FROM lineitem_subquery) +) b; +ERROR: cannot pushdown the subquery since all leaves of the UNION does not include partition key at the same position +DETAIL: Each leaf query of the UNION should return partition key at the same position on its target list. -- Check that we run union queries if partition column is selected. ---SELECT count(*) FROM ---( - -- (SELECT l_orderkey FROM lineitem_subquery) UNION - -- (SELECT l_orderkey FROM lineitem_subquery) ---) b; +SELECT count(*) FROM +( + (SELECT l_orderkey FROM lineitem_subquery) UNION + (SELECT l_orderkey FROM lineitem_subquery) +) b; + count +------- + 2985 +(1 row) + -- Check that we error out if inner query has limit but outer quers has not. SELECT avg(o_totalprice/l_quantity) @@ -289,22 +294,32 @@ WHERE (1 row) -- Check that if subquery is pulled, we don't error and run query properly. ---SELECT count(*) FROM ---( - --SELECT l_orderkey FROM ( - --(SELECT l_orderkey FROM lineitem_subquery) UNION - --(SELECT l_orderkey FROM lineitem_subquery) - --) a - --WHERE l_orderkey = 1 ---) b; ---SELECT count(*) FROM ---( - --SELECT * FROM ( - --(SELECT * FROM lineitem_subquery) UNION - --(SELECT * FROM lineitem_subquery) - --) a - --WHERE l_orderkey = 1 ---) b; +SELECT count(*) FROM +( + SELECT l_orderkey FROM ( + (SELECT l_orderkey FROM lineitem_subquery) UNION + (SELECT l_orderkey FROM lineitem_subquery) + ) a + WHERE l_orderkey = 1 +) b; + count +------- + 1 +(1 row) + +SELECT count(*) FROM +( + SELECT * FROM ( + (SELECT * FROM lineitem_subquery) UNION + (SELECT * FROM lineitem_subquery) + ) a + WHERE l_orderkey = 1 +) b; + count +------- + 6 +(1 row) + SELECT max(l_orderkey) FROM ( SELECT l_orderkey FROM ( diff --git a/src/test/regress/output/multi_subquery_0.source b/src/test/regress/output/multi_subquery_0.source index 4c27449f6..914fda71e 100644 --- a/src/test/regress/output/multi_subquery_0.source +++ b/src/test/regress/output/multi_subquery_0.source @@ -174,28 +174,33 @@ FROM l_orderkey) AS unit_prices; ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. --- Check that we error out if there is union all. --- TEMPORARLY DISABLE UNION ALL --- SELECT count(*) FROM --- ( --- (SELECT l_orderkey FROM lineitem_subquery) UNION ALL --- (SELECT 1::bigint) ---) b; ---- --- TEMPORARLY DISABLE UNIONS WITHOUT JOINS ---- +-- Check that we error out if there is non relation subqueries +SELECT count(*) FROM +( + (SELECT l_orderkey FROM lineitem_subquery) UNION ALL + (SELECT 1::bigint) +) b; +ERROR: cannot push down this subquery +DETAIL: Subqueries without relations are unsupported -- Check that we error out if queries in union do not include partition columns. ---SELECT count(*) FROM ---( - -- (SELECT l_orderkey FROM lineitem_subquery) UNION - -- (SELECT l_partkey FROM lineitem_subquery) ---) b; +SELECT count(*) FROM +( + (SELECT l_orderkey FROM lineitem_subquery) UNION + (SELECT l_partkey FROM lineitem_subquery) +) b; +ERROR: cannot pushdown the subquery since all leaves of the UNION does not include partition key at the same position +DETAIL: Each leaf query of the UNION should return partition key at the same position on its target list. -- Check that we run union queries if partition column is selected. ---SELECT count(*) FROM ---( - -- (SELECT l_orderkey FROM lineitem_subquery) UNION - -- (SELECT l_orderkey FROM lineitem_subquery) ---) b; +SELECT count(*) FROM +( + (SELECT l_orderkey FROM lineitem_subquery) UNION + (SELECT l_orderkey FROM lineitem_subquery) +) b; + count +------- + 2985 +(1 row) + -- Check that we error out if inner query has limit but outer quers has not. SELECT avg(o_totalprice/l_quantity) @@ -289,22 +294,32 @@ WHERE (1 row) -- Check that if subquery is pulled, we don't error and run query properly. ---SELECT count(*) FROM ---( - --SELECT l_orderkey FROM ( - --(SELECT l_orderkey FROM lineitem_subquery) UNION - --(SELECT l_orderkey FROM lineitem_subquery) - --) a - --WHERE l_orderkey = 1 ---) b; ---SELECT count(*) FROM ---( - --SELECT * FROM ( - --(SELECT * FROM lineitem_subquery) UNION - --(SELECT * FROM lineitem_subquery) - --) a - --WHERE l_orderkey = 1 ---) b; +SELECT count(*) FROM +( + SELECT l_orderkey FROM ( + (SELECT l_orderkey FROM lineitem_subquery) UNION + (SELECT l_orderkey FROM lineitem_subquery) + ) a + WHERE l_orderkey = 1 +) b; + count +------- + 1 +(1 row) + +SELECT count(*) FROM +( + SELECT * FROM ( + (SELECT * FROM lineitem_subquery) UNION + (SELECT * FROM lineitem_subquery) + ) a + WHERE l_orderkey = 1 +) b; + count +------- + 6 +(1 row) + SELECT max(l_orderkey) FROM ( SELECT l_orderkey FROM ( diff --git a/src/test/regress/sql/multi_subquery_behavioral_analytics.sql b/src/test/regress/sql/multi_subquery_behavioral_analytics.sql index 49ec30154..0dd9e889e 100644 --- a/src/test/regress/sql/multi_subquery_behavioral_analytics.sql +++ b/src/test/regress/sql/multi_subquery_behavioral_analytics.sql @@ -325,7 +325,12 @@ ORDER BY ( SELECT users_table.user_id, - CASE WHEN events_table.event_type > 10 AND events_table.event_type < 12 THEN 'action=>1' ELSE 'action=>2' END AS event, + CASE + WHEN + events_table.event_type > 10 AND events_table.event_type < 12 + THEN 'action=>1' + ELSE 'action=>2' + END AS event, events_table.time FROM users_table, @@ -468,7 +473,7 @@ WHERE user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 10 AND value_ SELECT user_id, value_2 FROM users_table WHERE value_1 > 101 AND value_1 < 110 AND value_2 >= 5 - AND EXISTS (SELECT user_id FROM events_table WHERE event_type>101 AND event_type < 110 AND value_3 > 100 AND user_id=users_table.user_id); + AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 101 AND event_type < 110 AND value_3 > 100 AND user_id = users_table.user_id); ------------------------------------ -- Customers who haven’t done X, and satisfy other customer specific criteria @@ -477,7 +482,7 @@ SELECT user_id, value_2 FROM users_table WHERE SELECT user_id, value_2 FROM users_table WHERE value_1 = 101 AND value_2 >= 5 - AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id=users_table.user_id); + AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id = users_table.user_id); ------------------------------------ -- Customers who have done X and Y, and satisfy other customer specific criteria @@ -486,8 +491,8 @@ SELECT user_id, value_2 FROM users_table WHERE SELECT user_id, value_2 FROM users_table WHERE value_1 > 100 AND value_2 >= 5 - AND EXISTS (SELECT user_id FROM events_table WHERE event_type!=100 AND value_3 > 100 AND user_id=users_table.user_id) - AND EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id=users_table.user_id); + AND EXISTS (SELECT user_id FROM events_table WHERE event_type != 100 AND value_3 > 100 AND user_id = users_table.user_id) + AND EXISTS (SELECT user_id FROM events_table WHERE event_type = 101 AND value_3 > 100 AND user_id = users_table.user_id); ------------------------------------ -- Customers who have done X and haven’t done Y, and satisfy other customer specific criteria @@ -495,8 +500,8 @@ SELECT user_id, value_2 FROM users_table WHERE ------------------------------------ SELECT user_id, value_2 FROM users_table WHERE value_2 >= 5 - AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 100 AND event_type <= 300 AND value_3 > 100 AND user_id=users_table.user_id) - 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); + AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 100 AND event_type <= 300 AND value_3 > 100 AND user_id = users_table.user_id) + 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); ------------------------------------ -- Customers who have done X more than 2 times, and satisfy other customer specific criteria @@ -522,18 +527,31 @@ SELECT user_id, ------------------------------------ SELECT user_id, value_1 from ( - SELECT user_id, value_1 From users_table - WHERE value_2 > 100 and user_id = 15 GROUP BY value_1, user_id HAVING count(*) > 1 + SELECT + user_id, value_1 From users_table + WHERE + value_2 > 100 and user_id = 15 + GROUP BY + value_1, user_id + HAVING + count(*) > 1 ) AS a -ORDER BY user_id ASC, value_1 ASC; +ORDER BY + user_id ASC, value_1 ASC; -- same query with additional filter to make it not router plannable SELECT user_id, value_1 from ( - SELECT user_id, value_1 From users_table - WHERE value_2 > 100 and (user_id = 15 OR user_id = 16) GROUP BY value_1, user_id HAVING count(*) > 1 + SELECT + user_id, value_1 From users_table + WHERE + value_2 > 100 and (user_id = 15 OR user_id = 16) + GROUP BY + value_1, user_id + HAVING count(*) > 1 ) AS a -ORDER BY user_id ASC, value_1 ASC; +ORDER BY + user_id ASC, value_1 ASC; ------------------------------------ -- Find me all users_table who has done some event and has filters @@ -542,12 +560,15 @@ ORDER BY user_id ASC, value_1 ASC; SELECT user_id FROM events_table WHERE - event_type = 16 AND value_2 > 50 -AND user_id IN - (SELECT user_id - FROM users_table - WHERE - value_1 = 15 AND value_2 > 25); + event_type = 16 AND value_2 > 50 AND + user_id IN + (SELECT + user_id + FROM + users_table + WHERE + value_1 = 15 AND value_2 > 25 + ); ------------------------------------ -- Which events_table did people who has done some specific events_table @@ -566,10 +587,15 @@ SELECT user_id FROM user_id FROM events_table - WHERE event_type = 901 - GROUP BY user_id HAVING count(*) > 3 + WHERE + event_type = 901 + GROUP BY + user_id + HAVING + count(*) > 3 ) AS a -ORDER BY user_id; +ORDER BY + user_id; ------------------------------------ -- Find my assets that have the highest probability and fetch their metadata @@ -588,7 +614,8 @@ FROM 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 - WHERE users_table.value_1 < 50; + WHERE + users_table.value_1 < 50; -- get some statistics from the aggregated results to ensure the results are correct SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets; @@ -599,13 +626,17 @@ DROP TABLE assets; -- original query that fails SELECT count(*) FROM ( -SELECT user_id -FROM users_table -WHERE (value_1 = '5' - OR value_1 = '13') -AND user_id NOT IN (select user_id from users_table where value_1 = '3') -GROUP BY user_id -HAVING count(distinct value_1) = 2 + SELECT + user_id + FROM + users_table + WHERE + (value_1 = '5' OR value_1 = '13') AND + user_id NOT IN (select user_id from users_table where value_1 = '3') + GROUP BY + user_id + HAVING + count(distinct value_1) = 2 ) as foo; -- previous push down query @@ -617,8 +648,10 @@ SELECT subquery_count FROM users_table WHERE (value_1 = '5' OR value_1 = '13') - GROUP BY user_id - HAVING count(distinct value_1) = 2) as a + GROUP BY + user_id + HAVING + count(distinct value_1) = 2) as a LEFT JOIN (SELECT user_id @@ -626,8 +659,14 @@ SELECT subquery_count FROM users_table WHERE (value_1 = '3') - GROUP BY user_id) as b on a.user_id = b.user_id WHERE b.user_id IS NULL - GROUP BY a.user_id) AS inner_subquery; + GROUP BY + user_id) as b + ON a.user_id = b.user_id + WHERE + b.user_id IS NULL + GROUP BY + a.user_id + ) AS inner_subquery; -- new pushdown query without single range table entry at top requirement SELECT count(*) as subquery_count @@ -638,8 +677,10 @@ FROM ( users_table WHERE (value_1 = '5' OR value_1 = '13') - GROUP BY user_id - HAVING count(distinct value_1) = 2 + GROUP BY + user_id + HAVING + count(distinct value_1) = 2 ) as a LEFT JOIN ( SELECT @@ -648,10 +689,13 @@ FROM ( users_table WHERE (value_1 = '3') - GROUP BY user_id) AS b + GROUP BY + user_id) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NULL -GROUP BY a.user_id; +WHERE + b.user_id IS NULL +GROUP BY + a.user_id; -- multi-subquery-join -- The first query has filters on partion column to make it router plannable @@ -716,9 +760,11 @@ FROM ( ORDER BY time LIMIT 1 ) e5 ON true -where e1.user_id = 1 -group by e1.user_id -limit 1; +WHERE + e1.user_id = 1 +GROUP BY + e1.user_id +LIMIT 1; -- Same query without all limitations SELECT @@ -847,14 +893,16 @@ LIMIT 15; -- avg expression used on order by SELECT a.user_id, avg(b.value_2) as subquery_avg FROM ( - SELECT + SELECT user_id FROM - users_table - WHERE - (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN ( SELECT @@ -864,19 +912,22 @@ FROM ( WHERE (value_1 > 3)) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NOT NULL -GROUP BY a.user_id -ORDER BY avg(b.value_3), 2, 1 +WHERE + b.user_id IS NOT NULL +GROUP BY + a.user_id +ORDER BY + avg(b.value_3), 2, 1 LIMIT 5; --- add having +-- add having to the same query SELECT a.user_id, avg(b.value_2) as subquery_avg FROM ( SELECT user_id FROM - users_table - WHERE + users_table + WHERE (value_1 > 5) GROUP BY user_id HAVING count(distinct value_1) > 88 @@ -889,30 +940,46 @@ FROM ( WHERE (value_1 > 3)) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NOT NULL -GROUP BY a.user_id -HAVING sum(b.value_3) > 50000 -ORDER BY avg(b.value_3), 2, 1 +WHERE + b.user_id IS NOT NULL +GROUP BY + a.user_id +HAVING + sum(b.value_3) > 50000 +ORDER BY + avg(b.value_3), 2, 1 LIMIT 5; -- avg on the value_3 is not a resjunk SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3) FROM - (SELECT user_id - FROM users_table - WHERE (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + (SELECT + user_id + FROM + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN - (SELECT user_id, value_2, value_3 - FROM users_table - WHERE (value_1 > 3) + ( + SELECT + user_id, value_2, value_3 + FROM + users_table + WHERE + (value_1 > 3) ) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NOT NULL -GROUP BY a.user_id -ORDER BY avg(b.value_3) DESC, 2, 1 +WHERE + b.user_id IS NOT NULL +GROUP BY + a.user_id +ORDER BY + avg(b.value_3) DESC, 2, 1 LIMIT 5; -- a powerful query structure that analyzes users/events @@ -921,18 +988,25 @@ SELECT u.user_id, sub.value_2, sub.value_3, COUNT(e2.user_id) counts FROM users_table u LEFT OUTER JOIN LATERAL - (SELECT * - FROM events_table e1 - WHERE e1.user_id = u.user_id - ORDER BY e1.value_3 DESC - LIMIT 1 + (SELECT + * + FROM + events_table e1 + WHERE + e1.user_id = u.user_id + ORDER BY + e1.value_3 DESC + LIMIT 1 ) sub ON true LEFT OUTER JOIN events_table e2 - ON e2.user_id = sub.user_id -WHERE e2.value_2 > 10 and e2.value_2 < 50 AND u.value_2 > 10 and u.value_2 < 50 -GROUP BY u.user_id, sub.value_2, sub.value_3 -ORDER BY 4 DESC, 1 DESC, 2 ASC, 3 ASC + ON e2.user_id = sub.user_id +WHERE + e2.value_2 > 10 AND e2.value_2 < 50 AND u.value_2 > 10 AND u.value_2 < 50 +GROUP BY + u.user_id, sub.value_2, sub.value_3 +ORDER BY + 4 DESC, 1 DESC, 2 ASC, 3 ASC LIMIT 10; -- distinct users joined with events @@ -941,12 +1015,16 @@ SELECT count(*) as users_count FROM events_table JOIN - (SELECT DISTINCT user_id - FROM users_table - ) as distinct_users - ON distinct_users.user_id = events_table.user_id -GROUP BY distinct_users.user_id -ORDER BY users_count desc, avg_type DESC + (SELECT + DISTINCT user_id + FROM + users_table + ) as distinct_users + ON distinct_users.user_id = events_table.user_id +GROUP BY + distinct_users.user_id +ORDER BY + users_count desc, avg_type DESC LIMIT 5; -- reduce the data set, aggregate and join @@ -957,44 +1035,65 @@ FROM events_table JOIN (SELECT distinct_users.user_id, count(1) as ct FROM - (SELECT user_id - FROM users_table + (SELECT + user_id + FROM + users_table ) as distinct_users - GROUP BY distinct_users.user_id + GROUP BY + distinct_users.user_id ) as users_count ON users_count.user_id = events_table.user_id -ORDER BY users_count.ct desc, event_type DESC +ORDER BY + users_count.ct desc, event_type DESC LIMIT 5; --- now, test (subquery JOIN subquery) SELECT n1.user_id, count_1, total_count FROM - (SELECT user_id, count(1) as count_1 - FROM users_table - GROUP BY user_id + (SELECT + user_id, count(1) as count_1 + FROM + users_table + GROUP BY + user_id ) n1 INNER JOIN - (SELECT user_id, count(1) as total_count - FROM events_table - GROUP BY user_id, event_type + ( + SELECT + user_id, count(1) as total_count + FROM + events_table + GROUP BY + user_id, event_type ) n2 ON (n2.user_id = n1.user_id) -ORDER BY total_count DESC, count_1 DESC, 1 DESC +ORDER BY + total_count DESC, count_1 DESC, 1 DESC LIMIT 10; SELECT a.user_id, avg(b.value_2) as subquery_avg FROM - (SELECT user_id - FROM users_table - WHERE (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + (SELECT + user_id + FROM + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN - (SELECT DISTINCT ON (user_id) user_id, value_2, value_3 - FROM users_table - WHERE (value_1 > 3) - ORDER BY 1,2,3 + (SELECT + DISTINCT ON (user_id) user_id, value_2, value_3 + FROM + users_table + WHERE + (value_1 > 3) + ORDER BY + 1,2,3 ) AS b ON a.user_id = b.user_id WHERE b.user_id IS NOT NULL @@ -1006,39 +1105,60 @@ LIMIT 5; -- when used in target list SELECT a.user_id, avg(b.value_2) as subquery_avg FROM - (SELECT user_id - FROM users_table - WHERE (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + (SELECT + user_id + FROM + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN - (SELECT DISTINCT ON (value_2) value_2 , user_id, value_3 - FROM users_table - WHERE (value_1 > 3) - ORDER BY 1,2,3 + (SELECT + DISTINCT ON (value_2) value_2 , user_id, value_3 + FROM + users_table + WHERE + (value_1 > 3) + ORDER BY + 1,2,3 ) AS b USING (user_id) GROUP BY user_id; SELECT a.user_id, avg(b.value_2) as subquery_avg FROM - (SELECT user_id - FROM users_table - WHERE (value_1 > 5) - GROUP BY user_id - HAVING count(distinct value_1) > 88 + (SELECT + user_id + FROM + users_table + WHERE + (value_1 > 5) + GROUP BY + user_id + HAVING + count(distinct value_1) > 88 ) as a LEFT JOIN - (SELECT DISTINCT ON (value_2, user_id) value_2 , user_id, value_3 - FROM users_table - WHERE (value_1 > 3) - ORDER BY 1,2,3 + (SELECT + DISTINCT ON (value_2, user_id) value_2 , user_id, value_3 + FROM + users_table + WHERE + (value_1 > 3) + ORDER BY + 1,2,3 ) AS b ON a.user_id = b.user_id -WHERE b.user_id IS NOT NULL -GROUP BY a.user_id -ORDER BY avg(b.value_3), 2, 1 +WHERE + b.user_id IS NOT NULL +GROUP BY + a.user_id +ORDER BY + avg(b.value_3), 2, 1 LIMIT 5; SELECT user_id, event_type @@ -1046,40 +1166,55 @@ FROM (SELECT * FROM ( - (SELECT event_type, user_id as a_user_id FROM events_table) AS a - JOIN - (SELECT - ma.user_id AS user_id, ma.value_2 AS value_2, - (GREATEST(coalesce((ma.value_3 * ma.value_2 ) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob - FROM users_table AS ma - WHERE (ma.value_2 > 100) - ORDER BY prob DESC, user_id DESC - LIMIT 10 - ) AS ma - ON (a.a_user_id = ma.user_id) - ) AS inner_sub - ORDER BY prob DESC, user_id DESC + (SELECT + event_type, user_id as a_user_id + FROM + events_table) AS a + JOIN + (SELECT + ma.user_id AS user_id, ma.value_2 AS value_2, + (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob + FROM + users_table AS ma + WHERE + (ma.value_2 > 100) + ORDER BY + prob DESC, user_id DESC + LIMIT 10 + ) AS ma + ON (a.a_user_id = ma.user_id) + ) AS inner_sub + ORDER BY + prob DESC, user_id DESC LIMIT 10 ) AS outer_sub -ORDER BY prob DESC, event_type DESC, user_id DESC +ORDER BY + prob DESC, event_type DESC, user_id DESC LIMIT 10; -- very similar query but produces different result due to -- ordering difference in the previous one's inner query SELECT user_id, event_type FROM - (SELECT event_type, user_id as a_user_id FROM events_table) AS a - JOIN - (SELECT - ma.user_id AS user_id, ma.value_2 AS value_2, - (GREATEST(coalesce((ma.value_3 * ma.value_2 ) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob - FROM users_table AS ma - WHERE (ma.value_2 > 100) - ORDER BY prob DESC, user_id DESC + (SELECT + event_type, user_id as a_user_id + FROM + events_table) AS a + JOIN + (SELECT + ma.user_id AS user_id, ma.value_2 AS value_2, + (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob + FROM + users_table AS ma + WHERE + (ma.value_2 > 100) + ORDER BY + prob DESC, user_id DESC LIMIT 10 ) AS ma ON (a.a_user_id = ma.user_id) -ORDER BY prob DESC, event_type DESC, user_id DESC +ORDER BY + prob DESC, event_type DESC, user_id DESC LIMIT 10; -- now they produce the same result when ordering fixed in 'outer_sub' @@ -1088,22 +1223,31 @@ FROM (SELECT * FROM ( - (SELECT event_type, user_id as a_user_id FROM events_table) AS a - JOIN - (SELECT - ma.user_id AS user_id, ma.value_2 AS value_2, - (GREATEST(coalesce((ma.value_3 * ma.value_2 ) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob - FROM users_table AS ma - WHERE (ma.value_2 > 100) - ORDER BY prob DESC, user_id DESC - LIMIT 10 - ) AS ma - ON (a.a_user_id = ma.user_id) - ) AS inner_sub - ORDER BY prob DESC, event_type DESC, user_id DESC + (SELECT + event_type, user_id as a_user_id + FROM + events_table + ) AS a + JOIN + (SELECT + ma.user_id AS user_id, ma.value_2 AS value_2, + (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob + FROM + users_table AS ma + WHERE + (ma.value_2 > 100) + ORDER BY + prob DESC, user_id DESC + LIMIT 10 + ) AS ma + ON (a.a_user_id = ma.user_id) + ) AS inner_sub + ORDER BY + prob DESC, event_type DESC, user_id DESC LIMIT 10 ) AS outer_sub -ORDER BY prob DESC, event_type DESC, user_id DESC +ORDER BY + prob DESC, event_type DESC, user_id DESC LIMIT 10; -- this is one complex join query derived from a user's production query @@ -1128,81 +1272,64 @@ CREATE OR REPLACE FUNCTION array_index(ANYARRAY, ANYELEMENT) SELECT * FROM - (SELECT * - FROM - ( - (SELECT - user_id AS user_id_e, - event_type as event_type_e - FROM - events_table - ) AS ma_e - JOIN - (SELECT - value_2, - value_3, - user_id - FROM - (SELECT * - FROM - ( - (SELECT user_id_p AS user_id - FROM - (SELECT * - FROM - ( - (SELECT user_id AS user_id_p - FROM events_table - WHERE (event_type IN (1, 2, 3, 4, 5)) - ) AS ma_p - JOIN - (SELECT user_id AS user_id_a - FROM users_table - WHERE (value_2 % 5 = 1) - ) AS a - ON (a.user_id_a = ma_p.user_id_p) - ) - ) AS a_ma_p - ) AS inner_filter_q - JOIN - (SELECT - value_2, - value_3, - user_id AS user_id_ck - FROM events_table - WHERE event_type = ANY(ARRAY [10, 11, 12]) - ORDER BY - value_3 ASC, - user_id_ck DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10 - ) AS ma_ck - ON (ma_ck.user_id_ck = inner_filter_q.user_id) - ) AS inner_sub_q - ORDER BY - value_3 ASC, - user_id_ck DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10 - ) AS outer_sub_q - ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10) AS inner_search_q - ON (ma_e.user_id_e = inner_search_q.user_id) - ) AS outer_inner_sub_q - ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, - event_type_e DESC - LIMIT 10) AS outer_outer_sub_q -ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, - event_type_e DESC + (SELECT * + FROM ( + (SELECT user_id AS user_id_e, + event_type AS event_type_e + FROM events_table ) AS ma_e + JOIN + (SELECT value_2, + value_3, + user_id + FROM + (SELECT * + FROM ( + (SELECT user_id_p AS user_id + FROM + (SELECT * + FROM ( + (SELECT + user_id AS user_id_p + FROM + events_table + WHERE + (event_type IN (1,2,3,4,5)) ) AS ma_p + JOIN + (SELECT + user_id AS user_id_a + FROM + users_table + WHERE + (value_2 % 5 = 1) ) AS a + ON (a.user_id_a = ma_p.user_id_p) ) ) AS a_ma_p ) AS inner_filter_q + JOIN + (SELECT + value_2, value_3, user_id AS user_id_ck + FROM + events_table + WHERE + event_type = ANY(ARRAY [10, 11, 12]) + ORDER BY + value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10 ) + AS ma_ck ON (ma_ck.user_id_ck = inner_filter_q.user_id) ) + AS inner_sub_q + ORDER BY + value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10 ) + AS outer_sub_q + ORDER BY + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10) + AS inner_search_q + ON (ma_e.user_id_e = inner_search_q.user_id) ) + AS outer_inner_sub_q + ORDER BY + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC + LIMIT 10) +AS outer_outer_sub_q +ORDER BY + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC LIMIT 10; -- top level select * is removed now there is @@ -1211,71 +1338,68 @@ SELECT * FROM ( (SELECT - user_id AS user_id_e, - event_type as event_type_e - FROM - events_table - ) AS ma_e - JOIN - (SELECT - value_2, - value_3, - user_id - FROM - (SELECT * + user_id AS user_id_e, event_type as event_type_e + FROM + events_table + ) AS ma_e + JOIN + (SELECT + value_2, value_3, user_id + FROM + (SELECT + * + FROM + ( + (SELECT + user_id_p AS user_id FROM - ( - (SELECT user_id_p AS user_id - FROM - (SELECT * - FROM - ( - (SELECT user_id AS user_id_p - FROM events_table - WHERE (event_type IN (1, 2, 3, 4, 5)) - ) AS ma_p - JOIN - (SELECT user_id AS user_id_a - FROM users_table - WHERE (value_2 % 5 = 1) - ) AS a - ON (a.user_id_a = ma_p.user_id_p) - ) - ) AS a_ma_p - ) AS inner_filter_q - JOIN - (SELECT - value_2, - value_3, - user_id AS user_id_ck - FROM events_table - WHERE event_type = ANY(ARRAY [10, 11, 12]) - ORDER BY - value_3 ASC, - user_id_ck DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10 - ) AS ma_ck - ON (ma_ck.user_id_ck = inner_filter_q.user_id) - ) AS inner_sub_q - ORDER BY - value_3 ASC, - user_id_ck DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10 - ) AS outer_sub_q - ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC - LIMIT 10) AS inner_search_q - ON (ma_e.user_id_e = inner_search_q.user_id) - ) AS outer_inner_sub_q + (SELECT + * + FROM + ( + (SELECT + user_id AS user_id_p + FROM + events_table + WHERE + (event_type IN (1, 2, 3, 4, 5)) + ) AS ma_p + JOIN + (SELECT + user_id AS user_id_a + FROM + users_table + WHERE + (value_2 % 5 = 1) + ) AS a + ON (a.user_id_a = ma_p.user_id_p) + ) + ) AS a_ma_p + ) AS inner_filter_q + JOIN + (SELECT + value_2, value_3, user_id AS user_id_ck + FROM + events_table + WHERE + event_type = ANY(ARRAY [10, 11, 12]) + ORDER BY + value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10 + ) AS ma_ck + ON (ma_ck.user_id_ck = inner_filter_q.user_id) + ) AS inner_sub_q + ORDER BY + value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10 + ) AS outer_sub_q + ORDER BY + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC + LIMIT 10) AS inner_search_q + ON (ma_e.user_id_e = inner_search_q.user_id) + ) AS outer_inner_sub_q ORDER BY - value_3 ASC, - user_id DESC, - array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, - event_type_e DESC + value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC LIMIT 10; @@ -1354,11 +1478,13 @@ SELECT user_id, array_length(events_table, 1) FROM ( SELECT user_id, array_agg(event ORDER BY time) AS events_table 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 e.event_type IN (100, 101, 102) + 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 e.event_type IN (100, 101, 102) ) t GROUP BY user_id ) q @@ -1370,11 +1496,13 @@ SELECT user_id, array_length(events_table, 1) FROM ( SELECT user_id, array_agg(event ORDER BY time) AS events_table 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 e.event_type IN (100, 101, 102) + 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 e.event_type IN (100, 101, 102) ) t GROUP BY user_id ) q @@ -1392,11 +1520,13 @@ SELECT user_id, array_length(events_table, 1) FROM ( SELECT user_id, array_agg(event ORDER BY time) AS events_table 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 e.event_type IN (100, 101, 102) + 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 e.event_type IN (100, 101, 102) ) t GROUP BY user_id ) q @@ -1408,11 +1538,13 @@ SELECT user_id, array_length(events_table, 1) FROM ( SELECT user_id, array_agg(event ORDER BY time) AS events_table 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 e.event_type IN (100, 101, 102) + 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 e.event_type IN (100, 101, 102) ) t GROUP BY user_id ) q diff --git a/src/test/regress/sql/multi_subquery_complex_queries.sql b/src/test/regress/sql/multi_subquery_complex_queries.sql index 412c73793..d4838a7b6 100644 --- a/src/test/regress/sql/multi_subquery_complex_queries.sql +++ b/src/test/regress/sql/multi_subquery_complex_queries.sql @@ -17,95 +17,120 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- same query with target entries shuffled inside UNIONs SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- not supported since events_subquery_2 doesn't have partition key on the target list -- within the shuffled target list @@ -113,166 +138,138 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."user_id" * 2 - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."user_id" * 2 + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- not supported since events_subquery_2 doesn't have partition key on the target list SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."value_2" as user_id - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."value_2" as user_id + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; - --- not supported since events_subquery_2 doesn't have partition key on the target list -SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType -FROM - ( SELECT *, random() - FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT * - FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 - GROUP BY "t1"."user_id") AS t) "q" -INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- we can support arbitrary subqueries within UNIONs SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT *, random() - FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT + *, random() + FROM + (SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT * - FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events + FROM ( + (SELECT + * + FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION (SELECT * FROM @@ -290,50 +287,61 @@ FROM event_type IN (10, 11, 12, 13, 14, 15) GROUP BY "events"."user_id" ) as events_subquery_5 - ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) + ) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- not supported since events_subquery_5 is not joined on partition key SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT *, random() - FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT + *, random() + FROM + (SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT * - FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events + FROM ( + (SELECT + * + FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION (SELECT * FROM @@ -351,183 +359,238 @@ FROM event_type IN (10, 11, 12, 13, 14, 15) GROUP BY "events"."user_id" ) as events_subquery_5 - ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) + ) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- not supported since the join is not equi join SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id != q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id != q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- not supported since subquery 3 includes a JOIN with non-equi join SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events", users_table as "users" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) AND users.user_id != events.user_id ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."time", 1 AS event, "events"."value_2" as user_id - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events", users_table as "users" - WHERE event_type IN (20, 21, 22, 23, 24, 25) AND users.user_id != events.user_id) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- similar query with more union statements (to enable UNION tree become larger) SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 4 AS event - FROM events_table as "events" - WHERE event_type IN (31, 32, 33, 34, 35, 36)) events_subquery_5) + (SELECT + "events"."user_id", "events"."time", 4 AS event + FROM + events_table as "events" + WHERE + event_type IN (31, 32, 33, 34, 35, 36)) events_subquery_5) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 5 AS event - FROM events_table as "events" - WHERE event_type IN (37, 38, 39, 40, 41, 42)) events_subquery_6) + (SELECT + "events"."user_id", "events"."time", 5 AS event + FROM + events_table as "events" + WHERE + event_type IN (37, 38, 39, 40, 41, 42)) events_subquery_6) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 6 AS event - FROM events_table as "events" - WHERE event_type IN (50, 51, 52, 53, 54, 55)) events_subquery_6) + (SELECT + "events"."user_id", "events"."time", 6 AS event + FROM + events_table as "events" + WHERE + event_type IN (50, 51, 52, 53, 54, 55)) events_subquery_6) ) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN @@ -545,40 +608,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION ALL - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION ALL + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN (SELECT "users"."user_id" @@ -592,46 +660,54 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION ALL (SELECT * FROM - (SELECT "events"."time", 3 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t +ON (t.user_id = q.user_id)) as final_query GROUP BY types ORDER BY types; @@ -640,40 +716,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION ALL - (SELECT * - FROM - (SELECT "events"."value_2", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."value_2", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION ALL + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN (SELECT "users"."user_id" @@ -688,438 +769,479 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM (SELECT - "events"."time", - 0 AS event, - "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + "events"."time", 0 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."time", 1 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."time", 1 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."time", 2 AS event, "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."time", 2 AS event, "events"."user_id" + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION ALL (SELECT * FROM - (SELECT "events"."time", 3 AS event, 2 * "events"."user_id" - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."time", 3 AS event, "events"."user_id" * 2 + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t +ON (t.user_id = q.user_id)) as final_query GROUP BY types ORDER BY types; -- union all with inner and left joins SELECT user_id, count(*) as cnt FROM - (SELECT first_query.user_id, - Random() + (SELECT first_query.user_id, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" + FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "first_query" INNER JOIN (SELECT "t"."user_id" FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t - LEFT OUTER JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + LEFT OUTER JOIN ( - SELECT DISTINCT "events"."user_id" as user_id - FROM events_table as "events" - WHERE event_type IN (35, 36, 37, 38) - GROUP BY user_id + SELECT + DISTINCT "events"."user_id" as user_id + FROM + events_table as "events" + WHERE + event_type IN (35, 36, 37, 38) + GROUP BY + user_id ) as t2 - on (t2.user_id = t.user_id) WHERE t2.user_id is NULL) as second_query - ON ("first_query".user_id = "second_query".user_id)) as final_query -GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; + ON (t2.user_id = t.user_id) WHERE t2.user_id is NULL) as second_query + ON ("first_query".user_id = "second_query".user_id)) as final_query +GROUP BY + user_id ORDER BY cnt DESC, user_id DESC +LIMIT 10; -- not supported since the join between t and t2 is not equi join -- union all with inner and left joins SELECT user_id, count(*) as cnt FROM - (SELECT first_query.user_id, - Random() + (SELECT first_query.user_id, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" + FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION ALL (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "first_query" INNER JOIN (SELECT "t"."user_id" FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t - LEFT OUTER JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + LEFT OUTER JOIN ( - SELECT DISTINCT "events"."user_id" as user_id - FROM events_table as "events" - WHERE event_type IN (35, 36, 37, 38) - GROUP BY user_id + SELECT + DISTINCT "events"."user_id" as user_id + FROM + events_table as "events" + WHERE + event_type IN (35, 36, 37, 38) + GROUP BY + user_id ) as t2 - on (t2.user_id > t.user_id) WHERE t2.user_id is NULL) as second_query - ON ("first_query".user_id = "second_query".user_id)) as final_query -GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; + ON (t2.user_id > t.user_id) WHERE t2.user_id is NULL) as second_query + ON ("first_query".user_id = "second_query".user_id)) as final_query +GROUP BY + user_id ORDER BY cnt DESC, user_id DESC +LIMIT 10; -- -- Union, inner join and left join -- SELECT user_id, count(*) as cnt FROM - (SELECT first_query.user_id, - Random() + (SELECT first_query.user_id, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" + FROM + ( SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "first_query" INNER JOIN (SELECT "t"."user_id" FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t - LEFT OUTER JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + LEFT OUTER JOIN ( - SELECT DISTINCT "events"."user_id" as user_id - FROM events_table as "events" - WHERE event_type IN (35, 36, 37, 38) - GROUP BY user_id + SELECT + DISTINCT "events"."user_id" as user_id + FROM + events_table as "events" + WHERE + event_type IN (35, 36, 37, 38) + GROUP BY + user_id ) as t2 - on (t2.user_id = t.user_id) WHERE t2.user_id is NULL) as second_query - ON ("first_query".user_id = "second_query".user_id)) as final_query -GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; - - -- - -- Unions, left / inner joins - -- -SELECT user_id, count(*) as cnt -FROM - (SELECT first_query.user_id, - Random() - FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" - FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT * - FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 - GROUP BY "t1"."user_id") AS t) "first_query" -INNER JOIN - (SELECT "t"."user_id" - FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t - left OUTER JOIN - (SELECT DISTINCT("events"."user_id") - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13) - GROUP BY user_id - ) as t2 on t2.user_id = t.user_id where t2.user_id is NULL) as second_query - ON ("first_query".user_id = "second_query".user_id)) as final_query -GROUP BY user_id ORDER BY cnt DESC, user_id DESC LIMIT 10; - + ON (t2.user_id = t.user_id) WHERE t2.user_id is NULL) as second_query + ON ("first_query".user_id = "second_query".user_id)) as final_query +GROUP BY + user_id ORDER BY cnt DESC, user_id DESC +LIMIT 10; -- Simple LATERAL JOINs with GROUP BYs in each side SELECT * FROM (SELECT "some_users_data".user_id, lastseen FROM - (SELECT user_id, - Max(time) AS lastseen + (SELECT user_id, max(time) AS lastseen FROM - (SELECT user_id, - time + (SELECT user_id, time FROM - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40) "events_1" - ORDER BY time DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40) "events_1" + ORDER BY + time DESC LIMIT 1000) "recent_events_1" - GROUP BY user_id - ORDER BY max(time) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(time) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 50 and users.value_2 < 55 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 50 and users.value_2 < 55 + LIMIT 1) "some_users_data" + ON TRUE + ORDER BY + lastseen DESC LIMIT 50) "some_users" - order BY user_id - limit 50; +order BY + user_id +LIMIT 50; -- same query with subuqery joins in topmost select SELECT "some_users_data".user_id, lastseen FROM - (SELECT user_id, - Max(TIME) AS lastseen + (SELECT user_id, max(time) AS lastseen FROM - (SELECT user_id, - TIME + (SELECT user_id, time FROM - (SELECT user_id, - TIME - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40) "events_1" - ORDER BY TIME DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40) "events_1" + ORDER BY + time DESC LIMIT 1000) "recent_events_1" - GROUP BY user_id - ORDER BY max(TIME) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(TIME) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 50 and users.value_2 < 55 - LIMIT 1) "some_users_data" ON TRUE -ORDER BY user_id + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 50 and users.value_2 < 55 + LIMIT 1) "some_users_data" + ON TRUE +ORDER BY + user_id limit 50; -- not supported since JOIN is not on the partition key -SELECT * +SELECT "some_users_data".user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen - FROM - (SELECT user_id, - Max(time) AS lastseen + (SELECT user_id, max(time) AS lastseen FROM - (SELECT user_id, - time + (SELECT user_id, time FROM - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40) "events_1" - ORDER BY time DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40) "events_1" + ORDER BY + time DESC LIMIT 1000) "recent_events_1" - GROUP BY user_id - ORDER BY max(time) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(TIME) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."value_1" = "some_recent_users"."user_id" - AND users.value_2 > 50 and users.value_2 < 55 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC - LIMIT 50) "some_users" - order BY user_id - limit 50; + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."value_1" = "some_recent_users"."user_id" AND + users.value_2 > 50 and users.value_2 < 55 + LIMIT 1) "some_users_data" + ON TRUE +ORDER BY + user_id +limit 50; -- not supported since JOIN is not on the partition key -- see (2 * user_id as user_id) target list element -SELECT * +SELECT "some_users_data".user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen - FROM - (SELECT 2 * user_id as user_id, - (time) AS lastseen + (SELECT 2 * user_id as user_id, max(time) AS lastseen FROM - (SELECT user_id, - time + (SELECT user_id, time FROM - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40) "events_1" - ORDER BY time DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40) "events_1" + ORDER BY + time DESC LIMIT 1000) "recent_events_1" - ) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(TIME) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 50 and users.value_2 < 55 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC - LIMIT 50) "some_users" - order BY user_id - limit 50; + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 50 and users.value_2 < 55 + LIMIT 1) "some_users_data" + ON TRUE +ORDER BY + user_id +limit 50; -- LATERAL JOINs used with INNER JOINs SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 - ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) filter_users_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) + filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE - ORDER BY time DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 AND + user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" + ON TRUE + ORDER BY + time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" + ON TRUE + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; -- -- A similar query with topmost select is dropped @@ -1127,297 +1249,429 @@ limit 10; -- SELECT "some_users_data".user_id, MAX(lastseen), count(*) FROM - (SELECT filter_users_1.user_id, - TIME AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) filter_users_1 JOIN LATERAL - (SELECT user_id, - TIME - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY TIME DESC - LIMIT 1) "last_events_1" ON TRUE - ORDER BY TIME DESC + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true + ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true GROUP BY 1 ORDER BY 2, 1 DESC -limit 10; +LIMIT 10; -- not supported since the inner JOIN is not equi join SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id != "user_where_1_join_1".user_id)) filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; -- not supported since the inner JOIN is not on the partition key SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id", "users"."value_1" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id", "users"."value_1" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id = "user_where_1_join_1".value_1)) filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; -- not supported since upper LATERAL JOIN is not equi join SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id", "users"."value_1" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id", "users"."value_1" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id != filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id != filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; -- not supported since lower LATERAL JOIN is not on the partition key SELECT user_id, lastseen FROM - (SELECT "some_users_data".user_id, lastseen + (SELECT + "some_users_data".user_id, lastseen FROM - (SELECT filter_users_1.user_id, - time AS lastseen + (SELECT + filter_users_1.user_id, time AS lastseen FROM - (SELECT user_where_1_1.user_id + (SELECT + user_where_1_1.user_id FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_1 > 20) user_where_1_1 INNER JOIN - (SELECT "users"."user_id", "users"."value_1" - FROM users_table as "users" - WHERE user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 + (SELECT + "users"."user_id", "users"."value_1" + FROM + users_table as "users" + WHERE + user_id > 12 and user_id < 16 and value_2 > 60) user_where_1_join_1 ON ("user_where_1_1".user_id = "user_where_1_join_1".user_id)) filter_users_1 JOIN LATERAL - (SELECT user_id, - time - FROM events_table as "events" - WHERE user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id - ORDER BY time DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, time + FROM + events_table as "events" + WHERE + user_id > 12 and user_id < 16 and user_id = filter_users_1.user_id + ORDER BY + time DESC + LIMIT 1) "last_events_1" ON true ORDER BY time DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."value_1" = "some_recent_users"."user_id" - AND "users"."value_2" > 70 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY lastseen DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."value_1" = "some_recent_users"."user_id" AND + "users"."value_2" > 70 + LIMIT 1) "some_users_data" ON true + ORDER BY + lastseen DESC LIMIT 10) "some_users" -order BY user_id DESC -limit 10; +ORDER BY + user_id DESC +LIMIT 10; -- NESTED INNER JOINs SELECT count(*) AS value, "generated_group_field" FROM - (SELECT DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" + (SELECT + DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" FROM - (SELECT "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" + (SELECT + "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" FROM - (SELECT * + (SELECT + * FROM - (SELECT "events"."time", "events"."user_id", "events"."value_2" - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40 and event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" - inner JOIN + (SELECT + "events"."time", "events"."user_id", "events"."value_2" + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40 AND event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" + INNER JOIN (SELECT user_where_1_1.real_user_id FROM - (SELECT "users"."user_id" as real_user_id - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 + (SELECT + "users"."user_id" as real_user_id + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 ON ("user_where_1_1".real_user_id = "user_where_1_join_1".user_id)) "user_filters_1" - ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" - GROUP BY "generated_group_field" ORDER BY generated_group_field DESC, value DESC; + ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" +GROUP BY + "generated_group_field" +ORDER BY + generated_group_field DESC, value DESC; -- not supported since the first inner join is not on the partition key SELECT count(*) AS value, "generated_group_field" FROM - (SELECT DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" + (SELECT + DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" FROM - (SELECT "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" + (SELECT + "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" FROM - (SELECT * + (SELECT + * FROM - (SELECT "events"."time", "events"."user_id", "events"."value_2" - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40 and event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" - inner JOIN + (SELECT + "events"."time", "events"."user_id", "events"."value_2" + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40 AND event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" + INNER JOIN (SELECT user_where_1_1.real_user_id FROM - (SELECT "users"."user_id" as real_user_id - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 + (SELECT + "users"."user_id" as real_user_id + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 - ON ("user_where_1_1".real_user_id = "user_where_1_join_1".user_id)) "user_filters_1" - ON ("temp_data_queries".value_2 = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" - GROUP BY "generated_group_field" ORDER BY generated_group_field DESC, value DESC; + (SELECT + "users"."user_id", "users"."value_2" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 + ON ("user_where_1_1".real_user_id = "user_where_1_join_1".value_2)) "user_filters_1" + ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" +GROUP BY + "generated_group_field" +ORDER BY + generated_group_field DESC, value DESC; -- not supported since the first inner join is not an equi join SELECT count(*) AS value, "generated_group_field" FROM - (SELECT DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" + (SELECT + DISTINCT "pushedDownQuery"."real_user_id", "generated_group_field" FROM - (SELECT "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" + (SELECT + "eventQuery"."real_user_id", "eventQuery"."time", random(), ("eventQuery"."value_2") AS "generated_group_field" FROM - (SELECT * + (SELECT + * FROM - (SELECT "events"."time", "events"."user_id", "events"."value_2" - FROM events_table as "events" - WHERE user_id > 10 and user_id < 40 and event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" - inner JOIN + (SELECT + "events"."time", "events"."user_id", "events"."value_2" + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 40 AND event_type IN (40, 41, 42, 43, 44, 45) ) "temp_data_queries" + INNER JOIN (SELECT user_where_1_1.real_user_id FROM - (SELECT "users"."user_id" as real_user_id - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 + (SELECT + "users"."user_id" as real_user_id + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 50 ) user_where_1_1 INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 + (SELECT + "users"."user_id", "users"."value_2" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_3 > 50 ) user_where_1_join_1 ON ("user_where_1_1".real_user_id >= "user_where_1_join_1".user_id)) "user_filters_1" - ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" - GROUP BY "generated_group_field" ORDER BY generated_group_field DESC, value DESC; + ON ("temp_data_queries".user_id = "user_filters_1".real_user_id)) "eventQuery") "pushedDownQuery") "pushedDownQuery" +GROUP BY + "generated_group_field" +ORDER BY + generated_group_field DESC, value DESC; -- single level inner joins SELECT "value_3", count(*) AS cnt FROM - (SELECT "value_3", "user_id", random() + (SELECT + "value_3", "user_id", random() FROM - (SELECT users_in_segment_1.user_id, value_3 + (SELECT + users_in_segment_1.user_id, value_3 FROM - (SELECT user_id, value_3 * 2 as value_3 + (SELECT + user_id, value_3 * 2 as value_3 FROM - (SELECT user_id, value_3 + (SELECT + user_id, value_3 FROM - (SELECT "users"."user_id", value_3 - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 30 + (SELECT + "users"."user_id", value_3 + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 30 ) simple_user_where_1 ) all_buckets_1 ) users_in_segment_1 JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 60 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 60 ) some_users_data ON ("users_in_segment_1".user_id = "some_users_data".user_id) ) segmentalias_1) "tempQuery" @@ -1429,148 +1683,204 @@ ORDER BY cnt, value_3 DESC LIMIT 10; SELECT "value_3", count(*) AS cnt FROM -(SELECT "value_3", "user_id", random() - FROM - (SELECT users_in_segment_1.user_id, value_3 - FROM - (SELECT user_id, value_3 * 2 as value_3 - FROM - (SELECT user_id, value_3 - FROM - (SELECT "users"."user_id", value_3 - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 30) simple_user_where_1) all_buckets_1) users_in_segment_1 - JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 10 and user_id < 40 and value_2 > 60) some_users_data - - ON (true)) segmentalias_1) "tempQuery" - GROUP BY "value_3" ORDER BY cnt, value_3 DESC LIMIT 10; + (SELECT + "value_3", "user_id", random() + FROM + (SELECT + users_in_segment_1.user_id, value_3 + FROM + (SELECT + user_id, value_3 * 2 as value_3 + FROM + (SELECT + user_id, value_3 + FROM + (SELECT + "users"."user_id", value_3 + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 30 + ) simple_user_where_1 + ) all_buckets_1 + ) users_in_segment_1 + JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 10 and user_id < 40 and value_2 > 60 + ) some_users_data + ON (true) + ) segmentalias_1) "tempQuery" +GROUP BY "value_3" +ORDER BY cnt, value_3 DESC LIMIT 10; -- nested LATERAL JOINs SELECT * FROM - (SELECT "some_users_data".user_id, - "some_recent_users".value_3 + (SELECT "some_users_data".user_id, "some_recent_users".value_3 FROM - (SELECT filter_users_1.user_id, - value_3 + (SELECT + filter_users_1.user_id, value_3 FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 20 and user_id < 70 and users.value_2 = 200) filter_users_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 20 and user_id < 70 and users.value_2 = 200) filter_users_1 JOIN LATERAL - (SELECT user_id, - value_3 - FROM events_table as "events" - WHERE user_id > 20 and user_id < 70 - AND ("events".user_id = "filter_users_1".user_id) - ORDER BY value_3 DESC - LIMIT 1) "last_events_1" ON TRUE + (SELECT + user_id, value_3 + FROM + events_table as "events" + WHERE + user_id > 20 and user_id < 70 AND + ("events".user_id = "filter_users_1".user_id) + ORDER BY + value_3 DESC + LIMIT 1) "last_events_1" ON true ORDER BY value_3 DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 200 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY value_3 DESC - LIMIT 10) "some_users" - order BY + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 200 + LIMIT 1) "some_users_data" ON true + ORDER BY + value_3 DESC +LIMIT 10) "some_users" +ORDER BY value_3 DESC - limit 10; +LIMIT 10; -- nested lateral join at top most level SELECT "some_users_data".user_id, "some_recent_users".value_3 FROM - (SELECT filter_users_1.user_id, value_3 + (SELECT + filter_users_1.user_id, value_3 FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 20 and user_id < 70 and users.value_2 = 200 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 20 and user_id < 70 and users.value_2 = 200 ) filter_users_1 JOIN LATERAL - (SELECT user_id, value_3 - FROM events_table as "events" - WHERE user_id > 20 and user_id < 70 - AND ("events".user_id = "filter_users_1".user_id) - ORDER BY value_3 DESC + (SELECT + user_id, value_3 + FROM + events_table as "events" + WHERE + user_id > 20 and user_id < 70 AND + ("events".user_id = "filter_users_1".user_id) + ORDER BY + value_3 DESC LIMIT 1 - ) "last_events_1" ON TRUE + ) "last_events_1" ON true ORDER BY value_3 DESC LIMIT 10 ) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 200 + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 200 LIMIT 1 - ) "some_users_data" ON TRUE -ORDER BY value_3 DESC, user_id ASC + ) "some_users_data" ON true +ORDER BY + value_3 DESC, user_id ASC LIMIT 10; -- longer nested lateral joins SELECT * FROM - (SELECT "some_users_data".user_id, - "some_recent_users".value_3 + (SELECT "some_users_data".user_id, "some_recent_users".value_3 FROM - (SELECT filter_users_1.user_id, - value_3 + (SELECT filter_users_1.user_id, value_3 FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 20 and user_id < 70 and users.value_2 = 200) filter_users_1 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 20 and user_id < 70 and users.value_2 = 200) filter_users_1 JOIN LATERAL - (SELECT user_id, - value_3 - FROM events_table as "events" - WHERE user_id > 20 and user_id < 70 - AND ("events".user_id = "filter_users_1".user_id) - ORDER BY value_3 DESC - LIMIT 1) "last_events_1" ON TRUE - ORDER BY value_3 DESC + (SELECT + user_id, value_3 + FROM + events_table as "events" + WHERE + user_id > 20 and user_id < 70 AND + ("events".user_id = "filter_users_1".user_id) + ORDER BY + value_3 DESC + LIMIT 1) "last_events_1" ON true + ORDER BY + value_3 DESC LIMIT 10) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 200 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY value_3 DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 200 + LIMIT 1) "some_users_data" ON true + ORDER BY + value_3 DESC LIMIT 10) "some_users" - order BY +ORDER BY value_3 DESC - limit 10; +LIMIT 10; -- longer nested lateral join wth top level join SELECT "some_users_data".user_id, "some_recent_users".value_3 FROM (SELECT filter_users_1.user_id, value_3 FROM - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 20 and user_id < 70 and users.value_2 = 200 + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 20 and user_id < 70 and users.value_2 = 200 ) filter_users_1 JOIN LATERAL - (SELECT user_id, value_3 - FROM events_table as "events" - WHERE user_id > 20 and user_id < 70 - AND ("events".user_id = "filter_users_1".user_id) - ORDER BY value_3 DESC + (SELECT + user_id, value_3 + FROM + events_table as "events" + WHERE + user_id > 20 and user_id < 70 + AND + ("events".user_id = "filter_users_1".user_id) + ORDER BY + value_3 DESC LIMIT 1 ) "last_events_1" ON TRUE ORDER BY value_3 DESC LIMIT 10 ) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND users.value_2 > 200 + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + users.value_2 > 200 LIMIT 1 ) "some_users_data" ON TRUE ORDER BY value_3 DESC @@ -1580,102 +1890,136 @@ LIMIT 10; SELECT count(*) AS cnt, "generated_group_field" FROM - (SELECT "eventQuery"."user_id", random(), generated_group_field + (SELECT + "eventQuery"."user_id", random(), generated_group_field FROM - (SELECT "multi_group_wrapper_1".*, generated_group_field, random() + (SELECT + "multi_group_wrapper_1".*, generated_group_field, random() FROM (SELECT * FROM - (SELECT "events"."time", "events"."user_id" as event_user_id - FROM events_table as "events" - WHERE user_id > 80) "temp_data_queries" - INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE user_id > 80 and value_2 = 5) "user_filters_1" - on ("temp_data_queries".event_user_id = "user_filters_1".user_id)) AS "multi_group_wrapper_1" + (SELECT + "events"."time", "events"."user_id" as event_user_id + FROM + events_table as "events" + WHERE + user_id > 80) "temp_data_queries" + INNER JOIN + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + user_id > 80 and value_2 = 5) "user_filters_1" + ON ("temp_data_queries".event_user_id = "user_filters_1".user_id)) AS "multi_group_wrapper_1" LEFT JOIN - (SELECT "users"."user_id" AS "user_id", value_2 AS "generated_group_field" - FROM users_table as "users") "left_group_by_1" - on ("left_group_by_1".user_id = "multi_group_wrapper_1".event_user_id)) "eventQuery") "pushedDownQuery" + (SELECT + "users"."user_id" AS "user_id", value_2 AS "generated_group_field" + FROM + users_table as "users") "left_group_by_1" + ON ("left_group_by_1".user_id = "multi_group_wrapper_1".event_user_id)) "eventQuery") "pushedDownQuery" group BY "generated_group_field" - ORDER BY cnt DESC, generated_group_field ASC + ORDER BY + cnt DESC, generated_group_field ASC LIMIT 10; -- single table subquery, no JOINS involved SELECT count(*) AS cnt, user_id FROM - (SELECT "eventQuery"."user_id", random() + (SELECT + "eventQuery"."user_id", random() FROM - (SELECT "events"."user_id" - FROM events_table "events" - WHERE event_type IN (10, 20, 30, 40, 50, 60, 70, 80, 90)) "eventQuery") "pushedDownQuery" - GROUP BY - "user_id" - ORDER BY cnt DESC, user_id DESC - LIMIT 10; + (SELECT + "events"."user_id" + FROM + events_table "events" + WHERE + event_type IN (10, 20, 30, 40, 50, 60, 70, 80, 90)) "eventQuery") "pushedDownQuery" +GROUP BY + "user_id" +ORDER BY + cnt DESC, user_id DESC +LIMIT 10; -- lateral joins in the nested manner SELECT * FROM - (SELECT "some_users_data".user_id, value_2 + (SELECT + "some_users_data".user_id, value_2 FROM - (SELECT user_id, - Max(value_2) AS value_2 + (SELECT user_id, max(value_2) AS value_2 FROM - (SELECT user_id, - value_2 + (SELECT user_id, value_2 FROM - (SELECT user_id, - value_2 - FROM events_table as "events" - WHERE user_id > 10 and user_id < 20) "events_1" - ORDER BY value_2 DESC + (SELECT + user_id, value_2 + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 20) "events_1" + ORDER BY + value_2 DESC LIMIT 10000) "recent_events_1" - GROUP BY user_id - ORDER BY max(value_2) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(value_2) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."user_id" = "some_recent_users"."user_id" - AND value_2 > 75 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY value_2 DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."user_id" = "some_recent_users"."user_id" AND + value_2 > 75 + LIMIT 1) "some_users_data" ON true + ORDER BY + value_2 DESC LIMIT 10) "some_users" - order BY value_2 DESC, user_id DESC - limit 10; +ORDER BY + value_2 DESC, user_id DESC +LIMIT 10; -- not supported since join is not on the partition key SELECT * FROM - (SELECT "some_users_data".user_id, value_2 + (SELECT + "some_users_data".user_id, value_2 FROM - (SELECT user_id, - Max(value_2) AS value_2 + (SELECT user_id, max(value_2) AS value_2 FROM - (SELECT user_id, - value_2 + (SELECT user_id, value_2 FROM - (SELECT user_id, - value_2 - FROM events_table as "events" - WHERE user_id > 10 and user_id < 20) "events_1" - ORDER BY value_2 DESC + (SELECT + user_id, value_2 + FROM + events_table as "events" + WHERE + user_id > 10 and user_id < 20) "events_1" + ORDER BY + value_2 DESC LIMIT 10000) "recent_events_1" - GROUP BY user_id - ORDER BY max(value_2) DESC) "some_recent_users" + GROUP BY + user_id + ORDER BY + max(value_2) DESC) "some_recent_users" JOIN LATERAL - (SELECT "users".user_id - FROM users_table as "users" - WHERE "users"."value_2" = "some_recent_users"."user_id" - AND value_2 > 75 - LIMIT 1) "some_users_data" ON TRUE - ORDER BY value_2 DESC + (SELECT + "users".user_id + FROM + users_table as "users" + WHERE + "users"."value_2" = "some_recent_users"."user_id" AND + value_2 > 75 + LIMIT 1) "some_users_data" ON true + ORDER BY + value_2 DESC LIMIT 10) "some_users" - order BY value_2 DESC, user_id DESC - limit 10; +ORDER BY + value_2 DESC, user_id DESC +LIMIT 10; -- lets test some unsupported set operations @@ -1684,94 +2028,124 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION - (SELECT * + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - INTERSECT - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + INTERSECT + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- not supported due to offset SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13) ) events_subquery_4) OFFSET 3 ) t1 + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4) OFFSET 3) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- not supported due to window functions SELECT user_id, @@ -1790,83 +2164,112 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION - (SELECT * - FROM - (SELECT 1, now(), 3 AS event) events_subquery_4)) t1 + (SELECT + * + FROM + (SELECT + 1 as user_id, now(), 3 AS event + ) events_subquery_4) OFFSET 3) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT "users"."user_id" - FROM users_table as "users" - WHERE value_1 > 50 and value_1 < 70) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT + "users"."user_id" + FROM + users_table as "users" + WHERE + value_1 > 50 and value_1 < 70) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -- similar to the above, but constant rte is on the right side of the query SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT * + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) - UNION ALL - (SELECT * + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + UNION + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) - UNION ALL - (SELECT * + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT + * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) - UNION ALL - (SELECT * - FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION + (SELECT + * + FROM + (SELECT + 1 as user_id, now(), 3 AS event + ) events_subquery_4) OFFSET 3) t1 GROUP BY "t1"."user_id") AS t) "q" INNER JOIN - (SELECT random()::int as user_id) AS t ON (t.user_id = q.user_id)) as final_query -GROUP BY types -ORDER BY types; + (SELECT random()::int as user_id) AS t + ON (t.user_id = q.user_id)) as final_query +GROUP BY + types +ORDER BY + types; -SET citus.enable_router_execution TO TRUE; +SET citus.enable_router_execution TO TRUE; \ No newline at end of file diff --git a/src/test/regress/sql/multi_subquery_union.sql b/src/test/regress/sql/multi_subquery_union.sql index 7589128b4..ef960e49e 100644 --- a/src/test/regress/sql/multi_subquery_union.sql +++ b/src/test/regress/sql/multi_subquery_union.sql @@ -123,34 +123,40 @@ FROM ( ( SELECT user_id, sum(counter) FROM - ( SELECT user_id, - sum(value_2) AS counter - FROM users_table - GROUP BY user_id - + (SELECT + user_id, sum(value_2) AS counter + FROM + users_table + GROUP BY + user_id UNION - - SELECT user_id, - sum(value_2) AS counter - FROM events_table - GROUP BY user_id ) user_id_1 - GROUP BY user_id) + SELECT + user_id, sum(value_2) AS counter + FROM + events_table + GROUP BY + user_id) user_id_1 + GROUP BY + user_id) UNION - ( SELECT user_id, - sum(counter) + (SELECT + user_id, sum(counter) FROM - ( SELECT - user_id, sum(value_2) AS counter - FROM users_table - GROUP BY user_id - + (SELECT + user_id, sum(value_2) AS counter + FROM + users_table + GROUP BY + user_id UNION - - SELECT user_id, sum(value_2) AS counter - - FROM events_table - GROUP BY user_id) user_id_2 - GROUP BY user_id)) AS ftop + SELECT + user_id, sum(value_2) AS counter + FROM + events_table + GROUP BY + user_id) user_id_2 + GROUP BY + user_id)) AS ftop ORDER BY 2 DESC, 1 DESC LIMIT 5; @@ -159,40 +165,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM ( SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( (SELECT * FROM - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) UNION (SELECT * FROM - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" ) as final_query GROUP BY types @@ -202,36 +213,41 @@ ORDER BY types; -- but wrapper unions are removed from the inner part of the query SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT *, random() + (SELECT *, random() FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + (SELECT + "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events - FROM ( - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15)) + (SELECT + "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events + FROM( + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) UNION - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) UNION - - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) UNION - - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13))) t1 GROUP BY "t1"."user_id") AS t) "q" ) as final_query GROUP BY types @@ -240,35 +256,37 @@ ORDER BY types; -- again excatly the same query with top level wrapper removed SELECT ("q"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) - ) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) UNION - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) UNION - - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) UNION - - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13))) t1 GROUP BY "t1"."user_id") AS t) "q" GROUP BY types ORDER BY types; @@ -280,60 +298,71 @@ FROM FROM ( SELECT "t1"."user_id" FROM ( - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) - ) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) UNION - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) UNION - - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) UNION - - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 - ) AS t) "q" ORDER BY 1 LIMIT 5; + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13))) t1 + ) AS t) "q" +ORDER BY 1 +LIMIT 5; -- a very similar query UNION ALL SELECT ("q"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") - ORDER BY TIME ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT "events"."user_id", - "events"."time", - 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) - ) + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) UNION ALL - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) UNION ALL - - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) UNION ALL - - (SELECT "events"."user_id", "events"."time", 3 AS event - FROM events_table as "events" - WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 + (SELECT + "events"."user_id", "events"."time", 3 AS event + FROM + events_table as "events" + WHERE + event_type IN (26, 27, 28, 29, 30, 13))) t1 GROUP BY "t1"."user_id") AS t) "q" GROUP BY types ORDER BY types; @@ -405,13 +434,13 @@ FROM (SELECT value_3, user_id FROM events_table where event_type IN (1, 2, 3, 4, 5)) UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (6, 7, 8, 9, 10)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (11, 12, 13, 14, 15)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (16, 17, 18, 19, 20)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (21, 22, 23, 24, 25)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (26, 27, 28, 29, 30)) ) b ORDER BY 1 DESC, 2 DESC @@ -425,13 +454,13 @@ FROM (SELECT value_3, user_id FROM events_table where event_type IN (1, 2, 3, 4, 5)) UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (6, 7, 8, 9, 10)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (11, 12, 13, 14, 15)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (16, 17, 18, 19, 20)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (21, 22, 23, 24, 25)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (26, 27, 28, 29, 30)) ) b GROUP BY user_id @@ -458,9 +487,9 @@ FROM ( SELECT user_id, sum(value_2) AS counter FROM users_table where value_1 < 40 and value_1 < 60 GROUP BY user_id HAVING sum(value_2) > 500 UNION SELECT user_id, sum(value_2) AS counter FROM users_table where value_1 < 60 and value_1 < 80 GROUP BY user_id HAVING sum(value_2) > 500 - UNION + UNION SELECT user_id, sum(value_2) AS counter FROM users_table where value_1 < 80 and value_1 < 100 GROUP BY user_id HAVING sum(value_2) > 500 - UNION + UNION SELECT 2 * user_id, sum(value_2) AS counter FROM users_table where value_1 < 100 and value_1 < 120 GROUP BY user_id HAVING sum(value_2) > 500 ) user_id GROUP BY user_id ORDER BY 1 DESC LIMIT 5; @@ -472,7 +501,7 @@ SELECT * FROM SELECT user_id, sum(counter) FROM ( SELECT user_id, sum(value_2) AS counter FROM users_table GROUP BY user_id - UNION + UNION SELECT user_id, sum(value_2) AS counter FROM events_table GROUP BY user_id ) user_id_1 GROUP BY user_id @@ -492,7 +521,7 @@ UNION SELECT user_id, sum(counter) FROM ( SELECT user_id, sum(value_2) AS counter FROM users_table GROUP BY user_id - UNION + UNION SELECT events_table.user_id, sum(events_table.value_2) AS counter FROM events_table, users_table WHERE users_table.user_id > events_table.user_id GROUP BY 1 ) user_id GROUP BY user_id; @@ -504,7 +533,7 @@ SELECT * FROM SELECT user_id, sum(counter) FROM ( SELECT user_id, sum(value_2) AS counter FROM users_table GROUP BY user_id - UNION + UNION SELECT user_id, sum(value_2) AS counter FROM events_table GROUP BY user_id ) user_id_1 GROUP BY user_id @@ -535,34 +564,41 @@ FROM ( ( SELECT user_id, sum(counter) FROM - ( SELECT user_id, - sum(value_2) AS counter - FROM users_table - GROUP BY user_id - + (SELECT + user_id, sum(value_2) AS counter + FROM + users_table + GROUP BY + user_id UNION - - SELECT user_id, - sum(value_2) AS counter - FROM events_table - GROUP BY user_id ) user_id_1 - GROUP BY user_id) + SELECT + user_id, sum(value_2) AS counter + FROM + events_table + GROUP BY + user_id) user_id_1 + GROUP BY + user_id) UNION - ( SELECT user_id, - sum(counter) + (SELECT + user_id, sum(counter) FROM - ( SELECT sum(value_2) AS counter, - user_id - FROM users_table - GROUP BY user_id - + (SELECT + sum(value_2) AS counter, user_id + FROM + users_table + GROUP BY + user_id UNION + SELECT + user_id, sum(value_2) AS counter + FROM + events_table + GROUP BY + user_id) user_id_2 + GROUP BY + user_id)) AS ftop; - SELECT user_id, - sum(value_2) AS counter - FROM events_table - GROUP BY user_id) user_id_2 - GROUP BY user_id)) AS ftop; -- some UNION all queries that are going to be pulled up SELECT @@ -582,13 +618,13 @@ FROM (SELECT value_3, user_id FROM events_table where event_type IN (1, 2, 3, 4, 5)) UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (6, 7, 8, 9, 10)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (11, 12, 13, 14, 15)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (16, 17, 18, 19, 20)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (21, 22, 23, 24, 25)) - UNION ALL + UNION ALL (SELECT value_3, value_2 FROM events_table where event_type IN (26, 27, 28, 29, 30)) ) b ORDER BY 1 DESC, 2 DESC @@ -632,43 +668,58 @@ FROM (SELECT value_3, user_id FROM events_table where event_type IN (1, 2, 3, 4, 5)) UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (6, 7, 8, 9, 10)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (11, 12, 13, 14, 15)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (16, 17, 18, 19, 20)) - UNION ALL + UNION ALL (SELECT value_3, user_id FROM events_table where event_type IN (21, 22, 23, 24, 25)) - UNION ALL + UNION ALL (SELECT 1, 2) ) b ORDER BY 1 DESC, 2 DESC LIMIT 5; -SELECT ("q"."event_types") as types, count(*) AS sumOfEventType +SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType FROM - ( SELECT "t"."user_id", - "t"."time", - unnest("t"."collected_events") AS "event_types" + ( SELECT *, random() + FROM + ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types" FROM - ( SELECT "t1"."user_id", - min("t1"."time") AS "time", - array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events + ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events FROM ( - (SELECT "events"."user_id", "events"."time", 0 AS event - FROM events_table as "events" - WHERE event_type IN (10, 11, 12, 13, 14, 15) - ) - UNION - (SELECT "events"."user_id", "events"."time", 1 AS event - FROM events_table as "events" - WHERE event_type IN (15, 16, 17, 18, 19) ) - UNION - (SELECT "events"."user_id", "events"."time", 2 AS event - FROM events_table as "events" - WHERE event_type IN (20, 21, 22, 23, 24, 25) ) - UNION - (SELECT 1, now(), 3 AS event)) t1 + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 0 AS event + FROM + events_table as "events" + WHERE + event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1) + UNION + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 1 AS event + FROM + events_table as "events" + WHERE + event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) + UNION + (SELECT * + FROM + (SELECT + "events"."user_id", "events"."time", 2 AS event + FROM + events_table as "events" + WHERE + event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) + UNION + (SELECT * + FROM + (SELECT 1, now(), 3 AS event) events_subquery_4)) t1 GROUP BY "t1"."user_id") AS t) "q" +) as final_query GROUP BY types ORDER BY types;