# LogicTest: default parallel-stmts distsql

# SELECT with no table.

query I
SELECT 1
----
1

query T
SELECT NULL
----
NULL

query II colnames
SELECT 1+1 AS two, 2+2 AS four
----
two four
2   4

# SELECT expression tests.

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

query error syntax error at or near "from"
SELECT FROM abc

query error could not parse 'hello' as type bool
SELECT * FROM abc WHERE 'hello'

statement ok
INSERT INTO abc VALUES (1, 2, 3)

query III colnames
SELECT * FROM abc
----
a b c
1 2 3

query TIII colnames
SELECT NULL, * FROM abc
----
NULL a b c
NULL 1 2 3


# synonym for SELECT * FROM abc
query III
TABLE abc
----
1 2 3

query error invalid table name
TABLE abc.*

query III colnames
SELECT * FROM abc WHERE NULL
----
a b c

query III colnames
SELECT * FROM abc WHERE a = NULL
----
a b c

query IIIIII colnames
SELECT *,* FROM abc
----
a b c a b c
1 2 3 1 2 3

query IIII colnames
SELECT a,a,a,a FROM abc
----
a a a a
1 1 1 1

query II colnames
SELECT a,c FROM abc
----
a c
1 3

query I colnames
SELECT a+b+c AS foo FROM abc
----
foo
6

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

query II
SELECT a,b FROM abc WHERE CASE WHEN a != 0 THEN b/a > 1.5 ELSE false END
----
1 2

# SELECT of NULL value.

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

statement ok
INSERT INTO kv (k) VALUES ('a')

query TT
SELECT * FROM kv
----
a NULL

query TT
SELECT k,v FROM kv
----
a NULL

query T
SELECT v||'foo' FROM kv
----
NULL

query T
SELECT LOWER(v) FROM kv
----
NULL

query T
SELECT k FROM kv
----
1 value hashing to 60b725f10c9c85c70d97880dfe8191b3

query TT
SELECT kv.K,KV.v FROM kv
----
a NULL

query TT
SELECT kv.* FROM kv
----
a NULL

query error source name "foo" not found in FROM clause
SELECT foo.* FROM kv

query error cannot use "\*" without a FROM clause
SELECT *

# "*" must expand to zero columns if there are zero columns to select.
statement ok
CREATE TABLE nocols(x INT); ALTER TABLE nocols DROP COLUMN x

query I
SELECT 1, * FROM nocols
----

query error "kv.*" cannot be aliased
SELECT kv.* AS foo FROM kv

query error table "bar.kv" not selected in FROM clause
SELECT bar.kv.* FROM kv

# Don't panic with invalid names (#8024)
query error cannot use "kv.\*" in this context
SELECT kv.*[1] FROM kv

query T colnames
SELECT FOO.k FROM kv AS foo WHERE foo.k = 'a'
----
k
a

query T
SELECT "Foo"."V" FROM kv AS foo WHERE foo.k = 'a'
----
NULL

statement ok
CREATE TABLE kw ("from" INT PRIMARY KEY)

statement ok
INSERT INTO kw VALUES (1)

query III colnames
SELECT *, "from", kw."from" FROM kw
----
from from from
1    1    1

# SELECT from index.

statement ok
CREATE TABLE xyzw (
  x INT PRIMARY KEY,
  y INT,
  z INT,
  w INT,
  INDEX foo (z, y)
)

statement ok
INSERT INTO xyzw VALUES (4, 5, 6, 7), (1, 2, 3, 4)

query error name \"x\" is not defined
SELECT * FROM xyzw LIMIT x

query error name \"y\" is not defined
SELECT * FROM xyzw OFFSET 1 + y

query error argument of LIMIT must be type int, not type string
SELECT * FROM xyzw LIMIT '1'

query error argument of OFFSET must be type int, not type decimal
SELECT * FROM xyzw OFFSET 1.5

query error negative value for LIMIT
SELECT * FROM xyzw LIMIT -100

query error negative value for OFFSET
SELECT * FROM xyzw OFFSET -100

query IIII
SELECT * FROM xyzw ORDER BY x OFFSET 1 + 0.0
----
4 5 6 7

query T
SELECT (x,y) FROM xyzw
----
(1,2)
(4,5)

query IIII
SELECT * FROM xyzw LIMIT 0
----

query IIII
SELECT * FROM xyzw ORDER BY x LIMIT 1
----
1 2 3 4

query IIII
SELECT * FROM xyzw ORDER BY x LIMIT 1 OFFSET 1
----
4 5 6 7

query IIII
SELECT * FROM xyzw ORDER BY y OFFSET 1
----
4 5 6 7

query IIII
SELECT * FROM xyzw ORDER BY y OFFSET 1 LIMIT 1
----
4 5 6 7

# Multiplying by zero so the result is deterministic.
query IIII
SELECT * FROM xyzw LIMIT (RANDOM() * 0.0)::int OFFSET (RANDOM() * 0.0)::int
----

query error multiple LIMIT clauses not allowed
((SELECT a FROM t LIMIT 1)) LIMIT 1

query IIII
SELECT * FROM (SELECT * FROM xyzw LIMIT 5) OFFSET 5
----

query II rowsort
SELECT z, y FROM xyzw@foo
----
3 2
6 5

query I
SELECT z FROM test.xyzw@foo WHERE y = 5
----
6

query I
SELECT xyzw.y FROM test.xyzw@foo WHERE z = 3
----
2

query error table "test.unknown" does not exist
SELECT z FROM test.unknown@foo WHERE y = 5

query error index "unknown" not found
SELECT z FROM test.xyzw@unknown WHERE y = 5

query I
SELECT w FROM test.xyzw@foo WHERE y = 5
----
7

statement ok
CREATE TABLE boolean_table (
  id INTEGER PRIMARY KEY NOT NULL,
  value BOOLEAN
)

statement ok
INSERT INTO boolean_table (id, value) VALUES (1, NULL)

query I
SELECT value FROM boolean_table
----
NULL

query I
SELECT CASE WHEN NULL THEN 1 ELSE 2 END
----
2

statement ok
INSERT INTO abc VALUES (42, NULL, NULL)

query III rowsort
SELECT 0 * b, b % 1, 0 % b from abc
----
0 0 0
0 0 0
NULL NULL NULL

# Doing an index lookup by MaxInt used to not work.
# https://github.com/cockroachdb/cockroach/issues/3587
statement ok
CREATE TABLE MaxIntTest (a INT PRIMARY KEY)

statement ok
INSERT INTO MaxIntTest VALUES (9223372036854775807)

query I
SELECT a FROM MaxIntTest WHERE a = 9223372036854775807
----
9223372036854775807

query error no value provided for placeholder
SELECT $1::int
