Browse Source

NULL string fix

Julien Schmidt 13 years ago
parent
commit
3e4d413578
2 changed files with 21 additions and 10 deletions
  1. 16 5
      packets.go
  2. 5 5
      utils.go

+ 16 - 5
packets.go

@@ -416,7 +416,7 @@ func (mc *mysqlConn) readColumns(count int) (columns []mysqlField, err error) {
 		pos += n
 
 		// Name [len coded string]
-		name, n, err = readLengthEnodedString(data[pos:])
+		name, _, n, err = readLengthEnodedString(data[pos:])
 		if err != nil {
 			return
 		}
@@ -471,14 +471,19 @@ func (rows *mysqlRows) readRow(dest []driver.Value) (err error) {
 
 	// RowSet Packet
 	var n int
+	var isNull bool
 	pos := 0
 
 	for i := range dest {
 		// Read bytes and convert to string
-		dest[i], n, err = readLengthEnodedString(data[pos:])
+		dest[i], isNull, n, err = readLengthEnodedString(data[pos:])
 		pos += n
 		if err == nil {
-			continue
+			if !isNull {
+				continue
+			} else {
+				dest[i] = nil
+			}
 		}
 		return // err
 	}
@@ -700,6 +705,7 @@ func (rc *mysqlRows) readBinaryRow(dest []driver.Value) (err error) {
 	// values [rest]
 	var n int
 	var unsigned bool
+
 	for i := range dest {
 		// Field is NULL
 		// (byte >> bit-pos) % 2 == 1
@@ -774,10 +780,15 @@ func (rc *mysqlRows) readBinaryRow(dest []driver.Value) (err error) {
 			FIELD_TYPE_TINY_BLOB, FIELD_TYPE_MEDIUM_BLOB, FIELD_TYPE_LONG_BLOB,
 			FIELD_TYPE_BLOB, FIELD_TYPE_VAR_STRING, FIELD_TYPE_STRING,
 			FIELD_TYPE_GEOMETRY:
-			dest[i], n, err = readLengthEnodedString(data[pos:])
+			var isNull bool
+			dest[i], isNull, n, err = readLengthEnodedString(data[pos:])
 			pos += n
 			if err == nil {
-				continue
+				if !isNull {
+					continue
+				} else {
+					dest[i] = nil
+				}
 			}
 			return // err
 

+ 5 - 5
utils.go

@@ -150,20 +150,20 @@ func uint64ToString(n uint64) []byte {
 	return a[i:]
 }
 
-func readLengthEnodedString(b []byte) ([]byte, int, error) {
+func readLengthEnodedString(b []byte) ([]byte, bool, int, error) {
 	// Get length
-	num, _, n := readLengthEncodedInteger(b)
+	num, isNull, n := readLengthEncodedInteger(b)
 	if num < 1 {
-		return nil, n, nil
+		return nil, isNull, n, nil
 	}
 
 	n += int(num)
 
 	// Check data length
 	if len(b) >= n {
-		return b[n-int(num) : n], n, nil
+		return b[n-int(num) : n], false, n, nil
 	}
-	return nil, n, io.EOF
+	return nil, false, n, io.EOF
 }
 
 func skipLengthEnodedString(b []byte) (int, error) {