func IsTypeEqual()

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
}