From bc3c54b6b198e2a9c2777d244619264acd5933f6 Mon Sep 17 00:00:00 2001
From: Case Nelson <case@metabase.com>
Date: Fri, 15 Nov 2024 11:13:00 -0700
Subject: [PATCH] fix: MYSQL filter database with dbname in sync (#50091)

Fixes: #50072

When we `describe-fields` we are passing db details, but sometimes we
have the database name in `dbname` rather than in `db` depending on the
connection specs and possibly environment. So we check for both now.
---
 src/metabase/driver/mysql.clj       |  3 ++-
 test/metabase/driver/mysql_test.clj | 17 +++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/metabase/driver/mysql.clj b/src/metabase/driver/mysql.clj
index 90ce321632d..44358e364f9 100644
--- a/src/metabase/driver/mysql.clj
+++ b/src/metabase/driver/mysql.clj
@@ -954,7 +954,8 @@
                :where
                [:and [:raw "c.table_schema not in ('information_schema','performance_schema','sys','mysql')"]
                 [:raw "c.table_name not in ('innodb_table_stats', 'innodb_index_stats')"]
-                (when (:db details) [:= :c.table_schema (:db details)])
+                (when-let [db-name ((some-fn :db :dbname) details)]
+                  [:= :c.table_schema db-name])
                 (when (seq table-names) [:in [:lower :c.table_name] (map u/lower-case-en table-names)])]}
               :dialect (sql.qp/quote-style driver)))
 
diff --git a/test/metabase/driver/mysql_test.clj b/test/metabase/driver/mysql_test.clj
index 4306645e8d9..6540d4f092f 100644
--- a/test/metabase/driver/mysql_test.clj
+++ b/test/metabase/driver/mysql_test.clj
@@ -1,6 +1,7 @@
 (ns ^:mb/once metabase.driver.mysql-test
   (:require
    [clojure.java.jdbc :as jdbc]
+   [clojure.set :as set]
    [clojure.string :as str]
    [clojure.test :refer :all]
    [honey.sql :as sql]
@@ -77,6 +78,22 @@
                    (mt/rows
                     (mt/run-mbql-query exciting-moments-in-history))))))))))
 
+(deftest multiple-schema-test
+  (testing "Make sure that we filter databases (schema) with :db or :dbname (#50072)"
+    (mt/test-driver :mysql
+      (drop-if-exists-and-create-db! "dbone")
+      (drop-if-exists-and-create-db! "dbtwo")
+      (doseq [dbname ["dbone" "dbtwo"]
+              :let [details (tx/dbdef->connection-details :mysql :db {:database-name dbname})
+                    spec    (sql-jdbc.conn/connection-details->spec :mysql details)]]
+        (jdbc/execute! spec [(format "CREATE TABLE same_table_name (%s_a integer, %s_b integer, %s_c integer);" dbname dbname dbname)]))
+      (doseq [details [(tx/dbdef->connection-details :mysql :db {:database-name "dbone"})
+                       (set/rename-keys (tx/dbdef->connection-details :mysql :db {:database-name "dbone"}) {:db :dbname})]]
+        (t2.with-temp/with-temp [Database database {:engine "mysql", :details details}]
+          (sync/sync-database! database)
+          (is (= #{"dbone_a" "dbone_b" "dbone_c"}
+                 (into #{} (map :name) (driver/describe-fields :mysql database)))))))))
+
 (deftest date-test
   ;; make sure stuff at least compiles. Even if the result probably isn't as concise as it could be.
   ;; See [[metabase.query-processor-test.date-time-zone-functions-test/extract-week-tests]] for something that tests
-- 
GitLab