Update of /project/pg/cvsroot/pg In directory clnet:/tmp/cvs-serv5864
Modified Files: v3-protocol.lisp Log Message: Make sure we consume the ReadyForQuery packet that is generated when closing a prepared statement or portal, or the packet can be misinterpreted by a later query, leading to data loss. Fix from Robert J. Macomber.
--- /project/pg/cvsroot/pg/v3-protocol.lisp 2006/11/20 20:50:36 1.29 +++ /project/pg/cvsroot/pg/v3-protocol.lisp 2006/11/26 18:05:11 1.30 @@ -485,8 +485,8 @@
(defun do-followup-query (connection) "Does the followup of a query" - (let ((tuples '()) - (attributes '()) + (let ((tuples (list)) + (attributes (list)) (result (make-pgresult :connection connection))) (loop :for packet = (read-packet connection) @@ -592,6 +592,7 @@
((#\Z) ;; ReadyForQuery (let ((status (read-from-packet packet :byte))) + (declare (ignore status)) (when got-data-p (return-from do-followup-query result))))
@@ -613,12 +614,11 @@ ((#\2 #\1 #\3) (return-from do-followup-query result))
- ((#\n) + ((#\n) ;; NoData (setf got-data-p t))
;; error messages will already have been handled in READ-PACKET ((#\E) - (error "not reached!") (setq got-data-p t))
;; notice messages will already have been handled in READ-PACKET @@ -929,7 +929,9 @@ (loop :for packet = (read-packet connection) :do (case (pg-packet-type packet) - ((#\3 #\Z) ;; CloseComplete or ReadyForQuery + ((#\3) + t) + ((#\Z) ;; CloseComplete or ReadyForQuery (return)) (t (warn "Got unexpected packet in PG-CLOSE: ~S, resetting connection" packet)