From f05c7051e230150d9c93488f269700be37289fda Mon Sep 17 00:00:00 2001 From: Nikita Domnitskii Date: Thu, 16 Jan 2025 18:25:52 +0600 Subject: [PATCH] Support expressions in WITH clauses --- src/honey/sql.cljc | 2 +- test/honey/sql_test.cljc | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/honey/sql.cljc b/src/honey/sql.cljc index 7030653..d7e5621 100644 --- a/src/honey/sql.cljc +++ b/src/honey/sql.cljc @@ -943,7 +943,7 @@ (map (fn [[x expr & tail :as with]] (let [[sql & params] (format-with-part x) - non-query-expr? (or (ident? expr) (string? expr)) + non-query-expr? (not (map? expr)) [sql' & params'] (if non-query-expr? (format-expr expr) (format-dsl expr)) diff --git a/test/honey/sql_test.cljc b/test/honey/sql_test.cljc index eca34ab..ba6bce4 100644 --- a/test/honey/sql_test.cljc +++ b/test/honey/sql_test.cljc @@ -221,7 +221,26 @@ :from [:hits :stuff] :where [:= :EventDate :ts_upper_bound]}) ["WITH ? AS ts_upper_bound, stuff AS (SELECT * FROM songs) SELECT * FROM hits, stuff WHERE EventDate = ts_upper_bound" - "2019-08-01 15:23:00"])))) + "2019-08-01 15:23:00"]))) + (testing "Use expression in a WITH clause" + (is (= (format + {:with [[:s [:sum :bytes]]] + :select [:s] + :from [:table]}) + ["WITH SUM(bytes) AS s SELECT s FROM table"])) + + (is (= (format + {:with [[:v [:raw "m['k']"]]] + :select [:v] + :from [:table]}) + ["WITH m['k'] AS v SELECT v FROM table"])) + + (is (= (format + {:with [[:cond [:and [:= :a 1] [:= :b 2] [:= :c 3]]]] + :select [:v] + :from [:table] + :where :cond}) + ["WITH (a = ?) AND (b = ?) AND (c = ?) AS cond SELECT v FROM table WHERE cond" 1 2 3])))) (deftest insert-into (is (= (format {:insert-into :foo})