Skip to content

Commit 9cf809c

Browse files
craig[bot]Sajjad RizviYevgeniy Miretskiy
committed
Merge #65352 #65746
65352: sql/catalog/typedesc: validate OID range before converting it to ID r=sajjadrizvi a=sajjadrizvi Previously the code to convert an OID to a `descpb.ID` assumed that the OID is larger than a predefined constant. There were no checks to validate the given OID during conversion. As a result, an out-of-range OID could be converted to an invalid descriptor ID without an error. The changes in this PR validate the range of given user-defined OID before conversion, which encourages the user to check the conversion for potential problems. Release note: None Fixes #58414 65746: changefeedccl: Use span frontier when emitting resolved spans. r=stevendanna a=miretskiy Use span frontier to emit change aggregator resolved spans instead of storing additional list of spans to flush. Using span frontier reduces the amount of memory we use (removes duplicate span storage since frontier keeps track of spans anyway). Furthermore, because span frontier merges adjacent spans, we reduce the number of resolved span messages sent to change frontier aggregator, thus making job checkpointing more efficient. Release Notes: None Co-authored-by: Sajjad Rizvi <[email protected]> Co-authored-by: Yevgeniy Miretskiy <[email protected]>
3 parents 942e8f8 + fff814f + 9870bc9 commit 9cf809c

24 files changed

+717
-212
lines changed

pkg/ccl/backupccl/restore_planning.go

+39-10
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,23 @@ func rewriteTypesInExpr(expr string, rewrites DescRewriteMap) (string, error) {
116116
if err != nil {
117117
return "", err
118118
}
119+
119120
ctx := tree.NewFmtCtx(tree.FmtSerializable)
120121
ctx.SetIndexedTypeFormat(func(ctx *tree.FmtCtx, ref *tree.OIDTypeReference) {
121122
newRef := ref
122-
if rw, ok := rewrites[typedesc.UserDefinedTypeOIDToID(ref.OID)]; ok {
123+
var id descpb.ID
124+
id, err = typedesc.UserDefinedTypeOIDToID(ref.OID)
125+
if err != nil {
126+
return
127+
}
128+
if rw, ok := rewrites[id]; ok {
123129
newRef = &tree.OIDTypeReference{OID: typedesc.TypeIDToOID(rw.ID)}
124130
}
125131
ctx.WriteString(newRef.SQLString())
126132
})
133+
if err != nil {
134+
return "", err
135+
}
127136
ctx.FormatNode(parsed)
128137
return ctx.CloseAndGetString(), nil
129138
}
@@ -348,11 +357,15 @@ func allocateDescriptorRewrites(
348357
// Ensure that all referenced types are present.
349358
if col.Type.UserDefined() {
350359
// TODO (rohany): This can be turned into an option later.
351-
if _, ok := typesByID[typedesc.GetTypeDescID(col.Type)]; !ok {
360+
id, err := typedesc.GetUserDefinedTypeDescID(col.Type)
361+
if err != nil {
362+
return nil, err
363+
}
364+
if _, ok := typesByID[id]; !ok {
352365
return nil, errors.Errorf(
353366
"cannot restore table %q without referenced type %d",
354367
table.Name,
355-
typedesc.GetTypeDescID(col.Type),
368+
id,
356369
)
357370
}
358371
}
@@ -1025,25 +1038,37 @@ func rewriteDatabaseDescs(databases []*dbdesc.Mutable, descriptorRewrites DescRe
10251038

10261039
// rewriteIDsInTypesT rewrites all ID's in the input types.T using the input
10271040
// ID rewrite mapping.
1028-
func rewriteIDsInTypesT(typ *types.T, descriptorRewrites DescRewriteMap) {
1041+
func rewriteIDsInTypesT(typ *types.T, descriptorRewrites DescRewriteMap) error {
10291042
if !typ.UserDefined() {
1030-
return
1043+
return nil
1044+
}
1045+
tid, err := typedesc.GetUserDefinedTypeDescID(typ)
1046+
if err != nil {
1047+
return err
10311048
}
10321049
// Collect potential new OID values.
10331050
var newOID, newArrayOID oid.Oid
1034-
if rw, ok := descriptorRewrites[typedesc.GetTypeDescID(typ)]; ok {
1051+
if rw, ok := descriptorRewrites[tid]; ok {
10351052
newOID = typedesc.TypeIDToOID(rw.ID)
10361053
}
10371054
if typ.Family() != types.ArrayFamily {
1038-
if rw, ok := descriptorRewrites[typedesc.GetArrayTypeDescID(typ)]; ok {
1055+
tid, err = typedesc.GetUserDefinedArrayTypeDescID(typ)
1056+
if err != nil {
1057+
return err
1058+
}
1059+
if rw, ok := descriptorRewrites[tid]; ok {
10391060
newArrayOID = typedesc.TypeIDToOID(rw.ID)
10401061
}
10411062
}
10421063
types.RemapUserDefinedTypeOIDs(typ, newOID, newArrayOID)
10431064
// If the type is an array, then we need to rewrite the element type as well.
10441065
if typ.Family() == types.ArrayFamily {
1045-
rewriteIDsInTypesT(typ.ArrayContents(), descriptorRewrites)
1066+
if err := rewriteIDsInTypesT(typ.ArrayContents(), descriptorRewrites); err != nil {
1067+
return err
1068+
}
10461069
}
1070+
1071+
return nil
10471072
}
10481073

10491074
// rewriteTypeDescs rewrites all ID's in the input slice of TypeDescriptors
@@ -1075,7 +1100,9 @@ func rewriteTypeDescs(types []*typedesc.Mutable, descriptorRewrites DescRewriteM
10751100
}
10761101
case descpb.TypeDescriptor_ALIAS:
10771102
// We need to rewrite any ID's present in the aliased types.T.
1078-
rewriteIDsInTypesT(typ.Alias, descriptorRewrites)
1103+
if err := rewriteIDsInTypesT(typ.Alias, descriptorRewrites); err != nil {
1104+
return err
1105+
}
10791106
default:
10801107
return errors.AssertionFailedf("unknown type kind %s", t.String())
10811108
}
@@ -1285,7 +1312,9 @@ func RewriteTableDescs(
12851312
// rewriteCol is a closure that performs the ID rewrite logic on a column.
12861313
rewriteCol := func(col *descpb.ColumnDescriptor) error {
12871314
// Rewrite the types.T's IDs present in the column.
1288-
rewriteIDsInTypesT(col.Type, descriptorRewrites)
1315+
if err := rewriteIDsInTypesT(col.Type, descriptorRewrites); err != nil {
1316+
return err
1317+
}
12891318
var newUsedSeqRefs []descpb.ID
12901319
for _, seqID := range col.UsesSequenceIds {
12911320
if rewrite, ok := descriptorRewrites[seqID]; ok {

0 commit comments

Comments
 (0)