-- More complex CTEs in WHERE

SET citus.enable_repartition_joins TO on;

-- CTE in WHERE basic
WITH events AS (
  SELECT
    event_type
  FROM
    events_table
  WHERE
    user_id < 5
  GROUP BY
    event_type
  ORDER BY
    event_type
  LIMIT 10
)
SELECT
  count(*)
FROM
  events_table
WHERE
  event_type
IN
  (SELECT
    event_type
  FROM
    events);

WITH users AS (
    SELECT
      events_table.user_id
    FROM
      events_table, users_table
    WHERE
      events_table.user_id = users_table.user_id
    GROUP BY
      1
    ORDER BY
      1
    LIMIT 10
)
SELECT
  count(*)
FROM
  events_table
WHERE
  user_id IN
    (
      SELECT
        *
      FROM
        users
    );


WITH users AS (
    SELECT
      events_table.user_id
    FROM
      events_table, users_table
    WHERE
      events_table.user_id = users_table.user_id
    GROUP BY
      1
    ORDER BY
      1
    LIMIT 10
)
SELECT
  count(*)
FROM
  events_table
WHERE
  user_id IN
    (
      SELECT
        *
      FROM
        users
    );


-- CTE with non-colocated join in WHERE
WITH users AS (
    SELECT
      events_table.user_id
    FROM
      events_table, users_table
    WHERE
      events_table.value_2 = users_table.value_2
    GROUP BY
      1
    ORDER BY
      1
    LIMIT 10
)
SELECT
  count(*)
FROM
  events_table
WHERE
  user_id IN
    (
      SELECT
        *
      FROM
        users
    );

-- CTE in WHERE basic
-- this is a tricky query that hits an aggresive
-- check in subquery puwhdown after the recursive planning
-- where LIMIT should be allowed
-- if the query contains only intermediate results
SELECT
  count(*)
FROM
  events_table
WHERE
  event_type
IN
  (WITH events AS (
    SELECT
      event_type
    FROM
      events_table
    WHERE user_id < 5
    GROUP BY
      1
    ORDER BY
      1)
    SELECT * FROM events LIMIT 10
  );

-- CTE with non-colocated join in WHERE
-- this is a tricky query that hits an aggresive
-- check in subquery puwhdown after the recursive planning
-- where LIMIT should be allowed
-- if the query contains only intermediate results
SELECT
  count(*)
FROM
  events_table
WHERE
  user_id IN
    (WITH users AS
      (SELECT
          events_table.user_id
        FROM
          events_table, users_table
        WHERE
          events_table.value_2 = users_table.value_2
        GROUP BY
          1
        ORDER BY
          1
      )
      SELECT * FROM users LIMIT 10
    );
