This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 84e9a140630 [Fix](hive-writer) Fix partition column orders issue when
the partition fields inserted into the target table are inconsistent with the
field order of the query source table and the schema field order of the query
source table. (#35543)
84e9a140630 is described below
commit 84e9a1406302eae56996363bb5c9430ba4e5b4b9
Author: Qi Chen <[email protected]>
AuthorDate: Tue May 28 18:11:55 2024 +0800
[Fix](hive-writer) Fix partition column orders issue when the partition
fields inserted into the target table are inconsistent with the field order of
the query source table and the schema field order of the query source table.
(#35543)
## Proposed changes
backport #35347
## Further comments
If this is a relatively large or complex change, kick off the discussion
at [[email protected]](mailto:[email protected]) by explaining why
you chose the solution you did and what alternatives you considered,
etc...
---
be/src/vec/sink/writer/vhive_partition_writer.cpp | 69 +++++---------------
be/src/vec/sink/writer/vhive_partition_writer.h | 18 ++----
be/src/vec/sink/writer/vhive_table_writer.cpp | 75 +++++++++++++++++-----
be/src/vec/sink/writer/vhive_table_writer.h | 4 ++
.../hive/ddl/test_hive_write_type.out | 25 ++++++++
.../hive/ddl/test_hive_write_type.groovy | 57 ++++++++++++++++
6 files changed, 167 insertions(+), 81 deletions(-)
diff --git a/be/src/vec/sink/writer/vhive_partition_writer.cpp
b/be/src/vec/sink/writer/vhive_partition_writer.cpp
index 4504faf0e9c..189e0211e52 100644
--- a/be/src/vec/sink/writer/vhive_partition_writer.cpp
+++ b/be/src/vec/sink/writer/vhive_partition_writer.cpp
@@ -31,19 +31,19 @@
namespace doris {
namespace vectorized {
-VHivePartitionWriter::VHivePartitionWriter(
- const TDataSink& t_sink, std::string partition_name, TUpdateMode::type
update_mode,
- const VExprContextSPtrs& output_expr_ctxs, const VExprContextSPtrs&
write_output_expr_ctxs,
- const std::set<size_t>& non_write_columns_indices, const
std::vector<THiveColumn>& columns,
- WriteInfo write_info, std::string file_name, int file_name_index,
- TFileFormatType::type file_format_type, TFileCompressType::type
hive_compress_type,
- const std::map<std::string, std::string>& hadoop_conf)
+VHivePartitionWriter::VHivePartitionWriter(const TDataSink& t_sink,
std::string partition_name,
+ TUpdateMode::type update_mode,
+ const VExprContextSPtrs&
write_output_expr_ctxs,
+ std::vector<std::string>
write_column_names,
+ WriteInfo write_info, std::string
file_name,
+ int file_name_index,
+ TFileFormatType::type
file_format_type,
+ TFileCompressType::type
hive_compress_type,
+ const std::map<std::string,
std::string>& hadoop_conf)
: _partition_name(std::move(partition_name)),
_update_mode(update_mode),
- _vec_output_expr_ctxs(output_expr_ctxs),
_write_output_expr_ctxs(write_output_expr_ctxs),
- _non_write_columns_indices(non_write_columns_indices),
- _columns(columns),
+ _write_column_names(std::move(write_column_names)),
_write_info(std::move(write_info)),
_file_name(std::move(file_name)),
_file_name_index(file_name_index),
@@ -63,14 +63,6 @@ Status VHivePartitionWriter::open(RuntimeState* state,
RuntimeProfile* profile)
fmt::format("{}/{}", _write_info.write_path,
_get_target_file_name()), 0, _file_writer,
&file_writer_options));
- std::vector<std::string> column_names;
- column_names.reserve(_columns.size());
- for (int i = 0; i < _columns.size(); i++) {
- if (_non_write_columns_indices.find(i) ==
_non_write_columns_indices.end()) {
- column_names.emplace_back(_columns[i].name);
- }
- }
-
switch (_file_format_type) {
case TFileFormatType::FORMAT_PARQUET: {
bool parquet_disable_dictionary = false;
@@ -94,7 +86,7 @@ Status VHivePartitionWriter::open(RuntimeState* state,
RuntimeProfile* profile)
}
}
_file_format_transformer.reset(new VParquetTransformer(
- state, _file_writer.get(), _write_output_expr_ctxs,
std::move(column_names),
+ state, _file_writer.get(), _write_output_expr_ctxs,
_write_column_names,
parquet_compression_type, parquet_disable_dictionary,
TParquetVersion::PARQUET_1_0,
false));
return _file_format_transformer->open();
@@ -125,7 +117,7 @@ Status VHivePartitionWriter::open(RuntimeState* state,
RuntimeProfile* profile)
_file_format_transformer.reset(
new VOrcTransformer(state, _file_writer.get(),
_write_output_expr_ctxs,
- std::move(column_names), false,
orc_compression_type));
+ _write_column_names, false,
orc_compression_type));
return _file_format_transformer->open();
}
default: {
@@ -156,43 +148,12 @@ Status VHivePartitionWriter::close(const Status& status) {
return Status::OK();
}
-Status VHivePartitionWriter::write(vectorized::Block& block,
vectorized::IColumn::Filter* filter) {
- Block output_block;
- RETURN_IF_ERROR(_projection_and_filter_block(block, filter,
&output_block));
- RETURN_IF_ERROR(_file_format_transformer->write(output_block));
- _row_count += output_block.rows();
+Status VHivePartitionWriter::write(vectorized::Block& block) {
+ RETURN_IF_ERROR(_file_format_transformer->write(block));
+ _row_count += block.rows();
return Status::OK();
}
-Status
VHivePartitionWriter::_projection_and_filter_block(doris::vectorized::Block&
input_block,
- const
vectorized::IColumn::Filter* filter,
-
doris::vectorized::Block* output_block) {
- Status status = Status::OK();
- if (input_block.rows() == 0) {
- return status;
- }
-
RETURN_IF_ERROR(vectorized::VExprContext::get_output_block_after_execute_exprs(
- _vec_output_expr_ctxs, input_block, output_block, true));
- materialize_block_inplace(*output_block);
-
- if (filter == nullptr) {
- return status;
- }
-
- std::vector<uint32_t> columns_to_filter;
- int column_to_keep = input_block.columns();
- columns_to_filter.resize(column_to_keep);
- for (uint32_t i = 0; i < column_to_keep; ++i) {
- columns_to_filter[i] = i;
- }
-
- Block::filter_block_internal(output_block, columns_to_filter, *filter);
-
- output_block->erase(_non_write_columns_indices);
-
- return status;
-}
-
THivePartitionUpdate VHivePartitionWriter::_build_partition_update() {
THivePartitionUpdate hive_partition_update;
hive_partition_update.__set_name(_partition_name);
diff --git a/be/src/vec/sink/writer/vhive_partition_writer.h
b/be/src/vec/sink/writer/vhive_partition_writer.h
index 912ac8b1e49..a3a8cb9c7a3 100644
--- a/be/src/vec/sink/writer/vhive_partition_writer.h
+++ b/be/src/vec/sink/writer/vhive_partition_writer.h
@@ -44,11 +44,10 @@ public:
TFileType::type file_type;
};
- VHivePartitionWriter(const TDataSink& t_sink, const std::string
partition_name,
- TUpdateMode::type update_mode, const
VExprContextSPtrs& output_expr_ctxs,
+ VHivePartitionWriter(const TDataSink& t_sink, std::string partition_name,
+ TUpdateMode::type update_mode,
const VExprContextSPtrs& write_output_expr_ctxs,
- const std::set<size_t>& non_write_columns_indices,
- const std::vector<THiveColumn>& columns, WriteInfo
write_info,
+ std::vector<std::string> write_column_names,
WriteInfo write_info,
std::string file_name, int file_name_index,
TFileFormatType::type file_format_type,
TFileCompressType::type hive_compress_type,
@@ -58,7 +57,7 @@ public:
Status open(RuntimeState* state, RuntimeProfile* profile);
- Status write(vectorized::Block& block, IColumn::Filter* filter = nullptr);
+ Status write(vectorized::Block& block);
Status close(const Status& status);
@@ -72,10 +71,6 @@ private:
std::string _get_target_file_name();
private:
- Status _projection_and_filter_block(doris::vectorized::Block& input_block,
- const vectorized::IColumn::Filter*
filter,
- doris::vectorized::Block*
output_block);
-
THivePartitionUpdate _build_partition_update();
std::string _get_file_extension(TFileFormatType::type file_format_type,
@@ -89,11 +84,10 @@ private:
size_t _row_count = 0;
- const VExprContextSPtrs& _vec_output_expr_ctxs;
const VExprContextSPtrs& _write_output_expr_ctxs;
- const std::set<size_t>& _non_write_columns_indices;
- const std::vector<THiveColumn>& _columns;
+ std::vector<std::string> _write_column_names;
+
WriteInfo _write_info;
std::string _file_name;
int _file_name_index;
diff --git a/be/src/vec/sink/writer/vhive_table_writer.cpp
b/be/src/vec/sink/writer/vhive_table_writer.cpp
index 76f16e3daaa..0e64060eb0b 100644
--- a/be/src/vec/sink/writer/vhive_table_writer.cpp
+++ b/be/src/vec/sink/writer/vhive_table_writer.cpp
@@ -20,6 +20,7 @@
#include "runtime/runtime_state.h"
#include "vec/core/block.h"
#include "vec/core/column_with_type_and_name.h"
+#include "vec/core/materialize_block.h"
#include "vec/exprs/vexpr.h"
#include "vec/exprs/vexpr_context.h"
#include "vec/sink/writer/vhive_partition_writer.h"
@@ -82,8 +83,17 @@ Status VHiveTableWriter::open(RuntimeState* state,
RuntimeProfile* profile) {
Status VHiveTableWriter::write(vectorized::Block& block) {
SCOPED_RAW_TIMER(&_send_data_ns);
+
+ if (block.rows() == 0) {
+ return Status::OK();
+ }
+ Block output_block;
+
RETURN_IF_ERROR(vectorized::VExprContext::get_output_block_after_execute_exprs(
+ _vec_output_expr_ctxs, block, &output_block, false));
+ materialize_block_inplace(output_block);
+
std::unordered_map<std::shared_ptr<VHivePartitionWriter>, IColumn::Filter>
writer_positions;
- _row_count += block.rows();
+ _row_count += output_block.rows();
auto& hive_table_sink = _t_sink.hive_table_sink;
if (_partition_columns_input_index.empty()) {
@@ -93,7 +103,7 @@ Status VHiveTableWriter::write(vectorized::Block& block) {
auto writer_iter = _partitions_to_writers.find("");
if (writer_iter == _partitions_to_writers.end()) {
try {
- writer = _create_partition_writer(block, -1);
+ writer = _create_partition_writer(output_block, -1);
} catch (doris::Exception& e) {
return e.to_status();
}
@@ -109,7 +119,7 @@ Status VHiveTableWriter::write(vectorized::Block& block) {
}
_partitions_to_writers.erase(writer_iter);
try {
- writer = _create_partition_writer(block, -1,
&file_name,
+ writer = _create_partition_writer(output_block, -1,
&file_name,
file_name_index + 1);
} catch (doris::Exception& e) {
return e.to_status();
@@ -122,16 +132,17 @@ Status VHiveTableWriter::write(vectorized::Block& block) {
}
}
SCOPED_RAW_TIMER(&_partition_writers_write_ns);
- RETURN_IF_ERROR(writer->write(block));
+ output_block.erase(_non_write_columns_indices);
+ RETURN_IF_ERROR(writer->write(output_block));
return Status::OK();
}
{
SCOPED_RAW_TIMER(&_partition_writers_dispatch_ns);
- for (int i = 0; i < block.rows(); ++i) {
+ for (int i = 0; i < output_block.rows(); ++i) {
std::vector<std::string> partition_values;
try {
- partition_values = _create_partition_values(block, i);
+ partition_values = _create_partition_values(output_block, i);
} catch (doris::Exception& e) {
return e.to_status();
}
@@ -143,10 +154,10 @@ Status VHiveTableWriter::write(vectorized::Block& block) {
const std::string* file_name, int file_name_index,
std::shared_ptr<VHivePartitionWriter>& writer_ptr) ->
Status {
try {
- auto writer =
- _create_partition_writer(block, position,
file_name, file_name_index);
+ auto writer = _create_partition_writer(output_block,
position, file_name,
+ file_name_index);
RETURN_IF_ERROR(writer->open(_state, _profile));
- IColumn::Filter filter(block.rows(), 0);
+ IColumn::Filter filter(output_block.rows(), 0);
filter[position] = 1;
writer_positions.insert({writer, std::move(filter)});
_partitions_to_writers.insert({partition_name, writer});
@@ -185,7 +196,7 @@ Status VHiveTableWriter::write(vectorized::Block& block) {
}
auto writer_pos_iter = writer_positions.find(writer);
if (writer_pos_iter == writer_positions.end()) {
- IColumn::Filter filter(block.rows(), 0);
+ IColumn::Filter filter(output_block.rows(), 0);
filter[i] = 1;
writer_positions.insert({writer, std::move(filter)});
} else {
@@ -195,12 +206,39 @@ Status VHiveTableWriter::write(vectorized::Block& block) {
}
}
SCOPED_RAW_TIMER(&_partition_writers_write_ns);
+ output_block.erase(_non_write_columns_indices);
for (auto it = writer_positions.begin(); it != writer_positions.end();
++it) {
- RETURN_IF_ERROR(it->first->write(block, &it->second));
+ Block filtered_block;
+ RETURN_IF_ERROR(_filter_block(output_block, &it->second,
&filtered_block));
+ RETURN_IF_ERROR(it->first->write(filtered_block));
}
return Status::OK();
}
+Status VHiveTableWriter::_filter_block(doris::vectorized::Block& block,
+ const vectorized::IColumn::Filter*
filter,
+ doris::vectorized::Block* output_block)
{
+ const ColumnsWithTypeAndName& columns_with_type_and_name =
+ block.get_columns_with_type_and_name();
+ vectorized::ColumnsWithTypeAndName result_columns;
+ for (int i = 0; i < columns_with_type_and_name.size(); ++i) {
+ const auto& col = columns_with_type_and_name[i];
+
result_columns.emplace_back(col.column->clone_resized(col.column->size()),
col.type,
+ col.name);
+ }
+ *output_block = {std::move(result_columns)};
+
+ std::vector<uint32_t> columns_to_filter;
+ int column_to_keep = output_block->columns();
+ columns_to_filter.resize(column_to_keep);
+ for (uint32_t i = 0; i < column_to_keep; ++i) {
+ columns_to_filter[i] = i;
+ }
+
+ Block::filter_block_internal(output_block, columns_to_filter, *filter);
+ return Status::OK();
+}
+
Status VHiveTableWriter::close(Status status) {
int64_t partitions_to_writers_size = _partitions_to_writers.size();
{
@@ -312,11 +350,18 @@ std::shared_ptr<VHivePartitionWriter>
VHiveTableWriter::_create_partition_writer
}
_write_file_count++;
+ std::vector<std::string> column_names;
+ column_names.reserve(hive_table_sink.columns.size());
+ for (int i = 0; i < hive_table_sink.columns.size(); i++) {
+ if (_non_write_columns_indices.find(i) ==
_non_write_columns_indices.end()) {
+ column_names.emplace_back(hive_table_sink.columns[i].name);
+ }
+ }
return std::make_shared<VHivePartitionWriter>(
- _t_sink, std::move(partition_name), update_mode,
_vec_output_expr_ctxs,
- _write_output_vexpr_ctxs, _non_write_columns_indices,
hive_table_sink.columns,
- std::move(write_info), (file_name == nullptr) ?
_compute_file_name() : *file_name,
- file_name_index, file_format_type, write_compress_type,
hive_table_sink.hadoop_config);
+ _t_sink, std::move(partition_name), update_mode,
_write_output_vexpr_ctxs,
+ std::move(column_names), std::move(write_info),
+ (file_name == nullptr) ? _compute_file_name() : *file_name,
file_name_index,
+ file_format_type, write_compress_type,
hive_table_sink.hadoop_config);
}
std::vector<std::string>
VHiveTableWriter::_create_partition_values(vectorized::Block& block,
diff --git a/be/src/vec/sink/writer/vhive_table_writer.h
b/be/src/vec/sink/writer/vhive_table_writer.h
index 3a3f45a6db1..4989ba443c7 100644
--- a/be/src/vec/sink/writer/vhive_table_writer.h
+++ b/be/src/vec/sink/writer/vhive_table_writer.h
@@ -20,6 +20,7 @@
#include <gen_cpp/DataSinks_types.h>
#include "util/runtime_profile.h"
+#include "vec/columns/column.h"
#include "vec/exprs/vexpr_fwd.h"
#include "vec/sink/writer/async_result_writer.h"
@@ -62,6 +63,9 @@ private:
std::string _compute_file_name();
+ Status _filter_block(doris::vectorized::Block& block, const
vectorized::IColumn::Filter* filter,
+ doris::vectorized::Block* output_block);
+
// Currently it is a copy, maybe it is better to use move semantics to
eliminate it.
TDataSink _t_sink;
RuntimeState* _state = nullptr;
diff --git
a/regression-test/data/external_table_p0/hive/ddl/test_hive_write_type.out
b/regression-test/data/external_table_p0/hive/ddl/test_hive_write_type.out
index 1f7d39971db..20d2758c2a6 100644
--- a/regression-test/data/external_table_p0/hive/ddl/test_hive_write_type.out
+++ b/regression-test/data/external_table_p0/hive/ddl/test_hive_write_type.out
@@ -8,6 +8,12 @@ a b c d e 1.1 12345
0.12345678 string [0.001, 0.002] ["char1", "char2"] ["c", "d
a b c d e 1.1 12345 0.12345678 string
\N \N \N \N \N \N \N \N \N \N
\N
a b c d e 1.1 12345 0.12345678 string
[0.001, 0.002] ["char1", "char2"] ["c", "d"] ["string1", "string2"]
[{1:"a"}, {2:"b"}] {1234567890123456789:"a"}
{1234567890123456789:0.12345678} {"key":["char1", "char2"]} {"id":
1, "gender": 1, "name": "John Doe"} {"scale": 123.4567, "metric":
["metric1", "metric2"]} {"codes": [123, 456], "props": {"key1":["char1",
"char2"]}}
+-- !columns_out_of_order01 --
+3 6 1 4 2 5
+
+-- !columns_out_of_order02 --
+1 2 3 4 5 6
+
-- !complex_type01 --
a \N \N \N \N \N \N \N \N \N
["char1", "char2"] ["c", "d"] ["string1", "string2"] [{1:"a"},
{2:"b"}] {1234567890123456789:"a"} {1234567890123456789:0.12345678}
{"key":["char1", "char2"]} {"id": 1, "gender": 1, "name": "John
Doe"} {"scale": 123.4567, "metric": ["metric1", "metric2"]} \N
a b c d e 1.1 12345 0.12345678 string
\N \N \N \N \N \N \N \N \N \N
\N
@@ -17,6 +23,12 @@ a b c d e 1.1 12345
0.12345678 string [0.001, 0.002] ["char1", "char2"] ["c", "d
a b c d e 1.1 12345 0.12345678 string
\N \N \N \N \N \N \N \N \N \N
\N
a b c d e 1.1 12345 0.12345678 string
[0.001, 0.002] ["char1", "char2"] ["c", "d"] ["string1", "string2"]
[{1:"a"}, {2:"b"}] {1234567890123456789:"a"}
{1234567890123456789:0.12345678} {"key":["char1", "char2"]} {"id":
1, "gender": 1, "name": "John Doe"} {"scale": 123.4567, "metric":
["metric1", "metric2"]} {"codes": [123, 456], "props": {"key1":["char1",
"char2"]}}
+-- !columns_out_of_order01 --
+3 6 1 4 2 5
+
+-- !columns_out_of_order02 --
+1 2 3 4 5 6
+
-- !complex_type01 --
a \N \N \N \N \N \N \N \N \N
["char1", "char2"] ["c", "d"] ["string1", "string2"] [{1:"a"},
{2:"b"}] {1234567890123456789:"a"} {1234567890123456789:0.12345678}
{"key":["char1", "char2"]} {"id": 1, "gender": 1, "name": "John
Doe"} {"scale": 123.4567, "metric": ["metric1", "metric2"]} \N
a b c d e 1.1 12345 0.12345678 string
\N \N \N \N \N \N \N \N \N \N
\N
@@ -26,6 +38,12 @@ a b c d e 1.1 12345
0.12345678 string [0.001, 0.002] ["char1", "char2"] ["c", "d
a b c d e 1.1 12345 0.12345678 string
\N \N \N \N \N \N \N \N \N \N
\N
a b c d e 1.1 12345 0.12345678 string
[0.001, 0.002] ["char1", "char2"] ["c", "d"] ["string1", "string2"]
[{1:"a"}, {2:"b"}] {1234567890123456789:"a"}
{1234567890123456789:0.12345678} {"key":["char1", "char2"]} {"id":
1, "gender": 1, "name": "John Doe"} {"scale": 123.4567, "metric":
["metric1", "metric2"]} {"codes": [123, 456], "props": {"key1":["char1",
"char2"]}}
+-- !columns_out_of_order01 --
+3 6 1 4 2 5
+
+-- !columns_out_of_order02 --
+1 2 3 4 5 6
+
-- !complex_type01 --
a \N \N \N \N \N \N \N \N \N
["char1", "char2"] ["c", "d"] ["string1", "string2"] [{1:"a"},
{2:"b"}] {1234567890123456789:"a"} {1234567890123456789:0.12345678}
{"key":["char1", "char2"]} {"id": 1, "gender": 1, "name": "John
Doe"} {"scale": 123.4567, "metric": ["metric1", "metric2"]} \N
a b c d e 1.1 12345 0.12345678 string
\N \N \N \N \N \N \N \N \N \N
\N
@@ -34,3 +52,10 @@ a b c d e 1.1 12345
0.12345678 string [0.001, 0.002] ["char1", "char2"] ["c", "d
-- !complex_type02 --
a b c d e 1.1 12345 0.12345678 string
\N \N \N \N \N \N \N \N \N \N
\N
a b c d e 1.1 12345 0.12345678 string
[0.001, 0.002] ["char1", "char2"] ["c", "d"] ["string1", "string2"]
[{1:"a"}, {2:"b"}] {1234567890123456789:"a"}
{1234567890123456789:0.12345678} {"key":["char1", "char2"]} {"id":
1, "gender": 1, "name": "John Doe"} {"scale": 123.4567, "metric":
["metric1", "metric2"]} {"codes": [123, 456], "props": {"key1":["char1",
"char2"]}}
+
+-- !columns_out_of_order01 --
+3 6 1 4 2 5
+
+-- !columns_out_of_order02 --
+1 2 3 4 5 6
+
diff --git
a/regression-test/suites/external_table_p0/hive/ddl/test_hive_write_type.groovy
b/regression-test/suites/external_table_p0/hive/ddl/test_hive_write_type.groovy
index cf3bd2a9037..0e1e1355afd 100644
---
a/regression-test/suites/external_table_p0/hive/ddl/test_hive_write_type.groovy
+++
b/regression-test/suites/external_table_p0/hive/ddl/test_hive_write_type.groovy
@@ -266,6 +266,62 @@ suite("test_hive_write_type",
"p0,external,hive,external_docker,external_docker_
sql """ DROP DATABASE ${catalog_name}.test_hive_ex """
}
+ def test_columns_out_of_order = { String file_format, String
catalog_name ->
+ sql """ switch ${catalog_name} """
+ sql """ create database if not exists `test_columns_out_of_order`
""";
+ sql """ use `${catalog_name}`.`test_columns_out_of_order` """
+
+ sql """ drop table if exists
columns_out_of_order_source_tbl_${file_format} """
+ sql """
+ CREATE TABLE columns_out_of_order_source_tbl_${file_format} (
+ `col3` bigint,
+ `col6` int,
+ `col1` bigint,
+ `col4` int,
+ `col2` bigint,
+ `col5` int
+ ) ENGINE = hive
+ PROPERTIES (
+ 'file_format'='${file_format}'
+ )
+ """;
+ sql """ drop table if exists
columns_out_of_order_target_tbl_${file_format} """
+ sql """
+ CREATE TABLE columns_out_of_order_target_tbl_${file_format} (
+ `col1` bigint,
+ `col2` bigint,
+ `col3` bigint,
+ `col4` int,
+ `col5` int,
+ `col6` int
+ ) ENGINE = hive PARTITION BY LIST (
+ col4, col5, col6
+ )()
+ PROPERTIES (
+ 'file_format'='${file_format}'
+ )
+ """;
+
+ sql """
+ INSERT INTO columns_out_of_order_source_tbl_${file_format} (
+ col1, col2, col3, col4, col5, col6
+ ) VALUES (1, 2, 3, 4, 5, 6);
+ """
+ order_qt_columns_out_of_order01 """ SELECT * FROM
columns_out_of_order_source_tbl_${file_format} """
+
+ sql """
+ INSERT INTO columns_out_of_order_target_tbl_${file_format} (
+ col1, col2, col3, col4, col5, col6
+ ) VALUES (1, 2, 3, 4, 5, 6);
+ """
+
+ order_qt_columns_out_of_order02 """ SELECT * FROM
columns_out_of_order_target_tbl_${file_format} """
+
+ sql """ drop table columns_out_of_order_source_tbl_${file_format}
"""
+ sql """ drop table columns_out_of_order_target_tbl_${file_format}
"""
+ sql """ drop database if exists `test_columns_out_of_order` """;
+ }
+
try {
String hms_port = context.config.otherConfigs.get(hivePrefix +
"HmsPort")
String hdfs_port = context.config.otherConfigs.get(hivePrefix +
"HdfsPort")
@@ -285,6 +341,7 @@ suite("test_hive_write_type",
"p0,external,hive,external_docker,external_docker_
logger.info("Process file format" + file_format)
test_complex_type_tbl(file_format, catalog_name)
test_insert_exception(file_format, catalog_name)
+ test_columns_out_of_order(file_format, catalog_name)
}
sql """drop catalog if exists ${catalog_name}"""
} finally {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]