This is an automated email from the git hooks/post-receive script. ebourg-guest pushed a commit to annotated tag REL9_3_1102 in repository libpostgresql-jdbc-java.
commit afab0dce7f1e32e6ce3f22693fc36546c56fafa2 Author: Dave Cramer <[email protected]> Date: Thu Apr 24 17:13:45 2014 -0400 backpatch fix for changing datestyle before copy --- org/postgresql/core/v3/QueryExecutorImpl.java | 37 +++++++++++++++++++++++++ org/postgresql/test/jdbc2/CopyTest.java | 40 +++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/org/postgresql/core/v3/QueryExecutorImpl.java b/org/postgresql/core/v3/QueryExecutorImpl.java index 83edac1..1b78707 100644 --- a/org/postgresql/core/v3/QueryExecutorImpl.java +++ b/org/postgresql/core/v3/QueryExecutorImpl.java @@ -1029,6 +1029,43 @@ public class QueryExecutorImpl implements QueryExecutor { // keep receiving since we expect a CommandComplete block = true; break; + case 'S': // Parameter Status + { + int l_len = pgStream.ReceiveInteger4(); + String name = pgStream.ReceiveString(); + String value = pgStream.ReceiveString(); + if (logger.logDebug()) + logger.debug(" <=BE ParameterStatus(" + name + " = " + value + ")"); + + if (name.equals("client_encoding") && !value.equalsIgnoreCase("UTF8") && !allowEncodingChanges) + { + protoConnection.close(); // we're screwed now; we can't trust any subsequent string. + error = new PSQLException(GT.tr("The server''s client_encoding parameter was changed to {0}. The JDBC driver requires client_encoding to be UTF8 for correct operation.", value), PSQLState.CONNECTION_FAILURE); + endReceiving = true; + } + + if (name.equals("DateStyle") && !value.startsWith("ISO,")) + { + protoConnection.close(); // we're screwed now; we can't trust any subsequent date. + error = new PSQLException(GT.tr("The server''s DateStyle parameter was changed to {0}. The JDBC driver requires DateStyle to begin with ISO for correct operation.", value), PSQLState.CONNECTION_FAILURE); + endReceiving = true; + } + + if (name.equals("standard_conforming_strings")) + { + if (value.equals("on")) + protoConnection.setStandardConformingStrings(true); + else if (value.equals("off")) + protoConnection.setStandardConformingStrings(false); + else + { + protoConnection.close(); // we're screwed now; we don't know how to escape string literals + error = new PSQLException(GT.tr("The server''s standard_conforming_strings parameter was reported as {0}. The JDBC driver expected on or off.", value), PSQLState.CONNECTION_FAILURE); + endReceiving = true; + } + } + } + break; case 'Z': // ReadyForQuery: After FE:CopyDone => BE:CommandComplete diff --git a/org/postgresql/test/jdbc2/CopyTest.java b/org/postgresql/test/jdbc2/CopyTest.java index 88cefe7..0f99f5c 100644 --- a/org/postgresql/test/jdbc2/CopyTest.java +++ b/org/postgresql/test/jdbc2/CopyTest.java @@ -8,6 +8,7 @@ package org.postgresql.test.jdbc2; import java.sql.Connection; +import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -17,6 +18,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.io.IOException; +import java.io.PrintWriter; import java.io.StringReader; import junit.framework.TestCase; @@ -54,6 +56,8 @@ public class CopyTest extends TestCase { } protected void setUp() throws Exception { + + con = TestUtil.openDB(); TestUtil.createTable(con, "copytest", "stringvalue text, intvalue int, numvalue numeric(5,2)"); @@ -269,5 +273,41 @@ public class CopyTest extends TestCase { con.rollback(); assertEquals(0, getCount()); } + + public void testChangeDateStyle() throws SQLException { + + + try + { + con.setAutoCommit(false); + con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); + CopyManager manager = con.unwrap(PGConnection.class).getCopyAPI(); + + Statement stmt = con.createStatement(); + + stmt.execute("SET DateStyle = 'ISO, DMY'"); + + + // I expect an SQLException + String sql = "COPY copytest FROM STDIN with xxx (format 'csv')"; + CopyIn cp = manager.copyIn(sql); + for(int i=0; i<origData.length; i++) { + byte[] buf = origData[i].getBytes(); + cp.writeToCopy(buf, 0, buf.length); + } + + long count1 = cp.endCopy(); + long count2 = cp.getHandledRowCount(); + con.commit(); + } + catch (SQLException ex ) + { + + // the with xxx is a syntax error which shoud return a state of 42601 + // if this fails the 'S' command is not being handled in the copy manager query handler + assertEquals("42601",ex.getSQLState()); + con.rollback(); + } + } } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

