Support :inline option

This is similar to `:parameterizer :none` (but better).
This commit is contained in:
Sean Corfield 2020-10-09 21:52:18 -07:00
parent 0c7ce43381
commit 97a3782112
2 changed files with 38 additions and 28 deletions

View file

@ -64,6 +64,7 @@
;; functions harder than necessary: ;; functions harder than necessary:
(def ^:private ^:dynamic *clause-order* default-clause-order) (def ^:private ^:dynamic *clause-order* default-clause-order)
(def ^:private ^:dynamic *quoted* nil) (def ^:private ^:dynamic *quoted* nil)
(def ^:private ^:dynamic *inline* nil)
;; clause helpers ;; clause helpers
@ -613,9 +614,9 @@
(str " " (first sqls)) (str " " (first sqls))
(str "(" (str/join ", " sqls) ")")))] (str "(" (str/join ", " sqls) ")")))]
params))) params)))
(into [(str "(" (str/join ", " (if *inline*
(repeat (count x) "?")) ")")] [(str "(" (str/join ", " (map #'sqlize-value x)) ")")]
x))) (into [(str "(" (str/join ", " (repeat (count x) "?")) ")")] x))))
(or (true? x) (false? x)) ; because (boolean? x) requires Clojure 1.9+ (or (true? x) (false? x)) ; because (boolean? x) requires Clojure 1.9+
[(upper-case (str x))] [(upper-case (str x))]
@ -624,7 +625,9 @@
["NULL"] ["NULL"]
:else :else
["?" x])) (if *inline*
[(sqlize-value x)]
["?" x])))
(defn- check-dialect [dialect] (defn- check-dialect [dialect]
(when-not (contains? dialects dialect) (when-not (contains? dialects dialect)
@ -652,6 +655,8 @@
(f @base-clause-order) (f @base-clause-order)
@current-clause-order) @current-clause-order)
@current-clause-order) @current-clause-order)
*inline* (when (contains? opts :inline)
(:inline opts))
*quoted* (if (contains? opts :quoted) *quoted* (if (contains? opts :quoted)
(:quoted opts) (:quoted opts)
dialect?)] dialect?)]
@ -736,11 +741,18 @@
(format {:select [:*] :from [:table] :group-by [:foo :bar]} {}) (format {:select [:*] :from [:table] :group-by [:foo :bar]} {})
(format {:select [:*] :from [:table] :group-by [[:date :bar]]} {}) (format {:select [:*] :from [:table] :group-by [[:date :bar]]} {})
(format {:select [:*] :from [:table] :order-by [[:foo :desc] :bar]} {}) (format {:select [:*] :from [:table] :order-by [[:foo :desc] :bar]} {})
(format {:select [:*] :from [:table] :order-by [[[:date :expiry] :desc] :bar]} {}) (format {:select [:*] :from [:table]
(println (format {:select [:*] :from [:table] :order-by [[[:date :expiry] :desc] :bar]} {:pretty? true})) :order-by [[[:date :expiry] :desc] :bar]} {})
(format {:select [:*] :from [:table] :where [:< [:date_add :expiry [:interval 30 :days]] [:now]]} {}) (println (format {:select [:*] :from [:table]
:order-by [[[:date :expiry] :desc] :bar]} {:pretty? true}))
(format {:select [:*] :from [:table]
:where [:< [:date_add :expiry [:interval 30 :days]] [:now]]} {})
(format-expr [:interval 30 :days]) (format-expr [:interval 30 :days])
(format {:select [:*] :from [:table] :where [:= :id (int 1)]} {:dialect :mysql}) (format {:select [:*] :from [:table]
(map fn? (format {:select [:*] :from [:table] :where [:= :id (with-meta (constantly 42) {:foo true})]} {:dialect :mysql})) :where [:= :id (int 1)]} {:dialect :mysql})
(println (format {:select [:*] :from [:table] :where [:in :id [1 2 3 4]]} {:pretty? true})) (map fn? (format {:select [:*] :from [:table]
:where [:= :id (with-meta (constantly 42) {:foo true})]}
{:dialect :mysql}))
(println (format {:select [:*] :from [:table]
:where [:in :id [1 2 3 4]]} {:pretty? true}))
,) ,)

View file

@ -248,11 +248,11 @@
["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"
(is (= (format {:insert-into :foo (is (= (format {:insert-into :foo
:columns [:baz] :columns [:baz]
:values [[[:array [1 2 3 4]]]]} :values [[[:array [1 2 3 4]]]]}
{:parameterizer :none}) {:inline true})
["INSERT INTO foo (baz) VALUES (ARRAY[1, 2, 3, 4])"]))) ["INSERT INTO foo (baz) VALUES (ARRAY[1, 2, 3, 4])"])))
(testing "union complex values -- fail: parameterizer" (testing "union complex values -- fail: parameterizer"
@ -260,7 +260,7 @@
{: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]]}]]}
{:parameterizer :none}) {:inline true})
["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
@ -280,11 +280,9 @@
[[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 :mysql-fill [_ value pname] "?")
(deftest former-parameterizer-tests-where-and (deftest former-parameterizer-tests-where-and
(testing "should ignore a nil predicate -- fail: postgresql parameterizer" ;; I have no plans for positional parameters -- I just don't see the point
#_(testing "should ignore a nil predicate -- fail: postgresql parameterizer"
(is (= (format {:where [:and (is (= (format {:where [:and
[:= :foo "foo"] [:= :foo "foo"]
[:= :bar "bar"] [:= :bar "bar"]
@ -292,15 +290,15 @@
[:= :quux "quux"]]} [:= :quux "quux"]]}
{:parameterizer :postgresql}) {:parameterizer :postgresql})
["WHERE (foo = ?) AND (bar = $2) AND (quux = $3)" "foo" "bar" "quux"]))) ["WHERE (foo = ?) AND (bar = $2) AND (quux = $3)" "foo" "bar" "quux"])))
;; this is _almost_ what :inline should be doing: ;; new :inline option is similar to :parameterizer :none in 1.0
#_(testing "should fill param with single quote" (testing "should fill param with single quote"
(is (= (format {:where [:and (is (= (format {:where [:and
[:= :foo "foo"] [:= :foo "foo"]
[:= :bar "bar"] [:= :bar "bar"]
nil nil
[:= :quux "quux"]]} [:= :quux "quux"]]}
{:parameterizer :single-quote}) {:inline true})
["WHERE (foo = 'foo') AND (bar = 'bar') AND (quux = 'quux')" "foo" "bar" "quux"]))) ["WHERE (foo = 'foo') AND (bar = 'bar') AND (quux = 'quux')"])))
(testing "should inline params with single quote" (testing "should inline params with single quote"
(is (= (format {:where [:and (is (= (format {:where [:and
[:= :foo [:inline "foo"]] [:= :foo [:inline "foo"]]