# LogicTest: default

statement ok
CREATE DATABASE a

statement ok
GRANT ALL ON DATABASE a TO readwrite

query TTT colnames
SHOW GRANTS ON DATABASE a
----
Database User      Privileges
a        readwrite ALL
a        root      ALL

statement error table "a.t" does not exist
SHOW GRANTS ON a.t

statement error table "test.t" does not exist
SHOW GRANTS ON t

statement ok
SET DATABASE = a

statement error table "a.t" does not exist
SHOW GRANTS ON t

statement error table "a.t" does not exist
GRANT ALL ON a.t TO readwrite

statement ok
CREATE TABLE t (id INT PRIMARY KEY)

query TTT colnames
SHOW GRANTS ON t
----
Table    User      Privileges
t        readwrite ALL
t        root      ALL

query TTT colnames
SHOW GRANTS ON a.t
----
Table    User      Privileges
t        readwrite ALL
t        root      ALL

statement ok
GRANT ALL ON t TO readwrite, "test-user"

query TTT
SHOW GRANTS ON t
----
t     readwrite ALL
t     root      ALL
t     test-user ALL

query TTT
SHOW GRANTS ON t FOR readwrite, "test-user"
----
t     readwrite ALL
t     test-user ALL

statement ok
REVOKE INSERT,DELETE ON t FROM "test-user",readwrite

query TTT
SHOW GRANTS ON t
----
 t  readwrite  CREATE
 t  readwrite  DROP
 t  readwrite  GRANT
 t  readwrite  SELECT
 t  readwrite  UPDATE
 t  root       ALL
 t  test-user  CREATE
 t  test-user  DROP
 t  test-user  GRANT
 t  test-user  SELECT
 t  test-user  UPDATE

query TTT
SHOW GRANTS ON t FOR readwrite, "test-user"
----
t  readwrite  CREATE
t  readwrite  DROP
t  readwrite  GRANT
t  readwrite  SELECT
t  readwrite  UPDATE
t  test-user  CREATE
t  test-user  DROP
t  test-user  GRANT
t  test-user  SELECT
t  test-user  UPDATE

statement ok
REVOKE SELECT ON t FROM "test-user"

query TTT
SHOW GRANTS ON t
----
t  readwrite  CREATE
t  readwrite  DROP
t  readwrite  GRANT
t  readwrite  SELECT
t  readwrite  UPDATE
t  root       ALL
t  test-user  CREATE
t  test-user  DROP
t  test-user  GRANT
t  test-user  UPDATE

query TTT
SHOW GRANTS ON t FOR readwrite, "test-user"
----
t  readwrite  CREATE
t  readwrite  DROP
t  readwrite  GRANT
t  readwrite  SELECT
t  readwrite  UPDATE
t  test-user  CREATE
t  test-user  DROP
t  test-user  GRANT
t  test-user  UPDATE

statement ok
REVOKE ALL ON t FROM readwrite,"test-user"

query TTT
SHOW GRANTS ON t
----
t     root      ALL

query TTT
SHOW GRANTS ON t FOR readwrite, "test-user"
----

# The same as above, but on a view

statement ok
CREATE VIEW v as SELECT id FROM t

query TTT colnames
SHOW GRANTS ON v
----
Table    User      Privileges
v        readwrite ALL
v        root      ALL

query TTT colnames
SHOW GRANTS ON a.v
----
Table    User      Privileges
v        readwrite ALL
v        root      ALL

statement ok
GRANT ALL ON v TO readwrite, "test-user"

query TTT
SHOW GRANTS ON v
----
v     readwrite ALL
v     root      ALL
v     test-user ALL

query TTT
SHOW GRANTS ON v FOR readwrite, "test-user"
----
v     readwrite ALL
v     test-user ALL

statement ok
REVOKE INSERT,DELETE ON v FROM "test-user",readwrite

query TTT
SHOW GRANTS ON v
----
v  readwrite  CREATE
v  readwrite  DROP
v  readwrite  GRANT
v  readwrite  SELECT
v  readwrite  UPDATE
v  root       ALL
v  test-user  CREATE
v  test-user  DROP
v  test-user  GRANT
v  test-user  SELECT
v  test-user  UPDATE

query TTT
SHOW GRANTS ON v FOR readwrite, "test-user"
----
v  readwrite  CREATE
v  readwrite  DROP
v  readwrite  GRANT
v  readwrite  SELECT
v  readwrite  UPDATE
v  test-user  CREATE
v  test-user  DROP
v  test-user  GRANT
v  test-user  SELECT
v  test-user  UPDATE

statement ok
REVOKE SELECT ON v FROM "test-user"

query TTT
SHOW GRANTS ON v
----
v  readwrite  CREATE
v  readwrite  DROP
v  readwrite  GRANT
v  readwrite  SELECT
v  readwrite  UPDATE
v  root       ALL
v  test-user  CREATE
v  test-user  DROP
v  test-user  GRANT
v  test-user  UPDATE

query TTT
SHOW GRANTS ON v FOR readwrite, "test-user"
----
v  readwrite  CREATE
v  readwrite  DROP
v  readwrite  GRANT
v  readwrite  SELECT
v  readwrite  UPDATE
v  test-user  CREATE
v  test-user  DROP
v  test-user  GRANT
v  test-user  UPDATE

statement ok
REVOKE ALL ON v FROM readwrite,"test-user"

query TTT
SHOW GRANTS ON v
----
v     root      ALL

query TTT
SHOW GRANTS ON v FOR readwrite, "test-user"
----

# Verify that the DB privileges have not changed.
query TTT colnames
SHOW GRANTS ON DATABASE a
----
Database User      Privileges
a        readwrite ALL
a        root      ALL


# Errors due to invalid targets.
statement ok
SET DATABASE = ""

statement error pq: syntax error at or near "@"
GRANT ALL ON a.t@xyz TO readwrite

statement error pq: no database specified: *
GRANT ALL ON * TO readwrite

statement error table "a.tt" does not exist
GRANT ALL ON a.t, a.tt TO readwrite

# '*' doesn't work for databases.
statement error pq: syntax error at or near "*"
GRANT ALL ON DATABASE * TO readwrite

statement ok
CREATE DATABASE b

statement ok
CREATE TABLE b.t (id INT PRIMARY KEY)

statement ok
CREATE TABLE b.t2 (id INT PRIMARY KEY)

statement ok
CREATE DATABASE c

statement ok
CREATE TABLE c.t (id INT PRIMARY KEY)

# `*` works after you've set a database
statement ok
SET DATABASE = "b"

statement ok
GRANT ALL ON * TO Vanilli

query TTT colnames
SHOW GRANTS ON *
----
Table  User     Privileges
t      root     ALL
t      vanilli  ALL
t2     root     ALL
t2     vanilli  ALL


# Multiple targets.

statement ok
GRANT ALL ON c.*, b.t TO Millie

query TTT colnames
SHOW GRANTS ON b.*
----
Table  User     Privileges
t      millie   ALL
t      root     ALL
t      vanilli  ALL
t2     root     ALL
t2     vanilli  ALL

query TTT colnames
SHOW GRANTS ON c.t
----
Table  User    Privileges
t      millie  ALL
t      root    ALL

statement ok
REVOKE ALL ON *, c.* FROM Vanilli

query TTT colnames
SHOW GRANTS ON b.*
----
Table  User    Privileges
t      millie  ALL
t      root    ALL
t2     root    ALL

statement ok
CREATE DATABASE empty

query TTT colnames
SHOW GRANTS ON empty.*
----
Table  User    Privileges

query TTT colnames
SHOW GRANTS ON empty.*, b.*
----
Table  User    Privileges
t      millie  ALL
t      root    ALL
t2     root    ALL
