@@ -223,29 +223,7 @@ ProcessResult PostgresProtocolHandler::ExecQueryMessage(
223
223
return ProcessResult::COMPLETE;
224
224
};
225
225
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 ()));
249
227
ExecQueryMessageGetResult (status);
250
228
return ProcessResult::COMPLETE;
251
229
}
@@ -278,6 +256,35 @@ ProcessResult PostgresProtocolHandler::ExecQueryMessage(
278
256
}
279
257
}
280
258
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
+
281
288
void PostgresProtocolHandler::ExecQueryMessageGetResult (ResultType status) {
282
289
std::vector<FieldInfo> tuple_descriptor;
283
290
if (status == ResultType::SUCCESS) {
0 commit comments