Address #279 by treating UNION expressions as nested

This commit is contained in:
Sean Corfield 2020-10-09 21:30:45 -07:00
parent 0255307aaf
commit 0c7ce43381
2 changed files with 11 additions and 11 deletions

View file

@ -180,7 +180,7 @@
(reduce (fn [[sql params] [sql' & params']] (reduce (fn [[sql params] [sql' & params']]
[(conj sql sql') (if params' (into params params') params)]) [(conj sql sql') (if params' (into params params') params)])
[[] []] [[] []]
(map #'format-dsl xs))] (map #(format-dsl % {:nested? true}) xs))]
(into [(str/join (str " " (sql-kw k) " ") sqls)] params))) (into [(str/join (str " " (sql-kw k) " ") sqls)] params)))
(defn- format-expr-list [xs & [opts]] (defn- format-expr-list [xs & [opts]]

View file

@ -169,30 +169,30 @@
;; ORDER BY foo ASC ;; ORDER BY foo ASC
(is (= (format {:union [{:select [:foo] :from [:bar1]} (is (= (format {:union [{:select [:foo] :from [:bar1]}
{:select [:foo] :from [:bar2]}]}) {:select [:foo] :from [:bar2]}]})
["SELECT foo FROM bar1 UNION SELECT foo FROM bar2"])) ["(SELECT foo FROM bar1) UNION (SELECT foo FROM bar2)"]))
(testing "union complex values" (testing "union complex values"
(is (= (format {:union [{:select [:foo] :from [:bar1]} (is (= (format {:union [{:select [:foo] :from [:bar1]}
{:select [:foo] :from [:bar2]}] {:select [:foo] :from [:bar2]}]
:with [[[:bar {:columns [:spam :eggs]}] :with [[[:bar {:columns [:spam :eggs]}]
{:values [[1 2] [3 4] [5 6]]}]]}) {:values [[1 2] [3 4] [5 6]]}]]})
["WITH bar (spam, eggs) AS (VALUES (?, ?), (?, ?), (?, ?)) SELECT foo FROM bar1 UNION SELECT foo FROM bar2" ["WITH bar (spam, eggs) AS (VALUES (?, ?), (?, ?), (?, ?)) (SELECT foo FROM bar1) UNION (SELECT foo FROM bar2)"
1 2 3 4 5 6])))) 1 2 3 4 5 6]))))
(deftest union-all-test (deftest union-all-test
(is (= (format {:union-all [{:select [:foo] :from [:bar1]} (is (= (format {:union-all [{:select [:foo] :from [:bar1]}
{:select [:foo] :from [:bar2]}]}) {:select [:foo] :from [:bar2]}]})
["SELECT foo FROM bar1 UNION ALL SELECT foo FROM bar2"]))) ["(SELECT foo FROM bar1) UNION ALL (SELECT foo FROM bar2)"])))
(deftest intersect-test (deftest intersect-test
(is (= (format {:intersect [{:select [:foo] :from [:bar1]} (is (= (format {:intersect [{:select [:foo] :from [:bar1]}
{:select [:foo] :from [:bar2]}]}) {:select [:foo] :from [:bar2]}]})
["SELECT foo FROM bar1 INTERSECT SELECT foo FROM bar2"]))) ["(SELECT foo FROM bar1) INTERSECT (SELECT foo FROM bar2)"])))
(deftest except-test (deftest except-test
(is (= (format {:except [{:select [:foo] :from [:bar1]} (is (= (format {:except [{:select [:foo] :from [:bar1]}
{:select [:foo] :from [:bar2]}]}) {:select [:foo] :from [:bar2]}]})
["SELECT foo FROM bar1 EXCEPT SELECT foo FROM bar2"]))) ["(SELECT foo FROM bar1) EXCEPT (SELECT foo FROM bar2)"])))
(deftest inner-parts-test (deftest inner-parts-test
(testing "The correct way to apply ORDER BY to various parts of a UNION" (testing "The correct way to apply ORDER BY to various parts of a UNION"
@ -206,7 +206,7 @@
:order-by [[:amount :desc]] :order-by [[:amount :desc]]
:limit 5}]}] :limit 5}]}]
:order-by [[:amount :asc]]}) :order-by [[:amount :asc]]})
["SELECT amount, id, created_on FROM transactions UNION SELECT amount, id, created_on FROM (SELECT amount, id, created_on FROM other_transactions ORDER BY amount DESC LIMIT ?) ORDER BY amount ASC" 5])))) ["(SELECT amount, id, created_on FROM transactions) UNION (SELECT amount, id, created_on FROM (SELECT amount, id, created_on FROM other_transactions ORDER BY amount DESC LIMIT ?)) ORDER BY amount ASC" 5]))))
(deftest compare-expressions-test (deftest compare-expressions-test
(testing "Sequences should be fns when in value/comparison spots" (testing "Sequences should be fns when in value/comparison spots"
@ -238,14 +238,14 @@
{:select [:foo] :from [:bar2]}] {:select [:foo] :from [:bar2]}]
:with [[[:bar {:columns [:spam :eggs]}] :with [[[:bar {:columns [:spam :eggs]}]
{:values [[1 2] [3 4] [5 6]]}]]}) {:values [[1 2] [3 4] [5 6]]}]]})
["WITH bar (spam, eggs) AS (VALUES (?, ?), (?, ?), (?, ?)) SELECT foo FROM bar1 UNION SELECT foo FROM bar2" 1 2 3 4 5 6]))) ["WITH bar (spam, eggs) AS (VALUES (?, ?), (?, ?), (?, ?)) (SELECT foo FROM bar1) UNION (SELECT foo FROM bar2)" 1 2 3 4 5 6])))
(deftest union-all-with-cte (deftest union-all-with-cte
(is (= (format {:union-all [{:select [:foo] :from [:bar1]} (is (= (format {:union-all [{:select [:foo] :from [:bar1]}
{:select [:foo] :from [:bar2]}] {:select [:foo] :from [:bar2]}]
:with [[[:bar {:columns [:spam :eggs]}] :with [[[:bar {:columns [:spam :eggs]}]
{:values [[1 2] [3 4] [5 6]]}]]}) {:values [[1 2] [3 4] [5 6]]}]]})
["WITH bar (spam, eggs) AS (VALUES (?, ?), (?, ?), (?, ?)) SELECT foo FROM bar1 UNION ALL SELECT foo FROM bar2" 1 2 3 4 5 6]))) ["WITH bar (spam, eggs) AS (VALUES (?, ?), (?, ?), (?, ?)) (SELECT foo FROM bar1) UNION ALL (SELECT foo FROM bar2)" 1 2 3 4 5 6])))
(deftest parameterizer-none (deftest parameterizer-none
(testing "array parameter -- fail: parameterizer" (testing "array parameter -- fail: parameterizer"
@ -261,7 +261,7 @@
:with [[[:bar {:columns [:spam :eggs]}] :with [[[:bar {:columns [:spam :eggs]}]
{:values [[1 2] [3 4] [5 6]]}]]} {:values [[1 2] [3 4] [5 6]]}]]}
{:parameterizer :none}) {:parameterizer :none})
["WITH bar (spam, eggs) AS (VALUES (1, 2), (3, 4), (5, 6)) SELECT foo FROM bar1 UNION SELECT foo FROM bar2"])))) ["WITH bar (spam, eggs) AS (VALUES (1, 2), (3, 4), (5, 6)) (SELECT foo FROM bar1) UNION (SELECT foo FROM bar2)"]))))
(deftest inline-was-parameterizer-none (deftest inline-was-parameterizer-none
(testing "array parameter" (testing "array parameter"
@ -278,7 +278,7 @@
:with [[[:bar {:columns [:spam :eggs]}] :with [[[:bar {:columns [:spam :eggs]}]
{:values (mapv #(mapv vector (repeat :inline) %) {:values (mapv #(mapv vector (repeat :inline) %)
[[1 2] [3 4] [5 6]])}]]}) [[1 2] [3 4] [5 6]])}]]})
["WITH bar (spam, eggs) AS (VALUES (1, 2), (3, 4), (5, 6)) SELECT foo FROM bar1 UNION SELECT foo FROM bar2"])))) ["WITH bar (spam, eggs) AS (VALUES (1, 2), (3, 4), (5, 6)) (SELECT foo FROM bar1) UNION (SELECT foo FROM bar2)"]))))
#_(defmethod parameterize :single-quote [_ value pname] (str \' value \')) #_(defmethod parameterize :single-quote [_ value pname] (str \' value \'))
#_(defmethod parameterize :mysql-fill [_ value pname] "?") #_(defmethod parameterize :mysql-fill [_ value pname] "?")