[GIS]fix str_gis

This commit is contained in:
obdev 2023-11-08 06:39:20 +00:00 committed by ob-robot
parent 3f06f3e56b
commit a9c2876a24

View File

@ -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<char *>(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<ObGeoWkbByteOrder>(version)
|| ObGeoWkbByteOrder::LittleEndian == static_cast<ObGeoWkbByteOrder>(version)) {
// without version, add version
uint64_t res_size = src.length() + WKB_VERSION_SIZE;
char *res_buf = reinterpret_cast<char *>(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;
}