- (multiple-value-bind (result-set n-col)
- (database-query-result-set query-expression database
- :result-types result-types
- :full-set nil)
- (do* ((rows nil)
- (col-names (when field-names
- (loop for j from 0 below n-col
- collect (sqlite:sqlite-aref (sqlite-result-set-col-names result-set) j))))
- (new-row (make-list n-col) (make-list n-col))
- (row-ok (database-store-next-row result-set database new-row)
- (database-store-next-row result-set database new-row)))
- ((not row-ok)
- (values (nreverse rows) col-names))
- (push new-row rows)))
+ (let ((vm (sqlite:sqlite-compile (sqlite-db database)
+ query-expression))
+ (rows '())
+ (col-names '()))
+ (unwind-protect
+ ;; Read the first row to get column number and names.
+ (multiple-value-bind (n-col new-row sqlite-col-names)
+ (sqlite:sqlite-step vm)
+ (declare (type sqlite:sqlite-row-pointer-type new-row))
+ (when (> n-col 0)
+ (when field-names
+ (setf col-names (loop for i from 0 below n-col
+ collect (sqlite:sqlite-aref sqlite-col-names i (encoding database)))))
+ (let ((canonicalized-result-types
+ (canonicalize-result-types result-types n-col sqlite-col-names)))
+ (flet ((extract-row-data (row)
+ (declare (type sqlite:sqlite-row-pointer-type row))
+ (loop for i from 0 below n-col
+ collect (clsql-uffi:convert-raw-field
+ (sqlite:sqlite-raw-aref row i)
+ (nth i canonicalized-result-types)
+ :encoding (encoding database)))))
+ (push (extract-row-data new-row) rows)
+
+ ;; Read subsequent rows.
+ (do () (nil)
+ (multiple-value-bind (n-col new-row)
+ (sqlite:sqlite-step vm)
+ (declare (type sqlite:sqlite-row-pointer-type new-row))
+ (if (> n-col 0)
+ (push (extract-row-data new-row) rows)
+ (return))))))))
+ (sqlite:sqlite-finalize vm))
+ (values (nreverse rows) col-names))