From 86f405a0602faf64ae966775c1859a0de26afd17 Mon Sep 17 00:00:00 2001
From: Braden Shepherdson <braden@metabase.com>
Date: Mon, 2 Oct 2023 09:51:45 -0400
Subject: [PATCH] [MLv2] Allow any type of arguments to :concat expressions
 (#34157)

The QP supports this - it appears that every type can be `concat`-ed and
it will coerce the values to some kind of string - numbers, dates,
booleans, etc.
---
 .../lib/schema/expression/string.cljc         |  2 +-
 test/metabase/lib/expression_test.cljc        | 29 +++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/metabase/lib/schema/expression/string.cljc b/src/metabase/lib/schema/expression/string.cljc
index c9daf62c139..6a488a78912 100644
--- a/src/metabase/lib/schema/expression/string.cljc
+++ b/src/metabase/lib/schema/expression/string.cljc
@@ -27,4 +27,4 @@
   [:length [:? [:schema [:ref ::expression/integer]]]])
 
 (mbql-clause/define-catn-mbql-clause :concat :- :type/Text
-  [:args [:repeat {:min 2} [:schema [:ref ::expression/string]]]])
+  [:args [:repeat {:min 2} [:schema [:ref ::expression/expression]]]])
diff --git a/test/metabase/lib/expression_test.cljc b/test/metabase/lib/expression_test.cljc
index aba11cd7dfa..f24acf962d6 100644
--- a/test/metabase/lib/expression_test.cljc
+++ b/test/metabase/lib/expression_test.cljc
@@ -298,3 +298,32 @@
       (is (= ["ID" "Subtotal" "Total" "Tax" "Discount" "Quantity" "Created At" "Product ID" "User ID" "Unit price"]
              (map (partial lib/display-name query)
                   (lib/returned-columns query)))))))
+
+(deftest ^:parallel mixed-type-concat-expression-test
+  (testing "#34150"
+    (testing "various pemutations on venues"
+      (let [query (reduce (fn [query [label expr]]
+                            (lib/expression query -1 label expr))
+                          lib.tu/venues-query
+                          [["name+price" (lib/concat (meta/field-metadata :venues :name)
+                                                     (meta/field-metadata :venues :price))]
+                           ["$price"     (lib/concat "$" (meta/field-metadata :venues :price))]
+                           ["latXlong"   (lib/concat (meta/field-metadata :venues :latitude)
+                                                     " X "
+                                                     (meta/field-metadata :venues :longitude))]])]
+        (is (=? [{:name "name+price"}
+                 {:name "$price"}
+                 {:name "latXlong"}]
+                (->> (lib/visible-columns query)
+                     (filter (comp #{:source/expressions} :lib/source)))))))
+    (testing "dates"
+      (let [query (-> (lib/query meta/metadata-provider (meta/table-metadata :orders))
+                      (lib/expression "description"
+                                      (lib/concat (meta/field-metadata :orders :total)
+                                                  " on "
+                                                  (meta/field-metadata :orders :quantity)
+                                                  " as of "
+                                                  (meta/field-metadata :orders :created-at))))]
+        (is (=? [{:name "description"}]
+                (->> (lib/visible-columns query)
+                     (filter (comp #{:source/expressions} :lib/source)))))))))
-- 
GitLab