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/12/19 07:15:31 UTC

[doris] 07/08: [fix](mutil-catalog) fix get many same name db/table when show where (#15076)

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

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 5a3985219932e62608a50fc683fca0f04339e352
Author: xueweizhang <zx...@163.com>
AuthorDate: Mon Dec 19 14:27:48 2022 +0800

    [fix](mutil-catalog) fix get many same name db/table when show where (#15076)
    
    when show databases/tables/table status where xxx, it will change a selectStmt to select result from
    information_schema, it need catalog info to scan schema table, otherwise may get many
    database or table info from multi catalog.
    
    for example
    mysql> show databases where schema_name='test';
    +----------+
    | Database |
    +----------+
    | test |
    | test |
    +----------+
    
    MySQL [internal.test]> show tables from test where table_name='test_dc';
    +----------------+
    | Tables_in_test |
    +----------------+
    | test_dc |
    | test_dc |
    +----------------+
---
 be/src/exec/schema_scan_node.cpp                   |  4 ++
 be/src/exec/schema_scanner.h                       |  4 +-
 .../exec/schema_scanner/schema_columns_scanner.cpp |  3 +
 .../exec/schema_scanner/schema_files_scanner.cpp   |  3 +
 .../schema_scanner/schema_partitions_scanner.cpp   |  3 +
 .../schema_scanner/schema_schemata_scanner.cpp     |  3 +
 .../exec/schema_scanner/schema_tables_scanner.cpp  |  3 +
 .../exec/schema_scanner/schema_views_scanner.cpp   |  3 +
 be/src/vec/exec/vschema_scan_node.cpp              |  4 ++
 .../java/org/apache/doris/analysis/Analyzer.java   |  8 ++-
 .../org/apache/doris/analysis/ShowColumnStmt.java  |  2 +-
 .../java/org/apache/doris/analysis/ShowDbStmt.java |  6 +-
 .../apache/doris/analysis/ShowTableStatusStmt.java |  3 +-
 .../org/apache/doris/analysis/ShowTableStmt.java   |  3 +-
 .../apache/doris/analysis/ShowVariablesStmt.java   |  2 +-
 .../org/apache/doris/planner/SchemaScanNode.java   |  5 ++
 .../apache/doris/service/FrontendServiceImpl.java  |  8 ++-
 gensrc/thrift/FrontendService.thrift               |  1 +
 gensrc/thrift/PlanNodes.thrift                     |  1 +
 .../data/query_p0/show/test_show_where.out         | 27 ++++++++
 .../suites/query_p0/show/test_show_where.groovy    | 81 ++++++++++++++++++++++
 21 files changed, 169 insertions(+), 8 deletions(-)

diff --git a/be/src/exec/schema_scan_node.cpp b/be/src/exec/schema_scan_node.cpp
index e52cddb98f..9b792f2ce7 100644
--- a/be/src/exec/schema_scan_node.cpp
+++ b/be/src/exec/schema_scan_node.cpp
@@ -87,6 +87,10 @@ Status SchemaScanNode::init(const TPlanNode& tnode, RuntimeState* state) {
         _scanner_param.table_structure = _pool->add(
                 new std::vector<TSchemaTableStructure>(tnode.schema_scan_node.table_structure));
     }
+
+    if (tnode.schema_scan_node.__isset.catalog) {
+        _scanner_param.catalog = _pool->add(new std::string(tnode.schema_scan_node.catalog));
+    }
     return Status::OK();
 }
 
diff --git a/be/src/exec/schema_scanner.h b/be/src/exec/schema_scanner.h
index 33b73b894c..9d2fa1c5fe 100644
--- a/be/src/exec/schema_scanner.h
+++ b/be/src/exec/schema_scanner.h
@@ -44,6 +44,7 @@ struct SchemaScannerParam {
     int32_t port;                            // frontend thrift port
     int64_t thread_id;
     const std::vector<TSchemaTableStructure>* table_structure;
+    const std::string* catalog;
 
     SchemaScannerParam()
             : db(nullptr),
@@ -53,7 +54,8 @@ struct SchemaScannerParam {
               user_ip(nullptr),
               current_user_ident(nullptr),
               ip(nullptr),
-              port(0) {}
+              port(0),
+              catalog(nullptr) {}
 };
 
 // virtual scanner for all schema table
diff --git a/be/src/exec/schema_scanner/schema_columns_scanner.cpp b/be/src/exec/schema_scanner/schema_columns_scanner.cpp
index 35d6f28518..3ccdfc42ab 100644
--- a/be/src/exec/schema_scanner/schema_columns_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_columns_scanner.cpp
@@ -70,6 +70,9 @@ Status SchemaColumnsScanner::start(RuntimeState* state) {
     if (nullptr != _param->db) {
         db_params.__set_pattern(*(_param->db));
     }
+    if (nullptr != _param->catalog) {
+        db_params.__set_catalog(*(_param->catalog));
+    }
     if (nullptr != _param->current_user_ident) {
         db_params.__set_current_user_ident(*_param->current_user_ident);
     } else {
diff --git a/be/src/exec/schema_scanner/schema_files_scanner.cpp b/be/src/exec/schema_scanner/schema_files_scanner.cpp
index ffd9800d5b..d237d3da6e 100644
--- a/be/src/exec/schema_scanner/schema_files_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_files_scanner.cpp
@@ -81,6 +81,9 @@ Status SchemaFilesScanner::start(RuntimeState* state) {
     if (NULL != _param->db) {
         db_params.__set_pattern(*(_param->db));
     }
+    if (nullptr != _param->catalog) {
+        db_params.__set_catalog(*(_param->catalog));
+    }
     if (NULL != _param->current_user_ident) {
         db_params.__set_current_user_ident(*(_param->current_user_ident));
     } else {
diff --git a/be/src/exec/schema_scanner/schema_partitions_scanner.cpp b/be/src/exec/schema_scanner/schema_partitions_scanner.cpp
index 204d222afc..018e86ede5 100644
--- a/be/src/exec/schema_scanner/schema_partitions_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_partitions_scanner.cpp
@@ -69,6 +69,9 @@ Status SchemaPartitionsScanner::start(RuntimeState* state) {
     if (NULL != _param->db) {
         db_params.__set_pattern(*(_param->db));
     }
+    if (nullptr != _param->catalog) {
+        db_params.__set_catalog(*(_param->catalog));
+    }
     if (NULL != _param->current_user_ident) {
         db_params.__set_current_user_ident(*(_param->current_user_ident));
     } else {
diff --git a/be/src/exec/schema_scanner/schema_schemata_scanner.cpp b/be/src/exec/schema_scanner/schema_schemata_scanner.cpp
index 26e0ea580c..278e93ddb1 100644
--- a/be/src/exec/schema_scanner/schema_schemata_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_schemata_scanner.cpp
@@ -46,6 +46,9 @@ Status SchemaSchemataScanner::start(RuntimeState* state) {
     if (nullptr != _param->wild) {
         db_params.__set_pattern(*(_param->wild));
     }
+    if (nullptr != _param->catalog) {
+        db_params.__set_catalog(*(_param->catalog));
+    }
     if (nullptr != _param->current_user_ident) {
         db_params.__set_current_user_ident(*(_param->current_user_ident));
     } else {
diff --git a/be/src/exec/schema_scanner/schema_tables_scanner.cpp b/be/src/exec/schema_scanner/schema_tables_scanner.cpp
index 381c047b53..8bf05b894f 100644
--- a/be/src/exec/schema_scanner/schema_tables_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_tables_scanner.cpp
@@ -64,6 +64,9 @@ Status SchemaTablesScanner::start(RuntimeState* state) {
     if (nullptr != _param->db) {
         db_params.__set_pattern(*(_param->db));
     }
+    if (nullptr != _param->catalog) {
+        db_params.__set_catalog(*(_param->catalog));
+    }
     if (nullptr != _param->current_user_ident) {
         db_params.__set_current_user_ident(*(_param->current_user_ident));
     } else {
diff --git a/be/src/exec/schema_scanner/schema_views_scanner.cpp b/be/src/exec/schema_scanner/schema_views_scanner.cpp
index b48948716b..4df4d1de31 100644
--- a/be/src/exec/schema_scanner/schema_views_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_views_scanner.cpp
@@ -53,6 +53,9 @@ Status SchemaViewsScanner::start(RuntimeState* state) {
     if (nullptr != _param->db) {
         db_params.__set_pattern(*(_param->db));
     }
+    if (nullptr != _param->catalog) {
+        db_params.__set_catalog(*(_param->catalog));
+    }
     if (nullptr != _param->current_user_ident) {
         db_params.__set_current_user_ident(*(_param->current_user_ident));
     } else {
diff --git a/be/src/vec/exec/vschema_scan_node.cpp b/be/src/vec/exec/vschema_scan_node.cpp
index a50e91b510..250ea9bdb3 100644
--- a/be/src/vec/exec/vschema_scan_node.cpp
+++ b/be/src/vec/exec/vschema_scan_node.cpp
@@ -97,6 +97,10 @@ Status VSchemaScanNode::init(const TPlanNode& tnode, RuntimeState* state) {
         _scanner_param.table_structure = _pool->add(
                 new std::vector<TSchemaTableStructure>(tnode.schema_scan_node.table_structure));
     }
+
+    if (tnode.schema_scan_node.__isset.catalog) {
+        _scanner_param.catalog = _pool->add(new std::string(tnode.schema_scan_node.catalog));
+    }
     return Status::OK();
 }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index dcefba23ea..a34146c607 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -139,6 +139,7 @@ public class Analyzer {
     private final Map<TupleId, Integer> currentOutputColumn = Maps.newHashMap();
     // used for Information Schema Table Scan
     private String schemaDb;
+    private String schemaCatalog;
     private String schemaWild;
     private String schemaTable; // table used in DESCRIBE Table
 
@@ -2025,6 +2026,10 @@ public class Analyzer {
         return schemaDb;
     }
 
+    public String getSchemaCatalog() {
+        return schemaCatalog;
+    }
+
     public String getSchemaTable() {
         return schemaTable;
     }
@@ -2044,10 +2049,11 @@ public class Analyzer {
     }
 
     // for Schema Table Schema like SHOW TABLES LIKE "abc%"
-    public void setSchemaInfo(String db, String table, String wild) {
+    public void setSchemaInfo(String db, String table, String wild, String catalog) {
         schemaDb = db;
         schemaTable = table;
         schemaWild = wild;
+        schemaCatalog = catalog;
     }
 
     public String getTargetDbName(FunctionName fnName) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStmt.java
index f50e698cda..e4b103b415 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStmt.java
@@ -164,7 +164,7 @@ public class ShowColumnStmt extends ShowStmt {
         selectStmt = new SelectStmt(selectList,
                 new FromClause(Lists.newArrayList(new TableRef(TABLE_NAME, null))),
                 where, null, null, null, LimitElement.NO_LIMIT);
-        analyzer.setSchemaInfo(tableName.getDb(), tableName.getTbl(), null);
+        analyzer.setSchemaInfo(tableName.getDb(), tableName.getTbl(), null, tableName.getCtl());
 
         return selectStmt;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDbStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDbStmt.java
index 29d65c9feb..e29605a640 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDbStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDbStmt.java
@@ -88,7 +88,11 @@ public class ShowDbStmt extends ShowStmt {
         selectStmt = new SelectStmt(selectList,
                 new FromClause(Lists.newArrayList(new TableRef(TABLE_NAME, null))),
                 where, null, null, null, LimitElement.NO_LIMIT);
-
+        if (catalogName != null) {
+            analyzer.setSchemaInfo(null, null, null, catalogName);
+        } else {
+            analyzer.setSchemaInfo(null, null, null, analyzer.getDefaultCatalog());
+        }
         return selectStmt;
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatusStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatusStmt.java
index 956735b3c8..a4fe257cb3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatusStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatusStmt.java
@@ -183,7 +183,8 @@ public class ShowTableStatusStmt extends ShowStmt {
         selectStmt = new SelectStmt(selectList,
                 new FromClause(Lists.newArrayList(new TableRef(TABLE_NAME, null))),
                 where, null, null, null, LimitElement.NO_LIMIT);
-        analyzer.setSchemaInfo(db, null, null);
+        analyzer.setSchemaInfo(ClusterNamespace.getNameFromFullName(db), null, null,
+                                analyzer.getDefaultCatalog());
 
         return selectStmt;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStmt.java
index dc5acfd09d..20971a0309 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStmt.java
@@ -114,7 +114,8 @@ public class ShowTableStmt extends ShowStmt {
                 new FromClause(Lists.newArrayList(new TableRef(TABLE_NAME, null))),
                 where, null, null, null, LimitElement.NO_LIMIT);
 
-        analyzer.setSchemaInfo(ClusterNamespace.getNameFromFullName(db), null, null);
+        analyzer.setSchemaInfo(ClusterNamespace.getNameFromFullName(db), null, null,
+                                analyzer.getDefaultCatalog());
 
         return selectStmt;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowVariablesStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowVariablesStmt.java
index bce1499ef9..2670a59414 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowVariablesStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowVariablesStmt.java
@@ -106,7 +106,7 @@ public class ShowVariablesStmt extends ShowStmt {
 
         // DB: type
         // table: thread id
-        analyzer.setSchemaInfo(type.toSql(), null, null);
+        analyzer.setSchemaInfo(type.toSql(), null, null, null);
         return selectStmt;
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SchemaScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SchemaScanNode.java
index 4b5f5001b4..f00c8683f3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SchemaScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SchemaScanNode.java
@@ -52,6 +52,7 @@ public class SchemaScanNode extends ScanNode {
     private String userIp;
     private String frontendIP;
     private int frontendPort;
+    private String schemaCatalog;
 
     /**
      * Constructs node to scan given data files of table 'tbl'.
@@ -77,6 +78,7 @@ public class SchemaScanNode extends ScanNode {
         userIp = analyzer.getContext().getRemoteIP();
         frontendIP = FrontendOptions.getLocalHostAddress();
         frontendPort = Config.rpc_port;
+        schemaCatalog = analyzer.getSchemaCatalog();
     }
 
     @Override
@@ -92,6 +94,9 @@ public class SchemaScanNode extends ScanNode {
                 msg.schema_scan_node.setDb("SESSION");
             }
         }
+        if (schemaCatalog != null) {
+            msg.schema_scan_node.setCatalog(schemaCatalog);
+        }
         msg.schema_scan_node.show_hidden_cloumns = Util.showHiddenColumns();
 
         if (schemaTable != null) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
index e4d0936fd1..5742042697 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
@@ -173,7 +173,13 @@ public class FrontendServiceImpl implements FrontendService.Iface {
         }
 
         Env env = Env.getCurrentEnv();
-        List<CatalogIf> catalogIfs = env.getCatalogMgr().listCatalogs();
+        List<CatalogIf> catalogIfs = Lists.newArrayList();
+        if (Strings.isNullOrEmpty(params.catalog)) {
+            catalogIfs = env.getCatalogMgr().listCatalogs();
+        } else {
+            catalogIfs.add(env.getCatalogMgr()
+                    .getCatalogOrException(params.catalog, catalog -> new TException("Unknown catalog " + catalog)));
+        }
         for (CatalogIf catalog : catalogIfs) {
             List<String> dbNames = catalog.getDbNames();
             LOG.debug("get db names: {}, in catalog: {}", dbNames, catalog.getName());
diff --git a/gensrc/thrift/FrontendService.thrift b/gensrc/thrift/FrontendService.thrift
index 47de9fcdc3..3036c1d53f 100644
--- a/gensrc/thrift/FrontendService.thrift
+++ b/gensrc/thrift/FrontendService.thrift
@@ -287,6 +287,7 @@ struct TGetDbsParams {
   2: optional string user   // deprecated
   3: optional string user_ip    // deprecated
   4: optional Types.TUserIdentity current_user_ident // to replace the user and user ip
+  5: optional string catalog
 }
 
 // getDbNames returns a list of database names and catalog names
diff --git a/gensrc/thrift/PlanNodes.thrift b/gensrc/thrift/PlanNodes.thrift
index 0dd3373b74..7cadebd8f6 100644
--- a/gensrc/thrift/PlanNodes.thrift
+++ b/gensrc/thrift/PlanNodes.thrift
@@ -501,6 +501,7 @@ struct TSchemaScanNode {
   11: optional Types.TUserIdentity current_user_ident   // to replace the user and user_ip
   12: optional bool show_hidden_cloumns = false
   13: optional list<TSchemaTableStructure> table_structure
+  14: optional string catalog
 }
 
 struct TMetaScanNode {
diff --git a/regression-test/data/query_p0/show/test_show_where.out b/regression-test/data/query_p0/show/test_show_where.out
new file mode 100644
index 0000000000..ac84d03efc
--- /dev/null
+++ b/regression-test/data/query_p0/show/test_show_where.out
@@ -0,0 +1,27 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select --
+doris_test
+
+-- !select --
+ex_tb0
+
+-- !select --
+ex_tb0
+
+-- !select --
+doris_test
+
+-- !select --
+ex_tb0
+
+-- !select --
+ex_tb0
+
+-- !select --
+doris_test
+
+-- !select --
+ex_tb0
+
+-- !select --
+ex_tb0
diff --git a/regression-test/suites/query_p0/show/test_show_where.groovy b/regression-test/suites/query_p0/show/test_show_where.groovy
new file mode 100644
index 0000000000..4e47de43a5
--- /dev/null
+++ b/regression-test/suites/query_p0/show/test_show_where.groovy
@@ -0,0 +1,81 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+
+suite("test_show_where", "query") {
+    String ex_db_name = "doris_test";
+    String ex_tb0 = "ex_tb0";
+    String catalog_name = "test_show_where_mysql_jdbc_catalog";
+    try {
+        sql  """ drop database if exists ${ex_db_name} """
+        sql  """ create database ${ex_db_name} """
+
+        sql  """ drop table if exists `${ex_db_name}`.`${ex_tb0}` """
+        sql  """
+                CREATE TABLE `${ex_db_name}`.`${ex_tb0}` (
+                `id` INT NULL COMMENT "主键id",
+                `name` string NULL COMMENT "名字"
+                ) DISTRIBUTED BY HASH(id) BUCKETS 10
+                PROPERTIES("replication_num" = "1");
+        """
+        sql """ use ${ex_db_name}"""
+
+        qt_select "show databases where schema_name= '${ex_db_name}'"
+        qt_select "show tables"
+        qt_select "show tables where table_name= '${ex_tb0}'"
+
+
+        String enabled = context.config.otherConfigs.get("enableJdbcTest")
+        String mysql_port = context.config.otherConfigs.get("mysql_57_port");
+        if (enabled != null && enabled.equalsIgnoreCase("true")) {
+            sql """admin set frontend config ("enable_multi_catalog" = "true")"""
+            
+            sql """drop catalog if exists ${catalog_name} """
+
+            // if use 'com.mysql.cj.jdbc.Driver' here, it will report: ClassNotFound
+            sql """ CREATE CATALOG ${catalog_name} PROPERTIES (
+                    "type"="jdbc",
+                    "jdbc.user"="root",
+                    "jdbc.password"="123456",
+                    "jdbc.jdbc_url" = "jdbc:mysql://127.0.0.1:${mysql_port}/doris_test?useSSL=false",
+                    "jdbc.driver_url" = "https://doris-community-test-1308700295.cos.ap-hongkong.myqcloud.com/jdbc_driver/mysql-connector-java-8.0.25.jar",
+                    "jdbc.driver_class" = "com.mysql.cj.jdbc.Driver");
+                """
+
+            sql """switch ${catalog_name}"""
+            sql """ use ${ex_db_name}"""
+
+            qt_select "show databases where schema_name= '${ex_db_name}'"
+            qt_select "show tables"
+            qt_select "show tables where table_name= '${ex_tb0}'"
+
+
+            sql """switch internal"""
+            sql """ use ${ex_db_name}"""
+
+            qt_select "show databases where schema_name= '${ex_db_name}'"
+            qt_select "show tables"
+            qt_select "show tables where table_name= '${ex_tb0}'"
+
+        }
+
+    } finally {
+        try_sql("DROP DATABASE IF EXISTS `internal`.`${ex_db_name}` FORCE")
+
+        try_sql("DROP CATALOG IF EXISTS `${catalog_name}`")
+    }
+}


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