summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/item.h2
-rw-r--r--sql/item_create.cc3
-rw-r--r--sql/item_func.h2
-rw-r--r--sql/item_jsonfunc.cc70
-rw-r--r--sql/item_jsonfunc.h15
-rw-r--r--sql/share/errmsg-utf8.txt2
-rw-r--r--sql/sql_yacc.yy1
7 files changed, 38 insertions, 57 deletions
diff --git a/sql/item.h b/sql/item.h
index 07f489a35a3..27fb716e0c9 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -1095,6 +1095,8 @@ public:
Returns the val_str() value converted to the given character set.
*/
String *val_str(String *str, String *converter, CHARSET_INFO *to);
+
+ virtual String *val_json(String *str) { return val_str(str); }
/*
Return decimal representation of item with fixed point.
diff --git a/sql/item_create.cc b/sql/item_create.cc
index dee1db1ee2e..4730e187ebe 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -7228,9 +7228,6 @@ create_func_cast(THD *thd, Item *a, Cast_target cast_type,
res= new (thd->mem_root) Item_char_typecast(thd, a, len, real_cs);
break;
}
- case ITEM_CAST_JSON:
- res= new (thd->mem_root) Item_json_typecast(thd, a);
- break;
default:
{
DBUG_ASSERT(0);
diff --git a/sql/item_func.h b/sql/item_func.h
index 08b1421cb1d..1f8d1ddb67e 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -2221,7 +2221,7 @@ enum Cast_target
{
ITEM_CAST_BINARY, ITEM_CAST_SIGNED_INT, ITEM_CAST_UNSIGNED_INT,
ITEM_CAST_DATE, ITEM_CAST_TIME, ITEM_CAST_DATETIME, ITEM_CAST_CHAR,
- ITEM_CAST_DECIMAL, ITEM_CAST_DOUBLE, ITEM_CAST_JSON
+ ITEM_CAST_DECIMAL, ITEM_CAST_DOUBLE
};
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;
+}
+
+
diff --git a/sql/item_jsonfunc.h b/sql/item_jsonfunc.h
index 0eedfa18be1..535f1bf73a5 100644
--- a/sql/item_jsonfunc.h
+++ b/sql/item_jsonfunc.h
@@ -414,19 +414,6 @@ public:
};
-class Item_json_typecast: public Item_str_func
-{
-public:
- Item_json_typecast(THD *thd, Item *a): Item_str_func(thd, a) {}
- const char *func_name() const { return "cast_as_json"; }
- bool is_json_type() { return true; }
- void fix_length_and_dec();
- String *val_str(String *str);
- Item *get_copy(THD *thd, MEM_ROOT *mem_root)
- { return get_item_copy<Item_json_typecast>(thd, mem_root, this); }
-};
-
-
class Item_func_json_format: public Item_str_func
{
public:
@@ -449,6 +436,8 @@ public:
const char *func_name() const;
void fix_length_and_dec();
String *val_str(String *str);
+ String *val_json(String *str);
+ bool is_json_type() { return true; }
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
{ return get_item_copy<Item_func_json_format>(thd, mem_root, this); }
};
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index ebf86d6066c..8939910fc29 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -7417,7 +7417,7 @@ ER_BINLOG_UNCOMPRESS_ERROR
ER_JSON_BAD_CHR
eng "Broken JSON string in argument %d to function '%s' at position %d"
ER_JSON_NOT_JSON_CHR
- eng "Character disallowd in JSON in argument %d to function '%s' at position %d"
+ eng "Character disallowed in JSON in argument %d to function '%s' at position %d"
ER_JSON_EOS
eng "Unexpected end of JSON text in argument %d to function '%s'"
ER_JSON_SYNTAX
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 14963c815a7..fe387ed80f2 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -10714,7 +10714,6 @@ cast_type:
}
| cast_type_numeric { $$= $1; Lex->charset= NULL; }
| cast_type_temporal { $$= $1; Lex->charset= NULL; }
- | JSON_SYM { $$.set(ITEM_CAST_JSON); }
;
cast_type_numeric: