Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[CONJ-847] NPE at UpdatableResultSet#close
  • Loading branch information
rusher committed Jan 6, 2021
1 parent 450c5fc commit 9edc3b8
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 91 deletions.
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.7.1</version>
<version>2.7.2-SNAPSHOT</version>
<description>JDBC driver for MariaDB and MySQL</description>
<url>https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/</url>

Expand Down
Expand Up @@ -1470,7 +1470,7 @@ public boolean previous() throws SQLException {
}

public void close() throws SQLException {
refreshPreparedStatement.close();
if (refreshPreparedStatement != null) refreshPreparedStatement.close();
super.close();
}
}
183 changes: 94 additions & 89 deletions src/test/java/org/mariadb/jdbc/UpdateResultSetTest.java
Expand Up @@ -392,18 +392,19 @@ public void testUpdateWhenFetch() throws Exception {
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE)) {
preparedStatement.setFetchSize(2);
ResultSet rs = preparedStatement.executeQuery();
try (ResultSet rs = preparedStatement.executeQuery()) {

rs.moveToInsertRow();
rs.updateInt(1, -1);
rs.updateString(2, "0-1");
rs.updateString(3, "0-2");
rs.insertRow();
rs.moveToInsertRow();
rs.updateInt(1, -1);
rs.updateString(2, "0-1");
rs.updateString(3, "0-2");
rs.insertRow();

rs.next();
rs.next();
rs.updateString(2, utf8escapeQuote);
rs.updateRow();
rs.next();
rs.next();
rs.updateString(2, utf8escapeQuote);
rs.updateRow();
}
}

ResultSet rs = stmt.executeQuery("SELECT id, t1, t2 FROM testUpdateWhenFetch");
Expand Down Expand Up @@ -442,41 +443,42 @@ public void testPrimaryGenerated() throws Exception {
"SELECT t1, t2, id FROM PrimaryGenerated",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE)) {
ResultSet rs = preparedStatement.executeQuery();
assertFalse(rs.next());
try (ResultSet rs = preparedStatement.executeQuery()) {
assertFalse(rs.next());

rs.moveToInsertRow();
rs.updateString(1, "1-1");
rs.updateString(2, "1-2");
rs.insertRow();

rs.moveToInsertRow();
rs.updateString(1, "2-1");
rs.insertRow();
rs.moveToInsertRow();
rs.updateString(1, "1-1");
rs.updateString(2, "1-2");
rs.insertRow();

rs.moveToInsertRow();
rs.updateString(2, "3-2");
try {
rs.moveToInsertRow();
rs.updateString(1, "2-1");
rs.insertRow();
fail("must not occur since t1 cannot be null");
} catch (SQLException sqle) {
assertTrue(
sqle.getMessage(),
sqle.getMessage().contains("Field 't1' doesn't have a default value")
|| sqle.getMessage().contains("Column 't1' cannot be null"));
}

rs.absolute(1);
assertEquals("1-1", rs.getString(1));
assertEquals("1-2", rs.getString(2));
assertEquals(autoInc[0] + autoInc[1], rs.getInt(3));
rs.moveToInsertRow();
rs.updateString(2, "3-2");
try {
rs.insertRow();
fail("must not occur since t1 cannot be null");
} catch (SQLException sqle) {
assertTrue(
sqle.getMessage(),
sqle.getMessage().contains("Field 't1' doesn't have a default value")
|| sqle.getMessage().contains("Column 't1' cannot be null"));
}

assertTrue(rs.next());
assertEquals("2-1", rs.getString(1));
assertEquals("default-value", rs.getString(2));
assertEquals(2 * autoInc[0] + autoInc[1], rs.getInt(3));
rs.absolute(1);
assertEquals("1-1", rs.getString(1));
assertEquals("1-2", rs.getString(2));
assertEquals(autoInc[0] + autoInc[1], rs.getInt(3));

assertFalse(rs.next());
assertTrue(rs.next());
assertEquals("2-1", rs.getString(1));
assertEquals("default-value", rs.getString(2));
assertEquals(2 * autoInc[0] + autoInc[1], rs.getInt(3));

assertFalse(rs.next());
}
}

ResultSet rs = stmt.executeQuery("SELECT id, t1, t2 FROM PrimaryGenerated");
Expand All @@ -501,25 +503,26 @@ public void testPrimaryGeneratedDefault() throws Exception {
"SELECT id, t1, t2 FROM testPrimaryGeneratedDefault",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE)) {
ResultSet rs = preparedStatement.executeQuery();
assertFalse(rs.next());
rs.moveToInsertRow();
rs.insertRow();
try (ResultSet rs = preparedStatement.executeQuery()) {
assertFalse(rs.next());
rs.moveToInsertRow();
rs.insertRow();

rs.moveToInsertRow();
rs.insertRow();
rs.beforeFirst();
rs.moveToInsertRow();
rs.insertRow();
rs.beforeFirst();

assertTrue(rs.next());
assertEquals(autoInc[1] + autoInc[0], rs.getInt(1));
assertEquals("default-value1", rs.getString(2));
assertNotNull(rs.getDate(3));
assertTrue(rs.next());
assertEquals(autoInc[1] + autoInc[0], rs.getInt(1));
assertEquals("default-value1", rs.getString(2));
assertNotNull(rs.getDate(3));

assertTrue(rs.next());
assertEquals(2 * autoInc[0] + autoInc[1], rs.getInt(1));
assertEquals("default-value1", rs.getString(2));
assertNotNull(rs.getDate(3));
assertFalse(rs.next());
assertTrue(rs.next());
assertEquals(2 * autoInc[0] + autoInc[1], rs.getInt(1));
assertEquals("default-value1", rs.getString(2));
assertNotNull(rs.getDate(3));
assertFalse(rs.next());
}
}

Statement stmt = sharedConnection.createStatement();
Expand All @@ -546,25 +549,26 @@ public void testDelete() throws Exception {
try (PreparedStatement preparedStatement =
sharedConnection.prepareStatement(
"SELECT * FROM testDelete", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)) {
ResultSet rs = preparedStatement.executeQuery();
try {
try (ResultSet rs = preparedStatement.executeQuery()) {
try {
rs.deleteRow();
fail();
} catch (SQLException sqle) {
assertTrue(
sqle.getMessage(),
sqle.getMessage().contains("Current position is before the first row"));
}

assertTrue(rs.next());
assertTrue(rs.next());
assertEquals(2, rs.getInt(1));
rs.deleteRow();
fail();
} catch (SQLException sqle) {
assertTrue(
sqle.getMessage(),
sqle.getMessage().contains("Current position is before the first row"));
assertEquals(1, rs.getInt(1));
assertEquals(-1, rs.getInt(2));
assertTrue(rs.next());
assertEquals(3, rs.getInt(1));
assertEquals(-3, rs.getInt(2));
}

assertTrue(rs.next());
assertTrue(rs.next());
assertEquals(2, rs.getInt(1));
rs.deleteRow();
assertEquals(1, rs.getInt(1));
assertEquals(-1, rs.getInt(2));
assertTrue(rs.next());
assertEquals(3, rs.getInt(1));
assertEquals(-3, rs.getInt(2));
}

ResultSet rs = stmt.executeQuery("SELECT * FROM testDelete");
Expand Down Expand Up @@ -598,18 +602,18 @@ public void testUpdateChangingMultiplePrimaryKey() throws Exception {
"SELECT * FROM testUpdateChangingMultiplePrimaryKey",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE)) {
ResultSet rs = preparedStatement.executeQuery();

assertTrue(rs.next());
assertTrue(rs.next());
rs.updateInt(1, 4);
rs.updateInt(2, -4);
rs.updateString(3, "4");
rs.updateRow();
try (ResultSet rs = preparedStatement.executeQuery()) {
assertTrue(rs.next());
assertTrue(rs.next());
rs.updateInt(1, 4);
rs.updateInt(2, -4);
rs.updateString(3, "4");
rs.updateRow();

assertEquals(4, rs.getInt(1));
assertEquals(-4, rs.getInt(2));
assertEquals("4", rs.getString(3));
assertEquals(4, rs.getInt(1));
assertEquals(-4, rs.getInt(2));
assertEquals("4", rs.getString(3));
}
}

ResultSet rs = stmt.executeQuery("SELECT * FROM testUpdateChangingMultiplePrimaryKey");
Expand Down Expand Up @@ -648,14 +652,15 @@ public void updateBlob() throws SQLException, IOException {
try (PreparedStatement preparedStatement =
sharedConnection.prepareStatement(
"select * from updateBlob", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)) {
ResultSet rs = preparedStatement.executeQuery();
assertTrue(rs.next());
InputStream updatedStream = new ByteArrayInputStream(updatedBlob);
try (ResultSet rs = preparedStatement.executeQuery()) {
assertTrue(rs.next());
InputStream updatedStream = new ByteArrayInputStream(updatedBlob);

rs.updateBlob(2, updatedStream);
rs.updateRow();
rs.updateBlob(2, updatedStream);
rs.updateRow();

checkResult(rs, updatedBlob);
checkResult(rs, updatedBlob);
}
}

try (PreparedStatement preparedStatement =
Expand Down

0 comments on commit 9edc3b8

Please sign in to comment.