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 <zxw520bl...@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-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org