Skip to content

Commit

Permalink
sql: Change SHOW DATABASES, ENUMS, SCHEMAS, TABLES to include owner
Browse files Browse the repository at this point in the history
Previously, the SHOW SQL statements listed above did not include owner
information. As a result, a user interested in the owner of each asset
would have to join with some external table (typically a pg_catalog)
table. This change makes ownership more obvious by including it
directly in the SHOW statements.

Release note (sql change): Added owner column to SHOW DATABASES, ENUMS, TABLES,
SCHEMAS
  • Loading branch information
ajstorm committed Nov 5, 2020
1 parent 4d04a5f commit 36d945b
Show file tree
Hide file tree
Showing 38 changed files with 799 additions and 766 deletions.
7 changes: 5 additions & 2 deletions pkg/ccl/backupccl/backup_test.go
Expand Up @@ -6337,7 +6337,9 @@ CREATE TYPE sc.typ AS ENUM ('hello');
// first place. Right now we just settle for having some error reported, even
// if it's not the ideal error.

sqlDB.CheckQueryResults(t, `SHOW DATABASES`, [][]string{{"data"}, {"defaultdb"}, {"postgres"}, {"system"}})
sqlDB.CheckQueryResults(t, `SHOW DATABASES`, [][]string{
{"data", security.RootUser}, {"defaultdb", security.RootUser},
{"postgres", security.RootUser}, {"system", security.NodeUser}})

sqlDB.ExpectErr(t, `database "d" is offline: restoring`, `USE d`)

Expand Down Expand Up @@ -6433,7 +6435,8 @@ CREATE TYPE sc.typ AS ENUM ('hello');
sqlDB.CheckQueryResults(t, `SHOW TABLES`, [][]string{})
sqlDB.CheckQueryResults(t, `SHOW TYPES`, [][]string{})
sqlDB.CheckQueryResults(t, `SHOW SCHEMAS`, [][]string{
{"crdb_internal"}, {"information_schema"}, {"pg_catalog"}, {"pg_extension"}, {"public"},
{"crdb_internal", "NULL"}, {"information_schema", "NULL"}, {"pg_catalog", "NULL"}, {"pg_extension", "NULL"},
{"public", security.AdminRole},
})

sqlDB.ExpectErr(t, `target database or schema does not exist`, `SHOW TABLES FROM newdb.sc`)
Expand Down
11 changes: 6 additions & 5 deletions pkg/ccl/backupccl/full_cluster_backup_restore_test.go
Expand Up @@ -19,6 +19,7 @@ import (
_ "github.com/cockroachdb/cockroach/pkg/ccl/partitionccl"
"github.com/cockroachdb/cockroach/pkg/jobs"
"github.com/cockroachdb/cockroach/pkg/jobs/jobspb"
"github.com/cockroachdb/cockroach/pkg/security"
"github.com/cockroachdb/cockroach/pkg/sql"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/systemschema"
"github.com/cockroachdb/cockroach/pkg/testutils/sqlutils"
Expand Down Expand Up @@ -140,11 +141,11 @@ CREATE TABLE data2.foo (a int);
sqlDBRestore.CheckQueryResults(t,
`SHOW DATABASES`,
[][]string{
{"data"},
{"data2"},
{"defaultdb"},
{"postgres"},
{"system"},
{"data", security.RootUser},
{"data2", security.RootUser},
{"defaultdb", security.RootUser},
{"postgres", security.RootUser},
{"system", security.NodeUser},
})
})

Expand Down
4 changes: 3 additions & 1 deletion pkg/ccl/importccl/exportcsv_test.go
Expand Up @@ -23,6 +23,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/config"
"github.com/cockroachdb/cockroach/pkg/config/zonepb"
"github.com/cockroachdb/cockroach/pkg/keys"
"github.com/cockroachdb/cockroach/pkg/security"
"github.com/cockroachdb/cockroach/pkg/testutils"
"github.com/cockroachdb/cockroach/pkg/testutils/serverutils"
"github.com/cockroachdb/cockroach/pkg/testutils/sqlutils"
Expand Down Expand Up @@ -346,7 +347,8 @@ func TestExportShow(t *testing.T) {
sqlDB.Exec(t, `EXPORT INTO CSV 'nodelocal://0/show' FROM SELECT * FROM [SHOW DATABASES] ORDER BY database_name`)
content := readFileByGlob(t, filepath.Join(dir, "show", "export*-n1.0.csv"))

if expected, got := "defaultdb\npostgres\nsystem\n", string(content); expected != got {
if expected, got := "defaultdb,"+security.RootUser+"\npostgres,"+security.RootUser+"\nsystem,"+
security.NodeUser+"\n", string(content); expected != got {
t.Fatalf("expected %q, got %q", expected, got)
}
}
Expand Down
32 changes: 16 additions & 16 deletions pkg/cli/cli_test.go
Expand Up @@ -487,18 +487,18 @@ func Example_demo() {
// 123
// 123
// demo startrek -e show databases
// database_name
// defaultdb
// postgres
// startrek
// system
// database_name owner
// defaultdb root
// postgres root
// startrek root
// system node
// demo startrek -e show databases --format=table
// database_name
// -----------------
// defaultdb
// postgres
// startrek
// system
// database_name | owner
// ----------------+--------
// defaultdb | root
// postgres | root
// startrek | root
// system | node
// (4 rows)
// demo -e CREATE USER test WITH PASSWORD 'testpass'
// CREATE ROLE
Expand Down Expand Up @@ -559,11 +559,11 @@ func Example_sql() {
// x y
// 42 69
// sql --execute=show databases
// database_name
// defaultdb
// postgres
// system
// t
// database_name owner
// defaultdb root
// postgres root
// system node
// t root
// sql -e select 1 as "1"; select 2 as "2"
// 1
// 1
Expand Down
4 changes: 3 additions & 1 deletion pkg/sql/crdb_internal.go
Expand Up @@ -223,14 +223,16 @@ var crdbInternalDatabasesTable = virtualSchemaTable{
schema: `
CREATE TABLE crdb_internal.databases (
id INT NOT NULL,
name STRING NOT NULL
name STRING NOT NULL,
owner NAME NOT NULL
)`,
populate: func(ctx context.Context, p *planner, _ *dbdesc.Immutable, addRow func(...tree.Datum) error) error {
return forEachDatabaseDesc(ctx, p, nil /* all databases */, true, /* requiresPrivileges */
func(db *dbdesc.Immutable) error {
return addRow(
tree.NewDInt(tree.DInt(db.GetID())), // id
tree.NewDString(db.GetName()), // name
tree.NewDName(getOwnerOfDesc(db)), // owner
)
})
},
Expand Down
2 changes: 1 addition & 1 deletion pkg/sql/delegate/show_databases.go
Expand Up @@ -19,7 +19,7 @@ import (

func (d *delegator) delegateShowDatabases(stmt *tree.ShowDatabases) (tree.Statement, error) {
query := `SELECT
name AS database_name
name AS database_name, owner
`

if stmt.WithComment {
Expand Down
10 changes: 6 additions & 4 deletions pkg/sql/delegate/show_enums.go
Expand Up @@ -15,24 +15,26 @@ import "github.com/cockroachdb/cockroach/pkg/sql/sem/tree"
func (d *delegator) delegateShowEnums() (tree.Statement, error) {
query := `
SELECT
schema, name, string_agg(label, '|') AS value
schema, name, string_agg(label, '|'), owner AS value
FROM
(
SELECT
nsp.nspname AS schema,
type.typname AS name,
enum.enumlabel AS label
enum.enumlabel AS label,
rl.rolname AS owner
FROM
pg_catalog.pg_enum AS enum
JOIN pg_catalog.pg_type AS type ON (type.oid = enum.enumtypid)
LEFT JOIN pg_catalog.pg_roles AS rl on (type.typowner = rl.oid)
JOIN pg_catalog.pg_namespace AS nsp ON (type.typnamespace = nsp.oid)
ORDER BY
(enumtypid, enumsortorder)
)
GROUP BY
(schema, name)
(schema, name, owner)
ORDER BY
(schema, name);
(schema, name, owner);
`
return parse(query)
}
6 changes: 4 additions & 2 deletions pkg/sql/delegate/show_schemas.go
Expand Up @@ -27,8 +27,10 @@ func (d *delegator) delegateShowSchemas(n *tree.ShowSchemas) (tree.Statement, er
return nil, err
}
getSchemasQuery := fmt.Sprintf(`
SELECT schema_name
FROM %[1]s.information_schema.schemata
SELECT nspname AS schema_name, rolname AS owner
FROM %[1]s.information_schema.schemata i
INNER JOIN pg_catalog.pg_namespace n ON (n.nspname = i.schema_name)
LEFT JOIN pg_catalog.pg_roles r ON (n.nspowner = r.oid)
WHERE catalog_name = %[2]s
ORDER BY schema_name`,
name.String(), // note: (tree.Name).String() != string(name)
Expand Down
2 changes: 2 additions & 0 deletions pkg/sql/delegate/show_tables.go
Expand Up @@ -52,9 +52,11 @@ SELECT ns.nspname AS schema_name,
WHEN pc.relkind = 'S' THEN 'sequence'
ELSE 'table'
END AS type,
rl.rolname AS owner,
s.estimated_row_count AS estimated_row_count
%[3]s
FROM %[1]s.pg_catalog.pg_class AS pc
LEFT JOIN %[1]s.pg_catalog.pg_roles AS rl on (pc.relowner = rl.oid)
JOIN %[1]s.pg_catalog.pg_namespace AS ns ON (ns.oid = pc.relnamespace)
LEFT
JOIN %[1]s.pg_catalog.pg_description AS pd ON (pc.oid = pd.objoid AND pd.objsubid = 0)
Expand Down
84 changes: 42 additions & 42 deletions pkg/sql/logictest/testdata/logic_test/crdb_internal
Expand Up @@ -11,50 +11,50 @@ CREATE TABLE crdb_internal.t (x INT)
query error database "crdb_internal" does not exist
DROP DATABASE crdb_internal

query TTTI
query TTTTI
SHOW TABLES FROM crdb_internal
----
crdb_internal backward_dependencies table NULL
crdb_internal builtin_functions table NULL
crdb_internal cluster_queries table NULL
crdb_internal cluster_sessions table NULL
crdb_internal cluster_settings table NULL
crdb_internal cluster_transactions table NULL
crdb_internal create_statements table NULL
crdb_internal create_type_statements table NULL
crdb_internal databases table NULL
crdb_internal feature_usage table NULL
crdb_internal forward_dependencies table NULL
crdb_internal gossip_alerts table NULL
crdb_internal gossip_liveness table NULL
crdb_internal gossip_network table NULL
crdb_internal gossip_nodes table NULL
crdb_internal index_columns table NULL
crdb_internal jobs table NULL
crdb_internal kv_node_status table NULL
crdb_internal kv_store_status table NULL
crdb_internal leases table NULL
crdb_internal node_build_info table NULL
crdb_internal node_metrics table NULL
crdb_internal node_queries table NULL
crdb_internal node_runtime_info table NULL
crdb_internal node_sessions table NULL
crdb_internal node_statement_statistics table NULL
crdb_internal node_transaction_statistics table NULL
crdb_internal node_transactions table NULL
crdb_internal node_txn_stats table NULL
crdb_internal partitions table NULL
crdb_internal predefined_comments table NULL
crdb_internal ranges view NULL
crdb_internal ranges_no_leases table NULL
crdb_internal schema_changes table NULL
crdb_internal session_trace table NULL
crdb_internal session_variables table NULL
crdb_internal table_columns table NULL
crdb_internal table_indexes table NULL
crdb_internal table_row_statistics table NULL
crdb_internal tables table NULL
crdb_internal zones table NULL
crdb_internal backward_dependencies table NULL NULL
crdb_internal builtin_functions table NULL NULL
crdb_internal cluster_queries table NULL NULL
crdb_internal cluster_sessions table NULL NULL
crdb_internal cluster_settings table NULL NULL
crdb_internal cluster_transactions table NULL NULL
crdb_internal create_statements table NULL NULL
crdb_internal create_type_statements table NULL NULL
crdb_internal databases table NULL NULL
crdb_internal feature_usage table NULL NULL
crdb_internal forward_dependencies table NULL NULL
crdb_internal gossip_alerts table NULL NULL
crdb_internal gossip_liveness table NULL NULL
crdb_internal gossip_network table NULL NULL
crdb_internal gossip_nodes table NULL NULL
crdb_internal index_columns table NULL NULL
crdb_internal jobs table NULL NULL
crdb_internal kv_node_status table NULL NULL
crdb_internal kv_store_status table NULL NULL
crdb_internal leases table NULL NULL
crdb_internal node_build_info table NULL NULL
crdb_internal node_metrics table NULL NULL
crdb_internal node_queries table NULL NULL
crdb_internal node_runtime_info table NULL NULL
crdb_internal node_sessions table NULL NULL
crdb_internal node_statement_statistics table NULL NULL
crdb_internal node_transaction_statistics table NULL NULL
crdb_internal node_transactions table NULL NULL
crdb_internal node_txn_stats table NULL NULL
crdb_internal partitions table NULL NULL
crdb_internal predefined_comments table NULL NULL
crdb_internal ranges view NULL NULL
crdb_internal ranges_no_leases table NULL NULL
crdb_internal schema_changes table NULL NULL
crdb_internal session_trace table NULL NULL
crdb_internal session_variables table NULL NULL
crdb_internal table_columns table NULL NULL
crdb_internal table_indexes table NULL NULL
crdb_internal table_row_statistics table NULL NULL
crdb_internal tables table NULL NULL
crdb_internal zones table NULL NULL

statement ok
CREATE DATABASE testdb; CREATE TABLE testdb.foo(x INT)
Expand Down
85 changes: 43 additions & 42 deletions pkg/sql/logictest/testdata/logic_test/crdb_internal_tenant
Expand Up @@ -20,50 +20,51 @@ CREATE TABLE crdb_internal.t (x INT)
query error database "crdb_internal" does not exist
DROP DATABASE crdb_internal

query TTTI
query TTTTI
SHOW TABLES FROM crdb_internal
----
crdb_internal backward_dependencies table NULL
crdb_internal builtin_functions table NULL
crdb_internal cluster_queries table NULL
crdb_internal cluster_sessions table NULL
crdb_internal cluster_settings table NULL
crdb_internal cluster_transactions table NULL
crdb_internal create_statements table NULL
crdb_internal create_type_statements table NULL
crdb_internal databases table NULL
crdb_internal feature_usage table NULL
crdb_internal forward_dependencies table NULL
crdb_internal gossip_alerts table NULL
crdb_internal gossip_liveness table NULL
crdb_internal gossip_network table NULL
crdb_internal gossip_nodes table NULL
crdb_internal index_columns table NULL
crdb_internal jobs table NULL
crdb_internal kv_node_status table NULL
crdb_internal kv_store_status table NULL
crdb_internal leases table NULL
crdb_internal node_build_info table NULL
crdb_internal node_metrics table NULL
crdb_internal node_queries table NULL
crdb_internal node_runtime_info table NULL
crdb_internal node_sessions table NULL
crdb_internal node_statement_statistics table NULL
crdb_internal node_transaction_statistics table NULL
crdb_internal node_transactions table NULL
crdb_internal node_txn_stats table NULL
crdb_internal partitions table NULL
crdb_internal predefined_comments table NULL
crdb_internal ranges view NULL
crdb_internal ranges_no_leases table NULL
crdb_internal schema_changes table NULL
crdb_internal session_trace table NULL
crdb_internal session_variables table NULL
crdb_internal table_columns table NULL
crdb_internal table_indexes table NULL
crdb_internal table_row_statistics table NULL
crdb_internal tables table NULL
crdb_internal zones table NULL
crdb_internal backward_dependencies table NULL NULL
crdb_internal builtin_functions table NULL NULL
crdb_internal cluster_queries table NULL NULL
crdb_internal cluster_sessions table NULL NULL
crdb_internal cluster_settings table NULL NULL
crdb_internal cluster_transactions table NULL NULL
crdb_internal create_statements table NULL NULL
crdb_internal create_type_statements table NULL NULL
crdb_internal databases table NULL NULL
crdb_internal feature_usage table NULL NULL
crdb_internal forward_dependencies table NULL NULL
crdb_internal gossip_alerts table NULL NULL
crdb_internal gossip_liveness table NULL NULL
crdb_internal gossip_network table NULL NULL
crdb_internal gossip_nodes table NULL NULL
crdb_internal index_columns table NULL NULL
crdb_internal jobs table NULL NULL
crdb_internal kv_node_status table NULL NULL
crdb_internal kv_store_status table NULL NULL
crdb_internal leases table NULL NULL
crdb_internal node_build_info table NULL NULL
crdb_internal node_metrics table NULL NULL
crdb_internal node_queries table NULL NULL
crdb_internal node_runtime_info table NULL NULL
crdb_internal node_sessions table NULL NULL
crdb_internal node_statement_statistics table NULL NULL
crdb_internal node_transaction_statistics table NULL NULL
crdb_internal node_transactions table NULL NULL
crdb_internal node_txn_stats table NULL NULL
crdb_internal partitions table NULL NULL
crdb_internal predefined_comments table NULL NULL
crdb_internal ranges view NULL NULL
crdb_internal ranges_no_leases table NULL NULL
crdb_internal schema_changes table NULL NULL
crdb_internal session_trace table NULL NULL
crdb_internal session_variables table NULL NULL
crdb_internal table_columns table NULL NULL
crdb_internal table_indexes table NULL NULL
crdb_internal table_row_statistics table NULL NULL
crdb_internal tables table NULL NULL
crdb_internal zones table NULL NULL


statement ok
CREATE DATABASE testdb; CREATE TABLE testdb.foo(x INT)
Expand Down

0 comments on commit 36d945b

Please sign in to comment.