summaryrefslogtreecommitdiff
path: root/src/interfaces/jdbc/org/postgresql/Connection.java
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2001-07-15 04:21:26 +0000
committerBruce Momjian <bruce@momjian.us>2001-07-15 04:21:26 +0000
commitb08e86d557538c16e482ad10a9bdbc474893d07e (patch)
tree101a0329f41b50bdb56292144ddf47cc1b1d96e7 /src/interfaces/jdbc/org/postgresql/Connection.java
parent4046e58c2478cfcdd4334e2c282b5a42f047ea0b (diff)
downloadpostgresql-b08e86d557538c16e482ad10a9bdbc474893d07e.tar.gz
The attached patch fixes problems with the JDBC driver handling long
null terminated strings. The FE/BE protocol sends in some cases null terminated strings to the client. The docs for the FE/BE protocol state that there is no limit on the size of a null terminated string sent to the client and a client should be coded using an expanding buffer to deal with large strings. The old code did not do this and gave an error if a null terminated string was greater than either 4 or 8K. It appears that with the advent of TOAST very long SQL statements are becoming more common, and apparently some error messages from the backend include the SQL statement thus easily exceeding the 8K limit in the old code. In fixing I also cleaned up some calls in the JDBC fastpath code that were not doing character set conversion under multibyte, and removed some methods that were no longer needed. I also removed a potential threading problem with a shared variable that was being used in Connection.java. Thanks to Steve Wampler for discovering the problem and sending the initial diffs that were the basis of this patch. thanks, --Barry
Diffstat (limited to 'src/interfaces/jdbc/org/postgresql/Connection.java')
-rw-r--r--src/interfaces/jdbc/org/postgresql/Connection.java27
1 files changed, 10 insertions, 17 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/Connection.java b/src/interfaces/jdbc/org/postgresql/Connection.java
index 357a4ee9e4..ba0076bcfc 100644
--- a/src/interfaces/jdbc/org/postgresql/Connection.java
+++ b/src/interfaces/jdbc/org/postgresql/Connection.java
@@ -10,7 +10,7 @@ import org.postgresql.largeobject.*;
import org.postgresql.util.*;
/**
- * $Id: Connection.java,v 1.17 2001/06/07 00:09:32 momjian Exp $
+ * $Id: Connection.java,v 1.18 2001/07/15 04:21:26 momjian Exp $
*
* This abstract class is used by org.postgresql.Driver to open either the JDBC1 or
* JDBC2 versions of the Connection class.
@@ -82,11 +82,6 @@ public abstract class Connection
public int pid;
public int ckey;
- // This receive_sbuf should be used by the different methods
- // that call pg_stream.ReceiveString() in this Connection, so
- // so we avoid uneccesary new allocations.
- byte receive_sbuf[] = new byte[8192];
-
/**
* This is called by Class.forName() from within org.postgresql.Driver
*/
@@ -167,8 +162,7 @@ public abstract class Connection
// The most common one to be thrown here is:
// "User authentication failed"
//
- throw new SQLException(pg_stream.ReceiveString
- (receive_sbuf, 4096, getEncoding()));
+ throw new SQLException(pg_stream.ReceiveString(getEncoding()));
case 'R':
// Get the type of request
@@ -238,8 +232,7 @@ public abstract class Connection
break;
case 'E':
case 'N':
- throw new SQLException(pg_stream.ReceiveString
- (receive_sbuf, 4096, getEncoding()));
+ throw new SQLException(pg_stream.ReceiveString(getEncoding()));
default:
throw new PSQLException("postgresql.con.setup");
}
@@ -251,7 +244,7 @@ public abstract class Connection
break;
case 'E':
case 'N':
- throw new SQLException(pg_stream.ReceiveString(receive_sbuf, 4096, getEncoding()));
+ throw new SQLException(pg_stream.ReceiveString(getEncoding()));
default:
throw new PSQLException("postgresql.con.setup");
}
@@ -491,7 +484,7 @@ public abstract class Connection
{
case 'A': // Asynchronous Notify
pid = pg_stream.ReceiveInteger(4);
- msg = pg_stream.ReceiveString(receive_sbuf,8192,getEncoding());
+ msg = pg_stream.ReceiveString(getEncoding());
break;
case 'B': // Binary Data Transfer
if (fields == null)
@@ -502,7 +495,7 @@ public abstract class Connection
tuples.addElement(tup);
break;
case 'C': // Command Status
- recv_status = pg_stream.ReceiveString(receive_sbuf,8192,getEncoding());
+ recv_status = pg_stream.ReceiveString(getEncoding());
// Now handle the update count correctly.
if(recv_status.startsWith("INSERT") || recv_status.startsWith("UPDATE") || recv_status.startsWith("DELETE") || recv_status.startsWith("MOVE")) {
@@ -544,7 +537,7 @@ public abstract class Connection
tuples.addElement(tup);
break;
case 'E': // Error Message
- msg = pg_stream.ReceiveString(receive_sbuf,4096,getEncoding());
+ msg = pg_stream.ReceiveString(getEncoding());
final_error = new SQLException(msg);
hfr = true;
break;
@@ -559,10 +552,10 @@ public abstract class Connection
hfr = true;
break;
case 'N': // Error Notification
- addWarning(pg_stream.ReceiveString(receive_sbuf,4096,getEncoding()));
+ addWarning(pg_stream.ReceiveString(getEncoding()));
break;
case 'P': // Portal Name
- String pname = pg_stream.ReceiveString(receive_sbuf,8192,getEncoding());
+ String pname = pg_stream.ReceiveString(getEncoding());
break;
case 'T': // MetaData Field Description
if (fields != null)
@@ -595,7 +588,7 @@ public abstract class Connection
for (i = 0 ; i < nf ; ++i)
{
- String typname = pg_stream.ReceiveString(receive_sbuf,8192,getEncoding());
+ String typname = pg_stream.ReceiveString(getEncoding());
int typid = pg_stream.ReceiveIntegerR(4);
int typlen = pg_stream.ReceiveIntegerR(2);
int typmod = pg_stream.ReceiveIntegerR(4);