一条SQL语句的处理过程
RC SessionStage :: handle_sql ( SQLStageEvent * sql_event)
{ RC rc = query_cache_stage_. handle_request ( sql_event) ; if ( OB_FAIL ( rc) ) { LOG_TRACE ( "failed to do query cache. rc=%s" , strrc ( rc) ) ; return rc; } rc = parse_stage_. handle_request ( sql_event) ; if ( OB_FAIL ( rc) ) { LOG_TRACE ( "failed to do parse. rc=%s" , strrc ( rc) ) ; return rc; } rc = resolve_stage_. handle_request ( sql_event) ; if ( OB_FAIL ( rc) ) { LOG_TRACE ( "failed to do resolve. rc=%s" , strrc ( rc) ) ; return rc; } rc = optimize_stage_. handle_request ( sql_event) ; if ( rc != RC:: UNIMPLENMENT && rc != RC:: SUCCESS) { LOG_TRACE ( "failed to do optimize. rc=%s" , strrc ( rc) ) ; return rc; } rc = execute_stage_. handle_request ( sql_event) ; if ( OB_FAIL ( rc) ) { LOG_TRACE ( "failed to do execute. rc=%s" , strrc ( rc) ) ; return rc; } return rc;
}
SQL执行
RC CommandExecutor :: execute ( SQLStageEvent * sql_event)
{ Stmt * stmt = sql_event-> stmt ( ) ; switch ( stmt-> type ( ) ) { case StmtType:: CREATE_INDEX: { CreateIndexExecutor executor; return executor. execute ( sql_event) ; } break ; case StmtType:: CREATE_TABLE: { CreateTableExecutor executor; return executor. execute ( sql_event) ; } break ; case StmtType:: DESC_TABLE: { DescTableExecutor executor; return executor. execute ( sql_event) ; } case StmtType:: HELP: { HelpExecutor executor; return executor. execute ( sql_event) ; } case StmtType:: SHOW_TABLES: { ShowTablesExecutor executor; return executor. execute ( sql_event) ; } case StmtType:: BEGIN: { TrxBeginExecutor executor; return executor. execute ( sql_event) ; } case StmtType:: COMMIT: case StmtType:: ROLLBACK: { TrxEndExecutor executor; return executor. execute ( sql_event) ; } case StmtType:: SET_VARIABLE: { SetVariableExecutor executor; return executor. execute ( sql_event) ; } case StmtType:: LOAD_DATA: { LoadDataExecutor executor; return executor. execute ( sql_event) ; } case StmtType:: EXIT: { return RC:: SUCCESS; } default : { LOG_ERROR ( "unknown command: %d" , static_cast < int > ( stmt-> type ( ) ) ) ; return RC:: UNIMPLENMENT; } } return RC:: INTERNAL;
}