Skip to content

Commit

Permalink
Merge pull request #2625 from funnyAnt/issue#2622
Browse files Browse the repository at this point in the history
#2622 解决prepare因不支持mysql unsigned 类型导致的超出short范围报错
  • Loading branch information
junwen12221 committed Nov 1, 2020
2 parents 42075e4 + 6435fac commit 16f958a
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 3 deletions.
12 changes: 10 additions & 2 deletions src/main/java/io/mycat/net/mysql/BinaryRowDataPacket.java
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,13 @@ private void convert(byte[] fv, FieldPacket fieldPk) {

// Example
// 01 00 -- int16 = 1
short shortVar = ByteUtil.getShort(fv);
this.fieldValues.add(ByteUtil.getBytes(shortVar));
if (isUnsignedField(fieldPk)) {
this.fieldValues.add(ByteUtil.convertUnsignedShort2Binary(fv));
} else {
short shortVar = ByteUtil.getShort(fv);
this.fieldValues.add(ByteUtil.getBytes(shortVar));
}

break;
case Fields.FIELD_TYPE_TINY:
// Fields
Expand Down Expand Up @@ -247,6 +252,9 @@ private void convert(byte[] fv, FieldPacket fieldPk) {

}

private boolean isUnsignedField(FieldPacket field) {
return (field.flags & FieldPacket.UNSIGNED_FLAG) > 0;
}
public void write(FrontendConnection conn) {

int size = calcPacketSize();
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/io/mycat/net/mysql/FieldPacket.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@
* @author mycat
*/
public class FieldPacket extends MySQLPacket {
public static final int UNSIGNED_FLAG = 0x0020;

private static final byte[] DEFAULT_CATALOG = "def".getBytes();
private static final byte[] FILLER = new byte[2];

Expand Down
14 changes: 13 additions & 1 deletion src/main/java/io/mycat/util/ByteUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,19 @@ public static byte[] getBytes(Date date, boolean isTime) {
return getBytesFromDate(date);
}
}


/**
* short从ASCII类型的值转换成数学二进制值。java里面不存在unsigned short,因此转换mysql unsiged值时需要用到java int.
* @param bytes mysql里面的unsigned short字段,采用ASCII类型表达的值
* @return 数学二进制值
*/
public static byte[] convertUnsignedShort2Binary(byte[] bytes) {
int value = Integer.parseInt(new String(bytes));
byte[] binaryBytes = new byte[2];
binaryBytes[0] = (byte) (value & 0xff);
binaryBytes[1] = (byte) ((value & 0xff00) >> 8);
return binaryBytes;
}
private static byte[] getBytesFromTime(Date date) {
int day = 0;
int hour = DateUtil.getHour(date);
Expand Down

0 comments on commit 16f958a

Please sign in to comment.