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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]