From 9569b19a343afcef56e248742f63b78057eef621 Mon Sep 17 00:00:00 2001 From: Sean Corfield Date: Fri, 2 Sep 2022 22:35:17 -0700 Subject: [PATCH] address #425 for map inserts --- src/honey/sql.cljc | 27 ++++++++++++++++----------- test/honey/sql_test.cljc | 10 ++++++++++ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/honey/sql.cljc b/src/honey/sql.cljc index 8be858d..b1843f9 100644 --- a/src/honey/sql.cljc +++ b/src/honey/sql.cljc @@ -737,23 +737,28 @@ ;; use the keys from the first map if they match so that ;; users can rely on the key ordering if they want to, ;; e.g., see test that uses array-map for the first row - cols-n (into #{} (mapcat keys) xs) + cols-n (into #{} (mapcat keys) (filter map? xs)) cols (if (= (set cols-1) cols-n) cols-1 cols-n) [sqls params] (reduce (fn [[sql params] [sqls' params']] - [(conj sql (str "(" (str/join ", " sqls') ")")) + [(conj sql + (if (sequential? sqls') + (str "(" (str/join ", " sqls') ")") + sqls')) (if params' (into params params') params')]) [[] []] (map (fn [m] - (format-expr-list - (map #(get m - % - ;; issue #366: use NULL or DEFAULT - ;; for missing column values: - (if (contains? *values-default-columns* %) - [:default] - nil)) - cols))) + (if (map? m) + (format-expr-list + (map #(get m + % + ;; issue #366: use NULL or DEFAULT + ;; for missing column values: + (if (contains? *values-default-columns* %) + [:default] + nil)) + cols)) + [(sql-kw m)])) xs))] (into [(str "(" (str/join ", " diff --git a/test/honey/sql_test.cljc b/test/honey/sql_test.cljc index 6f8912c..9c0c171 100644 --- a/test/honey/sql_test.cljc +++ b/test/honey/sql_test.cljc @@ -751,6 +751,16 @@ ORDER BY id = ? DESC (format {:insert-into [:table [:a :b :c]] :values [[1 [:default] 3] :default]} {:inline true})))) + (testing "map values with default row, no columns" + (is (= ["INSERT INTO table (a, b, c) VALUES (1, 2, 3), DEFAULT, (4, 5, 6)"] + (format {:insert-into :table + :values [{:a 1 :b 2 :c 3} :default {:a 4 :b 5 :c 6}]} + {:inline true})))) + (testing "map values with default column, no columns" + (is (= ["INSERT INTO table (a, b, c) VALUES (1, DEFAULT, 3), DEFAULT"] + (format {:insert-into :table + :values [{:a 1 :b [:default] :c 3} :default]} + {:inline true})))) (testing "empty values" (is (= ["INSERT INTO table (a, b, c) VALUES ()"] (format {:insert-into [:table [:a :b :c]]