Skip to content

Commit

Permalink
Add tests for resultset metadata cache.
Browse files Browse the repository at this point in the history
  • Loading branch information
znep committed Apr 14, 2018
1 parent aec6359 commit 8726099
Showing 1 changed file with 67 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import org.postgresql.PGProperty;
import org.postgresql.PGResultSetMetaData;
import org.postgresql.core.ServerVersion;
import org.postgresql.jdbc.PreferQueryMode;
Expand All @@ -17,6 +18,8 @@
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
Expand All @@ -26,15 +29,49 @@
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;

@RunWith(Parameterized.class)
public class ResultSetMetaDataTest extends BaseTest4 {
Connection conn;
private final Integer databaseMetadataCacheFields;
private final Integer databaseMetadataCacheFieldsMib;

public ResultSetMetaDataTest(Integer databaseMetadataCacheFields, Integer databaseMetadataCacheFieldsMib) {
this.databaseMetadataCacheFields = databaseMetadataCacheFields;
this.databaseMetadataCacheFieldsMib = databaseMetadataCacheFieldsMib;
}

@Parameterized.Parameters(name = "databaseMetadataCacheFields = {0}, databaseMetadataCacheFieldsMib = {1}")
public static Iterable<Object[]> data() {
Collection<Object[]> ids = new ArrayList<Object[]>();
for (Integer fields : new Integer[]{null, 0}) {
for (Integer fieldsMib : new Integer[]{null, 0}) {
ids.add(new Object[]{fields, fieldsMib});
}
}
return ids;
}

@Override
protected void updateProperties(Properties props) {
super.updateProperties(props);
if (databaseMetadataCacheFields != null) {
PGProperty.DATABASE_METADATA_CACHE_FIELDS.set(props, databaseMetadataCacheFields);
}
if (databaseMetadataCacheFieldsMib != null) {
PGProperty.DATABASE_METADATA_CACHE_FIELDS_MIB.set(props, databaseMetadataCacheFieldsMib);
}
}

@Override
public void setUp() throws Exception {
super.setUp();
conn = con;
TestUtil.createTable(conn, "rsmd1", "a int primary key, b text, c decimal(10,2)", true);
TestUtil.createTable(conn, "rsmd_cache", "a int primary key");
TestUtil.createTable(conn, "timetest",
"tm time(3), tmtz timetz, ts timestamp without time zone, tstz timestamp(6) with time zone");

Expand All @@ -57,6 +94,7 @@ public void setUp() throws Exception {
public void tearDown() throws SQLException {
TestUtil.dropTable(conn, "compositetest");
TestUtil.dropTable(conn, "rsmd1");
TestUtil.dropTable(conn, "rsmd_cache");
TestUtil.dropTable(conn, "timetest");
TestUtil.dropTable(conn, "serialtest");
if (TestUtil.haveMinimumServerVersion(conn, ServerVersion.v10)) {
Expand Down Expand Up @@ -268,6 +306,35 @@ public void testIdentityColumn() throws Exception {
Assert.assertTrue(rsmd.isAutoIncrement(1));
}

// Verifies that the field metadatacache will cache when enabled and also functions properly
// when disabled.
@Test
public void testCache() throws Exception {
boolean isCacheDisabled = new Integer(0).equals(databaseMetadataCacheFields)
|| new Integer(0).equals(databaseMetadataCacheFieldsMib);

{
PreparedStatement pstmt = conn.prepareStatement("SELECT a FROM rsmd_cache");
ResultSet rs = pstmt.executeQuery();
PGResultSetMetaData pgrsmd = (PGResultSetMetaData) rs.getMetaData();
assertEquals("a", pgrsmd.getBaseColumnName(1));
rs.close();
}

Statement stmt = conn.createStatement();
stmt.execute("ALTER TABLE rsmd_cache RENAME COLUMN a TO b");
stmt.close();

{
PreparedStatement pstmt = conn.prepareStatement("SELECT b FROM rsmd_cache");
ResultSet rs = pstmt.executeQuery();
PGResultSetMetaData pgrsmd = (PGResultSetMetaData) rs.getMetaData();
// Unless the cache is disabled, we expect to see stale results.
assertEquals(isCacheDisabled ? "b" : "a", pgrsmd.getBaseColumnName(1));
rs.close();
}
}

private void assumePreparedStatementMetadataSupported() {
Assume.assumeTrue("prepared statement metadata is not supported for simple protocol",
preferQueryMode.compareTo(PreferQueryMode.EXTENDED_FOR_PREPARED) >= 0);
Expand Down

0 comments on commit 8726099

Please # to comment.