2
* Copyright (c) 2021 OceanBase
3
* OceanBase CE is licensed under Mulan PubL v2.
4
* You can use this software according to the terms and conditions of the Mulan PubL v2.
5
* You may obtain a copy of Mulan PubL v2 at:
6
* http://license.coscl.org.cn/MulanPubL-2.0
7
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
* See the Mulan PubL v2 for more details.
13
#include "obsm_utils.h"
15
#include "lib/time/ob_time_utility.h"
16
#include "lib/charset/ob_dtoa.h"
17
#include "common/ob_field.h"
18
#include "share/schema/ob_schema_getter_guard.h"
19
#include "share/schema/ob_udt_info.h"
20
#include "pl/ob_pl_user_type.h"
22
using namespace oceanbase::common;
23
using namespace oceanbase::obmysql;
24
using namespace oceanbase::share::schema;
25
using namespace oceanbase::pl;
29
/* oceanbase::common::ObObjType ob_type; */
30
EMySQLFieldType mysql_type;
31
uint16_t flags; /* flags if Field */
32
uint64_t length; /* other than varchar type */
36
// reference: https://dev.mysql.com/doc/refman/5.6/en/c-api-data-structures.html
37
// reference: http://dev.mysql.com/doc/internals/en/client-server-protocol.html
38
static const ObMySQLTypeMap type_maps_[ObMaxType] =
41
{EMySQLFieldType::MYSQL_TYPE_NULL, BINARY_FLAG, 0}, /* ObNullType */
42
{EMySQLFieldType::MYSQL_TYPE_TINY, 0, 0}, /* ObTinyIntType */
43
{EMySQLFieldType::MYSQL_TYPE_SHORT, 0, 0}, /* ObSmallIntType */
44
{EMySQLFieldType::MYSQL_TYPE_INT24, 0, 0}, /* ObMediumIntType */
45
{EMySQLFieldType::MYSQL_TYPE_LONG, 0, 0}, /* ObInt32Type */
46
{EMySQLFieldType::MYSQL_TYPE_LONGLONG, 0, 0}, /* ObIntType */
47
{EMySQLFieldType::MYSQL_TYPE_TINY, UNSIGNED_FLAG, 0}, /* ObUTinyIntType */
48
{EMySQLFieldType::MYSQL_TYPE_SHORT, UNSIGNED_FLAG, 0}, /* ObUSmallIntType */
49
{EMySQLFieldType::MYSQL_TYPE_INT24, UNSIGNED_FLAG, 0}, /* ObUMediumIntType */
50
{EMySQLFieldType::MYSQL_TYPE_LONG, UNSIGNED_FLAG, 0}, /* ObUInt32Type */
51
{EMySQLFieldType::MYSQL_TYPE_LONGLONG, UNSIGNED_FLAG, 0}, /* ObUInt64Type */
52
{EMySQLFieldType::MYSQL_TYPE_FLOAT, 0, 0}, /* ObFloatType */
53
{EMySQLFieldType::MYSQL_TYPE_DOUBLE, 0, 0}, /* ObDoubleType */
54
{EMySQLFieldType::MYSQL_TYPE_FLOAT, UNSIGNED_FLAG, 0}, /* ObUFloatType */
55
{EMySQLFieldType::MYSQL_TYPE_DOUBLE, UNSIGNED_FLAG, 0}, /* ObUDoubleType */
56
{EMySQLFieldType::MYSQL_TYPE_NEWDECIMAL,0, 0}, /* ObNumberType */
57
{EMySQLFieldType::MYSQL_TYPE_NEWDECIMAL,UNSIGNED_FLAG, 0}, /* ObUNumberType */
58
{EMySQLFieldType::MYSQL_TYPE_DATETIME, BINARY_FLAG, 0}, /* ObDateTimeType */
59
{EMySQLFieldType::MYSQL_TYPE_TIMESTAMP, BINARY_FLAG | TIMESTAMP_FLAG, 0}, /* ObTimestampType */
60
{EMySQLFieldType::MYSQL_TYPE_DATE, BINARY_FLAG, 0}, /* ObDateType */
61
{EMySQLFieldType::MYSQL_TYPE_TIME, BINARY_FLAG, 0}, /* ObTimeType */
62
{EMySQLFieldType::MYSQL_TYPE_YEAR, UNSIGNED_FLAG | ZEROFILL_FLAG, 0}, /* ObYearType */
63
{EMySQLFieldType::MYSQL_TYPE_VAR_STRING, 0, 0}, /* ObVarcharType */
64
{EMySQLFieldType::MYSQL_TYPE_STRING, 0, 0}, /* ObCharType */
65
{EMySQLFieldType::MYSQL_TYPE_VAR_STRING, BINARY_FLAG, 0}, /* ObHexStringType */
66
{EMySQLFieldType::MYSQL_TYPE_COMPLEX, 0, 0}, /* ObExtendType */
67
{EMySQLFieldType::MYSQL_TYPE_NOT_DEFINED, 0, 0}, /* ObUnknownType */
68
{EMySQLFieldType::MYSQL_TYPE_TINY_BLOB, BLOB_FLAG, 0}, /* ObTinyTextType */
69
{EMySQLFieldType::MYSQL_TYPE_BLOB, BLOB_FLAG, 0}, /* ObTextType */
70
{EMySQLFieldType::MYSQL_TYPE_MEDIUM_BLOB, BLOB_FLAG, 0}, /* ObMediumTextType */
71
{EMySQLFieldType::MYSQL_TYPE_LONG_BLOB, BLOB_FLAG, 0}, /* ObLongTextType */
72
{EMySQLFieldType::MYSQL_TYPE_BIT, UNSIGNED_FLAG, 0}, /* ObBitType */
73
{EMySQLFieldType::MYSQL_TYPE_STRING, ENUM_FLAG, 0}, /* ObEnumType */
74
{EMySQLFieldType::MYSQL_TYPE_STRING, SET_FLAG, 0}, /* ObSetType */
75
{EMySQLFieldType::MYSQL_TYPE_NOT_DEFINED, 0, 0}, /* ObEnumInnerType */
76
{EMySQLFieldType::MYSQL_TYPE_NOT_DEFINED, 0, 0}, /* ObSetInnerType */
77
{EMySQLFieldType::MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE, BINARY_FLAG | TIMESTAMP_FLAG, 0}, /* ObTimestampTZType */
78
{EMySQLFieldType::MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE, BINARY_FLAG | TIMESTAMP_FLAG, 0}, /* ObTimestampLTZType */
79
{EMySQLFieldType::MYSQL_TYPE_OB_TIMESTAMP_NANO, BINARY_FLAG | TIMESTAMP_FLAG, 0}, /* ObTimestampNanoType */
80
{EMySQLFieldType::MYSQL_TYPE_OB_RAW, BINARY_FLAG, 0}, /* ObRawType */
81
{EMySQLFieldType::MYSQL_TYPE_OB_INTERVAL_YM, BINARY_FLAG, 0}, /* ObIntervalYMType */
82
{EMySQLFieldType::MYSQL_TYPE_OB_INTERVAL_DS, BINARY_FLAG, 0}, /* ObIntervalDSType */
83
{EMySQLFieldType::MYSQL_TYPE_OB_NUMBER_FLOAT, BINARY_FLAG, 0}, /* ObNumberFloatType */
84
{EMySQLFieldType::MYSQL_TYPE_OB_NVARCHAR2, 0, 0}, /* ObNVarchar2Type */
85
{EMySQLFieldType::MYSQL_TYPE_OB_NCHAR, 0, 0}, /* ObNCharType */
86
{EMySQLFieldType::MYSQL_TYPE_OB_UROWID, 0, 0},
87
{EMySQLFieldType::MYSQL_TYPE_ORA_BLOB, 0, 0}, /* ObLobType */
88
{EMySQLFieldType::MYSQL_TYPE_JSON, BLOB_FLAG | BINARY_FLAG, 0}, /* ObJsonType */
89
{EMySQLFieldType::MYSQL_TYPE_GEOMETRY, BLOB_FLAG | BINARY_FLAG, 0}, /* ObGeometryType */
90
{EMySQLFieldType::MYSQL_TYPE_COMPLEX, 0, 0}, /* ObUserDefinedSQLType */
91
{EMySQLFieldType::MYSQL_TYPE_NEWDECIMAL, 0, 0}, /* ObDecimalIntType */
95
//called by handle COM_STMT_EXECUTE offset is 0
96
bool ObSMUtils::update_from_bitmap(ObObj ¶m, const char *bitmap, int64_t field_index)
99
if (update_from_bitmap(bitmap, field_index)) {
106
bool ObSMUtils::update_from_bitmap(const char *bitmap, int64_t field_index)
109
int byte_pos = static_cast<int>(field_index / 8);
110
int bit_pos = static_cast<int>(field_index % 8);
111
if (NULL != bitmap) {
112
char value = bitmap[byte_pos];
113
if (value & (1 << bit_pos)) {
120
int ObSMUtils::cell_str(
121
char *buf, const int64_t len,
123
MYSQL_PROTOCOL_TYPE type, int64_t &pos,
124
int64_t cell_idx, char *bitmap,
125
const ObDataTypeCastParams &dtc_params,
126
const ObField *field,
127
ObSchemaGetterGuard *schema_guard,
130
int ret = OB_SUCCESS;
133
ObPrecision precision = 0;
134
bool zerofill = false;
135
int32_t zflength = 0;
136
bool is_oracle_raw = false;
138
if (OB_UNLIKELY(obj.is_invalid_type())) {
139
ret = OB_INVALID_ARGUMENT;
141
scale = ObAccuracy::DML_DEFAULT_ACCURACY[obj.get_type()].get_scale();
144
scale = field->accuracy_.get_scale();
145
precision = field->accuracy_.get_precision();
146
zerofill = field->flags_ & ZEROFILL_FLAG;
147
zflength = field->length_;
148
OB_LOG(DEBUG, "get field accuracy_", K(field->accuracy_), K(zerofill), K(obj));
151
switch (obj.get_type_class()) {
153
ret = ObMySQLUtil::null_cell_str(buf, len, type, pos, cell_idx, bitmap);
156
ret = ObMySQLUtil::int_cell_str(buf, len, obj.get_int(), obj.get_type(), false, type, pos, zerofill, zflength);
159
ret = ObMySQLUtil::int_cell_str(buf, len, obj.get_int(), obj.get_type(), true, type, pos, zerofill, zflength);
162
ret = ObMySQLUtil::float_cell_str(buf, len, obj.get_float(), type, pos, scale, zerofill, zflength);
165
ret = ObMySQLUtil::double_cell_str(buf, len, obj.get_double(), type, pos, scale, zerofill, zflength);
168
ret = ObMySQLUtil::number_cell_str(buf, len, obj.get_number(), pos, scale, zerofill, zflength);
171
ret = ObMySQLUtil::datetime_cell_str(buf, len, obj.get_datetime(), type, pos, (obj.is_timestamp() ? dtc_params.tz_info_ : NULL), scale);
174
ret = ObMySQLUtil::date_cell_str(buf, len, obj.get_date(), type, pos);
177
ret = ObMySQLUtil::time_cell_str(buf, len, obj.get_time(), type, pos, scale);
180
ret = ObMySQLUtil::year_cell_str(buf, len, obj.get_year(), type, pos);
183
ret = ObMySQLUtil::otimestamp_cell_str(buf, len, obj.get_otimestamp_value(), type, pos, dtc_params, scale, obj.get_type());
186
case ObTextTC: // TODO@hanhui texttc share the stringtc temporarily
188
// lob locator也会按varchar方式进行encode, 客户端往server端传输数据时,
189
// 也是将lob locator按varchar传输, 先编码LobLocator length, 然后再编码整个lob Locator
191
ret = ObMySQLUtil::varchar_cell_str(buf, len, obj.get_string(), is_oracle_raw, pos);
195
ret = ObMySQLUtil::json_cell_str(MTL_ID(), buf, len, obj.get_string(), pos);
199
ret = ObMySQLUtil::geometry_cell_str(buf, len, obj.get_string(), pos);
204
if (OB_LIKELY(precision > 0)) {
207
bit_len = ObAccuracy::MAX_ACCURACY[obj.get_type()].precision_;
208
_OB_LOG(WARN, "max precision is used. origin precision is %d", precision);
210
ret = ObMySQLUtil::bit_cell_str(buf, len, obj.get_bit(), bit_len, type, pos);
214
common::ObArenaAllocator allocator;
215
const pl::ObUserDefinedType *user_type = NULL;
216
const ObUDTTypeInfo *udt_info = NULL;
217
ObObj shadow_obj = obj;
218
char *src = reinterpret_cast<char*>(&shadow_obj);
219
uint64_t database_id = OB_INVALID_ID;
220
if (OB_ISNULL(field) || OB_ISNULL(schema_guard)) {
221
ret = OB_ERR_UNEXPECTED;
222
OB_LOG(WARN, "complex type need field and schema guard not null", K(ret));
223
} else if (field->type_.get_type() != ObExtendType) {
224
ret = OB_ERR_UNEXPECTED;
225
OB_LOG(WARN, "field type is not ObExtended", K(ret));
226
} else if (field->type_owner_.empty() || field->type_name_.empty()) {
227
if (0 == field->type_name_.case_compare("SYS_REFCURSOR")) {
228
ObPLCursorInfo *cursor = reinterpret_cast<ObPLCursorInfo*>(obj.get_int());
229
if (OB_ISNULL(cursor)) {
230
// cursor may null, we cell null to client.
231
ret = ObMySQLUtil::null_cell_str(buf, len, type, pos, cell_idx, bitmap);
232
} else if (OB_FAIL(ObMySQLUtil::int_cell_str(buf,
242
"int cell str filled",
244
K(ObString(len, buf)),
246
} else { /*do nothing*/ }
247
#ifdef OB_BUILD_ORACLE_PL
248
} else if (obj.is_pl_extend()
249
&& PL_NESTED_TABLE_TYPE == obj.get_meta().get_extend_type()) {
250
// anonymous collection
251
ObPLCollection *coll = reinterpret_cast<ObPLCollection *>(obj.get_ext());
252
ObNestedTableType *nested_type = NULL;
253
ObPLDataType element_type;
254
if (OB_ISNULL(nested_type =
255
reinterpret_cast<ObNestedTableType*>(allocator.alloc(sizeof(ObNestedTableType))))) {
256
ret = OB_ALLOCATE_MEMORY_FAILED;
257
OB_LOG(WARN, "failed to alloc memory for ObNestedTableType", K(ret));
258
} else if (OB_ISNULL(coll)) {
259
ret = OB_ERR_UNEXPECTED;
260
OB_LOG(WARN, "coll is null", K(ret));
261
} else if (FALSE_IT(new (nested_type) ObNestedTableType())) {
262
} else if (FALSE_IT(element_type.reset())) {
263
} else if (FALSE_IT(element_type.set_data_type(coll->get_element_type()))) {
264
} else if (FALSE_IT(nested_type->set_element_type(element_type))) {
265
} else if (OB_FAIL(nested_type->serialize(
266
*schema_guard, dtc_params.tz_info_, type, src, buf, len, pos))) {
267
OB_LOG(WARN, "failed to serialize anonymous collection", K(ret));
269
OB_LOG(DEBUG, "success to serialize anonymous collection", K(ret));
273
ret = OB_ERR_UNEXPECTED;
274
OB_LOG(WARN, "type owner or type name is empty", KPC(field), K(ret));
277
if (OB_FAIL(schema_guard->get_database_id(tenant_id, field->type_owner_, database_id))) {
278
OB_LOG(WARN, "failed to get database id", K(ret));
279
} else if (OB_FAIL(schema_guard->get_udt_info(tenant_id, database_id, OB_INVALID_ID,
280
field->type_name_, udt_info))) {
281
OB_LOG(WARN, "failed to get udt info", K(ret), K(field));
283
if (OB_ISNULL(udt_info)) {
285
if (0 == field->type_owner_.case_compare(OB_SYS_DATABASE_NAME)
286
|| 0 == field->type_owner_.case_compare("SYS")) {
287
if (OB_FAIL(schema_guard->get_udt_info(
288
OB_SYS_TENANT_ID, OB_SYS_DATABASE_ID,
289
OB_INVALID_ID, field->type_name_, udt_info))) {
290
OB_LOG(WARN, "failed to get sys udt info", K(ret), K(field));
293
if (OB_SUCC(ret) && OB_ISNULL(udt_info)) {
294
ret = OB_ERR_UNEXPECTED;
295
OB_LOG(WARN, "udt info is null", K(ret));
299
} else if (OB_FAIL(udt_info->transform_to_pl_type(allocator, user_type))) {
300
OB_LOG(WARN, "faild to transform to pl type", K(ret));
301
} else if (OB_ISNULL(user_type)) {
302
ret = OB_ERR_UNEXPECTED;
303
OB_LOG(WARN, "user type is null", K(ret));
304
} else if (OB_FAIL(user_type->serialize(*schema_guard, dtc_params.tz_info_, type, src, buf, len, pos))) {
305
OB_LOG(WARN, "failed to serialize", K(ret));
311
ret = obj.is_interval_ym() ?
312
ObMySQLUtil::interval_ym_cell_str(buf, len, obj.get_interval_ym(), type, pos, scale) :
313
ObMySQLUtil::interval_ds_cell_str(buf, len, obj.get_interval_ds(), type, pos, scale);
317
if (obj.is_urowid()) {
318
ret = ObMySQLUtil::urowid_cell_str(buf, len, obj.get_urowid(), pos);
320
ret = OB_NOT_SUPPORTED;
321
OB_LOG(WARN, "not support rowid type for now", K(ret));
325
case ObUserDefinedSQLTC: {
326
ret = ObMySQLUtil::sql_utd_cell_str(MTL_ID(), buf, len, obj.get_string(), pos);
329
case ObDecimalIntTC: {
330
ret = ObMySQLUtil::decimalint_cell_str(buf, len, obj.get_decimal_int(), obj.get_int_bytes(),
331
obj.get_scale(), pos, zerofill, zflength);
335
_OB_LOG(ERROR, "invalid ob type=%d", obj.get_type());
343
int get_map(ObObjType ob_type, const ObMySQLTypeMap *&map)
345
int ret = OB_SUCCESS;
346
if (ob_type >= ObMaxType) {
347
ret = OB_OBJ_TYPE_ERROR;
351
map = type_maps_ + ob_type;
357
int ObSMUtils::get_type_length(ObObjType ob_type, int64_t &length)
359
const ObMySQLTypeMap *map = NULL;
360
int ret = OB_SUCCESS;
362
if ((ret = get_map(ob_type, map)) == OB_SUCCESS) {
363
length = map->length;
368
int ObSMUtils::get_mysql_type(ObObjType ob_type, EMySQLFieldType &mysql_type,
369
uint16_t &flags, ObScale &num_decimals)
371
const ObMySQLTypeMap *map = NULL;
372
int ret = OB_SUCCESS;
374
if ((ret = get_map(ob_type, map)) == OB_SUCCESS) {
375
mysql_type = map->mysql_type;
377
// batch fixup num_decimal values
378
// so as to be compatible with mysql metainfo
379
switch (mysql_type) {
380
case EMySQLFieldType::MYSQL_TYPE_LONGLONG:
381
case EMySQLFieldType::MYSQL_TYPE_LONG:
382
case EMySQLFieldType::MYSQL_TYPE_INT24:
383
case EMySQLFieldType::MYSQL_TYPE_SHORT:
384
case EMySQLFieldType::MYSQL_TYPE_TINY:
385
case EMySQLFieldType::MYSQL_TYPE_NULL:
386
case EMySQLFieldType::MYSQL_TYPE_DATE:
387
case EMySQLFieldType::MYSQL_TYPE_YEAR:
388
case EMySQLFieldType::MYSQL_TYPE_BIT:
389
case EMySQLFieldType::MYSQL_TYPE_JSON: // mysql json and long text decimals are 0, we do not need it?
390
case EMySQLFieldType::MYSQL_TYPE_GEOMETRY:
391
case EMySQLFieldType::MYSQL_TYPE_ORA_XML:
395
case EMySQLFieldType::MYSQL_TYPE_TINY_BLOB:
396
case EMySQLFieldType::MYSQL_TYPE_BLOB:
397
case EMySQLFieldType::MYSQL_TYPE_MEDIUM_BLOB:
398
case EMySQLFieldType::MYSQL_TYPE_LONG_BLOB:
399
case EMySQLFieldType::MYSQL_TYPE_VAR_STRING:
400
case EMySQLFieldType::MYSQL_TYPE_STRING:
401
case EMySQLFieldType::MYSQL_TYPE_OB_RAW:
402
case EMySQLFieldType::MYSQL_TYPE_COMPLEX:
403
case EMySQLFieldType::MYSQL_TYPE_OB_NVARCHAR2:
404
case EMySQLFieldType::MYSQL_TYPE_OB_NCHAR:
405
case EMySQLFieldType::MYSQL_TYPE_OB_UROWID:
406
case EMySQLFieldType::MYSQL_TYPE_ORA_BLOB:
407
case EMySQLFieldType::MYSQL_TYPE_ORA_CLOB:
408
// for compatible with MySQL, ugly convention.
409
num_decimals = static_cast<ObScale>(lib::is_oracle_mode()
410
? ORACLE_NOT_FIXED_DEC
413
case EMySQLFieldType::MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE:
414
case EMySQLFieldType::MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE:
415
case EMySQLFieldType::MYSQL_TYPE_OB_TIMESTAMP_NANO:
416
case EMySQLFieldType::MYSQL_TYPE_TIMESTAMP:
417
case EMySQLFieldType::MYSQL_TYPE_DATETIME:
418
case EMySQLFieldType::MYSQL_TYPE_TIME:
419
case EMySQLFieldType::MYSQL_TYPE_FLOAT:
420
case EMySQLFieldType::MYSQL_TYPE_DOUBLE:
421
case EMySQLFieldType::MYSQL_TYPE_NEWDECIMAL:
422
case EMySQLFieldType::MYSQL_TYPE_OB_NUMBER_FLOAT:
423
case EMySQLFieldType::MYSQL_TYPE_OB_INTERVAL_YM:
424
case EMySQLFieldType::MYSQL_TYPE_OB_INTERVAL_DS:
425
num_decimals = static_cast<ObScale>((num_decimals == -1)
426
? (lib::is_oracle_mode() ? ORACLE_NOT_FIXED_DEC : NOT_FIXED_DEC)
430
ret = OB_ERR_UNEXPECTED;
431
_OB_LOG(WARN, "unexpected mysql_type=%d", mysql_type);
438
int ObSMUtils::get_ob_type(ObObjType &ob_type, EMySQLFieldType mysql_type, const bool is_unsigned)
440
int ret = OB_SUCCESS;
441
switch (mysql_type) {
442
case EMySQLFieldType::MYSQL_TYPE_NULL:
443
ob_type = ObNullType;
445
case EMySQLFieldType::MYSQL_TYPE_TINY:
446
ob_type = is_unsigned ? ObUTinyIntType : ObTinyIntType;
448
case EMySQLFieldType::MYSQL_TYPE_SHORT:
449
ob_type = is_unsigned ? ObUSmallIntType : ObSmallIntType;
451
case EMySQLFieldType::MYSQL_TYPE_LONG:
452
ob_type = is_unsigned ? ObUInt32Type : ObInt32Type;
454
case EMySQLFieldType::MYSQL_TYPE_LONGLONG:
455
ob_type = is_unsigned ? ObUInt64Type : ObIntType;
457
case EMySQLFieldType::MYSQL_TYPE_FLOAT:
458
ob_type = ObFloatType;
460
case EMySQLFieldType::MYSQL_TYPE_DOUBLE:
461
ob_type = ObDoubleType;
463
case EMySQLFieldType::MYSQL_TYPE_TIMESTAMP:
464
ob_type = ObTimestampType;
466
case EMySQLFieldType::MYSQL_TYPE_DATETIME:
467
ob_type = ObDateTimeType;
469
case EMySQLFieldType::MYSQL_TYPE_TIME:
470
ob_type = ObTimeType;
472
case EMySQLFieldType::MYSQL_TYPE_DATE:
473
ob_type = ObDateType;
475
case EMySQLFieldType::MYSQL_TYPE_YEAR:
476
ob_type = ObYearType;
478
case EMySQLFieldType::MYSQL_TYPE_VARCHAR:
479
case EMySQLFieldType::MYSQL_TYPE_STRING:
480
case EMySQLFieldType::MYSQL_TYPE_VAR_STRING:
481
ob_type = ObVarcharType;
483
case EMySQLFieldType::MYSQL_TYPE_TINY_BLOB:
484
ob_type = ObTinyTextType;
486
case EMySQLFieldType::MYSQL_TYPE_BLOB:
487
ob_type = ObTextType;
489
case EMySQLFieldType::MYSQL_TYPE_MEDIUM_BLOB:
490
ob_type = ObMediumTextType;
492
case EMySQLFieldType::MYSQL_TYPE_LONG_BLOB:
493
ob_type = ObLongTextType;
495
case EMySQLFieldType::MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE:
496
ob_type = ObTimestampTZType;
498
case EMySQLFieldType::MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE:
499
ob_type = ObTimestampLTZType;
501
case EMySQLFieldType::MYSQL_TYPE_OB_TIMESTAMP_NANO:
502
ob_type = ObTimestampNanoType;
504
case EMySQLFieldType::MYSQL_TYPE_OB_RAW:
507
case EMySQLFieldType::MYSQL_TYPE_NEWDECIMAL:
508
ob_type = ObNumberType;
510
case EMySQLFieldType::MYSQL_TYPE_BIT:
513
case EMySQLFieldType::MYSQL_TYPE_ENUM:
514
ob_type = ObEnumType;
516
case EMySQLFieldType::MYSQL_TYPE_SET:
519
case EMySQLFieldType::MYSQL_TYPE_COMPLEX:
520
ob_type = ObExtendType;
522
case EMySQLFieldType::MYSQL_TYPE_OB_INTERVAL_YM:
523
ob_type = ObIntervalYMType;
525
case EMySQLFieldType::MYSQL_TYPE_OB_INTERVAL_DS:
526
ob_type = ObIntervalDSType;
528
case EMySQLFieldType::MYSQL_TYPE_OB_NUMBER_FLOAT:
529
ob_type = ObNumberFloatType;
531
case EMySQLFieldType::MYSQL_TYPE_OB_NVARCHAR2:
532
ob_type = ObNVarchar2Type;
534
case EMySQLFieldType::MYSQL_TYPE_OB_NCHAR:
535
ob_type = ObNCharType;
537
case EMySQLFieldType::MYSQL_TYPE_OB_UROWID:
538
ob_type = ObURowIDType;
540
case EMySQLFieldType::MYSQL_TYPE_ORA_BLOB:
541
case EMySQLFieldType::MYSQL_TYPE_ORA_CLOB:
544
case EMySQLFieldType::MYSQL_TYPE_JSON:
545
ob_type = ObJsonType;
547
case EMySQLFieldType::MYSQL_TYPE_GEOMETRY:
548
ob_type = ObGeometryType;
551
_OB_LOG(WARN, "unsupport MySQL type %d", mysql_type);
552
ret = OB_OBJ_TYPE_ERROR;