bugfix : json object key value with colon && timestamp_tz return value

This commit is contained in:
obdev
2023-02-07 17:49:06 +08:00
committed by ob-robot
parent c3eb8f3b5a
commit a9d66dae7a
3 changed files with 72 additions and 2 deletions

View File

@ -1516,8 +1516,12 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator,
ret = cast_to_otimstamp(j_base, session, accuracy, dst_type, val, is_type_cast); ret = cast_to_otimstamp(j_base, session, accuracy, dst_type, val, is_type_cast);
} }
if (!try_set_error_val<ObDatum>(expr, ctx, res, ret, error_type, error_val, mismatch_val, mismatch_type, is_type_cast, accuracy, dst_type)) { if (!try_set_error_val<ObDatum>(expr, ctx, res, ret, error_type, error_val, mismatch_val, mismatch_type, is_type_cast, accuracy, dst_type)) {
if (dst_type == ObTimestampTZType) {
res.set_otimestamp_tz(val);
} else {
res.set_otimestamp_tiny(val); res.set_otimestamp_tiny(val);
} }
}
break; break;
} }
case ObDateType: { case ObDateType: {

View File

@ -2587,6 +2587,8 @@ int ObFastParserOracle::process_identifier(bool is_number_begin)
int ObFastParserOracle::parse_next_token() int ObFastParserOracle::parse_next_token()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
char last_ch;
last_ch = '0';
while (OB_SUCC(ret) && !raw_sql_.is_search_end()) { while (OB_SUCC(ret) && !raw_sql_.is_search_end()) {
process_leading_space(); process_leading_space();
char ch = raw_sql_.char_at(raw_sql_.cur_pos_); char ch = raw_sql_.char_at(raw_sql_.cur_pos_);
@ -2659,7 +2661,7 @@ int ObFastParserOracle::parse_next_token()
break; break;
} }
case ':': { case ':': {
if (-1 != is_first_identifier_flags(raw_sql_.cur_pos_ + 1) || is_digit(raw_sql_.peek())) { if ((-1 != is_first_identifier_flags(raw_sql_.cur_pos_ + 1) || is_digit(raw_sql_.peek())) && last_ch != '\'') {
raw_sql_.scan(); raw_sql_.scan();
OZ (process_ps_statement()); OZ (process_ps_statement());
} else { } else {
@ -2701,6 +2703,7 @@ int ObFastParserOracle::parse_next_token()
break; break;
} }
} // end switch } // end switch
last_ch = ch;
OX (process_token()); OX (process_token());
} // end while } // end while
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {

View File

@ -526,6 +526,69 @@ do {
#define malloc_time_node_s(malloc_pool, type) malloc_time_node(malloc_pool, type, '\''); #define malloc_time_node_s(malloc_pool, type) malloc_time_node(malloc_pool, type, '\'');
#define malloc_time_node_d(malloc_pool, type) malloc_time_node(malloc_pool, type, '\"'); #define malloc_time_node_d(malloc_pool, type) malloc_time_node(malloc_pool, type, '\"');
// special case json object ( key :ident/intnum)
#define malloc_object_key_node(malloc_pool) \
do { \
ParseNode *key_node = NULL; \
malloc_new_node(key_node, malloc_pool, T_CHAR, 0); \
char *begin_k = strchr(yytext, '\''); \
check_value(begin_k); \
char *end_k = strchr(begin_k + 1, '\''); \
check_value(end_k); \
char *dest = NULL; \
size_t len = end_k - begin_k - 1; \
dest = parse_strndup(begin_k + 1, len, malloc_pool); \
check_malloc(dest); \
key_node->str_value_ = dest; \
key_node->str_len_ = len; \
char *raw_dest = NULL; \
raw_dest = parse_strndup(begin_k + 1, len, malloc_pool); \
check_malloc(raw_dest); \
key_node->str_value_ = raw_dest; \
key_node->str_len_ = len; \
ParseNode *object_node = NULL; \
malloc_new_node(object_node, malloc_pool, T_LINK_NODE, 2); \
object_node->children_[0] = key_node; \
check_value(yylval); \
yylval->node = object_node; \
} while (0);
#define malloc_key_colon_ident_value_node(malloc_pool) \
do { \
malloc_object_key_node(malloc_pool); \
ParseNode *value_node = NULL; \
malloc_new_node(value_node, malloc_pool, T_IDENT, 0); \
char *begin_v = strchr(yytext, ':'); \
check_value(begin_v); \
size_t end_v = strlen(begin_v); \
size_t len_v = end_v - 1; \
char *dest_v = NULL; \
dest_v = parse_strndup(begin_v + 1, len_v, malloc_pool); \
check_malloc(dest_v); \
value_node->str_len_ = len_v; \
value_node->str_value_ = dest_v; \
yylval->node->children_[1] = value_node; \
check_value(yylval); \
} while (0);
#define malloc_key_colon_intnum_value_node(malloc_pool) \
do { \
malloc_object_key_node(malloc_pool); \
ParseNode *value_node = NULL; \
malloc_new_node(value_node, malloc_pool, T_INT, 0); \
char *begin_v = strchr(yytext, ':'); \
check_value(begin_v); \
size_t end_v = strlen(begin_v); \
size_t len_v = end_v - 1; \
char *dest_v = NULL; \
dest_v = parse_strndup(begin_v + 1, len_v, malloc_pool); \
check_malloc(dest_v); \
value_node->str_len_ = len_v; \
value_node->str_value_ = dest_v; \
yylval->node->children_[1] = value_node; \
check_value(yylval); \
} while (0);
#define check_value(val_ptr) \ #define check_value(val_ptr) \
do { \ do { \
if (OB_UNLIKELY(NULL == val_ptr)) \ if (OB_UNLIKELY(NULL == val_ptr)) \