Commit e4955c2e authored by Dave Cramer's avatar Dave Cramer

patch from Kris Jurka to fix large object 7.1 compatible protocol issues

modified test case from Alexey Yudichev to be part of the testsuite
parent 95eea2d8
......@@ -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);
......
......@@ -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)
......
......@@ -57,6 +57,7 @@ public class Jdbc2TestSuite extends TestSuite
// Fastpath/LargeObject
suite.addTestSuite(BlobTest.class);
suite.addTestSuite(OID74Test.class);
suite.addTestSuite(UpdateableResultTest.class );
......
package org.postgresql.test.jdbc2;
import org.postgresql.test.TestUtil;
import junit.framework.TestCase;
import java.io.*;
import java.sql.*;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.*;
/**
* User: alexei
* Date: 17-Dec-2003
* Time: 11:01:44
* @version $Id: OID74Test.java,v 1.1 2003/12/17 15:38:42 davec Exp $
*/
public class OID74Test extends TestCase
{
private Connection con;
public OID74Test( String name )
{
super(name);
}
public void setUp() throws Exception
{
}
public void tearDown() throws Exception
{
}
public void testBinaryStream()
{
//set up conection here
Connection c = null;
Statement st = null;
try
{
c = DriverManager.getConnection("jdbc:postgresql://localhost/test?compatible=7.1&user=test");
c.setAutoCommit(false);
st = c.createStatement();
st.execute("CREATE TABLE temp (col oid)");
}
catch (SQLException e)
{
//another issue: when connecting to 7.3 database and this exception occurs because the table already exists,
//st.setBinaryStream throws internal error in LargeObjectManager initialisation code
fail("table creating error, probably already exists, code=" + e.getErrorCode());
}
finally
{
try{ if (st != null) st.close(); }catch(SQLException ex){};
}
PreparedStatement pstmt = null;
try
{
pstmt = c.prepareStatement("INSERT INTO temp VALUES (?)");
//in case of 7.4 server, should block here
pstmt.setBinaryStream(1, new ByteArrayInputStream(new byte[]{1, 2, 3, 4, 5}), 5);
assertTrue( (pstmt.executeUpdate() == 1) );
pstmt.close();
pstmt = c.prepareStatement("SELECT col FROM temp LIMIT 1");
ResultSet rs = pstmt.executeQuery();
assertTrue("No results from query", rs.next() );
//in case of 7.4 server, should block here
InputStream in = rs.getBinaryStream(1);
int data;
while ((data = in.read()) != -1)
System.out.println(data);
rs.close();
st.close();
c.createStatement().executeUpdate("DELETE FROM temp");
c.commit();
}
catch ( IOException ioex )
{
fail( ioex.getMessage() );
}
catch (SQLException ex)
{
fail( ex.getMessage() );
}
finally
{
try
{
if ( c!=null) c.close();
}
catch( SQLException e1){}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment