[libpostgresql-jdbc-java] 82/128: Make PreparedStatement.setObject(pos, value, Types.VARCHAR) respect stringtype=unspecified

Emmanuel Bourg ebourg-guest at moszumanska.debian.org
Mon Jan 9 10:18:33 UTC 2017


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to annotated tag REL9_3_1100
in repository libpostgresql-jdbc-java.

commit b8f72a6e06800091b19cb1f55e2152526f3076cb
Author: Tom Dunstan <github at tomd.cc>
Date:   Sun Jul 7 12:53:43 2013 +0930

    Make PreparedStatement.setObject(pos, value, Types.VARCHAR) respect stringtype=unspecified
---
 org/postgresql/jdbc2/AbstractJdbc2Statement.java   |  10 +-
 org/postgresql/test/TestUtil.java                  |  45 +++++++
 org/postgresql/test/jdbc3/Jdbc3TestSuite.java      |   1 +
 .../test/jdbc3/StringTypeParameterTest.java        | 133 +++++++++++++++++++++
 4 files changed, 186 insertions(+), 3 deletions(-)

diff --git a/org/postgresql/jdbc2/AbstractJdbc2Statement.java b/org/postgresql/jdbc2/AbstractJdbc2Statement.java
index 7671cf6..30252dd 100644
--- a/org/postgresql/jdbc2/AbstractJdbc2Statement.java
+++ b/org/postgresql/jdbc2/AbstractJdbc2Statement.java
@@ -1388,7 +1388,11 @@ public abstract class AbstractJdbc2Statement implements BaseStatement
     public void setString(int parameterIndex, String x) throws SQLException
     {
         checkClosed();
-        setString(parameterIndex, x, (connection.getStringVarcharFlag() ? Oid.VARCHAR : Oid.UNSPECIFIED));
+        setString(parameterIndex, x, getStringType());
+    }
+
+    private int getStringType() {
+        return (connection.getStringVarcharFlag() ? Oid.VARCHAR : Oid.UNSPECIFIED);
     }
 
     protected void setString(int parameterIndex, String x, int oid) throws SQLException
@@ -1398,7 +1402,7 @@ public abstract class AbstractJdbc2Statement implements BaseStatement
         if (x == null)
         {
             if ( adjustIndex )
-                parameterIndex--;   
+                parameterIndex--;
             preparedParameters.setNull( parameterIndex, oid);
         }
         else
@@ -1786,7 +1790,7 @@ public abstract class AbstractJdbc2Statement implements BaseStatement
 	            break;
 	        case Types.VARCHAR:
 	        case Types.LONGVARCHAR:
-	            setString(parameterIndex, pgType.toString(), Oid.VARCHAR);
+	            setString(parameterIndex, pgType.toString(), getStringType());
 	            break;
 	        case Types.DATE:
 	            if (in instanceof java.sql.Date)
diff --git a/org/postgresql/test/TestUtil.java b/org/postgresql/test/TestUtil.java
index 2ef7ba6..4c42aee 100644
--- a/org/postgresql/test/TestUtil.java
+++ b/org/postgresql/test/TestUtil.java
@@ -313,6 +313,33 @@ public class TestUtil
         }
     }
 
+    /**
+     * Helper creates an enum type
+     * @param con Connection
+     * @param name String
+     * @param values String
+     * @throws SQLException
+     */
+
+    public static void createEnumType( Connection con,
+                                       String name,
+                                       String values) throws SQLException
+    {
+        Statement st = con.createStatement();
+        try
+        {
+            dropType(con, name);
+
+
+            // Now create the table
+            st.executeUpdate("create type " + name + " as enum (" + values + ")");
+        }
+        finally
+        {
+            st.close();
+        }
+    }
+
     /*
      * drop a sequence because older versions don't have dependency
      * information for serials
@@ -359,6 +386,24 @@ public class TestUtil
     }
 
     /*
+     * Helper - drops a type
+     */
+    public static void dropType(Connection con, String type) throws SQLException
+    {
+        Statement stmt = con.createStatement();
+        try
+        {
+            String sql = "DROP TYPE " + type;
+            stmt.executeUpdate(sql);
+        }
+        catch (SQLException ex)
+        {
+            if (!con.getAutoCommit())
+                throw ex;
+        }
+    }
+
+    /*
      * Helper - generates INSERT SQL - very simple
      */
     public static String insertSQL(String table, String values)
diff --git a/org/postgresql/test/jdbc3/Jdbc3TestSuite.java b/org/postgresql/test/jdbc3/Jdbc3TestSuite.java
index 6d22d41..a4ab275 100644
--- a/org/postgresql/test/jdbc3/Jdbc3TestSuite.java
+++ b/org/postgresql/test/jdbc3/Jdbc3TestSuite.java
@@ -50,6 +50,7 @@ public class Jdbc3TestSuite extends TestSuite
         suite.addTestSuite(Jdbc3BlobTest.class);
         suite.addTestSuite(DatabaseMetaDataTest.class);
 		suite.addTestSuite(SendRecvBufferSizeTest.class);
+        suite.addTestSuite(StringTypeParameterTest.class);
         return suite;
     }
 }
diff --git a/org/postgresql/test/jdbc3/StringTypeParameterTest.java b/org/postgresql/test/jdbc3/StringTypeParameterTest.java
new file mode 100644
index 0000000..1b887d3
--- /dev/null
+++ b/org/postgresql/test/jdbc3/StringTypeParameterTest.java
@@ -0,0 +1,133 @@
+/*-------------------------------------------------------------------------
+*
+* Copyright (c) 2005-2011, PostgreSQL Global Development Group
+*
+*
+*-------------------------------------------------------------------------
+*/
+package org.postgresql.test.jdbc3;
+
+import junit.framework.TestCase;
+import org.postgresql.test.TestUtil;
+
+import java.sql.*;
+import java.util.Properties;
+
+public class StringTypeParameterTest extends TestCase {
+
+    private Connection _conn;
+
+    public StringTypeParameterTest(String name) {
+        super(name);
+    }
+
+    protected void setUp(String stringType) throws Exception {
+        Properties props = new Properties();
+        if(stringType != null) {
+            props.put("stringtype", stringType);
+        }
+        _conn = TestUtil.openDB(props);
+        TestUtil.createEnumType(_conn, "mood", "'happy', 'sad'");
+        TestUtil.createTable(_conn, "stringtypetest", "m mood");
+    }
+
+    protected void tearDown() throws SQLException {
+        if(_conn != null) {
+            TestUtil.dropTable(_conn, "stringtypetest");
+            TestUtil.dropType(_conn, "mood");
+            TestUtil.closeDB(_conn);
+        }
+    }
+
+    public void testParameterStringTypeVarchar() throws Exception {
+        if (!TestUtil.isProtocolVersion(_conn, 3))
+            return;
+        testParameterVarchar("varchar");
+    }
+
+    public void testParameterStringTypeNotSet() throws Exception {
+        if (!TestUtil.isProtocolVersion(_conn, 3))
+            return;
+        testParameterVarchar(null);
+    }
+
+    private void testParameterVarchar(String param) throws Exception {
+        setUp(param);
+
+        PreparedStatement update = _conn.prepareStatement("insert into stringtypetest (m) values (?)");
+        update.setString(1, "sad");
+        try {
+            update.executeUpdate();
+            fail("Expected exception thrown");
+        } catch(SQLException e) {
+            // expected
+        }
+
+        update.clearParameters();
+        update.setObject(1, "sad", Types.VARCHAR);
+        try {
+            update.executeUpdate();
+            fail("Expected exception thrown");
+        } catch(SQLException e) {
+            // expected
+        }
+
+        update.clearParameters();
+        update.setObject(1, "happy", Types.OTHER);
+        update.executeUpdate();
+        // all good
+        update.close();
+
+        PreparedStatement query = _conn.prepareStatement("select * from stringtypetest where m = ? or m = ?");
+        query.setString(1, "sad");
+        try {
+            query.executeQuery();
+            fail("Expected exception thrown");
+        } catch(SQLException e) {
+            // expected
+        }
+
+        query.clearParameters();
+        query.setObject(2, "sad", Types.VARCHAR);
+        try {
+            query.executeQuery();
+            fail("Expected exception thrown");
+        } catch(SQLException e) {
+            // expected
+        }
+
+        query.clearParameters();
+        query.setObject(1, "happy", Types.OTHER);
+        query.executeQuery().close();
+        // all good
+        query.close();
+
+    }
+
+    public void testParameterUnspecified() throws Exception {
+        setUp("unspecified");
+
+        PreparedStatement update = _conn.prepareStatement("insert into stringtypetest (m) values (?)");
+        update.setString(1, "happy");
+        update.executeUpdate();
+        // all good
+
+        update.clearParameters();
+        update.setObject(1, "happy", Types.VARCHAR);
+        update.executeUpdate();
+        // all good
+        update.close();
+
+        PreparedStatement query = _conn.prepareStatement("select * from stringtypetest where m = ?");
+        query.setString(1, "happy");
+        query.executeQuery().close();
+
+        query.clearParameters();
+        query.setObject(1, "happy", Types.VARCHAR);
+        query.executeQuery().close();
+
+        // all good
+        query.close();
+
+    }
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git



More information about the pkg-java-commits mailing list