1.MySQL中一条SQL执行的整体流程一条包含函数的SQL语句在MySQL中会经历:客户端发送、服务器连接、语法分析、语句执行的过程。调试源码,分析函数的具体执行过程,在客户端执行selectto_char('test')fromdual。跟踪堆栈:pthread_start→handle_one_connection→do_handle_one_connect→do_command→dispatch_command,确定SQL函数的执行入口为dispatch_command,调试跟踪SQL内部执行过程:2.分析SQL函数执行过程中的堆栈信息,并确定SQL函数的主要执行过程为:SQL_PARSE语法分析SQL_RESOLVERprepare准备执行SQL_EXCUTOR具体执行函数SQL_PARSE栈:1To_char_instantiator::instantiate(To_char_instantiator*constthis,THD*thd,PT_item_list*args)(/home/bob/work/percona-server/sql/item_create.cc:785)2(匿名命名空间)::Function_factory::create_func((匿名命名空间)::Function_factory*constthis,THD*thd,LEX_STRINGfunction_name,PT_item_list*item_list)(/home/bob/work/percona-server/sql/item_create.cc:1203)3PTI_function_call_generic_ident_sys::itemize(PTI_function_call_generic_ident_sys*constthis,Parse_context*pc,Item**res)(/home/bob/work/percona-server/sql/parse_tree_items.cc:259)4PTI_expr_with_alias::itemize(PTI_expr_with_alias*constthis,Parse_context*pc,项目**res)(/home/bob/work/percona-server/sql/parse_tree_items.cc:337)5PT_item_list::contextualize(PT_item_list*constthis,Parse_context*pc)(/home/bob/work/percona-server/sql/parse_tree_helpers.h:112)6PT_select_item_list::contextualize(PT_select_item_list*constthis,Parse_context*pc)(/home/bob/work/percona-server/sql/parse_tree_nodes.cc:3813)7PT_query_specification::contextualize(PT_query_specification*constthis,Parse_context*pc)(/home/bob/work/percona-server/sql/parse_tree_nodes.cc:1551)8PT_query_expression::contextualize(PT_query_expression*constthis,Parse_context*pc)(/home/bob/work/percona-server/sql/parse_tree_nodes.cc:4178)9PT_select_stmt::make_cmd(PT_select_stmt*constthis,THD*thd)(/home/bob/work/percona-server/sql/parse_tree_nodes.cc:648)10LEX::make_sql_cmd(LEX*constthis,Parse_tree_root*parse_tree)(/home/bob/work/percona-server/sql/sql_lex.cc:5237)11THD::sql_parser(THD*constthis)(/home/bob/work/percona-server/sql/sql_class.cc:2978)12parse_sql(THD*thd,Parser_state*parser_state,Object_creation_ctx*creation_ctx)(/home/bob/work/percona-server/sql/sql_parse.cc:7333)13dispatch_sql_command(THD*thd,Parser_state*parser_state,boolupdate_userstat)(/home/bob/work/percona-server/sql/sql_parse.cc:5237)14dispatch_command(THD*thd,constCOM_DATA*com_data,enum_server_command命令)(/home/bob/work/percona-server/sql/sql_parse.cc:1978)15do_command(THD*thd)(/home/bob/work/percona-server/sql/sql_parse.cc:1426)16handle_connection(void*arg)(/home/bob/work/percona-server/sql/conn_handler/connection_handler_per_thread.cc:307)17pfs_spawn_thread(void*arg)(/home/bob/work/percona-server/storage/perfschema/pfs.cc:2899)18libpthread.so.0!start_thread(void*arg)(/build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477)19libc.so.6!clone()(/构建/glibc-eX1tMB/glibc-2.31/sysdeps/unix/sysv/linux/x86_64/clone.S:95)SQL_RESOLVER堆栈:1Item_func_to_char::resolve_type(Item_func_to_char*constthis,THD*thd)(/home/bob/work/percona-server/sql/item_timefunc.cc:3821)2Item_func::fix_fields(Item_func*constthis,THD*thd)(/home/bob/work/percona-server/sql/item_func.cc:309)3Item_str_func::fix_fields(Item_str_func*constthis,THD*thd,Item**ref)(/home/bob/work/percona-server/sql/item_strfunc.cc:161)4setup_fields(THD*thd,ulongwant_privilege,boolallow_sum_func,boolsplit_sum_funcs,boolcolumn_update,constmem_root_deque- *typed_items,mem_root_deque
- *字段,Ref_item_arrayref_item_array)(/home/bob/work/percona-server/sql/sql_base.cc:9216)5Query_block::prepare(Query_block*constthis,THD*thd,mem_root_deque
- *insert_field_list)(/home/bo6b/work/percona-server/sql/sql_resolver.cc:275)7Sql_cmd_select::prepare_inner(Sql_cmd_select*constthis,THD*thd)(/home/bob/work/percona-server/sql/sql_select.cc:467)8Sql_cmd_dml::prepare(Sql_cmd_dml*constthis,THD*thd)(/home/bob/work/percona-server/sql/sql_select.cc:389)9Sql_cmd_dml::execute(Sql_cmd_dml*constthis,THD*thd)(/home/bob/work/percona-server/sql/sql_select.cc:522)10mysql_execute_command(THD*thd,boolfirst_level)(/home/bob/work/percona-server/sql/sql_parse.cc:4740)11dispatch_sql_command(THD*thd,Parser_state*parser_state,boolupdate_userstat)(/home/bob/work/percona-server/sql/sql_parse.cc:5337)12dispatch_command(THD*thd,constCOM_DATA*com_data,enum_server_command命令)(/home/bob/work/percona-server/sql/sql_parse.cc:1978)13do_command(THD*thd)(/home/bob/work/percona-server/sql/sql_parse.cc:1426)14handle_connection(void*arg)(/home/bob/work/percona-server/sql/conn_handler/connection_handler_per_thread.cc:307)15pfs_spawn_thread(void*arg)(/home/bob/work/percona-server/storage/perfschema/pfs.cc:2899)16libpthread.so.0!start_thread(void*arg)(/build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477)17libc.so.6!clone()(/build/glibc-eX1tMB/glibc-2.31/sysdeps/unix/sysv/linux/x86_64/clone.S:95)SQL_EXCUTOR堆栈:1Item_func_to_char::val_str(Item_func_to_char*constthis,String*str)(/home/bob/work/percona-server/sql/item_timefunc.cc:3915)2Item::send(Item*constthis,Protocol*protocol,String*buffer)(/home/bob/work/percona-server/sql/item.cc:7025)3THD::send_result_set_row(THD*constthis,constmem_root_deque<项目*>&row_items)(/home/bob/work/percona-server/sql/sql_class.cc:2793)4Query_result_send::send_data(Query_result_send*constthis,THD*thd,constmem_root_deque
- &items)(/home/bob/work/percona-server/sql/query_result.cc:100)5Query_expression::ExecuteIteratorQuery(Query_expression*constthis,THD*thd)(/home/bob/work/percona-server/sql/sql_union.cc:1249)6Query_expression::execute(Query_expression*constthis,THD*thd)(/home/bob/work/percona-server/sql/sql_union.cc:1287)7Sql_cmd_dml::execute_inner(Sql_cmd_dml*constthis,THD*thd)(/home/bob/work/percona-server/sql/sql_select.cc:791)8Sql_cmd_dml::execute(Sql_cmd_dml*constthis,THD*thd)(/home/bob/work/percona-server/sql/sql_select.cc:575)9mysql_execute_command(THD*thd,boolfirst_level)(/home/bob/工作/percona-server/sql/sql_parse.cc:4740)10dispatch_sql_command(THD*thd,Parser_state*parser_state,boolupdate_userstat)(/home/bob/work/percona-server/sql/sql_parse.cc:5337)11dispatch_command(THD*thd,constCOM_DATA*com_data,enum_server_command命令)(/home/bob/work/percona-server/sql/sql_parse.cc:1978)12do_command(THD*thd)(/home/bob/work/percona-服务器/sql/sql_parse.cc:1426)13handle_connection(void*arg)(/home/bob/work/percona-server/sql/conn_handler/connection_handler_per_thread.cc:307)14pfs_spawn_thread(void*arg)(/home/bob/work/percona-server/storage/perfschema/pfs.cc:2899)15libpthread.so.0!start_thread(void*arg)(/build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477)16libc.so.6!clone()(/build/glibc-eX1tMB/glibc-2.31/sysdeps/unix/sysv/linux/x86_64/clone.S:95)SQL_PARSE:SQL解析生成AST语法的语法树,to_char函数,实际上已经解析为Item_func_to_char的语法树节点SQL_RESOLVER:preparationphaseprepare,初始化赋值,比如Item_func_to_char::resolve_type设置函数转换后的数据类型。SQL_EXCUTOR:在执行阶段执行to_char函数,通过Item_func_to_char::val_str处理实际函数。