blob: e530f62a04154585650cf05195901444d73a6922 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.internal.runner.app.jdbc;
import java.io.InputStream;
import java.io.Reader;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.NClob;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.GregorianCalendar;
import org.apache.ignite.internal.tostring.S;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Result set test.
*/
public class ITJdbcResultSetSelfTest extends AbstractJdbcSelfTest {
/** SQL query. */
private static final String SQL =
"SELECT 1::INTEGER as id, true as boolVal, 1::TINYINT as byteVal, 1::SMALLINT as shortVal, 1::INTEGER as intVal, 1::BIGINT as longVal, 1.0::FLOAT as floatVal, 1.0::DOUBLE as doubleVal, 1.0::DECIMAL as bigVal, " +
"'1' as strVal, '1', '1901-02-01'::DATE as dateVal, '01:01:01'::TIME as timeVal, 1::TIMESTAMP as tsVal;";
/** Statement. */
private Statement stmt;
/**
* Create the connection ant statement.
*
* @throws Exception if failed.
*/
@BeforeEach
public void beforeTest() throws Exception {
Connection conn = DriverManager.getConnection(URL);
stmt = conn.createStatement();
assertNotNull(stmt);
assertFalse(stmt.isClosed());
}
/**
* Close the connection and statement.
*
* @throws Exception if failed.
*/
@AfterEach
public void afterTest() throws Exception {
if (stmt != null) {
stmt.getConnection().close();
stmt.close();
assertTrue(stmt.isClosed());
}
}
/**
* @throws Exception If failed.
*/
@Test
public void testBoolean() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertTrue(rs.getBoolean("boolVal"));
assertTrue(rs.getBoolean(2));
assertEquals(1, rs.getByte(2));
assertEquals(1, rs.getInt(2));
assertEquals(1, rs.getShort(2));
assertEquals(1, rs.getLong(2));
assertEquals(1.0, rs.getDouble(2));
assertEquals(1.0f, rs.getFloat(2));
assertEquals(new BigDecimal(1), rs.getBigDecimal(2));
assertEquals(rs.getString(2), "true");
assertTrue(rs.getObject(2, Boolean.class));
assertEquals((byte)1, rs.getObject(2, Byte.class));
assertEquals((short)1, rs.getObject(2, Short.class));
assertEquals( 1, rs.getObject(2, Integer.class));
assertEquals( 1, rs.getObject(2, Long.class));
assertEquals( 1.0f, rs.getObject(2, Float.class));
assertEquals( 1.0, rs.getObject(2, Double.class));
assertEquals(new BigDecimal(1), rs.getObject(2, BigDecimal.class));
assertEquals("true", rs.getObject(2, String.class));
}
cnt++;
}
assertEquals(1, cnt);
ResultSet rs0 = stmt.executeQuery("select 1");
assertTrue(rs0.next());
assertTrue(rs0.getBoolean(1));
rs0 = stmt.executeQuery("select 0");
assertTrue(rs0.next());
assertFalse(rs0.getBoolean(1));
rs0 = stmt.executeQuery("select '1'");
assertTrue(rs0.next());
assertTrue(rs0.getBoolean(1));
rs0 = stmt.executeQuery("select '0'");
assertTrue(rs0.next());
assertFalse(rs0.getBoolean(1));
assertThrows(SQLException.class, () -> {
ResultSet badRs = stmt.executeQuery("select ''");
assertTrue(badRs.next());
assertTrue(badRs.getBoolean(1));
}, "Cannot convert to boolean: ");
assertThrows(SQLException.class, () -> {
ResultSet badRs = stmt.executeQuery("select 'qwe'");
assertTrue(badRs.next());
assertTrue(badRs.getBoolean(1));
}, "Cannot convert to boolean: qwe");
}
/**
* @throws Exception If failed.
*/
@Test
public void testByte() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertEquals(1, rs.getByte("byteVal"));
assertTrue(rs.getBoolean(3));
assertEquals(1, rs.getByte(3));
assertEquals(1, rs.getInt(3));
assertEquals(1, rs.getShort(3));
assertEquals(1, rs.getLong(3));
assertEquals(1.0, rs.getDouble(3));
assertEquals(1.0f, rs.getFloat(3));
assertEquals(new BigDecimal(1), rs.getBigDecimal(3));
assertEquals(rs.getString(3), "1");
assertTrue(rs.getObject(3, Boolean.class));
assertEquals((byte)1, rs.getObject(3, Byte.class));
assertEquals((short)1, rs.getObject(3, Short.class));
assertEquals(1, rs.getObject(3, Integer.class));
assertEquals(1, rs.getObject(3, Long.class));
assertEquals(1.f, rs.getObject(3, Float.class));
assertEquals(1, rs.getObject(3, Double.class));
assertEquals(new BigDecimal(1), rs.getObject(3, BigDecimal.class));
assertArrayEquals(new byte[] {1}, rs.getBytes(3));
assertEquals(rs.getObject(3, String.class), "1");
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* @throws Exception If failed.
*/
@Test
public void testShort() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertEquals(1, rs.getShort("shortVal"));
assertTrue(rs.getBoolean(4));
assertEquals(1, rs.getByte(4));
assertEquals(1, rs.getShort(4));
assertEquals(1, rs.getInt(4));
assertEquals(1, rs.getLong(4));
assertEquals(1.0, rs.getDouble(4));
assertEquals(1.0f, rs.getFloat(4));
assertEquals(new BigDecimal(1), rs.getBigDecimal(4));
assertEquals(rs.getString(4), "1");
assertTrue(rs.getObject(4, Boolean.class));
assertEquals((byte)1, rs.getObject(4, Byte.class));
assertEquals((short)1, rs.getObject(4, Short.class));
assertEquals(1, rs.getObject(4, Integer.class));
assertEquals(1, rs.getObject(4, Long.class));
assertEquals(1.f, rs.getObject(4, Float.class));
assertEquals(1, rs.getObject(4, Double.class));
assertEquals(new BigDecimal(1), rs.getObject(4, BigDecimal.class));
assertArrayEquals(new byte[] {0, 1}, rs.getBytes(4));
assertEquals(rs.getObject(4, String.class), "1");
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* @throws Exception If failed.
*/
@Test
public void testInteger() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertEquals(1, rs.getInt("intVal"));
assertTrue(rs.getBoolean(5));
assertEquals(1, rs.getByte(5));
assertEquals(1, rs.getShort(5));
assertEquals(1, rs.getInt(5));
assertEquals(1, rs.getLong(5));
assertEquals(1.0, rs.getDouble(5));
assertEquals(1.0f, rs.getFloat(5));
assertEquals(new BigDecimal(1), rs.getBigDecimal(5));
assertEquals(rs.getString(5), "1");
assertTrue(rs.getObject(5, Boolean.class));
assertEquals((byte)1, rs.getObject(5, Byte.class));
assertEquals((short)1, rs.getObject(5, Short.class));
assertEquals(1, rs.getObject(5, Integer.class));
assertEquals(1, rs.getObject(5, Long.class));
assertEquals(1.f, rs.getObject(5, Float.class));
assertEquals(1, rs.getObject(5, Double.class));
assertEquals(new BigDecimal(1), rs.getObject(5, BigDecimal.class));
assertArrayEquals(new byte[] {0, 0, 0, 1}, rs.getBytes(5));
assertEquals(rs.getObject(5, String.class), "1");
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* @throws Exception If failed.
*/
@Test
public void testLong() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertEquals(1, rs.getLong("longVal"));
assertTrue(rs.getBoolean(6));
assertEquals(1, rs.getByte(6));
assertEquals(1, rs.getShort(6));
assertEquals(1, rs.getInt(6));
assertEquals(1, rs.getLong(6));
assertEquals(1.0, rs.getDouble(6));
assertEquals(1.0f, rs.getFloat(6));
assertEquals(new BigDecimal(1), rs.getBigDecimal(6));
assertEquals(rs.getString(6), "1");
assertTrue(rs.getObject(6, Boolean.class));
assertEquals((byte)1, rs.getObject(6, Byte.class));
assertEquals((short)1, rs.getObject(6, Short.class));
assertEquals(1, rs.getObject(6, Integer.class));
assertEquals(1, rs.getObject(6, Long.class));
assertEquals(1.f, rs.getObject(6, Float.class));
assertEquals(1, rs.getObject(6, Double.class));
assertEquals(new BigDecimal(1), rs.getObject(6, BigDecimal.class));
assertArrayEquals(new byte[] {0, 0, 0, 0, 0, 0, 0, 1}, rs.getBytes(6));
assertEquals(rs.getObject(6, String.class), "1");
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* @throws Exception If failed.
*/
@Test
public void testFloat() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertEquals(1.0, rs.getFloat("floatVal"));
assertTrue(rs.getBoolean(7));
assertEquals(1, rs.getByte(7));
assertEquals(1, rs.getShort(7));
assertEquals(1, rs.getInt(7));
assertEquals(1, rs.getLong(7));
assertEquals(1.0, rs.getDouble(7));
assertEquals(1.0f, rs.getFloat(7));
assertEquals(new BigDecimal(1), rs.getBigDecimal(7));
assertEquals(rs.getString(7), "1.0");
assertTrue(rs.getObject(7, Boolean.class));
assertEquals((byte)1, rs.getObject(7, Byte.class));
assertEquals((short)1, rs.getObject(7, Short.class));
assertEquals(1, rs.getObject(7, Integer.class));
assertEquals(1, rs.getObject(7, Long.class));
assertEquals(1.f, rs.getObject(7, Float.class));
assertEquals(1, rs.getObject(7, Double.class));
assertEquals(new BigDecimal(1), rs.getObject(7, BigDecimal.class));
assertArrayEquals(new byte[] {63, -128, 0, 0}, rs.getBytes(7));
assertEquals(rs.getObject(7, String.class), "1.0");
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* @throws Exception If failed.
*/
@Test
public void testDouble() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertEquals(1.0, rs.getDouble("doubleVal"));
assertTrue(rs.getBoolean(8));
assertEquals(1, rs.getByte(8));
assertEquals(1, rs.getShort(8));
assertEquals(1, rs.getInt(8));
assertEquals(1, rs.getLong(8));
assertEquals(1.0, rs.getDouble(8));
assertEquals(1.0f, rs.getFloat(8));
assertEquals(new BigDecimal(1), rs.getBigDecimal(8));
assertEquals(rs.getString(8), "1.0");
assertTrue(rs.getObject(8, Boolean.class));
assertEquals((byte)1, rs.getObject(8, Byte.class));
assertEquals((short)1, rs.getObject(8, Short.class));
assertEquals(1, rs.getObject(8, Integer.class));
assertEquals(1, rs.getObject(8, Long.class));
assertEquals(1.f, rs.getObject(8, Float.class));
assertEquals(1, rs.getObject(8, Double.class));
assertEquals(new BigDecimal(1), rs.getObject(8, BigDecimal.class));
assertArrayEquals(new byte[] {63, -16, 0, 0, 0, 0, 0, 0}, rs.getBytes(8));
assertEquals(rs.getObject(8, String.class), "1.0");
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* @throws Exception If failed.
*/
@Test
public void testBigDecimal() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertEquals(1, rs.getBigDecimal("bigVal").intValue());
assertTrue(rs.getBoolean(9));
assertEquals(1, rs.getByte(9));
assertEquals(1, rs.getShort(9));
assertEquals(1, rs.getInt(9));
assertEquals(1, rs.getLong(9));
assertEquals(1.0, rs.getDouble(9));
assertEquals(1.0f, rs.getFloat(9));
assertEquals(new BigDecimal("1.0"), rs.getBigDecimal(9));
assertEquals(rs.getString(9), "1.0");
assertTrue(rs.getObject(9, Boolean.class));
assertEquals((byte)1, rs.getObject(9, Byte.class));
assertEquals((short)1, rs.getObject(9, Short.class));
assertEquals(1, rs.getObject(9, Integer.class));
assertEquals(1, rs.getObject(9, Long.class));
assertEquals(1.f, rs.getObject(9, Float.class));
assertEquals(1, rs.getObject(9, Double.class));
assertEquals(new BigDecimal("1.0"), rs.getObject(9, BigDecimal.class));
assertEquals(rs.getObject(9, String.class), "1.0");
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* TODO: IGNITE-15163
*
* @throws Exception If failed.
*/
@Test
@Disabled
public void testBigDecimalScale() throws Exception {
assertEquals(convertStringToBigDecimalViaJdbc("0.1234", 2).toString(), "0.12");
assertEquals(convertStringToBigDecimalViaJdbc("1.0005", 3).toString(), "1.001");
assertEquals(convertStringToBigDecimalViaJdbc("1205.5", -3).toString(), "1E+3");
assertEquals(convertStringToBigDecimalViaJdbc("12505.5", -3).toString(), "1.3E+4");
}
/**
* @param strDec String representation of a decimal value.
* @param scale Scale.
* @return BigDecimal object.
* @throws SQLException On error.
*/
private BigDecimal convertStringToBigDecimalViaJdbc(String strDec, int scale) throws SQLException {
try (ResultSet rs = stmt.executeQuery("select '" + strDec + "'")) {
assertTrue(rs.next());
return rs.getBigDecimal(1, scale);
}
}
/**
* @throws Exception If failed.
*/
@Test
public void testString() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assert "1".equals(rs.getString("strVal"));
assertTrue(rs.getBoolean(10));
assertEquals(1, rs.getByte(10));
assertEquals(1, rs.getShort(10));
assertEquals(1, rs.getInt(10));
assertEquals(1, rs.getLong(10));
assertEquals(1.0, rs.getDouble(10));
assertEquals(1.0f, rs.getFloat(10));
assertEquals(new BigDecimal("1"), rs.getBigDecimal(10));
assertEquals(rs.getString(10), "1");
assertTrue(rs.getObject(10, Boolean.class));
assertEquals((byte)1, rs.getObject(10, Byte.class));
assertEquals((short)1, rs.getObject(10, Short.class));
assertEquals(1, rs.getObject(10, Integer.class));
assertEquals(1, rs.getObject(10, Long.class));
assertEquals(1.f, rs.getObject(10, Float.class));
assertEquals(1, rs.getObject(10, Double.class));
assertEquals(new BigDecimal(1), rs.getObject(10, BigDecimal.class));
assertArrayEquals(new byte[] {49}, rs.getBytes(10));
assertEquals(rs.getObject(10, String.class), "1");
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* TODO: IGNITE-15163
*
* @throws Exception If failed.
*/
@Test
@Disabled
public void testArray() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertArrayEquals(new byte[] {1}, rs.getBytes("arrVal"));
assertArrayEquals(new byte[] {1}, rs.getBytes(11));
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* TODO: IGNITE-15163
*
* @throws Exception If failed.
*/
@SuppressWarnings("deprecation")
@Test
public void testDate() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assert rs.getDate("dateVal").equals(new Date(1, 1, 1));
assertEquals(new Date(1, 1, 1), rs.getDate(12));
assertEquals(new Time(new Date(1, 1, 1).getTime()), rs.getTime(12));
assertEquals(new Timestamp(new Date(1, 1, 1).getTime()), rs.getTimestamp(12));
assertEquals(new Date(1, 1, 1), rs.getObject(12, Date.class));
assertEquals(new Time(new Date(1, 1, 1).getTime()), rs.getObject(12, Time.class));
assertEquals(new Timestamp(new Date(1, 1, 1).getTime()), rs.getObject(12, Timestamp.class));
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* TODO: IGNITE-15163
*
* @throws Exception If failed.
*/
@SuppressWarnings("deprecation")
@Test
public void testTime() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assert rs.getTime("timeVal").equals(new Time(1, 1, 1));
assertEquals(new Date(new Time(1, 1, 1).getTime()), rs.getDate(13));
assertEquals(new Time(1, 1, 1), rs.getTime(13));
assertEquals(new Timestamp(new Time(1, 1, 1).getTime()), rs.getTimestamp(13));
assertEquals(new Date(new Time(1, 1, 1).getTime()), rs.getObject(13, Date.class));
assertEquals(new Time(1, 1, 1), rs.getObject(13, Time.class));
assertEquals(new Timestamp(new Time(1, 1, 1).getTime()), rs.getObject(13, Timestamp.class));
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* TODO: IGNITE-15163
*
* @throws Exception If failed.
*/
@Test
public void testTimestamp() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
while (rs.next()) {
if (cnt == 0) {
assertEquals(-10800000, rs.getTimestamp("tsVal").getTime());
assertEquals(new Date(new Timestamp(-10800000).getTime()), rs.getDate(14));
assertEquals(new Time(new Timestamp(-10800000).getTime()), rs.getTime(14));
assertEquals(new Timestamp(-10800000), rs.getTimestamp(14));
assertEquals(new Date(new Timestamp(-10800000).getTime()), rs.getObject(14, Date.class));
assertEquals(new Time(new Timestamp(-10800000).getTime()), rs.getObject(14, Time.class));
assertEquals(new Timestamp(-10800000), rs.getObject(14, Timestamp.class));
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* TODO Enable when sql engine will be fully integrated.
*
* @throws Exception If failed.
*/
@Test
@Disabled
public void testObject() throws Exception {
ResultSet rs = stmt.executeQuery(SQL);
int cnt = 0;
TestObjectField exp = new TestObjectField(100, "AAAA");
while (rs.next()) {
if (cnt == 0) {
assertEquals(exp, rs.getObject("objVal"));
assertEquals(exp, rs.getObject(15));
assertEquals(exp, rs.getObject(15, Object.class));
assertEquals(exp, rs.getObject(15, TestObjectField.class));
}
cnt++;
}
assertEquals(1, cnt);
}
/**
* TODO Enable when sql engine will be fully integrated.
*
* @throws Exception If failed.
*/
@Test
@Disabled
public void testNavigation() throws Exception {
ResultSet rs = stmt.executeQuery("select id from TestObject where id > 0");
assertTrue(rs.isBeforeFirst());
assertFalse(rs.isAfterLast());
assertFalse(rs.isFirst());
assertFalse(rs.isLast());
assertEquals(0, rs.getRow());
assertTrue(rs.next());
assertFalse(rs.isBeforeFirst());
assertFalse(rs.isAfterLast());
assertTrue(rs.isFirst());
assertFalse(rs.isLast());
assertEquals(1, rs.getRow());
assertTrue(rs.next());
assertFalse(rs.isBeforeFirst());
assertFalse(rs.isAfterLast());
assertFalse(rs.isFirst());
assertTrue(rs.isLast());
assertEquals(2, rs.getRow());
assertFalse(rs.next());
assertFalse(rs.isBeforeFirst());
assertTrue(rs.isAfterLast());
assertFalse(rs.isFirst());
assertFalse(rs.isLast());
assertEquals(0, rs.getRow());
rs = stmt.executeQuery("select id from TestObject where id < 0");
assertFalse(rs.isBeforeFirst());
}
/**
* @throws Exception If failed.
*/
@Test
public void testFindColumn() throws Exception {
final ResultSet rs = stmt.executeQuery(SQL);
assertNotNull(rs);
assertTrue(rs.next());
assertEquals(1, rs.findColumn("id"));
assertThrows(SQLException.class, () -> rs.findColumn("wrong"), "Column not found: wrong");
}
/**
* @throws Exception If failed.
*/
@Test
public void testNotSupportedTypes() throws Exception {
final ResultSet rs = stmt.executeQuery(SQL);
assertTrue(rs.next());
checkNotSupported(() -> rs.getArray(1));
checkNotSupported(() -> rs.getArray("id"));
checkNotSupported(() -> rs.getAsciiStream(1));
checkNotSupported(() -> rs.getAsciiStream("id"));
checkNotSupported(() -> rs.getBinaryStream(1));
checkNotSupported(() -> rs.getBinaryStream("id"));
checkNotSupported(() -> rs.getBlob(1));
checkNotSupported(() -> rs.getBlob("id"));
checkNotSupported(() -> rs.getClob(1));
checkNotSupported(() -> rs.getClob("id"));
checkNotSupported(() -> rs.getCharacterStream(1));
checkNotSupported(() -> rs.getCharacterStream("id"));
checkNotSupported(() -> rs.getNCharacterStream(1));
checkNotSupported(() -> rs.getNCharacterStream("id"));
checkNotSupported(() -> rs.getNClob(1));
checkNotSupported(() -> rs.getNClob("id"));
checkNotSupported(() -> rs.getRef(1));
checkNotSupported(() -> rs.getRef("id"));
checkNotSupported(() -> rs.getRowId(1));
checkNotSupported(() -> rs.getRowId("id"));
checkNotSupported(() -> rs.getSQLXML(1));
checkNotSupported(() -> rs.getSQLXML("id"));
}
/**
* @throws Exception If failed.
*/
@Test
public void testUpdateNotSupported() throws Exception {
final ResultSet rs = stmt.executeQuery(SQL);
assertTrue(rs.next());
checkNotSupported(() -> rs.updateBoolean(1, true));
checkNotSupported(() -> rs.updateBoolean("id", true));
checkNotSupported(() -> rs.updateByte(1, (byte)0));
checkNotSupported(() -> rs.updateByte("id", (byte)0));
checkNotSupported(() -> rs.updateShort(1, (short)0));
checkNotSupported(() -> rs.updateShort("id", (short)0));
checkNotSupported(() -> rs.updateInt(1, 0));
checkNotSupported(() -> rs.updateInt("id", 0));
checkNotSupported(() -> rs.updateLong(1, 0));
checkNotSupported(() -> rs.updateLong("id", 0));
checkNotSupported(() -> rs.updateFloat(1, (float)0.0));
checkNotSupported(() -> rs.updateFloat("id", (float)0.0));
checkNotSupported(() -> rs.updateDouble(1, 0.0));
checkNotSupported(() -> rs.updateDouble("id", 0.0));
checkNotSupported(() -> rs.updateString(1, ""));
checkNotSupported(() -> rs.updateString("id", ""));
checkNotSupported(() -> rs.updateTime(1, new Time(0)));
checkNotSupported(() -> rs.updateTime("id", new Time(0)));
checkNotSupported(() -> rs.updateDate(1, new Date(0)));
checkNotSupported(() -> rs.updateDate("id", new Date(0)));
checkNotSupported(() -> rs.updateTimestamp(1, new Timestamp(0)));
checkNotSupported(() -> rs.updateTimestamp("id", new Timestamp(0)));
checkNotSupported(() -> rs.updateBytes(1, new byte[]{}));
checkNotSupported(() -> rs.updateBytes("id", new byte[]{}));
checkNotSupported(() -> rs.updateArray(1, null));
checkNotSupported(() -> rs.updateArray("id", null));
checkNotSupported(() -> rs.updateBlob(1, (Blob)null));
checkNotSupported(() -> rs.updateBlob(1, (InputStream)null));
checkNotSupported(() -> rs.updateBlob(1, null, 0L));
checkNotSupported(() -> rs.updateBlob("id", (Blob)null));
checkNotSupported(() -> rs.updateBlob("id", (InputStream)null));
checkNotSupported(() -> rs.updateBlob("id", null, 0L));
checkNotSupported(() -> rs.updateClob(1, (Clob)null));
checkNotSupported(() -> rs.updateClob(1, (Reader)null));
checkNotSupported(() -> rs.updateClob(1, null, 0L));
checkNotSupported(() -> rs.updateClob("id", (Clob)null));
checkNotSupported(() -> rs.updateClob("id", (Reader)null));
checkNotSupported(() -> rs.updateClob("id", null, 0L));
checkNotSupported(() -> rs.updateNClob(1, (NClob)null));
checkNotSupported(() -> rs.updateNClob(1, (Reader)null));
checkNotSupported(() -> rs.updateNClob(1, null, 0L));
checkNotSupported(() -> rs.updateNClob("id", (NClob)null));
checkNotSupported(() -> rs.updateNClob("id", (Reader)null));
checkNotSupported(() -> rs.updateNClob("id", null, 0L));
checkNotSupported(() -> rs.updateAsciiStream(1, null));
checkNotSupported(() -> rs.updateAsciiStream(1, null, 0));
checkNotSupported(() -> rs.updateAsciiStream(1, null, 0L));
checkNotSupported(() -> rs.updateAsciiStream("id", null));
checkNotSupported(() -> rs.updateAsciiStream("id", null, 0));
checkNotSupported(() -> rs.updateAsciiStream("id", null, 0L));
checkNotSupported(() -> rs.updateCharacterStream(1, null));
checkNotSupported(() -> rs.updateCharacterStream(1, null, 0));
checkNotSupported(() -> rs.updateCharacterStream(1, null, 0L));
checkNotSupported(() -> rs.updateCharacterStream("id", null));
checkNotSupported(() -> rs.updateCharacterStream("id", null, 0));
checkNotSupported(() -> rs.updateCharacterStream("id", null, 0L));
checkNotSupported(() -> rs.updateNCharacterStream(1, null));
checkNotSupported(() -> rs.updateNCharacterStream(1, null, 0));
checkNotSupported(() -> rs.updateNCharacterStream(1, null, 0L));
checkNotSupported(() -> rs.updateNCharacterStream("id", null));
checkNotSupported(() -> rs.updateNCharacterStream("id", null, 0));
checkNotSupported(() -> rs.updateNCharacterStream("id", null, 0L));
checkNotSupported(() -> rs.updateRef(1, null));
checkNotSupported(() -> rs.updateRef("id", null));
checkNotSupported(() -> rs.updateRowId(1, null));
checkNotSupported(() -> rs.updateRowId("id", null));
checkNotSupported(() -> rs.updateNString(1, null));
checkNotSupported(() -> rs.updateNString("id", null));
checkNotSupported(() -> rs.updateSQLXML(1, null));
checkNotSupported(() -> rs.updateSQLXML("id", null));
checkNotSupported(() -> rs.updateObject(1, null));
checkNotSupported(() -> rs.updateObject(1, null, 0));
checkNotSupported(() -> rs.updateObject("id", null));
checkNotSupported(() -> rs.updateObject("id", null, 0));
checkNotSupported(() -> rs.updateBigDecimal(1, null));
checkNotSupported(() -> rs.updateBigDecimal("id", null));
checkNotSupported(() -> rs.updateNull(1));
checkNotSupported(() -> rs.updateNull("id"));
checkNotSupported(rs::cancelRowUpdates);
checkNotSupported(rs::updateRow);
checkNotSupported(rs::deleteRow);
checkNotSupported(rs::insertRow);
checkNotSupported(rs::moveToInsertRow);
}
/**
* @throws Exception If failed.
*/
@Test
public void testExceptionOnClosedResultSet() throws Exception {
final ResultSet rs = stmt.executeQuery(SQL);
rs.close();
// Must do nothing on closed result set
rs.close();
checkResultSetClosed(() -> rs.getBoolean(1));
checkResultSetClosed(() -> rs.getBoolean("id"));
checkResultSetClosed(() -> rs.getByte(1));
checkResultSetClosed(() -> rs.getByte("id"));
checkResultSetClosed(() -> rs.getShort(1));
checkResultSetClosed(() -> rs.getShort("id"));
checkResultSetClosed(() -> rs.getInt(1));
checkResultSetClosed(() -> rs.getInt("id"));
checkResultSetClosed(() -> rs.getLong(1));
checkResultSetClosed(() -> rs.getLong("id"));
checkResultSetClosed(() -> rs.getFloat(1));
checkResultSetClosed(() -> rs.getFloat("id"));
checkResultSetClosed(() -> rs.getDouble(1));
checkResultSetClosed(() -> rs.getDouble("id"));
checkResultSetClosed(() -> rs.getString(1));
checkResultSetClosed(() -> rs.getString("id"));
checkResultSetClosed(() -> rs.getBytes(1));
checkResultSetClosed(() -> rs.getBytes("id"));
checkResultSetClosed(() -> rs.getDate(1));
checkResultSetClosed(() -> rs.getDate(1, new GregorianCalendar()));
checkResultSetClosed(() -> rs.getDate("id"));
checkResultSetClosed(() -> rs.getDate("id", new GregorianCalendar()));
checkResultSetClosed(() -> rs.getTime(1));
checkResultSetClosed(() -> rs.getTime(1, new GregorianCalendar()));
checkResultSetClosed(() -> rs.getTime("id"));
checkResultSetClosed(() -> rs.getTime("id", new GregorianCalendar()));
checkResultSetClosed(() -> rs.getTimestamp(1));
checkResultSetClosed(() -> rs.getTimestamp(1, new GregorianCalendar()));
checkResultSetClosed(() -> rs.getTimestamp("id"));
checkResultSetClosed(() -> rs.getTimestamp("id", new GregorianCalendar()));
checkResultSetClosed(() -> rs.getObject("objVal"));
checkResultSetClosed(() -> rs.getObject("objVal", TestObjectField.class));
checkResultSetClosed(rs::wasNull);
checkResultSetClosed(rs::getMetaData);
checkResultSetClosed(rs::next);
checkResultSetClosed(rs::last);
checkResultSetClosed(rs::afterLast);
checkResultSetClosed(rs::beforeFirst);
checkResultSetClosed(rs::first);
checkResultSetClosed(() -> rs.findColumn("id"));
checkResultSetClosed(rs::getRow);
}
/**
* Test object field.
*/
@SuppressWarnings("PackageVisibleField")
private static class TestObjectField implements Serializable {
/** */
final int a;
/** */
final String b;
/**
* @param a A.
* @param b B.
*/
private TestObjectField(int a, String b) {
this.a = a;
this.b = b;
}
/** {@inheritDoc} */
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TestObjectField that = (TestObjectField)o;
return a == that.a && !(b != null ? !b.equals(that.b) : that.b != null);
}
/** {@inheritDoc} */
@Override public int hashCode() {
int res = a;
res = 31 * res + (b != null ? b.hashCode() : 0);
return res;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(TestObjectField.class, this);
}
}
}