diff options
author | Sergei Golubchik <serg@mariadb.org> | 2017-02-14 11:11:47 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2017-02-14 20:43:41 +0100 |
commit | 6f6d0531dca711f13842cfca761afd073c595f57 (patch) | |
tree | b46a9f617e86bcca3a19d24bb2f8c5f9c31ff182 /sql/item_jsonfunc.cc | |
parent | e0fa2ce40f03add01bb3d934480e74e3ee64dd6c (diff) | |
download | mariadb-git-6f6d0531dca711f13842cfca761afd073c595f57.tar.gz |
MDEV-11439 No data type JSON, but CAST(something AS JSON) pretends to work
Use JSON_COMPACT(X) instead of CAST(X AS JSON).
Bonus - X is validated to be a valid JSON.
Fix a typo in the error message.
Diffstat (limited to 'sql/item_jsonfunc.cc')
-rw-r--r-- | sql/item_jsonfunc.cc | 70 |
1 files changed, 32 insertions, 38 deletions
diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index 59d49b81d4a..925a7e437f2 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -373,7 +373,7 @@ static int path_setup_nwc(json_path_t *p, CHARSET_INFO *i_cs, longlong Item_func_json_valid::val_int() { - String *js= args[0]->val_str(&tmp_value); + String *js= args[0]->val_json(&tmp_value); json_engine_t je; if ((null_value= args[0]->null_value)) @@ -401,7 +401,7 @@ longlong Item_func_json_exists::val_int() json_engine_t je; uint array_counters[JSON_DEPTH_LIMIT]; - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); if (!path.parsed) { @@ -454,7 +454,7 @@ void Item_func_json_value::fix_length_and_dec() String *Item_func_json_value::val_str(String *str) { json_engine_t je; - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); int error= 0; uint array_counters[JSON_DEPTH_LIMIT]; @@ -587,7 +587,7 @@ void Item_func_json_unquote::fix_length_and_dec() String *Item_func_json_unquote::val_str(String *str) { - String *js= args[0]->val_str(&tmp_s); + String *js= args[0]->val_json(&tmp_s); json_engine_t je; int c_len; @@ -712,7 +712,7 @@ static bool path_ok(const json_path_with_flags *paths_list, int n_paths, String *Item_func_json_extract::val_str(String *str) { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); json_engine_t je, sav_je; json_path_t p; const uchar *value; @@ -817,7 +817,7 @@ return_null: longlong Item_func_json_extract::val_int() { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); json_engine_t je; uint n_arg; uint array_counters[JSON_DEPTH_LIMIT]; @@ -1040,7 +1040,7 @@ static int check_contains(json_engine_t *js, json_engine_t *value) longlong Item_func_json_contains::val_int() { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); json_engine_t je, ve; int result; @@ -1049,7 +1049,7 @@ longlong Item_func_json_contains::val_int() if (!a2_parsed) { - val= args[1]->val_str(&tmp_val); + val= args[1]->val_json(&tmp_val); a2_parsed= a2_constant; } @@ -1179,7 +1179,7 @@ static int parse_one_or_all(const Item_func *f, Item *ooa_arg, #ifdef DUMMY longlong Item_func_json_contains_path::val_int() { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); json_engine_t je; uint n_arg; longlong result; @@ -1247,7 +1247,7 @@ return_null: longlong Item_func_json_contains_path::val_int() { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); json_engine_t je; uint n_arg; longlong result; @@ -1351,7 +1351,7 @@ static int append_json_value(String *str, Item *item, String *tmp_val) return str->append(t_f, t_f_len); } { - String *sv= item->val_str(tmp_val); + String *sv= item->val_json(tmp_val); if (item->null_value) goto append_null; if (item->is_json_type()) @@ -1461,7 +1461,7 @@ void Item_func_json_array_append::fix_length_and_dec() String *Item_func_json_array_append::val_str(String *str) { json_engine_t je; - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); uint n_arg, n_path, str_rest_len; const uchar *ar_end; @@ -1588,7 +1588,7 @@ return_null: String *Item_func_json_array_insert::val_str(String *str) { json_engine_t je; - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); uint n_arg, n_path; DBUG_ASSERT(fixed == 1); @@ -1959,7 +1959,7 @@ String *Item_func_json_merge::val_str(String *str) { DBUG_ASSERT(fixed == 1); json_engine_t je1, je2; - String *js1= args[0]->val_str(&tmp_js1), *js2; + String *js1= args[0]->val_json(&tmp_js1), *js2; uint n_arg; if (args[0]->null_value) @@ -1970,7 +1970,7 @@ String *Item_func_json_merge::val_str(String *str) str->set_charset(js1->charset()); str->length(0); - js2= args[n_arg]->val_str(&tmp_js2); + js2= args[n_arg]->val_json(&tmp_js2); if (args[n_arg]->null_value) goto null_return; @@ -2028,7 +2028,7 @@ void Item_func_json_length::fix_length_and_dec() longlong Item_func_json_length::val_int() { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); json_engine_t je; uint length= 0; uint array_counters[JSON_DEPTH_LIMIT]; @@ -2105,7 +2105,7 @@ null_return: longlong Item_func_json_depth::val_int() { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); json_engine_t je; uint depth= 0, c_depth= 0; bool inc_depth= TRUE; @@ -2164,7 +2164,7 @@ void Item_func_json_type::fix_length_and_dec() String *Item_func_json_type::val_str(String *str) { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); json_engine_t je; const char *type; @@ -2232,7 +2232,7 @@ void Item_func_json_insert::fix_length_and_dec() String *Item_func_json_insert::val_str(String *str) { json_engine_t je; - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); uint n_arg, n_path; json_string_t key_name; @@ -2478,7 +2478,7 @@ void Item_func_json_remove::fix_length_and_dec() String *Item_func_json_remove::val_str(String *str) { json_engine_t je; - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); uint n_arg, n_path; json_string_t key_name; @@ -2661,7 +2661,7 @@ void Item_func_json_keys::fix_length_and_dec() String *Item_func_json_keys::val_str(String *str) { json_engine_t je; - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); uint n_keys= 0; uint array_counters[JSON_DEPTH_LIMIT]; @@ -2837,7 +2837,7 @@ static int append_json_path(String *str, const json_path_t *p) String *Item_func_json_search::val_str(String *str) { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); String *s_str= args[2]->val_str(&tmp_js); json_engine_t je; json_path_t p, sav_path; @@ -2934,21 +2934,6 @@ null_return: } -void Item_json_typecast::fix_length_and_dec() -{ - maybe_null= args[0]->maybe_null; - max_length= args[0]->max_length; -} - - -String *Item_json_typecast::val_str(String *str) -{ - String *vs= args[0]->val_str(str); - null_value= args[0]->null_value; - return vs; -} - - const char *Item_func_json_format::func_name() const { switch (fmt) @@ -2976,7 +2961,7 @@ void Item_func_json_format::fix_length_and_dec() String *Item_func_json_format::val_str(String *str) { - String *js= args[0]->val_str(&tmp_js); + String *js= args[0]->val_json(&tmp_js); json_engine_t je; int tab_size= 4; @@ -3016,3 +3001,12 @@ String *Item_func_json_format::val_str(String *str) } +String *Item_func_json_format::val_json(String *str) +{ + String *js= args[0]->val_json(&tmp_js); + if ((null_value= args[0]->null_value)) + return 0; + return js; +} + + |