|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +categories: [MySQL] |
| 4 | +description: none |
| 5 | +keywords: MySQL |
| 6 | +--- |
| 7 | +# MySQL数据SQL函数执行 |
| 8 | + |
| 9 | +## MySQL中执行一条SQL的总体流程 |
| 10 | +一条包含函数的SQL语句,在mysql中会经过: 客户端发送,服务器连接,语法解析,语句执行的过程。 |
| 11 | + |
| 12 | +调试源码,分析函数的具体执行过程,在客户端,执行select to_char(‘test’) from dual。 |
| 13 | + |
| 14 | +跟踪堆栈:pthread_start→handle_one_connection→do_handle_one_connect→do_command→dispatch_command,确定SQL函数的执行入口为dispatch_command |
| 15 | + |
| 16 | +调试跟踪SQL内部执行过程为: |
| 17 | + |
| 18 | +## SQL函数执行过程 |
| 19 | +析堆栈信息,确定SQL函数主要执行过程为: |
| 20 | + |
| 21 | +SQL_PARSE 语法解析 |
| 22 | +SQL_RESOLVER prepare准备执行 |
| 23 | +SQL_EXCUTOR 具体执行函数 |
| 24 | +SQL_PARSE堆栈: |
| 25 | +``` |
| 26 | +1 To_char_instantiator::instantiate(To_char_instantiator * const this, THD * thd, PT_item_list * args) (/home/bob/work/percona-server/sql/item_create.cc:785) |
| 27 | +2 (anonymous namespace)::Function_factory<To_char_instantiator>::create_func((anonymous namespace)::Function_factory<To_char_instantiator> * const this, THD * thd, LEX_STRING function_name, PT_item_list * item_list) (/home/bob/work/percona-server/sql/item_create.cc:1203) |
| 28 | +3 PTI_function_call_generic_ident_sys::itemize(PTI_function_call_generic_ident_sys * const this, Parse_context * pc, Item ** res) (/home/bob/work/percona-server/sql/parse_tree_items.cc:259) |
| 29 | +4 PTI_expr_with_alias::itemize(PTI_expr_with_alias * const this, Parse_context * pc, Item ** res) (/home/bob/work/percona-server/sql/parse_tree_items.cc:337) |
| 30 | +5 PT_item_list::contextualize(PT_item_list * const this, Parse_context * pc) (/home/bob/work/percona-server/sql/parse_tree_helpers.h:112) |
| 31 | +6 PT_select_item_list::contextualize(PT_select_item_list * const this, Parse_context * pc) (/home/bob/work/percona-server/sql/parse_tree_nodes.cc:3813) |
| 32 | +7 PT_query_specification::contextualize(PT_query_specification * const this, Parse_context * pc) (/home/bob/work/percona-server/sql/parse_tree_nodes.cc:1551) |
| 33 | +8 PT_query_expression::contextualize(PT_query_expression * const this, Parse_context * pc) (/home/bob/work/percona-server/sql/parse_tree_nodes.cc:4178) |
| 34 | +9 PT_select_stmt::make_cmd(PT_select_stmt * const this, THD * thd) (/home/bob/work/percona-server/sql/parse_tree_nodes.cc:648) |
| 35 | +10 LEX::make_sql_cmd(LEX * const this, Parse_tree_root * parse_tree) (/home/bob/work/percona-server/sql/sql_lex.cc:5237) |
| 36 | +11 THD::sql_parser(THD * const this) (/home/bob/work/percona-server/sql/sql_class.cc:2978) |
| 37 | +12 parse_sql(THD * thd, Parser_state * parser_state, Object_creation_ctx * creation_ctx) (/home/bob/work/percona-server/sql/sql_parse.cc:7333) |
| 38 | +13 dispatch_sql_command(THD * thd, Parser_state * parser_state, bool update_userstat) (/home/bob/work/percona-server/sql/sql_parse.cc:5237) |
| 39 | +14 dispatch_command(THD * thd, const COM_DATA * com_data, enum_server_command command) (/home/bob/work/percona-server/sql/sql_parse.cc:1978) |
| 40 | +15 do_command(THD * thd) (/home/bob/work/percona-server/sql/sql_parse.cc:1426) |
| 41 | +16 handle_connection(void * arg) (/home/bob/work/percona-server/sql/conn_handler/connection_handler_per_thread.cc:307) |
| 42 | +17 pfs_spawn_thread(void * arg) (/home/bob/work/percona-server/storage/perfschema/pfs.cc:2899) |
| 43 | +18 libpthread.so.0!start_thread(void * arg) (/build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477) |
| 44 | +19 libc.so.6!clone() (/build/glibc-eX1tMB/glibc-2.31/sysdeps/unix/sysv/linux/x86_64/clone.S:95) |
| 45 | +``` |
| 46 | + |
| 47 | +SQL_RESOLVER堆栈: |
| 48 | +``` |
| 49 | +1 Item_func_to_char::resolve_type(Item_func_to_char * const this, THD * thd) (/home/bob/work/percona-server/sql/item_timefunc.cc:3821) |
| 50 | +2 Item_func::fix_fields(Item_func * const this, THD * thd) (/home/bob/work/percona-server/sql/item_func.cc:309) |
| 51 | +3 Item_str_func::fix_fields(Item_str_func * const this, THD * thd, Item ** ref) (/home/bob/work/percona-server/sql/item_strfunc.cc:161) |
| 52 | +4 setup_fields(THD * thd, ulong want_privilege, bool allow_sum_func, bool split_sum_funcs, bool column_update, const mem_root_deque<Item*> * typed_items, mem_root_deque<Item*> * fields, Ref_item_array ref_item_array) (/home/bob/work/percona-server/sql/sql_base.cc:9216) |
| 53 | +5 Query_block::prepare(Query_block * const this, THD * thd, mem_root_deque<Item*> * insert_field_list) (/home/bo6 b/work/percona-server/sql/sql_resolver.cc:275) |
| 54 | +7 Sql_cmd_select::prepare_inner(Sql_cmd_select * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:467) |
| 55 | +8 Sql_cmd_dml::prepare(Sql_cmd_dml * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:389) |
| 56 | +9 Sql_cmd_dml::execute(Sql_cmd_dml * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:522) |
| 57 | +10 mysql_execute_command(THD * thd, bool first_level) (/home/bob/work/percona-server/sql/sql_parse.cc:4740) |
| 58 | +11 dispatch_sql_command(THD * thd, Parser_state * parser_state, bool update_userstat) (/home/bob/work/percona-server/sql/sql_parse.cc:5337) |
| 59 | +12 dispatch_command(THD * thd, const COM_DATA * com_data, enum_server_command command) (/home/bob/work/percona-server/sql/sql_parse.cc:1978) |
| 60 | +13 do_command(THD * thd) (/home/bob/work/percona-server/sql/sql_parse.cc:1426) |
| 61 | +14 handle_connection(void * arg) (/home/bob/work/percona-server/sql/conn_handler/connection_handler_per_thread.cc:307) |
| 62 | +15 pfs_spawn_thread(void * arg) (/home/bob/work/percona-server/storage/perfschema/pfs.cc:2899) |
| 63 | +16 libpthread.so.0!start_thread(void * arg) (/build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477) |
| 64 | +17 libc.so.6!clone() (/build/glibc-eX1tMB/glibc-2.31/sysdeps/unix/sysv/linux/x86_64/clone.S:95) |
| 65 | +``` |
| 66 | +SQL_EXCUTOR 堆栈: |
| 67 | +``` |
| 68 | +1 Item_func_to_char::val_str(Item_func_to_char * const this, String * str) (/home/bob/work/percona-server/sql/item_timefunc.cc:3915) |
| 69 | +2 Item::send(Item * const this, Protocol * protocol, String * buffer) (/home/bob/work/percona-server/sql/item.cc:7025) |
| 70 | +3 THD::send_result_set_row(THD * const this, const mem_root_deque<Item*> & row_items) (/home/bob/work/percona-server/sql/sql_class.cc:2793) |
| 71 | +4 Query_result_send::send_data(Query_result_send * const this, THD * thd, const mem_root_deque<Item*> & items) (/home/bob/work/percona-server/sql/query_result.cc:100) |
| 72 | +5 Query_expression::ExecuteIteratorQuery(Query_expression * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_union.cc:1249) |
| 73 | +6 Query_expression::execute(Query_expression * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_union.cc:1287) |
| 74 | +7 Sql_cmd_dml::execute_inner(Sql_cmd_dml * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:791) |
| 75 | +8 Sql_cmd_dml::execute(Sql_cmd_dml * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:575) |
| 76 | +9 mysql_execute_command(THD * thd, bool first_level) (/home/bob/work/percona-server/sql/sql_parse.cc:4740) |
| 77 | +10 dispatch_sql_command(THD * thd, Parser_state * parser_state, bool update_userstat) (/home/bob/work/percona-server/sql/sql_parse.cc:5337) |
| 78 | +11 dispatch_command(THD * thd, const COM_DATA * com_data, enum_server_command command) (/home/bob/work/percona-server/sql/sql_parse.cc:1978) |
| 79 | +12 do_command(THD * thd) (/home/bob/work/percona-server/sql/sql_parse.cc:1426) |
| 80 | +13 handle_connection(void * arg) (/home/bob/work/percona-server/sql/conn_handler/connection_handler_per_thread.cc:307) |
| 81 | +14 pfs_spawn_thread(void * arg) (/home/bob/work/percona-server/storage/perfschema/pfs.cc:2899) |
| 82 | +15 libpthread.so.0!start_thread(void * arg) (/build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477) |
| 83 | +16 libc.so.6!clone() (/build/glibc-eX1tMB/glibc-2.31/sysdeps/unix/sysv/linux/x86_64/clone.S:95) |
| 84 | +``` |
| 85 | +SQL_PARSE: SQL解析生成AST语法的语法树,to_char函数,实际中已解析为Item_func_to_char的语法树节点。 |
| 86 | + |
| 87 | +SQL_RESOLVER: 准备阶段prepare,初始化赋值,如Item_func_to_char::resolve_type设定函数转换后的数据类型。 |
| 88 | + |
| 89 | +SQL_EXCUTOR: 执行阶段,执行to_char函数功能,通过Item_func_to_char::val_str,实际功能处理过程。 |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | + |
| 94 | + |
| 95 | + |
| 96 | + |
| 97 | + |
| 98 | + |
| 99 | + |
| 100 | + |
| 101 | + |
| 102 | + |
| 103 | + |
| 104 | + |
| 105 | + |
0 commit comments