aboutsummaryrefslogtreecommitdiff
path: root/sql/core/src/test/resources
diff options
context:
space:
mode:
Diffstat (limited to 'sql/core/src/test/resources')
-rw-r--r--sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/in-set-operations.sql472
-rw-r--r--sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/in-with-cte.sql287
-rw-r--r--sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/not-in-joins.sql167
-rw-r--r--sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/in-set-operations.sql.out595
-rw-r--r--sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/in-with-cte.sql.out364
-rw-r--r--sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/not-in-joins.sql.out229
6 files changed, 2114 insertions, 0 deletions
diff --git a/sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/in-set-operations.sql b/sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/in-set-operations.sql
new file mode 100644
index 0000000000..6b9e8bf2f3
--- /dev/null
+++ b/sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/in-set-operations.sql
@@ -0,0 +1,472 @@
+-- A test suite for set-operations in parent side, subquery, and both predicate subquery
+-- It includes correlated cases.
+
+create temporary view t1 as select * from values
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:00:00.000', date '2014-04-04'),
+ ("val1b", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1a", 16S, 12, 21L, float(15.0), 20D, 20E2, timestamp '2014-06-04 01:02:00.001', date '2014-06-04'),
+ ("val1a", 16S, 12, 10L, float(15.0), 20D, 20E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:02:00.001', date '2014-05-05'),
+ ("val1d", null, 16, 22L, float(17.0), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', null),
+ ("val1d", null, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-07-04 01:02:00.001', null),
+ ("val1e", 10S, null, 25L, float(17.0), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-09-04 01:02:00.001', date '2014-09-04'),
+ ("val1d", 10S, null, 12L, float(17.0), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:02:00.001', date '2014-04-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04')
+ as t1(t1a, t1b, t1c, t1d, t1e, t1f, t1g, t1h, t1i);
+
+create temporary view t2 as select * from values
+ ("val2a", 6S, 12, 14L, float(15), 20D, 20E2, timestamp '2014-04-04 01:01:00.000', date '2014-04-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 119L, float(17), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1c", 12S, 16, 219L, float(17), 25D, 26E2, timestamp '2016-05-04 01:01:00.000', date '2016-05-04'),
+ ("val1b", null, 16, 319L, float(17), 25D, 26E2, timestamp '2017-05-04 01:01:00.000', null),
+ ("val2e", 8S, null, 419L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1f", 19S, null, 519L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 12S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-05'),
+ ("val1e", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:01:00.000', date '2014-09-04'),
+ ("val1f", 19S, null, 19L, float(17), 25D, 26E2, timestamp '2014-10-04 01:01:00.000', date '2014-10-04'),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', null)
+ as t2(t2a, t2b, t2c, t2d, t2e, t2f, t2g, t2h, t2i);
+
+create temporary view t3 as select * from values
+ ("val3a", 6S, 12, 110L, float(15), 20D, 20E2, timestamp '2014-04-04 01:02:00.000', date '2014-04-04'),
+ ("val3a", 6S, 12, 10L, float(15), 20D, 20E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 219L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 319L, float(17), 25D, 26E2, timestamp '2014-06-04 01:02:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:02:00.000', date '2014-07-04'),
+ ("val3c", 17S, 16, 519L, float(17), 25D, 26E2, timestamp '2014-08-04 01:02:00.000', date '2014-08-04'),
+ ("val3c", 17S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:02:00.000', date '2014-09-05'),
+ ("val1b", null, 16, 419L, float(17), 25D, 26E2, timestamp '2014-10-04 01:02:00.000', null),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-11-04 01:02:00.000', null),
+ ("val3b", 8S, null, 719L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val3b", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2015-05-04 01:02:00.000', date '2015-05-04')
+ as t3(t3a, t3b, t3c, t3d, t3e, t3f, t3g, t3h, t3i);
+
+-- correlated IN subquery
+-- UNION, UNION ALL, UNION DISTINCT, INTERSECT and EXCEPT in the parent
+-- TC 01.01
+SELECT t2a,
+ t2b,
+ t2c,
+ t2h,
+ t2i
+FROM (SELECT *
+ FROM t2
+ WHERE t2a IN (SELECT t1a
+ FROM t1)
+ UNION ALL
+ SELECT *
+ FROM t3
+ WHERE t3a IN (SELECT t1a
+ FROM t1)) AS t3
+WHERE t2i IS NOT NULL AND
+ 2 * t2b = t2c
+ORDER BY t2c DESC nulls first;
+
+-- TC 01.02
+SELECT t2a,
+ t2b,
+ t2d,
+ Count(DISTINCT( t2h )),
+ t2i
+FROM (SELECT *
+ FROM t2
+ WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t2b = t1b)
+ UNION
+ SELECT *
+ FROM t1
+ WHERE t1a IN (SELECT t3a
+ FROM t3
+ WHERE t1c = t3c)) AS t3
+GROUP BY t2a,
+ t2b,
+ t2d,
+ t2i
+ORDER BY t2d DESC;
+
+-- TC 01.03
+SELECT t2a,
+ t2b,
+ t2c,
+ Min(t2d)
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t1b = t2b)
+GROUP BY t2a, t2b, t2c
+UNION ALL
+SELECT t2a,
+ t2b,
+ t2c,
+ Max(t2d)
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t2c = t1c)
+GROUP BY t2a, t2b, t2c
+UNION
+SELECT t3a,
+ t3b,
+ t3c,
+ Min(t3d)
+FROM t3
+WHERE t3a IN (SELECT t2a
+ FROM t2
+ WHERE t3c = t2c)
+GROUP BY t3a, t3b, t3c
+UNION DISTINCT
+SELECT t1a,
+ t1b,
+ t1c,
+ Max(t1d)
+FROM t1
+WHERE t1a IN (SELECT t3a
+ FROM t3
+ WHERE t3d = t1d)
+GROUP BY t1a, t1b, t1c;
+
+-- TC 01.04
+SELECT DISTINCT( t2a ),
+ t2b,
+ Count(t2c),
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t1b = t2b)
+GROUP BY t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+UNION
+SELECT DISTINCT( t2a ),
+ t2b,
+ Count(t2c),
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t2c = t1c)
+GROUP BY t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+HAVING t2b IS NOT NULL;
+
+-- TC 01.05
+SELECT t2a,
+ t2b,
+ Count(t2c),
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2a IN (SELECT DISTINCT(t1a)
+ FROM t1
+ WHERE t1b = t2b)
+GROUP BY t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+
+UNION
+SELECT DISTINCT( t2a ),
+ t2b,
+ Count(t2c),
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2b IN (SELECT Max(t1b)
+ FROM t1
+ WHERE t2c = t1c)
+GROUP BY t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+HAVING t2b IS NOT NULL
+UNION DISTINCT
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2d IN (SELECT min(t1d)
+ FROM t1
+ WHERE t2c = t1c);
+
+-- TC 01.06
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t1b = t2b AND
+ t1d < t2d)
+INTERSECT
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d
+FROM t2
+WHERE t2b IN (SELECT Max(t1b)
+ FROM t1
+ WHERE t2c = t1c)
+EXCEPT
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d
+FROM t2
+WHERE t2d IN (SELECT Min(t3d)
+ FROM t3
+ WHERE t2c = t3c)
+UNION ALL
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d
+FROM t2
+WHERE t2c IN (SELECT Max(t1c)
+ FROM t1
+ WHERE t1d = t2d);
+
+-- UNION, UNION ALL, UNION DISTINCT, INTERSECT and EXCEPT in the subquery
+-- TC 01.07
+SELECT DISTINCT(t1a),
+ t1b,
+ t1c,
+ t1d
+FROM t1
+WHERE t1a IN (SELECT t3a
+ FROM (SELECT t2a t3a
+ FROM t2
+ UNION ALL
+ SELECT t2a t3a
+ FROM t2) AS t3
+ UNION
+ SELECT t2a
+ FROM (SELECT t2a
+ FROM t2
+ WHERE t2b > 6
+ UNION
+ SELECT t2a
+ FROM t2
+ WHERE t2b > 6) AS t4
+ UNION DISTINCT
+ SELECT t2a
+ FROM (SELECT t2a
+ FROM t2
+ WHERE t2b > 6
+ UNION DISTINCT
+ SELECT t1a
+ FROM t1
+ WHERE t1b > 6) AS t5)
+GROUP BY t1a, t1b, t1c, t1d
+HAVING t1c IS NOT NULL AND t1b IS NOT NULL
+ORDER BY t1c DESC;
+
+-- TC 01.08
+SELECT t1a,
+ t1b,
+ t1c
+FROM t1
+WHERE t1b IN (SELECT t2b
+ FROM (SELECT t2b
+ FROM t2
+ WHERE t2b > 6
+ INTERSECT
+ SELECT t1b
+ FROM t1
+ WHERE t1b > 6) AS t3
+ WHERE t2b = t1b);
+
+-- TC 01.09
+SELECT t1a,
+ t1b,
+ t1c
+FROM t1
+WHERE t1h IN (SELECT t2h
+ FROM (SELECT t2h
+ FROM t2
+ EXCEPT
+ SELECT t3h
+ FROM t3) AS t3)
+ORDER BY t1b DESC NULLs first, t1c DESC NULLs last;
+
+-- UNION, UNION ALL, UNION DISTINCT, INTERSECT and EXCEPT in the parent and subquery
+-- TC 01.10
+SELECT t1a,
+ t1b,
+ t1c
+FROM t1
+WHERE t1b IN
+ (
+ SELECT t2b
+ FROM (
+ SELECT t2b
+ FROM t2
+ WHERE t2b > 6
+ INTERSECT
+ SELECT t1b
+ FROM t1
+ WHERE t1b > 6) AS t3)
+UNION DISTINCT
+SELECT t1a,
+ t1b,
+ t1c
+FROM t1
+WHERE t1b IN
+ (
+ SELECT t2b
+ FROM (
+ SELECT t2b
+ FROM t2
+ WHERE t2b > 6
+ EXCEPT
+ SELECT t1b
+ FROM t1
+ WHERE t1b > 6) AS t4
+ WHERE t2b = t1b)
+ORDER BY t1c DESC NULLS last;
+
+-- TC 01.11
+SELECT *
+FROM (SELECT *
+ FROM (SELECT *
+ FROM t2
+ WHERE t2h IN (SELECT t1h
+ FROM t1
+ WHERE t1a = t2a)
+ UNION DISTINCT
+ SELECT *
+ FROM t1
+ WHERE t1h IN (SELECT t3h
+ FROM t3
+ UNION
+ SELECT t1h
+ FROM t1)
+ UNION
+ SELECT *
+ FROM t3
+ WHERE t3a IN (SELECT t2a
+ FROM t2
+ UNION ALL
+ SELECT t1a
+ FROM t1
+ WHERE t1b > 0)
+ INTERSECT
+ SELECT *
+ FROM T1
+ WHERE t1b IN (SELECT t3b
+ FROM t3
+ UNION DISTINCT
+ SELECT t2b
+ FROM t2
+ )
+ EXCEPT
+ SELECT *
+ FROM t2
+ WHERE t2h IN (SELECT t1i
+ FROM t1)) t4
+ WHERE t4.t2b IN (SELECT Min(t3b)
+ FROM t3
+ WHERE t4.t2a = t3a));
+
+-- UNION, UNION ALL, UNION DISTINCT, INTERSECT and EXCEPT for NOT IN
+-- TC 01.12
+SELECT t2a,
+ t2b,
+ t2c,
+ t2i
+FROM (SELECT *
+ FROM t2
+ WHERE t2a NOT IN (SELECT t1a
+ FROM t1
+ UNION
+ SELECT t3a
+ FROM t3)
+ UNION ALL
+ SELECT *
+ FROM t2
+ WHERE t2a NOT IN (SELECT t1a
+ FROM t1
+ INTERSECT
+ SELECT t2a
+ FROM t2)) AS t3
+WHERE t3.t2a NOT IN (SELECT t1a
+ FROM t1
+ INTERSECT
+ SELECT t2a
+ FROM t2)
+ AND t2c IS NOT NULL
+ORDER BY t2a;
+
+-- TC 01.13
+SELECT Count(DISTINCT(t1a)),
+ t1b,
+ t1c,
+ t1i
+FROM t1
+WHERE t1b NOT IN
+ (
+ SELECT t2b
+ FROM (
+ SELECT t2b
+ FROM t2
+ WHERE t2b NOT IN
+ (
+ SELECT t1b
+ FROM t1)
+ UNION
+ SELECT t1b
+ FROM t1
+ WHERE t1b NOT IN
+ (
+ SELECT t3b
+ FROM t3)
+ UNION
+ distinct SELECT t3b
+ FROM t3
+ WHERE t3b NOT IN
+ (
+ SELECT t2b
+ FROM t2)) AS t3
+ WHERE t2b = t1b)
+GROUP BY t1a,
+ t1b,
+ t1c,
+ t1i
+HAVING t1b NOT IN
+ (
+ SELECT t2b
+ FROM t2
+ WHERE t2c IS NULL
+ EXCEPT
+ SELECT t3b
+ FROM t3)
+ORDER BY t1c DESC NULLS LAST;
+
diff --git a/sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/in-with-cte.sql b/sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/in-with-cte.sql
new file mode 100644
index 0000000000..e65cb9106c
--- /dev/null
+++ b/sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/in-with-cte.sql
@@ -0,0 +1,287 @@
+-- A test suite for in with cte in parent side, subquery, and both predicate subquery
+-- It includes correlated cases.
+
+create temporary view t1 as select * from values
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:00:00.000', date '2014-04-04'),
+ ("val1b", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1a", 16S, 12, 21L, float(15.0), 20D, 20E2, timestamp '2014-06-04 01:02:00.001', date '2014-06-04'),
+ ("val1a", 16S, 12, 10L, float(15.0), 20D, 20E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:02:00.001', date '2014-05-05'),
+ ("val1d", null, 16, 22L, float(17.0), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', null),
+ ("val1d", null, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-07-04 01:02:00.001', null),
+ ("val1e", 10S, null, 25L, float(17.0), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-09-04 01:02:00.001', date '2014-09-04'),
+ ("val1d", 10S, null, 12L, float(17.0), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:02:00.001', date '2014-04-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04')
+ as t1(t1a, t1b, t1c, t1d, t1e, t1f, t1g, t1h, t1i);
+
+create temporary view t2 as select * from values
+ ("val2a", 6S, 12, 14L, float(15), 20D, 20E2, timestamp '2014-04-04 01:01:00.000', date '2014-04-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 119L, float(17), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1c", 12S, 16, 219L, float(17), 25D, 26E2, timestamp '2016-05-04 01:01:00.000', date '2016-05-04'),
+ ("val1b", null, 16, 319L, float(17), 25D, 26E2, timestamp '2017-05-04 01:01:00.000', null),
+ ("val2e", 8S, null, 419L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1f", 19S, null, 519L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 12S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-05'),
+ ("val1e", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:01:00.000', date '2014-09-04'),
+ ("val1f", 19S, null, 19L, float(17), 25D, 26E2, timestamp '2014-10-04 01:01:00.000', date '2014-10-04'),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', null)
+ as t2(t2a, t2b, t2c, t2d, t2e, t2f, t2g, t2h, t2i);
+
+create temporary view t3 as select * from values
+ ("val3a", 6S, 12, 110L, float(15), 20D, 20E2, timestamp '2014-04-04 01:02:00.000', date '2014-04-04'),
+ ("val3a", 6S, 12, 10L, float(15), 20D, 20E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 219L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 319L, float(17), 25D, 26E2, timestamp '2014-06-04 01:02:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:02:00.000', date '2014-07-04'),
+ ("val3c", 17S, 16, 519L, float(17), 25D, 26E2, timestamp '2014-08-04 01:02:00.000', date '2014-08-04'),
+ ("val3c", 17S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:02:00.000', date '2014-09-05'),
+ ("val1b", null, 16, 419L, float(17), 25D, 26E2, timestamp '2014-10-04 01:02:00.000', null),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-11-04 01:02:00.000', null),
+ ("val3b", 8S, null, 719L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val3b", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2015-05-04 01:02:00.000', date '2015-05-04')
+ as t3(t3a, t3b, t3c, t3d, t3e, t3f, t3g, t3h, t3i);
+
+-- correlated IN subquery
+-- outside CTE
+-- TC 01.01
+WITH cte1
+ AS (SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1a = "val1a")
+SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1h
+FROM t1
+WHERE t1b IN (SELECT cte1.t1b
+ FROM cte1
+ WHERE cte1.t1b > 0);
+
+-- TC 01.02
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b
+ FROM t1)
+SELECT count(distinct(t1a)), t1b, t1c
+FROM t1
+WHERE t1b IN
+ (
+ SELECT cte1.t1b
+ FROM cte1
+ WHERE cte1.t1b > 0
+ UNION
+ SELECT cte1.t1b
+ FROM cte1
+ WHERE cte1.t1b > 5
+ UNION ALL
+ SELECT cte1.t1b
+ FROM cte1
+ INTERSECT
+ SELECT cte1.t1b
+ FROM cte1
+ UNION
+ SELECT cte1.t1b
+ FROM cte1 )
+GROUP BY t1a, t1b, t1c
+HAVING t1c IS NOT NULL;
+
+-- TC 01.03
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1e
+ FROM t1)
+SELECT t1a,
+ t1b,
+ t1c,
+ t1h
+FROM t1
+WHERE t1c IN
+ (
+ SELECT cte1.t1c
+ FROM cte1
+ JOIN cte1 cte2
+ on cte1.t1b > cte2.t1b
+ FULL OUTER JOIN cte1 cte3
+ ON cte1.t1c = cte3.t1c
+ LEFT JOIN cte1 cte4
+ ON cte1.t1d = cte4.t1d
+ INNER JOIN cte1 cte5
+ ON cte1.t1b < cte5.t1b
+ LEFT OUTER JOIN cte1 cte6
+ ON cte1.t1d > cte6.t1d);
+
+-- CTE inside and outside
+-- TC 01.04
+WITH cte1
+ AS (SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1b IN (SELECT t2b
+ FROM t2
+ RIGHT JOIN t1
+ ON t1c = t2c
+ LEFT JOIN t3
+ ON t2d = t3d)
+ AND t1a = "val1b")
+SELECT *
+FROM (SELECT *
+ FROM cte1
+ JOIN cte1 cte2
+ ON cte1.t1b > 5
+ AND cte1.t1a = cte2.t1a
+ FULL OUTER JOIN cte1 cte3
+ ON cte1.t1a = cte3.t1a
+ INNER JOIN cte1 cte4
+ ON cte1.t1b = cte4.t1b) s;
+
+-- TC 01.05
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b,
+ t1h
+ FROM t1
+ WHERE t1a IN
+ (
+ SELECT t2a
+ FROM t2
+ WHERE t1b < t2b))
+SELECT Count(DISTINCT t1a),
+ t1b
+FROM (
+ SELECT cte1.t1a,
+ cte1.t1b
+ FROM cte1
+ JOIN cte1 cte2
+ on cte1.t1h >= cte2.t1h) s
+WHERE t1b IN
+ (
+ SELECT t1b
+ FROM t1)
+GROUP BY t1b;
+
+-- TC 01.06
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b,
+ t1c
+ FROM t1
+ WHERE t1b IN
+ (
+ SELECT t2b
+ FROM t2 FULL OUTER JOIN T3 on t2a = t3a
+ WHERE t1c = t2c) AND
+ t1a = "val1b")
+SELECT *
+FROM (
+ SELECT *
+ FROM cte1
+ INNER JOIN cte1 cte2 ON cte1.t1a = cte2.t1a
+ RIGHT OUTER JOIN cte1 cte3 ON cte1.t1b = cte3.t1b
+ LEFT OUTER JOIN cte1 cte4 ON cte1.t1c = cte4.t1c
+ ) s
+;
+
+-- TC 01.07
+WITH cte1
+ AS (SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1b IN (SELECT t2b
+ FROM t2
+ WHERE t1c = t2c))
+SELECT Count(DISTINCT( s.t1a )),
+ s.t1b
+FROM (SELECT cte1.t1a,
+ cte1.t1b
+ FROM cte1
+ RIGHT OUTER JOIN cte1 cte2
+ ON cte1.t1a = cte2.t1a) s
+GROUP BY s.t1b;
+
+-- TC 01.08
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1b IN
+ (
+ SELECT t2b
+ FROM t2
+ WHERE t1c = t2c))
+SELECT DISTINCT(s.t1b)
+FROM (
+ SELECT cte1.t1b
+ FROM cte1
+ LEFT OUTER JOIN cte1 cte2
+ ON cte1.t1b = cte2.t1b) s
+WHERE s.t1b IN
+ (
+ SELECT t1.t1b
+ FROM t1 INNER
+ JOIN cte1
+ ON t1.t1a = cte1.t1a);
+
+-- CTE with NOT IN
+-- TC 01.09
+WITH cte1
+ AS (SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1a = "val1d")
+SELECT t1a,
+ t1b,
+ t1c,
+ t1h
+FROM t1
+WHERE t1b NOT IN (SELECT cte1.t1b
+ FROM cte1
+ WHERE cte1.t1b < 0) AND
+ t1c > 10;
+
+-- TC 01.10
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1h
+ FROM t1
+ WHERE t1d NOT IN
+ (
+ SELECT t2d
+ FROM t2
+ FULL OUTER JOIN t3 ON t2a = t3a
+ JOIN t1 on t1b = t2b))
+SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1h
+FROM t1
+WHERE t1b NOT IN
+ (
+ SELECT cte1.t1b
+ FROM cte1 INNER
+ JOIN cte1 cte2 ON cte1.t1a = cte2.t1a
+ RIGHT JOIN cte1 cte3 ON cte1.t1b = cte3.t1b
+ JOIN cte1 cte4 ON cte1.t1c = cte4.t1c) AND
+ t1c IS NOT NULL
+ORDER BY t1c DESC;
+
diff --git a/sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/not-in-joins.sql b/sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/not-in-joins.sql
new file mode 100644
index 0000000000..505366b7ac
--- /dev/null
+++ b/sql/core/src/test/resources/sql-tests/inputs/subquery/in-subquery/not-in-joins.sql
@@ -0,0 +1,167 @@
+-- A test suite for not-in-joins in parent side, subquery, and both predicate subquery
+-- It includes correlated cases.
+
+create temporary view t1 as select * from values
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:00:00.000', date '2014-04-04'),
+ ("val1b", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1a", 16S, 12, 21L, float(15.0), 20D, 20E2, timestamp '2014-06-04 01:02:00.001', date '2014-06-04'),
+ ("val1a", 16S, 12, 10L, float(15.0), 20D, 20E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:02:00.001', date '2014-05-05'),
+ ("val1d", null, 16, 22L, float(17.0), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', null),
+ ("val1d", null, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-07-04 01:02:00.001', null),
+ ("val1e", 10S, null, 25L, float(17.0), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-09-04 01:02:00.001', date '2014-09-04'),
+ ("val1d", 10S, null, 12L, float(17.0), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:02:00.001', date '2014-04-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04')
+ as t1(t1a, t1b, t1c, t1d, t1e, t1f, t1g, t1h, t1i);
+
+create temporary view t2 as select * from values
+ ("val2a", 6S, 12, 14L, float(15), 20D, 20E2, timestamp '2014-04-04 01:01:00.000', date '2014-04-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 119L, float(17), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1c", 12S, 16, 219L, float(17), 25D, 26E2, timestamp '2016-05-04 01:01:00.000', date '2016-05-04'),
+ ("val1b", null, 16, 319L, float(17), 25D, 26E2, timestamp '2017-05-04 01:01:00.000', null),
+ ("val2e", 8S, null, 419L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1f", 19S, null, 519L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 12S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-05'),
+ ("val1e", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:01:00.000', date '2014-09-04'),
+ ("val1f", 19S, null, 19L, float(17), 25D, 26E2, timestamp '2014-10-04 01:01:00.000', date '2014-10-04'),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', null)
+ as t2(t2a, t2b, t2c, t2d, t2e, t2f, t2g, t2h, t2i);
+
+create temporary view t3 as select * from values
+ ("val3a", 6S, 12, 110L, float(15), 20D, 20E2, timestamp '2014-04-04 01:02:00.000', date '2014-04-04'),
+ ("val3a", 6S, 12, 10L, float(15), 20D, 20E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 219L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 319L, float(17), 25D, 26E2, timestamp '2014-06-04 01:02:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:02:00.000', date '2014-07-04'),
+ ("val3c", 17S, 16, 519L, float(17), 25D, 26E2, timestamp '2014-08-04 01:02:00.000', date '2014-08-04'),
+ ("val3c", 17S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:02:00.000', date '2014-09-05'),
+ ("val1b", null, 16, 419L, float(17), 25D, 26E2, timestamp '2014-10-04 01:02:00.000', null),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-11-04 01:02:00.000', null),
+ ("val3b", 8S, null, 719L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val3b", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2015-05-04 01:02:00.000', date '2015-05-04')
+ as t3(t3a, t3b, t3c, t3d, t3e, t3f, t3g, t3h, t3i);
+
+-- correlated IN subquery
+-- different not JOIN in parent side
+-- TC 01.01
+SELECT t1a,
+ t1b,
+ t1c,
+ t3a,
+ t3b,
+ t3c
+FROM t1
+ JOIN t3
+WHERE t1a NOT IN (SELECT t2a
+ FROM t2)
+ AND t1b = t3b;
+
+-- TC 01.02
+SELECT t1a,
+ t1b,
+ t1c,
+ count(distinct(t3a)),
+ t3b,
+ t3c
+FROM t1
+FULL OUTER JOIN t3 on t1b != t3b
+RIGHT JOIN t2 on t1c = t2c
+where t1a NOT IN
+ (
+ SELECT t2a
+ FROM t2
+ WHERE t2c NOT IN
+ (
+ SELECT t1c
+ FROM t1
+ WHERE t1a = t2a))
+AND t1b != t3b
+AND t1d = t2d
+GROUP BY t1a, t1b, t1c, t3a, t3b, t3c
+HAVING count(distinct(t3a)) >= 1
+ORDER BY t1a;
+
+-- TC 01.03
+SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1h
+FROM t1
+WHERE t1a NOT IN
+ (
+ SELECT t2a
+ FROM t2
+ LEFT JOIN t3 on t2b = t3b
+ WHERE t1d = t2d
+ )
+AND t1d NOT IN
+ (
+ SELECT t2d
+ FROM t2
+ RIGHT JOIN t1 on t2e = t1e
+ WHERE t1a = t2a);
+
+-- TC 01.04
+SELECT Count(DISTINCT( t1a )),
+ t1b,
+ t1c,
+ t1d
+FROM t1
+WHERE t1a NOT IN (SELECT t2a
+ FROM t2
+ JOIN t1
+ WHERE t2b <> t1b)
+GROUP BY t1b,
+ t1c,
+ t1d
+HAVING t1d NOT IN (SELECT t2d
+ FROM t2
+ WHERE t1d = t2d)
+ORDER BY t1b DESC;
+
+-- TC 01.05
+SELECT COUNT(DISTINCT(t1a)),
+ t1b,
+ t1c,
+ t1d
+FROM t1
+WHERE t1a NOT IN
+ (
+ SELECT t2a
+ FROM t2 INNER
+ JOIN t1 ON t1a = t2a)
+GROUP BY t1b,
+ t1c,
+ t1d
+HAVING t1b < sum(t1c);
+
+-- TC 01.06
+SELECT COUNT(DISTINCT(t1a)),
+ t1b,
+ t1c,
+ t1d
+FROM t1
+WHERE t1a NOT IN
+ (
+ SELECT t2a
+ FROM t2 INNER
+ JOIN t1
+ ON t1a = t2a)
+AND t1d NOT IN
+ (
+ SELECT t2d
+ FROM t2
+ INNER JOIN t3
+ ON t2b = t3b )
+GROUP BY t1b,
+ t1c,
+ t1d
+HAVING t1b < sum(t1c);
+
diff --git a/sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/in-set-operations.sql.out b/sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/in-set-operations.sql.out
new file mode 100644
index 0000000000..878bc755ef
--- /dev/null
+++ b/sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/in-set-operations.sql.out
@@ -0,0 +1,595 @@
+-- Automatically generated by SQLQueryTestSuite
+-- Number of queries: 16
+
+
+-- !query 0
+create temporary view t1 as select * from values
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:00:00.000', date '2014-04-04'),
+ ("val1b", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1a", 16S, 12, 21L, float(15.0), 20D, 20E2, timestamp '2014-06-04 01:02:00.001', date '2014-06-04'),
+ ("val1a", 16S, 12, 10L, float(15.0), 20D, 20E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:02:00.001', date '2014-05-05'),
+ ("val1d", null, 16, 22L, float(17.0), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', null),
+ ("val1d", null, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-07-04 01:02:00.001', null),
+ ("val1e", 10S, null, 25L, float(17.0), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-09-04 01:02:00.001', date '2014-09-04'),
+ ("val1d", 10S, null, 12L, float(17.0), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:02:00.001', date '2014-04-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04')
+ as t1(t1a, t1b, t1c, t1d, t1e, t1f, t1g, t1h, t1i)
+-- !query 0 schema
+struct<>
+-- !query 0 output
+
+
+
+-- !query 1
+create temporary view t2 as select * from values
+ ("val2a", 6S, 12, 14L, float(15), 20D, 20E2, timestamp '2014-04-04 01:01:00.000', date '2014-04-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 119L, float(17), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1c", 12S, 16, 219L, float(17), 25D, 26E2, timestamp '2016-05-04 01:01:00.000', date '2016-05-04'),
+ ("val1b", null, 16, 319L, float(17), 25D, 26E2, timestamp '2017-05-04 01:01:00.000', null),
+ ("val2e", 8S, null, 419L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1f", 19S, null, 519L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 12S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-05'),
+ ("val1e", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:01:00.000', date '2014-09-04'),
+ ("val1f", 19S, null, 19L, float(17), 25D, 26E2, timestamp '2014-10-04 01:01:00.000', date '2014-10-04'),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', null)
+ as t2(t2a, t2b, t2c, t2d, t2e, t2f, t2g, t2h, t2i)
+-- !query 1 schema
+struct<>
+-- !query 1 output
+
+
+
+-- !query 2
+create temporary view t3 as select * from values
+ ("val3a", 6S, 12, 110L, float(15), 20D, 20E2, timestamp '2014-04-04 01:02:00.000', date '2014-04-04'),
+ ("val3a", 6S, 12, 10L, float(15), 20D, 20E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 219L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 319L, float(17), 25D, 26E2, timestamp '2014-06-04 01:02:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:02:00.000', date '2014-07-04'),
+ ("val3c", 17S, 16, 519L, float(17), 25D, 26E2, timestamp '2014-08-04 01:02:00.000', date '2014-08-04'),
+ ("val3c", 17S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:02:00.000', date '2014-09-05'),
+ ("val1b", null, 16, 419L, float(17), 25D, 26E2, timestamp '2014-10-04 01:02:00.000', null),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-11-04 01:02:00.000', null),
+ ("val3b", 8S, null, 719L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val3b", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2015-05-04 01:02:00.000', date '2015-05-04')
+ as t3(t3a, t3b, t3c, t3d, t3e, t3f, t3g, t3h, t3i)
+-- !query 2 schema
+struct<>
+-- !query 2 output
+
+
+
+-- !query 3
+SELECT t2a,
+ t2b,
+ t2c,
+ t2h,
+ t2i
+FROM (SELECT *
+ FROM t2
+ WHERE t2a IN (SELECT t1a
+ FROM t1)
+ UNION ALL
+ SELECT *
+ FROM t3
+ WHERE t3a IN (SELECT t1a
+ FROM t1)) AS t3
+WHERE t2i IS NOT NULL AND
+ 2 * t2b = t2c
+ORDER BY t2c DESC nulls first
+-- !query 3 schema
+struct<t2a:string,t2b:smallint,t2c:int,t2h:timestamp,t2i:date>
+-- !query 3 output
+val1b 8 16 2015-05-04 01:01:00 2015-05-04
+val1b 8 16 2014-07-04 01:01:00 2014-07-04
+val1b 8 16 2014-06-04 01:02:00 2014-06-04
+val1b 8 16 2014-07-04 01:02:00 2014-07-04
+
+
+-- !query 4
+SELECT t2a,
+ t2b,
+ t2d,
+ Count(DISTINCT( t2h )),
+ t2i
+FROM (SELECT *
+ FROM t2
+ WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t2b = t1b)
+ UNION
+ SELECT *
+ FROM t1
+ WHERE t1a IN (SELECT t3a
+ FROM t3
+ WHERE t1c = t3c)) AS t3
+GROUP BY t2a,
+ t2b,
+ t2d,
+ t2i
+ORDER BY t2d DESC
+-- !query 4 schema
+struct<t2a:string,t2b:smallint,t2d:bigint,count(DISTINCT t2h):bigint,t2i:date>
+-- !query 4 output
+val1b 8 119 1 2015-05-04
+val1b 8 19 1 2014-07-04
+val1b 8 19 1 2014-05-04
+
+
+-- !query 5
+SELECT t2a,
+ t2b,
+ t2c,
+ Min(t2d)
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t1b = t2b)
+GROUP BY t2a, t2b, t2c
+UNION ALL
+SELECT t2a,
+ t2b,
+ t2c,
+ Max(t2d)
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t2c = t1c)
+GROUP BY t2a, t2b, t2c
+UNION
+SELECT t3a,
+ t3b,
+ t3c,
+ Min(t3d)
+FROM t3
+WHERE t3a IN (SELECT t2a
+ FROM t2
+ WHERE t3c = t2c)
+GROUP BY t3a, t3b, t3c
+UNION DISTINCT
+SELECT t1a,
+ t1b,
+ t1c,
+ Max(t1d)
+FROM t1
+WHERE t1a IN (SELECT t3a
+ FROM t3
+ WHERE t3d = t1d)
+GROUP BY t1a, t1b, t1c
+-- !query 5 schema
+struct<t2a:string,t2b:smallint,t2c:int,min(t2d):bigint>
+-- !query 5 output
+val1b 10 12 19
+val1b 8 16 119
+val1b 8 16 19
+val1b NULL 16 19
+val1b NULL 16 319
+val1c 12 16 219
+
+
+-- !query 6
+SELECT DISTINCT( t2a ),
+ t2b,
+ Count(t2c),
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t1b = t2b)
+GROUP BY t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+UNION
+SELECT DISTINCT( t2a ),
+ t2b,
+ Count(t2c),
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t2c = t1c)
+GROUP BY t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+HAVING t2b IS NOT NULL
+-- !query 6 schema
+struct<t2a:string,t2b:smallint,count(t2c):bigint,t2d:bigint,t2h:timestamp,t2i:date>
+-- !query 6 output
+val1b 8 1 119 2015-05-04 01:01:00 2015-05-04
+val1b 8 1 19 2014-07-04 01:01:00 2014-07-04
+val1c 12 1 19 2014-08-04 01:01:00 2014-08-05
+val1c 12 1 219 2016-05-04 01:01:00 2016-05-04
+
+
+-- !query 7
+SELECT t2a,
+ t2b,
+ Count(t2c),
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2a IN (SELECT DISTINCT(t1a)
+ FROM t1
+ WHERE t1b = t2b)
+GROUP BY t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+
+UNION
+SELECT DISTINCT( t2a ),
+ t2b,
+ Count(t2c),
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2b IN (SELECT Max(t1b)
+ FROM t1
+ WHERE t2c = t1c)
+GROUP BY t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+HAVING t2b IS NOT NULL
+UNION DISTINCT
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d,
+ t2h,
+ t2i
+FROM t2
+WHERE t2d IN (SELECT min(t1d)
+ FROM t1
+ WHERE t2c = t1c)
+-- !query 7 schema
+struct<t2a:string,t2b:smallint,count(t2c):bigint,t2d:bigint,t2h:timestamp,t2i:date>
+-- !query 7 output
+val1b 8 1 119 2015-05-04 01:01:00 2015-05-04
+val1b 8 1 19 2014-07-04 01:01:00 2014-07-04
+val1b 8 16 19 2014-07-04 01:01:00 2014-07-04
+val1b NULL 16 19 2014-05-04 01:01:00 NULL
+val1c 12 16 19 2014-08-04 01:01:00 2014-08-05
+
+
+-- !query 8
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d
+FROM t2
+WHERE t2a IN (SELECT t1a
+ FROM t1
+ WHERE t1b = t2b AND
+ t1d < t2d)
+INTERSECT
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d
+FROM t2
+WHERE t2b IN (SELECT Max(t1b)
+ FROM t1
+ WHERE t2c = t1c)
+EXCEPT
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d
+FROM t2
+WHERE t2d IN (SELECT Min(t3d)
+ FROM t3
+ WHERE t2c = t3c)
+UNION ALL
+SELECT t2a,
+ t2b,
+ t2c,
+ t2d
+FROM t2
+WHERE t2c IN (SELECT Max(t1c)
+ FROM t1
+ WHERE t1d = t2d)
+-- !query 8 schema
+struct<t2a:string,t2b:smallint,t2c:int,t2d:bigint>
+-- !query 8 output
+val1b 8 16 119
+val1b 8 16 19
+val1b NULL 16 19
+val1c 12 16 19
+
+
+-- !query 9
+SELECT DISTINCT(t1a),
+ t1b,
+ t1c,
+ t1d
+FROM t1
+WHERE t1a IN (SELECT t3a
+ FROM (SELECT t2a t3a
+ FROM t2
+ UNION ALL
+ SELECT t2a t3a
+ FROM t2) AS t3
+ UNION
+ SELECT t2a
+ FROM (SELECT t2a
+ FROM t2
+ WHERE t2b > 6
+ UNION
+ SELECT t2a
+ FROM t2
+ WHERE t2b > 6) AS t4
+ UNION DISTINCT
+ SELECT t2a
+ FROM (SELECT t2a
+ FROM t2
+ WHERE t2b > 6
+ UNION DISTINCT
+ SELECT t1a
+ FROM t1
+ WHERE t1b > 6) AS t5)
+GROUP BY t1a, t1b, t1c, t1d
+HAVING t1c IS NOT NULL AND t1b IS NOT NULL
+ORDER BY t1c DESC
+-- !query 9 schema
+struct<t1a:string,t1b:smallint,t1c:int,t1d:bigint>
+-- !query 9 output
+val1c 8 16 19
+val1b 8 16 19
+val1a 16 12 21
+val1a 16 12 10
+val1a 6 8 10
+
+
+-- !query 10
+SELECT t1a,
+ t1b,
+ t1c
+FROM t1
+WHERE t1b IN (SELECT t2b
+ FROM (SELECT t2b
+ FROM t2
+ WHERE t2b > 6
+ INTERSECT
+ SELECT t1b
+ FROM t1
+ WHERE t1b > 6) AS t3
+ WHERE t2b = t1b)
+-- !query 10 schema
+struct<t1a:string,t1b:smallint,t1c:int>
+-- !query 10 output
+val1b 8 16
+val1c 8 16
+val1d 10 NULL
+val1e 10 NULL
+val1e 10 NULL
+val1e 10 NULL
+
+
+-- !query 11
+SELECT t1a,
+ t1b,
+ t1c
+FROM t1
+WHERE t1h IN (SELECT t2h
+ FROM (SELECT t2h
+ FROM t2
+ EXCEPT
+ SELECT t3h
+ FROM t3) AS t3)
+ORDER BY t1b DESC NULLs first, t1c DESC NULLs last
+-- !query 11 schema
+struct<t1a:string,t1b:smallint,t1c:int>
+-- !query 11 output
+val1d NULL 16
+val1a 16 12
+val1e 10 NULL
+val1d 10 NULL
+val1e 10 NULL
+val1b 8 16
+
+
+-- !query 12
+SELECT t1a,
+ t1b,
+ t1c
+FROM t1
+WHERE t1b IN
+ (
+ SELECT t2b
+ FROM (
+ SELECT t2b
+ FROM t2
+ WHERE t2b > 6
+ INTERSECT
+ SELECT t1b
+ FROM t1
+ WHERE t1b > 6) AS t3)
+UNION DISTINCT
+SELECT t1a,
+ t1b,
+ t1c
+FROM t1
+WHERE t1b IN
+ (
+ SELECT t2b
+ FROM (
+ SELECT t2b
+ FROM t2
+ WHERE t2b > 6
+ EXCEPT
+ SELECT t1b
+ FROM t1
+ WHERE t1b > 6) AS t4
+ WHERE t2b = t1b)
+ORDER BY t1c DESC NULLS last
+-- !query 12 schema
+struct<t1a:string,t1b:smallint,t1c:int>
+-- !query 12 output
+val1c 8 16
+val1b 8 16
+val1e 10 NULL
+val1d 10 NULL
+
+
+-- !query 13
+SELECT *
+FROM (SELECT *
+ FROM (SELECT *
+ FROM t2
+ WHERE t2h IN (SELECT t1h
+ FROM t1
+ WHERE t1a = t2a)
+ UNION DISTINCT
+ SELECT *
+ FROM t1
+ WHERE t1h IN (SELECT t3h
+ FROM t3
+ UNION
+ SELECT t1h
+ FROM t1)
+ UNION
+ SELECT *
+ FROM t3
+ WHERE t3a IN (SELECT t2a
+ FROM t2
+ UNION ALL
+ SELECT t1a
+ FROM t1
+ WHERE t1b > 0)
+ INTERSECT
+ SELECT *
+ FROM T1
+ WHERE t1b IN (SELECT t3b
+ FROM t3
+ UNION DISTINCT
+ SELECT t2b
+ FROM t2
+ )
+ EXCEPT
+ SELECT *
+ FROM t2
+ WHERE t2h IN (SELECT t1i
+ FROM t1)) t4
+ WHERE t4.t2b IN (SELECT Min(t3b)
+ FROM t3
+ WHERE t4.t2a = t3a))
+-- !query 13 schema
+struct<t2a:string,t2b:smallint,t2c:int,t2d:bigint,t2e:float,t2f:double,t2g:decimal(2,-2),t2h:timestamp,t2i:date>
+-- !query 13 output
+val1b 8 16 19 17.0 25.0 2600 2014-05-04 01:01:00 2014-05-04
+
+
+-- !query 14
+SELECT t2a,
+ t2b,
+ t2c,
+ t2i
+FROM (SELECT *
+ FROM t2
+ WHERE t2a NOT IN (SELECT t1a
+ FROM t1
+ UNION
+ SELECT t3a
+ FROM t3)
+ UNION ALL
+ SELECT *
+ FROM t2
+ WHERE t2a NOT IN (SELECT t1a
+ FROM t1
+ INTERSECT
+ SELECT t2a
+ FROM t2)) AS t3
+WHERE t3.t2a NOT IN (SELECT t1a
+ FROM t1
+ INTERSECT
+ SELECT t2a
+ FROM t2)
+ AND t2c IS NOT NULL
+ORDER BY t2a
+-- !query 14 schema
+struct<t2a:string,t2b:smallint,t2c:int,t2i:date>
+-- !query 14 output
+val2a 6 12 2014-04-04
+val2a 6 12 2014-04-04
+
+
+-- !query 15
+SELECT Count(DISTINCT(t1a)),
+ t1b,
+ t1c,
+ t1i
+FROM t1
+WHERE t1b NOT IN
+ (
+ SELECT t2b
+ FROM (
+ SELECT t2b
+ FROM t2
+ WHERE t2b NOT IN
+ (
+ SELECT t1b
+ FROM t1)
+ UNION
+ SELECT t1b
+ FROM t1
+ WHERE t1b NOT IN
+ (
+ SELECT t3b
+ FROM t3)
+ UNION
+ distinct SELECT t3b
+ FROM t3
+ WHERE t3b NOT IN
+ (
+ SELECT t2b
+ FROM t2)) AS t3
+ WHERE t2b = t1b)
+GROUP BY t1a,
+ t1b,
+ t1c,
+ t1i
+HAVING t1b NOT IN
+ (
+ SELECT t2b
+ FROM t2
+ WHERE t2c IS NULL
+ EXCEPT
+ SELECT t3b
+ FROM t3)
+ORDER BY t1c DESC NULLS LAST
+-- !query 15 schema
+struct<count(DISTINCT t1a):bigint,t1b:smallint,t1c:int,t1i:date>
+-- !query 15 output
+1 8 16 2014-05-05
+1 8 16 2014-05-04
+1 16 12 2014-06-04
+1 16 12 2014-07-04
+1 6 8 2014-04-04
+1 10 NULL 2014-08-04
+1 10 NULL 2014-09-04
+1 10 NULL 2015-05-04
+1 10 NULL 2014-05-04
diff --git a/sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/in-with-cte.sql.out b/sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/in-with-cte.sql.out
new file mode 100644
index 0000000000..7d3943e376
--- /dev/null
+++ b/sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/in-with-cte.sql.out
@@ -0,0 +1,364 @@
+-- Automatically generated by SQLQueryTestSuite
+-- Number of queries: 13
+
+
+-- !query 0
+create temporary view t1 as select * from values
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:00:00.000', date '2014-04-04'),
+ ("val1b", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1a", 16S, 12, 21L, float(15.0), 20D, 20E2, timestamp '2014-06-04 01:02:00.001', date '2014-06-04'),
+ ("val1a", 16S, 12, 10L, float(15.0), 20D, 20E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:02:00.001', date '2014-05-05'),
+ ("val1d", null, 16, 22L, float(17.0), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', null),
+ ("val1d", null, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-07-04 01:02:00.001', null),
+ ("val1e", 10S, null, 25L, float(17.0), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-09-04 01:02:00.001', date '2014-09-04'),
+ ("val1d", 10S, null, 12L, float(17.0), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:02:00.001', date '2014-04-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04')
+ as t1(t1a, t1b, t1c, t1d, t1e, t1f, t1g, t1h, t1i)
+-- !query 0 schema
+struct<>
+-- !query 0 output
+
+
+
+-- !query 1
+create temporary view t2 as select * from values
+ ("val2a", 6S, 12, 14L, float(15), 20D, 20E2, timestamp '2014-04-04 01:01:00.000', date '2014-04-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 119L, float(17), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1c", 12S, 16, 219L, float(17), 25D, 26E2, timestamp '2016-05-04 01:01:00.000', date '2016-05-04'),
+ ("val1b", null, 16, 319L, float(17), 25D, 26E2, timestamp '2017-05-04 01:01:00.000', null),
+ ("val2e", 8S, null, 419L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1f", 19S, null, 519L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 12S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-05'),
+ ("val1e", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:01:00.000', date '2014-09-04'),
+ ("val1f", 19S, null, 19L, float(17), 25D, 26E2, timestamp '2014-10-04 01:01:00.000', date '2014-10-04'),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', null)
+ as t2(t2a, t2b, t2c, t2d, t2e, t2f, t2g, t2h, t2i)
+-- !query 1 schema
+struct<>
+-- !query 1 output
+
+
+
+-- !query 2
+create temporary view t3 as select * from values
+ ("val3a", 6S, 12, 110L, float(15), 20D, 20E2, timestamp '2014-04-04 01:02:00.000', date '2014-04-04'),
+ ("val3a", 6S, 12, 10L, float(15), 20D, 20E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 219L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 319L, float(17), 25D, 26E2, timestamp '2014-06-04 01:02:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:02:00.000', date '2014-07-04'),
+ ("val3c", 17S, 16, 519L, float(17), 25D, 26E2, timestamp '2014-08-04 01:02:00.000', date '2014-08-04'),
+ ("val3c", 17S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:02:00.000', date '2014-09-05'),
+ ("val1b", null, 16, 419L, float(17), 25D, 26E2, timestamp '2014-10-04 01:02:00.000', null),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-11-04 01:02:00.000', null),
+ ("val3b", 8S, null, 719L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val3b", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2015-05-04 01:02:00.000', date '2015-05-04')
+ as t3(t3a, t3b, t3c, t3d, t3e, t3f, t3g, t3h, t3i)
+-- !query 2 schema
+struct<>
+-- !query 2 output
+
+
+
+-- !query 3
+WITH cte1
+ AS (SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1a = "val1a")
+SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1h
+FROM t1
+WHERE t1b IN (SELECT cte1.t1b
+ FROM cte1
+ WHERE cte1.t1b > 0)
+-- !query 3 schema
+struct<t1a:string,t1b:smallint,t1c:int,t1d:bigint,t1h:timestamp>
+-- !query 3 output
+val1a 16 12 10 2014-07-04 01:01:00
+val1a 16 12 21 2014-06-04 01:02:00.001
+val1a 6 8 10 2014-04-04 01:00:00
+val1a 6 8 10 2014-04-04 01:02:00.001
+
+
+-- !query 4
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b
+ FROM t1)
+SELECT count(distinct(t1a)), t1b, t1c
+FROM t1
+WHERE t1b IN
+ (
+ SELECT cte1.t1b
+ FROM cte1
+ WHERE cte1.t1b > 0
+ UNION
+ SELECT cte1.t1b
+ FROM cte1
+ WHERE cte1.t1b > 5
+ UNION ALL
+ SELECT cte1.t1b
+ FROM cte1
+ INTERSECT
+ SELECT cte1.t1b
+ FROM cte1
+ UNION
+ SELECT cte1.t1b
+ FROM cte1 )
+GROUP BY t1a, t1b, t1c
+HAVING t1c IS NOT NULL
+-- !query 4 schema
+struct<count(DISTINCT t1a):bigint,t1b:smallint,t1c:int>
+-- !query 4 output
+1 16 12
+1 6 8
+1 8 16
+1 8 16
+
+
+-- !query 5
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1e
+ FROM t1)
+SELECT t1a,
+ t1b,
+ t1c,
+ t1h
+FROM t1
+WHERE t1c IN
+ (
+ SELECT cte1.t1c
+ FROM cte1
+ JOIN cte1 cte2
+ on cte1.t1b > cte2.t1b
+ FULL OUTER JOIN cte1 cte3
+ ON cte1.t1c = cte3.t1c
+ LEFT JOIN cte1 cte4
+ ON cte1.t1d = cte4.t1d
+ INNER JOIN cte1 cte5
+ ON cte1.t1b < cte5.t1b
+ LEFT OUTER JOIN cte1 cte6
+ ON cte1.t1d > cte6.t1d)
+-- !query 5 schema
+struct<t1a:string,t1b:smallint,t1c:int,t1h:timestamp>
+-- !query 5 output
+val1b 8 16 2014-05-04 01:01:00
+val1c 8 16 2014-05-04 01:02:00.001
+val1d NULL 16 2014-06-04 01:01:00
+val1d NULL 16 2014-07-04 01:02:00.001
+
+
+-- !query 6
+WITH cte1
+ AS (SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1b IN (SELECT t2b
+ FROM t2
+ RIGHT JOIN t1
+ ON t1c = t2c
+ LEFT JOIN t3
+ ON t2d = t3d)
+ AND t1a = "val1b")
+SELECT *
+FROM (SELECT *
+ FROM cte1
+ JOIN cte1 cte2
+ ON cte1.t1b > 5
+ AND cte1.t1a = cte2.t1a
+ FULL OUTER JOIN cte1 cte3
+ ON cte1.t1a = cte3.t1a
+ INNER JOIN cte1 cte4
+ ON cte1.t1b = cte4.t1b) s
+-- !query 6 schema
+struct<t1a:string,t1b:smallint,t1a:string,t1b:smallint,t1a:string,t1b:smallint,t1a:string,t1b:smallint>
+-- !query 6 output
+val1b 8 val1b 8 val1b 8 val1b 8
+
+
+-- !query 7
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b,
+ t1h
+ FROM t1
+ WHERE t1a IN
+ (
+ SELECT t2a
+ FROM t2
+ WHERE t1b < t2b))
+SELECT Count(DISTINCT t1a),
+ t1b
+FROM (
+ SELECT cte1.t1a,
+ cte1.t1b
+ FROM cte1
+ JOIN cte1 cte2
+ on cte1.t1h >= cte2.t1h) s
+WHERE t1b IN
+ (
+ SELECT t1b
+ FROM t1)
+GROUP BY t1b
+-- !query 7 schema
+struct<count(DISTINCT t1a):bigint,t1b:smallint>
+-- !query 7 output
+2 8
+
+
+-- !query 8
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b,
+ t1c
+ FROM t1
+ WHERE t1b IN
+ (
+ SELECT t2b
+ FROM t2 FULL OUTER JOIN T3 on t2a = t3a
+ WHERE t1c = t2c) AND
+ t1a = "val1b")
+SELECT *
+FROM (
+ SELECT *
+ FROM cte1
+ INNER JOIN cte1 cte2 ON cte1.t1a = cte2.t1a
+ RIGHT OUTER JOIN cte1 cte3 ON cte1.t1b = cte3.t1b
+ LEFT OUTER JOIN cte1 cte4 ON cte1.t1c = cte4.t1c
+ ) s
+-- !query 8 schema
+struct<t1a:string,t1b:smallint,t1c:int,t1a:string,t1b:smallint,t1c:int,t1a:string,t1b:smallint,t1c:int,t1a:string,t1b:smallint,t1c:int>
+-- !query 8 output
+val1b 8 16 val1b 8 16 val1b 8 16 val1b 8 16
+
+
+-- !query 9
+WITH cte1
+ AS (SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1b IN (SELECT t2b
+ FROM t2
+ WHERE t1c = t2c))
+SELECT Count(DISTINCT( s.t1a )),
+ s.t1b
+FROM (SELECT cte1.t1a,
+ cte1.t1b
+ FROM cte1
+ RIGHT OUTER JOIN cte1 cte2
+ ON cte1.t1a = cte2.t1a) s
+GROUP BY s.t1b
+-- !query 9 schema
+struct<count(DISTINCT t1a):bigint,t1b:smallint>
+-- !query 9 output
+2 8
+
+
+-- !query 10
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1b IN
+ (
+ SELECT t2b
+ FROM t2
+ WHERE t1c = t2c))
+SELECT DISTINCT(s.t1b)
+FROM (
+ SELECT cte1.t1b
+ FROM cte1
+ LEFT OUTER JOIN cte1 cte2
+ ON cte1.t1b = cte2.t1b) s
+WHERE s.t1b IN
+ (
+ SELECT t1.t1b
+ FROM t1 INNER
+ JOIN cte1
+ ON t1.t1a = cte1.t1a)
+-- !query 10 schema
+struct<t1b:smallint>
+-- !query 10 output
+8
+
+
+-- !query 11
+WITH cte1
+ AS (SELECT t1a,
+ t1b
+ FROM t1
+ WHERE t1a = "val1d")
+SELECT t1a,
+ t1b,
+ t1c,
+ t1h
+FROM t1
+WHERE t1b NOT IN (SELECT cte1.t1b
+ FROM cte1
+ WHERE cte1.t1b < 0) AND
+ t1c > 10
+-- !query 11 schema
+struct<t1a:string,t1b:smallint,t1c:int,t1h:timestamp>
+-- !query 11 output
+val1a 16 12 2014-06-04 01:02:00.001
+val1a 16 12 2014-07-04 01:01:00
+val1b 8 16 2014-05-04 01:01:00
+val1c 8 16 2014-05-04 01:02:00.001
+val1d NULL 16 2014-06-04 01:01:00
+val1d NULL 16 2014-07-04 01:02:00.001
+
+
+-- !query 12
+WITH cte1 AS
+(
+ SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1h
+ FROM t1
+ WHERE t1d NOT IN
+ (
+ SELECT t2d
+ FROM t2
+ FULL OUTER JOIN t3 ON t2a = t3a
+ JOIN t1 on t1b = t2b))
+SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1h
+FROM t1
+WHERE t1b NOT IN
+ (
+ SELECT cte1.t1b
+ FROM cte1 INNER
+ JOIN cte1 cte2 ON cte1.t1a = cte2.t1a
+ RIGHT JOIN cte1 cte3 ON cte1.t1b = cte3.t1b
+ JOIN cte1 cte4 ON cte1.t1c = cte4.t1c) AND
+ t1c IS NOT NULL
+ORDER BY t1c DESC
+-- !query 12 schema
+struct<t1a:string,t1b:smallint,t1c:int,t1d:bigint,t1h:timestamp>
+-- !query 12 output
+val1b 8 16 19 2014-05-04 01:01:00
+val1c 8 16 19 2014-05-04 01:02:00.001
diff --git a/sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/not-in-joins.sql.out b/sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/not-in-joins.sql.out
new file mode 100644
index 0000000000..db01fa4557
--- /dev/null
+++ b/sql/core/src/test/resources/sql-tests/results/subquery/in-subquery/not-in-joins.sql.out
@@ -0,0 +1,229 @@
+-- Automatically generated by SQLQueryTestSuite
+-- Number of queries: 9
+
+
+-- !query 0
+create temporary view t1 as select * from values
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:00:00.000', date '2014-04-04'),
+ ("val1b", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1a", 16S, 12, 21L, float(15.0), 20D, 20E2, timestamp '2014-06-04 01:02:00.001', date '2014-06-04'),
+ ("val1a", 16S, 12, 10L, float(15.0), 20D, 20E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:02:00.001', date '2014-05-05'),
+ ("val1d", null, 16, 22L, float(17.0), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', null),
+ ("val1d", null, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-07-04 01:02:00.001', null),
+ ("val1e", 10S, null, 25L, float(17.0), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-09-04 01:02:00.001', date '2014-09-04'),
+ ("val1d", 10S, null, 12L, float(17.0), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:02:00.001', date '2014-04-04'),
+ ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04')
+ as t1(t1a, t1b, t1c, t1d, t1e, t1f, t1g, t1h, t1i)
+-- !query 0 schema
+struct<>
+-- !query 0 output
+
+
+
+-- !query 1
+create temporary view t2 as select * from values
+ ("val2a", 6S, 12, 14L, float(15), 20D, 20E2, timestamp '2014-04-04 01:01:00.000', date '2014-04-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 119L, float(17), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
+ ("val1c", 12S, 16, 219L, float(17), 25D, 26E2, timestamp '2016-05-04 01:01:00.000', date '2016-05-04'),
+ ("val1b", null, 16, 319L, float(17), 25D, 26E2, timestamp '2017-05-04 01:01:00.000', null),
+ ("val2e", 8S, null, 419L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1f", 19S, null, 519L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
+ ("val1c", 12S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-05'),
+ ("val1e", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:01:00.000', date '2014-09-04'),
+ ("val1f", 19S, null, 19L, float(17), 25D, 26E2, timestamp '2014-10-04 01:01:00.000', date '2014-10-04'),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', null)
+ as t2(t2a, t2b, t2c, t2d, t2e, t2f, t2g, t2h, t2i)
+-- !query 1 schema
+struct<>
+-- !query 1 output
+
+
+
+-- !query 2
+create temporary view t3 as select * from values
+ ("val3a", 6S, 12, 110L, float(15), 20D, 20E2, timestamp '2014-04-04 01:02:00.000', date '2014-04-04'),
+ ("val3a", 6S, 12, 10L, float(15), 20D, 20E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 219L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val1b", 8S, 16, 319L, float(17), 25D, 26E2, timestamp '2014-06-04 01:02:00.000', date '2014-06-04'),
+ ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:02:00.000', date '2014-07-04'),
+ ("val3c", 17S, 16, 519L, float(17), 25D, 26E2, timestamp '2014-08-04 01:02:00.000', date '2014-08-04'),
+ ("val3c", 17S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:02:00.000', date '2014-09-05'),
+ ("val1b", null, 16, 419L, float(17), 25D, 26E2, timestamp '2014-10-04 01:02:00.000', null),
+ ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-11-04 01:02:00.000', null),
+ ("val3b", 8S, null, 719L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
+ ("val3b", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2015-05-04 01:02:00.000', date '2015-05-04')
+ as t3(t3a, t3b, t3c, t3d, t3e, t3f, t3g, t3h, t3i)
+-- !query 2 schema
+struct<>
+-- !query 2 output
+
+
+
+-- !query 3
+SELECT t1a,
+ t1b,
+ t1c,
+ t3a,
+ t3b,
+ t3c
+FROM t1
+ JOIN t3
+WHERE t1a NOT IN (SELECT t2a
+ FROM t2)
+ AND t1b = t3b
+-- !query 3 schema
+struct<t1a:string,t1b:smallint,t1c:int,t3a:string,t3b:smallint,t3c:int>
+-- !query 3 output
+val1a 6 8 val3a 6 12
+val1a 6 8 val3a 6 12
+val1a 6 8 val3a 6 12
+val1a 6 8 val3a 6 12
+val1d 10 NULL val1b 10 12
+val1d 10 NULL val1b 10 12
+
+
+-- !query 4
+SELECT t1a,
+ t1b,
+ t1c,
+ count(distinct(t3a)),
+ t3b,
+ t3c
+FROM t1
+FULL OUTER JOIN t3 on t1b != t3b
+RIGHT JOIN t2 on t1c = t2c
+where t1a NOT IN
+ (
+ SELECT t2a
+ FROM t2
+ WHERE t2c NOT IN
+ (
+ SELECT t1c
+ FROM t1
+ WHERE t1a = t2a))
+AND t1b != t3b
+AND t1d = t2d
+GROUP BY t1a, t1b, t1c, t3a, t3b, t3c
+HAVING count(distinct(t3a)) >= 1
+ORDER BY t1a
+-- !query 4 schema
+struct<t1a:string,t1b:smallint,t1c:int,count(DISTINCT t3a):bigint,t3b:smallint,t3c:int>
+-- !query 4 output
+val1c 8 16 1 10 12
+val1c 8 16 1 6 12
+val1c 8 16 1 17 16
+
+
+-- !query 5
+SELECT t1a,
+ t1b,
+ t1c,
+ t1d,
+ t1h
+FROM t1
+WHERE t1a NOT IN
+ (
+ SELECT t2a
+ FROM t2
+ LEFT JOIN t3 on t2b = t3b
+ WHERE t1d = t2d
+ )
+AND t1d NOT IN
+ (
+ SELECT t2d
+ FROM t2
+ RIGHT JOIN t1 on t2e = t1e
+ WHERE t1a = t2a)
+-- !query 5 schema
+struct<t1a:string,t1b:smallint,t1c:int,t1d:bigint,t1h:timestamp>
+-- !query 5 output
+val1a 16 12 10 2014-07-04 01:01:00
+val1a 16 12 21 2014-06-04 01:02:00.001
+val1a 6 8 10 2014-04-04 01:00:00
+val1a 6 8 10 2014-04-04 01:02:00.001
+val1d 10 NULL 12 2015-05-04 01:01:00
+val1d NULL 16 22 2014-06-04 01:01:00
+val1e 10 NULL 25 2014-08-04 01:01:00
+
+
+-- !query 6
+SELECT Count(DISTINCT( t1a )),
+ t1b,
+ t1c,
+ t1d
+FROM t1
+WHERE t1a NOT IN (SELECT t2a
+ FROM t2
+ JOIN t1
+ WHERE t2b <> t1b)
+GROUP BY t1b,
+ t1c,
+ t1d
+HAVING t1d NOT IN (SELECT t2d
+ FROM t2
+ WHERE t1d = t2d)
+ORDER BY t1b DESC
+-- !query 6 schema
+struct<count(DISTINCT t1a):bigint,t1b:smallint,t1c:int,t1d:bigint>
+-- !query 6 output
+1 16 12 10
+1 16 12 21
+1 10 NULL 12
+1 6 8 10
+1 NULL 16 22
+
+
+-- !query 7
+SELECT COUNT(DISTINCT(t1a)),
+ t1b,
+ t1c,
+ t1d
+FROM t1
+WHERE t1a NOT IN
+ (
+ SELECT t2a
+ FROM t2 INNER
+ JOIN t1 ON t1a = t2a)
+GROUP BY t1b,
+ t1c,
+ t1d
+HAVING t1b < sum(t1c)
+-- !query 7 schema
+struct<count(DISTINCT t1a):bigint,t1b:smallint,t1c:int,t1d:bigint>
+-- !query 7 output
+1 6 8 10
+
+
+-- !query 8
+SELECT COUNT(DISTINCT(t1a)),
+ t1b,
+ t1c,
+ t1d
+FROM t1
+WHERE t1a NOT IN
+ (
+ SELECT t2a
+ FROM t2 INNER
+ JOIN t1
+ ON t1a = t2a)
+AND t1d NOT IN
+ (
+ SELECT t2d
+ FROM t2
+ INNER JOIN t3
+ ON t2b = t3b )
+GROUP BY t1b,
+ t1c,
+ t1d
+HAVING t1b < sum(t1c)
+-- !query 8 schema
+struct<count(DISTINCT t1a):bigint,t1b:smallint,t1c:int,t1d:bigint>
+-- !query 8 output
+1 6 8 10