From a195650fe4e5414e2e14f097a87a49150a93b671 Mon Sep 17 00:00:00 2001 From: Cam Saul <1455846+camsaul@users.noreply.github.com> Date: Tue, 22 Aug 2023 09:07:45 -0700 Subject: [PATCH] Fix #33083 (#33395) --- .../query_processor/util/add_alias_info.clj | 3 +- .../util/add_alias_info_test.clj | 27 ++++++++++++ .../explicit_joins_test.clj | 44 +++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/metabase/query_processor/util/add_alias_info.clj b/src/metabase/query_processor/util/add_alias_info.clj index b05cd1b5759..5da5d4ab927 100644 --- a/src/metabase/query_processor/util/add_alias_info.clj +++ b/src/metabase/query_processor/util/add_alias_info.clj @@ -105,7 +105,8 @@ [:field id-or-name opts] ;; this doesn't use [[mbql.u/update-field-options]] because this gets called a lot and the overhead actually adds up ;; a bit - [:field id-or-name (remove-namespaced-options (dissoc opts :source-field))] + [:field id-or-name (remove-namespaced-options (cond-> (dissoc opts :source-field :effective-type) + (integer? id-or-name) (dissoc :base-type)))] ;; for `:expression` and `:aggregation` references, remove the options map if they are empty. [:expression expression-name opts] diff --git a/test/metabase/query_processor/util/add_alias_info_test.clj b/test/metabase/query_processor/util/add_alias_info_test.clj index 741bd3c50c2..81190dc9e82 100644 --- a/test/metabase/query_processor/util/add_alias_info_test.clj +++ b/test/metabase/query_processor/util/add_alias_info_test.clj @@ -739,3 +739,30 @@ (#'add/field-alias-in-source-query {:source-query source-query} [:field "PRICE" {:base-type :type/Float}]))))))) + +(deftest ^:parallel find-matching-field-ignore-MLv2-extra-type-info-in-field-opts-test + (testing "MLv2 refs can include extra info like `:base-type`; make sure we ignore that when finding matching refs (#33083)" + (let [source-query {:joins [{:alias "Card_2" + :source-query {:breakout [[:field 78 {:join-alias "Products" + :temporal-unit :month + ::add/source-table "Products" + ::add/source-alias "CREATED_AT" + ::add/desired-alias "Products__CREATED_AT" + ::add/position 0}]] + :aggregation [[:aggregation-options + [:distinct [:field 76 {:join-alias "Products" + ::add/source-table "Products" + ::add/source-alias "ID"}]] + {:name "count" + ::add/source-alias "count" + ::add/position 1 + ::add/desired-alias "count"}]]}}]} + field-clause [:field 78 {:base-type :type/DateTime, :temporal-unit :month, :join-alias "Card_2"}]] + (is (=? [:field + 78 + {:join-alias "Products" + :temporal-unit :month + ::add/source-table "Products" + ::add/source-alias "CREATED_AT" + ::add/desired-alias "Products__CREATED_AT"}] + (#'add/matching-field-in-join-at-this-level source-query field-clause)))))) diff --git a/test/metabase/query_processor_test/explicit_joins_test.clj b/test/metabase/query_processor_test/explicit_joins_test.clj index 901376afb15..37ea536ec02 100644 --- a/test/metabase/query_processor_test/explicit_joins_test.clj +++ b/test/metabase/query_processor_test/explicit_joins_test.clj @@ -939,3 +939,47 @@ ["Doohickey" "Balistreri-Ankunding" "2018-03-01T00:00:00Z" 315.36 3.1536]] (mt/formatted-rows [str str str 2.0 4.0] (qp/process-query query))))))))) + +(deftest mlv2-references-in-join-conditions-test + (testing "Make sure join conditions that contain MLv2-generated refs with extra info like `:base-type` work correctly (#33083)" + (mt/dataset sample-dataset + (t2.with-temp/with-temp [:model/Card {card-1-id :id} {:dataset_query + (mt/mbql-query reviews + {:joins [{:source-table $$products + :alias "Products" + :condition [:= $product_id &Products.products.id] + :fields :all}] + :breakout [!month.&Products.products.created_at] + :aggregation [[:distinct &Products.products.id]] + :filter [:= &Products.products.category "Doohickey"]})} + :model/Card {card-2-id :id} {:dataset_query + (mt/mbql-query reviews + {:joins [{:source-table $$products + :alias "Products" + :condition [:= $product_id &Products.products.id] + :fields :all}] + :breakout [!month.&Products.products.created_at] + :aggregation [[:distinct &Products.products.id]] + :filter [:= &Products.products.category "Gizmo"]})}] + (let [query {:database (mt/id) + :type :query + :query {:source-table (str "card__" card-1-id) + :joins [{:fields :all + :strategy :left-join + :alias "Card_2" + :condition [:= + [:field + "CREATED_AT" + {:base-type :type/DateTime, :temporal-unit :month}] + [:field + (mt/id :products :created_at) + {:base-type :type/DateTime + :temporal-unit :month + :join-alias "Card_2"}]] + :source-table (str "card__" card-2-id)}] + :order-by [[:asc [:field "CREATED_AT" {:base-type :type/DateTime}]]] + :limit 2}}] + (mt/with-native-query-testing-context query + (is (= [["2016-05-01T00:00:00Z" 3 nil nil] + ["2016-06-01T00:00:00Z" 2 "2016-06-01T00:00:00Z" 1]] + (mt/rows (qp/process-query query)))))))))) -- GitLab