Skip to content

Commit 89040b4

Browse files
craig[bot]ecwall
andcommitted
107567: sql: fix CREATE AS [SHOW CREATE FUNCTION] job failure r=rafiss a=ecwall Fixes cockroachdb#106268 Previously `CREATE TABLE AS`/`CREATE MATERIALIZED VIEW AS` sourcing from `SHOW CREATE FUNCTION <function>` generated a failing schema change job with a `unknown function: f(): function undefined` error because the job runs in the system database and functions cannot be referenced cross database. This PR fixes this by using the original user session (which includes the database) in the schema change job. Release note (bug fix): Fixes the schema changer job when CREATE AS sources from SHOW CREATE FUNCTION: CREATE TABLE t AS SELECT * FROM [SHOW CREATE FUNCTION f]; Co-authored-by: Evan Wall <[email protected]>
2 parents a462321 + 0695f6a commit 89040b4

File tree

20 files changed

+171
-46
lines changed

20 files changed

+171
-46
lines changed

pkg/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,7 @@ ALL_TESTS = [
549549
"//pkg/sql/sem/tree:tree_disallowed_imports_test",
550550
"//pkg/sql/sem/tree:tree_test",
551551
"//pkg/sql/sessiondata:sessiondata_test",
552+
"//pkg/sql/sessiondatapb:sessiondatapb_test",
552553
"//pkg/sql/sessioninit:sessioninit_test",
553554
"//pkg/sql/span:span_test",
554555
"//pkg/sql/sqlinstance/instancestorage:instancestorage_test",
@@ -2051,6 +2052,7 @@ GO_TARGETS = [
20512052
"//pkg/sql/sessiondata:sessiondata",
20522053
"//pkg/sql/sessiondata:sessiondata_test",
20532054
"//pkg/sql/sessiondatapb:sessiondatapb",
2055+
"//pkg/sql/sessiondatapb:sessiondatapb_test",
20542056
"//pkg/sql/sessioninit:sessioninit",
20552057
"//pkg/sql/sessioninit:sessioninit_test",
20562058
"//pkg/sql/sessionphase:sessionphase",

pkg/jobs/jobspb/jobs.proto

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -887,7 +887,9 @@ message SchemaChangeDetails {
887887
(gogoproto.customtype) = "github.com/cockroachdb/cockroach/pkg/util/uuid.UUID"
888888
];
889889

890-
// Next id 13.
890+
sessiondatapb.SessionData session_data = 13;
891+
892+
// Next id 14.
891893
}
892894

893895
message SchemaChangeProgress {

pkg/sql/colexec/colbuilder/execplan.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ var (
257257
errExporterWrap = errors.New("core.Exporter is not supported (not an execinfra.RowSource)")
258258
errSamplerWrap = errors.New("core.Sampler is not supported (not an execinfra.RowSource)")
259259
errSampleAggregatorWrap = errors.New("core.SampleAggregator is not supported (not an execinfra.RowSource)")
260-
errExperimentalWrappingProhibited = errors.New("wrapping for non-JoinReader and non-LocalPlanNode cores is prohibited in vectorize=experimental_always")
260+
errExperimentalWrappingProhibited = errors.Newf("wrapping for non-JoinReader and non-LocalPlanNode cores is prohibited in vectorize=%s", sessiondatapb.VectorizeExperimentalAlways)
261261
errWrappedCast = errors.New("mismatched types in NewColOperator and unsupported casts")
262262
errLookupJoinUnsupported = errors.New("lookup join reader is unsupported in vectorized")
263263
errFilteringAggregation = errors.New("filtering aggregation not supported")

pkg/sql/create_as_test.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ func TestCreateAsShow(t *testing.T) {
129129
testCases := []struct {
130130
sql string
131131
setup string
132-
skip bool
133132
}{
134133
{
135134
sql: "SHOW CLUSTER SETTINGS",
@@ -165,9 +164,6 @@ func TestCreateAsShow(t *testing.T) {
165164
{
166165
sql: "SHOW CREATE FUNCTION show_create_fn",
167166
setup: "CREATE FUNCTION show_create_fn(i int) RETURNS INT AS 'SELECT i' LANGUAGE SQL",
168-
// TODO(sql-foundations): Fix `unknown function: show_create_fn(): function undefined` error in job.
169-
// See https://github.com/cockroachdb/cockroach/issues/106268.
170-
skip: true,
171167
},
172168
{
173169
sql: "SHOW CREATE ALL TYPES",
@@ -294,9 +290,6 @@ func TestCreateAsShow(t *testing.T) {
294290

295291
for i, testCase := range testCases {
296292
t.Run(testCase.sql, func(t *testing.T) {
297-
if testCase.skip {
298-
return
299-
}
300293
if testCase.setup != "" {
301294
if s.StartedDefaultTestTenant() && strings.Contains(testCase.setup, "create_tenant") {
302295
// Only the system tenant has the ability to create other

pkg/sql/delegate/show_function.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,20 @@ FROM crdb_internal.create_function_statements
2727
WHERE schema_name = %[1]s
2828
AND function_name = %[2]s
2929
`
30-
un, ok := n.Name.FunctionReference.(*tree.UnresolvedName)
30+
resolvableFunctionReference := &n.Name
31+
un, ok := resolvableFunctionReference.FunctionReference.(*tree.UnresolvedName)
3132
if !ok {
3233
return nil, errors.AssertionFailedf("not a valid function name")
3334
}
3435

35-
fn, err := d.catalog.ResolveFunction(d.ctx, un, &d.evalCtx.SessionData().SearchPath)
36+
searchPath := &d.evalCtx.SessionData().SearchPath
37+
var fn *tree.ResolvedFunctionDefinition
38+
var err error
39+
if d.qualifyDataSourceNamesInAST {
40+
fn, err = resolvableFunctionReference.Resolve(d.ctx, searchPath, d.catalog)
41+
} else {
42+
fn, err = d.catalog.ResolveFunction(d.ctx, un, searchPath)
43+
}
3644
if err != nil {
3745
return nil, err
3846
}
@@ -41,12 +49,26 @@ AND function_name = %[2]s
4149
for _, o := range fn.Overloads {
4250
if o.IsUDF {
4351
udfSchema = o.Schema
52+
break
4453
}
4554
}
4655
if udfSchema == "" {
4756
return nil, errors.Errorf("function %s does not exist", tree.AsString(un))
4857
}
4958

59+
if d.qualifyDataSourceNamesInAST {
60+
referenceByName := resolvableFunctionReference.ReferenceByName
61+
if !referenceByName.HasExplicitSchema() {
62+
referenceByName.Parts[1] = udfSchema
63+
}
64+
if !referenceByName.HasExplicitCatalog() {
65+
referenceByName.Parts[2] = d.evalCtx.SessionData().Database
66+
}
67+
if referenceByName.NumParts < 3 {
68+
referenceByName.NumParts = 3
69+
}
70+
}
71+
5072
fullQuery := fmt.Sprintf(query, lexbase.EscapeSQLString(udfSchema), lexbase.EscapeSQLString(un.Parts[0]))
5173
return d.parse(fullQuery)
5274
}

pkg/sql/drop_function.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ func (p *planner) writeDropFuncSchemaChange(ctx context.Context, funcDesc *funcd
279279
DescriptorIDs: descpb.IDs{funcDesc.ID},
280280
Details: jobspb.SchemaChangeDetails{
281281
DroppedFunctions: descpb.IDs{funcDesc.ID},
282+
SessionData: &p.SessionData().SessionData,
282283
},
283284
Progress: jobspb.TypeSchemaChangeProgress{},
284285
}

pkg/sql/drop_schema.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ func (p *planner) createDropSchemaJob(
258258
// The version distinction for database jobs doesn't matter for jobs that
259259
// drop schemas.
260260
FormatVersion: jobspb.DatabaseJobFormatVersion,
261+
SessionData: &p.SessionData().SessionData,
261262
},
262263
Progress: jobspb.SchemaChangeProgress{},
263264
NonCancelable: true,

pkg/sql/exec_util.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -588,12 +588,13 @@ var VectorizeClusterMode = settings.RegisterEnumSetting(
588588
VectorizeClusterSettingName,
589589
"default vectorize mode",
590590
"on",
591-
map[int64]string{
592-
int64(sessiondatapb.VectorizeUnset): "on",
593-
int64(sessiondatapb.VectorizeOn): "on",
594-
int64(sessiondatapb.VectorizeExperimentalAlways): "experimental_always",
595-
int64(sessiondatapb.VectorizeOff): "off",
596-
},
591+
func() map[int64]string {
592+
m := make(map[int64]string, len(sessiondatapb.VectorizeExecMode_name))
593+
for k := range sessiondatapb.VectorizeExecMode_name {
594+
m[int64(k)] = sessiondatapb.VectorizeExecMode(k).String()
595+
}
596+
return m
597+
}(),
597598
).WithPublic()
598599

599600
// DistSQLClusterExecMode controls the cluster default for when DistSQL is used.

pkg/sql/logictest/testdata/logic_test/builtin_function

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2989,7 +2989,7 @@ select crdb_internal.json_to_pb('cockroach.sql.sqlbase.Descriptor', crdb_interna
29892989
----
29902990
true
29912991

2992-
query error pq: crdb_internal.json_to_pb\(\): invalid proto JSON: unmarshaling json to cockroach.sql.sqlbase.Descriptor: unknown field "__redacted__" in descpb.Descriptor
2992+
query error pq: crdb_internal.json_to_pb\(\): invalid proto JSON: unmarshaling to cockroach.sql.sqlbase.Descriptor json: .+ unknown field "__redacted__" in descpb.Descriptor
29932993
select crdb_internal.json_to_pb('cockroach.sql.sqlbase.Descriptor', crdb_internal.pb_to_json('cockroach.sql.sqlbase.Descriptor', descriptor, true, true)) = descriptor from system.descriptor where id = 1
29942994

29952995
subtest regexp_split

pkg/sql/logictest/testdata/logic_test/set

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ SET vectorize = experimental_always
243243
statement ok
244244
SET vectorize = off
245245

246-
statement error invalid value for parameter "vectorize": "bogus"
246+
statement error invalid value for parameter "vectorize": "bogus"\nHINT: Available values: off,on,experimental_always
247247
SET vectorize = bogus
248248

249249
statement ok

0 commit comments

Comments
 (0)