in odps/datatype/data_type.go [401:460]
func IsTypeEqual(t1, t2 DataType) bool {
if t1 == nil || t2 == nil {
return false
}
switch t1.ID() {
case ARRAY, MAP:
if IsNullType(t2) {
return true
}
case NULL:
t2Id := t2.ID()
return t2Id == ARRAY || t2Id == MAP || t2Id == NULL
}
if t1.ID() != t2.ID() {
return false
}
switch r1 := t1.(type) {
case StructType:
r2, _ := t2.(StructType)
if len(r1.Fields) != len(r2.Fields) {
return false
}
fields1 := make(StructFields, len(r1.Fields))
fields2 := make(StructFields, len(r1.Fields))
copy(fields1, r1.Fields)
copy(fields2, r2.Fields)
sort.Sort(fields1)
sort.Sort(fields2)
for i := range fields1 {
f1, f2 := fields1[i], fields2[i]
if f1.Name != f2.Name {
return false
}
return IsTypeEqual(f1.Type, f2.Type)
}
case MapType:
r2, _ := t2.(MapType)
return IsTypeEqual(r1.KeyType, r2.KeyType) &&
IsTypeEqual(r1.ValueType, r2.ValueType)
case ArrayType:
r2, _ := t2.(ArrayType)
return IsTypeEqual(r1.ElementType, r2.ElementType)
case CharType:
r2, _ := t2.(CharType)
return r1.Length == r2.Length
case VarcharType:
r2, _ := t2.(VarcharType)
return r1.Length == r2.Length
}
return true
}