/*
* Copyright (c) 2017, PostgreSQL Global Development Group
* See the LICENSE file in the project root for more information.
*/
package org.postgresql.test.jdbc42;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.postgresql.test.jdbc2.BaseTest4;
import org.junit.Test;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Tests for JDBC 4.2 features in {@link org.postgresql.jdbc.PgCallableStatement}.
*/
public class Jdbc42CallableStatementTest extends BaseTest4 {
@Override
public void setUp() throws Exception {
super.setUp();
try (Statement stmt = con.createStatement();) {
stmt.execute(
"CREATE OR REPLACE FUNCTION testspg__getResultSetWithoutArg() "
+ "RETURNS refcursor AS ' "
+ "declare ref refcursor;"
+ "begin OPEN ref FOR SELECT 1; RETURN ref; end; ' LANGUAGE plpgsql;");
}
}
final String func = "{ ? = call ";
final String pkgName = "testspg__";
@Override
public void tearDown() throws SQLException {
try (Statement stmt = con.createStatement()) {
stmt.execute("drop FUNCTION testspg__getResultSetWithoutArg ();");
}
super.tearDown();
}
@Test
public void testGetResultSetWithoutArg() throws SQLException {
assumeCallableStatementsSupported();
try (CallableStatement call = con.prepareCall(func + pkgName + "getResultSetWithoutArg () }")) {
con.setAutoCommit(false); // ref cursors only work if auto commit is off
call.registerOutParameter(1, Types.REF_CURSOR);
call.execute();
List<Integer> values = new ArrayList<>(1);
try (ResultSet rs = call.getObject(1, ResultSet.class)) {
while (rs.next()) {
values.add(rs.getInt(1));
}
}
assertEquals(Collections.singletonList(1), values);
} finally {
con.setAutoCommit(true);
}
}
@Test
public void testGetResultSetWithoutArgUnsupportedConversion() throws SQLException {
assumeCallableStatementsSupported();
try (CallableStatement call = con.prepareCall(func + pkgName + "getResultSetWithoutArg () }")) {
con.setAutoCommit(false); // ref cursors only work if auto commit is off
call.registerOutParameter(1, Types.REF_CURSOR);
call.execute();
try {
// this should never be allowed even if more types will be implemented in the future
call.getObject(1, ResultSetMetaData.class);
fail("conversion from ResultSet to ResultSetMetaData should not be supported");
} catch (SQLException e) {
// should reach
}
} finally {
con.setAutoCommit(true);
}
}
}