@@ -1109,47 +1109,67 @@ void free_result(local_result * result)
11091109
11101110local_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
11361166void 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