[pg-cvs] CVS pg
emarsden
emarsden at common-lisp.net
Sun Oct 22 15:48:46 UTC 2006
Update of /project/pg/cvsroot/pg
In directory clnet:/tmp/cvs-serv11251
Modified Files:
v3-protocol.lisp
Log Message:
Allow NULL values for bound variables in prepared statements. Bug
pointed out by Steve Purcell <steve at sanityinc.com>.
--- /project/pg/cvsroot/pg/v3-protocol.lisp 2006/09/24 15:50:18 1.25
+++ /project/pg/cvsroot/pg/v3-protocol.lisp 2006/10/22 15:48:45 1.26
@@ -321,7 +321,7 @@
do
(ecase type
((:byte)
- (check-type value (unsigned-byte 8))
+ (check-type value (signed-byte 8))
(setf (elt data position) value)
(incf position))
((:char)
@@ -329,13 +329,12 @@
(setf (elt data position) (char-code value))
(incf position))
((:int16)
- (check-type value (unsigned-byte 16))
+ (check-type value (signed-byte 16))
(setf (elt data position) (ldb (byte 8 8) value))
(setf (elt data (+ 1 position)) (ldb (byte 8 0) value))
(incf position 2))
((:int32)
- (check-type value (unsigned-byte 32))
-
+ (check-type value (signed-byte 32))
(setf (elt data position) (ldb (byte 8 24) value))
(setf (elt data (+ 1 position)) (ldb (byte 8 16) value))
(setf (elt data (+ 2 position)) (ldb (byte 8 8) value))
@@ -859,25 +858,28 @@
(when list-of-types-and-values
(loop :for (type value) :in list-of-types-and-values
:do
- (ecase type
- ((:int32)
- (push '(:int32 4) data)
- (push `(:int32 ,value) data))
- ((:int16)
- (push '(:int32 2) data)
- (push `(:int16 ,value) data))
- ((:byte)
- (push '(:int32 1) data)
- (push `(:int8 ,value) data))
- ((:char)
- (push '(:int32 1) data)
- (push `(:int8 ,(char-code value)) data))
- ;; this is not a NUL-terminated string, so send exactly
- ;; the string length rather than 1+
- ((:string)
- (let ((encoded-length (length (convert-string-to-bytes value (pg-client-encoding connection)))))
- (push `(:int32 ,encoded-length) data)
- (push `(:string ,value) data)))))
+ (cond ((null value)
+ (push '(:int32 -1) data))
+ (t
+ (ecase type
+ ((:int32)
+ (push '(:int32 4) data)
+ (push `(:int32 ,value) data))
+ ((:int16)
+ (push '(:int32 2) data)
+ (push `(:int16 ,value) data))
+ ((:byte)
+ (push '(:int32 1) data)
+ (push `(:int8 ,value) data))
+ ((:char)
+ (push '(:int32 1) data)
+ (push `(:int8 ,(char-code value)) data))
+ ;; this is not a NUL-terminated string, so send exactly
+ ;; the string length rather than 1+
+ ((:string)
+ (let ((encoded-length (length (convert-string-to-bytes value (pg-client-encoding connection)))))
+ (push `(:int32 ,encoded-length) data)
+ (push `(:string ,value) data)))))))
(setf data (nreverse data)))
(cond
More information about the Pg-cvs
mailing list