You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by kx...@apache.org on 2023/06/26 12:35:58 UTC

[doris] 05/09: [bug](jdbc catalog) fix getPrimaryKeys fun bug (#21137)

This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 5e8aa0aaab433d0dc4758f5e5d4c6ee40ab0b917
Author: zy-kkk <zh...@gmail.com>
AuthorDate: Mon Jun 26 17:13:50 2023 +0800

    [bug](jdbc catalog) fix getPrimaryKeys fun bug (#21137)
---
 .../org/apache/doris/external/jdbc/JdbcClient.java | 20 ++++------------
 .../doris/external/jdbc/JdbcMySQLClient.java       | 28 +++++++++-------------
 2 files changed, 16 insertions(+), 32 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/external/jdbc/JdbcClient.java b/fe/fe-core/src/main/java/org/apache/doris/external/jdbc/JdbcClient.java
index 505686da7e..4abe061d57 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/external/jdbc/JdbcClient.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/external/jdbc/JdbcClient.java
@@ -292,7 +292,6 @@ public abstract class JdbcClient {
             String catalogName = getCatalogName(conn);
             tableName = modifyTableNameIfNecessary(tableName);
             rs = getColumns(databaseMetaData, catalogName, dbName, tableName);
-            List<String> primaryKeys = getPrimaryKeys(dbName, tableName);
             while (rs.next()) {
                 if (isTableModified(tableName, rs.getString("TABLE_NAME"))) {
                     continue;
@@ -301,7 +300,11 @@ public abstract class JdbcClient {
                 field.setColumnName(rs.getString("COLUMN_NAME"));
                 field.setDataType(rs.getInt("DATA_TYPE"));
                 field.setDataTypeName(rs.getString("TYPE_NAME"));
-                field.setKey(primaryKeys.contains(field.getColumnName()));
+                /*
+                   We used this method to retrieve the key column of the JDBC table, but since we only tested mysql,
+                   we kept the default key behavior in the parent class and only overwrite it in the mysql subclass
+                */
+                field.setKey(true);
                 field.setColumnSize(rs.getInt("COLUMN_SIZE"));
                 field.setDecimalDigits(rs.getInt("DECIMAL_DIGITS"));
                 field.setNumPrecRadix(rs.getInt("NUM_PREC_RADIX"));
@@ -389,19 +392,6 @@ public abstract class JdbcClient {
         return databaseMetaData.getColumns(catalogName, schemaName, tableName, null);
     }
 
-    /**
-     * We used this method to retrieve the key column of the JDBC table, but since we only tested mysql,
-     * we kept the default key behavior in the parent class and only overwrite it in the mysql subclass
-     */
-    protected List<String> getPrimaryKeys(String dbName, String tableName) {
-        List<String> primaryKeys = Lists.newArrayList();
-        List<JdbcFieldSchema> columns = getJdbcColumnsInfo(dbName, tableName);
-        for (JdbcFieldSchema column : columns) {
-            primaryKeys.add(column.getColumnName());
-        }
-        return primaryKeys;
-    }
-
     @Data
     protected static class JdbcFieldSchema {
         protected String columnName;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/external/jdbc/JdbcMySQLClient.java b/fe/fe-core/src/main/java/org/apache/doris/external/jdbc/JdbcMySQLClient.java
index 9863bcc1c2..c5ceefb89d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/external/jdbc/JdbcMySQLClient.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/external/jdbc/JdbcMySQLClient.java
@@ -136,7 +136,7 @@ public class JdbcMySQLClient extends JdbcClient {
             String catalogName = getCatalogName(conn);
             tableName = modifyTableNameIfNecessary(tableName);
             rs = getColumns(databaseMetaData, catalogName, dbName, tableName);
-            List<String> primaryKeys = getPrimaryKeys(dbName, tableName);
+            List<String> primaryKeys = getPrimaryKeys(databaseMetaData, catalogName, dbName, tableName);
             boolean needGetDorisColumns = true;
             Map<String, String> mapFieldtoType = null;
             while (rs.next()) {
@@ -201,24 +201,18 @@ public class JdbcMySQLClient extends JdbcClient {
         return dorisTableSchema;
     }
 
-    @Override
-    protected List<String> getPrimaryKeys(String dbName, String tableName) {
-        List<String> primaryKeys = Lists.newArrayList();
-        Connection conn = null;
+    protected List<String> getPrimaryKeys(DatabaseMetaData databaseMetaData, String catalogName,
+                                          String dbName, String tableName) throws SQLException {
         ResultSet rs = null;
-        try {
-            conn = getConnection();
-            DatabaseMetaData databaseMetaData = conn.getMetaData();
-            rs = databaseMetaData.getPrimaryKeys(dbName, null, tableName);
-            while (rs.next()) {
-                String columnName = rs.getString("COLUMN_NAME");
-                primaryKeys.add(columnName);
-            }
-        } catch (SQLException e) {
-            throw new JdbcClientException("Failed to get primary keys for table", e);
-        } finally {
-            close(rs, conn);
+        List<String> primaryKeys = Lists.newArrayList();
+
+        rs = databaseMetaData.getPrimaryKeys(dbName, null, tableName);
+        while (rs.next()) {
+            String columnName = rs.getString("COLUMN_NAME");
+            primaryKeys.add(columnName);
         }
+        rs.close();
+
         return primaryKeys;
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org