Skip to content

Commit

Permalink
[CONJ-993] SQLDataException reading DATA_TYPE on DatabaseMetaData.get…
Browse files Browse the repository at this point in the history
…TypeInfo() after 3.0.4
  • Loading branch information
rusher committed Jul 25, 2022
1 parent fa8dc79 commit 96fc0a6
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 16 deletions.
8 changes: 5 additions & 3 deletions src/main/java/org/mariadb/jdbc/DatabaseMetaData.java
Expand Up @@ -15,6 +15,7 @@
import org.mariadb.jdbc.client.result.CompleteResult;
import org.mariadb.jdbc.client.result.Result;
import org.mariadb.jdbc.util.VersionFactory;
import org.mariadb.jdbc.util.constants.ColumnFlags;
import org.mariadb.jdbc.util.constants.ServerStatus;

/** Mariadb Database metadata */
Expand Down Expand Up @@ -296,7 +297,8 @@ private ResultSet getImportedKeys(
}
return result;
});
return CompleteResult.createResultSet(columnNames, dataTypes, arr, connection.getContext());
return CompleteResult.createResultSet(
columnNames, dataTypes, arr, connection.getContext(), ColumnFlags.PRIMARY_KEY);
}

/**
Expand Down Expand Up @@ -3227,7 +3229,7 @@ public ResultSet getTypeInfo() {
}
};

return CompleteResult.createResultSet(columnNames, dataTypes, data, connection.getContext());
return CompleteResult.createResultSet(columnNames, dataTypes, data, connection.getContext(), 0);
}

/**
Expand Down Expand Up @@ -3736,7 +3738,7 @@ public ResultSet getClientInfoProperties() {
}
};

return CompleteResult.createResultSet(columnNames, types, data, connection.getContext());
return CompleteResult.createResultSet(columnNames, types, data, connection.getContext(), 0);
}

/**
Expand Down
8 changes: 7 additions & 1 deletion src/main/java/org/mariadb/jdbc/Statement.java
Expand Up @@ -21,6 +21,7 @@
import org.mariadb.jdbc.message.server.ColumnDefinitionPacket;
import org.mariadb.jdbc.message.server.OkPacket;
import org.mariadb.jdbc.util.NativeSql;
import org.mariadb.jdbc.util.constants.ColumnFlags;
import org.mariadb.jdbc.util.constants.ServerStatus;

/** Statement implementation */
Expand Down Expand Up @@ -870,7 +871,12 @@ public ResultSet getGeneratedKeys() throws SQLException {
}
}
String[][] ids = insertIds.toArray(new String[0][]);
return CompleteResult.createResultSet("insert_id", DataType.BIGINT, ids, con.getContext());
return CompleteResult.createResultSet(
"insert_id",
DataType.BIGINT,
ids,
con.getContext(),
ColumnFlags.AUTO_INCREMENT | ColumnFlags.UNSIGNED);
}
}

Expand Down
11 changes: 7 additions & 4 deletions src/main/java/org/mariadb/jdbc/client/result/CompleteResult.java
Expand Up @@ -90,11 +90,13 @@ public CompleteResult(ColumnDefinitionPacket[] metadataList, byte[][] data, Cont
* @param columnType column key type
* @param data values
* @param context connection context
* @param flags column flags
* @return result-set
*/
public static ResultSet createResultSet(
String columnName, DataType columnType, String[][] data, Context context) {
return createResultSet(new String[] {columnName}, new DataType[] {columnType}, data, context);
String columnName, DataType columnType, String[][] data, Context context, int flags) {
return createResultSet(
new String[] {columnName}, new DataType[] {columnType}, data, context, flags);
}

/**
Expand All @@ -107,16 +109,17 @@ public static ResultSet createResultSet(
* is given in its string representation, as in MariaDB text protocol, except boolean (BIT(1))
* values that are represented as "1" or "0" strings
* @param context connection context
* @param flags column flags
* @return resultset
*/
public static ResultSet createResultSet(
String[] columnNames, DataType[] columnTypes, String[][] data, Context context) {
String[] columnNames, DataType[] columnTypes, String[][] data, Context context, int flags) {

int columnNameLength = columnNames.length;
ColumnDefinitionPacket[] columns = new ColumnDefinitionPacket[columnNameLength];

for (int i = 0; i < columnNameLength; i++) {
columns[i] = ColumnDefinitionPacket.create(columnNames[i], columnTypes[i]);
columns[i] = ColumnDefinitionPacket.create(columnNames[i], columnTypes[i], flags);
}

List<byte[]> rows = new ArrayList<>();
Expand Down
Expand Up @@ -40,15 +40,16 @@ public class ColumnDefinitionPacket implements Column, ServerMessage {
* @param length length
* @param dataType server data type
* @param stringPos string information position
* @param flags columns flags
*/
private ColumnDefinitionPacket(
ReadableByteBuf buf, long length, DataType dataType, int[] stringPos) {
ReadableByteBuf buf, long length, DataType dataType, int[] stringPos, int flags) {
this.buf = buf;
this.charset = 33;
this.length = length;
this.dataType = dataType;
this.decimals = (byte) 0;
this.flags = ColumnFlags.AUTO_INCREMENT | ColumnFlags.UNSIGNED;
this.flags = flags;
this.stringPos = stringPos;
this.extTypeName = null;
this.extTypeFormat = null;
Expand Down Expand Up @@ -115,9 +116,10 @@ public ColumnDefinitionPacket(ReadableByteBuf buf, boolean extendedInfo) {
*
* @param name column name
* @param type server type
* @param flags columns flags
* @return column definition
*/
public static ColumnDefinitionPacket create(String name, DataType type) {
public static ColumnDefinitionPacket create(String name, DataType type, int flags) {
byte[] nameBytes = name.getBytes(StandardCharsets.UTF_8);
byte[] arr = new byte[9 + 2 * nameBytes.length];
arr[0] = 3;
Expand Down Expand Up @@ -159,7 +161,7 @@ public static ColumnDefinitionPacket create(String name, DataType type) {
}

return new ColumnDefinitionPacket(
new StandardReadableByteBuf(arr, arr.length), len, type, stringPos);
new StandardReadableByteBuf(arr, arr.length), len, type, stringPos, flags);
}

public String getSchema() {
Expand Down
Expand Up @@ -1462,8 +1462,15 @@ public void testGetSchemas2() throws SQLException {

@Test
public void testGetTypeInfoBasic() throws SQLException {
ResultSet rs = sharedConn.getMetaData().getTypeInfo();
while (rs.next()) {
rs.getInt(2);
}
ResultSetMetaData rmeta = rs.getMetaData();
assertTrue(rmeta.isSigned(1));

testResultSetColumns(
sharedConn.getMetaData().getTypeInfo(),
rs,
"TYPE_NAME String,DATA_TYPE int,PRECISION int,LITERAL_PREFIX String,"
+ "LITERAL_SUFFIX String,CREATE_PARAMS String, NULLABLE short,CASE_SENSITIVE boolean,"
+ "SEARCHABLE short,UNSIGNED_ATTRIBUTE boolean,FIXED_PREC_SCALE boolean, "
Expand Down
Expand Up @@ -85,8 +85,10 @@ public void longGeneratedId(BigInteger expected) throws SQLException {
stmt.execute(
"INSERT INTO bigIntId(val) value ('est')", java.sql.Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
assertTrue(rs.next());

ResultSetMetaData rmeta = rs.getMetaData();
assertFalse(rmeta.isSigned(1));
assertTrue(rs.next());
if (expected.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) >= 1) {
assertThrowsContains(SQLDataException.class, () -> rs.getInt(1), "integer overflow");
} else {
Expand Down
Expand Up @@ -33,7 +33,7 @@ public void metaQuery() throws SQLException {
}
};
ResultSet rs =
CompleteResult.createResultSet(columnNames, columnTypes, data, sharedConn.getContext());
CompleteResult.createResultSet(columnNames, columnTypes, data, sharedConn.getContext(), 0);
assertTrue(rs.next());
assertEquals(data[0][0], rs.getString(1));
assertEquals(data[0][1], rs.getString(2));
Expand Down
4 changes: 3 additions & 1 deletion src/test/java/org/mariadb/jdbc/unit/type/GeometryTest.java
Expand Up @@ -302,7 +302,9 @@ public void testWrongEncoding() throws SQLException {
SQLException.class,
() ->
Geometry.getGeometry(
readBuf, ptBytes.length, ColumnDefinitionPacket.create("test", DataType.GEOMETRY)));
readBuf,
ptBytes.length,
ColumnDefinitionPacket.create("test", DataType.GEOMETRY, 0)));
assertNull(Geometry.getGeometry(new StandardReadableByteBuf(new byte[0], 0), 0, null));
}
}

0 comments on commit 96fc0a6

Please sign in to comment.