# LogicTest: local

statement ok
CREATE TABLE uvw (
  u INT,
  v INT,
  w INT,
  INDEX (u,v,w)
)

query T
EXPLAIN (VERBOSE) SELECT * FROM uvw WHERE (u, v, w) >= (1, 2, 3) ORDER BY u, v, w
----
distribution: local
vectorized: true
·
• scan
  columns: (u, v, w)
  ordering: +u,+v,+w
  estimated row count: 333 (missing stats)
  table: uvw@uvw_u_v_w_idx
  spans: /1/2/3-

query T
EXPLAIN (VERBOSE) SELECT * FROM uvw WHERE (u, v, w) > (2, 1, 1) ORDER BY u, v, w
----
distribution: local
vectorized: true
·
• scan
  columns: (u, v, w)
  ordering: +u,+v,+w
  estimated row count: 333 (missing stats)
  table: uvw@uvw_u_v_w_idx
  spans: /2/1/2-

query T
EXPLAIN (VERBOSE) SELECT * FROM uvw WHERE (u, v, w) <= (2, 3, 1) ORDER BY u, v, w
----
distribution: local
vectorized: true
·
• filter
│ columns: (u, v, w)
│ ordering: +u,+v,+w
│ estimated row count: 333 (missing stats)
│ filter: (u, v, w) <= (2, 3, 1)
│
└── • scan
      columns: (u, v, w)
      ordering: +u,+v,+w
      estimated row count: 333 (missing stats)
      table: uvw@uvw_u_v_w_idx
      spans: /!NULL-/2/3/2

query T
EXPLAIN (VERBOSE) SELECT * FROM uvw WHERE (u, v, w) < (2, 2, 2) ORDER BY u, v, w
----
distribution: local
vectorized: true
·
• filter
│ columns: (u, v, w)
│ ordering: +u,+v,+w
│ estimated row count: 333 (missing stats)
│ filter: (u, v, w) < (2, 2, 2)
│
└── • scan
      columns: (u, v, w)
      ordering: +u,+v,+w
      estimated row count: 333 (missing stats)
      table: uvw@uvw_u_v_w_idx
      spans: /!NULL-/2/2/2

query T
EXPLAIN (VERBOSE) SELECT * FROM uvw WHERE (u, v, w) != (1, 2, 3) ORDER BY u, v, w
----
distribution: local
vectorized: true
·
• filter
│ columns: (u, v, w)
│ ordering: +u,+v,+w
│ estimated row count: 333 (missing stats)
│ filter: (u, v, w) != (1, 2, 3)
│
└── • scan
      columns: (u, v, w)
      ordering: +u,+v,+w
      estimated row count: 333 (missing stats)
      table: uvw@uvw_u_v_w_idx
      spans: -/1/2/3 /1/2/4-

query T
EXPLAIN (VERBOSE) SELECT * FROM uvw WHERE (u, v, w) >= (1, NULL, 3) ORDER BY u, v, w
----
distribution: local
vectorized: true
·
• scan
  columns: (u, v, w)
  ordering: +u,+v,+w
  estimated row count: 333 (missing stats)
  table: uvw@uvw_u_v_w_idx
  spans: /2-

query T
EXPLAIN (VERBOSE) SELECT * FROM uvw WHERE (u, v, w) < (2, NULL, 3) ORDER BY u, v, w
----
distribution: local
vectorized: true
·
• scan
  columns: (u, v, w)
  ordering: +u,+v,+w
  estimated row count: 333 (missing stats)
  table: uvw@uvw_u_v_w_idx
  spans: /!NULL-/2

statement ok
DROP TABLE uvw

# Regression test for #6390.
statement ok
CREATE TABLE abc (a INT, b INT, c INT, INDEX(a, b))

query T
EXPLAIN (VERBOSE) SELECT * FROM abc WHERE (a, b, c) > (1, 2, 3) AND (a,b,c) < (8, 9, 10)
----
distribution: local
vectorized: true
·
• filter
│ columns: (a, b, c)
│ estimated row count: 333 (missing stats)
│ filter: ((a, b, c) > (1, 2, 3)) AND ((a, b, c) < (8, 9, 10))
│
└── • index join
    │ columns: (a, b, c)
    │ estimated row count: 80 (missing stats)
    │ table: abc@abc_pkey
    │ key columns: rowid
    │
    └── • scan
          columns: (a, b, rowid)
          estimated row count: 80 (missing stats)
          table: abc@abc_a_b_idx
          spans: /1/2-/8/10

statement ok
DROP TABLE abc

statement ok
CREATE TABLE abc (a INT, b INT, c INT, INDEX(a, b DESC, c))

query T
EXPLAIN (VERBOSE) SELECT * FROM abc WHERE (a, b, c) > (1, 2, 3)
----
distribution: local
vectorized: true
·
• filter
│ columns: (a, b, c)
│ estimated row count: 333 (missing stats)
│ filter: (a, b, c) > (1, 2, 3)
│
└── • scan
      columns: (a, b, c)
      estimated row count: 333 (missing stats)
      table: abc@abc_a_b_c_idx
      spans: /1-

statement ok
DROP TABLE abc

statement ok
CREATE TABLE kv (k INT PRIMARY KEY, v INT)

# Regression test for #27398.
# Check that tuple type includes labels.
query T
EXPLAIN (VERBOSE, TYPES) SELECT x FROM (SELECT (row(v,v,v) AS a,b,c) AS x FROM kv)
----
distribution: local
vectorized: true
·
• render
│ columns: (x tuple{int AS a, int AS b, int AS c})
│ render x: ((((v)[int], (v)[int], (v)[int]) AS a, b, c))[tuple{int AS a, int AS b, int AS c}]
│
└── • scan
      columns: (v int)
      estimated row count: 1,000 (missing stats)
      table: kv@kv_pkey
      spans: FULL SCAN

query T
EXPLAIN (VERBOSE, TYPES) SELECT (x).a, (x).b, (x).c FROM (SELECT (row(v,v,v) AS a,b,c) AS x FROM kv)
----
distribution: local
vectorized: true
·
• render
│ columns: (a int, b int, c int)
│ render a: (((x)[tuple{int AS a, int AS b, int AS c}]).a)[int]
│ render b: (((x)[tuple{int AS a, int AS b, int AS c}]).b)[int]
│ render c: (((x)[tuple{int AS a, int AS b, int AS c}]).c)[int]
│
└── • render
    │ columns: (x tuple{int AS a, int AS b, int AS c})
    │ render x: ((((v)[int], (v)[int], (v)[int]) AS a, b, c))[tuple{int AS a, int AS b, int AS c}]
    │
    └── • scan
          columns: (v int)
          estimated row count: 1,000 (missing stats)
          table: kv@kv_pkey
          spans: FULL SCAN

query T
EXPLAIN (VERBOSE, TYPES) SELECT (x).e, (x).f, (x).g
FROM (
  SELECT ((1,'2',true) AS e,f,g) AS x
)
----
distribution: local
vectorized: true
·
• values
  columns: (e int, f string, g bool)
  size: 3 columns, 1 row
  row 0, expr 0: (1)[int]
  row 0, expr 1: ('2')[string]
  row 0, expr 2: (true)[bool]
