11#include " LocalServer.h"
22#include " chdb.h"
3+ #include " query_result.h"
34
45#include < sys/resource.h>
56#include < Common/logger_useful.h>
5253#include < boost/program_options/options_description.hpp>
5354#include < base/argsToConfig.h>
5455#include < filesystem>
56+ #include < memory>
5557
5658#if defined(FUZZING_MODE)
5759 #include < Functions/getFuzzerData.h>
@@ -536,14 +538,16 @@ catch (const DB::Exception & e)
536538 cleanup ();
537539
538540 bool need_print_stack_trace = config ().getBool (" stacktrace" , false );
539- std::cerr << getExceptionMessage (e, need_print_stack_trace, true ) << std::endl;
541+ // std::cerr << getExceptionMessage(e, need_print_stack_trace, true) << std::endl;
542+ error_message_oss << getExceptionMessage (e, need_print_stack_trace, true );
540543 return e.code () ? e.code () : -1 ;
541544}
542545catch (...)
543546{
544547 cleanup ();
545548
546- std::cerr << getCurrentExceptionMessage (false ) << std::endl;
549+ // std::cerr << getCurrentExceptionMessage(false) << std::endl;
550+ error_message_oss << getCurrentExceptionMessage (false );
547551 return getCurrentExceptionCode ();
548552}
549553
@@ -933,14 +937,6 @@ void LocalServer::readArguments(int argc, char ** argv, Arguments & common_argum
933937// }
934938// }
935939
936- class query_result_
937- {
938- public:
939- uint64_t rows;
940- uint64_t bytes;
941- double elapsed;
942- std::vector<char > * buf;
943- };
944940
945941std::unique_ptr<query_result_> pyEntryClickHouseLocal (int argc, char ** argv)
946942{
@@ -949,20 +945,14 @@ std::unique_ptr<query_result_> pyEntryClickHouseLocal(int argc, char ** argv)
949945 DB::LocalServer app;
950946 app.init (argc, argv);
951947 int ret = app.run ();
952- if (ret == 0 )
953- {
954- auto result = std::make_unique<query_result_>();
955- result->buf = app.getQueryOutputVector ();
956- result->rows = app.getProcessedRows ();
957- result->bytes = app.getProcessedBytes ();
958- result->elapsed = app.getElapsedTime ();
959-
960- // std::cerr << std::string(out->begin(), out->end()) << std::endl;
961- return result;
962- }
963- else
964- {
965- return nullptr ;
948+ if (ret == 0 ) {
949+ return std::make_unique<query_result_>(
950+ app.getQueryOutputVector (),
951+ app.getProcessedRows (),
952+ app.getProcessedBytes (),
953+ app.getElapsedTime ());
954+ } else {
955+ return std::make_unique<query_result_>(app.get_error_msg ());
966956 }
967957 }
968958 catch (const DB::Exception & e)
@@ -984,29 +974,23 @@ std::unique_ptr<query_result_> pyEntryClickHouseLocal(int argc, char ** argv)
984974local_result * query_stable (int argc, char ** argv)
985975{
986976 auto result = pyEntryClickHouseLocal (argc, argv);
987- if (!result || !result-> buf )
977+ if (!result)
988978 {
989979 return nullptr ;
990980 }
991981 local_result * res = new local_result;
992- res->len = result->buf ->size ();
993- res->buf = result->buf ->data ();
994- res->_vec = result->buf ;
995- res->rows_read = result->rows ;
996- res->bytes_read = result->bytes ;
997- res->elapsed = result->elapsed ;
982+ res->result_ = result.release ();
998983 return res;
999984}
1000985
1001986void free_result (local_result * result)
1002987{
1003- if (!result || ! result->_vec )
988+ if (!result || result->result_ == nullptr )
1004989 {
1005990 return ;
1006991 }
1007- std::vector<char > * vec = reinterpret_cast <std::vector<char > *>(result->_vec );
1008- delete vec;
1009- result->_vec = nullptr ;
992+ delete result->result_ ;
993+ result->result_ = nullptr ;
1010994}
1011995
1012996
@@ -1015,7 +999,7 @@ int mainEntryClickHouseLocal(int argc, char ** argv)
1015999 auto result = pyEntryClickHouseLocal (argc, argv);
10161000 if (result)
10171001 {
1018- std::cout << std::string (result-> buf -> begin (), result-> buf -> end () ) << std::endl;
1002+ std::cout << (result) << std::endl;
10191003 return 0 ;
10201004 }
10211005 else
0 commit comments