Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sql: pg_proc and SHOW CREATE FUNCTION #85656

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
sql: add crdb_internal.create_function_statements virtual table
Release note (sql change): a new virtual table
crdb_internal.create_function_statements is added, so that
users can use to query create statements of user defined
functions, as well as parent db and schema ids.
  • Loading branch information
chengxiong-ruan committed Aug 8, 2022
commit 9a50c6befbbc452b57497536da70860451ce8411
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ crdb_internal cluster_settings table admin NULL NULL
crdb_internal cluster_statement_statistics table admin NULL NULL
crdb_internal cluster_transaction_statistics table admin NULL NULL
crdb_internal cluster_transactions table admin NULL NULL
crdb_internal create_function_statements table admin NULL NULL
crdb_internal create_schema_statements table admin NULL NULL
crdb_internal create_statements table admin NULL NULL
crdb_internal create_type_statements table admin NULL NULL
Expand Down
1 change: 1 addition & 0 deletions pkg/cli/testdata/zip/partial1
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ debug zip --concurrency=1 --cpu-profile-duration=0s /dev/null
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements... writing output: debug/crdb_internal.create_schema_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_statements... writing output: debug/crdb_internal.create_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_type_statements... writing output: debug/crdb_internal.create_type_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_function_statements... writing output: debug/crdb_internal.create_function_statements.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness... writing output: debug/crdb_internal.kv_node_liveness.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_node_status... writing output: debug/crdb_internal.kv_node_status.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_store_status... writing output: debug/crdb_internal.kv_store_status.txt... done
Expand Down
1 change: 1 addition & 0 deletions pkg/cli/testdata/zip/partial1_excluded
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ debug zip /dev/null --concurrency=1 --exclude-nodes=2 --cpu-profile-duration=0
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements... writing output: debug/crdb_internal.create_schema_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_statements... writing output: debug/crdb_internal.create_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_type_statements... writing output: debug/crdb_internal.create_type_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_function_statements... writing output: debug/crdb_internal.create_function_statements.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness... writing output: debug/crdb_internal.kv_node_liveness.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_node_status... writing output: debug/crdb_internal.kv_node_status.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_store_status... writing output: debug/crdb_internal.kv_store_status.txt... done
Expand Down
1 change: 1 addition & 0 deletions pkg/cli/testdata/zip/partial2
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ debug zip --concurrency=1 --cpu-profile-duration=0 /dev/null
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements... writing output: debug/crdb_internal.create_schema_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_statements... writing output: debug/crdb_internal.create_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_type_statements... writing output: debug/crdb_internal.create_type_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_function_statements... writing output: debug/crdb_internal.create_function_statements.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness... writing output: debug/crdb_internal.kv_node_liveness.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_node_status... writing output: debug/crdb_internal.kv_node_status.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_store_status... writing output: debug/crdb_internal.kv_store_status.txt... done
Expand Down
1 change: 1 addition & 0 deletions pkg/cli/testdata/zip/testzip
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ debug zip --concurrency=1 --cpu-profile-duration=1s /dev/null
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements... writing output: debug/crdb_internal.create_schema_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_statements... writing output: debug/crdb_internal.create_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_type_statements... writing output: debug/crdb_internal.create_type_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_function_statements... writing output: debug/crdb_internal.create_function_statements.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness... writing output: debug/crdb_internal.kv_node_liveness.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_node_status... writing output: debug/crdb_internal.kv_node_status.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_store_status... writing output: debug/crdb_internal.kv_store_status.txt... done
Expand Down
3 changes: 3 additions & 0 deletions pkg/cli/testdata/zip/testzip_concurrent
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ zip
[cluster] requesting tenant ranges: done
[cluster] requesting tenant ranges: last request failed: rpc error: ...
[cluster] requesting tenant ranges: received response...
[cluster] retrieving SQL data for "".crdb_internal.create_function_statements...
[cluster] retrieving SQL data for "".crdb_internal.create_function_statements: done
[cluster] retrieving SQL data for "".crdb_internal.create_function_statements: writing output: debug/crdb_internal.create_function_statements.txt...
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements...
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements: done
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements: writing output: debug/crdb_internal.create_schema_statements.txt...
Expand Down
1 change: 1 addition & 0 deletions pkg/cli/testdata/zip/testzip_tenant
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ debug zip --concurrency=1 --cpu-profile-duration=1s /dev/null
[cluster] retrieving SQL data for "".crdb_internal.create_schema_statements... writing output: debug/crdb_internal.create_schema_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_statements... writing output: debug/crdb_internal.create_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_type_statements... writing output: debug/crdb_internal.create_type_statements.txt... done
[cluster] retrieving SQL data for "".crdb_internal.create_function_statements... writing output: debug/crdb_internal.create_function_statements.txt... done
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness... writing output: debug/crdb_internal.kv_node_liveness.txt...
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness: last request failed: ERROR: unimplemented: operation is unsupported in multi-tenancy mode (SQLSTATE 0A000)
[cluster] retrieving SQL data for crdb_internal.kv_node_liveness: creating error output: debug/crdb_internal.kv_node_liveness.txt.err.txt... done
Expand Down
1 change: 1 addition & 0 deletions pkg/cli/zip_cluster_wide.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ var debugZipTablesPerCluster = []string{
`"".crdb_internal.create_statements`,
// Ditto, for CREATE TYPE.
`"".crdb_internal.create_type_statements`,
`"".crdb_internal.create_function_statements`,

"crdb_internal.kv_node_liveness",
"crdb_internal.kv_node_status",
Expand Down
4 changes: 4 additions & 0 deletions pkg/sql/catalog/descriptor.go
Original file line number Diff line number Diff line change
Expand Up @@ -878,6 +878,10 @@ type FunctionDescriptor interface {

// GetLanguage returns the language of this function.
GetLanguage() catpb.Function_Language

// ToCreateExpr converts a function descriptor back to a CREATE FUNCTION
// statement. This is mainly used for formatting, e.g. SHOW CREATE FUNCTION.
ToCreateExpr() (*tree.CreateFunction, error)
}

// FilterDescriptorState inspects the state of a given descriptor and returns an
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/catalog/funcdesc/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ go_library(
"//pkg/sql/catalog/catpb",
"//pkg/sql/catalog/catprivilege",
"//pkg/sql/catalog/descpb",
"//pkg/sql/parser",
"//pkg/sql/pgwire/pgcode",
"//pkg/sql/pgwire/pgerror",
"//pkg/sql/privilege",
Expand Down
81 changes: 81 additions & 0 deletions pkg/sql/catalog/funcdesc/func_desc.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/sql/catalog/catpb"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/catprivilege"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb"
"github.com/cockroachdb/cockroach/pkg/sql/parser"
"github.com/cockroachdb/cockroach/pkg/sql/privilege"
"github.com/cockroachdb/cockroach/pkg/sql/schemachanger/scpb"
"github.com/cockroachdb/cockroach/pkg/sql/sem/catid"
Expand Down Expand Up @@ -536,6 +537,86 @@ func (desc *immutable) calledOnNullInput() (bool, error) {
}
}

// ToCreateExpr implements the FunctionDescriptor interface.
func (desc *immutable) ToCreateExpr() (ret *tree.CreateFunction, err error) {
ret = &tree.CreateFunction{
FuncName: tree.MakeFunctionNameFromPrefix(tree.ObjectNamePrefix{}, tree.Name(desc.Name)),
ReturnType: tree.FuncReturnType{
Type: desc.ReturnType.Type,
IsSet: desc.ReturnType.ReturnSet,
},
}
ret.Args = make(tree.FuncArgs, len(desc.Args))
for i := range desc.Args {
ret.Args[i] = tree.FuncArg{
Name: tree.Name(desc.Args[i].Name),
Type: desc.Args[i].Type,
Class: toTreeNodeArgClass(desc.Args[i].Class),
}
if desc.Args[i].DefaultExpr != nil {
ret.Args[i].DefaultVal, err = parser.ParseExpr(*desc.Args[i].DefaultExpr)
if err != nil {
return nil, err
}
}
}
// We only store 5 function attributes at the moment. We may extend the
// pre-allocated capacity in the future.
ret.Options = make(tree.FunctionOptions, 0, 5)
ret.Options = append(ret.Options, desc.getCreateExprVolatility())
ret.Options = append(ret.Options, tree.FunctionLeakproof(desc.LeakProof))
ret.Options = append(ret.Options, desc.getCreateExprNullInputBehavior())
ret.Options = append(ret.Options, tree.FunctionBodyStr(desc.FunctionBody))
ret.Options = append(ret.Options, desc.getCreateExprLang())
return ret, nil
}

func (desc *immutable) getCreateExprLang() tree.FunctionLanguage {
switch desc.Lang {
case catpb.Function_SQL:
return tree.FunctionLangSQL
}
return 0
}

func (desc *immutable) getCreateExprVolatility() tree.FunctionVolatility {
switch desc.Volatility {
case catpb.Function_IMMUTABLE:
return tree.FunctionImmutable
case catpb.Function_STABLE:
return tree.FunctionStable
case catpb.Function_VOLATILE:
return tree.FunctionVolatile
}
return 0
}

func (desc *immutable) getCreateExprNullInputBehavior() tree.FunctionNullInputBehavior {
switch desc.NullInputBehavior {
case catpb.Function_CALLED_ON_NULL_INPUT:
return tree.FunctionCalledOnNullInput
case catpb.Function_RETURNS_NULL_ON_NULL_INPUT:
return tree.FunctionReturnsNullOnNullInput
case catpb.Function_STRICT:
return tree.FunctionStrict
}
return 0
}

func toTreeNodeArgClass(class catpb.Function_Arg_Class) tree.FuncArgClass {
switch class {
case catpb.Function_Arg_IN:
return tree.FunctionArgIn
case catpb.Function_Arg_OUT:
return tree.FunctionArgOut
case catpb.Function_Arg_IN_OUT:
return tree.FunctionArgInOut
case catpb.Function_Arg_VARIADIC:
return tree.FunctionArgVariadic
}
return 0
}

// UserDefinedFunctionOIDToID converts a UDF OID into a descriptor ID. OID of a
// UDF must be greater CockroachPredefinedOIDMax. The function returns an error
// if the given OID is less than or equal to CockroachPredefinedOIDMax.
Expand Down
1 change: 0 additions & 1 deletion pkg/sql/catalog/typedesc/type_desc.go
Original file line number Diff line number Diff line change
Expand Up @@ -796,7 +796,6 @@ func EnsureTypeIsHydrated(
return err
}
}
return nil
Copy link
Contributor Author

@chengxiong-ruan chengxiong-ruan Aug 5, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this was a bug that EnsureTypeIsHydrated didn't hydrate table implicit types which is actually a tuple. Let me know if this makes sense..

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if we make this change, let's also add a test that shows why it's needed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah yeah, good call, I'll add one for it.

}
if !t.UserDefined() || t.IsHydrated() {
return nil
Expand Down
57 changes: 57 additions & 0 deletions pkg/sql/crdb_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ var crdbInternal = virtualSchema{
catconstants.CrdbInternalClusterSessionsTableID: crdbInternalClusterSessionsTable,
catconstants.CrdbInternalClusterSettingsTableID: crdbInternalClusterSettingsTable,
catconstants.CrdbInternalClusterStmtStatsTableID: crdbInternalClusterStmtStatsTable,
catconstants.CrdbInternalCreateFunctionStmtsTableID: crdbInternalCreateFunctionStmtsTable,
catconstants.CrdbInternalCreateSchemaStmtsTableID: crdbInternalCreateSchemaStmtsTable,
catconstants.CrdbInternalCreateStmtsTableID: crdbInternalCreateStmtsTable,
catconstants.CrdbInternalCreateTypeStmtsTableID: crdbInternalCreateTypeStmtsTable,
Expand Down Expand Up @@ -2576,6 +2577,62 @@ CREATE TABLE crdb_internal.create_schema_statements (
},
}

var crdbInternalCreateFunctionStmtsTable = virtualSchemaTable{
comment: "CREATE statements for all user-defined functions",
schema: `
CREATE TABLE crdb_internal.create_function_statements (
database_id INT,
database_name STRING,
schema_id INT,
schema_name STRING,
function_id INT,
function_name STRING,
create_statement STRING
)
`,
populate: func(ctx context.Context, p *planner, db catalog.DatabaseDescriptor, addRow func(...tree.Datum) error) error {
return forEachSchema(ctx, p, db, func(sc catalog.SchemaDescriptor) error {
return sc.ForEachFunctionOverload(func(overload descpb.SchemaDescriptor_FunctionOverload) error {
fnDesc, err := p.Descriptors().GetImmutableFunctionByID(ctx, p.txn, overload.ID, tree.ObjectLookupFlags{})
if err != nil {
return err
}
treeNode, err := fnDesc.ToCreateExpr()
treeNode.FuncName.ObjectNamePrefix = tree.ObjectNamePrefix{
ExplicitSchema: true,
SchemaName: tree.Name(sc.GetName()),
}
if err != nil {
return err
}
for i := range treeNode.Options {
if body, ok := treeNode.Options[i].(tree.FunctionBodyStr); ok {
stmtStrs := strings.Split(string(body), "\n")
for i := range stmtStrs {
stmtStrs[i] = "\t" + stmtStrs[i]
}

p := &treeNode.Options[i]
// Add two new lines just for better formatting.
*p = "\n" + tree.FunctionBodyStr(strings.Join(stmtStrs, "\n")) + "\n"
}
}

return addRow(
tree.NewDInt(tree.DInt(db.GetID())), // database_id
tree.NewDString(db.GetName()), // database_name
tree.NewDInt(tree.DInt(sc.GetID())), // schema_id
tree.NewDString(sc.GetName()), // schema_name
tree.NewDInt(tree.DInt(fnDesc.GetID())), // function_id
tree.NewDString(fnDesc.GetName()), //function_name
tree.NewDString(tree.AsString(treeNode)), // create_statement
)
})
})
return nil
},
}

// Prepare the row populate function.
var typeView = tree.NewDString("view")
var typeTable = tree.NewDString("table")
Expand Down
24 changes: 21 additions & 3 deletions pkg/sql/function_resolver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,9 @@ CREATE FUNCTION f(a notmyworkday) RETURNS INT IMMUTABLE LANGUAGE SQL AS $$
SELECT a FROM v;
SELECT nextval('sq1');
$$;
CREATE FUNCTION f() RETURNS VOID IMMUTABLE LANGUAGE SQL AS $$ SELECT 1 $$;`)
CREATE FUNCTION f() RETURNS VOID IMMUTABLE LANGUAGE SQL AS $$ SELECT 1 $$;
CREATE FUNCTION f() RETURNS t IMMUTABLE LANGUAGE SQL AS $$ SELECT a, b, c FROM t $$;
`)

var sessionData sessiondatapb.SessionData
{
Expand All @@ -88,7 +90,7 @@ CREATE FUNCTION f() RETURNS VOID IMMUTABLE LANGUAGE SQL AS $$ SELECT 1 $$;`)
path := sessiondata.MakeSearchPath(searchPathArray)
funcDef, err := funcResolver.ResolveFunction(ctx, &fname, &path)
require.NoError(t, err)
require.Equal(t, 2, len(funcDef.Overloads))
require.Equal(t, 3, len(funcDef.Overloads))

// Verify Function Signature looks good
sort.Slice(funcDef.Overloads, func(i, j int) bool {
Expand All @@ -98,7 +100,7 @@ CREATE FUNCTION f() RETURNS VOID IMMUTABLE LANGUAGE SQL AS $$ SELECT 1 $$;`)
require.True(t, funcDef.Overloads[0].UDFContainsOnlySignature)
require.True(t, funcDef.Overloads[0].IsUDF)
require.Equal(t, 1, len(funcDef.Overloads[0].Types.Types()))
require.NotEqual(t, funcDef.Overloads[0].Types.Types()[0].TypeMeta, types.UserDefinedTypeMetadata{})
require.NotZero(t, funcDef.Overloads[0].Types.Types()[0].TypeMeta)
require.Equal(t, types.EnumFamily, funcDef.Overloads[0].Types.Types()[0].Family())
require.Equal(t, types.Int, funcDef.Overloads[0].ReturnType([]tree.TypedExpr{}))

Expand All @@ -108,6 +110,13 @@ CREATE FUNCTION f() RETURNS VOID IMMUTABLE LANGUAGE SQL AS $$ SELECT 1 $$;`)
require.Equal(t, 0, len(funcDef.Overloads[1].Types.Types()))
require.Equal(t, types.Void, funcDef.Overloads[1].ReturnType([]tree.TypedExpr{}))

require.Equal(t, 100112, int(funcDef.Overloads[2].Oid))
require.True(t, funcDef.Overloads[2].UDFContainsOnlySignature)
require.True(t, funcDef.Overloads[2].IsUDF)
require.Equal(t, 0, len(funcDef.Overloads[2].Types.Types()))
require.Equal(t, types.TupleFamily, funcDef.Overloads[2].ReturnType([]tree.TypedExpr{}).Family())
require.NotZero(t, funcDef.Overloads[2].ReturnType([]tree.TypedExpr{}).TypeMeta)

overload, err := funcResolver.ResolveFunctionByOID(ctx, funcDef.Overloads[0].Oid)
require.NoError(t, err)
require.Equal(t, `SELECT a FROM defaultdb.public.t;
Expand All @@ -130,6 +139,15 @@ SELECT nextval(105:::REGCLASS);`, overload.Body)
require.Equal(t, 0, len(overload.Types.Types()))
require.Equal(t, types.Void, overload.ReturnType([]tree.TypedExpr{}))

overload, err = funcResolver.ResolveFunctionByOID(ctx, funcDef.Overloads[2].Oid)
require.NoError(t, err)
require.Equal(t, `SELECT a, b, c FROM defaultdb.public.t;`, overload.Body)
require.True(t, overload.IsUDF)
require.False(t, overload.UDFContainsOnlySignature)
require.Equal(t, 0, len(overload.Types.Types()))
require.Equal(t, types.TupleFamily, overload.ReturnType([]tree.TypedExpr{}).Family())
require.NotZero(t, overload.ReturnType([]tree.TypedExpr{}).TypeMeta)

return nil
})
require.NoError(t, err)
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/logictest/testdata/logic_test/crdb_internal
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ crdb_internal cluster_settings table admin NULL NULL
crdb_internal cluster_statement_statistics table admin NULL NULL
crdb_internal cluster_transaction_statistics table admin NULL NULL
crdb_internal cluster_transactions table admin NULL NULL
crdb_internal create_function_statements table admin NULL NULL
crdb_internal create_schema_statements table admin NULL NULL
crdb_internal create_statements table admin NULL NULL
crdb_internal create_type_statements table admin NULL NULL
Expand Down
17 changes: 17 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/create_statements
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,23 @@ CREATE TABLE crdb_internal.cluster_transactions (
num_auto_retries INT8 NULL,
last_auto_retry_reason STRING NULL
) {} {}
CREATE TABLE crdb_internal.create_function_statements (
database_id INT8 NULL,
database_name STRING NULL,
schema_id INT8 NULL,
schema_name STRING NULL,
function_id INT8 NULL,
function_name STRING NULL,
create_statement STRING NULL
) CREATE TABLE crdb_internal.create_function_statements (
database_id INT8 NULL,
database_name STRING NULL,
schema_id INT8 NULL,
schema_name STRING NULL,
function_id INT8 NULL,
function_name STRING NULL,
create_statement STRING NULL
) {} {}
CREATE TABLE crdb_internal.create_schema_statements (
database_id INT8 NULL,
database_name STRING NULL,
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/logictest/testdata/logic_test/grant_table
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ test crdb_internal cluster_settings public
test crdb_internal cluster_statement_statistics public SELECT false
test crdb_internal cluster_transaction_statistics public SELECT false
test crdb_internal cluster_transactions public SELECT false
test crdb_internal create_function_statements public SELECT false
test crdb_internal create_schema_statements public SELECT false
test crdb_internal create_statements public SELECT false
test crdb_internal create_type_statements public SELECT false
Expand Down
Loading