This is an automated email from the ASF dual-hosted git repository. panxiaolei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 85ba7992922 [fix](ub) fix uninitialized accesses in BE (#35370) 85ba7992922 is described below commit 85ba79929228547ccb3fd84fb209e9ebfa1d234e Author: zclllyybb <zhaochan...@selectdb.com> AuthorDate: Wed May 29 20:10:22 2024 +0800 [fix](ub) fix uninitialized accesses in BE (#35370) ubsan hints: ```c++ /root/doris/be/src/olap/hll.h:93:29: runtime error: load of value 3078029312, which is not a valid value for type 'HllDataType' /root/doris/be/src/olap/hll.h:94:23: runtime error: load of value 3078029312, which is not a valid value for type 'HllDataType' /root/doris/be/src/runtime/descriptors.h:439:38: runtime error: load of value 118, which is not a valid value for type 'bool' /root/doris/be/src/vec/exec/vjdbc_connector.cpp:61:50: runtime error: load of value 35, which is not a valid value for type 'bool' ``` --- be/src/olap/hll.cpp | 19 ++-- be/src/olap/hll.h | 73 ++++++------- be/src/runtime/descriptors.h | 8 +- be/src/util/bitmap_value.h | 7 +- be/src/vec/columns/column_complex.h | 30 ++++-- be/src/vec/core/field.h | 15 ++- be/src/vec/data_types/data_type_hll.h | 12 +-- be/src/vec/exec/scan/new_jdbc_scanner.cpp | 1 + be/src/vec/exec/vjdbc_connector.h | 15 +-- .../vec/exprs/table_function/vexplode_bitmap.cpp | 2 +- be/test/vec/core/column_complex_test.cpp | 9 +- .../jdbc/test_doris_jdbc_catalog.groovy | 118 ++++++++++----------- 12 files changed, 148 insertions(+), 161 deletions(-) diff --git a/be/src/olap/hll.cpp b/be/src/olap/hll.cpp index bfbe954217f..80be40f5643 100644 --- a/be/src/olap/hll.cpp +++ b/be/src/olap/hll.cpp @@ -19,15 +19,12 @@ #include <cmath> #include <map> -#include <new> #include <ostream> #include "common/logging.h" #include "util/coding.h" #include "util/slice.h" -using std::map; -using std::nothrow; using std::string; using std::stringstream; @@ -328,27 +325,27 @@ int64_t HyperLogLog::estimate_cardinality() const { float alpha = 0; if (num_streams == 16) { - alpha = 0.673f; + alpha = 0.673F; } else if (num_streams == 32) { - alpha = 0.697f; + alpha = 0.697F; } else if (num_streams == 64) { - alpha = 0.709f; + alpha = 0.709F; } else { - alpha = 0.7213f / (1 + 1.079f / num_streams); + alpha = 0.7213F / (1 + 1.079F / num_streams); } float harmonic_mean = 0; int num_zero_registers = 0; for (int i = 0; i < HLL_REGISTERS_COUNT; ++i) { - harmonic_mean += powf(2.0f, -_registers[i]); + harmonic_mean += powf(2.0F, -_registers[i]); if (_registers[i] == 0) { ++num_zero_registers; } } - harmonic_mean = 1.0f / harmonic_mean; + harmonic_mean = 1.0F / harmonic_mean; double estimate = alpha * num_streams * num_streams * harmonic_mean; // according to HyperLogLog current correction, if E is cardinal // E =< num_streams * 2.5 , LC has higher accuracy. @@ -391,9 +388,9 @@ void HllSetResolver::parse() { _sparse_count = (SparseLengthValueType*)(pdata + sizeof(SetTypeValueType)); sparse_data = pdata + sizeof(SetTypeValueType) + sizeof(SparseLengthValueType); for (int i = 0; i < *_sparse_count; i++) { - SparseIndexType* index = (SparseIndexType*)sparse_data; + auto* index = (SparseIndexType*)sparse_data; sparse_data += sizeof(SparseIndexType); - SparseValueType* value = (SparseValueType*)sparse_data; + auto* value = (SparseValueType*)sparse_data; _sparse_map[*index] = *value; sparse_data += sizeof(SetTypeValueType); } diff --git a/be/src/olap/hll.h b/be/src/olap/hll.h index 0ae5539163c..56cbd97110d 100644 --- a/be/src/olap/hll.h +++ b/be/src/olap/hll.h @@ -17,9 +17,8 @@ #pragma once -#include <stdint.h> -#include <string.h> - +#include <cstdint> +#include <cstring> #include <map> #include <string> #include <utility> @@ -197,10 +196,10 @@ public: _registers = nullptr; } - typedef uint8_t SetTypeValueType; - typedef int32_t SparseLengthValueType; - typedef uint16_t SparseIndexType; - typedef uint8_t SparseValueType; + using SetTypeValueType = uint8_t; + using SparseLengthValueType = int32_t; + using SparseIndexType = uint16_t; + using SparseValueType = uint8_t; // Add a hash value to this HLL value // NOTE: input must be a hash_value @@ -213,10 +212,11 @@ public: size_t memory_consumed() const { size_t size = sizeof(*this); - if (_type == HLL_DATA_EXPLICIT) + if (_type == HLL_DATA_EXPLICIT) { size += _hash_set.size() * sizeof(uint64_t); - else if (_type == HLL_DATA_SPARSE || _type == HLL_DATA_FULL) + } else if (_type == HLL_DATA_SPARSE || _type == HLL_DATA_FULL) { size += HLL_REGISTERS_COUNT; + } return size; } @@ -231,13 +231,7 @@ public: int64_t estimate_cardinality() const; - static std::string empty() { - static HyperLogLog hll; - std::string buf; - buf.resize(HLL_EMPTY_SIZE); - hll.serialize((uint8_t*)buf.c_str()); - return buf; - } + static HyperLogLog empty() { return HyperLogLog {}; } // Check if input slice is a valid serialized binary of HyperLogLog. // This function only check the encoded type in slice, whose complex @@ -265,14 +259,6 @@ public: } } -private: - HllDataType _type = HLL_DATA_EMPTY; - vectorized::flat_hash_set<uint64_t> _hash_set; - - // This field is much space consuming(HLL_REGISTERS_COUNT), we create - // it only when it is really needed. - uint8_t* _registers = nullptr; - private: void _convert_explicit_to_register(); @@ -308,26 +294,27 @@ private: } #endif } + + HllDataType _type = HLL_DATA_EMPTY; + vectorized::flat_hash_set<uint64_t> _hash_set; + + // This field is much space consuming(HLL_REGISTERS_COUNT), we create + // it only when it is really needed. + uint8_t* _registers = nullptr; }; // todo(kks): remove this when dpp_sink class was removed class HllSetResolver { public: - HllSetResolver() - : _buf_ref(nullptr), - _buf_len(0), - _set_type(HLL_DATA_EMPTY), - _full_value_position(nullptr), - _explicit_value(nullptr), - _explicit_num(0) {} - - ~HllSetResolver() {} - - typedef uint8_t SetTypeValueType; - typedef uint8_t ExplicitLengthValueType; - typedef int32_t SparseLengthValueType; - typedef uint16_t SparseIndexType; - typedef uint8_t SparseValueType; + HllSetResolver() = default; + + ~HllSetResolver() = default; + + using SetTypeValueType = uint8_t; + using ExplicitLengthValueType = uint8_t; + using SparseLengthValueType = int32_t; + using SparseIndexType = uint16_t; + using SparseValueType = uint8_t; // only save pointer void init(char* buf, int len) { @@ -339,7 +326,7 @@ public: HllDataType get_hll_data_type() { return _set_type; } // explicit value num - int get_explicit_count() { return (int)_explicit_num; } + int get_explicit_count() const { return (int)_explicit_num; } // get explicit index value 64bit uint64_t get_explicit_value(int index) { @@ -360,11 +347,11 @@ public: private: char* _buf_ref = nullptr; // set - int _buf_len; // set len - HllDataType _set_type; //set type + int _buf_len {}; // set len + HllDataType _set_type {}; //set type char* _full_value_position = nullptr; uint64_t* _explicit_value = nullptr; - ExplicitLengthValueType _explicit_num; + ExplicitLengthValueType _explicit_num {}; std::map<SparseIndexType, SparseValueType> _sparse_map; SparseLengthValueType* _sparse_count; }; diff --git a/be/src/runtime/descriptors.h b/be/src/runtime/descriptors.h index 371bf395385..3379cebefce 100644 --- a/be/src/runtime/descriptors.h +++ b/be/src/runtime/descriptors.h @@ -437,8 +437,6 @@ public: _tuple_idx_nullable_map(desc._tuple_idx_nullable_map), _tuple_idx_map(desc._tuple_idx_map), _has_varlen_slots(desc._has_varlen_slots) { - _num_materialized_slots = 0; - _num_slots = 0; auto it = desc._tuple_desc_map.begin(); for (; it != desc._tuple_desc_map.end(); ++it) { _num_materialized_slots += (*it)->num_materialized_slots(); @@ -500,10 +498,10 @@ private: std::vector<int> _tuple_idx_map; // Provide quick way to check if there are variable length slots. - bool _has_varlen_slots; + bool _has_varlen_slots = false; - int _num_materialized_slots; - int _num_slots; + int _num_materialized_slots = 0; + int _num_slots = 0; }; } // namespace doris diff --git a/be/src/util/bitmap_value.h b/be/src/util/bitmap_value.h index b7a046921b5..d8f68a227e7 100644 --- a/be/src/util/bitmap_value.h +++ b/be/src/util/bitmap_value.h @@ -1258,12 +1258,7 @@ public: return *this; } - static std::string empty_bitmap() { - std::string buf(sizeof(BitmapValue), 0); - BitmapValue* bitmap_value = reinterpret_cast<BitmapValue*>(buf.data()); - bitmap_value->_type = EMPTY; - return buf; - } + static BitmapValue empty_bitmap() { return BitmapValue {}; } BitmapValue& operator=(BitmapValue&& other) noexcept { if (this == &other) { diff --git a/be/src/vec/columns/column_complex.h b/be/src/vec/columns/column_complex.h index f173a1bf49b..6b570dddb72 100644 --- a/be/src/vec/columns/column_complex.h +++ b/be/src/vec/columns/column_complex.h @@ -26,10 +26,10 @@ #include "util/bitmap_value.h" #include "util/quantile_state.h" #include "vec/columns/column.h" -#include "vec/columns/column_impl.h" #include "vec/columns/column_string.h" #include "vec/columns/column_vector.h" #include "vec/columns/columns_common.h" +#include "vec/core/field.h" #include "vec/core/types.h" namespace doris::vectorized { @@ -37,7 +37,7 @@ namespace doris::vectorized { template <typename T> class ColumnComplexType final : public COWHelper<IColumn, ColumnComplexType<T>> { private: - ColumnComplexType() {} + ColumnComplexType() = default; ColumnComplexType(const size_t n) : data(n) {} friend class COWHelper<IColumn, ColumnComplexType<T>>; @@ -55,7 +55,7 @@ public: size_t size() const override { return data.size(); } StringRef get_data_at(size_t n) const override { - return StringRef(reinterpret_cast<const char*>(&data[n]), sizeof(data[n])); + return {reinterpret_cast<const char*>(&data[n]), sizeof(data[n])}; } void insert_from(const IColumn& src, size_t n) override { @@ -130,18 +130,18 @@ public: MutableColumnPtr clone_resized(size_t size) const override; void insert(const Field& x) override { - const String& s = doris::vectorized::get<const String&>(x); - data.push_back(*reinterpret_cast<const T*>(s.c_str())); + const T& s = doris::vectorized::get<const T&>(x); + data.push_back(s); } Field operator[](size_t n) const override { assert(n < size()); - return Field(reinterpret_cast<const char*>(&data[n]), sizeof(data[n])); + return {reinterpret_cast<const char*>(&data[n]), sizeof(data[n])}; } void get(size_t n, Field& res) const override { assert(n < size()); - res.assign_string(reinterpret_cast<const char*>(&data[n]), sizeof(data[n])); + res = Field(data[n]); } [[noreturn]] bool get_bool(size_t n) const override { @@ -260,18 +260,24 @@ ColumnPtr ColumnComplexType<T>::filter(const IColumn::Filter& filt, size_t size = data.size(); column_match_filter_size(size, filt.size()); - if (data.size() == 0) return this->create(); + if (data.size() == 0) { + return this->create(); + } auto res = this->create(); Container& res_data = res->get_data(); - if (result_size_hint) res_data.reserve(result_size_hint > 0 ? result_size_hint : size); + if (result_size_hint) { + res_data.reserve(result_size_hint > 0 ? result_size_hint : size); + } const UInt8* filt_pos = filt.data(); const UInt8* filt_end = filt_pos + size; const T* data_pos = data.data(); while (filt_pos < filt_end) { - if (*filt_pos) res_data.push_back(*data_pos); + if (*filt_pos) { + res_data.push_back(*data_pos); + } ++filt_pos; ++data_pos; @@ -335,7 +341,9 @@ ColumnPtr ColumnComplexType<T>::replicate(const IColumn::Offsets& offsets) const size_t size = data.size(); column_match_offsets_size(size, offsets.size()); - if (0 == size) return this->create(); + if (0 == size) { + return this->create(); + } auto res = this->create(); typename Self::Container& res_data = res->get_data(); diff --git a/be/src/vec/core/field.h b/be/src/vec/core/field.h index de2d544e7e0..87459f19ce6 100644 --- a/be/src/vec/core/field.h +++ b/be/src/vec/core/field.h @@ -58,7 +58,7 @@ namespace doris::vectorized { template <typename T> struct NearestFieldTypeImpl { - using Type = T; + using Type = T; // for HLL or some origin types. see def. of storage }; template <typename T> @@ -768,7 +768,9 @@ private: } ALWAYS_INLINE void destroy() { - if (which < Types::MIN_NON_POD) return; + if (which < Types::MIN_NON_POD) { + return; + } switch (which) { case Types::String: @@ -789,6 +791,15 @@ private: case Types::VariantMap: destroy<VariantMap>(); break; + case Types::Bitmap: + destroy<BitmapValue>(); + break; + case Types::HyperLogLog: + destroy<HyperLogLog>(); + break; + case Types::QuantileState: + destroy<QuantileState>(); + break; default: break; } diff --git a/be/src/vec/data_types/data_type_hll.h b/be/src/vec/data_types/data_type_hll.h index 03293565907..f3856baecfb 100644 --- a/be/src/vec/data_types/data_type_hll.h +++ b/be/src/vec/data_types/data_type_hll.h @@ -18,9 +18,9 @@ #pragma once #include <gen_cpp/Types_types.h> #include <glog/logging.h> -#include <stddef.h> -#include <stdint.h> +#include <cstddef> +#include <cstdint> #include <memory> #include <ostream> #include <string> @@ -35,15 +35,11 @@ #include "vec/data_types/data_type.h" #include "vec/data_types/serde/data_type_serde.h" -namespace doris { -namespace vectorized { +namespace doris::vectorized { class BufferReadable; class BufferWritable; class IColumn; -} // namespace vectorized -} // namespace doris -namespace doris::vectorized { class DataTypeHLL : public IDataType { public: DataTypeHLL() = default; @@ -56,7 +52,7 @@ public: const char* get_family_name() const override { return "HLL"; } TypeIndex get_type_id() const override { return TypeIndex::HLL; } - TypeDescriptor get_type_as_type_descriptor() const override { return TypeDescriptor(TYPE_HLL); } + TypeDescriptor get_type_as_type_descriptor() const override { return {TYPE_HLL}; } doris::FieldType get_storage_field_type() const override { return doris::FieldType::OLAP_FIELD_TYPE_HLL; diff --git a/be/src/vec/exec/scan/new_jdbc_scanner.cpp b/be/src/vec/exec/scan/new_jdbc_scanner.cpp index e0c64b58fb5..60e86f06521 100644 --- a/be/src/vec/exec/scan/new_jdbc_scanner.cpp +++ b/be/src/vec/exec/scan/new_jdbc_scanner.cpp @@ -95,6 +95,7 @@ Status NewJdbcScanner::prepare(RuntimeState* state, const VExprContextSPtrs& con _jdbc_param.passwd = jdbc_table->jdbc_passwd(); _jdbc_param.tuple_desc = _tuple_desc; _jdbc_param.query_string = std::move(_query_string); + _jdbc_param.use_transaction = false; // not useful for scanner but only sink. _jdbc_param.table_type = _table_type; _jdbc_param.connection_pool_min_size = jdbc_table->connection_pool_min_size(); _jdbc_param.connection_pool_max_size = jdbc_table->connection_pool_max_size(); diff --git a/be/src/vec/exec/vjdbc_connector.h b/be/src/vec/exec/vjdbc_connector.h index b308cfdf392..954b0abfa78 100644 --- a/be/src/vec/exec/vjdbc_connector.h +++ b/be/src/vec/exec/vjdbc_connector.h @@ -43,7 +43,8 @@ class IColumn; class VExprContext; struct JdbcConnectorParam { - int64_t catalog_id; + // use -1 as default value to find error earlier. + int64_t catalog_id = -1; std::string driver_path; std::string driver_class; std::string resource_name; @@ -53,13 +54,13 @@ struct JdbcConnectorParam { std::string passwd; std::string query_string; std::string table_name; - bool use_transaction; + bool use_transaction = false; TOdbcTableType::type table_type; - int32_t connection_pool_min_size; - int32_t connection_pool_max_size; - int32_t connection_pool_max_wait_time; - int32_t connection_pool_max_life_time; - bool connection_pool_keep_alive; + int32_t connection_pool_min_size = -1; + int32_t connection_pool_max_size = -1; + int32_t connection_pool_max_wait_time = -1; + int32_t connection_pool_max_life_time = -1; + bool connection_pool_keep_alive = false; const TupleDescriptor* tuple_desc = nullptr; }; diff --git a/be/src/vec/exprs/table_function/vexplode_bitmap.cpp b/be/src/vec/exprs/table_function/vexplode_bitmap.cpp index e6e4c843075..5327c2e1633 100644 --- a/be/src/vec/exprs/table_function/vexplode_bitmap.cpp +++ b/be/src/vec/exprs/table_function/vexplode_bitmap.cpp @@ -90,7 +90,7 @@ void VExplodeBitmapTableFunction::get_same_many_values(MutableColumnPtr& column, void VExplodeBitmapTableFunction::process_row(size_t row_idx) { TableFunction::process_row(row_idx); - + //FIXME: use ColumnComplex instead StringRef value = _value_column->get_data_at(row_idx); if (value.data) { diff --git a/be/test/vec/core/column_complex_test.cpp b/be/test/vec/core/column_complex_test.cpp index dd2109d1f7b..73ea44dfc4b 100644 --- a/be/test/vec/core/column_complex_test.cpp +++ b/be/test/vec/core/column_complex_test.cpp @@ -48,7 +48,7 @@ TEST(ColumnComplexTest, BasicTest) { } // Test the compile failed -TEST(ColumnComplexType, DataTypeBitmapTest) { +TEST(ColumnComplexTest, DataTypeBitmapTest) { std::make_shared<DataTypeBitMap>(); } @@ -149,10 +149,9 @@ TEST_F(ColumnBitmapTest, ColumnBitmapReadWrite) { Field field; column->get(0, field); - auto str = field.get<String>(); - auto* bitmap = reinterpret_cast<const BitmapValue*>(str.c_str()); - EXPECT_TRUE(bitmap->contains(10)); - EXPECT_TRUE(bitmap->contains(1000000)); + auto bitmap = field.get<BitmapValue>(); + EXPECT_TRUE(bitmap.contains(10)); + EXPECT_TRUE(bitmap.contains(1000000)); } TEST_F(ColumnQuantileStateTest, ColumnQuantileStateReadWrite) { diff --git a/regression-test/suites/external_table_p0/jdbc/test_doris_jdbc_catalog.groovy b/regression-test/suites/external_table_p0/jdbc/test_doris_jdbc_catalog.groovy index 014980816f5..bdccd9fa5e1 100644 --- a/regression-test/suites/external_table_p0/jdbc/test_doris_jdbc_catalog.groovy +++ b/regression-test/suites/external_table_p0/jdbc/test_doris_jdbc_catalog.groovy @@ -28,20 +28,14 @@ suite("test_doris_jdbc_catalog", "p0,external,doris,external_docker,external_doc String resource_name = "jdbc_resource_catalog_doris" - String catalog_name = "doris_jdbc_catalog"; - String internal_db_name = "regression_test_jdbc_catalog_p0"; String doris_port = context.config.otherConfigs.get("doris_port"); - String inDorisTable = "test_doris_jdbc_doris_in_tb"; - String hllTable = "bowen_hll_test" - String base_table = "base"; - String arr_table = "arr"; - sql """create database if not exists ${internal_db_name}; """ + sql """create database if not exists regression_test_jdbc_catalog_p0; """ qt_sql """select current_catalog()""" - sql """drop catalog if exists ${catalog_name} """ + sql """drop catalog if exists doris_jdbc_catalog """ - sql """ CREATE CATALOG `${catalog_name}` PROPERTIES ( + sql """ CREATE CATALOG `doris_jdbc_catalog` PROPERTIES ( "user" = "${jdbcUser}", "type" = "jdbc", "password" = "${jdbcPassword}", @@ -49,36 +43,36 @@ suite("test_doris_jdbc_catalog", "p0,external,doris,external_docker,external_doc "driver_url" = "${driver_url}", "driver_class" = "com.mysql.cj.jdbc.Driver" )""" - sql """use ${internal_db_name}""" - sql """ drop table if exists ${internal_db_name}.${inDorisTable} """ + sql """use regression_test_jdbc_catalog_p0""" + sql """ drop table if exists regression_test_jdbc_catalog_p0.test_doris_jdbc_doris_in_tb """ sql """ - CREATE TABLE ${internal_db_name}.${inDorisTable} ( + CREATE TABLE regression_test_jdbc_catalog_p0.test_doris_jdbc_doris_in_tb ( `id` INT NULL COMMENT "主键id", `name` string NULL COMMENT "名字" ) DISTRIBUTED BY HASH(id) BUCKETS 10 PROPERTIES("replication_num" = "1"); """ - sql """ insert into ${inDorisTable} values (1, 'doris1')""" - sql """ insert into ${inDorisTable} values (2, 'doris2')""" - sql """ insert into ${inDorisTable} values (3, 'doris3')""" - sql """ insert into ${inDorisTable} values (4, 'doris4')""" - sql """ insert into ${inDorisTable} values (5, 'doris5')""" - sql """ insert into ${inDorisTable} values (6, 'doris6')""" + sql """ insert into test_doris_jdbc_doris_in_tb values (1, 'doris1')""" + sql """ insert into test_doris_jdbc_doris_in_tb values (2, 'doris2')""" + sql """ insert into test_doris_jdbc_doris_in_tb values (3, 'doris3')""" + sql """ insert into test_doris_jdbc_doris_in_tb values (4, 'doris4')""" + sql """ insert into test_doris_jdbc_doris_in_tb values (5, 'doris5')""" + sql """ insert into test_doris_jdbc_doris_in_tb values (6, 'doris6')""" - order_qt_ex_tb1 """ select * from internal.${internal_db_name}.${inDorisTable} order by id; """ + order_qt_ex_tb1 """ select * from internal.regression_test_jdbc_catalog_p0.test_doris_jdbc_doris_in_tb order by id; """ qt_sql """select current_catalog()""" - sql "switch ${catalog_name}" + sql "switch doris_jdbc_catalog" qt_sql """select current_catalog()""" - sql """ use ${internal_db_name}""" - order_qt_ex_tb1 """ select * from ${inDorisTable} order by id; """ + sql """ use regression_test_jdbc_catalog_p0""" + order_qt_ex_tb1 """ select * from test_doris_jdbc_doris_in_tb order by id; """ // test hll query sql "switch internal" - sql "use ${internal_db_name}" + sql "use regression_test_jdbc_catalog_p0" - sql """ drop table if exists ${hllTable} """ - sql """ CREATE TABLE `${hllTable}` ( + sql """ drop table if exists bowen_hll_test """ + sql """ CREATE TABLE `bowen_hll_test` ( `pin_id` bigint(20) NOT NULL COMMENT "", `pv_date` datev2 NOT NULL COMMENT "", `user_log_acct` hll HLL_UNION NULL COMMENT "" @@ -89,16 +83,16 @@ suite("test_doris_jdbc_catalog", "p0,external,doris,external_docker,external_doc "replication_allocation" = "tag.location.default: 1" ); """ - sql """ insert into ${hllTable} values(1, "2023-01-01", hll_hash("1"));""" - sql """ insert into ${hllTable} values(2, "2023-01-02", hll_hash("2"));""" - sql """ insert into ${hllTable} values(3, "2023-01-03", hll_hash("3"));""" - sql """ insert into ${hllTable} values(4, "2023-01-04", hll_hash("4"));""" - sql """ insert into ${hllTable} values(5, "2023-01-05", hll_hash("5"));""" - sql """ insert into ${hllTable} values(6, "2023-01-06", hll_hash("6"));""" + sql """ insert into bowen_hll_test values(1, "2023-01-01", hll_hash("1"));""" + sql """ insert into bowen_hll_test values(2, "2023-01-02", hll_hash("2"));""" + sql """ insert into bowen_hll_test values(3, "2023-01-03", hll_hash("3"));""" + sql """ insert into bowen_hll_test values(4, "2023-01-04", hll_hash("4"));""" + sql """ insert into bowen_hll_test values(5, "2023-01-05", hll_hash("5"));""" + sql """ insert into bowen_hll_test values(6, "2023-01-06", hll_hash("6"));""" - sql """drop table if exists ${base_table}""" + sql """drop table if exists base""" sql """ - create table ${base_table} ( + create table base ( bool_col boolean, tinyint_col tinyint, smallint_col smallint, @@ -121,10 +115,10 @@ suite("test_doris_jdbc_catalog", "p0,external,doris,external_docker,external_doc "replication_allocation" = "tag.location.default: 1" ); """ - sql """insert into ${base_table} values (true, 1, 1, 1, 1, 1, 1.0, 1.0, 1.0, 1.0, '2021-01-01', '2021-01-01 00:00:00.000', 'a', 'a', '{\"a\": 1}');""" + sql """insert into base values (true, 1, 1, 1, 1, 1, 1.0, 1.0, 1.0, 1.0, '2021-01-01', '2021-01-01 00:00:00.000', 'a', 'a', '{\"a\": 1}');""" // insert NULL - sql """insert into ${base_table} values (null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);""" - order_qt_base1 """ select * from ${base_table} order by int_col; """ + sql """insert into base values (null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);""" + order_qt_base1 """ select * from base order by int_col; """ sql """drop table if exists all_null_tbl""" sql """ @@ -155,9 +149,9 @@ suite("test_doris_jdbc_catalog", "p0,external,doris,external_docker,external_doc sql """insert into all_null_tbl values (null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);""" order_qt_all_null """ select * from all_null_tbl order by int_col; """ - sql """drop table if exists ${arr_table}""" + sql """drop table if exists arr""" sql """ - create table ${arr_table} ( + create table arr ( int_col int, arr_bool_col array<boolean>, arr_tinyint_col array<tinyint>, @@ -182,10 +176,10 @@ suite("test_doris_jdbc_catalog", "p0,external,doris,external_docker,external_doc ); """ - sql """insert into ${arr_table} values (1, array(true), array(1), array(1), array(1), array(1), array(1), array(1.0), array(1.0), array(1.0), array(1.0), array('2021-01-01'), array('2021-01-01 00:00:00.000'), array('a'), array('a'), array('a'));""" + sql """insert into arr values (1, array(true), array(1), array(1), array(1), array(1), array(1), array(1.0), array(1.0), array(1.0), array(1.0), array('2021-01-01'), array('2021-01-01 00:00:00.000'), array('a'), array('a'), array('a'));""" // insert NULL - sql """insert into ${arr_table} values (2, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);""" - order_qt_arr1 """ select * from ${arr_table} order by int_col; """ + sql """insert into arr values (2, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);""" + order_qt_arr1 """ select * from arr order by int_col; """ sql """drop table if exists test_insert_order""" @@ -208,26 +202,26 @@ suite("test_doris_jdbc_catalog", "p0,external,doris,external_docker,external_doc sql """ set return_object_data_as_binary=true """ - order_qt_tb1 """ select pin_id, hll_union_agg(user_log_acct) from ${hllTable} group by pin_id; """ + order_qt_tb1 """ select pin_id, hll_union_agg(user_log_acct) from bowen_hll_test group by pin_id; """ // query with jdbc external table - sql """ refresh catalog ${catalog_name} """ + sql """ refresh catalog doris_jdbc_catalog """ qt_sql """select current_catalog()""" - sql """ switch ${catalog_name} """ + sql """ switch doris_jdbc_catalog """ qt_sql """select current_catalog()""" - sql """ use ${internal_db_name} """ - order_qt_tb2 """ select pin_id, hll_union_agg(user_log_acct) from ${catalog_name}.${internal_db_name}.${hllTable} group by pin_id; """ - order_qt_base2 """ select * from ${catalog_name}.${internal_db_name}.${base_table} order by int_col; """ - order_qt_all_null2 """ select * from ${catalog_name}.${internal_db_name}.all_null_tbl order by int_col; """ - order_qt_arr2 """ select * from ${catalog_name}.${internal_db_name}.${arr_table} order by int_col; """ - sql """ drop table if exists internal.${internal_db_name}.ctas_base; """ - sql """ drop table if exists internal.${internal_db_name}.ctas_arr; """ - order_qt_ctas_base """ create table internal.${internal_db_name}.ctas_base PROPERTIES("replication_num" = "1") as select * from ${catalog_name}.${internal_db_name}.${base_table} order by int_col; """ - order_qt_ctas_arr """ create table internal.${internal_db_name}.ctas_arr PROPERTIES("replication_num" = "1") as select * from ${catalog_name}.${internal_db_name}.${arr_table} order by int_col; """ - qt_desc_ctas_base """ desc internal.${internal_db_name}.ctas_base; """ - qt_desc_ctas_arr """ desc internal.${internal_db_name}.ctas_arr; """ - order_qt_query_ctas_base """ select * from internal.${internal_db_name}.ctas_base order by int_col; """ - order_qt_query_ctas_arr """ select * from internal.${internal_db_name}.ctas_arr order by int_col; """ + sql """ use regression_test_jdbc_catalog_p0 """ + order_qt_tb2 """ select pin_id, hll_union_agg(user_log_acct) from doris_jdbc_catalog.regression_test_jdbc_catalog_p0.bowen_hll_test group by pin_id; """ + order_qt_base2 """ select * from doris_jdbc_catalog.regression_test_jdbc_catalog_p0.base order by int_col; """ + order_qt_all_null2 """ select * from doris_jdbc_catalog.regression_test_jdbc_catalog_p0.all_null_tbl order by int_col; """ + order_qt_arr2 """ select * from doris_jdbc_catalog.regression_test_jdbc_catalog_p0.arr order by int_col; """ + sql """ drop table if exists internal.regression_test_jdbc_catalog_p0.ctas_base; """ + sql """ drop table if exists internal.regression_test_jdbc_catalog_p0.ctas_arr; """ + order_qt_ctas_base """ create table internal.regression_test_jdbc_catalog_p0.ctas_base PROPERTIES("replication_num" = "1") as select * from doris_jdbc_catalog.regression_test_jdbc_catalog_p0.base order by int_col; """ + order_qt_ctas_arr """ create table internal.regression_test_jdbc_catalog_p0.ctas_arr PROPERTIES("replication_num" = "1") as select * from doris_jdbc_catalog.regression_test_jdbc_catalog_p0.arr order by int_col; """ + qt_desc_ctas_base """ desc internal.regression_test_jdbc_catalog_p0.ctas_base; """ + qt_desc_ctas_arr """ desc internal.regression_test_jdbc_catalog_p0.ctas_arr; """ + order_qt_query_ctas_base """ select * from internal.regression_test_jdbc_catalog_p0.ctas_base order by int_col; """ + order_qt_query_ctas_arr """ select * from internal.regression_test_jdbc_catalog_p0.ctas_arr order by int_col; """ // test insert order sql """insert into test_insert_order(gameid,did,cid,bid,aid,pname) values('g1',4,3,2,1,'p1')"""; @@ -238,12 +232,12 @@ suite("test_doris_jdbc_catalog", "p0,external,doris,external_docker,external_doc qt_sql """select current_catalog()""" sql "switch internal" qt_sql """select current_catalog()""" - sql "use ${internal_db_name}" - sql """ drop table if exists ${inDorisTable} """ - sql """ drop table if exists ${hllTable} """ - sql """ drop table if exists ${base_table} """ + sql "use regression_test_jdbc_catalog_p0" + sql """ drop table if exists test_doris_jdbc_doris_in_tb """ + sql """ drop table if exists bowen_hll_test """ + sql """ drop table if exists base """ sql """ drop table if exists all_null_tbl """ - sql """ drop table if exists ${arr_table} """ + sql """ drop table if exists arr """ sql """ drop table if exists test_insert_order """ } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org