# LogicTest: local local-opt local-parallel-stmts fakedist fakedist-opt fakedist-metadata

# NOTE: Keep this table at the beginning of the file to ensure that its numeric
#       reference is 53 (the numeric reference of the first table). If the
#       numbering scheme in cockroach changes, this test will break.
statement ok
CREATE TABLE t (a INT PRIMARY KEY, b INT)

statement ok
INSERT INTO t VALUES (1, 99), (2, 98), (3, 97)

statement ok
CREATE VIEW v1 AS SELECT a, b FROM t

statement error pgcode 42P07 relation \"v1\" already exists
CREATE VIEW v1 AS SELECT a, b FROM t

statement error pgcode 42P07 relation \"t\" already exists
CREATE VIEW t AS SELECT a, b FROM t

statement ok
CREATE VIEW v2 (x, y) AS SELECT a, b FROM t

statement error pgcode 42601 CREATE VIEW specifies 1 column name, but data source has 2 columns
CREATE VIEW v3 (x) AS SELECT a, b FROM t

statement error pgcode 42601 CREATE VIEW specifies 3 column names, but data source has 2 columns
CREATE VIEW v4 (x, y, z) AS SELECT a, b FROM t

statement error pgcode 42P01 relation "dne" does not exist
CREATE VIEW v5 AS SELECT a, b FROM dne

statement ok
CREATE VIEW v6 (x, y) AS SELECT a, b FROM v1

statement ok
CREATE VIEW v7 (x, y) AS SELECT a, b FROM v1 ORDER BY a DESC LIMIT 2

query II colnames,rowsort
SELECT * FROM v1
----
a b
1 99
2 98
3 97

query II colnames,rowsort
SELECT * FROM v2
----
x y
1 99
2 98
3 97

query II colnames,rowsort
SELECT * FROM v6
----
x y
1 99
2 98
3 97

query II colnames
SELECT * FROM v7
----
x y
3 97
2 98

query II colnames
SELECT * FROM v7 ORDER BY x LIMIT 1
----
x y
2 98

query II
SELECT * FROM v2 ORDER BY x DESC LIMIT 1
----
3 97

query I rowsort
SELECT x FROM v2
----
1
2
3

query I rowsort
SELECT y FROM v2
----
99
98
97

query I
SELECT x FROM v7
----
3
2

query I
SELECT x FROM v7 ORDER BY x LIMIT 1
----
2

query I
SELECT y FROM v7
----
97
98

query I
SELECT y FROM v7 ORDER BY x LIMIT 1
----
98

query IIII rowsort
SELECT * FROM v1 AS v1 INNER JOIN v2 AS v2 ON v1.a = v2.x
----
1 99 1 99
2 98 2 98
3 97 3 97

statement ok
CREATE DATABASE test2

statement ok
SET DATABASE = test2

query II colnames,rowsort
SELECT * FROM test.v1
----
a b
1 99
2 98
3 97

query II colnames,rowsort
SELECT * FROM test.v2
----
x y
1 99
2 98
3 97

query II colnames,rowsort
SELECT * FROM test.v6
----
x y
1 99
2 98
3 97

query II colnames
SELECT * FROM test.v7
----
x y
3 97
2 98

query II colnames
SELECT * FROM test.v7 ORDER BY x LIMIT 1
----
x y
2 98

statement ok
CREATE VIEW v1 AS SELECT x, y FROM test.v2

statement ok
SET DATABASE = test

query II colnames,rowsort
SELECT * FROM test2.v1
----
x y
1 99
2 98
3 97

query TT
SHOW CREATE VIEW v1
----
v1  CREATE VIEW v1 (a, b) AS SELECT a, b FROM test.public.t

query TT
SHOW CREATE VIEW v2
----
v2  CREATE VIEW v2 (x, y) AS SELECT a, b FROM test.public.t

query TT
SHOW CREATE VIEW v6
----
v6  CREATE VIEW v6 (x, y) AS SELECT a, b FROM test.public.v1

query TT
SHOW CREATE VIEW v7
----
v7  CREATE VIEW v7 (x, y) AS SELECT a, b FROM test.public.v1 ORDER BY a DESC LIMIT 2

query TT
SHOW CREATE VIEW test2.v1
----
test2.public.v1  CREATE VIEW v1 (x, y) AS SELECT x, y FROM test.public.v2

statement ok
GRANT SELECT ON t TO testuser

user testuser

query II rowsort
SELECT * FROM t
----
1 99
2 98
3 97

query error user testuser does not have SELECT privilege on relation v1
SELECT * FROM v1

query error user testuser does not have SELECT privilege on relation v6
SELECT * FROM v6

query error user testuser has no privileges on relation v1
SHOW CREATE VIEW v1

user root

statement ok
REVOKE SELECT ON t FROM testuser

statement ok
GRANT SELECT ON v1 TO testuser

user testuser

query error user testuser does not have SELECT privilege on relation t
SELECT * FROM t

query II rowsort
SELECT * FROM v1
----
1 99
2 98
3 97

query error user testuser does not have SELECT privilege on relation v6
SELECT * FROM v6

query TT
SHOW CREATE VIEW v1
----
v1  CREATE VIEW v1 (a, b) AS SELECT a, b FROM test.public.t

user root

statement ok
REVOKE SELECT ON v1 FROM testuser

statement ok
GRANT SELECT ON v6 TO testuser

user testuser

query error user testuser does not have SELECT privilege on relation t
SELECT * FROM t

query error user testuser does not have SELECT privilege on relation v1
SELECT * FROM v1

query II rowsort
SELECT * FROM v6
----
1 99
2 98
3 97

user root

# Ensure that views work over tables identified by numeric reference.
statement ok
CREATE VIEW num_ref_view AS SELECT a, b FROM [53 AS t]

statement ok
GRANT SELECT ON num_ref_view TO testuser

user testuser

query II rowsort
SELECT * FROM num_ref_view
----
1 99
2 98
3 97

user root

statement ok
DROP VIEW num_ref_view

statement error pgcode 42809 "v1" is not a table
DROP TABLE v1

statement error pgcode 42809 "t" is not a view
DROP VIEW t

statement error cannot drop relation "v1" because view "v6" depends on it
DROP VIEW v1

statement error cannot drop relation "v2" because view "test2.public.v1" depends on it
DROP VIEW v2

statement ok
DROP VIEW test2.v1

statement ok
DROP VIEW v7

statement ok
DROP VIEW v6

statement ok
DROP VIEW v2

statement ok
DROP VIEW v1

statement error pgcode 42P01 relation "v1" does not exist
DROP VIEW v1

# Verify correct rejection of star expressions
# TODO(a-robinson): Support star expressions as soon as we can (#10028)

statement error views do not currently support \* expressions
create view s1 AS SELECT * FROM t

statement error views do not currently support \* expressions
create view s1 AS SELECT t.* FROM t

statement error views do not currently support \* expressions
create view s1 AS SELECT a FROM t ORDER BY t.*

statement error views do not currently support \* expressions
create view s1 AS SELECT count(1) FROM t GROUP BY t.*

statement error views do not currently support \* expressions
create view s1 AS SELECT alias.* FROM t AS alias

statement error views do not currently support \* expressions
create view s1 AS TABLE t

statement error views do not currently support \* expressions
create view s1 AS SELECT a FROM (SELECT * FROM t)

statement error views do not currently support \* expressions
create view s1 AS SELECT a FROM t WHERE NOT a IN (SELECT a FROM (SELECT * FROM t))

statement error views do not currently support \* expressions
create view s1 AS SELECT a FROM t GROUP BY a HAVING a IN (SELECT a FROM (SELECT * FROM t))

statement error views do not currently support \* expressions
create view s1 AS SELECT t1.*, t2.a FROM t AS t1 JOIN t AS t2 ON t1.a = t2.a

statement error views do not currently support \* expressions
create view s1 AS SELECT t1.a, t2.* FROM t AS t1 JOIN t AS t2 ON t1.a = t2.a

statement error views do not currently support \* expressions
create view s1 AS SELECT t1.*, t2.* FROM t AS t1 JOIN t AS t2 ON t1.a = t2.a

statement error views do not currently support \* expressions
create view s1 AS SELECT * FROM t AS t1 JOIN t AS t2 ON t1.a = t2.a

statement error views do not currently support \* expressions
create view s1 AS SELECT t1.a, t2.a FROM (SELECT * FROM t) AS t1 JOIN t AS t2 ON t1.a = t2.a

statement error views do not currently support \* expressions
create view s1 AS SELECT t1.a, t2.a FROM t AS t1 JOIN (SELECT * FROM t) AS t2 ON t1.a = t2.a

statement error views do not currently support \* expressions
create view s1 AS SELECT t1.a, t2.a FROM t AS t1 JOIN t AS t2 ON t1.a IN (SELECT a FROM (SELECT * FROM t))

statement ok
create view s1 AS SELECT count(*) FROM t

statement ok
create view s2 AS SELECT a FROM t WHERE a IN (SELECT count(*) FROM t)

statement ok
create view s3 AS SELECT a, count(*) FROM t GROUP BY a

statement ok
create view s4 AS SELECT a, count(*) FROM t GROUP BY a HAVING a > (SELECT count(*) FROM t)

statement ok
DROP VIEW s4

statement ok
DROP VIEW s3

statement ok
DROP VIEW s2

statement ok
DROP VIEW s1

statement ok
DROP TABLE t

# Check for memory leak (#10466)
statement ok
CREATE VIEW foo AS SELECT catalog_name, schema_name, sql_path FROM information_schema.schemata

statement error pq: relation "foo" already exists
CREATE VIEW foo AS SELECT catalog_name, schema_name, sql_path FROM information_schema.schemata

# Ensure views work with dates/timestamps (#12420)
statement ok
CREATE TABLE t (d DATE, t TIMESTAMP)

statement ok
CREATE VIEW dt AS SELECT d, t FROM t WHERE d > DATE '1988-11-12' AND t < TIMESTAMP '2017-01-01'

statement ok
SELECT * FROM dt

statement ok
CREATE VIEW dt2 AS SELECT d, t FROM t WHERE d > d + INTERVAL '10h'

statement ok
SELECT * FROM dt2

# Ensure that creating a view doesn't leak any session-level settings that
# could affect subsequent AS OF SYSTEM TIME queries (#13547).
statement ok
CREATE VIEW v AS SELECT d, t FROM t

statement error pq: AS OF SYSTEM TIME must be provided on a top-level statement
CREATE TABLE t2 AS SELECT d, t FROM t AS OF SYSTEM TIME '2017-02-13 21:30:00'

statement ok
DROP TABLE t CASCADE

statement ok
CREATE TABLE t (a INT[])

statement ok
INSERT INTO t VALUES (array[1,2,3])

statement ok
CREATE VIEW b AS SELECT a[1] FROM t

query I
SELECT * FROM b
----
1

statement ok
DROP TABLE t CASCADE

statement ok
CREATE VIEW arr(a) AS SELECT ARRAY[3]

query TI
SELECT *, a[1] FROM arr
----
{3}  3

# Regression for #15951

statement ok
CREATE TABLE t15951 (a int, b int)

statement ok
CREATE VIEW Caps15951 AS SELECT a, b FROM t15951

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

query R
SELECT sum (Caps15951. a) FROM Caps15951 GROUP BY b ORDER BY b
----
1
3
6

query R
SELECT sum ("caps15951". a) FROM "caps15951" GROUP BY b ORDER BY b
----
1
3
6

statement ok
CREATE VIEW "QuotedCaps15951" AS SELECT a, b FROM t15951

query R
SELECT sum ("QuotedCaps15951". a) FROM "QuotedCaps15951" GROUP BY b ORDER BY b
----
1
3
6

# Regression tests for #23833

statement ok
CREATE VIEW w AS WITH a AS (SELECT 1 AS x) SELECT x FROM a

query T
SELECT create_statement FROM [SHOW CREATE w]
----
CREATE VIEW w (x) AS WITH a AS (SELECT 1 AS x) SELECT x FROM a

statement ok
CREATE VIEW w2 AS WITH t AS (SELECT x FROM w) SELECT x FROM t

query T
SELECT create_statement FROM [SHOW CREATE w2]
----
CREATE VIEW w2 (x) AS WITH t AS (SELECT x FROM test.public.w) SELECT x FROM t

statement ok
CREATE VIEW w3 AS (WITH t AS (SELECT x FROM w) SELECT x FROM t)

query T
SELECT create_statement FROM [SHOW CREATE w3]
----
CREATE VIEW w3 (x) AS (WITH t AS (SELECT x FROM test.public.w) SELECT x FROM t)

# Test CRUD privilege in view.

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

statement ok
CREATE VIEW crud_view AS SELECT a, b FROM [INSERT INTO t (a, b) VALUES (100, 100) RETURNING a, b]

statement ok
GRANT SELECT ON crud_view TO testuser

user testuser

query error user testuser does not have INSERT privilege on relation t
SELECT * FROM crud_view

user root
