@@ -114,22 +114,34 @@ func TypeIDToOID(id descpb.ID) oid.Oid {
114
114
}
115
115
116
116
// UserDefinedTypeOIDToID converts a user defined type OID into a
117
- // descriptor ID.
118
- func UserDefinedTypeOIDToID (oid oid.Oid ) descpb.ID {
119
- return descpb .ID (oid ) - oidext .CockroachPredefinedOIDMax
117
+ // descriptor ID. OID of a user-defined type must be greater than
118
+ // CockroachPredefinedOIDMax. The function throws an error if the
119
+ // given OID is less than CockroachPredefinedMax.
120
+ func UserDefinedTypeOIDToID (oid oid.Oid ) (descpb.ID , error ) {
121
+ if descpb .ID (oid ) <= oidext .CockroachPredefinedOIDMax {
122
+ return 0 , errors .Newf ("user-defined OID %d should be greater " +
123
+ "than predefined Max: %d." , oid , oidext .CockroachPredefinedOIDMax )
124
+ }
125
+ return descpb .ID (oid ) - oidext .CockroachPredefinedOIDMax , nil
120
126
}
121
127
122
- // GetTypeDescID gets the type descriptor ID from a user defined type.
123
- func GetTypeDescID (t * types.T ) descpb.ID {
128
+ // GetUserDefinedTypeDescID gets the type descriptor ID from a user defined type.
129
+ func GetUserDefinedTypeDescID (t * types.T ) ( descpb.ID , error ) {
124
130
return UserDefinedTypeOIDToID (t .Oid ())
125
131
}
126
132
127
- // GetArrayTypeDescID gets the ID of the array type descriptor from a user
133
+ // GetUserDefinedArrayTypeDescID gets the ID of the array type descriptor from a user
128
134
// defined type.
129
- func GetArrayTypeDescID (t * types.T ) descpb.ID {
135
+ func GetUserDefinedArrayTypeDescID (t * types.T ) ( descpb.ID , error ) {
130
136
return UserDefinedTypeOIDToID (t .UserDefinedArrayOID ())
131
137
}
132
138
139
+ // makeTypeIDRangeError is a helper to create an error message for invalid type ID conversion.
140
+ func makeTypeIDRangeError (t * types.T ) error {
141
+ return errors .Newf ("user-defined OID %d should be greater than Max OID: %d. " +
142
+ "The type has %s" , t .Oid (), oidext .CockroachPredefinedOIDMax , t .DebugString ())
143
+ }
144
+
133
145
// TypeDesc implements the Descriptor interface.
134
146
func (desc * immutable ) TypeDesc () * descpb.TypeDescriptor {
135
147
return & desc .TypeDescriptor
@@ -599,7 +611,10 @@ func (desc *immutable) ValidateCrossReferences(
599
611
}
600
612
case descpb .TypeDescriptor_ALIAS :
601
613
if desc .GetAlias ().UserDefined () {
602
- aliasedID := UserDefinedTypeOIDToID (desc .GetAlias ().Oid ())
614
+ aliasedID , err := UserDefinedTypeOIDToID (desc .GetAlias ().Oid ())
615
+ if err != nil {
616
+ vea .Report (err )
617
+ }
603
618
if _ , err := vdg .GetTypeDescriptor (aliasedID ); err != nil {
604
619
vea .Report (errors .Wrapf (err , "aliased type %d does not exist" , aliasedID ))
605
620
}
@@ -724,7 +739,11 @@ func HydrateTypesInTableDescriptor(
724
739
hydrateCol := func (col * descpb.ColumnDescriptor ) error {
725
740
if col .Type .UserDefined () {
726
741
// Look up its type descriptor.
727
- name , typDesc , err := res .GetTypeDescriptor (ctx , GetTypeDescID (col .Type ))
742
+ td , err := GetUserDefinedTypeDescID (col .Type )
743
+ if err != nil {
744
+ return err
745
+ }
746
+ name , typDesc , err := res .GetTypeDescriptor (ctx , td )
728
747
if err != nil {
729
748
return err
730
749
}
@@ -787,7 +806,11 @@ func (desc *immutable) HydrateTypeInfoWithName(
787
806
case types .ArrayFamily :
788
807
// Hydrate the element type.
789
808
elemType := typ .ArrayContents ()
790
- elemTypName , elemTypDesc , err := res .GetTypeDescriptor (ctx , GetTypeDescID (elemType ))
809
+ id , err := GetUserDefinedTypeDescID (elemType )
810
+ if err != nil {
811
+ return err
812
+ }
813
+ elemTypName , elemTypDesc , err := res .GetTypeDescriptor (ctx , id )
791
814
if err != nil {
792
815
return err
793
816
}
@@ -925,9 +948,13 @@ func GetTypeDescriptorClosure(typ *types.T) map[descpb.ID]struct{} {
925
948
if ! typ .UserDefined () {
926
949
return map [descpb.ID ]struct {}{}
927
950
}
951
+ id , err := GetUserDefinedTypeDescID (typ )
952
+ if err != nil {
953
+ panic (err )
954
+ }
928
955
// Collect the type's descriptor ID.
929
956
ret := map [descpb.ID ]struct {}{
930
- GetTypeDescID ( typ ) : {},
957
+ id : {},
931
958
}
932
959
if typ .Family () == types .ArrayFamily {
933
960
// If we have an array type, then collect all types in the contents.
@@ -937,7 +964,11 @@ func GetTypeDescriptorClosure(typ *types.T) map[descpb.ID]struct{} {
937
964
}
938
965
} else {
939
966
// Otherwise, take the array type ID.
940
- ret [GetArrayTypeDescID (typ )] = struct {}{}
967
+ id , err := GetUserDefinedArrayTypeDescID (typ )
968
+ if err != nil {
969
+ panic (err )
970
+ }
971
+ ret [id ] = struct {}{}
941
972
}
942
973
return ret
943
974
}
0 commit comments