blob: 0931148831b9a13d2defecc0f34e2eb27ac6deb9 [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab
package org.mariadb.jdbc.integration;
import static org.junit.jupiter.api.Assertions.*;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mariadb.jdbc.Statement;
public class ResultSetTest extends Common {
private final Class<? extends java.lang.Exception> ns = SQLFeatureNotSupportedException.class;
@AfterAll
public static void after2() throws SQLException {
sharedConn.createStatement().execute("DROP TABLE IF EXISTS resultsettest");
}
@BeforeAll
public static void beforeAll2() throws SQLException {
after2();
Statement stmt = sharedConn.createStatement();
stmt.execute("DROP TABLE IF EXISTS resultsettest");
stmt.execute("CREATE TABLE resultsettest (t1 int not null primary key auto_increment, t2 int)");
stmt.execute("INSERT INTO resultsettest(t2) values (1),(2),(3),(4),(5),(6),(7),(8)");
}
@Test
public void nonUpdatableFields() throws SQLException {
Statement stmt = sharedConn.createStatement();
stmt.execute("START TRANSACTION");
ResultSet rs = stmt.executeQuery("SELECT * FROM resultsettest");
Assertions.assertNull(rs.getWarnings());
rs.next();
Common.assertThrowsContains(ns, () -> rs.updateArray(1, null), "Array are not supported");
String NOT_SUPPORTED = "Not supported when using CONCUR_READ_ONLY concurrency";
Common.assertThrowsContains(ns, () -> rs.updateNull(1), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBoolean(1, true), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateByte(1, (byte) 0x00), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateShort(1, (short) 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateInt(1, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateLong(1, 0L), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateFloat(1, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateDouble(1, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBigDecimal(1, BigDecimal.ZERO), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateString(1, ""), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNString(1, ""), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBytes(1, new byte[0]), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateDate(1, null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateTime(1, null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateTimestamp(1, null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateAsciiStream(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBinaryStream(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateCharacterStream(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateObject(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateObject(1, null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBlob(1, (Blob) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateClob(1, (Clob) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBlob(1, (InputStream) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateClob(1, (Reader) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNClob(1, (NClob) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNClob(1, (Reader) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateArray("t1", null), "Array are not supported");
Common.assertThrowsContains(ns, () -> rs.updateNull("t1"), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBoolean("t1", true), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateByte("t1", (byte) 0x00), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateShort("t1", (short) 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateInt("t1", 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateLong("t1", 0L), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateFloat("t1", 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateDouble("t1", 0), NOT_SUPPORTED);
Common.assertThrowsContains(
ns, () -> rs.updateBigDecimal("t1", BigDecimal.ZERO), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateString("t1", ""), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNString("t1", ""), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBytes("t1", new byte[0]), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateDate("t1", null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateTime("t1", null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateTimestamp("t1", null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateAsciiStream("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBinaryStream("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateCharacterStream("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateObject("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateObject("t1", null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBlob("t1", (Blob) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBlob("t1", (InputStream) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateClob("t1", (Clob) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateClob("t1", (Reader) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNClob("t1", (NClob) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNClob("t1", (Reader) null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::insertRow, NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::updateRow, NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::deleteRow, NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::refreshRow, NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::cancelRowUpdates, NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::moveToInsertRow, NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::moveToCurrentRow, NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::rowUpdated, NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::rowInserted, NOT_SUPPORTED);
Common.assertThrowsContains(ns, rs::rowDeleted, NOT_SUPPORTED);
Common.assertThrowsContains(
ns, () -> rs.updateRef(1, null), "Method ResultSet.updateRef not supported");
Common.assertThrowsContains(
ns, () -> rs.updateRef("t1", null), "Method ResultSet.updateRef not supported");
Common.assertThrowsContains(ns, () -> rs.updateArray(1, null), "Array are not supported");
Common.assertThrowsContains(ns, () -> rs.updateArray("t1", null), "Array are not supported");
Common.assertThrowsContains(ns, () -> rs.updateRowId(1, null), "RowId are not supported");
Common.assertThrowsContains(ns, () -> rs.updateRowId("t1", null), "RowId are not supported");
Common.assertThrowsContains(ns, () -> rs.updateSQLXML(1, null), "SQLXML not supported");
Common.assertThrowsContains(ns, () -> rs.updateSQLXML("t1", null), "SQLXML not supported");
Common.assertThrowsContains(ns, () -> rs.updateNCharacterStream(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNCharacterStream("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateAsciiStream(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateAsciiStream("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBinaryStream(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBinaryStream("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBlob(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBlob("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateClob(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateClob("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNClob(1, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNClob("t1", null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateCharacterStream(1, null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateCharacterStream("t1", null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNCharacterStream(1, null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateNCharacterStream("t1", null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateAsciiStream(1, null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateAsciiStream("t1", null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBinaryStream(1, null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateBinaryStream("t1", null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateObject(1, null, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateObject("t1", null, null, 0), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateObject(1, null, null), NOT_SUPPORTED);
Common.assertThrowsContains(ns, () -> rs.updateObject("t1", null, null), NOT_SUPPORTED);
sharedConn.rollback();
}
@Test
public void notSupported() throws SQLException {
Statement stmt = sharedConn.createStatement();
stmt.execute("START TRANSACTION");
ResultSet rs = stmt.executeQuery("SELECT * FROM resultsettest");
Common.assertThrowsContains(ns, () -> rs.getRowId(1), "RowId are not supported");
Common.assertThrowsContains(ns, () -> rs.getRowId("t1"), "RowId are not supported");
Map<String, Class<?>> map = new HashMap<>();
map.put("f", Integer.class);
Common.assertThrowsContains(
ns,
() -> rs.getObject(1, map),
"Method ResultSet.getObject(int columnIndex, Map<String, Class<?>> map) not supported");
Common.assertThrowsContains(
ns,
() -> rs.getObject("t1", map),
"Method ResultSet.getObject(String columnLabel, Map<String, Class<?>> map) not supported");
Common.assertThrowsContains(ns, rs::getCursorName, "Cursors are not supported");
sharedConn.rollback();
}
@Test
public void staticMethod() throws SQLException {
Statement stmt = sharedConn.createStatement();
stmt.execute("START TRANSACTION");
ResultSet rs = stmt.executeQuery("SELECT * FROM resultsettest");
Assertions.assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, rs.getHoldability());
rs.unwrap(java.sql.ResultSet.class);
Common.assertThrowsContains(
SQLException.class,
() -> rs.unwrap(String.class),
"The receiver is not a wrapper for java.lang.String");
sharedConn.rollback();
}
@Test
public void wrongIndex() throws SQLException {
Statement stmt = sharedConn.createStatement();
stmt.execute("START TRANSACTION");
ResultSet rs = stmt.executeQuery("SELECT * FROM resultsettest");
rs.next();
Common.assertThrowsContains(
SQLException.class,
() -> rs.getObject(-1),
"Wrong index position. Is -1 but must be in 1-2 range");
Common.assertThrowsContains(
SQLException.class,
() -> rs.getObject(10),
"Wrong index position. Is 10 but must be in 1-2 range");
Common.assertThrowsContains(
SQLException.class, () -> rs.findColumn(null), "null is not a valid label value");
Common.assertThrowsContains(
SQLException.class,
() -> rs.findColumn("yy"),
"Unknown label 'yy'. Possible value [resultsettest.t1, t1, resultsettest.t2, t2]");
sharedConn.rollback();
}
@Test
public void isBeforeFirstFetchTest() throws SQLException {
Statement stmt = sharedConn.createStatement();
stmt.execute("START TRANSACTION");
stmt.setFetchSize(1);
ResultSet rs = stmt.executeQuery("SELECT * FROM resultsettest");
assertTrue(rs.isBeforeFirst());
while (rs.next()) {
assertFalse(rs.isBeforeFirst());
}
assertFalse(rs.isBeforeFirst());
rs.close();
Common.assertThrowsContains(
SQLException.class, rs::isBeforeFirst, "Operation not permit on a closed resultSet");
sharedConn.rollback();
}
@Test
public void testAliases() throws SQLException {
Statement stmt = sharedConn.createStatement();
stmt.execute("START TRANSACTION");
ResultSet rs =
stmt.executeQuery("SELECT t1 as t1alias, t2 as t2alias FROM resultsettest as tablealias");
rs.next();
assertEquals(1, rs.getInt(1));
assertEquals(1, rs.getInt("t1alias"));
assertEquals(1, rs.getInt("tablealias.t1alias"));
assertEquals(1, rs.getInt(1));
assertEquals(1, rs.getInt("t2alias"));
assertEquals(1, rs.getInt("tablealias.t2alias"));
rs = stmt.executeQuery("SELECT t1 as t1alias, t2 as t2alias FROM resultsettest");
rs.next();
assertEquals(1, rs.getInt(1));
assertEquals(1, rs.getInt("t1alias"));
assertEquals(1, rs.getInt("resultsettest.t1alias"));
assertEquals(1, rs.getInt(1));
assertEquals(1, rs.getInt("t2alias"));
assertEquals(1, rs.getInt("resultsettest.t2alias"));
rs = stmt.executeQuery("SELECT t1, t2 FROM resultsettest");
rs.next();
assertEquals(1, rs.getInt(1));
assertEquals(1, rs.getInt("t1"));
assertEquals(1, rs.getInt("resultsettest.t1"));
assertEquals(1, rs.getInt(1));
assertEquals(1, rs.getInt("t2"));
assertEquals(1, rs.getInt("resultsettest.t2"));
sharedConn.rollback();
}
}