diff --git a/CHANGELOG.md b/CHANGELOG.md index e5e28cc..efd214b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * Address [#541](https://github.com/seancorfield/honeysql/issues/541) by specifying the expected result of a formatter function passed to `register-clause!` and adding the example from the README to **Extending HoneySQL**. * Getting Started updated based on feedback from Los Angeles Clojure meetup walkthrough [#539](https://github.com/seancorfield/honeysql/issues/539). * Fix [#538](https://github.com/seancorfield/honeysql/issues/538) by removing `mod` from list of infix operators. + * Fixed a few symbol/keyword resolution bugs in the formatter. Thanks to [@irigarae](https://github.com/irigarae). * Update Clojure version to 1.12.0; update dev/test/ci deps. * 2.6.1161 -- 2024-08-29 diff --git a/src/honey/sql.cljc b/src/honey/sql.cljc index b1ccbfa..1aec57a 100644 --- a/src/honey/sql.cljc +++ b/src/honey/sql.cljc @@ -516,14 +516,15 @@ "Given a general selectable item, split it into the subject selectable, an optional alias, and any temporal clauses present." [[selectable alias-for for-part & more]] - (let [no-alias? (and (= :for (sym->kw alias-for)) for-part)] + (let [no-alias? (and (contains? #{:for 'for} alias-for) + for-part)] [selectable (if no-alias? nil alias-for) (cond no-alias? (into [alias-for for-part] more) - (= :for (sym->kw for-part)) + (contains? #{:for 'for} for-part) (cons for-part more) (or for-part (seq more)) ::too-many!)])) @@ -946,7 +947,8 @@ true [j]) sqls (conj sqls sql-j)] - (if (and (sequential? e) (= :using (first e))) + (if (and (sequential? e) + (contains? #{:using 'using} (first e))) (let [[u-sqls u-params] (reduce-sql (map #'format-entity-alias) (rest e))] [(conj sqls @@ -1319,7 +1321,8 @@ (defn- format-create-index [k clauses] (let [[index-spec [table & exprs]] clauses [pre entity ine & more] (destructure-ddl-item index-spec (str (sql-kw k) " options")) - [using & exprs] (if (= :using-gin (first exprs)) + [using & exprs] (if (contains? #{:using-gin 'using-gin} + (first exprs)) exprs (cons nil exprs)) [sqls params] (format-expr-list exprs)] diff --git a/test/honey/sql_test.cljc b/test/honey/sql_test.cljc index b16eefb..08df655 100644 --- a/test/honey/sql_test.cljc +++ b/test/honey/sql_test.cljc @@ -1376,6 +1376,17 @@ ORDER BY id = ? DESC (sut/format {:select :a :from :table :where [:= :x [:param p1]]} {:params {p2 42}})))))) +(deftest issue-n-using + (testing "all keywords" + (is (= ["SELECT * FROM `t1` INNER JOIN `t2` USING (`id`) WHERE `t1`.`id` = ?" 1] + (sut/format {:select :* :from :t1 :join [:t2 [:using :id]] :where [:= :t1/id 1]} {:dialect :mysql})))) + (testing "all symbols" + (is (= ["SELECT * FROM `t1` INNER JOIN `t2` USING (`id`) WHERE `t1`.`id` = ?" 1] + (sut/format '{select * from t1 join (t2 (using id)) where (= t1/id 1)} {:dialect :mysql})))) + (testing "mixed keywords and symbols" + (is (= ["SELECT * FROM `t1` INNER JOIN `t2` USING (`id`) WHERE `t1`.`id` = ?" 1] + (sut/format '{select * from t1 join (t2 (:using id)) where (= t1/id 1)} {:dialect :mysql}))))) + (comment ;; partial (incorrect!) workaround for #407: (sut/format {:select :f.* :from [[:foo [:f :for :system-time]]] :where [:= :f.id 1]})