in src/main/core-impl/java/com/mysql/cj/protocol/result/AbstractResultsetRow.java [69:209]
private <T> T decodeAndCreateReturnValue(int columnIndex, byte[] bytes, int offset, int length, ValueFactory<T> vf) {
Field f = this.metadata.getFields()[columnIndex];
// First, figure out which decoder method to call basing on the protocol value type from metadata;
// it's the best way to find the appropriate decoder, we can't rely completely on MysqlType here
// because the same MysqlType can be represented by different protocol types and also DatabaseMetaData methods,
// eg. buildResultSet(), could imply unexpected conversions when substitutes RowData in ResultSet;
switch (f.getMysqlTypeId()) {
case MysqlType.FIELD_TYPE_DATETIME:
return this.valueDecoder.decodeDatetime(bytes, offset, length, f.getDecimals(), vf);
case MysqlType.FIELD_TYPE_TIMESTAMP:
return this.valueDecoder.decodeTimestamp(bytes, offset, length, f.getDecimals(), vf);
case MysqlType.FIELD_TYPE_DATE:
return this.valueDecoder.decodeDate(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_TIME:
return this.valueDecoder.decodeTime(bytes, offset, length, f.getDecimals(), vf);
case MysqlType.FIELD_TYPE_TINY:
return f.isUnsigned() ? this.valueDecoder.decodeUInt1(bytes, offset, length, vf) : this.valueDecoder.decodeInt1(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_YEAR:
return this.valueDecoder.decodeYear(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_SHORT:
return f.isUnsigned() ? this.valueDecoder.decodeUInt2(bytes, offset, length, vf) : this.valueDecoder.decodeInt2(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_LONG:
return f.isUnsigned() ? this.valueDecoder.decodeUInt4(bytes, offset, length, vf) : this.valueDecoder.decodeInt4(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_INT24:
return this.valueDecoder.decodeInt4(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_LONGLONG:
return f.isUnsigned() ? this.valueDecoder.decodeUInt8(bytes, offset, length, vf) : this.valueDecoder.decodeInt8(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_FLOAT:
return this.valueDecoder.decodeFloat(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_DOUBLE:
return this.valueDecoder.decodeDouble(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_NEWDECIMAL:
case MysqlType.FIELD_TYPE_DECIMAL:
return this.valueDecoder.decodeDecimal(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_VAR_STRING:
case MysqlType.FIELD_TYPE_VARCHAR:
case MysqlType.FIELD_TYPE_STRING:
case MysqlType.FIELD_TYPE_TINY_BLOB:
case MysqlType.FIELD_TYPE_MEDIUM_BLOB:
case MysqlType.FIELD_TYPE_LONG_BLOB:
case MysqlType.FIELD_TYPE_BLOB:
case MysqlType.FIELD_TYPE_ENUM:
case MysqlType.FIELD_TYPE_GEOMETRY:
case MysqlType.FIELD_TYPE_JSON:
return this.valueDecoder.decodeByteArray(bytes, offset, length, f, vf);
case MysqlType.FIELD_TYPE_SET:
return this.valueDecoder.decodeSet(bytes, offset, length, f, vf);
case MysqlType.FIELD_TYPE_BIT:
return this.valueDecoder.decodeBit(bytes, offset, length, vf);
case MysqlType.FIELD_TYPE_NULL:
return vf.createFromNull();
}
// If the protocol type isn't available then select decoder basing on MysqlType; that's for some internal
// code that creates rows without MySQL protocol types, only MysqlType types, including PS bindings as RS, DBMD
switch (f.getMysqlType()) {
case TINYINT:
return this.valueDecoder.decodeInt1(bytes, offset, length, vf);
case TINYINT_UNSIGNED:
return this.valueDecoder.decodeUInt1(bytes, offset, length, vf);
case SMALLINT:
return this.valueDecoder.decodeInt2(bytes, offset, length, vf);
case YEAR:
return this.valueDecoder.decodeYear(bytes, offset, length, vf);
case SMALLINT_UNSIGNED:
return this.valueDecoder.decodeUInt2(bytes, offset, length, vf);
case INT:
case MEDIUMINT:
return this.valueDecoder.decodeInt4(bytes, offset, length, vf);
case INT_UNSIGNED:
case MEDIUMINT_UNSIGNED:
return this.valueDecoder.decodeUInt4(bytes, offset, length, vf);
case BIGINT:
return this.valueDecoder.decodeInt8(bytes, offset, length, vf);
case BIGINT_UNSIGNED:
return this.valueDecoder.decodeUInt8(bytes, offset, length, vf);
case FLOAT:
case FLOAT_UNSIGNED:
return this.valueDecoder.decodeFloat(bytes, offset, length, vf);
case DOUBLE:
case DOUBLE_UNSIGNED:
return this.valueDecoder.decodeDouble(bytes, offset, length, vf);
case DECIMAL:
case DECIMAL_UNSIGNED:
return this.valueDecoder.decodeDecimal(bytes, offset, length, vf);
case BOOLEAN:
case VARBINARY:
case VARCHAR:
case BINARY:
case CHAR:
case TINYBLOB:
case BLOB:
case MEDIUMBLOB:
case LONGBLOB:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
case JSON:
case ENUM:
case SET:
case GEOMETRY:
case UNKNOWN:
return this.valueDecoder.decodeByteArray(bytes, offset, length, f, vf);
case BIT:
return this.valueDecoder.decodeBit(bytes, offset, length, vf);
case DATETIME:
case TIMESTAMP:
return this.valueDecoder.decodeTimestamp(bytes, offset, length, f.getDecimals(), vf);
case DATE:
return this.valueDecoder.decodeDate(bytes, offset, length, vf);
case TIME:
return this.valueDecoder.decodeTime(bytes, offset, length, f.getDecimals(), vf);
case NULL:
return vf.createFromNull();
}
throw new DataReadException(Messages.getString("ResultSet.UnknownSourceType"));
}