在学习ob函数执行流程时,对于func(expr,expr)这样形式的函数会匹配到T_FUN_SYS这个结点进行处理,之后会调用以下函数进行处理:
int ObRawExprResolverImpl::process_fun_sys_node(const ParseNode *node, ObRawExpr *&expr)
之后会通过以下方法创建一个系统函数的表达式:
ctx_.expr_factory_.create_raw_expr(T_FUN_SYS, func_expr)
然后从node中拿到函数名及长度赋予name变量:
ObString name(node->children_[0]->str_len_, node->children_[0]->str_value_);
再通过以下函数检查是否为内置函数:
check_internal_function(name)
在check_internal_function
函数中,会执行以下函数:
ObExprOperatorFactory::get_internal_info_by_name(name, exist, is_internal)
在get_internal_info_by_name
函数中首先会进行一些处理,其次跟据不同的模式进行处理,例如在oracle模式下:
for (uint32_t i = 0; i < ARRAYSIZEOF(NAME_TYPES_ORCL); i++) {
if (NAME_TYPES_ORCL[i].type_ <= T_MIN_OP || NAME_TYPES_ORCL[i].type_ >= T_MAX_OP) {
break;
}
//将op原有的名字转为大写进行匹配
MEMSET(name_buf, 0, OB_MAX_FUNC_EXPR_LENGTH);
strncpy(name_buf, NAME_TYPES_ORCL[i].name_, OB_MAX_FUNC_EXPR_LENGTH);
str_toupper(name_buf);
//暂时不敏感匹配,等大小写机制提上去后更新为strncmp
if (static_cast<int32_t>(strlen(NAME_TYPES_ORCL[i].name_)) == func_name.length()
&& strncasecmp(name_buf, func_name.ptr(), func_name.length()) == 0) { //如果是内部的函数
exist = true;
/* struct NameType
{
const char *name_;
ObExprOperatorType type_;
bool is_internal_;
};
*/
is_internal = NAME_TYPES_ORCL[i].is_internal_; //NAME_TYPES_ORCL数组中的每一个元素都是一个NameType结构
break;
}
}
会有这么一个循环,其中NAME_TYPES_ORCL为1数组每一个元素都为NameType类型大小为T_MAX_OP-T_MIN_OP-1
我的疑惑点是:
1.这里 if
语句作用
if (NAME_TYPES_ORCL[i].type_ <= T_MIN_OP || NAME_TYPES_ORCL[i].type_ >= T_MAX_OP){ break; }
2.在这个 if
语句中如果从内部找到了为什么在设置了 exist
为true
,还要设置is_internal
变量
if (static_cast<int32_t>(strlen(NAME_TYPES_ORCL[i].name_)) == func_name.length()
&& strncasecmp(name_buf, func_name.ptr(), func_name.length()) == 0) { //如果是内部的函数
exist = true;
/* struct NameType
{
const char *name_;
ObExprOperatorType type_;
bool is_internal_;
};
*/
is_internal = NAME_TYPES_ORCL[i].is_internal_; //NAME_TYPES_ORCL数组中的每一个元素都是一个NameType结构
break;
}