Skip to content

Commit 1fc5a38

Browse files
committed
[#191] Fix use of a single statement for a chain of SQL queries
1 parent 597eeca commit 1fc5a38

File tree

2 files changed

+66
-54
lines changed

2 files changed

+66
-54
lines changed

src/ejc_sql/connect.clj

+60-50
Original file line numberDiff line numberDiff line change
@@ -154,50 +154,59 @@ SELECT * FROM urls WHERE path like '%http://localhost%'"
154154

155155
(defn eval-sql-core
156156
"The core SQL evaluation function."
157-
[& {:keys [db sql fetch-size max-rows]
157+
[& {:keys [db sql-list fetch-size max-rows]
158158
:or {db @ejc-sql.connect/db}}]
159159
(set-db db)
160160
(java.util.Locale/setDefault (java.util.Locale. "UK"))
161161
(try
162-
(if (select? sql)
163-
(list
164-
:result-set
165-
(with-open [conn (j/get-connection db)]
166-
(let [stmt (j/prepare-statement
167-
conn sql
168-
{:fetch-size (or fetch-size @o/fetch-size 0)
169-
:max-rows (or max-rows
170-
(if (and (> @o/max-rows 0)
171-
@o/show-too-many-rows-message)
172-
;; Get one more row to recognize that
173-
;; the actual number of records from this
174-
;; query is bigger than `max-rows`.
175-
(+ @o/max-rows 1)
176-
@o/max-rows)
177-
0)})]
178-
(swap! current-query assoc
179-
:stmt stmt
180-
:conn conn)
181-
(j/query db stmt
182-
{:as-arrays? true
183-
:result-set-fn
184-
(fn [rs]
185-
(let [single-record?
186-
(not (next (next rs)))]
187-
(mapv
188-
#(clob-to-string-row
189-
% single-record?)
190-
rs)))}))))
191-
(let [result (first (j/execute! db (list sql)))
192-
msg (if (> result 0)
193-
(str "Records affected: " result)
194-
"Executed")]
195-
(when (ddl? sql)
196-
(invalidate-cache db))
197-
(list :message msg)))
162+
(with-open [conn (j/get-connection db)]
163+
(let [statement (.createStatement conn)]
164+
(mapv (fn [sql]
165+
(if (select? sql)
166+
;; SELECT
167+
(list
168+
:result-set
169+
(let [stmt (j/prepare-statement
170+
conn sql
171+
{:fetch-size (or fetch-size @o/fetch-size 0)
172+
:max-rows (or max-rows
173+
(if (and (> @o/max-rows 0)
174+
@o/show-too-many-rows-message)
175+
;; Get one more row to recognize that
176+
;; the actual number of records from this
177+
;; query is bigger than `max-rows`.
178+
(+ @o/max-rows 1)
179+
@o/max-rows)
180+
0)})]
181+
(swap! current-query assoc
182+
:stmt stmt
183+
:conn conn)
184+
(j/query db stmt
185+
{:as-arrays? true
186+
:result-set-fn
187+
(fn [rs]
188+
(let [single-record?
189+
(not (next (next rs)))]
190+
(mapv
191+
#(clob-to-string-row
192+
% single-record?)
193+
rs)))})))
194+
;; DML or DDL
195+
(let [result-set? (.execute statement sql)
196+
message (if-let [result (when
197+
(and
198+
(not result-set?)
199+
(> (.getUpdateCount statement) 0))
200+
(.getUpdateCount statement))]
201+
(str "Records affected: " result)
202+
"Executed")]
203+
(when (ddl? sql)
204+
(invalidate-cache db))
205+
(list :message message))))
206+
sql-list)))
198207
(catch SQLException e
199-
(list :message
200-
(o/unify-str "Error: " (.getMessage e))))))
208+
[(list :message
209+
(o/unify-str "Error: " (.getMessage e)))])))
201210

202211
(defn- eval-user-sql
203212
"Receive raw SQL from the user, log it, divide by statements and eval them."
@@ -219,23 +228,24 @@ SELECT * FROM urls WHERE path like '%http://localhost%'"
219228
[sql nil])
220229
sql (handle-special-cases db sql)
221230
statement-separator-re (get-separator-re (or manual-separator ";"))
222-
results (doall
223-
(for [sql-part (filter
231+
results (let [sql-parts (filter
224232
;; Remove parts contains comments only.
225233
(fn [part]
226234
(seq (s/trim
227235
(s/replace part comments-re ""))))
228236
(if (or (not (:separator db)) manual-separator)
229237
(s/split sql statement-separator-re)
230-
[sql]))]
231-
(let [[result-type result] (eval-sql-core :db db
232-
:sql sql-part
233-
:max-rows rows-limit
234-
:fetch-size fetch-size)]
235-
(if (= result-type :result-set)
236-
(o/print-table result fetch-size)
237-
(println result))
238-
[result-type result])))]
238+
[sql]))
239+
result-list (eval-sql-core :db db
240+
:sql-list sql-parts
241+
:max-rows rows-limit
242+
:fetch-size fetch-size)
243+
_ (doall
244+
(for [[result-type result] result-list]
245+
(if (= result-type :result-set)
246+
(o/print-table result fetch-size)
247+
(println result))))]
248+
result-list)]
239249
(complete
240250
nil
241251
:start-time (:start-time @current-query)

src/ejc_sql/structure.clj

+6-4
Original file line numberDiff line numberDiff line change
@@ -1170,10 +1170,12 @@
11701170
(println)
11711171
(println "Constraints:")
11721172
(println)
1173-
(o/print-table (second (c/eval-sql-core :db db
1174-
:sql sql
1175-
:fetch-size 0
1176-
:max-rows 0)))))))
1173+
(o/print-table (second
1174+
(first
1175+
(c/eval-sql-core :db db
1176+
:sql-list (list sql)
1177+
:fetch-size 0
1178+
:max-rows 0))))))))
11771179
(c/complete
11781180
nil
11791181
:display-result true

0 commit comments

Comments
 (0)