diff options
Diffstat (limited to 'sql/item_jsonfunc.h')
-rw-r--r-- | sql/item_jsonfunc.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/sql/item_jsonfunc.h b/sql/item_jsonfunc.h index 82efddb5a5a..1ba9a70648b 100644 --- a/sql/item_jsonfunc.h +++ b/sql/item_jsonfunc.h @@ -59,7 +59,48 @@ int json_find_overlap_with_array(json_engine_t *js, json_engine_t *value, bool compare_whole); +struct LEX_CSTRING_KEYVALUE +{ + LEX_CSTRING key; + LEX_CSTRING value; + int count= 0; + + static uchar * + get_hash_key(const uchar *data, size_t *len_ret, + my_bool __attribute__((unused))) + { + LEX_CSTRING_KEYVALUE *e= (LEX_CSTRING_KEYVALUE *) data; + *len_ret= e->key.length; + return (uchar *) e->key.str; + } + + static void hash_free(void *ptr) + { + my_free(ptr); + } +}; +bool check_intersect(String *str, json_engine_t *js, + json_engine_t *value, bool compare_whole); +bool json_find_intersect_with_object(String *str, json_engine_t *js, + json_engine_t *value, bool compare_whole); +bool check_unique_key_in_object(json_engine_t *js); +bool json_find_intersect_with_array(String *str, json_engine_t *js, + json_engine_t *value, bool compare_whole); +bool check_unique_key_in_js(json_engine_t *js); +bool get_hash_from_json(json_engine_t *value, HASH &property_hash); +bool get_object_hash_from_json(json_engine_t *value, HASH &property_hash); +bool get_array_hash_from_json(json_engine_t *value, HASH &property_hash); +bool create_kv_pair_and_search_in_hash(LEX_CSTRING_KEYVALUE *&new_entry, + HASH &property_hash, uchar *&search_result, + const uchar *value_start, size_t value_len, + const uchar *key_start, size_t key_len); +bool get_value_from_json(json_engine_t *js, const uchar *&value_start, + size_t &value_len); +bool json_intersect_arr_and_obj(String *str, json_engine_t *js, + json_engine_t *value); +bool json_intersect_between_arrays(String *str, json_engine_t *js, + json_engine_t *value); class Json_engine_scan: public json_engine_t { @@ -791,4 +832,24 @@ public: { return get_item_copy<Item_func_json_overlaps>(thd, this); } }; +class Item_func_json_intersect: public Item_str_func +{ +protected: + String tmp_js1, tmp_js2; +public: + Item_func_json_intersect(THD *thd, Item *a, Item *b): + Item_str_func(thd, a, b) {} + String *val_str(String *) override; + bool fix_length_and_dec(THD *thd) override; + LEX_CSTRING func_name_cstring() const override + { + static LEX_CSTRING name= {STRING_WITH_LEN("json_intersect") }; + return name; + } + Item *get_copy(THD *thd) override + { return get_item_copy<Item_func_json_intersect>(thd, this); } +}; + + + #endif /* ITEM_JSONFUNC_INCLUDED */ |