Skip to content

Commit

Permalink
Merge branch 'release/2.6.2'
Browse files Browse the repository at this point in the history
  • Loading branch information
rusher committed Jul 22, 2020
2 parents d60ea32 + 6de6b5d commit 1bcf2b1
Show file tree
Hide file tree
Showing 16 changed files with 116 additions and 176 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
@@ -1,5 +1,13 @@
# Change Log

## [2.6.2](https://github.com/mariadb-corporation/mariadb-connector-j/tree/2.6.2) (23 Jul. 2020)
[Full Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/compare/2.6.1...2.6.2)

* CONJ-804 - Automatic charset correction
* CONJ-809 - SelectResultSet's (ResultSet)MetaData always indicates all columns to be readonly
* CONJ-802 - Version parsing depending on Classloader might result in connection Exception


## [2.6.1](https://github.com/mariadb-corporation/mariadb-connector-j/tree/2.6.1) (23 Jun. 2020)
[Full Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/compare/2.6.0...2.6.1)

Expand Down
4 changes: 2 additions & 2 deletions README.md
Expand Up @@ -28,7 +28,7 @@ or maven :
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.6.1</version>
<version>2.6.2</version>
</dependency>
```

Expand All @@ -46,7 +46,7 @@ Development snapshot are available on sonatype nexus repository
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.6.2-SNAPSHOT</version>
<version>2.6.3-SNAPSHOT</version>
</dependency>
</dependencies>
```
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -60,7 +60,7 @@
<artifactId>mariadb-java-client</artifactId>
<packaging>jar</packaging>
<name>mariadb-java-client</name>
<version>2.6.1</version>
<version>2.6.2</version>
<description>JDBC driver for MariaDB and MySQL</description>
<url>https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/</url>

Expand Down
19 changes: 7 additions & 12 deletions src/main/java/org/mariadb/jdbc/MariaDbResultSetMetaData.java
Expand Up @@ -36,25 +36,19 @@ public class MariaDbResultSetMetaData implements ResultSetMetaData {
private final ColumnDefinition[] fieldPackets;
private final Options options;
private final boolean forceAlias;
private final boolean updatable;

/**
* Constructor.
*
* @param fieldPackets column informations
* @param options connection options
* @param forceAlias force table and column name alias as original data
* @param updatable is column updatable
*/
public MariaDbResultSetMetaData(
final ColumnDefinition[] fieldPackets,
final Options options,
final boolean forceAlias,
final boolean updatable) {
final ColumnDefinition[] fieldPackets, final Options options, final boolean forceAlias) {
this.fieldPackets = fieldPackets;
this.options = options;
this.forceAlias = forceAlias;
this.updatable = updatable;
}

/**
Expand Down Expand Up @@ -312,10 +306,9 @@ public String getColumnTypeName(final int column) throws SQLException {
* @throws SQLException if a database access error occurs or in case of wrong index
*/
public boolean isReadOnly(final int column) throws SQLException {
if (column >= 1 && column <= fieldPackets.length) {
return !updatable;
}
throw ExceptionFactory.INSTANCE.create(String.format("no column with index %s", column));
ColumnDefinition ci = getColumnInformation(column);
return (ci.getOriginalTable() == null || ci.getOriginalTable().isEmpty())
&& (ci.getOriginalName() == null || ci.getOriginalName().isEmpty());
}

/**
Expand Down Expand Up @@ -362,7 +355,9 @@ private ColumnDefinition getColumnInformation(int column) throws SQLException {
if (column >= 1 && column <= fieldPackets.length) {
return fieldPackets[column - 1];
}
throw ExceptionFactory.INSTANCE.create("No such column");
throw ExceptionFactory.INSTANCE.create(
String.format(
"wrong column index %s. must be in [1, %s] range", column, fieldPackets.length));
}

/**
Expand Down
Expand Up @@ -118,7 +118,7 @@ private void setMetaFromResult() {
parameterCount = serverPrepareResult.getParameters().length;
metadata =
new MariaDbResultSetMetaData(
serverPrepareResult.getColumns(), protocol.getUrlParser().getOptions(), false, false);
serverPrepareResult.getColumns(), protocol.getUrlParser().getOptions(), false);
parameterMetaData = new MariaDbParameterMetaData(serverPrepareResult.getParameters());
}

Expand Down
Expand Up @@ -131,7 +131,15 @@ public int getIndex(String name) throws SQLException {
res = originalMap.get(lowerName);

if (res == null) {
throw ExceptionFactory.INSTANCE.create("No such column: " + name, "42S22", 1054);
Map<String, Integer> possible = new HashMap<>();
possible.putAll(aliasMap);
possible.putAll(originalMap);
throw ExceptionFactory.INSTANCE.create(
String.format(
"No such column: '%s'. '%s' must be in %s",
name, lowerName, possible.keySet().toString()),
"42S22",
1054);
}
return res;
}
Expand Down
Expand Up @@ -1150,7 +1150,7 @@ public String getCursorName() throws SQLException {

/** {inheritDoc}. */
public ResultSetMetaData getMetaData() {
return new MariaDbResultSetMetaData(columnsInformation, options, forceAlias, false);
return new MariaDbResultSetMetaData(columnsInformation, options, forceAlias);
}

/** {inheritDoc}. */
Expand Down
Expand Up @@ -273,11 +273,6 @@ private void checkIfUpdatable(Results results) throws SQLException {
}
}

@Override
public ResultSetMetaData getMetaData() {
return new MariaDbResultSetMetaData(columnsInformation, options, false, canBeUpdate);
}

private UpdatableColumnDefinition[] getUpdatableColumns() {
return (UpdatableColumnDefinition[]) columnsInformation;
}
Expand Down
Expand Up @@ -1219,7 +1219,7 @@ private byte decideLanguage(int serverLanguage) {

if (serverLanguage >= 192 && serverLanguage <= 215) {
// equivalent utf8mb4 collation
return (byte) (serverLanguage - 32);
return (byte) (serverLanguage + 32);
}

return (byte) 224; // UTF8MB4_UNICODE_CI;
Expand Down
Expand Up @@ -65,23 +65,24 @@ public final class Version {

static {
InputStream inputStream = null;
String tmpVersion = "5.5.0";
String tmpVersion = "2.6.2";
try {
Properties prop = new Properties();
inputStream = Version.class.getClassLoader().getResourceAsStream("mariadb.properties");
inputStream = Version.class.getResourceAsStream("/mariadb.properties");
if (inputStream != null) {
prop.load(inputStream);
// get the property value and print it out
tmpVersion = prop.getProperty("version");
} else {
System.out.println("property file 'mariadb.properties' not found in the classpath");
}

// get the property value and print it out
tmpVersion = prop.getProperty("version");
} catch (Exception e) {
// eat
} finally {
try {
inputStream.close();
if (inputStream != null) {
inputStream.close();
}
} catch (IOException ioe) {
// eat
}
Expand Down
19 changes: 0 additions & 19 deletions src/main/resources/mariadb.properties
@@ -1,20 +1 @@
#
# MariaDB Client for Java
#
# Copyright (c) 2012-2014 Monty Program Ab.
# Copyright (c) 2015-2020 MariaDB Corporation Ab.
#
# This library is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
#
# This library is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
# for more details.
#
# You should have received a copy of the GNU Lesser General Public License along
# with this library; if not, write to Monty Program Ab info@montyprogram.com.
#
version=${project.version}
21 changes: 21 additions & 0 deletions src/test/java/org/mariadb/jdbc/ConnectionTest.java
Expand Up @@ -1006,4 +1006,25 @@ public void readOnly() throws SQLException {
connection.setReadOnly(false);
stmt.execute("DROP TABLE testReadOnly");
}

@Test
public void connectionAttributes() throws SQLException {

try (MariaDbConnection conn =
(MariaDbConnection) setConnection("&connectionAttributes=test:test1")) {
Statement stmt = conn.createStatement();
ResultSet rs1 = stmt.executeQuery("SELECT @@performance_schema");
rs1.next();
if ("1".equals(rs1.getString(1))) {
ResultSet rs =
stmt.executeQuery(
"SELECT * from performance_schema.session_connect_attrs where processlist_id="
+ conn.getServerThreadId()
+ " AND ATTR_NAME='test'");
while (rs.next()) {
assertEquals("test1", rs.getString("ATTR_VALUE"));
}
}
}
}
}
41 changes: 23 additions & 18 deletions src/test/java/org/mariadb/jdbc/ResultSetMetaDataTest.java
Expand Up @@ -70,41 +70,46 @@ public void metaDataTest() throws SQLException {
assertEquals("unikey_col", rsmd.getColumnName(3));
assertEquals(Types.CHAR, rsmd.getColumnType(4));
assertEquals(Types.SMALLINT, rsmd.getColumnType(5));
assertTrue(rsmd.isReadOnly(1));
assertTrue(rsmd.isReadOnly(2));
assertTrue(rsmd.isReadOnly(3));
assertTrue(rsmd.isReadOnly(4));
assertTrue(rsmd.isReadOnly(5));
assertFalse(rsmd.isWritable(1));
assertFalse(rsmd.isWritable(2));
assertFalse(rsmd.isWritable(3));
assertFalse(rsmd.isWritable(4));
assertFalse(rsmd.isWritable(5));
assertFalse(rsmd.isDefinitelyWritable(1));
assertFalse(rsmd.isDefinitelyWritable(2));
assertFalse(rsmd.isDefinitelyWritable(3));
assertFalse(rsmd.isDefinitelyWritable(4));
assertFalse(rsmd.isDefinitelyWritable(5));
assertFalse(rsmd.isReadOnly(1));
assertFalse(rsmd.isReadOnly(2));
assertFalse(rsmd.isReadOnly(3));
assertFalse(rsmd.isReadOnly(4));
assertFalse(rsmd.isReadOnly(5));
assertTrue(rsmd.isWritable(1));
assertTrue(rsmd.isWritable(2));
assertTrue(rsmd.isWritable(3));
assertTrue(rsmd.isWritable(4));
assertTrue(rsmd.isWritable(5));
assertTrue(rsmd.isDefinitelyWritable(1));
assertTrue(rsmd.isDefinitelyWritable(2));
assertTrue(rsmd.isDefinitelyWritable(3));
assertTrue(rsmd.isDefinitelyWritable(4));
assertTrue(rsmd.isDefinitelyWritable(5));

try {
rsmd.isReadOnly(6);
fail("must have throw exception");
} catch (SQLException sqle) {
assertTrue(sqle.getMessage().contains("no column with index 6"));
assertTrue(sqle.getMessage().contains("wrong column index 6. must be in [1, 5] range"));
}
try {
rsmd.isWritable(6);
fail("must have throw exception");
} catch (SQLException sqle) {
assertTrue(sqle.getMessage().contains("no column with index 6"));
assertTrue(sqle.getMessage().contains("wrong column index 6. must be in [1, 5] range"));
}
try {
rsmd.isDefinitelyWritable(6);
fail("must have throw exception");
} catch (SQLException sqle) {
assertTrue(sqle.getMessage().contains("no column with index 6"));
assertTrue(sqle.getMessage().contains("wrong column index 6. must be in [1, 5] range"));
}

rs = stmt.executeQuery("select count(char_col) from test_rsmd");
assertTrue(rs.next());
rsmd = rs.getMetaData();
assertTrue(rsmd.isReadOnly(1));

DatabaseMetaData md = sharedConnection.getMetaData();
ResultSet cols = md.getColumns(null, null, "test\\_rsmd", null);
cols.next();
Expand Down
34 changes: 23 additions & 11 deletions src/test/java/org/mariadb/jdbc/ResultSetTest.java
Expand Up @@ -1196,19 +1196,31 @@ public void checkInvisibleMetaData() throws SQLException {

@Test
public void columnNamesMappingError() throws SQLException {
createTable("columnNamesMappingError", "xx tinyint(1)");
createTable(
"columnNamesMappingError", "xX INT NOT NULL AUTO_INCREMENT, " + " PRIMARY KEY(xX)");

Statement stmt = sharedConnection.createStatement();
stmt.executeUpdate("INSERT INTO columnNamesMappingError VALUES (4)");
ResultSet rs = stmt.executeQuery("SELECT * FROM columnNamesMappingError");
assertTrue(rs.next());
assertEquals(4, rs.getInt("xx"));
try {
rs.getInt("wrong_column_name");
fail("must have fail, column 'wrong_column_name' does not exists");
} catch (SQLException e) {
assertEquals("42S22", e.getSQLState());
assertEquals(1054, e.getErrorCode());
assertEquals("No such column: wrong_column_name", e.getMessage());
try (PreparedStatement preparedStatement =
sharedConnection.prepareStatement(
"SELECT * FROM " + "columnNamesMappingError",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE)) {
ResultSet rs = preparedStatement.executeQuery();
assertTrue(rs.next());
assertEquals(4, rs.getInt("xx"));
try {
rs.getInt("wrong_column_name");
fail("must have fail, column 'wrong_column_name' does not exists");
} catch (SQLException e) {
assertEquals("42S22", e.getSQLState());
assertEquals(1054, e.getErrorCode());
assertTrue(
e.getMessage()
.contains(
"No such column: 'wrong_column_name'. 'wrong_column_name' must be in "
+ "[xx, columnnamesmappingerror.xx]"));
}
}
}

Expand Down

0 comments on commit 1bcf2b1

Please sign in to comment.