]> granicus.if.org Git - postgresql/commitdiff
patch from Kris Jurka to fix large object 7.1 compatible protocol issues
authorDave Cramer <davec@fastcrypt.com>
Wed, 17 Dec 2003 15:38:42 +0000 (15:38 +0000)
committerDave Cramer <davec@fastcrypt.com>
Wed, 17 Dec 2003 15:38:42 +0000 (15:38 +0000)
modified test case from Alexey Yudichev to be part of the testsuite

src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java
src/interfaces/jdbc/org/postgresql/largeobject/LargeObjectManager.java
src/interfaces/jdbc/org/postgresql/test/jdbc2/Jdbc2TestSuite.java
src/interfaces/jdbc/org/postgresql/test/jdbc2/OID74Test.java [new file with mode: 0644]

index e69529fc05dcd0c8149ce19d04f183d33aa13b8e..44243f7b8ea41a34f9245a45a87792f21154eeb8 100644 (file)
@@ -6,7 +6,7 @@
  * Copyright (c) 2003, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java,v 1.17 2003/11/29 19:52:09 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java,v 1.18 2003/12/17 15:38:42 davec Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -63,7 +63,7 @@ public class Fastpath
         */
        public Object fastpath(int fnid, boolean resulttype, FastpathArg[] args) throws SQLException
        {
-               if (conn.haveMinimumServerVersion("7.4")) {
+               if (conn.haveMinimumCompatibleVersion("7.4")) {
                        return fastpathV3(fnid, resulttype, args);
                } else {
                        return fastpathV2(fnid, resulttype, args);
@@ -78,19 +78,22 @@ public class Fastpath
                        // send the function call
                        try
                        {
-                               int l_msgLen = 0;
-                               l_msgLen += 16;
-                               for (int i=0;i < args.length;i++)
+                               int l_msgLen = 14;
+                               for (int i=0; i < args.length; i++) {
+                                       l_msgLen += 2;
                                        l_msgLen += args[i].sendSize();
+                               }
                                        
                                stream.SendChar('F');
                                stream.SendInteger(l_msgLen,4);
                                stream.SendInteger(fnid, 4);
-                               stream.SendInteger(1,2);
-                               stream.SendInteger(1,2);
+
                                stream.SendInteger(args.length,2);
+                               for (int i=0; i < args.length; i++)
+                                       stream.SendInteger(1,2);
 
-                               for (int i = 0;i < args.length;i++)
+                               stream.SendInteger(args.length,2);
+                               for (int i = 0; i < args.length; i++)
                                        args[i].send(stream);
                                
                                stream.SendInteger(1,2);
index 4895f1b614918d84de4bd5300b76ab64188d9f7c..2958fb0498327928ccb619ba8fa42d2019ace577 100644 (file)
@@ -11,7 +11,7 @@
  * Copyright (c) 2003, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/largeobject/LargeObjectManager.java,v 1.11 2003/11/29 19:52:11 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/largeobject/LargeObjectManager.java,v 1.12 2003/12/17 15:38:42 davec Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -116,7 +116,7 @@ public class LargeObjectManager
                if (conn.getMetaData().supportsSchemasInTableDefinitions()) {
                        sql = "SELECT p.proname,p.oid "+
                                " FROM pg_catalog.pg_proc p, pg_catalog.pg_namespace n "+
-                               " WHERE p.pronamespace=n.oid AND n.nspname='pg_catalog' AND ";
+                               " WHERE p.pronamespace=n.oid AND n.nspname='pg_catalog' AND (";
                } else {
                        sql = "SELECT proname,oid FROM pg_proc WHERE ";
                }
@@ -129,6 +129,10 @@ public class LargeObjectManager
                        " or proname = 'loread'" +
                        " or proname = 'lowrite'";
 
+               if (conn.getMetaData().supportsSchemasInTableDefinitions()) {
+                       sql += ")";
+               }
+
                ResultSet res = conn.createStatement().executeQuery(sql);
 
                if (res == null)
index 31af0c520b7f032730cdb547003aa2bc52d43ba0..7a5acab8e26bab4a8b3f14cf9635a2a803eff3e4 100644 (file)
@@ -57,6 +57,7 @@ public class Jdbc2TestSuite extends TestSuite
 
                // Fastpath/LargeObject
                suite.addTestSuite(BlobTest.class);
+               suite.addTestSuite(OID74Test.class);
 
                suite.addTestSuite(UpdateableResultTest.class );
 
diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/OID74Test.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/OID74Test.java
new file mode 100644 (file)
index 0000000..ae80ce4
--- /dev/null
@@ -0,0 +1,99 @@
+package org.postgresql.test.jdbc2;\r
+                                                                                                                                                                                     \r
+import org.postgresql.test.TestUtil;\r
+import junit.framework.TestCase;\r
+import java.io.*;\r
+import java.sql.*;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.io.InputStream;\r
+import java.sql.*;\r
+\r
+/**\r
+ * User: alexei\r
+ * Date: 17-Dec-2003\r
+ * Time: 11:01:44\r
+ * @version $Id: OID74Test.java,v 1.1 2003/12/17 15:38:42 davec Exp $\r
+ */\r
+public class OID74Test  extends TestCase\r
+{\r
+       private Connection con;\r
+    \r
+\r
+       public OID74Test( String name )\r
+       {\r
+               super(name);\r
+       }\r
+       public void setUp() throws Exception\r
+       {\r
+       }\r
+       public void tearDown() throws Exception\r
+       {\r
+       }\r
+       public void testBinaryStream()\r
+       {\r
+               //set up conection here\r
+               Connection c = null;\r
+               \r
+               Statement st = null; \r
+               try \r
+               {\r
+                       c =  DriverManager.getConnection("jdbc:postgresql://localhost/test?compatible=7.1&user=test");\r
+                       c.setAutoCommit(false);\r
+                       st = c.createStatement();\r
+                       st.execute("CREATE TABLE temp (col oid)");\r
+               }\r
+                catch (SQLException e) \r
+               {\r
+                       //another issue: when connecting to 7.3 database and this exception occurs because the table already exists,\r
+                       //st.setBinaryStream throws internal error in LargeObjectManager initialisation code\r
+                       fail("table creating error, probably already exists, code=" + e.getErrorCode());\r
+               }\r
+               finally\r
+               {\r
+                       try{ if (st != null) st.close(); }catch(SQLException ex){};\r
+               }\r
+               \r
+               PreparedStatement pstmt = null;\r
+               try \r
+               {\r
+               \r
+                       pstmt = c.prepareStatement("INSERT INTO temp VALUES (?)");\r
+                       //in case of 7.4 server, should block here\r
+                       pstmt.setBinaryStream(1, new ByteArrayInputStream(new byte[]{1, 2, 3, 4, 5}), 5);\r
+                       assertTrue( (pstmt.executeUpdate() == 1) );\r
+                       pstmt.close();\r
+               \r
+                       pstmt = c.prepareStatement("SELECT col FROM temp LIMIT 1");\r
+                       ResultSet rs = pstmt.executeQuery();\r
+\r
+                       assertTrue("No results from query", rs.next() );\r
+\r
+                       //in case of 7.4 server, should block here\r
+                       InputStream in = rs.getBinaryStream(1);\r
+                       int data;\r
+                       while ((data = in.read()) != -1)\r
+                               System.out.println(data);\r
+                       rs.close();\r
+                       st.close();\r
+                       c.createStatement().executeUpdate("DELETE FROM temp");\r
+                       c.commit();\r
+               }\r
+               catch ( IOException ioex )\r
+               {\r
+                       fail( ioex.getMessage() );\r
+               }\r
+               catch (SQLException ex)\r
+               {\r
+                       fail( ex.getMessage() );\r
+               } \r
+               finally \r
+               {\r
+                       try\r
+                       {\r
+                               if ( c!=null) c.close();\r
+                       }\r
+                       catch( SQLException e1){}\r
+               }\r
+       }       \r
+}\r