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 2025/11/07 06:38:44 UTC

(doris) branch branch-3.1 updated: branch-3.1: [fix](jdbc) Set the correct jdbctable id for query tvf #57745 (#57798)

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

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


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 80e7ffbbc5f branch-3.1: [fix](jdbc) Set the correct jdbctable id for query tvf #57745 (#57798)
80e7ffbbc5f is described below

commit 80e7ffbbc5fc2ef981f4ab918ab0a1c37d23bd0c
Author: github-actions[bot] <41...@users.noreply.github.com>
AuthorDate: Fri Nov 7 14:38:37 2025 +0800

    branch-3.1: [fix](jdbc) Set the correct jdbctable id for query tvf #57745 (#57798)
    
    Cherry-picked from #57745
    
    Co-authored-by: zy-kkk <zh...@gmail.com>
---
 .../doris/datasource/jdbc/source/JdbcScanNode.java |  4 ++
 .../tablefunction/JdbcQueryTableValueFunction.java |  4 +-
 .../jdbc/test_query_tvf_cross_catalog.out          |  8 +++
 .../jdbc/test_query_tvf_cross_catalog.groovy       | 73 ++++++++++++++++++++++
 4 files changed, 87 insertions(+), 2 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcScanNode.java
index 338f564b804..cbba30585bb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcScanNode.java
@@ -77,6 +77,7 @@ public class JdbcScanNode extends ExternalScanNode {
     private String query = "";
 
     private JdbcTable tbl;
+    private long catalogId;
 
     public JdbcScanNode(PlanNodeId id, TupleDescriptor desc, boolean isJdbcExternalTable) {
         super(id, desc, "JdbcScanNode", StatisticalType.JDBC_SCAN_NODE, false);
@@ -97,6 +98,7 @@ public class JdbcScanNode extends ExternalScanNode {
         tbl = (JdbcTable) desc.getTable();
         jdbcType = tbl.getJdbcTableType();
         tableName = tbl.getExternalTableName();
+        catalogId = tbl.getCatalogId();
     }
 
     @Override
@@ -230,8 +232,10 @@ public class JdbcScanNode extends ExternalScanNode {
         StringBuilder output = new StringBuilder();
         if (isTableValuedFunction) {
             output.append(prefix).append("TABLE VALUE FUNCTION\n");
+            output.append(prefix).append("CATALOG ID: ").append(catalogId).append("\n");
             output.append(prefix).append("QUERY: ").append(query).append("\n");
         } else {
+            output.append(prefix).append("CATALOG ID: ").append(catalogId).append("\n");
             output.append(prefix).append("TABLE: ").append(tableName).append("\n");
             if (detailLevel == TExplainLevel.BRIEF) {
                 return output.toString();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/JdbcQueryTableValueFunction.java b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/JdbcQueryTableValueFunction.java
index a9847c7eadd..040d47c7b41 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/JdbcQueryTableValueFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/JdbcQueryTableValueFunction.java
@@ -50,8 +50,8 @@ public class JdbcQueryTableValueFunction extends QueryTableValueFunction {
     @Override
     public ScanNode getScanNode(PlanNodeId id, TupleDescriptor desc, SessionVariable sv) {
         JdbcExternalCatalog catalog = (JdbcExternalCatalog) catalogIf;
-        JdbcTable jdbcTable = new JdbcTable(1, desc.getTable().getName(), desc.getTable().getFullSchema(),
-                TableType.JDBC);
+        JdbcTable jdbcTable = new JdbcTable(desc.getId().asInt(), desc.getTable().getName(),
+                desc.getTable().getFullSchema(), TableType.JDBC);
         catalog.configureJdbcTable(jdbcTable, desc.getTable().getName());
         desc.setTable(jdbcTable);
         return new JdbcScanNode(id, desc, true, query);
diff --git a/regression-test/data/external_table_p0/jdbc/test_query_tvf_cross_catalog.out b/regression-test/data/external_table_p0/jdbc/test_query_tvf_cross_catalog.out
new file mode 100644
index 00000000000..73871edcc01
--- /dev/null
+++ b/regression-test/data/external_table_p0/jdbc/test_query_tvf_cross_catalog.out
@@ -0,0 +1,8 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !cross_catalog_tvf_join --
+111	abc	\N
+112	abd	\N
+113	abe	\N
+114	abf	\N
+115	abg	\N
+
diff --git a/regression-test/suites/external_table_p0/jdbc/test_query_tvf_cross_catalog.groovy b/regression-test/suites/external_table_p0/jdbc/test_query_tvf_cross_catalog.groovy
new file mode 100644
index 00000000000..eee44c20c50
--- /dev/null
+++ b/regression-test/suites/external_table_p0/jdbc/test_query_tvf_cross_catalog.groovy
@@ -0,0 +1,73 @@
+// 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_query_tvf_cross_catalog", "p0,external,mysql,external_docker,external_docker_mysql") {
+    String jdbcUrl = context.config.jdbcUrl + "&jdbcCompliantTruncation=false&sessionVariables=return_object_data_as_binary=true"
+    String jdbcUser = context.config.jdbcUser
+    String jdbcPassword = context.config.jdbcPassword
+    String enabled = context.config.otherConfigs.get("enableJdbcTest")
+    String externalEnvIp = context.config.otherConfigs.get("externalEnvIp")
+    String s3_endpoint = getS3Endpoint()
+    String bucket = getS3BucketName()
+    String driver_url = "https://${bucket}.${s3_endpoint}/regression/jdbc_driver/mysql-connector-j-8.4.0.jar"
+    if (enabled != null && enabled.equalsIgnoreCase("true")) {
+        String mysql_port = context.config.otherConfigs.get("mysql_57_port");
+
+        sql """drop catalog if exists test_query_tvf_cross_catalog_mysql """
+        sql """create catalog if not exists test_query_tvf_cross_catalog_mysql properties(
+            "type"="jdbc",
+            "user"="root",
+            "password"="123456",
+            "jdbc_url" = "jdbc:mysql://${externalEnvIp}:${mysql_port}/doris_test?useSSL=false",
+            "driver_url" = "${driver_url}",
+            "driver_class" = "com.mysql.cj.jdbc.Driver"
+        );"""
+
+        sql """ DROP CATALOG IF EXISTS test_query_tvf_cross_catalog_doris """
+        sql """ CREATE CATALOG test_query_tvf_cross_catalog_doris PROPERTIES (
+            "user" = "${jdbcUser}",
+            "type" = "jdbc",
+            "password" = "${jdbcPassword}",
+            "jdbc_url" = "${jdbcUrl}",
+            "driver_url" = "${driver_url}",
+            "driver_class" = "com.mysql.cj.jdbc.Driver"
+            )
+        """
+
+        sql """create database if not exists internal.test_query_tvf_cross_catalog_db;"""
+        sql """use internal.test_query_tvf_cross_catalog_db;"""
+        sql """drop table if exists order_qt_cross_catalog_tvf_join;"""
+        sql """
+            create table order_qt_cross_catalog_tvf_join (
+                k1 int
+            ) distributed by hash(k1) buckets 1 properties("replication_num" = "1");
+        """
+        sql """insert into order_qt_cross_catalog_tvf_join values (1);"""
+
+        order_qt_cross_catalog_tvf_join """
+            select *  from 
+            query("catalog" = "test_query_tvf_cross_catalog_mysql", "query" = "select * from doris_test.ex_tb0 limit 10") a 
+            left join query("catalog" = "test_query_tvf_cross_catalog_doris", "query" = "select * from test_query_tvf_cross_catalog_db.order_qt_cross_catalog_tvf_join limit 10") b 
+            on a.id = b.k1;
+            """
+        
+        sql """drop table if exists order_qt_cross_catalog_tvf_join;"""
+        sql """drop database if exists internal.test_query_tvf_cross_catalog_db;"""
+        sql """drop catalog if exists test_query_tvf_cross_catalog_mysql """
+        sql """drop catalog if exists test_query_tvf_cross_catalog_doris """
+    }
+}
\ No newline at end of file


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