From db0f21b5a59a2726bcfc1d02379376564a586a1c Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 22 Jul 2015 10:32:13 +0200 Subject: [PATCH] Process MS SQL smallint datatypes as unsigned, fix #262. The freetds protocol apparently sends unsigned versions of the values on the wire, so that we have to convert them to signed numbers upon reception. --- src/monkey/mssql.lisp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/monkey/mssql.lisp b/src/monkey/mssql.lisp index d7ae0fe..ecd7a91 100644 --- a/src/monkey/mssql.lisp +++ b/src/monkey/mssql.lisp @@ -73,13 +73,19 @@ (:syb-xml 163) ) +(defun unsigned-to-signed (byte n) + (declare (type fixnum n) (type unsigned-byte byte)) + (logior byte (- (mask-field (byte 1 (1- (* n 8))) byte)))) + (defun sysdb-data-to-lisp (%dbproc data type len) (if (> len 0) (case (foreign-enum-keyword '%syb-value-type type) ((:syb-varchar :syb-text) (foreign-string-to-lisp data :count len)) (:syb-char (string-trim #(#\Space) (foreign-string-to-lisp data :count len))) ((:syb-bit :syb-bitn) (mem-ref data :int)) - ((:syb-int1 :syb-int2 :syb-int4) (mem-ref data :int)) + ((:syb-int1 (unsigned-to-signed (mem-ref data :int) 1))) + ((:syb-int2 (unsigned-to-signed (mem-ref data :int) 2))) + ((:syb-int4 (unsigned-to-signed (mem-ref data :int) 4))) (:syb-int8 (mem-ref data :int8)) (:syb-flt8 (mem-ref data :double)) (:syb-datetime