statement ok
CREATE TABLE abc (a INT, b INT, C INT)

statement ok
INSERT INTO abc VALUES (1, 10, 100), (2, 20, 200), (3, 30, 300), (NULL, NULL, NULL)

statement ok
CREATE TYPE typ AS (x INT, y INT);

statement ok
CREATE TABLE comp (v typ);

statement ok
INSERT INTO comp VALUES (ROW(1, 2)), (ROW(3, 4));

# ANY/SOME with arrays.

query B
SELECT 1 = ANY(ARRAY[1, 2])
----
true

query B
SELECT 1 = ANY (((ARRAY[1, 2])))
----
true

query B
SELECT 1 = SOME(ARRAY[1, 2])
----
true

query B
SELECT 1 = ANY(ARRAY[3, 4])
----
false

query B
SELECT 1 = ANY (((ARRAY[3, 4])))
----
false

query B
SELECT 1 < ANY(ARRAY[0, 5])
----
true

query B
SELECT 1 < ANY(ARRAY[0, 1])
----
false

query B
SELECT 1 = ANY(ARRAY[1.0, 1.1])
----
true

query B
SELECT 1 < ANY(ARRAY[1.0, 1.1])
----
true

query B
SELECT 1 = ANY(ARRAY[1, NULL])
----
true

query T
SELECT 1 = ANY(ARRAY[2, NULL])
----
NULL

query T
SELECT 1 = ANY(ARRAY[NULL, NULL])
----
NULL

query B
SELECT 1 = ANY(ARRAY[1,2] || 3)
----
true

query B
SELECT 1 = ANY(ARRAY[2,3] || 1)
----
true

query B
SELECT 1 = ANY(ARRAY[2,3] || 4)
----
false

query III
SELECT * FROM abc WHERE a = ANY(ARRAY[1,3]) ORDER BY a
----
1 10 100
3 30 300

query III
SELECT * FROM abc WHERE a = ANY(ARRAY[4, 5])
----

query III
SELECT * FROM abc WHERE a = ANY(ARRAY[1, NULL])
----
1 10 100

query III
SELECT * FROM abc WHERE a = ANY(ARRAY[4, NULL])
----

query III
SELECT * FROM abc WHERE a = ANY(ARRAY[NULL, NULL])
----

query error unsupported comparison operator: 1 = ANY ARRAY\['foo', 'bar'\]
SELECT 1 = ANY(ARRAY['foo', 'bar'])

query error unsupported comparison operator: <int> = ANY <string\[\]>
SELECT 1 = ANY(ARRAY['foo'] || 'bar'::string)

# Note that this relatively poor error message is caused by the fact that
# strings are constant castable to string arrays. Postgres also makes this
# same minor mistake in error generation.
query error unsupported binary operator: <string\[\]> || <string> (returning <int\[\]>)
SELECT 1 = ANY(ARRAY['foo'] || 'bar')

# ANY/SOME with subqueries.

query B
SELECT 1 = ANY(SELECT * FROM generate_series(1,3))
----
true

query B
SELECT 1 = ANY(SELECT * FROM generate_series(2,4))
----
false

query B
SELECT 1 < ANY(SELECT * FROM generate_series(1,3))
----
true

query B
SELECT 1 < ANY(SELECT * FROM generate_series(0,1))
----
false

query B
SELECT 1 = ANY(SELECT * FROM unnest(ARRAY[1.0, 1.1]))
----
true

query B
SELECT 1 = ANY(SELECT * FROM unnest(ARRAY[1.0, 1.1]))
----
true

query B
SELECT 1.0 < ANY(SELECT * FROM unnest(ARRAY[1.0, 1.1]))
----
true

query B
SELECT 1.0 = ANY(SELECT * FROM unnest(ARRAY[1.0001, 2]))
----
false

query B
SELECT 1 = ANY(SELECT * FROM unnest(ARRAY[1, NULL]))
----
true

query T
SELECT 1 = ANY(SELECT * FROM unnest(ARRAY[2, NULL]))
----
NULL

query T
SELECT 1 = ANY(SELECT * FROM unnest(ARRAY[NULL, NULL]::int[]))
----
NULL

query III
SELECT * FROM abc WHERE a = ANY(SELECT a FROM abc WHERE b = 10)
----
1 10 100

query III
SELECT * FROM abc WHERE a < ANY(SELECT a FROM abc WHERE b = 30) ORDER BY a
----
1 10 100
2 20 200

query III
SELECT * FROM abc WHERE a > ANY(SELECT a FROM abc WHERE b = 30)
----

# ANY predicate in disjunction.
query III rowsort
SELECT * FROM abc WHERE a > ANY(SELECT a FROM abc WHERE b = 20) OR b IS NULL
----
NULL NULL NULL
3    30   300

# ALL predicate in disjunction.
query III rowsort
SELECT * FROM abc WHERE a >= ALL(SELECT a FROM abc WHERE a IS NOT NULL) OR b=10
----
1 10 100
3 30 300

# ANY predicate in NOT NULL expression.
query III rowsort
SELECT * FROM abc WHERE a > ANY(SELECT a FROM abc WHERE b = 20) IS NULL
----
NULL NULL NULL

query III
SELECT * FROM abc WHERE a = ANY(SELECT * FROM unnest(ARRAY[1, NULL]))
----
1 10 100

query III
SELECT * FROM abc WHERE a = ANY(SELECT * FROM unnest(ARRAY[4, NULL]))
----

query III
SELECT * FROM abc WHERE a = ANY(SELECT * FROM unnest(ARRAY[NULL, NULL]::int[]))
----

query error unsupported comparison operator: <int> = ANY <tuple\{string\}>
SELECT 1 = ANY(SELECT * FROM unnest(ARRAY['foo', 'bar']))

# ALL with arrays.

query B
SELECT 1 = ALL(ARRAY[1, 1, 1.0])
----
true

query B
SELECT 1 = ALL(ARRAY[1, 1.001, 1.0])
----
false

query B
SELECT 5 > ALL(ARRAY[1, 2, 3])
----
true

query B
SELECT 5 > ALL(ARRAY[6, 7, 8])
----
false

query B
SELECT 5 > ALL(ARRAY[4, 6, 7])
----
false

query B
SELECT 1 = ALL(ARRAY[2, NULL])
----
false

query T
SELECT 1 = ALL(ARRAY[1, NULL])
----
NULL

query T
SELECT 1 = ALL(ARRAY[NULL, NULL])
----
NULL

query B
SELECT 5 > ALL(ARRAY[1, 2] || 3)
----
true

query B
SELECT 5 > ALL(ARRAY[6, 7] || 8)
----
false

query III
SELECT * FROM abc WHERE a > ALL(ARRAY[0, 1]) ORDER BY a
----
2    20   200
3    30   300

query III
SELECT * FROM abc WHERE a > ALL(ARRAY[1, 4])
----

query III
SELECT * FROM abc WHERE a > ALL(ARRAY[1, NULL])
----

query III
SELECT * FROM abc WHERE a > ALL(ARRAY[NULL, NULL])
----

query error unsupported comparison operator: 1 = ALL ARRAY\['foo', 'bar'\]
SELECT 1 = ALL(ARRAY['foo', 'bar'])

query error unsupported comparison operator: <int> = ALL <string\[\]>
SELECT 1 = ALL(ARRAY['foo'] || 'bar'::text)

# ALL with subqueries.

query B
SELECT 1 = ALL(SELECT * FROM unnest(ARRAY[1,1,1]))
----
true

query B
SELECT 1 = ALL(SELECT * FROM unnest(ARRAY[1,2,3]))
----
false

query B
SELECT 1 < ALL(SELECT * FROM generate_series(2,5))
----
true

query B
SELECT 1 < ALL(SELECT * FROM generate_series(1,3))
----
false

query B
SELECT 1 = ALL(SELECT * FROM unnest(ARRAY[2, NULL]))
----
false

query T
SELECT 1 = ALL(SELECT * FROM unnest(ARRAY[1, NULL]))
----
NULL

query T
SELECT 1 = ALL(SELECT * FROM unnest(ARRAY[NULL, NULL]::int[]))
----
NULL

query III
SELECT * FROM abc WHERE a < ALL(SELECT b FROM abc WHERE b IS NOT NULL) ORDER BY a
----
1    10   100
2    20   200
3    30   300

query III
SELECT * FROM abc WHERE a < ALL(SELECT a FROM abc WHERE a >= 2)
----
1 10 100

query III
SELECT * FROM abc WHERE a < ALL(SELECT a FROM abc)
----

query III
SELECT * FROM abc WHERE a > ALL(SELECT * FROM unnest(ARRAY[1, NULL]))
----

query III
SELECT * FROM abc WHERE a > ALL(SELECT * FROM unnest(ARRAY[NULL, NULL]::int[]))
----

query error unsupported comparison operator: <int> = ALL <tuple\{string\}>
SELECT 1 = ALL(SELECT * FROM unnest(ARRAY['foo', 'bar']))

# ANY/ALL with tuples.

query B
SELECT 1 = ANY (1, 2, 3)
----
true

query error pq: could not parse "foo" as type int
SELECT 1 = ANY (1, 2, 3.3, 'foo')

query B
SELECT 1 = ANY (((1, 2, 3)))
----
true

query B
SELECT 1 = ANY (2, 3, 4)
----
false

query B
SELECT 1 = ANY (((2, 3, 4)))
----
false

query B
SELECT 1 = ANY (1, 1.1)
----
true

query B
SELECT 1::decimal = ANY (1, 1.1)
----
true

query B
SELECT 1 = ANY (1.0, 1.1)
----
true

query B
SELECT 1 = ANY (((1.0, 1.1)))
----
true

query B
SELECT 1::decimal = ANY (1.0, 1.1)
----
true

query B
SELECT 1::decimal = ANY (((1.0, 1.1)))
----
true

query error pq: could not parse "hello" as type int
SELECT 1 = ANY (1, 'hello', 3)

query B
SELECT 1 = ANY ROW()
----
false

# Regression test for #37793 - don't fold sub-operators with untyped NULL
# operands during type-checking.
query B
SELECT NULL = ANY(ARRAY []::INTEGER[]);
----
false

query B
SELECT NULL = SOME(ARRAY []::INTEGER[]);
----
false

query B
SELECT NULL = ALL(ARRAY []::INTEGER[]);
----
true

query B
SELECT NULL = ANY(ARRAY [1]::INTEGER[]);
----
NULL

query B
SELECT NULL = SOME(ARRAY [1]::INTEGER[]);
----
NULL

query B
SELECT NULL = ALL(ARRAY [1]::INTEGER[]);
----
NULL

query B
SELECT NULL = ANY(NULL::INTEGER[]);
----
NULL

query B
SELECT NULL = SOME(NULL::INTEGER[]);
----
NULL

query B
SELECT NULL = ALL(NULL::INTEGER[]);
----
NULL

# Regression test for #102017 - don't throw a "too few columns" error.
query II
SELECT * FROM (VALUES (1, 2)) foo(a, b)
WHERE (a, b) = ANY(ARRAY(SELECT ROW(x, y) FROM (VALUES (1, 2)) bar(x, y)));
----
1  2

query II
SELECT a, b FROM abc WHERE (a, b) = ANY(ARRAY(SELECT ROW(a, b) FROM abc LIMIT 1));
----
1  10

# The next query might error out when spilling to disk in the row-by-row engine,
# so we only use vectorized engine for it.
statement ok
SET vectorize = on;

query T rowsort
SELECT * FROM comp WHERE v IN (SELECT v FROM comp);
----
(1,2)
(3,4)

statement ok
RESET vectorize;
