blob: 53d8568d22e2d1c5917faeac189c2b3a436e3635 [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.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.*;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mariadb.jdbc.MariaDbBlob;
import org.mariadb.jdbc.MariaDbClob;
import org.mariadb.jdbc.Statement;
public class ProcedureTest extends Common {
@AfterAll
public static void drop() throws SQLException {
Statement stmt = sharedConn.createStatement();
stmt.execute("DROP TABLE IF EXISTS procedure_test");
stmt.execute("DROP PROCEDURE IF EXISTS multiply_by_2");
}
@BeforeAll
public static void beforeAll2() throws SQLException {
drop();
Statement stmt = sharedConn.createStatement();
stmt.execute("CREATE TABLE procedure_test (t0 int)");
stmt.execute("CREATE PROCEDURE multiply_by_2 (INOUT t1 INT) BEGIN \nset t1 = t1 * 2;\nEND");
}
@Test
public void settingParameterBeforeOutRegistration() throws SQLException {
try (CallableStatement cstmt = sharedConn.prepareCall("{ CALL multiply_by_2(?) }")) {
cstmt.setLong(1, 42L);
cstmt.registerOutParameter(1, Types.NUMERIC);
cstmt.executeQuery();
assertEquals(84, cstmt.getLong(1));
}
}
@Test
public void wrongCall() {
Common.assertThrowsContains(
SQLException.class, () -> sharedConn.prepareCall("SELECT ?"), "invalid callable syntax");
}
@Test
public void prepInsert() throws SQLException {
// https://jira.mariadb.org/browse/XPT-267
Assumptions.assumeFalse(isXpand());
Statement st = sharedConn.createStatement();
st.execute("DROP PROCEDURE IF EXISTS prep_proc2");
st.execute(
"CREATE PROCEDURE prep_proc2 (IN t1 INT) BEGIN \n"
+ "INSERT INTO procedure_test(t0) VALUE (t1);\n"
+ "END");
try (PreparedStatement stmt = sharedConn.prepareCall("CALL prep_proc2(?)")) {
stmt.setInt(1, 1);
stmt.execute();
}
}
@Test
public void prep() throws SQLException {
Statement st = sharedConn.createStatement();
st.execute("DROP PROCEDURE IF EXISTS prep_proc");
st.execute("CREATE PROCEDURE prep_proc (IN t1 INT) BEGIN \n" + "SELECT t1;\n" + "END");
try (PreparedStatement stmt = sharedConn.prepareCall("CALL prep_proc(?)")) {
assertEquals(ResultSet.TYPE_FORWARD_ONLY, stmt.getResultSetType());
assertEquals(ResultSet.CONCUR_READ_ONLY, stmt.getResultSetConcurrency());
assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, stmt.getResultSetHoldability());
assertEquals(sharedConn, stmt.getConnection());
}
try (PreparedStatement stmt =
sharedConn.prepareCall(
"CALL prep_proc(?)", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE)) {
assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, stmt.getResultSetType());
assertEquals(ResultSet.CONCUR_UPDATABLE, stmt.getResultSetConcurrency());
assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, stmt.getResultSetHoldability());
assertEquals(sharedConn, stmt.getConnection());
}
try (PreparedStatement stmt =
sharedConn.prepareCall(
"CALL prep_proc(?)",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE,
ResultSet.CLOSE_CURSORS_AT_COMMIT)) {
assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, stmt.getResultSetType());
assertEquals(ResultSet.CONCUR_UPDATABLE, stmt.getResultSetConcurrency());
// not supported
assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, stmt.getResultSetHoldability());
assertEquals(sharedConn, stmt.getConnection());
}
}
@Test
@SuppressWarnings("deprecated")
public void basicProcedure() throws Throwable {
// error MXS-3929 for maxscale 6.2.0
Assumptions.assumeTrue(
!sharedConn.getMetaData().getDatabaseProductVersion().contains("maxScale-6.2.0"));
// https://jira.mariadb.org/browse/XPT-267
Assumptions.assumeFalse(isXpand());
Statement stmt = sharedConn.createStatement();
stmt.execute("DROP PROCEDURE IF EXISTS basic_proc");
stmt.execute(
"CREATE PROCEDURE basic_proc (IN t1 INT, INOUT t2 INT unsigned, OUT t3 INT, IN t4 INT, OUT"
+ " t5 VARCHAR(20), OUT t6 TIMESTAMP, OUT t7 blob) BEGIN \n"
+ "SELECT 1;\n"
+ "set t3 = t1 * t4;\n"
+ "set t2 = t2 * t1;\n"
+ "set t5 = 'http://test';\n"
+ "set t6 = TIMESTAMP('2003-12-31 12:00:00');\n"
+ "set t7 = 'test';\n"
+ "END");
try (CallableStatement callableStatement =
sharedConn.prepareCall("{call basic_proc(?,?,?,?,?,?,?)}")) {
Common.assertThrowsContains(
SQLException.class, () -> callableStatement.getString(1), "No output result");
callableStatement.getParameterMetaData();
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> callableStatement.registerOutParameter(20, JDBCType.INTEGER),
"wrong parameter index 20");
callableStatement.registerOutParameter(2, JDBCType.INTEGER);
callableStatement.registerOutParameter(3, JDBCType.INTEGER);
callableStatement.registerOutParameter(5, JDBCType.VARCHAR);
callableStatement.registerOutParameter(6, JDBCType.TIMESTAMP);
callableStatement.registerOutParameter(7, JDBCType.TIMESTAMP);
checkResults(callableStatement);
callableStatement.clearParameters();
checkResults(callableStatement);
ParameterMetaData meta = callableStatement.getParameterMetaData();
assertEquals("INT", meta.getParameterTypeName(1));
assertEquals("VARCHAR", meta.getParameterTypeName(5));
callableStatement.registerOutParameter(2, Types.INTEGER);
callableStatement.registerOutParameter(3, Types.INTEGER);
callableStatement.registerOutParameter(5, Types.VARCHAR);
callableStatement.registerOutParameter(6, Types.TIMESTAMP);
callableStatement.registerOutParameter(7, Types.TIMESTAMP);
checkResults(callableStatement);
callableStatement.registerOutParameter(2, Types.INTEGER, 10);
callableStatement.registerOutParameter(3, Types.INTEGER, 10);
callableStatement.registerOutParameter(5, Types.VARCHAR, 10);
callableStatement.registerOutParameter(6, Types.TIMESTAMP, 10);
callableStatement.registerOutParameter(7, Types.TIMESTAMP, 10);
checkResults(callableStatement);
callableStatement.registerOutParameter(2, JDBCType.INTEGER, 10);
callableStatement.registerOutParameter(3, JDBCType.INTEGER, 10);
callableStatement.registerOutParameter(5, JDBCType.VARCHAR, 10);
callableStatement.registerOutParameter(6, JDBCType.TIMESTAMP, 10);
callableStatement.registerOutParameter(7, JDBCType.TIMESTAMP, 10);
checkResults(callableStatement);
callableStatement.registerOutParameter(2, Types.INTEGER, "typeName");
callableStatement.registerOutParameter(3, Types.INTEGER, "typeName");
callableStatement.registerOutParameter(5, Types.VARCHAR, "typeName");
callableStatement.registerOutParameter(6, Types.TIMESTAMP, "typeName");
callableStatement.registerOutParameter(7, Types.BLOB, "typeName");
checkResults(callableStatement);
callableStatement.registerOutParameter(2, JDBCType.INTEGER, "typeName");
callableStatement.registerOutParameter(3, JDBCType.INTEGER, "typeName");
callableStatement.registerOutParameter(5, JDBCType.VARCHAR, "typeName");
callableStatement.registerOutParameter(6, JDBCType.TIMESTAMP, "typeName");
callableStatement.registerOutParameter(7, JDBCType.BLOB, "typeName");
checkResults(callableStatement);
callableStatement.registerOutParameter("t2", JDBCType.INTEGER);
callableStatement.registerOutParameter("t3", JDBCType.INTEGER);
callableStatement.registerOutParameter("t5", JDBCType.VARCHAR);
callableStatement.registerOutParameter("t6", JDBCType.TIMESTAMP);
callableStatement.registerOutParameter("t7", JDBCType.BLOB);
checkResults(callableStatement);
callableStatement.registerOutParameter("t2", Types.INTEGER);
callableStatement.registerOutParameter("t3", Types.INTEGER);
callableStatement.registerOutParameter("t5", Types.VARCHAR);
callableStatement.registerOutParameter("t6", Types.TIMESTAMP);
callableStatement.registerOutParameter("t7", Types.BLOB);
checkResults(callableStatement);
callableStatement.registerOutParameter("t2", Types.INTEGER, 10);
callableStatement.registerOutParameter("t3", Types.INTEGER, 10);
callableStatement.registerOutParameter("t5", Types.VARCHAR, 10);
callableStatement.registerOutParameter("t6", Types.TIMESTAMP, 10);
callableStatement.registerOutParameter("t7", Types.BLOB, 10);
checkResults(callableStatement);
callableStatement.registerOutParameter("t2", JDBCType.INTEGER, 10);
callableStatement.registerOutParameter("t3", JDBCType.INTEGER, 10);
callableStatement.registerOutParameter("t5", JDBCType.VARCHAR, 10);
callableStatement.registerOutParameter("t6", JDBCType.TIMESTAMP, 10);
callableStatement.registerOutParameter("t7", JDBCType.BLOB, 10);
checkResults(callableStatement);
callableStatement.registerOutParameter("t2", Types.INTEGER, "typeName");
callableStatement.registerOutParameter("t3", Types.INTEGER, "typeName");
callableStatement.registerOutParameter("t5", Types.VARCHAR, "typeName");
callableStatement.registerOutParameter("t6", Types.TIMESTAMP, "typeName");
callableStatement.registerOutParameter("t7", Types.BLOB, "typeName");
checkResults(callableStatement);
callableStatement.registerOutParameter("t2", JDBCType.INTEGER, "typeName");
callableStatement.registerOutParameter("t3", JDBCType.INTEGER, "typeName");
callableStatement.registerOutParameter("t5", JDBCType.VARCHAR, "typeName");
callableStatement.registerOutParameter("t6", JDBCType.TIMESTAMP, "typeName");
callableStatement.registerOutParameter("t7", JDBCType.BLOB, "typeName");
checkResults(callableStatement);
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.registerOutParameter(100, JDBCType.BINARY),
"wrong parameter index 100");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.registerOutParameter("unknown", JDBCType.INTEGER),
"parameter name unknown not found");
}
}
@SuppressWarnings("deprecation")
private void checkResults(CallableStatement callableStatement) throws SQLException, IOException {
callableStatement.setInt(1, 2);
callableStatement.setInt(2, 3);
callableStatement.setInt(4, 10);
callableStatement.execute();
assertEquals(6, callableStatement.getInt(2));
assertEquals("6", callableStatement.getString(2));
assertTrue(callableStatement.getBoolean(2));
assertEquals((byte) 6, callableStatement.getByte(2));
assertEquals((short) 6, callableStatement.getShort(2));
assertEquals(6L, callableStatement.getLong(2));
assertEquals(6F, callableStatement.getFloat(2));
assertEquals(6D, callableStatement.getDouble(2));
assertEquals(6, callableStatement.getBigDecimal(2).intValue());
assertEquals(6, callableStatement.getBigDecimal(2, 5).intValue());
assertEquals(6L, callableStatement.getObject(2, (Map<String, Class<?>>) null));
assertEquals(6L, callableStatement.getObject(2, new HashMap<>()));
assertArrayEquals(new byte[] {116, 101, 115, 116}, callableStatement.getBlob(7).getBytes(1, 4));
assertArrayEquals(
new byte[] {104, 116, 116, 112, 58, 47, 47, 116, 101, 115, 116},
callableStatement.getBytes(5));
assertEquals("http://test", callableStatement.getClob(5).toString());
assertEquals("http://test", callableStatement.getNClob(5).toString());
assertEquals("http://test", callableStatement.getURL(5).toString());
assertEquals("2003-12-31 12:00:00.0", callableStatement.getTimestamp(6).toString());
assertEquals(
"2003-12-31 12:00:00.0",
callableStatement.getTimestamp(6, Calendar.getInstance()).toString());
assertEquals("12:00:00", callableStatement.getTime(6).toString());
assertEquals("12:00:00", callableStatement.getTime(6, Calendar.getInstance()).toString());
assertEquals("2003-12-31", callableStatement.getDate(6).toString());
char[] res = new char[4];
callableStatement.getCharacterStream(5).read(res);
assertEquals("http", new String(res));
callableStatement.getNCharacterStream(5).read(res);
assertEquals("http", new String(res));
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getBytes(2),
"Data type INTEGER cannot be decoded as byte[]");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getDate(2),
"Data type INTEGER cannot be decoded as Date");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getBytes(2),
"Data type INTEGER cannot be decoded as byte[]");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getDate(2, (Calendar) null),
"Data type INTEGER cannot be decoded as Date");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getTime(2),
"Data type INTEGER cannot be decoded as Time");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getTime(2, (Calendar) null),
"Data type INTEGER cannot be decoded as Time");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getTimestamp(2),
"Data type INTEGER cannot be decoded as Timestamp");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getTimestamp(2, (Calendar) null),
"Data type INTEGER cannot be decoded as Timestamp");
assertEquals(6L, callableStatement.getObject(2));
Map<String, Class<?>> map = new HashMap<>();
map.put("f", Integer.class);
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.getObject(2, map),
" Method ResultSet.getObject(int columnIndex, Map<String, Class<?>> map) not supported");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getRef(2),
"Method ResultSet.getRef not supported");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getBlob(2),
"Data type INTEGER cannot be decoded as Blob");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getClob(2),
"Data type INTEGER cannot be decoded as Clob");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.getArray(2),
"Method ResultSet.getArray not supported");
Common.assertThrowsContains(
SQLException.class, () -> callableStatement.getURL(2), "Could not parse '6' as URL");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getNClob(2),
"Data type INTEGER cannot be decoded as Clob");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.getSQLXML(2),
"SQLXML are not supported");
assertEquals("6", callableStatement.getNString(2));
Common.assertThrowsContains(
SQLDataException.class,
() -> callableStatement.getNCharacterStream(2),
"Data type INTEGER cannot be decoded as Reader");
Common.assertThrowsContains(
SQLDataException.class,
() -> callableStatement.getCharacterStream(2),
"Data type INTEGER cannot be decoded as Reader");
assertEquals("6", callableStatement.getObject(2, String.class));
Common.assertThrowsContains(
SQLException.class, () -> callableStatement.getRowId(2), "RowId are not supported");
assertEquals(6, callableStatement.getInt("t2"));
assertEquals("6", callableStatement.getString("t2"));
assertTrue(callableStatement.getBoolean("t2"));
assertEquals((byte) 6, callableStatement.getByte("t2"));
assertEquals((short) 6, callableStatement.getShort("t2"));
assertEquals(6L, callableStatement.getLong("t2"));
assertEquals(6F, callableStatement.getFloat("t2"));
assertEquals(6D, callableStatement.getDouble("t2"));
assertEquals(6, callableStatement.getBigDecimal("t2").intValue());
assertEquals(6L, callableStatement.getObject("t2", (Map<String, Class<?>>) null));
assertEquals(6L, callableStatement.getObject("t2", new HashMap<>()));
assertArrayEquals(
new byte[] {116, 101, 115, 116}, callableStatement.getBlob("t7").getBytes(1, 4));
assertArrayEquals(
new byte[] {104, 116, 116, 112, 58, 47, 47, 116, 101, 115, 116},
callableStatement.getBytes("t5"));
assertEquals("http://test", callableStatement.getClob("t5").toString());
assertEquals("http://test", callableStatement.getNClob("t5").toString());
assertEquals("http://test", callableStatement.getURL("t5").toString());
callableStatement.getCharacterStream("t5").read(res);
assertEquals("http", new String(res));
callableStatement.getNCharacterStream("t5").read(res);
assertEquals("http", new String(res));
assertEquals("2003-12-31 12:00:00.0", callableStatement.getTimestamp("t6").toString());
assertEquals(
"2003-12-31 12:00:00.0",
callableStatement.getTimestamp("t6", Calendar.getInstance()).toString());
assertEquals("12:00:00", callableStatement.getTime("t6").toString());
assertEquals("12:00:00", callableStatement.getTime("t6", Calendar.getInstance()).toString());
assertEquals("2003-12-31", callableStatement.getDate("t6").toString());
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getBytes(null),
"parameter name cannot be null");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getBytes("t2"),
"Data type INTEGER cannot be decoded as byte[]");
Common.assertThrowsContains(
SQLException.class, () -> callableStatement.getRowId("t2"), "RowId are not supported");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getDate("t2"),
"Data type INTEGER cannot be decoded as Date");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getDate("t2", (Calendar) null),
"Data type INTEGER cannot be decoded as Date");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getTime("t2"),
"Data type INTEGER cannot be decoded as Time");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getTime("t2", (Calendar) null),
"Data type INTEGER cannot be decoded as Time");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getTimestamp("t2"),
"Data type INTEGER cannot be decoded as Timestamp");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getTimestamp("t2", (Calendar) null),
"Data type INTEGER cannot be decoded as Timestamp");
assertEquals(6L, callableStatement.getObject("t2"));
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.getObject("t2", map),
" Method ResultSet.getObject(int columnIndex, Map<String, Class<?>> map) not supported");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getRef("t2"),
"Method ResultSet.getRef not supported");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getBlob("t2"),
"Data type INTEGER cannot be decoded as Blob");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getClob("t2"),
"Data type INTEGER cannot be decoded as Clob");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.getArray("t2"),
"Method ResultSet.getArray not supported");
Common.assertThrowsContains(
SQLException.class, () -> callableStatement.getURL("t2"), "Could not parse '6' as URL");
Common.assertThrowsContains(
SQLException.class,
() -> callableStatement.getNClob("t2"),
"Data type INTEGER cannot be decoded as Clob");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.getSQLXML("t2"),
"SQLXML are not supported");
assertEquals("6", callableStatement.getNString("t2"));
Common.assertThrowsContains(
SQLDataException.class,
() -> callableStatement.getNCharacterStream("t2"),
"Data type INTEGER cannot be decoded as Reader");
Common.assertThrowsContains(
SQLDataException.class,
() -> callableStatement.getCharacterStream("t2"),
"Data type INTEGER cannot be decoded as Reader");
assertEquals("6", callableStatement.getObject("t2", String.class));
assertFalse(callableStatement.wasNull());
assertEquals(20, callableStatement.getInt(3));
assertFalse(callableStatement.wasNull());
Common.assertThrowsContains(
SQLException.class, () -> callableStatement.getInt(-1), "wrong index");
Common.assertThrowsContains(
SQLException.class, () -> callableStatement.getInt(4), "index 4 not declared as output");
}
@Test
public void setProcedureTest() throws Exception {
// error MXS-3929 for maxscale 6.2.0
Assumptions.assumeTrue(
!sharedConn.getMetaData().getDatabaseProductVersion().contains("maxScale-6.2.0"));
// https://jira.mariadb.org/browse/XPT-268
Assumptions.assumeFalse(isXpand());
Statement stmt = sharedConn.createStatement();
stmt.execute("DROP PROCEDURE IF EXISTS basic_proc");
stmt.execute(
"CREATE PROCEDURE basic_proc (IN t1 VARCHAR(20), INOUT t2 VARCHAR(20)) BEGIN \n"
+ "set t2 = CONCAT(t1, t2);\n"
+ "END");
try (CallableStatement callableStatement = sharedConn.prepareCall("{call basic_proc(?,?)}")) {
callableStatement.registerOutParameter(2, JDBCType.VARCHAR);
callableStatement.setString(1, "a");
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("ab", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNString(1, "a");
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("ab", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setURL(1, new URL("http://a"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("http://ab", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNull(1, Types.VARCHAR);
callableStatement.setString(2, "b");
callableStatement.execute();
assertNull(callableStatement.getString(2));
assertTrue(callableStatement.wasNull());
reset(callableStatement);
callableStatement.setNull(1, Types.VARCHAR, "sometype");
callableStatement.setString(2, "b");
callableStatement.execute();
assertNull(callableStatement.getString(2));
assertTrue(callableStatement.wasNull());
reset(callableStatement);
callableStatement.setBoolean(1, true);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("1b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setByte(1, (byte) 'a');
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("97b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setShort(1, (short) 6);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setInt(1, 6);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setLong(1, 6L);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setFloat(1, 6F);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setDouble(1, 6D);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBigDecimal(1, BigDecimal.ONE);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("1b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setTimestamp(1, new Timestamp(0));
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getTimestamp(2);
reset(callableStatement);
callableStatement.setTimestamp(1, new Timestamp(0), Calendar.getInstance());
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getTimestamp(2);
reset(callableStatement);
callableStatement.setBytes(1, new byte[] {(byte) 'a', (byte) 0x45});
callableStatement.setString(2, "c");
callableStatement.execute();
assertEquals("aEc", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBlob(1, new MariaDbBlob("0123".getBytes(), 1, 2));
callableStatement.setString(2, "c");
callableStatement.execute();
assertEquals("12c", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBlob(1, new ByteArrayInputStream("eef".getBytes()));
callableStatement.setString(2, "c");
callableStatement.execute();
assertEquals("eefc", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setDate(1, new Date(0));
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getDate(2);
reset(callableStatement);
callableStatement.setDate(1, new Date(0), Calendar.getInstance());
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getDate(2, Calendar.getInstance());
reset(callableStatement);
callableStatement.setTime(1, new Time(0));
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getTime(2);
reset(callableStatement);
callableStatement.setTime(1, new Time(0), Calendar.getInstance());
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getTime(2);
reset(callableStatement);
callableStatement.setAsciiStream(1, new ByteArrayInputStream("dbc".getBytes()));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("dbcb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setAsciiStream(1, new ByteArrayInputStream("cbc".getBytes()), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("cbb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBinaryStream(1, new ByteArrayInputStream("bef".getBytes()));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("befb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBinaryStream(1, new ByteArrayInputStream("aef".getBytes()), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("aeb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(1, new ByteArrayInputStream("saf".getBytes()));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("safb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(
1, new ByteArrayInputStream("sbf".getBytes()), Types.LONGVARBINARY);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sbfb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(
1, new ByteArrayInputStream("scf".getBytes()), JDBCType.LONGVARBINARY);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("scfb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(1, null);
callableStatement.setString(2, "b");
callableStatement.execute();
assertNull(callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(
1, new ByteArrayInputStream("sdf".getBytes()), Types.LONGVARBINARY, 10);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sdfb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(
1, new ByteArrayInputStream("sea".getBytes()), JDBCType.LONGVARBINARY, 10);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seab", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setCharacterStream(1, new StringReader("seb"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sebb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setClob(1, new MariaDbClob("sec".getBytes(), 0, 16));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("secb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setClob(1, new StringReader("sed"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sedb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setClob(1, new StringReader("sef"), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNClob(1, new MariaDbClob("seg".getBytes(), 0, 16));
callableStatement.setString(2, "c");
callableStatement.execute();
assertEquals("segc", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNClob(1, new StringReader("seh"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sehb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNClob(1, new StringReader("sei"), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setCharacterStream(1, new StringReader("sej"), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNCharacterStream(1, new StringReader("seh"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sehb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNCharacterStream(1, new StringReader("sek"), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setDate(1, new Date(0));
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getDate(2);
reset(callableStatement);
callableStatement.setDate(1, new Date(0), Calendar.getInstance());
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getDate(2, Calendar.getInstance());
reset(callableStatement);
callableStatement.setNull(1, Types.BINARY);
callableStatement.setString(2, "b");
callableStatement.execute();
assertNull(callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNull(1, Types.BINARY, "ttt");
callableStatement.setString(2, "b");
callableStatement.execute();
assertNull(callableStatement.getString(2));
// with named params
callableStatement.registerOutParameter(2, JDBCType.VARCHAR);
callableStatement.setString("t1", "a");
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("ab", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNString("t1", "a");
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("ab", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setURL("t1", new URL("http://a"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("http://ab", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNull("t1", Types.VARCHAR);
callableStatement.setString(2, "b");
callableStatement.execute();
assertNull(callableStatement.getString(2));
assertTrue(callableStatement.wasNull());
reset(callableStatement);
callableStatement.setNull("t1", Types.VARCHAR, "sometype");
callableStatement.setString(2, "b");
callableStatement.execute();
assertNull(callableStatement.getString(2));
assertTrue(callableStatement.wasNull());
reset(callableStatement);
callableStatement.setBoolean("t1", true);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("1b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setByte("t1", (byte) 'a');
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("97b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setShort("t1", (short) 6);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setInt("t1", 6);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setLong("t1", 6L);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setFloat("t1", 6F);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setDouble("t1", 6D);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("6b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBigDecimal("t1", BigDecimal.ONE);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("1b", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setTimestamp("t1", new Timestamp(0));
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getTimestamp("t2");
reset(callableStatement);
callableStatement.setTimestamp("t1", new Timestamp(0), Calendar.getInstance());
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getTimestamp("t2", Calendar.getInstance());
reset(callableStatement);
callableStatement.setBytes("t1", new byte[] {(byte) 'a', (byte) 0x45});
callableStatement.setString(2, "c");
callableStatement.execute();
assertEquals("aEc", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBlob("t1", new MariaDbBlob("0123".getBytes(), 1, 2));
callableStatement.setString(2, "c");
callableStatement.execute();
assertEquals("12c", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBlob("t1", new ByteArrayInputStream("sef".getBytes()));
callableStatement.setString(2, "c");
callableStatement.execute();
assertEquals("sefc", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBlob("t1", new ByteArrayInputStream("sef".getBytes()), 2);
callableStatement.setString(2, "c");
callableStatement.execute();
assertEquals("sec", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setDate("t1", new Date(0));
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getDate("t2");
reset(callableStatement);
callableStatement.setDate("t1", new Date(0), Calendar.getInstance());
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getDate("t2", Calendar.getInstance());
reset(callableStatement);
callableStatement.setTime("t1", new Time(0));
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getTime("t2");
reset(callableStatement);
callableStatement.setTime("t1", new Time(0), Calendar.getInstance());
callableStatement.setString(2, "");
callableStatement.execute();
callableStatement.getTime("t2", Calendar.getInstance());
reset(callableStatement);
callableStatement.setAsciiStream("t1", new ByteArrayInputStream("abc".getBytes()));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("abcb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setAsciiStream("t1", new ByteArrayInputStream("abc".getBytes()), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("abcb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setAsciiStream("t1", new ByteArrayInputStream("abc".getBytes()), 2L);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("abb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBinaryStream("t1", new ByteArrayInputStream("sef".getBytes()));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBinaryStream("t1", new ByteArrayInputStream("sef".getBytes()), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setBinaryStream("t1", new ByteArrayInputStream("sef".getBytes()), 2L);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject("t1", new ByteArrayInputStream("sef".getBytes()));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(
"t1", new ByteArrayInputStream("sef".getBytes()), Types.LONGVARBINARY);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(
"t1", new ByteArrayInputStream("sef".getBytes()), JDBCType.LONGVARBINARY);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(
"t1", new ByteArrayInputStream("sef".getBytes()), Types.LONGVARBINARY, 10);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setObject(
"t1", new ByteArrayInputStream("sef".getBytes()), JDBCType.LONGVARBINARY, 10);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setCharacterStream("t1", new StringReader("sef"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setCharacterStream("t1", new StringReader("sef"), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setCharacterStream("t1", new StringReader("sef"), 2L);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNCharacterStream("t1", new StringReader("sef"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNCharacterStream("t1", new StringReader("sef"), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setDate("t1", new Date(0));
callableStatement.setString(2, "b");
callableStatement.execute();
reset(callableStatement);
callableStatement.setNull("t1", Types.BINARY);
callableStatement.setString(2, "b");
callableStatement.execute();
assertNull(callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNull("t1", Types.BINARY, "ttt");
callableStatement.setString(2, "b");
callableStatement.execute();
assertNull(callableStatement.getString(2));
reset(callableStatement);
callableStatement.setClob("t1", new MariaDbClob("sef".getBytes(), 0, 16));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setClob("t1", new StringReader("sef"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setClob("t1", new StringReader("sef"), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNClob("t1", new MariaDbClob("sef".getBytes(), 0, 16));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNClob("t1", new StringReader("sef"));
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("sefb", callableStatement.getString(2));
reset(callableStatement);
callableStatement.setNClob("t1", new StringReader("sef"), 2);
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("seb", callableStatement.getString(2));
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.setRowId(1, null),
"RowId parameter are not supported");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.setRowId("t1", null),
"RowId parameter are not supported");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.setSQLXML(1, null),
"SQLXML parameter are not supported");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> callableStatement.setSQLXML("t1", null),
"SQLXML parameter are not supported");
}
}
private void reset(CallableStatement callableStatement) throws SQLException {
callableStatement.registerOutParameter(2, JDBCType.VARCHAR);
callableStatement.setString(1, "a");
callableStatement.setString(2, "b");
callableStatement.execute();
assertEquals("ab", callableStatement.getString(2));
}
@Test
public void procedureToString() throws SQLException {
try (CallableStatement callableStatement =
sharedConn.prepareCall("{call basic_proc(?,?,?,?,?,?,?)}")) {
assertEquals(
"ProcedureStatement{sql:'call basic_proc(?,?,?,?,?,?,?)', parameters:[]}",
callableStatement.toString());
callableStatement.registerOutParameter(2, JDBCType.INTEGER);
callableStatement.registerOutParameter(3, JDBCType.INTEGER);
callableStatement.registerOutParameter(5, JDBCType.VARCHAR);
assertEquals(
"ProcedureStatement{sql:'call basic_proc(?,?,?,?,?,?,?)',"
+ " parameters:[null,<OUT>null,<OUT>null,null,<OUT>null]}",
callableStatement.toString());
callableStatement.setBytes(2, new byte[] {(byte) 'a', (byte) 'b'});
callableStatement.setLong(1, 10L);
assertEquals(
"ProcedureStatement{sql:'call basic_proc(?,?,?,?,?,?,?)', parameters:[10,<OUT>_binary"
+ " 'ab',<OUT>null,null,<OUT>null]}",
callableStatement.toString());
}
}
}