MySQL源码分析之SQL函数执行
- 1.MySQL中执行一条SQL的总体流程
- 2.SQL函数执行过程
1.MySQL中执行一条SQL的总体流程
一条包含函数的SQL语句,在mysql中会经过: 客户端发送,服务器连接,语法解析,语句执行的过程。
调试源码,分析函数的具体执行过程,在客户端,执行select to_char(‘test’) from dual。
跟踪堆栈:pthread_start→handle_one_connection→do_handle_one_connect→do_command→dispatch_command,确定SQL函数的执行入口为dispatch_command
调试跟踪SQL内部执行过程为:

2.SQL函数执行过程
分析堆栈信息,确定SQL函数主要执行过程为:
- SQL_PARSE 语法解析
- SQL_RESOLVER prepare准备执行
- SQL_EXCUTOR 具体执行函数
SQL_PARSE堆栈:
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)
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)
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)
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)
5 PT_item_list::contextualize(PT_item_list * const this, Parse_context * pc) (/home/bob/work/percona-server/sql/parse_tree_helpers.h:112)
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)
7 PT_query_specification::contextualize(PT_query_specification * const this, Parse_context * pc) (/home/bob/work/percona-server/sql/parse_tree_nodes.cc:1551)
8 PT_query_expression::contextualize(PT_query_expression * const this, Parse_context * pc) (/home/bob/work/percona-server/sql/parse_tree_nodes.cc:4178)
9 PT_select_stmt::make_cmd(PT_select_stmt * const this, THD * thd) (/home/bob/work/percona-server/sql/parse_tree_nodes.cc:648)
10 LEX::make_sql_cmd(LEX * const this, Parse_tree_root * parse_tree) (/home/bob/work/percona-server/sql/sql_lex.cc:5237)
11 THD::sql_parser(THD * const this) (/home/bob/work/percona-server/sql/sql_class.cc:2978)
12 parse_sql(THD * thd, Parser_state * parser_state, Object_creation_ctx * creation_ctx) (/home/bob/work/percona-server/sql/sql_parse.cc:7333)
13 dispatch_sql_command(THD * thd, Parser_state * parser_state, bool update_userstat) (/home/bob/work/percona-server/sql/sql_parse.cc:5237)
14 dispatch_command(THD * thd, const COM_DATA * com_data, enum_server_command command) (/home/bob/work/percona-server/sql/sql_parse.cc:1978)
15 do_command(THD * thd) (/home/bob/work/percona-server/sql/sql_parse.cc:1426)
16 handle_connection(void * arg) (/home/bob/work/percona-server/sql/conn_handler/connection_handler_per_thread.cc:307)
17 pfs_spawn_thread(void * arg) (/home/bob/work/percona-server/storage/perfschema/pfs.cc:2899)
18 libpthread.so.0!start_thread(void * arg) (/build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477)
19 libc.so.6!clone() (/build/glibc-eX1tMB/glibc-2.31/sysdeps/unix/sysv/linux/x86_64/clone.S:95)
SQL_RESOLVER堆栈:
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)
2 Item_func::fix_fields(Item_func * const this, THD * thd) (/home/bob/work/percona-server/sql/item_func.cc:309)
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)
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)
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)
7 Sql_cmd_select::prepare_inner(Sql_cmd_select * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:467)
8 Sql_cmd_dml::prepare(Sql_cmd_dml * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:389)
9 Sql_cmd_dml::execute(Sql_cmd_dml * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:522)
10 mysql_execute_command(THD * thd, bool first_level) (/home/bob/work/percona-server/sql/sql_parse.cc:4740)
11 dispatch_sql_command(THD * thd, Parser_state * parser_state, bool update_userstat) (/home/bob/work/percona-server/sql/sql_parse.cc:5337)
12 dispatch_command(THD * thd, const COM_DATA * com_data, enum_server_command command) (/home/bob/work/percona-server/sql/sql_parse.cc:1978)
13 do_command(THD * thd) (/home/bob/work/percona-server/sql/sql_parse.cc:1426)
14 handle_connection(void * arg) (/home/bob/work/percona-server/sql/conn_handler/connection_handler_per_thread.cc:307)
15 pfs_spawn_thread(void * arg) (/home/bob/work/percona-server/storage/perfschema/pfs.cc:2899)
16 libpthread.so.0!start_thread(void * arg) (/build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477)
17 libc.so.6!clone() (/build/glibc-eX1tMB/glibc-2.31/sysdeps/unix/sysv/linux/x86_64/clone.S:95)
SQL_EXCUTOR 堆栈:
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)
2 Item::send(Item * const this, Protocol * protocol, String * buffer) (/home/bob/work/percona-server/sql/item.cc:7025)
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)
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)
5 Query_expression::ExecuteIteratorQuery(Query_expression * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_union.cc:1249)
6 Query_expression::execute(Query_expression * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_union.cc:1287)
7 Sql_cmd_dml::execute_inner(Sql_cmd_dml * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:791)
8 Sql_cmd_dml::execute(Sql_cmd_dml * const this, THD * thd) (/home/bob/work/percona-server/sql/sql_select.cc:575)
9 mysql_execute_command(THD * thd, bool first_level) (/home/bob/work/percona-server/sql/sql_parse.cc:4740)
10 dispatch_sql_command(THD * thd, Parser_state * parser_state, bool update_userstat) (/home/bob/work/percona-server/sql/sql_parse.cc:5337)
11 dispatch_command(THD * thd, const COM_DATA * com_data, enum_server_command command) (/home/bob/work/percona-server/sql/sql_parse.cc:1978)
12 do_command(THD * thd) (/home/bob/work/percona-server/sql/sql_parse.cc:1426)
13 handle_connection(void * arg) (/home/bob/work/percona-server/sql/conn_handler/connection_handler_per_thread.cc:307)
14 pfs_spawn_thread(void * arg) (/home/bob/work/percona-server/storage/perfschema/pfs.cc:2899)
15 libpthread.so.0!start_thread(void * arg) (/build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477)
16 libc.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: 准备阶段prepare,初始化赋值,如Item_func_to_char::resolve_type设定函数转换后的数据类型。
SQL_EXCUTOR: 执行阶段,执行to_char函数功能,通过Item_func_to_char::val_str,实际功能处理过程。
关于 GreatSQL
GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。
GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
欢迎来GreatSQL社区发帖提问
https://greatsql.cn/

技术交流群:
微信:扫码添加
GreatSQL社区助手微信好友,发送验证信息加群。

MySQL源码分析之SQL函数执行的更多相关文章
- MySQL源码分析以及目录结构 2
原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...
- MySQL源码分析以及目录结构
原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...
- mysql源码分析-启动过程
mysql源码分析-启动过程 概要 # sql/mysqld.cc, 不包含psi的初始化过程 mysqld_main: // 加载my.cnf和my.cnf.d,还有命令行参数 if (load_d ...
- angularjs源码分析之:angularjs执行流程
angularjs用了快一个月了,最难的不是代码本身,而是学会怎么用angular的思路思考问题.其中涉及到很多概念,比如:directive,controller,service,compile,l ...
- SequoiaDB 系列之五 :源码分析之main函数
好久好久没有写博客了,因为一直要做各种事,工作上的,生活上的,这一下就是半年. 时光如梭. 这两天回头看了看写的博客,感觉都是贻笑大方. 但是还是想坚持把SequoiaDB系列写完. 初步的打算已经确 ...
- Mysql源码分析--csv存储引擎
一直想分析下mysql的源码,开始的时候不知道从哪下手,先从csv的文件存储开始吧,这个还是比较简单的.我是用的是mysql5.7.16版本的源码. csv源码文件在mysql源码的mysql-5.7 ...
- Appium Android Bootstrap源码分析之命令解析执行
通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在b ...
- jQuery 源码分析(五) map函数 $.map和$.fn.map函数 详解
$.map() 函数用于使用指定函数处理数组中的每个元素(或对象的每个属性),并将处理结果封装为新的数组返回,该函数有三个参数,如下: elems Array/Object类型 指定的需要处理的数组或 ...
- jQuery 源码分析(四) each函数 $.each和$.fn.each方法 详解
$.each一般用来遍历一个数组或对象,$.fn.each()就是指jQuery实例可以执行的操作(因为$.fn是jQuery对象的原型) $.each用来遍历一个数组或对象,并依次执行回掉函数,最后 ...
随机推荐
- Redis初启(一)
1.数据库存存储性能优化 在mysql的文章专题中我写过了关于传统关系型数据库的一些优化思路,整体来说,通过优化之后能够提升程序访问数据库的计算性能.但是还是有一些情况,即便是优化之后,使用传统关系型 ...
- 利用XtraDiagram.DiagramControl进行流程图形的绘制和控制
DevExpress提供了一个比较强大的图形绘制工具,可以用于绘制各种图形,如流程图.组织机构图等等,本篇随笔介绍XtraDiagram.DiagramControl的使用,以及利用代码对其属性进行控 ...
- 关于全栈项目【臻美Chat】https访问 遇到的问题【技术栈:Nodejs】
首先我上线时可以http访问也可以https访问,那么配置如下:nginx.conf user root;worker_processes auto;error_log /var/log/nginx/ ...
- 关于我用python表白成功这件事【表白成功】
520,并非情人所属, 我们可以表白万物, 不管什么时候, 这都是一个特别的日子, 今天,我要表白所有, 心里有我的人! 在这个充满幸福的日子里, 我要把最美好的祝福, 送给心里有我的每一个人: 祝愿 ...
- sql server2016 数据库日志 清空语句
/*1.查询数据库日志文件名称*/--TC_MES_DEV为数据库名--这里的 数据库日志名,可以用以下注释的语句进行查询(_log那个)USE [TC_MES_DEV]GOSELECT file_i ...
- cookie、session、tooken
一.cookie 的诞生 首先需要知道Http协议的无状态连接的,即这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的. 服务端,既不知道上一次请求和这一次请求的关联,也无法知道哪一个客户 ...
- C语言求100以内的和的4种方式
C语言的一个很经典的例子,帮助熟练运行几个循环的写法 * 方法一(do---while语句) #include main () { int i,sum=0; do { sum=sum+i; i++; ...
- win10设置Python程序定时运行(设置计划任务)
今天来设置一下定时执行Pycharm内的脚本: 这个要基于win10 的任务计划程序(设置 > 控制面板 > 系统和安全 > 管理工具 > 任务计划程序) 1. create ...
- myeclipse添加subclipse插件支持subversion1.9
为了安装subclipse插件,费了很多周折,本来我以为直接用eclipse marketplace搜索安装就行,可是由于网络原因,安装不了. 然后下载安装包吧.目前从国内网站上下载不了支持subve ...
- Spring学习笔记(4)Spring 事件原理及其应用
在 JDK 中已经提供相应的自定义事件发布功能的基础类: java.util.EventObject类 :自定义事件类型 java.util.EventListener接口:事件的监听器 首先了解几个 ...