Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,6 @@
"label": "build_release",
"type": "shell",
"command": "bash build.sh release"
},
{
"label": "gen_parser",
"type": "shell",
"command": "cd ${workspaceFolder}/src/observer/sql/parser && bash gen_parser.sh"
}
]
}
2 changes: 1 addition & 1 deletion docs/docs/db_course_lab/lab2.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ SELECT * FROM tbl1
#### 背景介绍
连接(Join)操作被用来将两个或多个关系表的数据组合起来。

Nested Loop Join(NLJ)算法通过双层循环来输出结果,其中左表为外循环,右表为内循环。目前 MiniOB 中已经实现了 Nested Loop Join 算子(相关实现位于 `src/observer/sql/operator/join_physical_operator.h`)。
Nested Loop Join(NLJ)算法通过双层循环来输出结果,其中左表为外循环,右表为内循环。目前 MiniOB 中已经实现了 Nested Loop Join 算子(相关实现位于 `src/observer/sql/operator/nested_loop_join_physical_operator.h`)。

基于哈希的连接(Hash Join)算法其执行过程分为两个阶段:构建阶段和探测阶段。哈希连接在两个关系表上执行,假设这两个关系表分别为 R 表和 S 表。在构建阶段,会遍历其中一个关系表(通常是基数较小的表,如图中的 R 表),以参与连接的属性列为键在一个哈希表中存储。在探测阶段,会遍历另一个关系表 S 的所有记录,以参与连接的属性列为键在哈希表中探测,当探测到具有相同键的记录则将结果输出。
![hashjoin](images/hashjoin.png)
Expand Down
14 changes: 12 additions & 2 deletions src/observer/net/sql_task_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ See the Mulan PSL v2 for more details. */
RC SqlTaskHandler::handle_event(Communicator *communicator)
{
SessionEvent *event = nullptr;
RC rc = communicator->read_event(event);
RC rc = communicator->read_event(event);
if (OB_FAIL(rc)) {
return rc;
}
Expand All @@ -30,7 +30,7 @@ RC SqlTaskHandler::handle_event(Communicator *communicator)
return RC::SUCCESS;
}

session_stage_.handle_request2(event);
session_stage_.handle_request(event);

SQLStageEvent sql_event(event, event->query());

Expand All @@ -55,6 +55,16 @@ RC SqlTaskHandler::handle_event(Communicator *communicator)
return RC::SUCCESS;
}

/**
* 处理一个SQL语句经历这几个阶段。
* 虽然看起来流程比较多,但是对于大多数SQL来说,更多的可以关注parse和executor阶段。
* 通常只有select、delete等带有查询条件的语句才需要进入optimize。
* 对于DDL语句,比如create table、create index等,没有对应的查询计划,可以直接搜索
* create_table_executor、create_index_executor来看具体的执行代码。
* select、delete等DML语句,会产生一些执行计划,如果感觉繁琐,可以跳过optimize直接看
* execute_stage中的执行,通过explain语句看需要哪些operator,然后找对应的operator来
* 调试或者看代码执行过程即可。
*/
RC SqlTaskHandler::handle_sql(SQLStageEvent *sql_event)
{
RC rc = query_cache_stage_.handle_request(sql_event);
Expand Down
71 changes: 1 addition & 70 deletions src/observer/session/session_stage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,31 +31,7 @@ using namespace common;
// Destructor
SessionStage::~SessionStage() {}

// TODO remove me
void SessionStage::handle_request(SessionEvent *sev)
{
string sql = sev->query();
if (common::is_blank(sql.c_str())) {
return;
}

Session::set_current_session(sev->session());
sev->session()->set_current_request(sev);
SQLStageEvent sql_event(sev, sql);
(void)handle_sql(&sql_event);

Communicator *communicator = sev->get_communicator();
bool need_disconnect = false;
RC rc = communicator->write_result(sev, need_disconnect);
LOG_INFO("write result return %s", strrc(rc));
if (need_disconnect) {
// do nothing
}
sev->session()->set_current_request(nullptr);
Session::set_current_session(nullptr);
}

void SessionStage::handle_request2(SessionEvent *event)
void SessionStage::handle_request(SessionEvent *event)
{
const string &sql = event->query();
if (common::is_blank(sql.c_str())) {
Expand All @@ -66,48 +42,3 @@ void SessionStage::handle_request2(SessionEvent *event)
event->session()->set_current_request(event);
SQLStageEvent sql_event(event, sql);
}

/**
* 处理一个SQL语句经历这几个阶段。
* 虽然看起来流程比较多,但是对于大多数SQL来说,更多的可以关注parse和executor阶段。
* 通常只有select、delete等带有查询条件的语句才需要进入optimize。
* 对于DDL语句,比如create table、create index等,没有对应的查询计划,可以直接搜索
* create_table_executor、create_index_executor来看具体的执行代码。
* select、delete等DML语句,会产生一些执行计划,如果感觉繁琐,可以跳过optimize直接看
* execute_stage中的执行,通过explain语句看需要哪些operator,然后找对应的operator来
* 调试或者看代码执行过程即可。
*/
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::UNIMPLEMENTED && 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;
}
17 changes: 1 addition & 16 deletions src/observer/session/session_stage.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,7 @@ See the Mulan PSL v2 for more details. */

#pragma once

#include "sql/executor/execute_stage.h"
#include "sql/optimizer/optimize_stage.h"
#include "sql/parser/parse_stage.h"
#include "sql/parser/resolve_stage.h"
#include "sql/query_cache/query_cache_stage.h"
class SessionEvent;

/**
* @brief SEDA处理的stage
Expand All @@ -42,17 +38,6 @@ class SessionStage
SessionStage() = default;
virtual ~SessionStage();

public:
void handle_request2(SessionEvent *event);

public:
void handle_request(SessionEvent *event);
RC handle_sql(SQLStageEvent *sql_event);

private:
QueryCacheStage query_cache_stage_;
ParseStage parse_stage_;
ResolveStage resolve_stage_;
OptimizeStage optimize_stage_;
ExecuteStage execute_stage_;
};
133 changes: 0 additions & 133 deletions src/observer/sql/operator/join_physical_operator.cpp

This file was deleted.

53 changes: 0 additions & 53 deletions src/observer/sql/operator/join_physical_operator.h

This file was deleted.

Loading