You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/10/04 13:24:44 UTC
[doris] branch master updated: [fix](jdbc) fix insert into date type to oracle using wrong type (#12883)
This is an automated email from the ASF dual-hosted git repository.
morningman 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 e167aa120f [fix](jdbc) fix insert into date type to oracle using wrong type (#12883)
e167aa120f is described below
commit e167aa120f913fb5280d5b5f2d28740465056936
Author: zhangstar333 <87...@users.noreply.github.com>
AuthorDate: Tue Oct 4 21:24:33 2022 +0800
[fix](jdbc) fix insert into date type to oracle using wrong type (#12883)
using JDBC insert into date type to ORACLE,
it's should be use to_date function convert string to java.sql.date
---
be/src/exec/table_connector.cpp | 34 ++++++++++++++++++----
be/src/exec/table_connector.h | 3 +-
be/src/vec/sink/vjdbc_table_sink.cpp | 3 +-
be/src/vec/sink/vjdbc_table_sink.h | 2 ++
.../org/apache/doris/planner/JdbcTableSink.java | 1 +
gensrc/thrift/DataSinks.thrift | 1 +
6 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/be/src/exec/table_connector.cpp b/be/src/exec/table_connector.cpp
index 27af61c8f3..235ac3b517 100644
--- a/be/src/exec/table_connector.cpp
+++ b/be/src/exec/table_connector.cpp
@@ -154,13 +154,27 @@ Status TableConnector::append(const std::string& table_name, RowBatch* batch,
Status TableConnector::append(const std::string& table_name, vectorized::Block* block,
const std::vector<vectorized::VExprContext*>& output_vexpr_ctxs,
- uint32_t start_send_row, uint32_t* num_rows_sent) {
+ uint32_t start_send_row, uint32_t* num_rows_sent,
+ bool need_extra_convert) {
_insert_stmt_buffer.clear();
std::u16string insert_stmt;
{
SCOPED_TIMER(_convert_tuple_timer);
fmt::format_to(_insert_stmt_buffer, "INSERT INTO {} VALUES (", table_name);
+ auto extra_convert_func = [&](const std::string_view& str, const bool& is_date) -> void {
+ if (!need_extra_convert) {
+ fmt::format_to(_insert_stmt_buffer, "'{}'", str);
+ } else {
+ if (is_date) {
+ fmt::format_to(_insert_stmt_buffer, "to_date('{}','yyyy-mm-dd')", str);
+ } else {
+ fmt::format_to(_insert_stmt_buffer, "to_date('{}','yyyy-mm-dd hh24:mi:ss')",
+ str);
+ }
+ }
+ };
+
int num_rows = block->rows();
int num_columns = block->columns();
for (int i = start_send_row; i < num_rows; ++i) {
@@ -211,7 +225,17 @@ Status TableConnector::append(const std::string& table_name, vectorized::Block*
fmt::format_to(_insert_stmt_buffer, "{}",
*reinterpret_cast<const double*>(item));
break;
- case TYPE_DATE:
+ case TYPE_DATE: {
+ vectorized::VecDateTimeValue value =
+ binary_cast<int64_t, doris::vectorized::VecDateTimeValue>(
+ *(int64_t*)item);
+
+ char buf[64];
+ char* pos = value.to_string(buf);
+ std::string_view str(buf, pos - buf - 1);
+ extra_convert_func(str, true);
+ break;
+ }
case TYPE_DATETIME: {
vectorized::VecDateTimeValue value =
binary_cast<int64_t, doris::vectorized::VecDateTimeValue>(
@@ -220,7 +244,7 @@ Status TableConnector::append(const std::string& table_name, vectorized::Block*
char buf[64];
char* pos = value.to_string(buf);
std::string_view str(buf, pos - buf - 1);
- fmt::format_to(_insert_stmt_buffer, "'{}'", str);
+ extra_convert_func(str, false);
break;
}
case TYPE_DATEV2: {
@@ -231,7 +255,7 @@ Status TableConnector::append(const std::string& table_name, vectorized::Block*
char buf[64];
char* pos = value.to_string(buf);
std::string str(buf, pos - buf - 1);
- fmt::format_to(_insert_stmt_buffer, "'{}'", str);
+ extra_convert_func(str, true);
break;
}
case TYPE_DATETIMEV2: {
@@ -243,7 +267,7 @@ Status TableConnector::append(const std::string& table_name, vectorized::Block*
char buf[64];
char* pos = value.to_string(buf, output_vexpr_ctxs[i]->root()->type().scale);
std::string str(buf, pos - buf - 1);
- fmt::format_to(_insert_stmt_buffer, "'{}'", str);
+ extra_convert_func(str, false);
break;
}
case TYPE_VARCHAR:
diff --git a/be/src/exec/table_connector.h b/be/src/exec/table_connector.h
index 8b636bab5a..06bdadd380 100644
--- a/be/src/exec/table_connector.h
+++ b/be/src/exec/table_connector.h
@@ -57,7 +57,8 @@ public:
//write data into table vectorized
Status append(const std::string& table_name, vectorized::Block* block,
const std::vector<vectorized::VExprContext*>& _output_vexpr_ctxs,
- uint32_t start_send_row, uint32_t* num_rows_sent);
+ uint32_t start_send_row, uint32_t* num_rows_sent,
+ bool need_extra_convert = false);
void init_profile(RuntimeProfile*);
diff --git a/be/src/vec/sink/vjdbc_table_sink.cpp b/be/src/vec/sink/vjdbc_table_sink.cpp
index b1037d9a6f..b4ad942a3d 100644
--- a/be/src/vec/sink/vjdbc_table_sink.cpp
+++ b/be/src/vec/sink/vjdbc_table_sink.cpp
@@ -47,6 +47,7 @@ Status VJdbcTableSink::init(const TDataSink& t_sink) {
_jdbc_param.resource_name = t_jdbc_sink.jdbc_table.jdbc_resource_name;
_table_name = t_jdbc_sink.jdbc_table.jdbc_table_name;
_use_transaction = t_jdbc_sink.use_transaction;
+ _need_extra_convert = (t_jdbc_sink.table_type == TOdbcTableType::ORACLE);
return Status::OK();
}
@@ -81,7 +82,7 @@ Status VJdbcTableSink::send(RuntimeState* state, Block* block) {
uint32_t num_row_sent = 0;
while (start_send_row < output_block.rows()) {
RETURN_IF_ERROR(_writer->append(_table_name, &output_block, _output_vexpr_ctxs,
- start_send_row, &num_row_sent));
+ start_send_row, &num_row_sent, _need_extra_convert));
start_send_row += num_row_sent;
num_row_sent = 0;
}
diff --git a/be/src/vec/sink/vjdbc_table_sink.h b/be/src/vec/sink/vjdbc_table_sink.h
index 726e276bdf..9f4d42ad5a 100644
--- a/be/src/vec/sink/vjdbc_table_sink.h
+++ b/be/src/vec/sink/vjdbc_table_sink.h
@@ -40,6 +40,8 @@ public:
private:
JdbcConnectorParam _jdbc_param;
std::unique_ptr<JdbcConnector> _writer;
+ //if is ORACLE and date type, insert into need convert
+ bool _need_extra_convert = false;
};
} // namespace vectorized
} // namespace doris
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcTableSink.java b/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcTableSink.java
index eefe8a2a00..5135145447 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcTableSink.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcTableSink.java
@@ -85,6 +85,7 @@ public class JdbcTableSink extends DataSink {
jdbcTableSink.jdbc_table.setJdbcDriverChecksum(checkSum);
jdbcTableSink.jdbc_table.setJdbcResourceName(resourceName);
jdbcTableSink.setUseTransaction(useTransaction);
+ jdbcTableSink.setTableType(jdbcType);
tDataSink.setJdbcTableSink(jdbcTableSink);
return tDataSink;
diff --git a/gensrc/thrift/DataSinks.thrift b/gensrc/thrift/DataSinks.thrift
index 422e6cad00..01fe5f2b6e 100644
--- a/gensrc/thrift/DataSinks.thrift
+++ b/gensrc/thrift/DataSinks.thrift
@@ -154,6 +154,7 @@ struct TOdbcTableSink {
struct TJdbcTableSink {
1: optional Descriptors.TJdbcTable jdbc_table
2: optional bool use_transaction
+ 3: optional Types.TOdbcTableType table_type
}
struct TExportSink {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org