diff options
Diffstat (limited to 'sql/item_jsonfunc.cc')
-rw-r--r-- | sql/item_jsonfunc.cc | 82 |
1 files changed, 81 insertions, 1 deletions
diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index 032ecb1bb91..5fdd612589c 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -1487,7 +1487,7 @@ append_null: } -static int append_json_value_from_field(String *str, +static bool append_json_value_from_field(String *str, Item *i, Field *f, const uchar *key, size_t offset, String *tmp_val) { if (i->type_handler()->is_bool_type()) @@ -1533,6 +1533,73 @@ append_null: } +/* + @brief + Append the value of a field in JSON format + + @param + str buffer to write the value + item argument to JSON_ARRAYAGG item + field field whose value needs to be appended + tmp_val temp buffer + + @note + Use this function when the field has the value in its ptr. + This is currently used when packing is done for JSON_ARRAYAGG function. + In the case of packing, we have to unpack the value to Field::ptr. + + @retval + FALSE value appended in JSON format + TRUE error +*/ + +static bool append_json_value_from_field(String *str, Item *item, Field *field, + String *tmp_val) +{ + if (item->type_handler()->is_bool_type()) + { + if (field->is_null()) + goto append_null; + + longlong v_int= field->val_int(); + const char *t_f; + int t_f_len; + + if (v_int) + { + t_f= "true"; + t_f_len= 4; + } + else + { + t_f= "false"; + t_f_len= 5; + } + + return str->append(t_f, t_f_len); + } + { + if (field->is_null()) + goto append_null; + String *sv= field->val_str(tmp_val); + + if (item->is_json_type()) + return str->append(sv->ptr(), sv->length()); + + if (item->result_type() == STRING_RESULT) + { + return str->append("\"", 1) || + st_append_escaped(str, sv) || + str->append("\"", 1); + } + return st_append_escaped(str, sv); + } + +append_null: + return str->append("null", 4); +} + + static int append_json_keyname(String *str, Item *item, String *tmp_val) { String *sv= item->val_str(tmp_val); @@ -3726,6 +3793,19 @@ String *Item_func_json_arrayagg::get_str_from_field(Item *i,Field *f, } +String *Item_func_json_arrayagg::get_str_from_field(Item *i,Field *f, + String *tmp) +{ + m_tmp_json.length(0); + + if (append_json_value_from_field(&m_tmp_json, i, f, tmp)) + return NULL; + + return &m_tmp_json; + +} + + void Item_func_json_arrayagg::cut_max_length(String *result, uint old_length, uint max_length) const { |