关于ObExprOperatorFactory::get_internal_info_by_name函数中设置exist和is_internal的理解

在学习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 语句中如果从内部找到了为什么在设置了 existtrue ,还要设置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;
  }