Skip to content

Commit 49b57e3

Browse files
committed
sql: show create all schemas command
Release note (sql change): SHOW CREATE ALL SCHEMAS is a command that allows the user to get the statements to recreate the schemas of the current database. The command returns a flat log of the create statements for schemas.
1 parent d9eecf8 commit 49b57e3

File tree

30 files changed

+2020
-1671
lines changed

30 files changed

+2020
-1671
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
show_create_stmt ::=
22
'SHOW' 'CREATE' object_name
33
| 'SHOW' 'CREATE' 'ALL' 'TABLES'
4+
| 'SHOW' 'CREATE' 'ALL' 'SCHEMAS'

docs/generated/sql/bnf/stmt_block.bnf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,7 @@ show_constraints_stmt ::=
645645
show_create_stmt ::=
646646
'SHOW' 'CREATE' table_name
647647
| 'SHOW' 'CREATE' 'ALL' 'TABLES'
648+
| 'SHOW' 'CREATE' 'ALL' 'SCHEMAS'
648649

649650
show_csettings_stmt ::=
650651
'SHOW' 'CLUSTER' 'SETTING' var_name

docs/generated/sql/functions.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2515,6 +2515,9 @@ The swap_ordinate_string parameter is a 2-character string naming the ordinates
25152515
</span></td></tr>
25162516
<tr><td><a name="convert_to"></a><code>convert_to(str: <a href="string.html">string</a>, enc: <a href="string.html">string</a>) &rarr; <a href="bytes.html">bytes</a></code></td><td><span class="funcdesc"><p>Encode the string <code>str</code> as a byte array using encoding <code>enc</code>. Supports encodings ‘UTF8’ and ‘LATIN1’.</p>
25172517
</span></td></tr>
2518+
<tr><td><a name="crdb_internal.show_create_all_schemas"></a><code>crdb_internal.show_create_all_schemas(database_name: <a href="string.html">string</a>) &rarr; <a href="string.html">string</a></code></td><td><span class="funcdesc"><p>Returns rows of CREATE schema statements.
2519+
The output can be used to recreate a database.’</p>
2520+
</span></td></tr>
25182521
<tr><td><a name="crdb_internal.show_create_all_tables"></a><code>crdb_internal.show_create_all_tables(database_name: <a href="string.html">string</a>) &rarr; <a href="string.html">string</a></code></td><td><span class="funcdesc"><p>Returns rows of CREATE table statements followed by
25192522
ALTER table statements that add table constraints. The rows are ordered
25202523
by dependencies. All foreign keys are added after the creation of the table

pkg/ccl/logictestccl/testdata/logic_test/placement

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,3 @@ SELECT * FROM crdb_internal.validate_multi_region_zone_configs()
4141

4242
statement error a region-survivable database cannot also have a restricted placement policy
4343
ALTER DATABASE region_survivable_default PLACEMENT RESTRICTED
44-

pkg/cli/testdata/zip/partial1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ debug zip --concurrency=1 --cpu-profile-duration=0s /dev/null
2323
[cluster] retrieving SQL data for system.namespace... writing output: debug/system.namespace.txt... done
2424
[cluster] retrieving SQL data for system.scheduled_jobs... writing output: debug/system.scheduled_jobs.txt... done
2525
[cluster] retrieving SQL data for system.settings... writing output: debug/system.settings.txt... done
26+
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements... writing output: debug/crdb_internal.create_schema_statements.txt... done
2627
[cluster] retrieving SQL data for "".crdb_internal.create_statements... writing output: debug/crdb_internal.create_statements.txt... done
2728
[cluster] retrieving SQL data for "".crdb_internal.create_type_statements... writing output: debug/crdb_internal.create_type_statements.txt... done
2829
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness... writing output: debug/crdb_internal.kv_node_liveness.txt... done

pkg/cli/testdata/zip/partial1_excluded

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ debug zip /dev/null --concurrency=1 --exclude-nodes=2 --cpu-profile-duration=0
2323
[cluster] retrieving SQL data for system.namespace... writing output: debug/system.namespace.txt... done
2424
[cluster] retrieving SQL data for system.scheduled_jobs... writing output: debug/system.scheduled_jobs.txt... done
2525
[cluster] retrieving SQL data for system.settings... writing output: debug/system.settings.txt... done
26+
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements... writing output: debug/crdb_internal.create_schema_statements.txt... done
2627
[cluster] retrieving SQL data for "".crdb_internal.create_statements... writing output: debug/crdb_internal.create_statements.txt... done
2728
[cluster] retrieving SQL data for "".crdb_internal.create_type_statements... writing output: debug/crdb_internal.create_type_statements.txt... done
2829
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness... writing output: debug/crdb_internal.kv_node_liveness.txt... done

pkg/cli/testdata/zip/partial2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ debug zip --concurrency=1 --cpu-profile-duration=0 /dev/null
2323
[cluster] retrieving SQL data for system.namespace... writing output: debug/system.namespace.txt... done
2424
[cluster] retrieving SQL data for system.scheduled_jobs... writing output: debug/system.scheduled_jobs.txt... done
2525
[cluster] retrieving SQL data for system.settings... writing output: debug/system.settings.txt... done
26+
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements... writing output: debug/crdb_internal.create_schema_statements.txt... done
2627
[cluster] retrieving SQL data for "".crdb_internal.create_statements... writing output: debug/crdb_internal.create_statements.txt... done
2728
[cluster] retrieving SQL data for "".crdb_internal.create_type_statements... writing output: debug/crdb_internal.create_type_statements.txt... done
2829
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness... writing output: debug/crdb_internal.kv_node_liveness.txt... done

pkg/cli/testdata/zip/testzip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ debug zip --concurrency=1 --cpu-profile-duration=1s /dev/null
2323
[cluster] retrieving SQL data for system.namespace... writing output: debug/system.namespace.txt... done
2424
[cluster] retrieving SQL data for system.scheduled_jobs... writing output: debug/system.scheduled_jobs.txt... done
2525
[cluster] retrieving SQL data for system.settings... writing output: debug/system.settings.txt... done
26+
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements... writing output: debug/crdb_internal.create_schema_statements.txt... done
2627
[cluster] retrieving SQL data for "".crdb_internal.create_statements... writing output: debug/crdb_internal.create_statements.txt... done
2728
[cluster] retrieving SQL data for "".crdb_internal.create_type_statements... writing output: debug/crdb_internal.create_type_statements.txt... done
2829
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness... writing output: debug/crdb_internal.kv_node_liveness.txt... done

pkg/cli/testdata/zip/testzip_concurrent

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ zip
4040
[cluster] requesting nodes: done
4141
[cluster] requesting nodes: received response...
4242
[cluster] requesting nodes: writing binary output: debug/nodes.json...
43+
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements...
44+
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements: done
45+
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements: writing output: debug/crdb_internal.create_schema_statements.txt...
4346
[cluster] retrieving SQL data for "".crdb_internal.create_statements...
4447
[cluster] retrieving SQL data for "".crdb_internal.create_statements: done
4548
[cluster] retrieving SQL data for "".crdb_internal.create_statements: writing output: debug/crdb_internal.create_statements.txt...

pkg/cli/zip_cluster_wide.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ var debugZipTablesPerCluster = []string{
9090

9191
// The synthetic SQL CREATE statements for all tables.
9292
// Note the "". to collect across all databases.
93+
`"".crdb_internal.create_schema_statements`,
9394
`"".crdb_internal.create_statements`,
9495
// Ditto, for CREATE TYPE.
9596
`"".crdb_internal.create_type_statements`,

pkg/sql/catalog/catconstants/constants.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ const (
9696
CrdbInternalClusterTransactionsTableID
9797
CrdbInternalClusterSessionsTableID
9898
CrdbInternalClusterSettingsTableID
99+
CrdbInternalCreateSchemaStmtsTableID
99100
CrdbInternalCreateStmtsTableID
100101
CrdbInternalCreateTypeStmtsTableID
101102
CrdbInternalDatabasesTableID

pkg/sql/crdb_internal.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ var crdbInternal = virtualSchema{
106106
catconstants.CrdbInternalClusterTransactionsTableID: crdbInternalClusterTxnsTable,
107107
catconstants.CrdbInternalClusterSessionsTableID: crdbInternalClusterSessionsTable,
108108
catconstants.CrdbInternalClusterSettingsTableID: crdbInternalClusterSettingsTable,
109+
catconstants.CrdbInternalCreateSchemaStmtsTableID: crdbInternalCreateSchemaStmtsTable,
109110
catconstants.CrdbInternalCreateStmtsTableID: crdbInternalCreateStmtsTable,
110111
catconstants.CrdbInternalCreateTypeStmtsTableID: crdbInternalCreateTypeStmtsTable,
111112
catconstants.CrdbInternalDatabasesTableID: crdbInternalDatabasesTable,
@@ -2279,6 +2280,43 @@ CREATE TABLE crdb_internal.create_type_statements (
22792280
},
22802281
}
22812282

2283+
var crdbInternalCreateSchemaStmtsTable = virtualSchemaTable{
2284+
comment: "CREATE statements for all user defined schemas accessible by the current user in current database (KV scan)",
2285+
schema: `
2286+
CREATE TABLE crdb_internal.create_schema_statements (
2287+
database_id INT,
2288+
database_name STRING,
2289+
schema_name STRING,
2290+
descriptor_id INT,
2291+
create_statement STRING
2292+
)
2293+
`,
2294+
populate: func(ctx context.Context, p *planner, db catalog.DatabaseDescriptor, addRow func(...tree.Datum) error) error {
2295+
return forEachSchema(ctx, p, db, func(schemaDesc catalog.SchemaDescriptor) error {
2296+
switch schemaDesc.SchemaKind() {
2297+
case catalog.SchemaUserDefined:
2298+
node := &tree.CreateSchema{
2299+
Schema: tree.ObjectNamePrefix{
2300+
SchemaName: tree.Name(schemaDesc.GetName()),
2301+
ExplicitSchema: true,
2302+
},
2303+
}
2304+
if err := addRow(
2305+
tree.NewDInt(tree.DInt(db.GetID())), // database_id
2306+
tree.NewDString(db.GetName()), // database_name
2307+
tree.NewDString(schemaDesc.GetName()), // schema_name
2308+
tree.NewDInt(tree.DInt(schemaDesc.GetID())), // descriptor_id (schema_id)
2309+
tree.NewDString(tree.AsString(node)), // create_statement
2310+
); err != nil {
2311+
return err
2312+
}
2313+
2314+
}
2315+
return nil
2316+
})
2317+
},
2318+
}
2319+
22822320
// Prepare the row populate function.
22832321
var typeView = tree.NewDString("view")
22842322
var typeTable = tree.NewDString("table")

pkg/sql/delegate/delegate.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ func TryDelegate(
5555
case *tree.ShowCreateAllTables:
5656
return d.delegateShowCreateAllTables()
5757

58+
case *tree.ShowCreateAllSchemas:
59+
return d.delegateShowCreateAllSchemas()
60+
5861
case *tree.ShowDatabaseIndexes:
5962
return d.delegateShowDatabaseIndexes(t)
6063

pkg/sql/delegate/show_schemas.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/cockroachdb/cockroach/pkg/sql/lexbase"
1717
"github.com/cockroachdb/cockroach/pkg/sql/opt/cat"
1818
"github.com/cockroachdb/cockroach/pkg/sql/sem/tree"
19+
"github.com/cockroachdb/cockroach/pkg/sql/sqltelemetry"
1920
)
2021

2122
// delegateShowSchemas implements SHOW SCHEMAS which returns all the schemas in
@@ -40,6 +41,21 @@ func (d *delegator) delegateShowSchemas(n *tree.ShowSchemas) (tree.Statement, er
4041
return parse(getSchemasQuery)
4142
}
4243

44+
func (d *delegator) delegateShowCreateAllSchemas() (tree.Statement, error) {
45+
sqltelemetry.IncrementShowCounter(sqltelemetry.Create)
46+
47+
const showCreateAllSchemasQuery = `
48+
SELECT crdb_internal.show_create_all_schemas(%[1]s) AS create_statement;
49+
`
50+
databaseLiteral := d.evalCtx.SessionData().Database
51+
52+
query := fmt.Sprintf(showCreateAllSchemasQuery,
53+
lexbase.EscapeSQLString(databaseLiteral),
54+
)
55+
56+
return parse(query)
57+
}
58+
4359
// getSpecifiedOrCurrentDatabase returns the name of the specified database, or
4460
// of the current database if the specified name is empty.
4561
//

pkg/sql/logictest/testdata/logic_test/crdb_internal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ crdb_internal cluster_queries table NULL NULL NULL
2828
crdb_internal cluster_sessions table NULL NULL NULL
2929
crdb_internal cluster_settings table NULL NULL NULL
3030
crdb_internal cluster_transactions table NULL NULL NULL
31+
crdb_internal create_schema_statements table NULL NULL NULL
3132
crdb_internal create_statements table NULL NULL NULL
3233
crdb_internal create_type_statements table NULL NULL NULL
3334
crdb_internal cross_db_references table NULL NULL NULL

pkg/sql/logictest/testdata/logic_test/crdb_internal_tenant

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ crdb_internal cluster_queries table NULL NULL NULL
4545
crdb_internal cluster_sessions table NULL NULL NULL
4646
crdb_internal cluster_settings table NULL NULL NULL
4747
crdb_internal cluster_transactions table NULL NULL NULL
48+
crdb_internal create_schema_statements table NULL NULL NULL
4849
crdb_internal create_statements table NULL NULL NULL
4950
crdb_internal create_type_statements table NULL NULL NULL
5051
crdb_internal cross_db_references table NULL NULL NULL

pkg/sql/logictest/testdata/logic_test/create_statements

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,19 @@ CREATE TABLE crdb_internal.cluster_transactions (
232232
num_retries INT8 NULL,
233233
num_auto_retries INT8 NULL
234234
) {} {}
235+
CREATE TABLE crdb_internal.create_schema_statements (
236+
database_id INT8 NULL,
237+
database_name STRING NULL,
238+
schema_name STRING NULL,
239+
descriptor_id INT8 NULL,
240+
create_statement STRING NULL
241+
) CREATE TABLE crdb_internal.create_schema_statements (
242+
database_id INT8 NULL,
243+
database_name STRING NULL,
244+
schema_name STRING NULL,
245+
descriptor_id INT8 NULL,
246+
create_statement STRING NULL
247+
) {} {}
235248
CREATE TABLE crdb_internal.create_statements (
236249
database_id INT8 NULL,
237250
database_name STRING NULL,

pkg/sql/logictest/testdata/logic_test/grant_table

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ test crdb_internal cluster_queries public
4040
test crdb_internal cluster_sessions public SELECT
4141
test crdb_internal cluster_settings public SELECT
4242
test crdb_internal cluster_transactions public SELECT
43+
test crdb_internal create_schema_statements public SELECT
4344
test crdb_internal create_statements public SELECT
4445
test crdb_internal create_type_statements public SELECT
4546
test crdb_internal cross_db_references public SELECT

pkg/sql/logictest/testdata/logic_test/information_schema

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ crdb_internal cluster_queries
410410
crdb_internal cluster_sessions
411411
crdb_internal cluster_settings
412412
crdb_internal cluster_transactions
413+
crdb_internal create_schema_statements
413414
crdb_internal create_statements
414415
crdb_internal create_type_statements
415416
crdb_internal cross_db_references
@@ -726,6 +727,7 @@ cluster_queries
726727
cluster_sessions
727728
cluster_settings
728729
cluster_transactions
730+
create_schema_statements
729731
create_statements
730732
create_type_statements
731733
cross_db_references
@@ -1079,6 +1081,7 @@ system crdb_internal cluster_queries SYSTEM
10791081
system crdb_internal cluster_sessions SYSTEM VIEW NO 1
10801082
system crdb_internal cluster_settings SYSTEM VIEW NO 1
10811083
system crdb_internal cluster_transactions SYSTEM VIEW NO 1
1084+
system crdb_internal create_schema_statements SYSTEM VIEW NO 1
10821085
system crdb_internal create_statements SYSTEM VIEW NO 1
10831086
system crdb_internal create_type_statements SYSTEM VIEW NO 1
10841087
system crdb_internal cross_db_references SYSTEM VIEW NO 1
@@ -2647,6 +2650,7 @@ NULL public system crdb_internal cluster_queries
26472650
NULL public system crdb_internal cluster_sessions SELECT NULL YES
26482651
NULL public system crdb_internal cluster_settings SELECT NULL YES
26492652
NULL public system crdb_internal cluster_transactions SELECT NULL YES
2653+
NULL public system crdb_internal create_schema_statements SELECT NULL YES
26502654
NULL public system crdb_internal create_statements SELECT NULL YES
26512655
NULL public system crdb_internal create_type_statements SELECT NULL YES
26522656
NULL public system crdb_internal cross_db_references SELECT NULL YES
@@ -3252,6 +3256,7 @@ NULL public system crdb_internal cluster_queries
32523256
NULL public system crdb_internal cluster_sessions SELECT NULL YES
32533257
NULL public system crdb_internal cluster_settings SELECT NULL YES
32543258
NULL public system crdb_internal cluster_transactions SELECT NULL YES
3259+
NULL public system crdb_internal create_schema_statements SELECT NULL YES
32553260
NULL public system crdb_internal create_statements SELECT NULL YES
32563261
NULL public system crdb_internal create_type_statements SELECT NULL YES
32573262
NULL public system crdb_internal cross_db_references SELECT NULL YES

0 commit comments

Comments
 (0)