blob: 6fac7d8c0015af0550d4f2e1930dd020fbf31aef [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.codec;
import static org.junit.jupiter.api.Assertions.*;
import java.io.Reader;
import java.io.StringReader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.*;
import java.time.*;
import java.util.UUID;
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.Statement;
import org.mariadb.jdbc.integration.Common;
import org.mariadb.jdbc.util.constants.Capabilities;
public class UuidCodecTest extends CommonCodecTest {
@AfterAll
public static void drop() throws SQLException {
Statement stmt = sharedConn.createStatement();
stmt.execute("DROP TABLE IF EXISTS UuidCodec");
stmt.execute("DROP TABLE IF EXISTS UuidCodec2");
}
@BeforeAll
public static void beforeAll2() throws SQLException {
drop();
Assumptions.assumeTrue(
isMariaDBServer()
&& minVersion(10, 7, 0)
&& hasCapability(Capabilities.EXTENDED_TYPE_INFO));
Statement stmt = sharedConn.createStatement();
stmt.execute("CREATE TABLE UuidCodec (t1 UUID, t2 UUID, t3 UUID, t4 UUID)");
stmt.execute("CREATE TABLE UuidCodec2 (t1 UUID)");
stmt.execute(
"INSERT INTO UuidCodec VALUES ('123e4567-e89b-12d3-a456-426655440000',"
+ " '93aac041-1a14-11ec-ab4e-f859713e4be4', 'ffffffff-ffff-ffff-ffff-fffffffffffe',"
+ " null)");
}
private ResultSet get() throws SQLException {
Statement stmt = sharedConn.createStatement();
stmt.execute("START TRANSACTION"); // if MAXSCALE ensure using WRITER
stmt.closeOnCompletion();
ResultSet rs =
stmt.executeQuery(
"select t1 as t1alias, t2 as t2alias, t3 as t3alias, t4 as t4alias from UuidCodec");
assertTrue(rs.next());
sharedConn.commit();
return rs;
}
private ResultSet getAdd(String additional) throws SQLException {
try (Connection con = createCon(additional)) {
java.sql.Statement stmt = con.createStatement();
stmt.execute("START TRANSACTION"); // if MAXSCALE ensure using WRITER
stmt.closeOnCompletion();
ResultSet rs =
stmt.executeQuery(
"select t1 as t1alias, t2 as t2alias, t3 as t3alias, t4 as t4alias from UuidCodec");
assertTrue(rs.next());
con.commit();
return rs;
}
}
private ResultSet getPrepare(Connection con) throws SQLException {
java.sql.Statement stmt = con.createStatement();
stmt.execute("START TRANSACTION"); // if MAXSCALE ensure using WRITER
PreparedStatement preparedStatement =
con.prepareStatement(
"select t1 as t1alias, t2 as t2alias, t3 as t3alias, t4 as t4alias from UuidCodec"
+ " WHERE 1 > ?");
preparedStatement.closeOnCompletion();
preparedStatement.setInt(1, 0);
ResultSet rs = preparedStatement.executeQuery();
assertTrue(rs.next());
con.commit();
return rs;
}
@Test
public void getObject() throws Exception {
getObject(get());
}
@Test
public void getObjectPrepare() throws Exception {
getObject(getPrepare(sharedConn));
getObject(getPrepare(sharedConnBinary));
try (Connection con = createCon("&uuidAsString=1")) {
getObjectString(getPrepare(con));
}
}
public void getObject(ResultSet rs) throws Exception {
assertEquals(UUID.fromString("123e4567-e89b-12d3-a456-426655440000"), rs.getObject(1));
assertFalse(rs.wasNull());
assertEquals(UUID.fromString("93aac041-1a14-11ec-ab4e-f859713e4be4"), rs.getObject(2));
assertEquals(UUID.fromString("93aac041-1a14-11ec-ab4e-f859713e4be4"), rs.getObject("t2alias"));
assertFalse(rs.wasNull());
assertNull(rs.getObject(4));
assertEquals(
UUID.fromString("ffffffff-ffff-ffff-ffff-fffffffffffe"), rs.getObject(3, UUID.class));
assertEquals(UUID.class, rs.getObject(3, UUID.class).getClass());
}
public void getObjectString(ResultSet rs) throws Exception {
assertEquals("123e4567-e89b-12d3-a456-426655440000", rs.getObject(1));
assertFalse(rs.wasNull());
assertEquals("93aac041-1a14-11ec-ab4e-f859713e4be4", rs.getObject(2));
assertEquals("93aac041-1a14-11ec-ab4e-f859713e4be4", rs.getObject("t2alias"));
assertFalse(rs.wasNull());
assertNull(rs.getObject(4));
assertEquals("ffffffff-ffff-ffff-ffff-fffffffffffe", rs.getObject(3));
assertEquals(UUID.class, rs.getObject(3, UUID.class).getClass());
}
@Test
public void getObjectType() throws Exception {
getObjectType(get());
}
@Test
public void getObjectTypePrepare() throws Exception {
getObjectType(getPrepare(sharedConn));
getObjectType(getPrepare(sharedConnBinary));
}
public void getObjectType(ResultSet rs) throws Exception {
testErrObject(rs, Integer.class);
testObject(rs, String.class, "123e4567-e89b-12d3-a456-426655440000");
testErrObject(rs, Long.class);
testErrObject(rs, Short.class);
testErrObject(rs, BigDecimal.class);
testErrObject(rs, BigInteger.class);
testErrObject(rs, Double.class);
testErrObject(rs, Float.class);
testErrObject(rs, Byte.class);
testObject(rs, Reader.class, new StringReader("123e4567-e89b-12d3-a456-426655440000"));
testErrObject(rs, LocalDate.class);
testErrObject(rs, LocalDateTime.class);
testErrObject(rs, LocalTime.class);
testErrObject(rs, Time.class);
testErrObject(rs, Date.class);
testErrObject(rs, ZonedDateTime.class);
testErrObject(rs, OffsetDateTime.class);
testErrObject(rs, OffsetTime.class);
testErrObject(rs, java.util.Date.class);
}
@Test
public void getString() throws SQLException {
getString(get());
}
@Test
public void getStringPrepare() throws SQLException {
getString(getPrepare(sharedConn));
getString(getPrepare(sharedConnBinary));
try (Connection con = createCon("&uuidAsString=1")) {
getString(getPrepare(con));
}
}
public void getString(ResultSet rs) throws SQLException {
assertEquals("123e4567-e89b-12d3-a456-426655440000", rs.getObject(1, String.class));
assertFalse(rs.wasNull());
assertEquals("93aac041-1a14-11ec-ab4e-f859713e4be4", rs.getString(2));
assertEquals("93aac041-1a14-11ec-ab4e-f859713e4be4", rs.getString("t2alias"));
assertFalse(rs.wasNull());
assertNull(rs.getObject(4));
assertEquals("ffffffff-ffff-ffff-ffff-fffffffffffe", rs.getString(3));
assertEquals(String.class, rs.getString(3).getClass());
}
@Test
public void getUuid() throws SQLException {
getUuid(get());
}
@Test
public void getUuidPrepare() throws SQLException {
getUuid(getPrepare(sharedConn));
getUuid(getPrepare(sharedConnBinary));
}
public void getUuid(ResultSet rs) throws SQLException {
assertEquals(
UUID.fromString("123e4567-e89b-12d3-a456-426655440000"), rs.getObject(1, UUID.class));
assertFalse(rs.wasNull());
assertEquals(
UUID.fromString("93aac041-1a14-11ec-ab4e-f859713e4be4"), rs.getObject(2, UUID.class));
assertEquals(
UUID.fromString("93aac041-1a14-11ec-ab4e-f859713e4be4"),
rs.getObject("t2alias", UUID.class));
assertFalse(rs.wasNull());
assertNull(rs.getObject(4, UUID.class));
assertEquals(
UUID.fromString("ffffffff-ffff-ffff-ffff-fffffffffffe"), rs.getObject(3, UUID.class));
assertEquals(UUID.class, rs.getObject(3, UUID.class).getClass());
}
@Test
public void getInt() throws SQLException {
getInt(get());
}
@Test
public void getIntPrepare() throws SQLException {
getInt(getPrepare(sharedConn));
getInt(getPrepare(sharedConnBinary));
}
public void getInt(ResultSet rs) throws SQLException {
Common.assertThrowsContains(
SQLDataException.class, () -> rs.getInt(1), "Data type UUID cannot be decoded as Integer");
assertFalse(rs.wasNull());
}
@Test
public void getLong() throws SQLException {
getLong(get());
}
@Test
public void getLongPrepare() throws SQLException {
getLong(getPrepare(sharedConn));
getLong(getPrepare(sharedConnBinary));
}
public void getLong(ResultSet rs) throws SQLException {
Common.assertThrowsContains(
SQLDataException.class, () -> rs.getLong(1), "Data type UUID cannot be decoded as Long");
assertFalse(rs.wasNull());
}
@Test
public void getFloat() throws SQLException {
getFloat(get());
}
@Test
public void getFloatPrepare() throws SQLException {
getFloat(getPrepare(sharedConn));
getFloat(getPrepare(sharedConnBinary));
}
public void getFloat(ResultSet rs) throws SQLException {
Common.assertThrowsContains(
SQLDataException.class, () -> rs.getFloat(1), "Data type UUID cannot be decoded as Float");
assertFalse(rs.wasNull());
}
@Test
public void getDouble() throws SQLException {
getDouble(get());
}
@Test
public void getDoublePrepare() throws SQLException {
getDouble(getPrepare(sharedConn));
getDouble(getPrepare(sharedConnBinary));
}
public void getDouble(ResultSet rs) throws SQLException {
Common.assertThrowsContains(
SQLDataException.class,
() -> rs.getDouble(1),
"Data type UUID cannot be decoded as Double");
assertFalse(rs.wasNull());
}
@Test
public void getBigDecimal() throws SQLException {
getBigDecimal(get());
}
@Test
public void getBigDecimalPrepare() throws SQLException {
getBigDecimal(getPrepare(sharedConn));
getBigDecimal(getPrepare(sharedConnBinary));
}
public void getBigDecimal(ResultSet rs) throws SQLException {
Common.assertThrowsContains(
SQLDataException.class,
() -> rs.getBigDecimal(1),
"value '123e4567-e89b-12d3-a456-426655440000' cannot be decoded as BigDecimal");
assertFalse(rs.wasNull());
}
@Test
public void getDate() throws SQLException {
getDate(get());
}
@Test
public void getDatePrepare() throws SQLException {
getDate(getPrepare(sharedConn));
getDate(getPrepare(sharedConnBinary));
}
public void getDate(ResultSet rs) throws SQLException {
Common.assertThrowsContains(
SQLDataException.class, () -> rs.getDate(1), "Data type UUID cannot be decoded as Date");
assertFalse(rs.wasNull());
}
@Test
public void getTime() throws SQLException {
getTime(get());
}
@Test
public void getTimePrepare() throws SQLException {
getTime(getPrepare(sharedConn));
getTime(getPrepare(sharedConnBinary));
}
public void getTime(ResultSet rs) throws SQLException {
Common.assertThrowsContains(
SQLDataException.class, () -> rs.getTime(1), "Data type UUID cannot be decoded as Time");
assertFalse(rs.wasNull());
}
@Test
public void getMetaData() throws SQLException {
ResultSet rs = get();
ResultSetMetaData meta = rs.getMetaData();
assertEquals("uuid", meta.getColumnTypeName(1));
assertEquals(sharedConn.getCatalog(), meta.getCatalogName(1));
assertEquals("java.util.UUID", meta.getColumnClassName(1));
assertEquals("t1alias", meta.getColumnLabel(1));
assertEquals("t1", meta.getColumnName(1));
assertEquals(Types.OTHER, meta.getColumnType(1));
assertEquals(4, meta.getColumnCount());
assertEquals(36, meta.getPrecision(1));
assertEquals(0, meta.getScale(1));
assertEquals("", meta.getSchemaName(1));
assertEquals(36, meta.getColumnDisplaySize(1));
rs = getAdd("&uuidAsString=True");
meta = rs.getMetaData();
assertEquals("uuid", meta.getColumnTypeName(1));
assertEquals(sharedConn.getCatalog(), meta.getCatalogName(1));
assertEquals("java.lang.String", meta.getColumnClassName(1));
assertEquals("t1alias", meta.getColumnLabel(1));
assertEquals("t1", meta.getColumnName(1));
assertEquals(Types.CHAR, meta.getColumnType(1));
assertEquals(4, meta.getColumnCount());
assertEquals(36, meta.getPrecision(1));
assertEquals(0, meta.getScale(1));
assertEquals("", meta.getSchemaName(1));
assertEquals(36, meta.getColumnDisplaySize(1));
}
@Test
public void sendParam() throws Exception {
sendParam(sharedConn);
sendParam(sharedConnBinary);
}
private void sendParam(Connection con) throws Exception {
java.sql.Statement stmt = con.createStatement();
stmt.execute("TRUNCATE TABLE UuidCodec2");
stmt.execute("START TRANSACTION"); // if MAXSCALE ensure using WRITER
try (PreparedStatement prep = con.prepareStatement("INSERT INTO UuidCodec2(t1) VALUES (?)")) {
prep.setObject(1, UUID.fromString("123e4567-e89b-12d3-a456-426655440000"));
prep.execute();
prep.setString(1, "123e4568-e89b-12d3-a456-426655440000");
prep.execute();
prep.setObject(1, null);
prep.execute();
}
ResultSet rs =
con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)
.executeQuery("SELECT * FROM UuidCodec2");
assertTrue(rs.next());
assertEquals("123e4567-e89b-12d3-a456-426655440000", rs.getString(1));
assertTrue(rs.next());
assertEquals("123e4568-e89b-12d3-a456-426655440000", rs.getString(1));
assertTrue(rs.next());
assertNull(rs.getString(1));
con.commit();
}
}