diff --git a/src/sql/engine/aggregate/ob_aggregate_processor.cpp b/src/sql/engine/aggregate/ob_aggregate_processor.cpp index f22b83e86569f28cd7d85b093ee6f30d2906a46f..408891f9fea55f00b08488a4e09aa759066e8179 100644 --- a/src/sql/engine/aggregate/ob_aggregate_processor.cpp +++ b/src/sql/engine/aggregate/ob_aggregate_processor.cpp @@ -3453,6 +3453,7 @@ int ObAggregateProcessor::get_json_objectagg_result(const ObAggrInfo &aggr_info, ObCollationType cs_type0 = tmp_obj[0].get_collation_type(); ObObjType val_type1 = tmp_obj[1].get_type(); ObScale scale1 = tmp_obj[1].get_scale(); + scale1 = (val_type1 == ObBitType) ? aggr_info.param_exprs_.at(1)->datum_meta_.length_semantics_ : scale1; ObCollationType cs_type1 = tmp_obj[1].get_collation_type(); ObString key_string = tmp_obj[0].get_string(); if (OB_SUCC(ret) && ObCharset::charset_type_by_coll(cs_type0) != CHARSET_UTF8MB4) { diff --git a/src/sql/engine/expr/ob_expr_json_func_helper.h b/src/sql/engine/expr/ob_expr_json_func_helper.h index 23b2bee330bd6e76fc0d2eb7005c6dc08ba47a2a..d25744675d8570def056b9f6713cec7a7b22dc7d 100644 --- a/src/sql/engine/expr/ob_expr_json_func_helper.h +++ b/src/sql/engine/expr/ob_expr_json_func_helper.h @@ -213,7 +213,20 @@ public: } break; } - + case ObYearType: { + uint8_t in_val = datum.get_year(); + int64_t full_year = 0; + if (OB_FAIL(ObTimeConverter::year_to_int(in_val, full_year))) { + } else { + buf = allocator->alloc(sizeof(ObJsonInt)); + if (OB_ISNULL(buf)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + } else { + json_node = (ObJsonInt*)new(buf)ObJsonInt(full_year); + } + } + break; + } case ObFloatType: case ObDoubleType: case ObUFloatType: @@ -251,6 +264,27 @@ public: } break; } + case ObBitType: { + const int32_t BUF_LEN = (OB_MAX_BIT_LENGTH + 7) / 8; + int64_t pos = 0; + char *bbuf = static_cast(allocator->alloc(BUF_LEN)); + if (OB_ISNULL(bbuf)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + } else { + uint64_t in_val = datum.get_uint64(); + if (OB_FAIL(bit_to_char_array(in_val, scale, bbuf, BUF_LEN, pos))) { + } else { + common::ObString j_value(pos, bbuf); + buf = allocator->alloc(sizeof(ObJsonOpaque)); + if (OB_ISNULL(buf)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + } else { + json_node = (ObJsonOpaque *)new(buf)ObJsonOpaque(j_value, type); + } + } + } + break; + } default: { ret = OB_INVALID_ARGUMENT; }