From 6ebc0179698a6d900ffe7c137120e3a94b638d08 Mon Sep 17 00:00:00 2001 From: Neil McCalum Date: Sun, 9 May 2021 17:18:39 +1200 Subject: [PATCH 1/2] quoting for :%fun.col(s) syntax to match with [[:fun :col]] --- src/honey/sql.cljc | 10 ++++++---- test/honey/sql/helpers_test.cljc | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/honey/sql.cljc b/src/honey/sql.cljc index 4514180..b3b69d4 100644 --- a/src/honey/sql.cljc +++ b/src/honey/sql.cljc @@ -214,11 +214,13 @@ (fn [fk _] (param-value (fk)))})) (defn- format-var [x & [opts]] - (let [c (name-_ x)] + (let [c (name x)] (cond (= \% (first c)) - (let [[f & args] (str/split (subs c 1) #"\.")] - ;; TODO: this does not quote arguments -- does that matter? - [(str (upper-case f) "(" (str/join "," args) ")")]) + (let [[f & args] (str/split (subs c 1) #"\.") + quoted-args (->> args + (map keyword) + (map format-entity))] + [(str (upper-case f) "(" (str/join "," quoted-args) ")")]) (= \? (first c)) (let [k (keyword (subs c 1))] (if *inline* diff --git a/test/honey/sql/helpers_test.cljc b/test/honey/sql/helpers_test.cljc index 33ea68c..60e9a4d 100644 --- a/test/honey/sql/helpers_test.cljc +++ b/test/honey/sql/helpers_test.cljc @@ -866,3 +866,27 @@ {:with [[:a]], :insert-into [[:quux [:x :y]] {:select [:id], :from [:table]}]})))) + +(deftest quoting-:%-syntax + (testing "quoting of expressions in functions shouldn't depend on syntax" + (is (= [(str "SELECT `foo-bar`," + " COUNT(*)," + " COUNT(*)," + " SYSDATE()," + " SYSDATE()," + " AVG(`bar-bar`)," + " AVG(`bar-bar`,`bar-foo`)," + " SUM(`foo-foo`)" + " FROM `employee`" + " GROUP BY `foo-bar`")] + (-> (select :foo-bar + [[:count :*]] + :%count.* + :%sysdate + :%sysdate. + :%avg.bar-bar + :%avg.bar-bar.bar-foo + [[:sum :foo-foo]]) + (from :employee) + (group-by :foo-bar) + (sql/format :dialect :mysql)))))) From 9c38554154732f792fe2f30599fa85cc91a3f937 Mon Sep 17 00:00:00 2001 From: Neil McCalum Date: Tue, 11 May 2021 01:07:34 +1200 Subject: [PATCH 2/2] format with opts, hyphen to under in function names, improve and relocate tests --- src/honey/sql.cljc | 15 +++++++-------- test/honey/sql/helpers_test.cljc | 24 ------------------------ test/honey/sql_test.cljc | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/honey/sql.cljc b/src/honey/sql.cljc index b3b69d4..604d06e 100644 --- a/src/honey/sql.cljc +++ b/src/honey/sql.cljc @@ -153,6 +153,7 @@ (defn- namespace-_ [x] (some-> (namespace x) (str/replace "-" "_"))) (defn- name-_ [x] (str/replace (name x) "-" "_")) +(defn- -_ [x] (str/replace x "-" "_")) (defn- sqlize-value [x] (cond @@ -217,15 +218,13 @@ (let [c (name x)] (cond (= \% (first c)) (let [[f & args] (str/split (subs c 1) #"\.") - quoted-args (->> args - (map keyword) - (map format-entity))] - [(str (upper-case f) "(" (str/join "," quoted-args) ")")]) + quoted-args (map #(format-entity (keyword %) opts) args)] + [(str (upper-case (-_ f)) "(" (str/join ", " quoted-args) ")")]) (= \? (first c)) - (let [k (keyword (subs c 1))] - (if *inline* - [(sqlize-value (param-value k))] - ["?" (->param k)])) + (let [k (keyword (subs (-_ c) 1))] + (if *inline* + [(sqlize-value (param-value k))] + ["?" (->param k)])) :else [(format-entity x opts)]))) diff --git a/test/honey/sql/helpers_test.cljc b/test/honey/sql/helpers_test.cljc index 60e9a4d..33ea68c 100644 --- a/test/honey/sql/helpers_test.cljc +++ b/test/honey/sql/helpers_test.cljc @@ -866,27 +866,3 @@ {:with [[:a]], :insert-into [[:quux [:x :y]] {:select [:id], :from [:table]}]})))) - -(deftest quoting-:%-syntax - (testing "quoting of expressions in functions shouldn't depend on syntax" - (is (= [(str "SELECT `foo-bar`," - " COUNT(*)," - " COUNT(*)," - " SYSDATE()," - " SYSDATE()," - " AVG(`bar-bar`)," - " AVG(`bar-bar`,`bar-foo`)," - " SUM(`foo-foo`)" - " FROM `employee`" - " GROUP BY `foo-bar`")] - (-> (select :foo-bar - [[:count :*]] - :%count.* - :%sysdate - :%sysdate. - :%avg.bar-bar - :%avg.bar-bar.bar-foo - [[:sum :foo-foo]]) - (from :employee) - (group-by :foo-bar) - (sql/format :dialect :mysql)))))) diff --git a/test/honey/sql_test.cljc b/test/honey/sql_test.cljc index 489807b..ff12565 100644 --- a/test/honey/sql_test.cljc +++ b/test/honey/sql_test.cljc @@ -731,3 +731,24 @@ ORDER BY id = ? DESC (is (thrown-with-msg? ExceptionInfo #"does not match" (format {:where [:in :x :?y]} {:params {:y [nil]} :checking :strict}))))) + +(deftest quoting-:%-syntax + (testing "quoting of expressions in functions shouldn't depend on syntax" + (is (= ["SELECT SYSDATE()"] + (format {:select [[[:sysdate]]]}) + (format {:select :%sysdate}))) + (is (= ["SELECT COUNT(*)"] + (format {:select [[[:count :*]]]}) + (format {:select :%count.*}))) + (is (= ["SELECT AVERAGE(`foo-foo`)"] + (format {:select [[[:average :foo-foo]]]} :dialect :mysql) + (format {:select :%average.foo-foo} :dialect :mysql))) + (is (= ["SELECT GREATER(`foo-foo`, `bar-bar`)"] + (format {:select [[[:greater :foo-foo :bar-bar]]]} :dialect :mysql) + (format {:select :%greater.foo-foo.bar-bar} :dialect :mysql))) + (is (= ["SELECT MIXED_KEBAB(`yum-yum`)"] + #_(format {:select [[[:mixed-kebab :yum-yum]]]} :dialect :mysql) + (format {:select :%mixed-kebab.yum-yum} :dialect :mysql))) + (is (= ["SELECT RANSOM(`NoTe`)"] + (format {:select [[[:ransom :NoTe]]]} :dialect :mysql) + (format {:select :%ransom.NoTe} :dialect :mysql)))))