Details
-
Type:
Defect
-
Status:
Closed
-
Priority:
Major
-
Resolution: Declined
-
Affects Version/s: Release 1.2
-
Fix Version/s: None
-
Component/s: None
-
Labels:None
Description
The clojure.sql/resultset-seq function returns a seq over the JDBC ResultSet.
Expected: calling seq on an empty ResultSet should return nil
Actual: throws an error due to a closed ResultSet
Example:
(def db {:classname "oracle.jdbc.driver.OracleDriver"
:subprotocol "oracle:thin"
:subname "@detroit:1521:XE"
:user "ted"
:password "nugent"
:schema "sweaty"})
(with-connection db
(with-query-results res ["SELECT 1 FROM dual WHERE 0=1"]
(seq res)))
returns:
java.sql.SQLRecoverableException: Closed Resultset: next [Thrown class java.lang.RuntimeException] Backtrace: 0: clojure.lang.LazySeq.sval(LazySeq.java:47) 1: clojure.lang.LazySeq.seq(LazySeq.java:56) 2: clojure.lang.Cons.next(Cons.java:39) 3: clojure.lang.RT.next(RT.java:560) 4: clojure.core$next.invoke(core.clj:61) 5: clojure.core$nthnext.invoke(core.clj:3399) 6: clojure.core$print_sequential.invoke(core_print.clj:55) 7: clojure.core$fn__4845.invoke(core_print.clj:138) 8: clojure.lang.MultiFn.invoke(MultiFn.java:167) 9: clojure.core$pr_on.invoke(core.clj:2812) 10: clojure.core$pr.invoke(core.clj:2824) 11: clojure.lang.AFn.applyToHelper(AFn.java:163) 12: clojure.lang.RestFn.applyTo(RestFn.java:133) 13: clojure.core$apply.invoke(core.clj:540) 14: clojure.core$pr_str.doInvoke(core.clj:3700) 15: clojure.lang.RestFn.invoke(RestFn.java:409)
Suggested workaround:
(with-connection db
(with-query-results res ["SELECT 1 FROM dual WHERE 0=0"]
(not (empty? res))))
This is not a Clojure issue. clojure.contrib.sql is part of the old clojure-contrib project, soon to be replaced.