fix Support full TRUNCATE syntax (cascade, identity) #438
This commit is contained in:
parent
dda3aa017e
commit
e8ea9283cc
4 changed files with 32 additions and 9 deletions
|
|
@ -1,6 +1,8 @@
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
* 2.3.next in progress
|
* 2.3.next in progress
|
||||||
|
* Fix [#438](https://github.com/seancorfield/honeysql/issues/438) by
|
||||||
|
supporting options on `TRUNCATE`.
|
||||||
* Address [#435](https://github.com/seancorfield/honeysql/issues/435) by showing `CREATE TEMP TABLE` etc.
|
* Address [#435](https://github.com/seancorfield/honeysql/issues/435) by showing `CREATE TEMP TABLE` etc.
|
||||||
* Fix [#431](https://github.com/seancorfield/honeysql/issues/431).
|
* Fix [#431](https://github.com/seancorfield/honeysql/issues/431).
|
||||||
* Address [#430](https://github.com/seancorfield/honeysql/issues/430) by treating `:'` as introducing a name that should be treating literally and not formatted as a SQL entity (which respects quoting, dot-splitting, etc); this effectively expands the "escape hatch" introduced via [#352](https://github.com/seancorfield/honeysql/issues/352) in 2.2.868. _Note that the function context behavior formats as a SQL entity, rather than the usual SQL "keyword", whereas this new context is a literal transcription rather than as a SQL entity!_
|
* Address [#430](https://github.com/seancorfield/honeysql/issues/430) by treating `:'` as introducing a name that should be treating literally and not formatted as a SQL entity (which respects quoting, dot-splitting, etc); this effectively expands the "escape hatch" introduced via [#352](https://github.com/seancorfield/honeysql/issues/352) in 2.2.868. _Note that the function context behavior formats as a SQL entity, rather than the usual SQL "keyword", whereas this new context is a literal transcription rather than as a SQL entity!_
|
||||||
|
|
|
||||||
|
|
@ -590,11 +590,14 @@ user=> (sql/format {:delete [:order :item]
|
||||||
|
|
||||||
## truncate
|
## truncate
|
||||||
|
|
||||||
`:truncate` accepts a simple SQL entity (table name):
|
`:truncate` accepts a simple SQL entity (table name)
|
||||||
|
or a table name followed by various options:
|
||||||
|
|
||||||
```clojure
|
```clojure
|
||||||
user=> (sql/format '{truncate transport})
|
user=> (sql/format '{truncate transport})
|
||||||
["TRUNCATE transport"]
|
["TRUNCATE transport"]
|
||||||
|
user=> (sql/format '{truncate (transport restart identity)})
|
||||||
|
["TRUNCATE transport RESTART IDENTITY"]
|
||||||
```
|
```
|
||||||
|
|
||||||
## columns
|
## columns
|
||||||
|
|
|
||||||
|
|
@ -894,14 +894,14 @@
|
||||||
:else
|
:else
|
||||||
(sql-kw opt))))
|
(sql-kw opt))))
|
||||||
|
|
||||||
(defn- destructure-create-item [table context]
|
(defn- destructure-ddl-item [table context]
|
||||||
(let [params
|
(let [params
|
||||||
(if (sequential? table)
|
(if (sequential? table)
|
||||||
table
|
table
|
||||||
[table])
|
[table])
|
||||||
tab? #(or (ident? %) (string? %))
|
tab? #(or (ident? %) (string? %))
|
||||||
coll (take-while tab? params)
|
coll (take-while tab? params)
|
||||||
opts (drop-while tab? params)
|
opts (filter some? (drop-while tab? params))
|
||||||
ine (last coll)
|
ine (last coll)
|
||||||
[prequel table ine]
|
[prequel table ine]
|
||||||
(if (= :if-not-exists (sym->kw ine))
|
(if (= :if-not-exists (sym->kw ine))
|
||||||
|
|
@ -910,11 +910,26 @@
|
||||||
(into [(str/join " " (map sql-kw prequel))
|
(into [(str/join " " (map sql-kw prequel))
|
||||||
(format-entity table)
|
(format-entity table)
|
||||||
(when ine (sql-kw ine))]
|
(when ine (sql-kw ine))]
|
||||||
(format-ddl-options opts context))))
|
(when opts
|
||||||
|
(format-ddl-options opts context)))))
|
||||||
|
|
||||||
|
(defn- format-truncate [k xs]
|
||||||
|
(let [[table & options] (if (sequential? xs) xs [xs])
|
||||||
|
[pre table ine options] (destructure-ddl-item [table options] "truncate")]
|
||||||
|
(when (seq pre) (throw (ex-info "TRUNCATE syntax error" {:unexpected pre})))
|
||||||
|
(when (seq ine) (throw (ex-info "TRUNCATE syntax error" {:unexpected ine})))
|
||||||
|
[(str/join " " (cond-> [(sql-kw k) table]
|
||||||
|
(seq options)
|
||||||
|
(conj options)))]))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(destructure-ddl-item [:foo [:abc [:continue :wibble] :identity]] "test")
|
||||||
|
(destructure-ddl-item [:foo] "test")
|
||||||
|
(format-truncate :truncate [:foo]))
|
||||||
|
|
||||||
(defn- format-create [q k item as]
|
(defn- format-create [q k item as]
|
||||||
(let [[pre entity ine & more]
|
(let [[pre entity ine & more]
|
||||||
(destructure-create-item item (str (sql-kw q) " options"))]
|
(destructure-ddl-item item (str (sql-kw q) " options"))]
|
||||||
[(str/join " " (remove nil?
|
[(str/join " " (remove nil?
|
||||||
(-> [(sql-kw q)
|
(-> [(sql-kw q)
|
||||||
(when (and (= :create q) (seq pre)) pre)
|
(when (and (= :create q) (seq pre)) pre)
|
||||||
|
|
@ -1098,7 +1113,7 @@
|
||||||
:update (check-where #'format-selector)
|
:update (check-where #'format-selector)
|
||||||
:delete (check-where #'format-selects)
|
:delete (check-where #'format-selects)
|
||||||
:delete-from (check-where #'format-selector)
|
:delete-from (check-where #'format-selector)
|
||||||
:truncate #'format-selector
|
:truncate #'format-truncate
|
||||||
:columns #'format-columns
|
:columns #'format-columns
|
||||||
:set #'format-set-exprs
|
:set #'format-set-exprs
|
||||||
:from #'format-selects
|
:from #'format-selects
|
||||||
|
|
|
||||||
|
|
@ -519,6 +519,9 @@
|
||||||
(deftest truncate-test
|
(deftest truncate-test
|
||||||
(is (= ["TRUNCATE `foo`"]
|
(is (= ["TRUNCATE `foo`"]
|
||||||
(-> {:truncate :foo}
|
(-> {:truncate :foo}
|
||||||
|
(format {:dialect :mysql}))))
|
||||||
|
(is (= ["TRUNCATE `foo` CONTINUE IDENTITY"]
|
||||||
|
(-> {:truncate [:foo :continue :identity]}
|
||||||
(format {:dialect :mysql})))))
|
(format {:dialect :mysql})))))
|
||||||
|
|
||||||
(deftest inlined-values-are-stringified-correctly
|
(deftest inlined-values-are-stringified-correctly
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue