74 #else //use double as return type (as documentation says)... but tests are failing (adjust doc or tests) 172 #if 0 //anything else should be casted to separator's type (if possible! makes sense to detect incompatible types when detecting/applying signatures?); NOTE: casting affects the order!!! 175 #else //anything else should be left untouched (like in the original code), maybe it will be casted later? 176 #if 0 //it allows group_concat(SET) but it should not! 179 #else //OK to keep the order but it allows cast (n)char -> number and it should not because group_concat(n'123', ', ') should be rejected?! 291 {PT_GENERIC_TYPE_STRING}
540 for (
auto fix_arg :
fix)
560 for (
auto rep_arg :
rep)
580 argument_resolve::argument_resolve ()
582 , m_check_coll_infer (false)
607 auto it_found = std::find_if (sig.
fix.begin (), sig.
fix.end (), find_pred);
608 if (it_found != sig.
fix.end ())
614 it_found = std::find_if (sig.
rep.begin (), sig.
rep.end (), find_pred);
615 return it_found != sig.
rep.end ();
627 switch (arg_sig.
type)
686 return type.
val.
type == type_enum;
751 for (
auto arg = m_node->info.function.arg_list; arg; arg = arg->next, --index)
780 m_best_signature.m_common_collation.codeset,
783 if (new_node !=
NULL)
803 arg->
next = save_next;
811 if (m_node->info.function.is_type_checked)
819 auto func_sigs =
get_signatures (m_node->info.function.function_type);
820 assert (
"ERR no function signature" && func_sigs !=
NULL);
828 if (func_sig ==
NULL || !apply_signature (*func_sig))
836 set_return_type (*func_sig);
843 m_node->info.function.is_type_checked =
true;
850 auto arg_list = m_node->info.function.arg_list;
851 switch (m_node->info.function.function_type)
855 m_node->type_enum = (arg_list) ? arg_list->type_enum :
PT_TYPE_NONE;
859 auto arg1 = m_node->info.function.arg_list;
862 auto arg2 = arg1->next;
888 for (
auto &signature: signatures)
891 if (index < signature.fix.size ())
898 i -= signature.fix.size ();
899 if (signature.rep.size () > 0)
901 i %= signature.rep.size ();
919 size_t arg_count =
static_cast<size_t> (
pt_length_of_list (m_node->info.function.arg_list));
923 for (
auto &sig: signatures)
939 for (
auto &fix: sig.fix)
943 invalid_arg_count_error (arg_count, sig);
951 if (!check_arg_compat (t, arg, sgn_compat, sgn_compat.
m_args_resolve[arg_idx], coerce_args_utf8))
963 if ((arg !=
NULL && sig.rep.size () == 0) || (arg ==
NULL && sig.rep.size () != 0))
966 invalid_arg_count_error (arg_count, sig);
972 for (; arg; arg = arg->
next, index = (index + 1) % sig.rep.size ())
974 auto &rep = sig.rep[
index];
978 if (!check_arg_compat (t, arg, sgn_compat, sgn_compat.
m_args_resolve[arg_idx], coerce_args_utf8))
986 invalid_arg_count_error (arg_count, sig);
993 m_best_signature = std::move (sgn_compat);
999 m_best_signature = sgn_compat;
1002 if (m_best_signature.m_signature !=
NULL)
1007 return m_best_signature.m_signature;
1030 if (arg_node !=
NULL)
1032 m_node->type_enum = arg_node->
type_enum;
1052 switch (m_node->info.function.function_type)
1072 if (m_node->data_type)
1074 m_node->data_type->info.data_type.precision =
1076 m_node->data_type->info.data_type.dec_precision = 0;
1082 if (m_node->data_type)
1102 if (m_node->data_type ==
NULL)
1112 assert (m_node->type_enum == m_node->data_type->type_enum);
1121 if (
PT_HAS_COLLATION (m_node->type_enum) && m_best_signature.m_common_collation.coll_id != -1)
1125 && m_node->data_type !=
NULL)
1131 && m_best_signature.m_common_collation.coll_id != result_coll_infer.
coll_id)
1134 m_best_signature.m_common_collation.coll_id,
1135 m_best_signature.m_common_collation.codeset,
1137 if (new_node !=
NULL)
1154 for (
auto type: signature.
fix)
1162 arg = apply_argument (prev, arg, m_best_signature.m_args_resolve[arg_pos]);
1174 if (arg !=
NULL && signature.
rep.size () == 0)
1182 for (; arg !=
NULL; prev = arg, arg = arg->
next, index = (index + 1) % signature.
rep.size (), ++arg_pos)
1184 arg = apply_argument (prev, arg, m_best_signature.m_args_resolve[arg_pos]);
1221 invalid_arg_error (arg_signature, arg_node, *compat.
m_signature);
1230 invalid_arg_error (arg_signature, arg_node, *compat.
m_signature);
1261 if (string_args_to_utf8)
1285 &common_coll, &common_cs) ==
NO_ERROR)
1368 if (def_type.
val.
type == op_type)
func_all_signatures * get_signatures(FUNC_TYPE ft)
PT_NODE * pt_coerce_node_collation(PARSER_CONTEXT *parser, PT_NODE *node, const int coll_id, const INTL_CODESET codeset, bool force_mode, bool use_collate_modifier, PT_TYPE_ENUM wrap_type_for_maybe, PT_TYPE_ENUM wrap_type_collection)
func_all_signatures sig_ret_double_arg_r_any
func_all_signatures sig_of_elt
func_all_signatures sig_ret_int_arg_doc
func_all_signatures sig_ret_type0_arg_str
func_all_signatures sig_of_lead_lag
func_all_signatures sig_of_regexp_like
bool can_signature_have_collation(const pt_arg_type &arg_sig)
func_all_signatures sig_of_json_length
pt_generic_type_enum generic_type
#define PT_IS_CHAR_STRING_TYPE(t)
TP_DOMAIN * expected_domain
func_all_signatures sig_ret_type0_arg_nr_or_str_discrete
#define MSGCAT_SEMANTIC_NO_VALID_FUNCTION_SIGNATURE
void invalid_arg_error(const pt_arg_type &arg_sgn, const PT_NODE *arg_node, const func_signature &func_sgn)
#define MSGCAT_SEMANTIC_INCOMPATIBLE_SIGNATURE
parser_node * apply_argument(parser_node *prev, parser_node *arg, const argument_resolve &arg_res)
#define MSGCAT_SEMANTIC_COLLATION_OP_ERROR
PT_NODE * pt_get_select_list(PARSER_CONTEXT *parser, PT_NODE *query)
bool cmp_types_equivalent(const pt_arg_type &type, pt_type_enum type_enum)
func_all_signatures sig_of_regexp_substr
std::vector< func_signature > func_all_signatures
PT_NODE * type_checking()
void pt_reset_error(PARSER_CONTEXT *parser)
func_all_signatures sig_of_json_keys
enum pt_type_enum PT_TYPE_ENUM
bool cmp_types_castable(const pt_arg_type &type, pt_type_enum type_enum)
func_all_signatures sig_ret_bigint
func_all_signatures sig_ret_int_arg_str
PT_TYPE_ENUM pt_db_to_type_enum(const DB_TYPE t)
const char * pt_arg_type_to_string_buffer(const pt_arg_type &type, string_buffer &sb)
PT_TYPE_ENUM pt_get_equivalent_type(const PT_ARG_TYPE def_type, const PT_TYPE_ENUM arg_type)
#define PT_IS_LOB_TYPE(t)
bool pt_is_json_doc_type(PT_TYPE_ENUM type)
#define MSGCAT_SEMANTIC_INCOMPATIBLE_ARGUMENT_TYPE
#define PT_IS_DATE_TIME_TYPE(t)
bool pt_is_json_value_type(PT_TYPE_ENUM type)
func_all_signatures sig_ret_string_arg_jdoc
func_all_signatures sig_of_json_objectagg
#define PT_IS_STRING_TYPE(t)
const char * get_types(const func_all_signatures &signatures, size_t index, string_buffer &sb)
func_all_signatures sig_ret_json_arg_jdoc_str_r_jpath
void pt_add_type_to_set(PARSER_CONTEXT *parser, const PT_NODE *typs, PT_NODE **set)
func_all_signatures sig_of_regexp_replace
func_all_signatures sig_ret_json_arg_r_jkey_jval_or_empty
func_all_signatures sig_of_benchmark
func_all_signatures sig_of_json_contains
type_compatibility m_compat
PT_NODE * pt_wrap_with_cast_op(PARSER_CONTEXT *parser, PT_NODE *arg, PT_TYPE_ENUM new_type, int p, int s, PT_NODE *desired_dt)
pt_coll_infer m_coll_infer
func_all_signatures sig_of_ntile
func_all_signatures sig_ret_json_arg_jdoc
func_all_signatures sig_of_regexp_count
func_all_signatures sig_of_sum
func_all_signatures sig_ret_sequence_arg_r_any
PT_FUNCTION_INFO function
enum pt_arg_type::@135 type
#define DB_MAX_VARCHAR_PRECISION
#define DB_MAX_NUMERIC_PRECISION
bool check_arg_compat(const pt_arg_type &arg_signature, const PT_NODE *arg_node, signature_compatibility &compat, argument_resolve &resolved_type, bool args_to_utf8)
std::vector< argument_resolve > m_args_resolve
void invalid_coll_error(const func_signature &func_sgn)
func_all_signatures sig_of_percentile_cont
#define MSGCAT_SEMANTIC_WRONG_ARGS_COUNT
#define MSGCAT_SEMANTIC_NO_SIGNATURES
const char * pt_show_type_enum(PT_TYPE_ENUM t)
#define PT_IS_BIT_STRING_TYPE(t)
pt_coll_infer m_common_collation
#define PT_IS_NATIONAL_CHAR_STRING_TYPE(t)
func_all_signatures sig_json_arg_r_jval_or_empty
#define pt_cat_error(parser, node, setNo, msgNo,...)
signature_compatibility()
func_all_signatures sig_ret_int_no_arg
void to_string_buffer(string_buffer &sb) const
#define PT_IS_DISCRETE_NUMBER_TYPE(t)
func_all_signatures sig_ret_bigint_arg_discrete
TP_DOMAIN_COLL_ACTION m_collation_action
func_all_signatures sig_of_generic
func_all_signatures sig_of_json_search
func_all_signatures sig_ret_set_arg_r_any
func_all_signatures sig_ret_double_arg_number
bool pt_are_equivalent_types(const PT_ARG_TYPE def_type, const PT_TYPE_ENUM op_type)
func_all_signatures sig_of_regexp_instr
const char * get_buffer() const
#define PT_IS_COLLECTION_TYPE(t)
func_all_signatures sig_ret_json_arg_jdoc_r_jdoc
func_all_signatures sig_of_json_contains_path
bool pt_get_collation_info(const PT_NODE *node, PT_COLL_INFER *coll_infer)
func_all_signatures sig_ret_json_arg_jdoc_r_jpath_jval
func_all_signatures sig_ret_type0_arg_scalar
func_all_signatures sig_ret_json_arg_jdoc_jpath
#define PT_IS_SIMPLE_CHAR_STRING_TYPE(t)
func_all_signatures sig_ret_multiset_arg_r_any
const func_signature * m_signature
func_all_signatures sig_of_count_star
const char * fcode_get_lowercase_name(FUNC_TYPE ftype)
PT_COLL_COERC_LEV coerc_level
#define PT_IS_PRIMITIVE_TYPE(t)
#define MSGCAT_SET_PARSER_SEMANTIC
func_all_signatures sig_ret_json_arg_jdoc_r_jpath
PT_NODE * pt_make_prim_data_type(PARSER_CONTEXT *parser, PT_TYPE_ENUM e)
#define PT_HAS_DATE_PART(t)
func_all_signatures sig_of_count
func_all_signatures sig_of_percentile_disc
enum intl_codeset INTL_CODESET
func_all_signatures sig_of_insert_substring
int pt_common_collation(PT_COLL_INFER *arg1_coll_infer, PT_COLL_INFER *arg2_coll_infer, PT_COLL_INFER *arg3_coll_infer, const int args_w_coll, bool op_has_3_args, int *common_coll, INTL_CODESET *common_cs)
#define TP_FLOATING_PRECISION_VALUE
union pt_arg_type::pt_arg_type_val val
bool is_type_with_collation(PT_TYPE_ENUM type)
func_all_signatures sig_ret_int_arg_any
void invalid_arg_count_error(std::size_t arg_count, const func_signature &func_sgn)
#define DB_MAX_VARNCHAR_PRECISION
#define MSGCAT_SEMANTIC_OP_NOT_DEFINED_ON
#define PT_IS_NUMERIC_TYPE(t)
#define pt_has_error(parser)
const func_signature * get_signature(const func_all_signatures &signatures)
#define PT_HAS_COLLATION(t)
parser_node * get_arg(size_t index)
func_all_signatures sig_of_group_concat
int pt_length_of_list(const PT_NODE *list)
func_all_signatures sig_of_median
void set_return_type(const func_signature &signature)
bool sig_has_json_args(const func_signature &sig)
PT_TYPE_ENUM pt_to_variable_size_type(PT_TYPE_ENUM type_enum)
bool apply_signature(const func_signature &signature)
PT_NODE * parser_copy_tree_list(PARSER_CONTEXT *parser, PT_NODE *tree)
const char * fcode_get_uppercase_name(FUNC_TYPE ftype)
func_all_signatures sig_of_json_arrayagg
func_all_signatures sig_of_avg