diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index cace514..b42b020 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -247,9 +247,27 @@ (into [sql-str] @*params*) [sql-str])))) +(defn add-param [pname pval] + (swap! *param-names* conj pname) + (swap! *params* conj pval) + (*parameterizer*)) + +;; Anonymous param name -- :_1, :_2, etc. +(defn add-anon-param [pval] + (add-param + (keyword (str "_" (swap! *param-counter* inc))) + pval)) + (defprotocol ToSql (-to-sql [x])) +(defrecord Value [v] + ToSql + (-to-sql [_] + (add-anon-param v))) + +(defn value [x] (Value. x)) + (declare -format-clause) (extend-protocol ToSql @@ -303,20 +321,17 @@ sql-str))) nil (-to-sql [x] "NULL") + SqlParam + (-to-sql [x] + (let [pname (param-name x)] + (if (map? @*input-params*) + (add-param pname (get @*input-params* pname)) + (let [x (first @*input-params*)] + (swap! *input-params* rest) + (add-param pname x))))) Object (-to-sql [x] - (let [[x pname] (if (instance? SqlParam x) - (let [pname (param-name x)] - (if (map? @*input-params*) - [(get @*input-params* pname) pname] - (let [x (first @*input-params*)] - (swap! *input-params* rest) - [x pname]))) - ;; Anonymous param name -- :_1, :_2, etc. - [x (keyword (str "_" (swap! *param-counter* inc)))])] - (swap! *param-names* conj pname) - (swap! *params* conj x) - (*parameterizer*)))) + (add-anon-param x))) (defn sqlable? [x] (satisfies? ToSql x)) diff --git a/test/honeysql/core_test.clj b/test/honeysql/core_test.clj index e58c49c..d7c5543 100644 --- a/test/honeysql/core_test.clj +++ b/test/honeysql/core_test.clj @@ -67,3 +67,11 @@ (sql/format {:select [:foo (sql/call :cast :bar :integer)]}))) (is (= ["SELECT foo, CAST(bar AS integer)"] (sql/format {:select [:foo (sql/call :cast :bar 'integer)]})))) + +(deftest test-value + (is (= ["INSERT INTO foo (bar) VALUES (?)" {:baz "my-val"}] + (-> + (insert-into :foo) + (columns :bar) + (values [[(honeysql.format/value {:baz "my-val"})]]) + sql/format))))