diff -Nur postgresql-7.2-orig/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java postgresql-7.2/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java
--- postgresql-7.2-orig/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java	Tue Jan 15 01:37:33 2002
+++ postgresql-7.2/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java	Wed Oct 16 19:44:35 2002
@@ -118,20 +118,34 @@
 	 * This is identical to toString() except it throws an exception if a
 	 * parameter is unused.
 	 */
-	private synchronized String compileQuery()
-	throws SQLException
+	private synchronized String compileQuery() throws SQLException
 	{
-		sbuf.setLength(0);
-		int i;
-
-		for (i = 0 ; i < inStrings.length ; ++i)
-		{
-			if (inStrings[i] == null)
-				throw new PSQLException("postgresql.prep.param", new Integer(i + 1));
-			sbuf.append (templateStrings[i]).append (inStrings[i]);
-		}
-		sbuf.append(templateStrings[inStrings.length]);
-		return sbuf.toString();
+                synchronized (sbuf) {
+                        try {
+          		        sbuf.setLength(0);
+        		        int i;
+                                
+                                // calculate future buffer size
+                                int size = templateStrings[inStrings.length].length();
+                                for (i = 0 ; i < inStrings.length ; ++i)
+                                  if (inStrings[i] == null)
+                                    throw new PSQLException("postgresql.prep.param", new Integer(i + 1));
+                                  else  
+                                    size += templateStrings[i].length() + inStrings[i].length();
+                                sbuf.ensureCapacity(size);    
+        
+        		        for (i = 0 ; i < inStrings.length ; ++i)
+        		        {
+        			        if (inStrings[i] == null)
+        				        throw new PSQLException("postgresql.prep.param", new Integer(i + 1));
+        			        sbuf.append (templateStrings[i]).append (inStrings[i]);
+        		        }
+        		        sbuf.append(templateStrings[inStrings.length]);
+        		        return sbuf.toString();
+                        } finally {
+                          sbuf.setLength(0); // free some memory used by buffer
+                        }                                
+               }
 	}
 
 	/*
@@ -276,18 +290,31 @@
 			synchronized (sbuf)
 			{
 				sbuf.setLength(0);
-				int i;
+
+                                int i;
+                                char c;
+                                if (x.length() > 10000) {
+                                  // calculate buffer size
+                                  int size = 2 + x.length();
+                                  for (i = 0 ; i < x.length() ; ++i) {
+                                    c = x.charAt(i);
+                                    if (c == '\\' || c == '\'')
+                                      size ++;
+                                  }
+                                  sbuf.ensureCapacity(size);    
+                                }
 
 				sbuf.append('\'');
 				for (i = 0 ; i < x.length() ; ++i)
 				{
-					char c = x.charAt(i);
+					c = x.charAt(i);
 					if (c == '\\' || c == '\'')
 						sbuf.append((char)'\\');
 					sbuf.append(c);
 				}
 				sbuf.append('\'');
 				set(parameterIndex, sbuf.toString());
+                                sbuf.setLength(0); // free some memory used by buffer
 			}
 		}
 	}
diff -Nur postgresql-7.2-orig/src/interfaces/jdbc/org/postgresql/util/PGbytea.java postgresql-7.2/src/interfaces/jdbc/org/postgresql/util/PGbytea.java
--- postgresql-7.2-orig/src/interfaces/jdbc/org/postgresql/util/PGbytea.java	Sat Jan  5 16:26:23 2002
+++ postgresql-7.2/src/interfaces/jdbc/org/postgresql/util/PGbytea.java	Wed Oct 16 19:44:55 2002
@@ -62,10 +62,33 @@
 	{
 		if (p_buf == null)
 			return null;
-		StringBuffer l_strbuf = new StringBuffer();
+
+                int l_int;
+                StringBuffer l_strbuf;
+                
+                if (p_buf.length > 10000) {
+                  // calculate buffer size        
+                  int size = 0;        
+                  for (int i = 0; i < p_buf.length; i++) {
+                    l_int = (int)p_buf[i];
+                    if (l_int < 0)
+                      l_int = 256 + l_int;
+                      
+                    if (l_int < 040 || l_int > 0176)
+                      size += 5;
+                    else if (p_buf[i] == (byte)'\\')
+                      size += 4;
+                    else 
+                      size += 1;
+                  }
+                  l_strbuf = new StringBuffer(size);
+                }
+                else 
+                  l_strbuf = new StringBuffer();
+                
 		for (int i = 0; i < p_buf.length; i++)
 		{
-			int l_int = (int)p_buf[i];
+			l_int = (int)p_buf[i];
 			if (l_int < 0)
 			{
 				l_int = 256 + l_int;
