MySQL版本5.7.14
代码查看工具:VSCode
安装插件:
Bracket Pair Colorizer 2
C/C++ for Visual Studio Code
Chinese (Simplified) Language Pack for VS Code
Code Runner
ESLint
GitLens
One Dark Pro
Prettier Formatter
Sass
Vetur
vscode-icons
如果是要用VSCode跟代码的话,必须要装C/C++环境,直接按住CTRL + 鼠标右键,就能跳转到对应的代码
第一次跟C++的代码,如果有错误的地方可以指出来,大家一起进步。
暂时先把读代码划分成三个块:语句执行、work执行机制、blong与redo机制,目前暂时先读语句执行部分,其他部分需要C++一些功底,耗时会比较长,暂时不打算深入研究
---------------------------- 开始跟代码----------------------
代码导读:https://blog.csdn.net//article/details/
代码跟踪记录:
sql/conn_handler/connection_handler_manager.cc
Connection_handler_manager::process_new_connection(Channel_info* channel_info)
process_new_connection方法中调用了add_connection方法,我们来找一下该方法中的关键代码
sql/conn_handler/connection_handler_per_thread.cc
bool Per_thread_connection_handler::add_connection(Channel_info* channel_info)
add_connection中调用了handle_connection,而且还是比较容易忽略的地方
------------------------------------------------------------
error= mysql_thread_create(key_thread_one_connection, &id,
&connection_attrib,
handle_connection,
(void*) channel_info);
------------------------------------------------------------
mysql_thread_create的原貌:
#ifdefHAVE_PSI_THREAD_INTERFACE
#definemysql_thread_create(K,P1,P2,P3,P4)\
inline_mysql_thread_create(K, P1, P2, P3, P4)
#else
#definemysql_thread_create(K,P1,P2,P3,P4)\
my_thread_create(P1, P2, P3, P4)
#endif
---------------------------------------------------------
int my_thread_create(my_thread_handle *thread, const my_thread_attr_t *attr, my_start_routine func, void *arg){
struct thread_start_parameter *par;
unsigned int stack_size;
par= (struct thread_start_parameter *)malloc(sizeof(*par));
par->func= func;
thread->handle= (HANDLE)_beginthreadex(NULL, stack_size, win_thread_start,
par, 0, &thread->thread);
}
---------------------------------------------------------
extern "C" void *handle_connection(void *arg)
{
while (thd_connection_alive(thd))
{
if (do_command(thd))
break;
}
}
sql/sql_parse.cc :
相关方法:
-----------------------------
bool do_command(THD *thd)
{
....
rc= thd->get_protocol()->get_command(&com_data, &command);
.......
return_value= dispatch_command(thd, &com_data, command);
thd->get_protocol_classic()->get_packet()->shrink(
thd->variables.net_buffer_length);
.........
}
-------------------------------------
bool dispatch_command(THD *thd, const COM_DATA *com_data, enum enum_server_command command)
dispatch_command关键代码:
switch (command){
caseCOM_INIT_DB:
.....
caseCOM_STMT_EXECUTE:
{
mysqld_stmt_execute(thd, com_data->com_stmt_execute.stmt_id,
com_data->com_stmt_execute.flags,
com_data->com_stmt_execute.params,
com_data->com_stmt_execute.params_length);
break;
}
caseCOM_STMT_FETCH:
{
mysqld_stmt_fetch(thd, com_data->com_stmt_fetch.stmt_id,
com_data->com_stmt_fetch.num_rows);
break;
}
case COM_QUERY:
{
DBUG_ASSERT(thd->m_digest == NULL);
thd->m_digest= & thd->m_digest_state;
thd->m_digest->reset(thd->m_token_array, max_digest_length);
if (alloc_query(thd, com_data->com_query.query,
com_data->com_query.length))
break;// fatal error is set
MYSQL_QUERY_START(const_cast(thd->query().str), thd->thread_id(),
(char *) (thd->db().str ? thd->db().str : ""),
(char *) thd->security_context()->priv_user().str,
(char *) thd->security_context()->host_or_ip().str);
..............
}
然后在下面就会出现语法解析的方法
mysql_parse
语法树解析关键代码:
sql/sql_parse.cc :
void mysql_parse(THD *thd, Parser_state *parser_state){
.................
if (query_cache.send_result_to_client(thd, thd->query()) <= 0)
{
LEX *lex= thd->lex;
const char *found_semicolon;
bool err= thd->get_stmt_da()->is_error();
if (!err)
{
err=parse_sql(thd, parser_state, NULL);
if (!err)
err= invoke_post_parse_rewrite_plugins(thd, false);
found_semicolon= parser_state->m_lip.found_semicolon;
}
.................
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/76020.html