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 8749e5208f7 [fix](jdbc catalog) fix insert into jdbc table column 
order (#27855)
8749e5208f7 is described below

commit 8749e5208f748589c5b71e4295205767e1bae91d
Author: zy-kkk <[email protected]>
AuthorDate: Fri Dec 1 20:46:48 2023 +0800

    [fix](jdbc catalog) fix insert into jdbc table column order (#27855)
---
 .../apache/doris/analysis/NativeInsertStmt.java    | 16 +++++++++-----
 .../doris/planner/external/jdbc/JdbcTableSink.java |  1 +
 .../jdbc/test_doris_jdbc_catalog.out               |  4 ++++
 .../jdbc/test_doris_jdbc_catalog.groovy            | 25 ++++++++++++++++++++++
 4 files changed, 41 insertions(+), 5 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java
index 2f268de58cd..b69ed837b83 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java
@@ -998,12 +998,18 @@ public class NativeInsertStmt extends InsertStmt {
                     brokerDesc);
             dataPartition = dataSink.getOutputPartition();
         } else if (targetTable instanceof JdbcTable) {
-            //for JdbcTable,we need to pass the currently written column to 
`JdbcTableSink`
-            //to generate the prepare insert statment
-            List<String> insertCols = Lists.newArrayList();
-            for (Column column : targetColumns) {
-                insertCols.add(column.getName());
+            // For JdbcTable, reorder targetColumns to match the order in 
targetTable.getFullSchema()
+            List<String> insertCols = new ArrayList<>();
+            Set<String> targetColumnNames = targetColumns.stream()
+                    .map(Column::getName)
+                    .collect(Collectors.toSet());
+
+            for (Column column : targetTable.getFullSchema()) {
+                if (targetColumnNames.contains(column.getName())) {
+                    insertCols.add(column.getName());
+                }
             }
+
             dataSink = new JdbcTableSink((JdbcTable) targetTable, insertCols);
             dataPartition = DataPartition.UNPARTITIONED;
         } else {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/jdbc/JdbcTableSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/jdbc/JdbcTableSink.java
index 6a767ff1856..1f85ac3feff 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/jdbc/JdbcTableSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/jdbc/JdbcTableSink.java
@@ -73,6 +73,7 @@ public class JdbcTableSink extends DataSink {
         strBuilder.append(prefix + "TABLE TYPE: 
").append(jdbcType.toString()).append("\n");
         strBuilder.append(prefix + "TABLENAME OF EXTERNAL TABLE: 
").append(externalTableName).append("\n");
         strBuilder.append(prefix + "EnableTransaction: 
").append(useTransaction ? "true" : "false").append("\n");
+        strBuilder.append(prefix + "PreparedStatement SQL: 
").append(insertSql).append("\n");
         return strBuilder.toString();
     }
 
diff --git 
a/regression-test/data/external_table_p0/jdbc/test_doris_jdbc_catalog.out 
b/regression-test/data/external_table_p0/jdbc/test_doris_jdbc_catalog.out
index 2e686056d40..b4ac823517a 100644
--- a/regression-test/data/external_table_p0/jdbc/test_doris_jdbc_catalog.out
+++ b/regression-test/data/external_table_p0/jdbc/test_doris_jdbc_catalog.out
@@ -114,6 +114,10 @@ true       1       1       1       1       1       1.0     
1.0     1.00000 1.0000000000    2021-01-01      2021-01-01T00:00        a       
a       {"a"
 1      [1]     [1]     [1]     [1]     [1]     [1]     [1]     [1]     
[1.00000]       [1.0000000000]  ["2021-01-01"]  ["2021-01-01 00:00:00.000"]     
["a"]   ["a"]   ["a"]
 2      \N      \N      \N      \N      \N      \N      \N      \N      \N      
\N      \N      \N      \N      \N      \N
 
+-- !sql --
+g1     1       2       3       4       p1
+g2     1       2       3       4       p2
+
 -- !sql --
 doris_jdbc_catalog
 
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 c92f285972d..4464c186a6c 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
@@ -158,6 +158,25 @@ suite("test_doris_jdbc_catalog", 
"p0,external,doris,external_docker,external_doc
     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 """drop table if exists test_insert_order"""
+
+    sql """
+         CREATE TABLE test_insert_order (
+             gameid varchar(50) NOT NULL DEFAULT "",
+             aid int(11) NOT NULL DEFAULT "0",
+             bid int(11) NOT NULL DEFAULT "0",
+             cid int(11) NOT NULL DEFAULT "0",
+             did int(11) NOT NULL DEFAULT "0",
+             pname varchar(255) NOT NULL DEFAULT "其他"
+         ) ENGINE=OLAP
+         UNIQUE KEY(gameid, aid, bid, cid)
+         COMMENT 'OLAP'
+         DISTRIBUTED BY HASH(gameid) BUCKETS 3
+         PROPERTIES (
+             "replication_allocation" = "tag.location.default: 1"
+         );
+    """
+
 
     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; """
@@ -180,6 +199,11 @@ suite("test_doris_jdbc_catalog", 
"p0,external,doris,external_docker,external_doc
     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; """
 
+    // test insert order
+    sql """insert into test_insert_order(gameid,did,cid,bid,aid,pname) 
values('g1',4,3,2,1,'p1')""";
+    sql """insert into test_insert_order(gameid,did,cid,bid,aid,pname) select 
'g2',4,3,2,1,'p2'""";
+    qt_sql """select * from test_insert_order order by gameid, aid, bid, cid, 
did;"""
+
     //clean
     qt_sql """select current_catalog()"""
     sql "switch internal"
@@ -189,5 +213,6 @@ suite("test_doris_jdbc_catalog", 
"p0,external,doris,external_docker,external_doc
     sql """ drop table if exists ${hllTable} """
     sql """ drop table if exists ${base_table} """
     sql """ drop table if exists ${arr_table} """
+    sql """ drop table if exists test_insert_order """
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to