diff --git a/modules/drivers/mongo/src/metabase/driver/mongo.clj b/modules/drivers/mongo/src/metabase/driver/mongo.clj index c45da7de982eb9c3af3a357c83b91b86701b7248..49a250eda5bf8e257663786a9c7d212cb264f7a4 100644 --- a/modules/drivers/mongo/src/metabase/driver/mongo.clj +++ b/modules/drivers/mongo/src/metabase/driver/mongo.clj @@ -183,9 +183,14 @@ (defmethod driver/dbms-version :mongo [_ database] (with-mongo-connection [^com.mongodb.DB conn database] - (let [build-info (mg/command conn {:buildInfo 1})] + (let [build-info (mg/command conn {:buildInfo 1}) + version-array (get build-info "versionArray") + sanitized-version-array (into [] (take-while nat-int?) version-array)] + (when (not= (take 3 version-array) (take 3 sanitized-version-array)) + (log/warnf "sanitizing versionArray %s results in %s, losing information" + version-array sanitized-version-array)) {:version (get build-info "version") - :semantic-version (get build-info "versionArray")}))) + :semantic-version sanitized-version-array}))) (defmethod driver/describe-database :mongo [_ database] diff --git a/modules/drivers/mongo/test/metabase/driver/mongo_test.clj b/modules/drivers/mongo/test/metabase/driver/mongo_test.clj index a1f78025f8976466dc436b2e34f8c9226e99d040..6f85ae0be2029932e08a08668fd16bd43bb41fee 100644 --- a/modules/drivers/mongo/test/metabase/driver/mongo_test.clj +++ b/modules/drivers/mongo/test/metabase/driver/mongo_test.clj @@ -21,6 +21,7 @@ [metabase.test.data.mongo :as tdm] [metabase.util.log :as log] [monger.collection :as mcoll] + [monger.core :as mg] [taoensso.nippy :as nippy] [toucan2.core :as t2]) (:import org.bson.types.ObjectId)) @@ -488,3 +489,19 @@ (mt/rows (mt/run-mbql-query bird_species {:filter [:contains $bird_species._ "nett"]})))))))) + +(deftest strange-versionArray-test + (mt/test-driver :mongo + (testing "Negative values in versionArray are ignored (#29678)" + (with-redefs [mg/command (constantly {"version" "4.0.28-23" + "versionArray" [4 0 29 -100]})] + (is (= {:version "4.0.28-23" + :semantic-version [4 0 29]} + (driver/dbms-version :mongo (mt/db)))))) + + (testing "Any values after rubbish in versionArray are ignored" + (with-redefs [mg/command (constantly {"version" "4.0.28-23" + "versionArray" [4 0 "NaN" 29]})] + (is (= {:version "4.0.28-23" + :semantic-version [4 0]} + (driver/dbms-version :mongo (mt/db))))))))