Репозитории ALT
S: | 42.6.0-alt1_1jpp11 |
5.1: | 8.3.604-alt1_1jpp5 |
4.1: | 8.1.407-alt1_2jpp1.7 |
4.0: | 8.1.407-alt1_2jpp1.7 |
Группа :: Базы Данных
Пакет: postgresql-jdbc
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: postgresql-jdbc-unspec-string.patch
Скачать
Скачать
This patch is based on
http://gborg.postgresql.org/pipermail/pgjdbc-commit/2005-November/000416.html
but omitting some changes relevant to logging. The changes are
Add a new parameter 'stringtype' (values 'varchar' or 'unspecified') to
control how parameters set via setString() are bound.
Make compatible=7.4 use stringtype=unspecified.
Rename Oid.INVALID -> Oid.UNSPECIFIED.
Fix V3 parameter logic so that prepared statements are not reused when a
non-NULL UNSPECIFIED parameter is set over the top of a previous
parameter.
Change testTypeChange() so it works with stringtype=unspecified.
The stringtype=unspecified option is really important to minimize problems
for applications being ported forward from the 7.4 postgresql JDBC driver.
diff -Naur postgresql-jdbc-8.1-405.src.orig/org/postgresql/Driver.java.in postgresql-jdbc-8.1-405.src/org/postgresql/Driver.java.in
--- postgresql-jdbc-8.1-405.src.orig/org/postgresql/Driver.java.in 2005-02-15 03:56:24.000000000 -0500
+++ postgresql-jdbc-8.1-405.src/org/postgresql/Driver.java.in 2006-02-17 19:19:50.000000000 -0500
@@ -420,9 +420,12 @@
"When connecting to a pre-7.3 server, the database encoding to assume is in use." },
{ "compatible", Boolean.FALSE,
"Force compatibility of some features with an older version of the driver.",
- new String[] { "7.1", "7.2", "7.3" } },
+ new String[] { "7.1", "7.2", "7.3", "7.4", "8.0", "8.1" } },
{ "loginTimeout", Boolean.FALSE,
- "The login timeout, in seconds; 0 means no timeout beyond the normal TCP connection timout." }
+ "The login timeout, in seconds; 0 means no timeout beyond the normal TCP connection timout." },
+ { "stringtype", Boolean.FALSE,
+ "The type to bind String parameters as (usually 'varchar'; 'unspecified' allows implicit casting to other types)",
+ new String[] { "varchar", "unspecified" } },
};
/**
diff -Naur postgresql-jdbc-8.1-405.src.orig/org/postgresql/core/BaseConnection.java postgresql-jdbc-8.1-405.src/org/postgresql/core/BaseConnection.java
--- postgresql-jdbc-8.1-405.src.orig/org/postgresql/core/BaseConnection.java 2005-08-01 02:54:14.000000000 -0400
+++ postgresql-jdbc-8.1-405.src/org/postgresql/core/BaseConnection.java 2006-02-17 19:19:50.000000000 -0500
@@ -143,4 +143,7 @@
// Ew. Quick hack to give access to the connection-specific utils implementation.
public TimestampUtils getTimestampUtils();
+
+ // Get the bind-string-as-varchar config flag
+ public boolean getStringVarcharFlag();
}
diff -Naur postgresql-jdbc-8.1-405.src.orig/org/postgresql/core/Oid.java postgresql-jdbc-8.1-405.src/org/postgresql/core/Oid.java
--- postgresql-jdbc-8.1-405.src.orig/org/postgresql/core/Oid.java 2005-07-04 14:50:28.000000000 -0400
+++ postgresql-jdbc-8.1-405.src/org/postgresql/core/Oid.java 2006-02-17 19:19:50.000000000 -0500
@@ -14,7 +14,7 @@
* use.
*/
public class Oid {
- public static final int INVALID = 0;
+ public static final int UNSPECIFIED = 0;
public static final int INT2 = 21;
public static final int INT4 = 23;
public static final int INT8 = 20;
diff -Naur postgresql-jdbc-8.1-405.src.orig/org/postgresql/core/v3/SimpleParameterList.java postgresql-jdbc-8.1-405.src/org/postgresql/core/v3/SimpleParameterList.java
--- postgresql-jdbc-8.1-405.src.orig/org/postgresql/core/v3/SimpleParameterList.java 2005-07-08 13:38:29.000000000 -0400
+++ postgresql-jdbc-8.1-405.src/org/postgresql/core/v3/SimpleParameterList.java 2006-02-17 19:19:50.000000000 -0500
@@ -62,10 +62,11 @@
paramValues[index] = value ;
direction[index] |= IN;
- // If we are setting something to null, don't overwrite our existing type
- // for it. We don't need the correct type info to send NULL and we
- // don't want to overwrite and require a reparse.
- if (oid == Oid.INVALID && paramTypes[index] != Oid.INVALID)
+ // If we are setting something to an UNSPECIFIED NULL, don't overwrite
+ // our existing type for it. We don't need the correct type info to
+ // send this value, and we don't want to overwrite and require a
+ // reparse.
+ if (oid == Oid.UNSPECIFIED && paramTypes[index] != Oid.UNSPECIFIED && value == NULL_OBJECT)
return;
paramTypes[index] = oid;
@@ -170,7 +171,7 @@
boolean hasUnresolvedTypes() {
for (int i=0; i< paramTypes.length; i++) {
- if (paramTypes[i] == Oid.INVALID)
+ if (paramTypes[i] == Oid.UNSPECIFIED)
return true;
}
return false;
@@ -178,7 +179,7 @@
void setResolvedType(int index, int oid) {
// only allow overwriting an unknown value
- if (paramTypes[index-1] == Oid.INVALID) {
+ if (paramTypes[index-1] == Oid.UNSPECIFIED) {
paramTypes[index-1] = oid;
} else if (paramTypes[index-1] != oid) {
throw new IllegalArgumentException("Can't change resolved type for param: " + index + " from " + paramTypes[index] + " to " + oid);
diff -Naur postgresql-jdbc-8.1-405.src.orig/org/postgresql/jdbc2/AbstractJdbc2Connection.java postgresql-jdbc-8.1-405.src/org/postgresql/jdbc2/AbstractJdbc2Connection.java
--- postgresql-jdbc-8.1-405.src.orig/org/postgresql/jdbc2/AbstractJdbc2Connection.java 2005-08-01 02:54:14.000000000 -0400
+++ postgresql-jdbc-8.1-405.src/org/postgresql/jdbc2/AbstractJdbc2Connection.java 2006-02-17 19:19:50.000000000 -0500
@@ -58,6 +58,9 @@
// Connection's readonly state.
public boolean readOnly = false;
+ // Bind String to UNSPECIFIED or VARCHAR?
+ public final boolean bindStringAsVarchar;
+
// Current warnings; there might be more on protoConnection too.
public SQLWarning firstWarning = null;
@@ -124,6 +127,23 @@
Driver.debug(" prepare threshold = " + prepareThreshold);
}
+ //
+ // String -> text or unknown?
+ //
+
+ String stringType = info.getProperty("stringtype");
+ if (stringType != null) {
+ if (stringType.equalsIgnoreCase("unspecified"))
+ bindStringAsVarchar = false;
+ else if (stringType.equalsIgnoreCase("varchar"))
+ bindStringAsVarchar = true;
+ else
+ throw new PSQLException(GT.tr("Unsupported value for stringtype parameter: {0}", stringType),
+ PSQLState.INVALID_PARAMETER_VALUE);
+ } else {
+ bindStringAsVarchar = haveMinimumCompatibleVersion("8.0");
+ }
+
// Initialize timestamp stuff
timestampUtils = new TimestampUtils(haveMinimumServerVersion("7.4"));
@@ -1033,5 +1053,9 @@
{
return protoConnection.getProtocolVersion();
}
-}
+ public boolean getStringVarcharFlag()
+ {
+ return bindStringAsVarchar;
+ }
+}
diff -Naur postgresql-jdbc-8.1-405.src.orig/org/postgresql/jdbc2/AbstractJdbc2Statement.java postgresql-jdbc-8.1-405.src/org/postgresql/jdbc2/AbstractJdbc2Statement.java
--- postgresql-jdbc-8.1-405.src.orig/org/postgresql/jdbc2/AbstractJdbc2Statement.java 2006-02-01 13:52:30.000000000 -0500
+++ postgresql-jdbc-8.1-405.src/org/postgresql/jdbc2/AbstractJdbc2Statement.java 2006-02-17 19:19:50.000000000 -0500
@@ -1066,7 +1066,7 @@
case Types.STRUCT:
case Types.NULL:
case Types.OTHER:
- oid = Oid.INVALID;
+ oid = Oid.UNSPECIFIED;
break;
default:
// Bad Types value.
@@ -1206,7 +1206,7 @@
public void setString(int parameterIndex, String x) throws SQLException
{
checkClosed();
- setString(parameterIndex, x, Oid.VARCHAR);
+ setString(parameterIndex, x, (connection.getStringVarcharFlag() ? Oid.VARCHAR : Oid.UNSPECIFIED));
}
protected void setString(int parameterIndex, String x, int oid) throws SQLException
@@ -1519,7 +1519,7 @@
private void setPGobject(int parameterIndex, PGobject x) throws SQLException {
String typename = x.getType();
int oid = connection.getPGType(typename);
- if (oid == Oid.INVALID)
+ if (oid == Oid.UNSPECIFIED)
throw new PSQLException(GT.tr("Unknown type {0}.", typename), PSQLState.INVALID_PARAMETER_TYPE);
setString(parameterIndex, x.getValue(), oid);
@@ -1585,7 +1585,7 @@
break;
case Types.VARCHAR:
case Types.LONGVARCHAR:
- setString(parameterIndex, pgType.toString());
+ setString(parameterIndex, pgType.toString(), Oid.VARCHAR);
break;
case Types.DATE:
if (in instanceof java.sql.Date)
@@ -2681,7 +2681,7 @@
// backend looks for array types.
String typename = "_" + x.getBaseTypeName();
int oid = connection.getPGType(typename);
- if (oid == Oid.INVALID)
+ if (oid == Oid.UNSPECIFIED)
throw new PSQLException(GT.tr("Unknown type {0}.", typename), PSQLState.INVALID_PARAMETER_TYPE);
setString(i, x.toString(), oid);
@@ -2882,7 +2882,7 @@
if (cal != null)
cal = (Calendar)cal.clone();
- // We must use INVALID here, or inserting a Date-with-timezone into a
+ // We must use UNSPECIFIED here, or inserting a Date-with-timezone into a
// timestamptz field does an unexpected rotation by the server's TimeZone:
//
// We want to interpret 2005/01/01 with calendar +0100 as
@@ -2901,7 +2901,7 @@
// 2005-01-01 00:00:00+03
// (1 row)
- bindString(i, connection.getTimestampUtils().toString(cal, d), Oid.INVALID);
+ bindString(i, connection.getTimestampUtils().toString(cal, d), Oid.UNSPECIFIED);
}
public void setTime(int i, Time t, java.util.Calendar cal) throws SQLException
@@ -2917,9 +2917,7 @@
if (cal != null)
cal = (Calendar)cal.clone();
- // We don't need INVALID here as we only support inserting a Time into
- // 'time' and 'timetz' columns.
- bindString(i, connection.getTimestampUtils().toString(cal, t), Oid.INVALID);
+ bindString(i, connection.getTimestampUtils().toString(cal, t), Oid.UNSPECIFIED);
}
public void setTimestamp(int i, Timestamp t, java.util.Calendar cal) throws SQLException
@@ -2934,7 +2932,7 @@
if (cal != null)
cal = (Calendar)cal.clone();
- // Use INVALID as a compromise to get both TIMESTAMP and TIMESTAMPTZ working.
+ // Use UNSPECIFIED as a compromise to get both TIMESTAMP and TIMESTAMPTZ working.
// This is because you get this in a +1300 timezone:
//
// template1=# select '2005-01-01 15:00:00 +1000'::timestamptz;
@@ -2961,10 +2959,10 @@
// time compared to the string we originally provided. But going straight
// to timestamp is OK as the input parser for timestamp just throws away
// the timezone part entirely. Since we don't know ahead of time what type
- // we're actually dealing with, INVALID seems the lesser evil, even if it
+ // we're actually dealing with, UNSPECIFIED seems the lesser evil, even if it
// does give more scope for type-mismatch errors being silently hidden.
- bindString(i, connection.getTimestampUtils().toString(cal, t), Oid.INVALID); // Let the server infer the right type.
+ bindString(i, connection.getTimestampUtils().toString(cal, t), Oid.UNSPECIFIED); // Let the server infer the right type.
}
// ** JDBC 2 Extensions for CallableStatement**
diff -Naur postgresql-jdbc-8.1-405.src.orig/org/postgresql/jdbc2/TypeInfoCache.java postgresql-jdbc-8.1-405.src/org/postgresql/jdbc2/TypeInfoCache.java
--- postgresql-jdbc-8.1-405.src.orig/org/postgresql/jdbc2/TypeInfoCache.java 2006-02-09 11:29:20.000000000 -0500
+++ postgresql-jdbc-8.1-405.src/org/postgresql/jdbc2/TypeInfoCache.java 2006-02-17 19:19:50.000000000 -0500
@@ -140,7 +140,7 @@
if (!((BaseStatement)_getOidStatement).executeWithFlags(QueryExecutor.QUERY_SUPPRESS_BEGIN))
throw new PSQLException(GT.tr("No results were returned by the query."), PSQLState.NO_DATA);
- oid = new Integer(Oid.INVALID);
+ oid = new Integer(Oid.UNSPECIFIED);
ResultSet rs = _getOidStatement.getResultSet();
if (rs.next()) {
oid = new Integer(rs.getInt(1));
@@ -154,7 +154,7 @@
public String getPGType(int oid) throws SQLException
{
- if (oid == Oid.INVALID)
+ if (oid == Oid.UNSPECIFIED)
return null;
String pgTypeName = (String)_oidToPgName.get(new Integer(oid));
diff -Naur postgresql-jdbc-8.1-405.src.orig/org/postgresql/test/jdbc2/ServerPreparedStmtTest.java postgresql-jdbc-8.1-405.src/org/postgresql/test/jdbc2/ServerPreparedStmtTest.java
--- postgresql-jdbc-8.1-405.src.orig/org/postgresql/test/jdbc2/ServerPreparedStmtTest.java 2005-01-27 17:50:17.000000000 -0500
+++ postgresql-jdbc-8.1-405.src/org/postgresql/test/jdbc2/ServerPreparedStmtTest.java 2006-02-17 19:19:50.000000000 -0500
@@ -256,7 +256,7 @@
}
public void testTypeChange() throws Exception {
- PreparedStatement pstmt = con.prepareStatement("SELECT ?");
+ PreparedStatement pstmt = con.prepareStatement("SELECT CAST (? AS TEXT)");
((PGStatement)pstmt).setUseServerPrepare(true);
// Prepare with int parameter.