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