/*
* Copyright (c) 2007, PostgreSQL Global Development Group
* See the LICENSE file in the project root for more information.
*/
package org.postgresql.test.jdbc4;
import static org.junit.Assert.assertEquals;
import org.postgresql.PGConnection;
import org.postgresql.PGResultSetMetaData;
import org.postgresql.PGStatement;
import org.postgresql.core.Field;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.jdbc2.BaseTest4;
import org.junit.Assume;
import org.junit.Test;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* We don't want to use the binary protocol for one-off queries as it involves another round-trip to
* the server to 'describe' the query. If we use the query enough times (see
* {@link PGConnection#setPrepareThreshold(int)} then we'll change to using the binary protocol to
* save bandwidth and reduce decoding time.
*/
public class BinaryTest extends BaseTest4 {
private ResultSet results;
private PreparedStatement statement;
@Override
public void setUp() throws Exception {
super.setUp();
Assume.assumeTrue("Server-prepared statements are not supported in 'simple protocol only'",
preferQueryMode != PreferQueryMode.SIMPLE);
statement = con.prepareStatement("select 1");
((PGStatement) statement).setPrepareThreshold(5);
}
@Test
public void testPreparedStatement_3() throws Exception {
((PGStatement) statement).setPrepareThreshold(3);
results = statement.executeQuery();
assertEquals(Field.TEXT_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.TEXT_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.TEXT_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.BINARY_FORMAT, getFormat(results));
((PGStatement) statement).setPrepareThreshold(5);
}
@Test
public void testPreparedStatement_1() throws Exception {
((PGStatement) statement).setPrepareThreshold(1);
results = statement.executeQuery();
assertEquals(Field.TEXT_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.BINARY_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.BINARY_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.BINARY_FORMAT, getFormat(results));
((PGStatement) statement).setPrepareThreshold(5);
}
@Test
public void testPreparedStatement_0() throws Exception {
((PGStatement) statement).setPrepareThreshold(0);
results = statement.executeQuery();
assertEquals(Field.TEXT_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.TEXT_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.TEXT_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.TEXT_FORMAT, getFormat(results));
((PGStatement) statement).setPrepareThreshold(5);
}
@Test
public void testPreparedStatement_negative1() throws Exception {
((PGStatement) statement).setPrepareThreshold(-1);
results = statement.executeQuery();
assertEquals(Field.BINARY_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.BINARY_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.BINARY_FORMAT, getFormat(results));
results = statement.executeQuery();
assertEquals(Field.BINARY_FORMAT, getFormat(results));
((PGStatement) statement).setPrepareThreshold(5);
}
@Test
public void testReceiveBinary() throws Exception {
PreparedStatement ps = con.prepareStatement("select ?");
for (int i = 0; i < 10; i++) {
ps.setInt(1, 42 + i);
ResultSet rs = ps.executeQuery();
assertEquals("One row should be returned", true, rs.next());
assertEquals(42 + i, rs.getInt(1));
rs.close();
}
ps.close();
}
private int getFormat(ResultSet results) throws SQLException {
return ((PGResultSetMetaData) results.getMetaData()).getFormat(1);
}
}