Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit 07e2999

Browse files
committed
Factor out explain switch case to member function
1 parent 520dbe6 commit 07e2999

File tree

2 files changed

+35
-23
lines changed

2 files changed

+35
-23
lines changed

src/include/network/postgres_protocol_handler.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include "common/portal.h"
2424
#include "common/statement.h"
2525
#include "common/statement_cache.h"
26+
#include "traffic_cop/traffic_cop.h"
27+
#include "parser/postgresparser.h"
2628
#include "protocol_handler.h"
2729
#include "traffic_cop/traffic_cop.h"
2830

@@ -161,6 +163,9 @@ class PostgresProtocolHandler : public ProtocolHandler {
161163
/* Execute a Simple query protocol message */
162164
ProcessResult ExecQueryMessage(InputPacket *pkt, const size_t thread_id);
163165

166+
/* Execute a EXPLAIN query message */
167+
ResultType ExecQueryExplain(const std::string& query, parser::ExplainStatement* explain_stmt);
168+
164169
/* Process the PARSE message of the extended query protocol */
165170
void ExecParseMessage(InputPacket *pkt);
166171

src/network/postgres_protocol_handler.cpp

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -223,29 +223,7 @@ ProcessResult PostgresProtocolHandler::ExecQueryMessage(
223223
return ProcessResult::COMPLETE;
224224
};
225225
case QueryType::QUERY_EXPLAIN: {
226-
parser::ExplainStatement *explain_stmt =
227-
static_cast<parser::ExplainStatement *>(sql_stmt.get());
228-
std::unique_ptr<parser::SQLStatementList> unnamed_sql_stmt_list(new parser::SQLStatementList());
229-
unnamed_sql_stmt_list->PassInStatement(
230-
std::move(explain_stmt->real_sql_stmt));
231-
auto stmt = traffic_cop_->PrepareStatement(
232-
"explain", query, std::move(unnamed_sql_stmt_list), error_message);
233-
ResultType status = ResultType::UNKNOWN;
234-
if (stmt) {
235-
traffic_cop_->SetStatement(stmt);
236-
std::vector<std::string> plan_info = StringUtil::Split(
237-
planner::PlanUtil::GetInfo(stmt->GetPlanTree().get()), '\n');
238-
std::vector<FieldInfo> tuple_descriptor = {
239-
traffic_cop_->GetColumnFieldForValueType("Query plan",
240-
type::TypeId::VARCHAR)
241-
};
242-
stmt->SetTupleDescriptor(tuple_descriptor);
243-
traffic_cop_->SetResult(plan_info);
244-
status = ResultType::SUCCESS;
245-
} else {
246-
traffic_cop_->SetErrorMessage(error_message);
247-
status = ResultType::FAILURE;
248-
}
226+
auto status = ExecQueryExplain(query, static_cast<parser::ExplainStatement*>(sql_stmt.get()));
249227
ExecQueryMessageGetResult(status);
250228
return ProcessResult::COMPLETE;
251229
}
@@ -278,6 +256,35 @@ ProcessResult PostgresProtocolHandler::ExecQueryMessage(
278256
}
279257
}
280258

259+
ResultType PostgresProtocolHandler::ExecQueryExplain(
260+
const std::string &query, parser::ExplainStatement* explain_stmt) {
261+
PL_ASSERT(explain_stmt != nullptr);
262+
263+
std::string error_message;
264+
std::unique_ptr<parser::SQLStatementList> unnamed_sql_stmt_list(
265+
new parser::SQLStatementList());
266+
unnamed_sql_stmt_list->PassInStatement(
267+
std::move(explain_stmt->real_sql_stmt));
268+
auto stmt = traffic_cop_->PrepareStatement(
269+
"explain", query, std::move(unnamed_sql_stmt_list), error_message);
270+
ResultType status = ResultType::UNKNOWN;
271+
if (stmt != nullptr) {
272+
traffic_cop_->SetStatement(stmt);
273+
std::vector<std::string> plan_info = StringUtil::Split(
274+
planner::PlanUtil::GetInfo(stmt->GetPlanTree().get()), '\n');
275+
const std::vector<FieldInfo> tuple_descriptor = {
276+
traffic_cop_->GetColumnFieldForValueType("Query plan",
277+
type::TypeId::VARCHAR)};
278+
stmt->SetTupleDescriptor(tuple_descriptor);
279+
traffic_cop_->SetResult(plan_info);
280+
status = ResultType::SUCCESS;
281+
} else {
282+
traffic_cop_->SetErrorMessage(error_message);
283+
status = ResultType::FAILURE;
284+
}
285+
return status;
286+
}
287+
281288
void PostgresProtocolHandler::ExecQueryMessageGetResult(ResultType status) {
282289
std::vector<FieldInfo> tuple_descriptor;
283290
if (status == ResultType::SUCCESS) {

0 commit comments

Comments
 (0)