[libpostgresql-jdbc-java] 03/09: Backpatch from head: fixes for a threading bug, a problem with setNull involving server prepared statements and an improved error message

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


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

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

commit 8d62df18649d158f44325dfacfa3060f044f2844
Author: Barry Lind <barry at xythos.com>
Date:   Thu Nov 14 05:54:39 2002 +0000

    Backpatch from head: fixes for a threading bug, a problem with setNull involving
    server prepared statements and an improved error message
    
     Modified Files:
      Tag: REL7_3_STABLE
     	jdbc/org/postgresql/errors.properties
     	jdbc/org/postgresql/core/Encoding.java
     	jdbc/org/postgresql/core/QueryExecutor.java
     	jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java
     	jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
     	jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java
---
 org/postgresql/core/Encoding.java                 |  9 ++-
 org/postgresql/core/QueryExecutor.java            |  5 ++
 org/postgresql/errors.properties                  |  1 +
 org/postgresql/jdbc1/AbstractJdbc1Connection.java |  8 ++
 org/postgresql/jdbc1/AbstractJdbc1Statement.java  | 95 ++++++++++++++++++++---
 5 files changed, 105 insertions(+), 13 deletions(-)

diff --git a/org/postgresql/core/Encoding.java b/org/postgresql/core/Encoding.java
index 61b3981..417306a 100644
--- a/org/postgresql/core/Encoding.java
+++ b/org/postgresql/core/Encoding.java
@@ -233,17 +233,18 @@ public class Encoding
 	 */
 	private static final int pow2_6 = 64;		// 26
 	private static final int pow2_12 = 4096;	// 212
-	private static char[] cdata = new char[50];
+	private char[] cdata = new char[50];
 
 	private synchronized String decodeUTF8(byte data[], int offset, int length) {
 		char[] l_cdata = cdata;
-		if (l_cdata.length < (length-offset)) {
-			l_cdata = new char[length-offset];
+		if (l_cdata.length < (length)) {
+			l_cdata = new char[length];
 		}
 		int i = offset;
 		int j = 0;
+		int k = length + offset;
 		int z, y, x, val;
-		while (i < length) {
+		while (i < k) {
 			z = data[i] & 0xFF;
 			if (z < 0x80) {
 				l_cdata[j++] = (char)data[i];
diff --git a/org/postgresql/core/QueryExecutor.java b/org/postgresql/core/QueryExecutor.java
index b6b62ce..90696eb 100644
--- a/org/postgresql/core/QueryExecutor.java
+++ b/org/postgresql/core/QueryExecutor.java
@@ -59,6 +59,11 @@ public class QueryExecutor
 
 		StringBuffer errorMessage = null;
 
+		if (pg_stream == null) 
+		{
+			throw new PSQLException("postgresql.con.closed");
+		}
+
 		synchronized (pg_stream)
 		{
 
diff --git a/org/postgresql/errors.properties b/org/postgresql/errors.properties
index d036733..ff87266 100644
--- a/org/postgresql/errors.properties
+++ b/org/postgresql/errors.properties
@@ -5,6 +5,7 @@ postgresql.con.auth:The authentication type {0} is not supported. Check that you
 postgresql.con.authfail:An error occured while getting the authentication request.
 postgresql.con.backend:Backend start-up failed: {0}
 postgresql.con.call:Callable Statements are not supported at this time.
+postgresql.con.closed:Connection is closed.  Operation is not permitted.
 postgresql.con.creobj:Failed to create object for {0} {1}
 postgresql.con.failed:The connection attempt failed because {0}
 postgresql.con.fathom:Unable to fathom update count {0}
diff --git a/org/postgresql/jdbc1/AbstractJdbc1Connection.java b/org/postgresql/jdbc1/AbstractJdbc1Connection.java
index 146c452..a49b3fd 100644
--- a/org/postgresql/jdbc1/AbstractJdbc1Connection.java
+++ b/org/postgresql/jdbc1/AbstractJdbc1Connection.java
@@ -475,6 +475,10 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
 	 */
 	public java.sql.ResultSet ExecSQL(String sql, java.sql.Statement stat) throws SQLException
 	{
+		if (isClosed())
+		{
+			throw new PSQLException("postgresql.con.closed");
+		}
 		return new QueryExecutor(new String[] {sql}, EMPTY_OBJECT_ARRAY, stat, pg_stream, (java.sql.Connection)this).execute();
 	}
 	private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
@@ -494,6 +498,10 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
 	 */
 	public java.sql.ResultSet ExecSQL(String[] p_sqlFragments, Object[] p_binds, java.sql.Statement stat) throws SQLException
 	{
+		if (isClosed())
+		{
+			throw new PSQLException("postgresql.con.closed");
+		}
 		return new QueryExecutor(p_sqlFragments, p_binds, stat, pg_stream, (java.sql.Connection)this).execute();
 	}
 
diff --git a/org/postgresql/jdbc1/AbstractJdbc1Statement.java b/org/postgresql/jdbc1/AbstractJdbc1Statement.java
index 9b95cd8..6f08ebd 100644
--- a/org/postgresql/jdbc1/AbstractJdbc1Statement.java
+++ b/org/postgresql/jdbc1/AbstractJdbc1Statement.java
@@ -724,7 +724,55 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 	 */
 	public void setNull(int parameterIndex, int sqlType) throws SQLException
 	{
-		bind(parameterIndex, "null", PG_TEXT);
+        String l_pgType;
+		switch (sqlType)
+		{
+			case Types.INTEGER:
+				l_pgType = PG_INTEGER;
+				break;
+			case Types.TINYINT:
+			case Types.SMALLINT:
+				l_pgType = PG_INT2;
+				break;
+			case Types.BIGINT:
+				l_pgType = PG_INT8;
+				break;
+			case Types.REAL:
+			case Types.FLOAT:
+				l_pgType = PG_FLOAT;
+				break;
+			case Types.DOUBLE:
+				l_pgType = PG_DOUBLE;
+				break;
+			case Types.DECIMAL:
+			case Types.NUMERIC:
+				l_pgType = PG_NUMERIC;
+				break;
+			case Types.CHAR:
+			case Types.VARCHAR:
+			case Types.LONGVARCHAR:
+				l_pgType = PG_TEXT;
+				break;
+			case Types.DATE:
+				l_pgType = PG_DATE;
+				break;
+			case Types.TIME:
+				l_pgType = PG_TIME;
+				break;
+			case Types.TIMESTAMP:
+				l_pgType = PG_TIMESTAMPTZ;
+				break;
+			case Types.BINARY:
+			case Types.VARBINARY:
+				l_pgType = PG_BYTEA;
+				break;
+			case Types.OTHER:
+				l_pgType = PG_TEXT;
+				break;
+			default:
+				l_pgType = PG_TEXT;
+		}
+		bind(parameterIndex, "null", l_pgType);
 	}
 
 	/*
@@ -830,7 +878,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 	public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException
 	{
 		if (x == null)
-			setNull(parameterIndex, Types.OTHER);
+			setNull(parameterIndex, Types.DECIMAL);
 		else
 		{
 			bind(parameterIndex, x.toString(), PG_NUMERIC);
@@ -856,7 +904,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 	{
 		// if the passed string is null, then set this column to null
 		if (x == null)
-			setNull(parameterIndex, Types.OTHER);
+			setNull(parameterIndex, Types.VARCHAR);
 		else
 		{
 			// use the shared buffer object. Should never clash but this makes
@@ -902,7 +950,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 			//Version 7.2 supports the bytea datatype for byte arrays
 			if (null == x)
 			{
-				setNull(parameterIndex, Types.OTHER);
+				setNull(parameterIndex, Types.VARBINARY);
 			}
 			else
 			{
@@ -933,7 +981,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 	{
 		if (null == x)
 		{
-			setNull(parameterIndex, Types.OTHER);
+			setNull(parameterIndex, Types.DATE);
 		}
 		else
 		{
@@ -953,7 +1001,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 	{
 		if (null == x)
 		{
-			setNull(parameterIndex, Types.OTHER);
+			setNull(parameterIndex, Types.TIME);
 		}
 		else
 		{
@@ -973,7 +1021,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 	{
 		if (null == x)
 		{
-			setNull(parameterIndex, Types.OTHER);
+			setNull(parameterIndex, Types.TIMESTAMP);
 		}
 		else
 		{
@@ -1288,7 +1336,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 	{
 		if (x == null)
 		{
-			setNull(parameterIndex, Types.OTHER);
+			setNull(parameterIndex, targetSqlType);
 			return ;
 		}
 		switch (targetSqlType)
@@ -1360,7 +1408,35 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 	{
 		if (x == null)
 		{
-			setNull(parameterIndex, Types.OTHER);
+			int l_sqlType;
+			if (x instanceof String)
+				l_sqlType = Types.VARCHAR;
+			else if (x instanceof BigDecimal)
+				l_sqlType = Types.DECIMAL;
+			else if (x instanceof Short)
+				l_sqlType = Types.SMALLINT;
+			else if (x instanceof Integer)
+				l_sqlType = Types.INTEGER;
+			else if (x instanceof Long)
+				l_sqlType = Types.BIGINT;
+			else if (x instanceof Float)
+				l_sqlType = Types.FLOAT;
+			else if (x instanceof Double)
+				l_sqlType = Types.DOUBLE;
+			else if (x instanceof byte[])
+				l_sqlType = Types.BINARY;
+			else if (x instanceof java.sql.Date)
+				l_sqlType = Types.DATE;
+			else if (x instanceof Time)
+				l_sqlType = Types.TIME;
+			else if (x instanceof Timestamp)
+				l_sqlType = Types.TIMESTAMP;
+			else if (x instanceof Boolean)
+				l_sqlType = Types.OTHER;
+			else 
+				l_sqlType = Types.OTHER;
+
+			setNull(parameterIndex, l_sqlType);
 			return ;
 		}
 		if (x instanceof String)
@@ -1863,6 +1939,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme
 	private static final String PG_DATE = "date";
 	private static final String PG_TIME = "time";
 	private static final String PG_TIMESTAMPTZ = "timestamptz";
+    private static final String PG_BYTEA = "bytea";
 
 
 }

-- 
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