Merge remote-tracking branch 'dball/support-locking-selects' into HEAD
This commit is contained in:
commit
72784452b9
3 changed files with 28 additions and 1 deletions
|
|
@ -188,6 +188,7 @@
|
|||
:order-by 190
|
||||
:limit 200
|
||||
:offset 210
|
||||
:lock 215
|
||||
:values 220
|
||||
:query-values 230})
|
||||
|
||||
|
|
@ -433,6 +434,22 @@
|
|||
(defmethod format-clause :offset [[_ offset] _]
|
||||
(str "OFFSET " (to-sql offset)))
|
||||
|
||||
(defmulti format-lock-clause identity)
|
||||
|
||||
(defmethod format-lock-clause :update [_]
|
||||
"FOR UPDATE")
|
||||
|
||||
(defmethod format-lock-clause :mysql-share [_]
|
||||
"LOCK IN SHARE MODE")
|
||||
|
||||
(defmethod format-lock-clause :postgresql-share [_]
|
||||
"FOR SHARE")
|
||||
|
||||
(defmethod format-clause :lock [[_ lock] _]
|
||||
(let [{:keys [mode wait]} lock
|
||||
clause (format-lock-clause mode)]
|
||||
(str clause (when (false? wait) " NOWAIT"))))
|
||||
|
||||
(defmethod format-clause :insert-into [[_ table] _]
|
||||
(if (and (sequential? table) (sequential? (first table)))
|
||||
(str "INSERT INTO "
|
||||
|
|
|
|||
|
|
@ -154,6 +154,11 @@
|
|||
m
|
||||
(assoc m :offset (if (coll? o) (first o) o))))
|
||||
|
||||
(defhelper lock [m lock]
|
||||
(cond-> m
|
||||
lock
|
||||
(assoc :lock lock)))
|
||||
|
||||
(defhelper modifiers [m ms]
|
||||
(if (nil? ms)
|
||||
m
|
||||
|
|
|
|||
|
|
@ -60,7 +60,12 @@
|
|||
(testing "SQL data formats correctly with alternate param naming"
|
||||
(is (= (sql/format m1 :params {:param1 "gabba" :param2 2} :parameterizer :postgresql)
|
||||
["SELECT DISTINCT f.*, b.baz, c.quux, b.bla AS bla_bla, now(), @x := 10 FROM foo f, baz b INNER JOIN draq ON f.b = draq.x LEFT JOIN clod c ON f.a = c.d RIGHT JOIN bock ON bock.z = c.e FULL JOIN beck ON beck.x = c.y WHERE ((f.a = $1 AND b.baz <> $2) OR (1 < 2 AND 2 < 3) OR (f.e in (1, $3, 3)) OR f.e BETWEEN 10 AND 20) GROUP BY f.a HAVING 0 < f.e ORDER BY b.baz DESC, c.quux, f.a NULLS FIRST LIMIT 50 OFFSET 10 "
|
||||
"bort" "gabba" 2])))))
|
||||
"bort" "gabba" 2])))
|
||||
(testing "Locking"
|
||||
(is (= ["SELECT DISTINCT f.*, b.baz, c.quux, b.bla AS bla_bla, now(), @x := 10 FROM foo f, baz b INNER JOIN draq ON f.b = draq.x LEFT JOIN clod c ON f.a = c.d RIGHT JOIN bock ON bock.z = c.e FULL JOIN beck ON beck.x = c.y WHERE ((f.a = ? AND b.baz <> ?) OR (1 < 2 AND 2 < 3) OR (f.e in (1, ?, 3)) OR f.e BETWEEN 10 AND 20) GROUP BY f.a HAVING 0 < f.e ORDER BY b.baz DESC, c.quux, f.a NULLS FIRST LIMIT 50 OFFSET 10 FOR UPDATE "
|
||||
"bort" "gabba" 2]
|
||||
(sql/format (assoc m1 :lock {:mode :update})
|
||||
{:param1 "gabba" :param2 2}))))))
|
||||
|
||||
(deftest test-cast
|
||||
(is (= ["SELECT foo, CAST(bar AS integer)"]
|
||||
|
|
|
|||
Loading…
Reference in a new issue