From f0cde1b69a5cf75bc9cce4e91bc0ad3121a0275f Mon Sep 17 00:00:00 2001 From: Gal Salomon Date: Sun, 9 Jun 2024 10:44:09 +0300 Subject: [PATCH] upon multiple calls to `parse-query` with a failure on AST creation, it causes a crash. align with s3select API adding the JSON output format, otherwise it cause some s3test to fail. remove obsolete initialization. the init is done by the constructor s3select submodule Signed-off-by: Gal Salomon --- src/rgw/rgw_s3select.cc | 13 ++++++++++--- src/rgw/rgw_s3select_private.h | 5 +++++ src/s3select | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/rgw/rgw_s3select.cc b/src/rgw/rgw_s3select.cc index 800d276a6aab1..73b55ebbf20d8 100644 --- a/src/rgw/rgw_s3select.cc +++ b/src/rgw/rgw_s3select.cc @@ -287,6 +287,7 @@ RGWSelectObj_ObjStore_S3::RGWSelectObj_ObjStore_S3(): m_object_size_for_processing(0), m_parquet_type(false), m_json_type(false), + m_outputFormat(OutputFormat::CSV), chunk_number(0), m_requested_range(0), m_scan_offset(1024), @@ -426,7 +427,9 @@ int RGWSelectObj_ObjStore_S3::run_s3select_on_csv(const char* query, const char* } else if(m_header_info.compare("USE")==0) { csv.use_header_info=true; } - + if (m_outputFormat == OutputFormat::JSON) { + csv.output_json_format = true; + } m_s3_csv_object.set_csv_query(&s3select_syntax, csv); m_s3_csv_object.set_external_system_functions(fp_s3select_continue, @@ -478,6 +481,7 @@ int RGWSelectObj_ObjStore_S3::run_s3select_on_parquet(const char* query) if (!m_s3_parquet_object.is_set()) { //parsing the SQL statement. s3select_syntax.parse_query(m_sql_query.c_str()); + parquet_object::csv_definitions parquet; m_s3_parquet_object.set_external_system_functions(fp_s3select_continue, fp_s3select_result_format, @@ -486,7 +490,7 @@ int RGWSelectObj_ObjStore_S3::run_s3select_on_parquet(const char* query) try { //at this stage the Parquet-processing requires for the meta-data that reside on Parquet object - m_s3_parquet_object.set_parquet_object(std::string("s3object"), &s3select_syntax, &m_rgw_api); + m_s3_parquet_object.set_parquet_object(std::string("s3object"), &s3select_syntax, &m_rgw_api, parquet); } catch(base_s3select_exception& e) { ldpp_dout(this, 10) << "S3select: failed upon parquet-reader construction: " << e.what() << dendl; fp_result_header_format(m_aws_response_handler.get_sql_result()); @@ -618,6 +622,10 @@ int RGWSelectObj_ObjStore_S3::handle_aws_cli_parameters(std::string& sql_query) ldpp_dout(this, 10) << "s3select: engine is set to process Parquet objects" << dendl; } + if (m_s3select_query.find(output_tag+">", 0); @@ -748,7 +756,6 @@ void RGWSelectObj_ObjStore_S3::execute(optional_yield y) op_ret = -ERR_INVALID_REQUEST; return; } - s3select_syntax.parse_query(m_sql_query.c_str()); status = run_s3select_on_parquet(m_sql_query.c_str()); if (status) { ldout(s->cct, 10) << "S3select: failed to process query <" << m_sql_query << "> on object " << s->object->get_name() << dendl; diff --git a/src/rgw/rgw_s3select_private.h b/src/rgw/rgw_s3select_private.h index 7beac4f4a5d88..87d180acebc0f 100644 --- a/src/rgw/rgw_s3select_private.h +++ b/src/rgw/rgw_s3select_private.h @@ -241,6 +241,11 @@ private: const char* s3select_json_error = "InvalidJsonType"; public: + enum class OutputFormat { + CSV, + JSON + }; + OutputFormat m_outputFormat; unsigned int chunk_number; size_t m_requested_range; size_t m_scan_offset; diff --git a/src/s3select b/src/s3select index f333ec82e6e8a..a6168396d2461 160000 --- a/src/s3select +++ b/src/s3select @@ -1 +1 @@ -Subproject commit f333ec82e6e8a3f7eb9ba1041d1442b2c7cd0f05 +Subproject commit a6168396d246184ea4aadfb8ab3b9ab33848294c -- 2.39.5