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