Merge remote-tracking branch 'dball/support-locking-selects' into HEAD

This commit is contained in:
Mike Blume 2015-04-17 14:25:23 -07:00
commit 72784452b9
3 changed files with 28 additions and 1 deletions

View file

@ -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 "

View file

@ -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

View file

@ -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)"]