diff --git a/deps/oblib/src/lib/geo/ob_geo_utils.cpp b/deps/oblib/src/lib/geo/ob_geo_utils.cpp index 230cdd600..9c197fe84 100644 --- a/deps/oblib/src/lib/geo/ob_geo_utils.cpp +++ b/deps/oblib/src/lib/geo/ob_geo_utils.cpp @@ -653,17 +653,28 @@ int ObGeoTypeUtil::get_bo_from_wkb(const ObString &wkb, ObGeoWkbByteOrder &bo) int ObGeoTypeUtil::add_geo_version(ObIAllocator &allocator, const ObString &src, ObString &res_wkb) { int ret = OB_SUCCESS; - uint64_t res_size = src.length() + WKB_VERSION_SIZE; - char *res_buf = reinterpret_cast(allocator.alloc(res_size)); - if (OB_ISNULL(res_buf)) { - ret = OB_ALLOCATE_MEMORY_FAILED; - LOG_WARN("failed to alloc memory", K(ret), K(res_size)); + uint8_t version = (*(src.ptr() + WKB_GEO_SRID_SIZE)); + if (ObGeoWkbByteOrder::BigEndian == static_cast(version) + || ObGeoWkbByteOrder::LittleEndian == static_cast(version)) { + // without version, add version + uint64_t res_size = src.length() + WKB_VERSION_SIZE; + char *res_buf = reinterpret_cast(allocator.alloc(res_size)); + if (OB_ISNULL(res_buf)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to alloc memory", K(ret), K(res_size)); + } else { + MEMCPY(res_buf, src.ptr(), WKB_GEO_SRID_SIZE); + *(res_buf + WKB_GEO_SRID_SIZE) = ENCODE_GEO_VERSION(GEO_VESION_1); + MEMCPY(res_buf + WKB_OFFSET, src.ptr() + WKB_GEO_SRID_SIZE, src.length() - WKB_GEO_SRID_SIZE); + res_wkb.assign_ptr(res_buf, res_size); + } + } else if (IS_GEO_VERSION(version) && GET_GEO_VERSION(version) == GEO_VESION_1) { + res_wkb = src; } else { - MEMCPY(res_buf, src.ptr(), WKB_GEO_SRID_SIZE); - *(res_buf + WKB_GEO_SRID_SIZE) = ENCODE_GEO_VERSION(GEO_VESION_1); - MEMCPY(res_buf + WKB_OFFSET, src.ptr() + WKB_GEO_SRID_SIZE, src.length() - WKB_GEO_SRID_SIZE); - res_wkb.assign_ptr(res_buf, res_size); + ret = OB_ERR_GIS_INVALID_DATA; + LOG_WARN("invalid byte order", K(ret), K(version)); } + return ret; }