# LogicTest: local

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
EXPLAIN (VEC) SELECT _inet & _inet FROM many_types
----
│
└ Node 1
  └ *colexecproj.projBitandDatumDatumOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _inet - _int2 FROM many_types
----
│
└ Node 1
  └ *colexecproj.projMinusDatumInt16Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _int2^_int4 FROM many_types
----
│
└ Node 1
  └ *colexecproj.projPowInt16Int32Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _int2^_int FROM many_types
----
│
└ Node 1
  └ *colexecproj.projPowInt16Int64Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _float^_float FROM many_types
----
│
└ Node 1
  └ *colexecproj.projPowFloat64Float64Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _decimal^_int4 FROM many_types
----
│
└ Node 1
  └ *colexecproj.projPowDecimalInt32Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _inet - 1 FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projMinusDatumInt64ConstOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _int4 + _inet FROM many_types
----
│
└ Node 1
  └ *colexecproj.projPlusInt32DatumOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT 2 + _inet FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projPlusDatumInt64ConstOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _time + _interval FROM many_types
----
│
└ Node 1
  └ *colexecproj.projPlusDatumIntervalOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json - _int FROM many_types
----
│
└ Node 1
  └ *colexecproj.projMinusJSONInt64Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _bytes || _bytes FROM many_types
----
│
└ Node 1
  └ *colexecproj.projConcatBytesBytesOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _string || _string FROM many_types
----
│
└ Node 1
  └ *colexecproj.projConcatBytesBytesOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json || _json FROM many_types
----
│
└ Node 1
  └ *colexecproj.projConcatJSONJSONOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _varbit || _varbit FROM many_types
----
│
└ Node 1
  └ *colexecproj.projConcatDatumDatumOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _int << 1 FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projLShiftInt64Int64ConstOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _int >> 1 FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projRShiftInt64Int64ConstOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _varbit << 4 FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projLShiftDatumInt64ConstOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _varbit << _int2 FROM many_types
----
│
└ Node 1
  └ *colexecproj.projLShiftDatumInt16Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _varbit << _int4 FROM many_types
----
│
└ Node 1
  └ *colexecproj.projLShiftDatumInt32Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _varbit << _int FROM many_types
----
│
└ Node 1
  └ *colexecproj.projLShiftDatumInt64Op
    └ *colfetcher.ColBatchScan


query T
EXPLAIN (VEC) SELECT _varbit >> 4 FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projRShiftDatumInt64ConstOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _varbit >> _int2 FROM many_types
----
│
└ Node 1
  └ *colexecproj.projRShiftDatumInt16Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _varbit >> _int4 FROM many_types
----
│
└ Node 1
  └ *colexecproj.projRShiftDatumInt32Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _varbit >> _int FROM many_types
----
│
└ Node 1
  └ *colexecproj.projRShiftDatumInt64Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json -> _int2 FROM many_types
----
│
└ Node 1
  └ *colexecproj.projJSONFetchValJSONInt16Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json -> _int4 FROM many_types
----
│
└ Node 1
  └ *colexecproj.projJSONFetchValJSONInt32Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json -> _int FROM many_types
----
│
└ Node 1
  └ *colexecproj.projJSONFetchValJSONInt64Op
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json -> 2 FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projJSONFetchValJSONInt64ConstOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json -> 2 -> 'a' FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projJSONFetchValJSONBytesConstOp
    └ *colexecprojconst.projJSONFetchValJSONInt64ConstOp
      └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json #> _stringarray, _json #> '{a,b}' FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projJSONFetchValPathJSONDatumConstOp
    └ *colexecproj.projJSONFetchValPathJSONDatumOp
      └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json #> _stringarray #> '{c}', _json #> '{a,b}' #> '{c}' FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projJSONFetchValPathJSONDatumConstOp
    └ *colexecprojconst.projJSONFetchValPathJSONDatumConstOp
      └ *colexecprojconst.projJSONFetchValPathJSONDatumConstOp
        └ *colexecproj.projJSONFetchValPathJSONDatumOp
          └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json #>> _stringarray, _json #>> '{a,b}' FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projJSONFetchTextPathJSONDatumConstOp
    └ *colexecproj.projJSONFetchTextPathJSONDatumOp
      └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _json #> '{a,b}' #>> '{c}' FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projJSONFetchTextPathJSONDatumConstOp
    └ *colexecprojconst.projJSONFetchValPathJSONDatumConstOp
      └ *colfetcher.ColBatchScan

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

query T
EXPLAIN (VEC) SELECT _time + _date FROM many_types
----
│
└ Node 1
  └ *rowexec.noopProcessor
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT '[2, "hi", {"b": ["bar", {"c": 4}]}]'::jsonb -> _int FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projJSONFetchValJSONConstInt64Op
    └ *colfetcher.ColBatchScan

# 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 T
EXPLAIN (VEC) SELECT B'11' <> _varbit FROM many_types
----
│
└ Node 1
  └ *colexecprojconst.projNEDatumDatumConstOp
    └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _int4 // _int FROM many_types WHERE _int <> 0
----
│
└ Node 1
  └ *colexecproj.projFloorDivInt32Int64Op
    └ *colexecsel.selNEInt64Int64ConstOp
      └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT _interval + _timestamp FROM many_types WHERE _timestamp - _interval IS NOT NULL
----
│
└ Node 1
  └ *colexecproj.projPlusIntervalTimestampOp
    └ *colexec.isNullSelOp
      └ *colexecproj.projMinusTimestampIntervalOp
        └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT 1 FROM many_types WHERE _string::BOOL
----
│
└ Node 1
  └ *colexecbase.constInt64Op
    └ *colexecbase.castStringBoolOp
      └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT 1 FROM many_types WHERE COALESCE(_string::BOOL, _bool)
----
│
└ Node 1
  └ *colexecbase.constInt64Op
    └ *colexec.caseOp
      ├ *colexec.bufferOp
      │ └ *colfetcher.ColBatchScan
      ├ *colexecbase.castStringBoolOp
      │ └ *colexec.isNullProjOp
      │   └ *colexecbase.castStringBoolOp
      │     └ *colexec.bufferOp
      ├ *colexec.isNullProjOp
      │ └ *colexec.bufferOp
      └ *colexecbase.castOpNullAny
        └ *colexecbase.constNullOp
          └ *colexec.bufferOp
