【 使用环境 】测试环境
【 使用版本 】obproxy 4.1
【问题描述】obproxy执行语句报错
语句
ALTER PROXYCONFIG SET fetch_proxy_bin_random_time='300s'
报错
ERROR 1064 (0B000): Failed to init SQL parser
【附件及日志】
obproxy报错日志
[2024-01-26 08:03:44.300401] WARN [PROXY] obparse (ob_proxy_parser.h:167) [79031][Y0-00007FFF8D4D0FF0] [lt=3] [dc=0] failed to do obparse(sql_string=replace into proxy_config(vid, vip, vport, cluster_name, tenant_name, name, value, config_level) values(-1, '', 0, '', '', 'fetch_proxy_bin_random_time', '300s', 'LEVEL_GLOBAL');, ret=-5000)
[2024-01-26 08:03:44.300445] WARN [PROXY] execute (ob_config_processor.cpp:284) [79031][Y0-00007FFF8D4D0FF0] [lt=43] [dc=0] fail to parse sql(sql=replace into proxy_config(vid, vip, vport, cluster_name, tenant_name, name, value, config_level) values(-1, '', 0, '', '', 'fetch_proxy_bin_random_time', '300s', 'LEVEL_GLOBAL'), ret=-5000)
[2024-01-26 08:03:44.300473] WARN [PROXY] store_proxy_config_with_level (ob_config_processor.cpp:655) [79031][Y0-00007FFF8D4D0FF0] [lt=8] [dc=0] execute sql failed(ret=-5000)
[2024-01-26 08:03:44.300489] WARN [PROXY] store_global_proxy_config (ob_config_processor.cpp:672) [79031][Y0-00007FFF8D4D0FF0] [lt=13] [dc=0] store_proxy_config_with_level failed(ret=-5000)
[
代码定位
oceanbase::sql::ObSQLParser sql_parser(*(oceanbase::common::ObIAllocator *)(parse_result.malloc_pool_),
parse_result.sql_mode_);
if (OB_FAIL(sql_parser.parse(ob.ptr(), ob.length(), parse_result))) {
PROXY_LOG(WARN, "failed to do obparse",K(ob), K(sql_string), K(ret));
} else {
PROXY_LOG(DEBUG, "obparse succ", K(sql_string), K(ret));
}
}
错误发生在sql_parser.parse方法中,看了下是个对应的.a文件,然后在oceanbase侧查找对应代码
oceanbase代码
int ObSQLParser::parse(const char * str_ptr, const int64_t str_len, ParseResult &result)
{
int ret = OB_SUCCESS;
#ifndef SQL_PARSER_COMPILATION
// proxy don't need this, only for observer
ObActiveSessionGuard::get_stat().in_parse_ = true;
#endif
if (0 != parse_init(&result)) {
ret = OB_ERR_PARSER_INIT;
} else {
ret = parse_sql(&result, str_ptr, static_cast<size_t>(str_len));
}```
应该是初始化错误导致的,然后再往里看
int parse_init(ParseResult *p)
{
int ret = 0; // can not include C++ file “ob_define.h”
static thread char error_msg[MAX_ERROR_MSG] = {’\0’};
p->error_msg = error_msg;
if (OB_UNLIKELY(NULL == p || NULL == p->malloc_pool)) {
ret = -1;
if (NULL != p) {
(void)snprintf(p->error_msg_, MAX_ERROR_MSG, “malloc_pool_ must be set”);
}
}
if (OB_LIKELY( 0 == ret)) {
ret = obsql_mysql_yylex_init_extra(p, &(p->yyscan_info_));
}
return ret;
}
排除p->malloc_pool_的情况,对应方法obsql_mysql_yylex_init_extra是个yacc部分代码,这部分如何排查或者debug.或者我排查的逻辑是否存在问题,应该是什么问题导致的