# LogicTest: default parallel-stmts distsql

query T
SHOW DATABASES
----
crdb_internal
information_schema
pg_catalog
system
test

query T
SHOW TABLES FROM system
----
descriptor
eventlog
jobs
lease
namespace
rangelog
settings
ui
users
zones

query ITTT
EXPLAIN (DEBUG) SELECT * FROM system.namespace
----
0  /namespace/primary/0/'system'/id     1    ROW
1  /namespace/primary/0/'test'/id       50   ROW
2  /namespace/primary/1/'descriptor'/id 3    ROW
3  /namespace/primary/1/'eventlog'/id   12   ROW
4  /namespace/primary/1/'jobs'/id       15   ROW
5  /namespace/primary/1/'lease'/id      11   ROW
6  /namespace/primary/1/'namespace'/id  2    ROW
7  /namespace/primary/1/'rangelog'/id   13   ROW
8  /namespace/primary/1/'settings'/id   6    ROW
9  /namespace/primary/1/'ui'/id         14   ROW
10 /namespace/primary/1/'users'/id      4    ROW
11 /namespace/primary/1/'zones'/id      5    ROW

query ITI rowsort
SELECT * FROM system.namespace
----
0 system     1
0 test       50
1 descriptor 3
1 eventlog   12
1 jobs       15
1 lease      11
1 namespace  2
1 rangelog   13
1 settings   6
1 ui         14
1 users      4
1 zones      5

query I rowsort
SELECT id FROM system.descriptor
----
1
2
3
4
5
6
11
12
13
14
15
50

# Verify we can read "protobuf" columns.
query I
SELECT length(descriptor) * (id - 1) FROM system.descriptor WHERE id = 1
----
0

# Verify format of system tables.
query TTBTT
SHOW COLUMNS FROM system.namespace
----
parentID  INT     false  NULL  {primary}
name      STRING  false  NULL  {primary}
id        INT     true   NULL  {}

query TTBTT
SHOW COLUMNS FROM system.descriptor
----
id         INT   false NULL {primary}
descriptor BYTES true  NULL {}

query TTBTT
SHOW COLUMNS FROM system.users
----
username        STRING  false  NULL  {primary}
hashedPassword  BYTES   true   NULL  {}

query TTBTT
SHOW COLUMNS FROM system.zones
----
id     INT   false NULL {primary}
config BYTES true  NULL {}

query TTBTT
SHOW COLUMNS FROM system.lease
----
descID      INT        false  NULL  {primary}
version     INT        false  NULL  {primary}
nodeID      INT        false  NULL  {primary}
expiration  TIMESTAMP  false  NULL  {primary}

query TTBTT
SHOW COLUMNS FROM system.eventlog
----
timestamp    TIMESTAMP  false  NULL       {primary}
eventType    STRING     false  NULL       {}
targetID     INT        false  NULL       {}
reportingID  INT        false  NULL       {}
info         STRING     true   NULL       {}
uniqueID     BYTES      false  uuid_v4()  {primary}

query TTBTT
SHOW COLUMNS FROM system.rangelog
----
timestamp     TIMESTAMP  false  NULL            {primary}
rangeID       INT        false  NULL            {}
storeID       INT        false  NULL            {}
eventType     STRING     false  NULL            {}
otherRangeID  INT        true   NULL            {}
info          STRING     true   NULL            {}
uniqueID      INT        false  unique_rowid()  {primary}

query TTBTT
SHOW COLUMNS FROM system.ui
----
key          STRING     false  NULL  {primary}
value        BYTES      true   NULL  {}
lastUpdated  TIMESTAMP  false  NULL  {}

query TTBTT
SHOW COLUMNS FROM system.jobs
----
id       INT        false  unique_rowid()  {primary,jobs_status_created_idx}
status   STRING     false  NULL            {jobs_status_created_idx}
created  TIMESTAMP  false  now()           {jobs_status_created_idx}
payload  BYTES      false  NULL            {}

query TTBTT
SHOW COLUMNS FROM system.settings
----
name         STRING     false  NULL   {primary}
value        STRING     false  NULL   {}
lastUpdated  TIMESTAMP  false  now()  {}
valueType    STRING     true   NULL   {}

# Verify default privileges on system tables.
query TTT
SHOW GRANTS ON DATABASE system
----
system  root  GRANT
system  root  SELECT

query TTT
SHOW GRANTS ON system.namespace
----
namespace  root  GRANT
namespace  root  SELECT

query TTT
SHOW GRANTS ON system.descriptor
----
descriptor  root  GRANT
descriptor  root  SELECT

query TTT
SHOW GRANTS ON system.users
----
users  root  DELETE
users  root  GRANT
users  root  INSERT
users  root  SELECT
users  root  UPDATE

query TTT
SHOW GRANTS ON system.zones
----
zones  root  DELETE
zones  root  GRANT
zones  root  INSERT
zones  root  SELECT
zones  root  UPDATE

query TTT
SHOW GRANTS ON system.lease
----
lease  root  DELETE
lease  root  GRANT
lease  root  INSERT
lease  root  SELECT
lease  root  UPDATE

query TTT
SHOW GRANTS ON system.eventlog
----
eventlog  root  DELETE
eventlog  root  GRANT
eventlog  root  INSERT
eventlog  root  SELECT
eventlog  root  UPDATE

query TTT
SHOW GRANTS ON system.rangelog
----
rangelog  root  DELETE
rangelog  root  GRANT
rangelog  root  INSERT
rangelog  root  SELECT
rangelog  root  UPDATE

query TTT
SHOW GRANTS ON system.ui
----
ui  root  DELETE
ui  root  GRANT
ui  root  INSERT
ui  root  SELECT
ui  root  UPDATE

query TTT
SHOW GRANTS ON system.jobs
----
jobs  root  DELETE
jobs  root  GRANT
jobs  root  INSERT
jobs  root  SELECT
jobs  root  UPDATE

query TTT
SHOW GRANTS ON system.settings
----
settings  root  DELETE
settings  root  GRANT
settings  root  INSERT
settings  root  SELECT
settings  root  UPDATE

statement error user root does not have DROP privilege on database system
ALTER DATABASE system RENAME TO not_system

statement error user root does not have DROP privilege on database system
DROP DATABASE system

# Non-root users can only have privileges that root has on system objects.
# root only has GRANT, SELECT on system database.
statement error user testuser must not have ALL privileges on this system object
GRANT ALL ON DATABASE system TO testuser

statement error user testuser must not have INSERT privileges on this system object
GRANT GRANT, SELECT, INSERT ON DATABASE system TO testuser

statement ok
GRANT GRANT, SELECT ON DATABASE system TO testuser

statement error user testuser must not have ALL privileges on this system object
GRANT ALL ON system.namespace TO testuser

statement error user testuser must not have INSERT privileges on this system object
GRANT GRANT, SELECT, INSERT ON system.namespace TO testuser

statement ok
GRANT GRANT, SELECT ON system.namespace TO testuser

statement ok
GRANT SELECT ON system.descriptor TO testuser

statement error user root must have exactly {GRANT, SELECT} privileges on this system object
GRANT ALL ON DATABASE system TO root

statement error user root must have exactly {GRANT, SELECT} privileges on this system object
GRANT DELETE, INSERT ON DATABASE system TO root

statement error user root must have exactly {GRANT, SELECT} privileges on this system object
GRANT ALL ON system.namespace TO root

statement error user root must have exactly {GRANT, SELECT} privileges on this system object
GRANT DELETE, INSERT ON system.descriptor TO root

statement error user root must have exactly {GRANT, SELECT} privileges on this system object
GRANT ALL ON system.descriptor TO root

statement error user root must have exactly {GRANT, SELECT} privileges on this system object
REVOKE GRANT ON DATABASE system FROM root

statement error user root must have exactly {GRANT, SELECT} privileges on this system object
REVOKE GRANT ON system.namespace FROM root

statement error user root does not have privileges
REVOKE ALL ON system.namespace FROM root

# Some tables (we test system.lease here) allow multiple privilege sets for
# backwards compatibility, but still enforce that no user has more privileges
# than root.
statement error user testuser must not have ALL privileges on this system object
GRANT ALL ON system.lease TO testuser

statement error user root must have exactly {GRANT, SELECT, INSERT, DELETE, UPDATE} or {ALL} privileges on this system object
GRANT CREATE on system.lease to root

statement ok
GRANT ALL ON system.lease TO root

statement ok
GRANT ALL ON system.lease TO testuser

query T
select name from system.settings
----
diagnostics.reporting.enabled

statement ok
INSERT INTO system.settings (name, value) VALUES ('somesetting', 'somevalue')

query TT
select name, value from system.settings order by name
----
diagnostics.reporting.enabled  true
somesetting   somevalue

user testuser

statement error user testuser does not have SELECT privilege on table settings
select name from system.settings
----

statement error user testuser does not have INSERT privilege on table settings
UPSERT INTO system.settings (name, value) VALUES ('somesetting', 'somevalueother')

user root
