fix #503 by adding at time zone special syntax
This commit is contained in:
parent
ac09fc1abd
commit
756ed95b43
4 changed files with 30 additions and 0 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
* 2.4.next in progress
|
* 2.4.next in progress
|
||||||
|
* Address [#503](https://github.com/seancorfield/honeysql/issues/503) by adding `:at-time-zone` special syntax.
|
||||||
* Address [#504](https://github.com/seancorfield/honeysql/issues/504) for BigQuery support, by adding special syntax for ignore/respect nulls, as well as new `:distinct` and `:expr` clauses to allow expressions to be qualified with SQL clauses. The latter will probably be useful for other dialects too.
|
* Address [#504](https://github.com/seancorfield/honeysql/issues/504) for BigQuery support, by adding special syntax for ignore/respect nulls, as well as new `:distinct` and `:expr` clauses to allow expressions to be qualified with SQL clauses. The latter will probably be useful for other dialects too.
|
||||||
|
|
||||||
* 2.4.1066 -- 2023-08-27
|
* 2.4.1066 -- 2023-08-27
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,19 @@ In addition, the argument to `:array` is treated as a literal sequence of Clojur
|
||||||
;;=> ["SELECT ARRAY[inline, (?, ?, ?)] AS arr" 1 2 3]
|
;;=> ["SELECT ARRAY[inline, (?, ?, ?)] AS arr" 1 2 3]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## at time zone
|
||||||
|
|
||||||
|
Accepts two arguments: an expression (assumed to be a date/time of some sort)
|
||||||
|
and a time zone name or identifier (can be a string, a symbol, or a keyword):
|
||||||
|
|
||||||
|
```clojure
|
||||||
|
(sql/format-expr [:at-time-zone [:now] :utc])
|
||||||
|
;;=> ["NOW() AT TIME ZONE 'UTC'"]
|
||||||
|
```
|
||||||
|
|
||||||
|
The time zone name or identifier will be inlined (as a string) and therefore
|
||||||
|
cannot be an expression.
|
||||||
|
|
||||||
## between
|
## between
|
||||||
|
|
||||||
Accepts three arguments: an expression, a lower bound, and
|
Accepts three arguments: an expression, a lower bound, and
|
||||||
|
|
|
||||||
|
|
@ -1632,6 +1632,7 @@
|
||||||
:primary-key #'function-0
|
:primary-key #'function-0
|
||||||
:references #'function-1
|
:references #'function-1
|
||||||
:unique #'function-1-opt
|
:unique #'function-1-opt
|
||||||
|
;; dynamic dotted name creation:
|
||||||
:. (fn [_ [expr col subcol]]
|
:. (fn [_ [expr col subcol]]
|
||||||
(let [[sql & params] (format-expr expr)]
|
(let [[sql & params] (format-expr expr)]
|
||||||
(into [(str sql "." (format-entity col)
|
(into [(str sql "." (format-entity col)
|
||||||
|
|
@ -1658,6 +1659,13 @@
|
||||||
(let [[sqls params] (format-expr-list arr)
|
(let [[sqls params] (format-expr-list arr)
|
||||||
type-str (when type (str "::" (sql-kw type) "[]"))]
|
type-str (when type (str "::" (sql-kw type) "[]"))]
|
||||||
(into [(str "ARRAY[" (str/join ", " sqls) "]" type-str)] params)))
|
(into [(str "ARRAY[" (str/join ", " sqls) "]" type-str)] params)))
|
||||||
|
:at-time-zone
|
||||||
|
(fn [_ [expr tz]]
|
||||||
|
(let [[sql & params] (format-expr expr {:nested true})
|
||||||
|
[tz-sql & _]
|
||||||
|
(binding [*inline* true]
|
||||||
|
(format-expr (if (ident? tz) (name tz) tz)))]
|
||||||
|
(into [(str sql " AT TIME ZONE " tz-sql)] params)))
|
||||||
:between
|
:between
|
||||||
(fn [_ [x a b]]
|
(fn [_ [x a b]]
|
||||||
(let [[sql-x & params-x] (format-expr x {:nested true})
|
(let [[sql-x & params-x] (format-expr x {:nested true})
|
||||||
|
|
|
||||||
|
|
@ -1261,6 +1261,14 @@ ORDER BY id = ? DESC
|
||||||
(is (= ["INSERT INTO foo (bar) OUTPUT inserted.* VALUES (?)" 1]
|
(is (= ["INSERT INTO foo (bar) OUTPUT inserted.* VALUES (?)" 1]
|
||||||
(sut/format {:insert-into :foo :columns [:bar] :output [:inserted.*] :values [[1]]}))))
|
(sut/format {:insert-into :foo :columns [:bar] :output [:inserted.*] :values [[1]]}))))
|
||||||
|
|
||||||
|
(deftest at-time-zone-503
|
||||||
|
(is (= ["SELECT foo AT TIME ZONE 'UTC'"]
|
||||||
|
(sut/format {:select [[[:at-time-zone :foo "UTC"]]]})))
|
||||||
|
(is (= ["SELECT foo AT TIME ZONE 'UTC'"]
|
||||||
|
(sut/format {:select [[[:at-time-zone :foo :UTC]]]})))
|
||||||
|
(is (= ["SELECT FOO(bar) AT TIME ZONE 'UTC'"]
|
||||||
|
(sut/format {:select [[[:at-time-zone [:foo :bar] :UTC]]]}))))
|
||||||
|
|
||||||
(comment
|
(comment
|
||||||
;; partial workaround for #407:
|
;; partial workaround for #407:
|
||||||
(sut/format {:select :f.* :from [[:foo [:f :for :system-time]]] :where [:= :f.id 1]})
|
(sut/format {:select :f.* :from [[:foo [:f :for :system-time]]] :where [:= :f.id 1]})
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue