summaryrefslogtreecommitdiff
path: root/sql/item_jsonfunc.cc
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2017-02-14 11:11:47 +0100
committerSergei Golubchik <serg@mariadb.org>2017-02-14 20:43:41 +0100
commit6f6d0531dca711f13842cfca761afd073c595f57 (patch)
treeb46a9f617e86bcca3a19d24bb2f8c5f9c31ff182 /sql/item_jsonfunc.cc
parente0fa2ce40f03add01bb3d934480e74e3ee64dd6c (diff)
downloadmariadb-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.cc70
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;
+}
+
+