Skip to content

Commit dde848c

Browse files
committed
sql/catalog: disallow UDF references in mixed version state
Since the support for UDF dependency tracking required a new schema change plan, we need to block this in a mixed version state. Release note: None
1 parent 5ec3db8 commit dde848c

File tree

10 files changed

+184
-14
lines changed

10 files changed

+184
-14
lines changed

pkg/sql/alter_table.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkeys"
2424
"github.com/cockroachdb/cockroach/pkg/sql/catalog/catpb"
2525
"github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb"
26+
"github.com/cockroachdb/cockroach/pkg/sql/catalog/funcdesc"
2627
"github.com/cockroachdb/cockroach/pkg/sql/catalog/resolver"
2728
"github.com/cockroachdb/cockroach/pkg/sql/catalog/schemaexpr"
2829
"github.com/cockroachdb/cockroach/pkg/sql/catalog/tabledesc"
@@ -1397,6 +1398,10 @@ func sanitizeColumnExpression(
13971398
return nil, "", pgerror.WithCandidateCode(err, pgcode.DatatypeMismatch)
13981399
}
13991400

1401+
if err := funcdesc.MaybeFailOnUDFUsage(typedExpr, context, p.EvalContext().Settings.Version.ActiveVersionOrEmpty(p.ctx)); err != nil {
1402+
return nil, "", err
1403+
}
1404+
14001405
typedExpr, err = schemaexpr.MaybeReplaceUDFNameWithOIDReferenceInTypedExpr(typedExpr)
14011406
if err != nil {
14021407
return nil, "", err

pkg/sql/catalog/funcdesc/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go_library(
55
srcs = [
66
"func_desc.go",
77
"func_desc_builder.go",
8+
"helpers.go",
89
],
910
importpath = "github.com/cockroachdb/cockroach/pkg/sql/catalog/funcdesc",
1011
visibility = ["//visibility:public"],
@@ -26,6 +27,7 @@ go_library(
2627
"//pkg/sql/sem/tree",
2728
"//pkg/sql/sem/volatility",
2829
"//pkg/sql/types",
30+
"//pkg/util/errorutil/unimplemented",
2931
"//pkg/util/hlc",
3032
"//pkg/util/iterutil",
3133
"//pkg/util/protoutil",
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright 2022 The Cockroach Authors.
2+
//
3+
// Use of this software is governed by the CockroachDB Software License
4+
// included in the /LICENSE file.
5+
6+
package funcdesc
7+
8+
import (
9+
"github.com/cockroachdb/cockroach/pkg/clusterversion"
10+
"github.com/cockroachdb/cockroach/pkg/sql/sem/tree"
11+
"github.com/cockroachdb/cockroach/pkg/util/errorutil/unimplemented"
12+
)
13+
14+
var schemaExprContextAllowingUDF = map[tree.SchemaExprContext]clusterversion.Key{
15+
tree.CheckConstraintExpr: clusterversion.MinSupported,
16+
tree.ColumnDefaultExprInNewTable: clusterversion.MinSupported,
17+
tree.ColumnDefaultExprInSetDefault: clusterversion.MinSupported,
18+
19+
tree.PolicyUsingExpr: clusterversion.V25_2,
20+
tree.PolicyWithCheckExpr: clusterversion.V25_2,
21+
22+
tree.ColumnDefaultExprInAddColumn: clusterversion.V25_3,
23+
tree.ColumnDefaultExprInNewView: clusterversion.V25_3,
24+
tree.ColumnOnUpdateExpr: clusterversion.V25_3,
25+
tree.ExpressionIndexElementExpr: clusterversion.V25_3,
26+
tree.IndexPredicateExpr: clusterversion.V25_3,
27+
tree.StoredComputedColumnExpr: clusterversion.V25_3,
28+
tree.VirtualComputedColumnExpr: clusterversion.V25_3,
29+
}
30+
31+
// MaybeFailOnUDFUsage returns an error if the given expression or any
32+
// sub-expression used a UDF unless it's explicitly listed as an allowed use
33+
// case.
34+
func MaybeFailOnUDFUsage(
35+
expr tree.TypedExpr, exprContext tree.SchemaExprContext, version clusterversion.ClusterVersion,
36+
) error {
37+
if supportedVersion, ok := schemaExprContextAllowingUDF[exprContext]; ok && version.IsActive(supportedVersion) {
38+
return nil
39+
}
40+
visitor := &tree.UDFDisallowanceVisitor{}
41+
tree.WalkExpr(visitor, expr)
42+
if visitor.FoundUDF {
43+
return unimplemented.NewWithIssue(83234, "usage of user-defined function from relations not supported")
44+
}
45+
return nil
46+
}

pkg/sql/catalog/schemaexpr/expr.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ func DequalifyAndValidateExprImpl(
7979
return "", nil, colIDs, err
8080
}
8181

82+
if err := funcdesc.MaybeFailOnUDFUsage(typedExpr, context, version); err != nil {
83+
return "", nil, colIDs, err
84+
}
85+
8286
// We need to do the rewrite here before the expression is serialized because
8387
// the serialization would drop the prefixes to functions.
8488
//

pkg/sql/catalog/tabledesc/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ go_library(
3434
"//pkg/sql/catalog/colinfo",
3535
"//pkg/sql/catalog/descpb",
3636
"//pkg/sql/catalog/fetchpb",
37+
"//pkg/sql/catalog/funcdesc",
3738
"//pkg/sql/catalog/internal/validate",
3839
"//pkg/sql/catalog/multiregion",
3940
"//pkg/sql/catalog/schemaexpr",

pkg/sql/catalog/tabledesc/table.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/cockroachdb/cockroach/pkg/sql/catalog/catpb"
1818
"github.com/cockroachdb/cockroach/pkg/sql/catalog/colinfo"
1919
"github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb"
20+
"github.com/cockroachdb/cockroach/pkg/sql/catalog/funcdesc"
2021
"github.com/cockroachdb/cockroach/pkg/sql/catalog/schemaexpr"
2122
"github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgcode"
2223
"github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror"
@@ -170,6 +171,10 @@ func MakeColumnDefDescs(
170171
return nil, err
171172
}
172173

174+
if err := funcdesc.MaybeFailOnUDFUsage(ret.DefaultExpr, defaultExprCtx, evalCtx.Settings.Version.ActiveVersion(ctx)); err != nil {
175+
return nil, err
176+
}
177+
173178
ret.DefaultExpr, err = schemaexpr.MaybeReplaceUDFNameWithOIDReferenceInTypedExpr(ret.DefaultExpr)
174179
if err != nil {
175180
return nil, err
@@ -194,6 +199,9 @@ func MakeColumnDefDescs(
194199
if err != nil {
195200
return nil, err
196201
}
202+
if err := funcdesc.MaybeFailOnUDFUsage(ret.OnUpdateExpr, tree.ColumnOnUpdateExpr, evalCtx.Settings.Version.ActiveVersion(ctx)); err != nil {
203+
return nil, err
204+
}
197205
ret.OnUpdateExpr, err = schemaexpr.MaybeReplaceUDFNameWithOIDReferenceInTypedExpr(ret.OnUpdateExpr)
198206
if err != nil {
199207
return nil, err

pkg/sql/logictest/testdata/logic_test/udf_in_index

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# LogicTest: !local-mixed-25.2
2+
13
# Set up functions that inspect function dependencies.
24
statement ok
35
CREATE VIEW v_col_fn_ids AS

0 commit comments

Comments
 (0)