123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650 |
- # Copyright 2015 - 2019 The Cockroach Authors. All rights reserved.
- # Copyright Materialize, Inc. and contributors. All rights reserved.
- #
- # Use of this software is governed by the Business Source License
- # included in the LICENSE file at the root of this repository.
- #
- # As of the Change Date specified in that file, in accordance with
- # the Business Source License, use of this software will be governed
- # by the Apache License, Version 2.0.
- #
- # This file is derived from the logic test suite in CockroachDB. The
- # original file was retrieved on June 10, 2019 from:
- #
- # https://github.com/cockroachdb/cockroach/blob/d2f7fbf5dd1fc1a099bbad790a2e1f7c60a66cc3/pkg/sql/logictest/testdata/logic_test/select
- #
- # The original source code is subject to the terms of the Apache
- # 2.0 license, a copy of which can be found in the LICENSE file at the
- # root of this repository.
- mode cockroach
- simple conn=mz_system,user=mz_system
- ALTER SYSTEM SET unsafe_enable_table_keys = true
- ----
- COMPLETE 0
- # 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 AS z, * FROM abc
- ----
- z a b c
- NULL 1 2 3
- # synonym for SELECT * FROM abc
- query III
- TABLE abc
- ----
- 1 2 3
- query error syntax error at or near "*"
- 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
- # Contradiction
- query III
- SELECT * FROM abc WHERE a > 5 AND a < 5
- ----
- # Contradiction with remainder filter
- query III
- SELECT * FROM abc WHERE a > 5 AND a < 5 AND b>=100
- ----
- 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
- # Regression tests for database-issues#7241
- query TT
- SELECT test.kv.* FROM kv
- ----
- a NULL
- query TT
- SELECT test.public.kv.* FROM kv
- ----
- a NULL
- query TT
- SELECT test.public.kv.* FROM test.kv
- ----
- a NULL
- query TT
- SELECT test.kv.* FROM test.public.kv
- ----
- a NULL
- query error no data source matches pattern: foo.\*
- SELECT foo.* FROM kv
- query error cannot use "\*" without a FROM clause
- SELECT *
- query error "kv.*" cannot be aliased
- SELECT kv.* AS foo FROM kv
- query error no data source matches pattern: bar.kv.\*
- SELECT bar.kv.* FROM kv
- # Don't panic with invalid names (materialize#8024)
- query error cannot subscript type tuple\{char AS k, char AS v\} because it is not an array
- 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 pq: column "x" does not exist
- SELECT * FROM xyzw LIMIT x
- query error pq: column "y" does not exist
- SELECT * FROM xyzw OFFSET 1 + y
- query error argument of LIMIT must be type int, not type decimal
- SELECT * FROM xyzw LIMIT 3.3
- query IIII
- SELECT * FROM xyzw ORDER BY 1 LIMIT '1'
- ----
- 1 2 3 4
- 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 error numeric constant out of int64 range
- SELECT * FROM xyzw LIMIT 9223372036854775808
- query error numeric constant out of int64 range
- SELECT * FROM xyzw OFFSET 9223372036854775808
- query IIII
- SELECT * FROM xyzw ORDER BY x OFFSET 1 + 0.0
- ----
- 4 5 6 7
- query T rowsort
- 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 pgcode 42601 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 pgcode 42P01 relation "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
- # Regression tests for materialize#22670.
- query B
- SELECT 1 IN (1, 2)
- ----
- true
- query B
- SELECT NULL IN (1, 2)
- ----
- NULL
- query B
- SELECT 1 IN (1, NULL)
- ----
- true
- query B
- SELECT 1 IN (NULL, 2)
- ----
- NULL
- query B
- SELECT (1, NULL) IN ((1, 1))
- ----
- NULL
- query B
- SELECT (2, NULL) IN ((1, 1))
- ----
- false
- query B
- SELECT (1, 1) IN ((1, NULL))
- ----
- NULL
- query B
- SELECT (1, 1) IN ((2, NULL))
- ----
- false
- # Tests with a tuple coming from a subquery.
- query B
- SELECT NULL::int IN (SELECT * FROM (VALUES (1)) AS t(a))
- ----
- NULL
- query B
- SELECT (1, NULL::int) IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- NULL
- query B
- SELECT (2, NULL::int) IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- false
- query B
- SELECT (NULL::int, 1) IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- NULL
- query B
- SELECT (NULL::int, 2) IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- false
- query B
- SELECT (NULL::int, NULL::int) IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- NULL
- query B
- SELECT NULL::int NOT IN (SELECT * FROM (VALUES (1)) AS t(a))
- ----
- NULL
- query B
- SELECT (1, NULL::int) NOT IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- NULL
- query B
- SELECT (2, NULL::int) NOT IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- true
- query B
- SELECT (NULL::int, 1) NOT IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- NULL
- query B
- SELECT (NULL::int, 2) NOT IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- true
- query B
- SELECT (NULL::int, NULL::int) NOT IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b))
- ----
- NULL
- # Tests with an empty IN tuple.
- query B
- SELECT NULL::int IN (SELECT * FROM (VALUES (1)) AS t(a) WHERE a > 1)
- ----
- false
- query B
- SELECT (1, NULL::int) IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b) WHERE a > 1)
- ----
- false
- query B
- SELECT (NULL::int, 1) IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b) WHERE a > 1)
- ----
- false
- query B
- SELECT (NULL::int, NULL::int) IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b) WHERE a > 1)
- ----
- false
- query B
- SELECT NULL::int NOT IN (SELECT * FROM (VALUES (1)) AS t(a) WHERE a > 1)
- ----
- true
- query B
- SELECT (1, NULL::int) NOT IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b) WHERE a > 1)
- ----
- true
- query B
- SELECT (NULL::int, 1) NOT IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b) WHERE a > 1)
- ----
- true
- query B
- SELECT (NULL::int, NULL::int) NOT IN (SELECT * FROM (VALUES (1, 1)) AS t(a, b) WHERE a > 1)
- ----
- true
- statement ok
- CREATE TABLE a (x INT PRIMARY KEY, y INT)
- statement ok
- INSERT INTO a VALUES (1, 10), (2, 20), (3, 30)
- query II rowsort
- SELECT * FROM a WHERE x > 1
- ----
- 2 20
- 3 30
- query II rowsort
- SELECT * FROM a WHERE y > 1
- ----
- 1 10
- 2 20
- 3 30
- query II
- SELECT * FROM a WHERE x > 1 AND x < 3
- ----
- 2 20
- query II
- SELECT * FROM a WHERE x > 1 AND y < 30
- ----
- 2 20
- query I rowsort
- SELECT x + 1 FROM a
- ----
- 2
- 3
- 4
- query IIIII rowsort
- SELECT x, x + 1, y, y + 1, x + y FROM a
- ----
- 1 2 10 11 11
- 2 3 20 21 22
- 3 4 30 31 33
- query I rowsort
- SELECT u + v FROM (SELECT x + 3, y + 10 FROM a) AS foo(u, v)
- ----
- 24
- 35
- 46
- query IIII rowsort
- SELECT x, x, y, x FROM a
- ----
- 1 1 10 1
- 2 2 20 2
- 3 3 30 3
- query II rowsort
- SELECT x + 1, x + y FROM a WHERE x + y > 20
- ----
- 3 22
- 4 33
- # ------------------------------------------------------------------------------
- # Test with a hidden column.
- # ------------------------------------------------------------------------------
- statement ok
- CREATE TABLE b (x INT, y INT);
- INSERT INTO b VALUES (1, 10), (2, 20), (3, 30)
- query II rowsort
- SELECT * FROM b
- ----
- 1 10
- 2 20
- 3 30
- query I rowsort
- SELECT x FROM b WHERE rowid > 0
- ----
- 1
- 2
- 3
- # ------------------------------------------------------------------------------
- # String inequality filter.
- # ------------------------------------------------------------------------------
- statement ok
- CREATE TABLE c (n INT PRIMARY KEY, str STRING, INDEX str(str DESC));
- INSERT INTO c SELECT i, to_english(i) FROM generate_series(1, 10) AS g(i)
- query IT rowsort
- SELECT * FROM c WHERE str >= 'moo'
- ----
- 1 one
- 2 two
- 3 three
- 6 six
- 7 seven
- 9 nine
- 10 one-zero
- # ------------------------------------------------------------------------------
- # "*" 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
- ----
|