# LogicTest: local local-vec

# Disable automatic stats.
statement ok
SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false

statement ok
CREATE TABLE a (a INT, b INT, PRIMARY KEY (a, b))

statement ok
INSERT INTO a SELECT g//2, g FROM generate_series(0,2000) g(g)

query I
SELECT count(*) FROM a
----
2001

query I
SELECT count(*) FROM (SELECT DISTINCT a FROM a)
----
1001

query II
SELECT * FROM a LIMIT 10
----
0  0
0  1
1  2
1  3
2  4
2  5
3  6
3  7
4  8
4  9

query II
SELECT DISTINCT(a), b FROM a LIMIT 10
----
0  0
0  1
1  2
1  3
2  4
2  5
3  6
3  7
4  8
4  9

# Simple filter.
query I
SELECT b FROM a WHERE b < 3
----
0
1
2

# Filter on the result of a projection.
query II
SELECT a, b FROM a WHERE a * 2 < b LIMIT 5
----
0  1
1  3
2  5
3  7
4  9

# Simple projection.
query I
SELECT b + 1 FROM a WHERE b < 3
----
1
2
3

# Multiple step projection.
query III
SELECT a, b, (a + 1) * (b + 2) FROM a WHERE a < 3
----
0  0  2
0  1  3
1  2  8
1  3  10
2  4  18
2  5  21

# Mismatched constant type in projection. Not handled yet but should fall back
# gracefully.
query I
SELECT (a + 1.0::DECIMAL)::INT FROM a LIMIT 1
----
1

# Operations with constants on the left work.
query I
SELECT 5 - a FROM a LIMIT 3
----
5
5
4

# Mismatched column types in projection. Not handled yet but should fall back
# gracefully.
statement ok
CREATE TABLE intdec (a INT, b DECIMAL)

statement ok
INSERT INTO intdec VALUES (1, 2.0)

query I
SELECT (a + b)::INT FROM intdec
----
3

# AND expressions.
query II
SELECT a, b FROM a WHERE a < 2 AND b > 0 AND a * b != 3
----
0  1
1  2

statement ok
CREATE TABLE b (a INT, b STRING, PRIMARY KEY (b,a))

statement ok
INSERT INTO b VALUES
  (0, 'a'),
  (1, 'a'),
  (0, 'b'),
  (1, 'b')

query IT
SELECT sum_int(a), b from b group by b
----
1 a
1 b

# Test that lookup joins run fine through columnar execution.

statement ok
CREATE TABLE c (a INT, b INT, c INT, d INT, PRIMARY KEY (a, c), INDEX sec (b))

statement ok
CREATE TABLE d (a INT, b INT, PRIMARY KEY (b, a))

statement ok
INSERT INTO c VALUES (1, 1, 1, 0), (2, 1, 2, 0)

statement ok
INSERT INTO d VALUES (1, 1), (1, 2)

statement ok
ALTER TABLE c INJECT STATISTICS '[
  {
    "columns": ["a"],
    "created_at": "2018-01-01 1:00:00.00000+00:00",
    "row_count": 1,
    "distinct_count": 1
  }
]'

statement ok
SET optimizer = on

# Ensure that a lookup join is used.
query I
SELECT count(*) FROM [EXPLAIN SELECT c.a FROM c JOIN d ON d.b = c.b] WHERE tree LIKE '%lookup-join%'
----
1

statement ok
SET experimental_vectorize = always

# Simple lookup join.
query I
SELECT c.a FROM c JOIN d ON d.b = c.b
----
1
2

# Index join.
query I
SELECT c.d FROM c@sec
----
0
0

# Lookup join on secondary index, requires an index join into the primary
# index. Both of these should be wrapped and work fine.
query I
SELECT c.d FROM c@sec JOIN d ON d.b = c.b
----
0
0

statement ok
RESET optimizer; RESET experimental_vectorize
