statement ok
CREATE TABLE many_types (
    _bool        BOOL,
    _bytes       BYTES,
    _date        DATE,
    _decimal     DECIMAL,
    _int2        INT2,
    _int4        INT4,
    _int         INT8,
    _oid         OID,
    _float       FLOAT8,
    _string      STRING,
    _uuid        UUID,
    _timestamp   TIMESTAMP,
    _timestamptz TIMESTAMPTZ,
    _interval    INTERVAL,
    _inet        INet,
    _json        JSON,
    _stringarray STRING[],
    _time        Time,
    _varbit      VARBIT
)

statement ok
INSERT
  INTO many_types
VALUES (
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL
       ),
       (
       false,
       '123',
       '2019-10-22',
       1.23,
       1,
       20,
       312,
       123,
       1.23,
       '123',
       '63616665-6630-3064-6465-616462656562',
       '1-1-18 1:00:00.001',
       '1-1-18 1:00:00.001-8',
       '12:34:56.123456',
       '127.0.0.1',
       '[1, "hello", {"a": ["foo", {"b": 3}]}]',
       '{2,a}'::STRING[],
       '1:00:00.001',
       B'1'
       ),
       (
       true,
       '456',
       '2020-05-21',
       4.56,
       4,
       -50,
       789,
       456,
       4.56,
       '456',
       '63616665-0000-0000-6465-616462656562',
       '1-1-18 1:00:00.456',
       '1-1-18 1:00:00.456-8',
       '01:23:45.012345',
       '192.168.0.0/16',
       '[2, "hi", {"b": ["bar", {"c": 4}]}]',
       '{2,b}'::STRING[],
       '1:00:00.456',
       B'11'
       ),
       (
        NULL,
        NULL,
        NULL,
        NULL,
        2,
        2,
        2,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        '[1, "hello", {"a": ["foo", {"b": 3}]}]',
        '{1,a}'::STRING[],
        NULL,
        B'11010'
       )

query T rowsort
SELECT _inet & _inet FROM many_types
----
NULL
127.0.0.1
192.168.0.0/16
NULL

query R rowsort
SELECT _float^_float FROM many_types
----
NULL
1.289980921001281
1011.299243923862
NULL

query R rowsort
SELECT _int^_decimal FROM many_types
----
NULL
1168.9882627536962329
16243182903566.959706
NULL

query T rowsort
SELECT _inet - _int2 FROM many_types
----
NULL
127.0.0.0
192.167.255.252/16
NULL

query T rowsort
SELECT _inet - 1 FROM many_types
----
NULL
127.0.0.0
192.167.255.255/16
NULL

query T rowsort
SELECT _int4 + _inet FROM many_types
----
NULL
127.0.0.21
192.167.255.206/16
NULL

query T rowsort
SELECT 2 + _inet FROM many_types
----
NULL
127.0.0.3
192.168.0.2/16
NULL

query T rowsort
SELECT _time + _interval FROM many_types
----
NULL
0000-01-01 13:34:56.124456 +0000 UTC
0000-01-01 02:23:45.468345 +0000 UTC
NULL

query T rowsort
SELECT _json - _int FROM many_types
----
NULL
[1, "hello", {"a": ["foo", {"b": 3}]}]
[2, "hi", {"b": ["bar", {"c": 4}]}]
[1, "hello"]

query T rowsort
SELECT _bytes || _bytes FROM many_types
----
NULL
123123
456456
NULL

query T rowsort
SELECT _string || _string FROM many_types
----
NULL
123123
456456
NULL

query T rowsort
SELECT _json || _json FROM many_types
----
NULL
[1, "hello", {"a": ["foo", {"b": 3}]}, 1, "hello", {"a": ["foo", {"b": 3}]}]
[2, "hi", {"b": ["bar", {"c": 4}]}, 2, "hi", {"b": ["bar", {"c": 4}]}]
[1, "hello", {"a": ["foo", {"b": 3}]}, 1, "hello", {"a": ["foo", {"b": 3}]}]

query T rowsort
SELECT _varbit || _varbit FROM many_types
----
NULL
11
1111
1101011010

query I rowsort
SELECT _int2 >> 1 FROM many_types
----
NULL
0
2
1

query I rowsort
SELECT _int4 >> 3 FROM many_types
----
NULL
2
-7
0

statement error shift argument out of range
SELECT _int << 64 FROM many_types

statement error shift argument out of range
SELECT _int << -10 FROM many_types

query I rowsort
SELECT _int >> 63 FROM many_types
----
NULL
0
0
0

query T rowsort
SELECT _varbit >> 1 FROM many_types
----
NULL
0
01
01101

query T rowsort
SELECT _varbit << 1 FROM many_types
----
NULL
0
10
10100

query T rowsort
SELECT _varbit << 3 FROM many_types
----
NULL
0
00
10000

query I rowsort
SELECT _int2^_int FROM many_types WHERE _int2 < 10 AND _int < 10
----
4

query I rowsort
SELECT _int2^_int2 FROM many_types WHERE _int2 < 10
----
1
256
4

statement error integer out of range
SELECT _int2^_int4 FROM many_types

query T rowsort
SELECT _json -> _int2 FROM many_types
----
NULL
"hello"
NULL
{"a": ["foo", {"b": 3}]}

query T rowsort
SELECT _json -> _int4 FROM many_types
----
NULL
NULL
NULL
{"a": ["foo", {"b": 3}]}

query T rowsort
SELECT _json -> _int FROM many_types
----
NULL
NULL
NULL
{"a": ["foo", {"b": 3}]}

query T rowsort
SELECT _json -> 2 FROM many_types
----
NULL
{"a": ["foo", {"b": 3}]}
{"b": ["bar", {"c": 4}]}
{"a": ["foo", {"b": 3}]}

query T rowsort
SELECT _json -> 2 -> 'a' FROM many_types
----
NULL
["foo", {"b": 3}]
NULL
["foo", {"b": 3}]

query TT
SELECT _json #> _stringarray, _json #> '{2,a}' FROM many_types ORDER BY _int
----
NULL               NULL
NULL               ["foo", {"b": 3}]
["foo", {"b": 3}]  ["foo", {"b": 3}]
["bar", {"c": 4}]  NULL

query TT
SELECT _json #> _stringarray #> '{1,b}', _json #> '{2,a}' #> '{1,b}' FROM many_types ORDER BY _int
----
NULL  NULL
NULL  3
3     3
NULL  NULL

query T rowsort
SELECT _json #> '{}' FROM many_types
----
NULL
[1, "hello", {"a": ["foo", {"b": 3}]}]
[2, "hi", {"b": ["bar", {"c": 4}]}]
[1, "hello", {"a": ["foo", {"b": 3}]}]

query TT
SELECT _json #> _stringarray #> '{d}', _json #> '{c}' #> '{d}' FROM many_types
----
NULL  NULL
NULL  NULL
NULL  NULL
NULL  NULL

query TT
SELECT _json #>> _stringarray, _json #>> '{2,a}' FROM many_types ORDER BY _int
----
NULL               NULL
NULL               ["foo", {"b": 3}]
["foo", {"b": 3}]  ["foo", {"b": 3}]
["bar", {"c": 4}]  NULL

query TT rowsort
SELECT _json #> '{2,a}' #>> _stringarray, _json #> '{2,a}' #>> '{1,b}' FROM many_types
----
NULL  NULL
NULL  3
NULL  NULL
NULL  3

query T rowsort
SELECT _json #>> '{}' FROM many_types
----
NULL
[1, "hello", {"a": ["foo", {"b": 3}]}]
[2, "hi", {"b": ["bar", {"c": 4}]}]
[1, "hello", {"a": ["foo", {"b": 3}]}]

query T
SELECT _json #> '{c}' #>> '{d}' FROM many_types
----
NULL
NULL
NULL
NULL

# Regression tests for #49143. Correctly handle cases where the -> operator
# results in NULL when both arguments are non-NULL.
subtest regression_49143

query B
SELECT _json -> 5  = '1' FROM many_types
----
NULL
NULL
NULL
NULL

query B rowsort
SELECT _json -> _int -> 'a' = '["foo", {"b": 3}]' FROM many_types
----
NULL
NULL
NULL
true

# Make sure we fall back to row engine when we have a mixed-type expression
# with dates.
subtest mixed_types_with_dates

# Regression #50261 (not handling constant datum-backed values on the left
# correctly).
statement error pq: cannot AND inet values of different sizes
SELECT '18b5:7e2:b3b:6f35:c48:eb6a:d607:6c61/108':::INET::INET & broadcast('13.83.69.95/21':::INET::INET)::INET::INET FROM many_types WHERE _bool

query T rowsort
SELECT '[2, "hi", {"b": ["bar", {"c": 4}]}]'::jsonb -> _int FROM many_types
----
NULL
NULL
NULL
{"b": ["bar", {"c": 4}]}

# Check that the comparison expressions with the constant on the left are
# handled as well (such expressions are normalized so that the constant ends up
# on the right side).
query B rowsort
SELECT B'11' >= _varbit FROM many_types
----
NULL
true
true
false

query III rowsort
SELECT _int, _int2, _int // _int2 FROM many_types WHERE _int2 <> 0
----
312  1  312
789  4  197
2    2  1

# Regression test for incorrectly propagating an error as internal (#57773).
statement error .* value out of range
SELECT ((-1.234E+401)::DECIMAL * '-53 years -10 mons -377 days -08:33:40.519057'::INTERVAL::INTERVAL)::INTERVAL FROM many_types

# Regression test for #70738. There should be overloads for INTERVAL / INT4 and
# INTERVAL / INT2.
statement ok
CREATE TABLE t70738 (
    i INTERVAL,
    i2 INT2,
    i4 INT4,
    i8 INT8
);
INSERT INTO t70738 VALUES ('1 day'::INTERVAL, 1, 1, 1);

statement ok
SELECT * FROM t70738 AS t1
JOIN t70738 as t2 ON t1.i8 = t2.i4
WHERE (t2.i / t1.i8) = '1 day'

statement ok
SELECT * FROM t70738 AS t1
JOIN t70738 as t2 ON t1.i8 = t2.i2
WHERE (t2.i / t1.i8) = '1 day'

# Regression test for incorrect usage of the optimized IN operator (#88141).
statement ok
CREATE TABLE t88141 (i INTERVAL);
INSERT INTO t88141 (i) VALUES (NULL);
SET testing_optimizer_random_seed = 6320964980407535657;
SET testing_optimizer_disable_rule_probability = 0.500000;

query T
SELECT i
FROM t88141
WHERE NOT (i IN (
    SELECT '1 day'::INTERVAL
    FROM t88141 t1 JOIN t88141 t2 ON true
    WHERE false
));
----
NULL

statement ok
RESET testing_optimizer_random_seed;
RESET testing_optimizer_disable_rule_probability;

query T rowsort
SELECT _interval + _timestamp FROM many_types WHERE _timestamp - _interval IS NOT NULL
----
2018-01-01 13:34:56.124456 +0000 +0000
2018-01-01 02:23:45.468345 +0000 +0000
