1.sql_parse.cc
(1)bool all_tables_not_ok(THD *thd, TABLE_LIST *tables):返回值为true时表明所有表都未准备好,应该忽略。
(2)bool check_database_filters(THD *thd, const char* db, enum_sql_command sql_cmd) :使用此函数时,replicate_ignore_db和replicate_do_db优先于wlid_do规则执行。返回true时表明不应该从执行操作中筛选出查询操作。(在主从同步的环境中,replicate-ignore-db和replicate-do-db会使主服务器上发生的表更新在从服务器上不被执行,replicate-wlid-do-db会保持主从服务器的更新)
(3)bool some_non_temp_table_to_be_updated(THD *thd, TABLE_LIST *tables):返回1时更新非临时表。
(4)bool stmt_causes_implicit_commit(const THD *thd, uint mask):根据语句的要求判断是否隐式提交事务要求。
(5)void init_update_queries(void):创建一个命令数组,将不同的更新表的命令设置为不同的初始动作。
(6)bool do_command(THD *thd):从连接中读一个命令并执行(在线程中重复调用)其中调用dispatch_command()函数。
(7)static my_bool deny_updates_if_read_only_option(THD *thd,TABLE_LIST *all_tables) :mysql_execute_command()函数的辅助函数,用来决定处于只读模式下时是否执行更新命令,对于非临时表的更新选择执行,临时表的更新不执行。
(8)static inline bool is_timer_applicable_to_statement(THD *thd)、static inline ulong get_max_execution_time(THD *thd)、static inline bool set_statement_timer(THD *thd)、void reset_statement_timer(THD *thd)与当前线程的时间有关。
(9)bool dispatch_command(THD *thd, const COM_DATA *com_data, enum enum_server_command command):执行不同类型的命令。对于query,主要看case COM_QUERY部分:alloc_query()(从连接中读取命令保存到thd->query中)-> MYSQL_QUERY_START()(dtrace开始,用于实时跟踪mysql)-> PSI开始,用于实时记录数据库操作 -> thd->profiling.set_query_source()分配资源-> parser_state.init()初始化解析器-> mysql_parse()生成解析树。
(10)bool shutdown(THD *thd, enum mysql_enum_shutdown_level level, enum enum_server_command command):关闭mysqld连接。
(11)bool alloc_query(THD *thd, const char *packet, size_t packet_length):
(12)int mysql_execute_command(THD *thd, bool first_level):执行解析后保存在lex->sql_command中的命令。其中LEX *const lex= thd->lex使得lex中保存解析后的语法树;all_tables保存查询中需要的所有表。case SQLCOM_SELECT表明当命令是select时应该执行的操作:select_precheck(thd, lex, all_tables, first_table) -> execute_sqlcom_select(thd, all_tables);
(13)static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables):获取解析树中的结果部分:Query_result *result= lex->result -> res= handle_query(thd, lex, result, 0, 0) -> MYSQL_SELECT_DONE((int) res, (ulong) thd->current_found_rows)。
(14)void mysql_parse(THD *thd, Parser_state *parser_state):首先查看query_cache中有没有缓存的query,如果没有,初始化解析树的语法。首先初始化,为后续检查cache做准备mysql_reset_thd_for_next_command(thd)、lex_start(thd) -> 当query_cache没有命中时解析sql语句 parse_sql(thd, parser_state, NULL) -> MYSQL_QUERY_EXEC_START( const_cast<char*>(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,0); -> mysql_execute_command(thd, true); -> MYSQL_QUERY_EXEC_DONE(error)。
(15)bool st_select_lex::init_nested_join(THD *thd)、TABLE_LIST *st_select_lex::end_nested_join(THD *thd)、TABLE_LIST *st_select_lex::nest_last_join(THD *thd):嵌套连接
(16)bool st_select_lex_unit::add_fake_select_lex(THD *thd_arg):用于select......order by语句;void add_join_on(TABLE_LIST *b, Item *expr):用于join......on语句;
(17)bool parse_sql(THD *thd,Parser_state *parser_state,Object_creation_ctx *creation_ctx):其中调用了sql_yacc.cc中的MYSQLparse()函数,并进入这个函数具体解析sql语句。
(18)const CHARSET_INFO* merge_charset_and_collation(const CHARSET_INFO *cs, const CHARSET_INFO *cl):用于CHARACTER SET cs [ COLLATE cl ]语句。
2.sql_select.cc
(1)bool handle_query(THD *thd, LEX *lex, Query_result *result,ulonglong added_options, ulonglong removed_options):处理数据查询操作,针对select、insert......select、replace......select、update和delete语句,返回false表示成功。进入这个函数处理查询包括五个步骤:准备、锁表、优化、执行查询计划和清除。unit->set_prepared() -> lock_tables()-> select->optimize(thd) -> lex->is_explain()
(2)bool types_allow_materialization(Item *outer, Item *inner):当执行嵌套查询时,判断外层查询结果和内层查询结果类型是否一致。
(3)bool JOIN::prepare_result():在执行或描述join之前准备join的结果。
(4)bool SELECT_LEX::optimize(THD *thd):主要调用join->optimize()函数优化join。