7373#include " sql/thd_raii.h"
7474#include " sql/thr_malloc.h"
7575#include " template_utils.h" // down_cast
76+ #include " duckdb/common/exception.hpp"
7677
7778class PT_item_list ;
7879
@@ -304,14 +305,18 @@ static bool check_convertible_to_json(const Item *item, int argument_number,
304305*/
305306static bool json_is_valid (Item **args, uint arg_idx, String *value,
306307 const char *func_name, Json_dom_ptr *dom,
307- bool require_str_or_json, bool *valid) {
308+ bool require_str_or_json, bool *valid,
309+ bool caller_is_duckdb = false ) {
308310 Item *const arg_item = args[arg_idx];
309311
310312 enum_field_types field_type = get_normalized_field_type (arg_item);
311313
312314 if (!is_convertible_to_json (arg_item)) {
313315 if (require_str_or_json) {
314316 *valid = false ;
317+ if (caller_is_duckdb) {
318+ throw duckdb::InvalidInputException (" Invalid input in json func" );
319+ }
315320 my_error (ER_INVALID_TYPE_FOR_JSON, MYF (0 ), arg_idx + 1 , func_name);
316321 return true ;
317322 }
@@ -330,7 +335,9 @@ static bool json_is_valid(Item **args, uint arg_idx, String *value,
330335 return !*valid;
331336 } else {
332337 String *const res = arg_item->val_str (value);
333- if (current_thd->is_error ()) return true ;
338+ if (!caller_is_duckdb) {
339+ if (current_thd->is_error ()) return true ;
340+ }
334341
335342 if (arg_item->null_value ) {
336343 *valid = true ;
@@ -340,8 +347,11 @@ static bool json_is_valid(Item **args, uint arg_idx, String *value,
340347 bool parse_error = false ;
341348 const bool failure = parse_json (
342349 *res, dom, require_str_or_json,
343- [&parse_error, arg_idx, func_name](const char *parse_err,
344- size_t err_offset) {
350+ [&parse_error, arg_idx, func_name, caller_is_duckdb](
351+ const char *parse_err, size_t err_offset) {
352+ if (caller_is_duckdb) {
353+ throw duckdb::InvalidInputException (" Invalid input in json func" );
354+ }
345355 my_error (ER_INVALID_JSON_TEXT_IN_PARAM, MYF (0 ), arg_idx + 1 ,
346356 func_name, parse_err, err_offset, " " );
347357 parse_error = true ;
@@ -1084,7 +1094,8 @@ bool json_value(Item *arg, Json_wrapper *result, bool *has_value) {
10841094}
10851095
10861096bool get_json_wrapper (Item **args, uint arg_idx, String *str,
1087- const char *func_name, Json_wrapper *wrapper) {
1097+ const char *func_name, Json_wrapper *wrapper,
1098+ bool caller_is_duckdb) {
10881099 Item *const arg = args[arg_idx];
10891100
10901101 bool has_value;
@@ -1104,10 +1115,14 @@ bool get_json_wrapper(Item **args, uint arg_idx, String *str,
11041115 Json_dom_ptr dom; // @< we'll receive a DOM here from a successful text parse
11051116
11061117 bool valid;
1107- if (json_is_valid (args, arg_idx, str, func_name, &dom, true , &valid))
1118+ if (json_is_valid (args, arg_idx, str, func_name, &dom, true , &valid,
1119+ caller_is_duckdb))
11081120 return true ;
11091121
11101122 if (!valid) {
1123+ if (caller_is_duckdb) {
1124+ throw duckdb::InvalidInputException (" Invalid input in json func" );
1125+ }
11111126 my_error (ER_INVALID_TYPE_FOR_JSON, MYF (0 ), arg_idx + 1 , func_name);
11121127 return true ;
11131128 }
@@ -1743,10 +1758,13 @@ longlong Item_func_json_depth::val_int() {
17431758 Json_wrapper wrapper;
17441759
17451760 try {
1746- if (get_json_wrapper (args, 0 , &m_doc_value, func_name (), &wrapper))
1761+ if (get_json_wrapper (args, 0 , &m_doc_value, func_name (), &wrapper, m_caller_is_duckdb ))
17471762 return error_int ();
17481763 } catch (...) {
17491764 /* purecov: begin inspected */
1765+ if (m_caller_is_duckdb) {
1766+ throw duckdb::InvalidInputException (" Invalid input in json func" );
1767+ }
17501768 handle_std_exception (func_name ());
17511769 return error_int ();
17521770 /* purecov: end */
@@ -3249,7 +3267,7 @@ String *Item_func_json_unquote::val_str(String *str) {
32493267 try {
32503268 if (args[0 ]->data_type () == MYSQL_TYPE_JSON) {
32513269 Json_wrapper wr;
3252- if (get_json_wrapper (args, 0 , str, func_name (), &wr)) {
3270+ if (get_json_wrapper (args, 0 , str, func_name (), &wr, m_caller_is_duckdb )) {
32533271 return error_str ();
32543272 }
32553273
@@ -3260,8 +3278,13 @@ String *Item_func_json_unquote::val_str(String *str) {
32603278
32613279 m_value.length (0 );
32623280
3263- if (wr.to_string (&m_value, false , func_name (),
3264- JsonDocumentDefaultDepthHandler)) {
3281+ if (m_caller_is_duckdb) {
3282+ if (wr.to_string (&m_value, false , func_name (),
3283+ JsonDocumentDefaultDepthHandlerDuckDB)) {
3284+ return error_str ();
3285+ }
3286+ } else if (wr.to_string (&m_value, false , func_name (),
3287+ JsonDocumentDefaultDepthHandler)) {
32653288 return error_str ();
32663289 }
32673290
@@ -3317,6 +3340,7 @@ String *Item_func_json_unquote::val_str(String *str) {
33173340
33183341 Json_dom_ptr dom;
33193342 JsonParseDefaultErrorHandler parse_handler (func_name (), 0 );
3343+ parse_handler.m_caller_is_duckdb = m_caller_is_duckdb;
33203344 if (parse_json (*utf8str, &dom, true , parse_handler,
33213345 JsonDocumentDefaultDepthHandler)) {
33223346 return error_str ();
@@ -3331,6 +3355,9 @@ String *Item_func_json_unquote::val_str(String *str) {
33313355 return error_str (); /* purecov: inspected */
33323356 } catch (...) {
33333357 /* purecov: begin inspected */
3358+ if (m_caller_is_duckdb) {
3359+ throw duckdb::InvalidInputException (" Invalid input in json func" );
3360+ }
33343361 handle_std_exception (func_name ());
33353362 return error_str ();
33363363 /* purecov: end */
@@ -3857,14 +3884,16 @@ longlong Item_func_json_overlaps::val_int() {
38573884 Json_wrapper *doc_b = &wr_b;
38583885
38593886 // arg 0 is the document 1
3860- if (get_json_wrapper (args, 0 , &m_doc_value, func_name (), doc_a) ||
3887+ if (get_json_wrapper (args, 0 , &m_doc_value, func_name (), doc_a,
3888+ m_caller_is_duckdb) ||
38613889 args[0 ]->null_value ) {
38623890 null_value = true ;
38633891 return 0 ;
38643892 }
38653893
38663894 // arg 1 is the document 2
3867- if (get_json_wrapper (args, 1 , &m_doc_value, func_name (), doc_b) ||
3895+ if (get_json_wrapper (args, 1 , &m_doc_value, func_name (), doc_b,
3896+ m_caller_is_duckdb) ||
38683897 args[1 ]->null_value ) {
38693898 null_value = true ;
38703899 return 0 ;
@@ -3913,6 +3942,9 @@ longlong Item_func_json_overlaps::val_int() {
39133942 }
39143943 /* purecov: begin inspected */
39153944 } catch (...) {
3945+ if (m_caller_is_duckdb) {
3946+ throw duckdb::InvalidInputException (" Invalid invalid in json func" );
3947+ }
39163948 handle_std_exception (func_name ());
39173949 return error_int ();
39183950 /* purecov: end */
0 commit comments