blob: 3c5fd24fa20437464542fef8a01abe036c2633ac [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.sql.*;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mariadb.jdbc.Statement;
public class ParameterMetaDataTest extends Common {
@AfterAll
public static void after2() throws SQLException {
sharedConn.createStatement().execute("DROP TABLE IF EXISTS parameter_meta");
}
@BeforeAll
public static void beforeAll2() throws SQLException {
after2();
Statement stmt = sharedConn.createStatement();
stmt.execute(
"CREATE TABLE parameter_meta ("
+ "id int not null primary key auto_increment, "
+ "test varchar(20), "
+ "t2 DECIMAL(10,3))");
}
@Test
public void parameterMetaDataTypeNotAvailable() throws Exception {
try (org.mariadb.jdbc.Connection con = createCon("&useServerPrepStmts=false")) {
parameterMetaDataTypeNotAvailable(con);
}
try (org.mariadb.jdbc.Connection con = createCon("&useServerPrepStmts")) {
parameterMetaDataTypeNotAvailable(con);
}
}
private void parameterMetaDataTypeNotAvailable(org.mariadb.jdbc.Connection con)
throws SQLException {
String query = "SELECT * FROM parameter_meta WHERE test = ? and id = ?";
try (PreparedStatement prepStmt = con.prepareStatement(query)) {
ParameterMetaData parameterMetaData = prepStmt.getParameterMetaData();
assertEquals(2, parameterMetaData.getParameterCount());
Common.assertThrowsContains(
SQLException.class,
() -> parameterMetaData.getParameterType(1),
"Getting parameter type metadata are not supported");
Common.assertThrowsContains(
SQLException.class, () -> parameterMetaData.isNullable(-1), "Wrong index position");
Common.assertThrowsContains(
SQLException.class, () -> parameterMetaData.isNullable(3), "Wrong index position");
}
}
@Test
public void parameterMetaDataNotPreparable() throws Exception {
try (org.mariadb.jdbc.Connection con = createCon("&useServerPrepStmts=false")) {
// statement that cannot be prepared
try (PreparedStatement pstmt =
con.prepareStatement("select TMP.field1 from (select ? from dual) TMP")) {
ParameterMetaData meta = pstmt.getParameterMetaData();
assertEquals(1, meta.getParameterCount());
assertEquals(ParameterMetaData.parameterModeIn, meta.getParameterMode(1));
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getParameterTypeName(1),
"Unknown parameter metadata type name");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> meta.getParameterClassName(1),
"Unknown parameter metadata class name");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> meta.getParameterType(1),
"Getting parameter type metadata is not supported");
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getPrecision(1),
"Unknown parameter metadata precision");
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getScale(1),
"Unknown parameter metadata scale");
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getParameterMode(0),
"Wrong index position. Is 0 but must be in 1-1 range");
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getParameterTypeName(0),
"Wrong index position. Is 0 but must be in 1-1 range");
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getParameterMode(0),
"Wrong index position. Is 0 but must be in 1-1 range");
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getParameterClassName(0),
"Wrong index position. Is 0 but must be in 1-1 range");
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getParameterType(2),
"Wrong index position. Is 2 but must be in 1-1 range");
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getPrecision(0),
"Wrong index position. Is 0 but must be in 1-1 range");
Common.assertThrowsContains(
SQLSyntaxErrorException.class,
() -> meta.getScale(0),
"Wrong index position. Is 0 but must be in 1-1 range");
}
}
try (org.mariadb.jdbc.Connection con = createCon("&useServerPrepStmts")) {
// statement that cannot be prepared
try (PreparedStatement pstmt =
con.prepareStatement("select TMP.field1 from (select ? from dual) TMP")) {
try {
pstmt.getParameterMetaData();
fail();
} catch (SQLSyntaxErrorException e) {
// eat
}
} catch (SQLSyntaxErrorException e) {
// eat
}
}
}
@Test
public void parameterMetaDataBasic() throws SQLException {
String query = "SELECT * FROM parameter_meta WHERE test = ? and id = ? and t2 = ?";
// Parameter type are not sent by server.
// See https://jira.mariadb.org/browse/CONJ-568 and https://jira.mariadb.org/browse/MDEV-15031
// so only basic info like parameter number are retrieved.
try (PreparedStatement prepStmt = sharedConnBinary.prepareStatement(query)) {
prepStmt.setString(1, "");
prepStmt.setInt(2, 1);
prepStmt.setInt(3, 1);
prepStmt.executeQuery();
ParameterMetaData meta = prepStmt.getParameterMetaData();
assertEquals(3, meta.getParameterCount());
if (!isMariaDBServer() && (minVersion(8, 0, 22) && !minVersion(8, 0, 30))) {
assertEquals(16383, meta.getPrecision(1));
assertEquals(31, meta.getScale(1));
} else {
// Xpand datatype as issue https://jira.mariadb.org/browse/XPT-279
if (!isXpand()) {
assertEquals(0, meta.getPrecision(1));
assertEquals(0, meta.getScale(1));
}
}
assertTrue(meta.isSigned(1));
assertEquals(ParameterMetaData.parameterNullable, meta.isNullable(1));
assertEquals(ParameterMetaData.parameterModeIn, meta.getParameterMode(1));
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> meta.getParameterType(1),
"Getting parameter type " + "metadata are not supported");
Common.assertThrowsContains(
SQLFeatureNotSupportedException.class,
() -> meta.getParameterClassName(1),
"Unknown parameter metadata class name");
Common.assertThrowsContains(
SQLException.class,
() -> meta.getScale(20),
"Wrong index position. Is 20 but must be in 1-3 range");
Common.assertThrowsContains(
SQLException.class,
() -> meta.getPrecision(20),
"Wrong index position. Is 20 but must be in 1-3 range");
Common.assertThrowsContains(
SQLException.class,
() -> meta.isSigned(20),
"Wrong index position. Is 20 but must be in 1-3 range");
Common.assertThrowsContains(
SQLException.class,
() -> meta.isNullable(20),
"Wrong index position. Is 20 but must be in 1-3 range");
Common.assertThrowsContains(
SQLException.class,
() -> meta.getParameterTypeName(20),
"Wrong index position. Is 20 but must be in 1-3 range");
Common.assertThrowsContains(
SQLException.class,
() -> meta.getParameterMode(20),
"Wrong index position. Is 20 but must be in 1-3 range");
meta.unwrap(java.sql.ParameterMetaData.class);
Common.assertThrowsContains(
SQLException.class,
() -> meta.unwrap(String.class),
"The receiver is not a wrapper for java.lang.String");
}
}
}