basic numbered parameter support
This commit is contained in:
parent
0faf611855
commit
359d9de668
1 changed files with 47 additions and 17 deletions
|
|
@ -140,6 +140,7 @@
|
|||
(def ^:private ^:dynamic *dsl* nil)
|
||||
;; caching data to detect expressions that cannot be cached:
|
||||
(def ^:private ^:dynamic *caching* nil)
|
||||
(def ^:private ^:dynamic *numbered* nil)
|
||||
|
||||
;; clause helpers
|
||||
|
||||
|
|
@ -321,6 +322,18 @@
|
|||
{::wrapper
|
||||
(fn [fk _] (param-value (fk)))}))
|
||||
|
||||
(defn ->numbered [v]
|
||||
(let [n (count (swap! *numbered* conj v))]
|
||||
[(str "$" n) (with-meta (constantly (dec n))
|
||||
{::wrapper
|
||||
(fn [fk _] (get *numbered* (fk)))})]))
|
||||
|
||||
(defn ->numbered-param [k]
|
||||
(let [n (count (swap! *numbered* conj k))]
|
||||
[(str "$" n) (with-meta (constantly k)
|
||||
{::wrapper
|
||||
(fn [fk _] (param-value (get *numbered* (fk))))})]))
|
||||
|
||||
(def ^:private ^:dynamic *formatted-column* (atom false))
|
||||
|
||||
(defn- format-var [x & [opts]]
|
||||
|
|
@ -335,8 +348,11 @@
|
|||
"(" (str/join ", " quoted-args) ")")])
|
||||
(= \? (first c))
|
||||
(let [k (keyword (subs c 1))]
|
||||
(if *inline*
|
||||
(cond *inline*
|
||||
[(sqlize-value (param-value k))]
|
||||
*numbered*
|
||||
(->numbered-param k)
|
||||
:else
|
||||
["?" (->param k)]))
|
||||
(= \' (first c))
|
||||
(do
|
||||
|
|
@ -1295,7 +1311,10 @@
|
|||
(and (sequential? values) (some nil? values))))
|
||||
(throw (ex-info "IN (NULL) does not match"
|
||||
{:clause [in x y]}))))
|
||||
(if (and (= "?" sql-y) (= 1 (count params-y)) (coll? values))
|
||||
;; TODO: numbered params!?!?
|
||||
(if (and (= "?" sql-y)
|
||||
(= 1 (count params-y))
|
||||
(coll? values))
|
||||
(let [sql (str "(" (str/join ", " (repeat (count values) "?")) ")")]
|
||||
(-> [(str sql-x " " (sql-kw in) " " sql)]
|
||||
(into params-x)
|
||||
|
|
@ -1465,11 +1484,14 @@
|
|||
(into [(str "LATERAL " sql)] params))))
|
||||
:lift
|
||||
(fn [_ [x]]
|
||||
(if *inline*
|
||||
(cond *inline*
|
||||
;; this is pretty much always going to be wrong,
|
||||
;; but it could produce a valid result so we just
|
||||
;; assume that the user knows what they are doing:
|
||||
[(sqlize-value x)]
|
||||
*numbered*
|
||||
(->numbered x)
|
||||
:else
|
||||
["?" (with-meta (constantly x)
|
||||
{::wrapper (fn [fx _] (fx))})]))
|
||||
:nest
|
||||
|
|
@ -1503,8 +1525,11 @@
|
|||
(into [(str/join ", " sqls)] params)))
|
||||
:param
|
||||
(fn [_ [k]]
|
||||
(if *inline*
|
||||
(cond *inline*
|
||||
[(sqlize-value (param-value k))]
|
||||
*numbered*
|
||||
(->numbered-param k)
|
||||
:else
|
||||
["?" (->param k)]))
|
||||
:raw
|
||||
(fn [_ [xs]]
|
||||
|
|
@ -1586,8 +1611,11 @@
|
|||
["NULL"]
|
||||
|
||||
:else
|
||||
(if *inline*
|
||||
(cond *inline*
|
||||
[(sqlize-value expr)]
|
||||
*numbered*
|
||||
(->numbered expr)
|
||||
:else
|
||||
["?" expr])))
|
||||
|
||||
(defn- check-dialect [dialect]
|
||||
|
|
@ -1642,6 +1670,8 @@
|
|||
*inline* (if (contains? opts :inline)
|
||||
(:inline opts)
|
||||
@default-inline)
|
||||
*numbered* (when (:numbered opts)
|
||||
(atom []))
|
||||
*quoted* (cond (contains? opts :quoted)
|
||||
(:quoted opts)
|
||||
dialect?
|
||||
|
|
|
|||
Loading…
Reference in a new issue