Skip to content

Commit b17d962

Browse files
committed
workload/schemachange: handle LTREE in mixed version CREATE TYPE
Using this type in a composite type in a mixed version cluster will cause UndefinedObject errors, so we need to make the workload aware of that. Release note: None
1 parent 8197306 commit b17d962

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

pkg/sql/randgen/schema.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func MakeSchemaName(ifNotExists bool, schema string, authRole tree.RoleSpec) *tr
4040
// RandCreateEnumType creates a random CREATE TYPE <type_name> AS ENUM statement.
4141
// The resulting type's name will be name, the enum members will
4242
// be random strings generated from alphabet.
43-
func RandCreateEnumType(rng *rand.Rand, name, alphabet string) tree.Statement {
43+
func RandCreateEnumType(rng *rand.Rand, name, alphabet string) *tree.CreateType {
4444
numLabels := rng.Intn(6) + 1
4545
labels := make(tree.EnumValueList, numLabels)
4646
labelsMap := make(map[string]struct{})
@@ -66,7 +66,7 @@ func RandCreateEnumType(rng *rand.Rand, name, alphabet string) tree.Statement {
6666
}
6767

6868
// RandCreateCompositeType creates a random composite type statement.
69-
func RandCreateCompositeType(rng *rand.Rand, name, alphabet string) tree.Statement {
69+
func RandCreateCompositeType(rng *rand.Rand, name, alphabet string) *tree.CreateType {
7070
var compositeTypeList []tree.CompositeTypeElem
7171

7272
numTypes := rng.Intn(6) + 1

pkg/workload/schemachange/operation_generator.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,15 +1359,36 @@ func (og *operationGenerator) createType(
13591359
})
13601360

13611361
const letters = "abcdefghijklmnopqrstuvwxyz"
1362-
var statement tree.Statement
1362+
var statement *tree.CreateType
13631363

13641364
if isEnum {
13651365
statement = randgen.RandCreateEnumType(og.params.rng, typName.Object(), letters)
13661366
} else {
13671367
statement = randgen.RandCreateCompositeType(og.params.rng, typName.Object(), letters)
1368+
1369+
hasTypeWithPrefix := func(typePrefix string) bool {
1370+
for _, field := range statement.CompositeTypeList {
1371+
if strings.HasPrefix(field.Type.SQLString(), typePrefix) {
1372+
return true
1373+
}
1374+
}
1375+
return false
1376+
}
1377+
1378+
// Check for references to any types that are not supported in mixed version
1379+
// clusters.
1380+
ltreeNotSupported, err := isClusterVersionLessThan(ctx, tx, clusterversion.V25_4.Version())
1381+
if err != nil {
1382+
return nil, err
1383+
}
1384+
hasLtreeType := hasTypeWithPrefix("LTREE")
1385+
opStmt.potentialExecErrors.addAll(codesWithConditions{
1386+
{code: pgcode.UndefinedObject, condition: hasLtreeType && ltreeNotSupported},
1387+
{code: pgcode.Syntax, condition: hasLtreeType && ltreeNotSupported},
1388+
})
13681389
}
13691390

1370-
statement.(*tree.CreateType).TypeName = typName.ToUnresolvedObjectName()
1391+
statement.TypeName = typName.ToUnresolvedObjectName()
13711392
opStmt.sql = tree.Serialize(statement)
13721393
return opStmt, nil
13731394
}

0 commit comments

Comments
 (0)