Browse Source

writeExecutePacket: fix packing

Julien Schmidt 12 years ago
parent
commit
3d95bd01fa
1 changed files with 15 additions and 3 deletions
  1. 15 3
      packets.go

+ 15 - 3
packets.go

@@ -868,8 +868,9 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
 		for i := range args {
 			// build NULL-bitmap
 			if args[i] == nil {
-				nullMask += 1 << uint(i)
+				nullMask |= 1 << uint(i)
 				paramTypes[i+i] = fieldTypeNULL
+				paramTypes[i+i+1] = 0x00
 				continue
 			}
 
@@ -877,9 +878,11 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
 			switch v := args[i].(type) {
 			case int64:
 				paramTypes[i+i] = fieldTypeLongLong
+				paramTypes[i+i+1] = 0x00
+
 				if cap(paramValues)-len(paramValues)-8 >= 0 {
 					paramValues = paramValues[:len(paramValues)+8]
-					binary.LittleEndian.PutUint64(paramValues, uint64(v))
+					binary.LittleEndian.PutUint64(paramValues[len(paramValues)-8:], uint64(v))
 				} else {
 					paramValues = append(paramValues,
 						uint64ToBytes(uint64(v))...,
@@ -888,9 +891,11 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
 
 			case float64:
 				paramTypes[i+i] = fieldTypeDouble
+				paramTypes[i+i+1] = 0x00
+
 				if cap(paramValues)-len(paramValues)-8 >= 0 {
 					paramValues = paramValues[:len(paramValues)+8]
-					binary.LittleEndian.PutUint64(paramValues, math.Float64bits(v))
+					binary.LittleEndian.PutUint64(paramValues[len(paramValues)-8:], math.Float64bits(v))
 				} else {
 					paramValues = append(paramValues,
 						uint64ToBytes(math.Float64bits(v))...,
@@ -899,6 +904,8 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
 
 			case bool:
 				paramTypes[i+i] = fieldTypeTiny
+				paramTypes[i+i+1] = 0x00
+
 				if v {
 					paramValues = append(paramValues, 0x01)
 				} else {
@@ -907,6 +914,8 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
 
 			case []byte:
 				paramTypes[i+i] = fieldTypeString
+				paramTypes[i+i+1] = 0x00
+
 				if len(v) < stmt.mc.maxPacketAllowed-pos-len(paramValues)-(len(args)-(i+1))*64 {
 					paramValues = append(paramValues,
 						lengthEncodedIntegerToBytes(uint64(len(v)))...,
@@ -920,6 +929,8 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
 
 			case string:
 				paramTypes[i+i] = fieldTypeString
+				paramTypes[i+i+1] = 0x00
+
 				if len(v) < stmt.mc.maxPacketAllowed-pos-len(paramValues)-(len(args)-(i+1))*64 {
 					paramValues = append(paramValues,
 						lengthEncodedIntegerToBytes(uint64(len(v)))...,
@@ -933,6 +944,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
 
 			case time.Time:
 				paramTypes[i+i] = fieldTypeString
+				paramTypes[i+i+1] = 0x00
 
 				var val []byte
 				if v.IsZero() {