Skip to content

Commit 447cc6e

Browse files
committed
Fix query_stable_v2 might return nullptr
1 parent 24bf410 commit 447cc6e

File tree

1 file changed

+47
-27
lines changed

1 file changed

+47
-27
lines changed

programs/local/LocalServer.cpp

Lines changed: 47 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,47 +1109,67 @@ void free_result(local_result * result)
11091109

11101110
local_result_v2 * query_stable_v2(int argc, char ** argv)
11111111
{
1112-
auto result = pyEntryClickHouseLocal(argc, argv);
1113-
if (result->buf_ == nullptr) {
1114-
return nullptr;
1115-
}
1116-
1117-
local_result_v2 * res = new local_result_v2;
1118-
if (result->error_msg_.empty())
1112+
auto * res = new local_result_v2{};
1113+
// pyEntryClickHouseLocal may throw some serious exceptions, although it's not likely
1114+
// to happen in the context of clickhouse-local. we catch them here and return an error
1115+
try
11191116
{
1120-
res->len = result->buf_->size();
1121-
res->buf = result->buf_->data();
1122-
res->_vec = result->buf_;
1117+
auto result = pyEntryClickHouseLocal(argc, argv);
1118+
// Directly assign common fields to reduce code duplication.
11231119
res->rows_read = result->rows_;
11241120
res->bytes_read = result->bytes_;
11251121
res->elapsed = result->elapsed_;
1126-
res->error_message = nullptr;
1127-
} else {
1128-
res->error_message = new char[result->error_msg_.size() + 1];
1129-
memcpy(res->error_message, result->error_msg_.c_str(), result->error_msg_.size() + 1);
1122+
1123+
if (!result->error_msg_.empty())
1124+
{
1125+
// Handle scenario with an error message
1126+
res->error_message = new char[result->error_msg_.size() + 1];
1127+
memcpy(res->error_message, result->error_msg_.c_str(), result->error_msg_.size() + 1);
1128+
res->len = 0;
1129+
res->buf = nullptr;
1130+
res->_vec = nullptr;
1131+
}
1132+
else if (result->buf_ == nullptr)
1133+
{
1134+
// Handle scenario where result is empty and there's no error
1135+
res->len = 0;
1136+
res->buf = nullptr;
1137+
res->_vec = nullptr;
1138+
}
1139+
else
1140+
{
1141+
// Handle successful data retrieval scenario
1142+
res->len = result->buf_->size();
1143+
res->buf = result->buf_->data();
1144+
res->_vec = new std::vector<char>(*result->buf_);
1145+
}
1146+
}
1147+
catch (const std::exception & e)
1148+
{
1149+
res->error_message = new char[strlen(e.what()) + 1];
1150+
strcpy(res->error_message, e.what());
1151+
res->len = 0;
1152+
res->buf = nullptr;
11301153
res->_vec = nullptr;
1154+
}
1155+
catch (...)
1156+
{
1157+
res->error_message = new char[20];
1158+
strcpy(res->error_message, "Unknown exception");
1159+
res->len = 0;
11311160
res->buf = nullptr;
1161+
res->_vec = nullptr;
11321162
}
11331163
return res;
11341164
}
11351165

11361166
void free_result_v2(local_result_v2 * result)
11371167
{
11381168
if (!result)
1139-
{
11401169
return;
1141-
}
1142-
if (result->_vec)
1143-
{
1144-
std::vector<char> * vec = reinterpret_cast<std::vector<char> *>(result->_vec);
1145-
delete vec;
1146-
result->_vec = nullptr;
1147-
}
1148-
if (result->error_message)
1149-
{
1150-
delete[] result->error_message;
1151-
result->error_message = nullptr;
1152-
}
1170+
1171+
delete reinterpret_cast<std::vector<char> *>(result->_vec);
1172+
delete[] result->error_message;
11531173
delete result;
11541174
}
11551175

0 commit comments

Comments
 (0)