Changeset: 0112d8496636 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java?cmd=changeset;node=0112d8496636
Added Files:
tests/Bug_PrepStmtSetObject_CLOB_6349.java
Modified Files:
src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
Branch: default
Log Message:
Added test program for bug 6349.
Added case Types.CLOB: at several places in setObject(). This fixes bug 6349
Also replaced "" + x into direct <Class>.toString(x)
diffs (260 lines):
diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
b/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
--- a/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
+++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
@@ -1198,7 +1198,7 @@ public class MonetPreparedStatement
*/
@Override
public void setBoolean(int parameterIndex, boolean x) throws
SQLException {
- setValue(parameterIndex, "" + x);
+ setValue(parameterIndex, Boolean.toString(x));
}
/**
@@ -1211,7 +1211,7 @@ public class MonetPreparedStatement
*/
@Override
public void setByte(int parameterIndex, byte x) throws SQLException {
- setValue(parameterIndex, "" + x);
+ setValue(parameterIndex, Byte.toString(x));
}
static final String HEXES = "0123456789ABCDEF";
@@ -1476,7 +1476,7 @@ public class MonetPreparedStatement
*/
@Override
public void setDouble(int parameterIndex, double x) throws SQLException
{
- setValue(parameterIndex, "" + x);
+ setValue(parameterIndex, Double.toString(x));
}
/**
@@ -1489,7 +1489,7 @@ public class MonetPreparedStatement
*/
@Override
public void setFloat(int parameterIndex, float x) throws SQLException {
- setValue(parameterIndex, "" + x);
+ setValue(parameterIndex, Float.toString(x));
}
/**
@@ -1502,7 +1502,7 @@ public class MonetPreparedStatement
*/
@Override
public void setInt(int parameterIndex, int x) throws SQLException {
- setValue(parameterIndex, "" + x);
+ setValue(parameterIndex, Integer.toString(x));
}
/**
@@ -1515,7 +1515,7 @@ public class MonetPreparedStatement
*/
@Override
public void setLong(int parameterIndex, long x) throws SQLException {
- setValue(parameterIndex, "" + x);
+ setValue(parameterIndex, Long.toString(x));
}
/**
@@ -1769,6 +1769,12 @@ public class MonetPreparedStatement
// this is according to table B-5
if (x instanceof String) {
switch (targetSqlType) {
+ case Types.CHAR:
+ case Types.VARCHAR:
+ case Types.LONGVARCHAR:
+ case Types.CLOB:
+ setString(parameterIndex, (String)x);
+ break;
case Types.TINYINT:
case Types.SMALLINT:
case Types.INTEGER:
@@ -1832,11 +1838,6 @@ public class MonetPreparedStatement
case Types.BOOLEAN:
setBoolean(parameterIndex,
(Boolean.valueOf((String)x)).booleanValue());
break;
- case Types.CHAR:
- case Types.VARCHAR:
- case Types.LONGVARCHAR:
- setString(parameterIndex, (String)x);
- break;
case Types.BINARY:
case Types.VARBINARY:
case Types.LONGVARBINARY:
@@ -1933,6 +1934,7 @@ public class MonetPreparedStatement
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
+ case Types.CLOB:
setString(parameterIndex, x.toString());
break;
default:
@@ -1978,7 +1980,8 @@ public class MonetPreparedStatement
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
- setString(parameterIndex, "" + val);
+ case Types.CLOB:
+ setString(parameterIndex, x.toString());
break;
default:
throw new SQLException("Conversion not
allowed", "M1M05");
@@ -1989,9 +1992,21 @@ public class MonetPreparedStatement
case Types.BIGINT:
setLong(parameterIndex,
num.longValue());
break;
+ case Types.DECIMAL:
+ case Types.NUMERIC:
+ {
+ BigDecimal dec;
+ try {
+ dec = new BigDecimal(num);
+ } catch (NumberFormatException e) {
+ throw new
SQLException("Internal error: unable to create template BigDecimal: " +
e.getMessage(), "M0M03");
+ }
+ setBigDecimal(parameterIndex, dec);
+ } break;
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
+ case Types.CLOB:
setString(parameterIndex, x.toString());
break;
default:
@@ -2014,15 +2029,8 @@ public class MonetPreparedStatement
x instanceof java.util.Date)
{
switch (targetSqlType) {
- case Types.CHAR:
- case Types.VARCHAR:
- case Types.LONGVARCHAR:
- setString(parameterIndex, x.toString());
- break;
case Types.DATE:
- if (x instanceof Time) {
- throw new
SQLException("Conversion not allowed", "M1M05");
- } else if (x instanceof java.sql.Date) {
+ if (x instanceof java.sql.Date) {
setDate(parameterIndex,
(java.sql.Date)x);
} else if (x instanceof Timestamp) {
setDate(parameterIndex, new
java.sql.Date(((Timestamp)x).getTime()));
@@ -2032,13 +2040,13 @@ public class MonetPreparedStatement
} else if (x instanceof Calendar) {
setDate(parameterIndex, new
java.sql.Date(
((Calendar)x).getTimeInMillis()));
+ } else {
+ throw new
SQLException("Conversion not allowed", "M1M05");
}
break;
case Types.TIME:
if (x instanceof Time) {
setTime(parameterIndex,
(Time)x);
- } else if (x instanceof java.sql.Date) {
- throw new
SQLException("Conversion not allowed", "M1M05");
} else if (x instanceof Timestamp) {
setTime(parameterIndex, new
Time(((Timestamp)x).getTime()));
} else if (x instanceof java.util.Date)
{
@@ -2047,23 +2055,31 @@ public class MonetPreparedStatement
} else if (x instanceof Calendar) {
setTime(parameterIndex, new
java.sql.Time(
((Calendar)x).getTimeInMillis()));
+ } else {
+ throw new
SQLException("Conversion not allowed", "M1M05");
}
break;
case Types.TIMESTAMP:
- if (x instanceof Time) {
- throw new
SQLException("Conversion not allowed", "M1M05");
+ if (x instanceof Timestamp) {
+ setTimestamp(parameterIndex,
(Timestamp)x);
} else if (x instanceof java.sql.Date) {
setTimestamp(parameterIndex,
new Timestamp(((java.sql.Date)x).getTime()));
- } else if (x instanceof Timestamp) {
- setTimestamp(parameterIndex,
(Timestamp)x);
} else if (x instanceof java.util.Date)
{
setTimestamp(parameterIndex,
new java.sql.Timestamp(
((java.util.Date)x).getTime()));
} else if (x instanceof Calendar) {
setTimestamp(parameterIndex,
new java.sql.Timestamp(
((Calendar)x).getTimeInMillis()));
+ } else {
+ throw new
SQLException("Conversion not allowed", "M1M05");
}
break;
+ case Types.CHAR:
+ case Types.VARCHAR:
+ case Types.LONGVARCHAR:
+ case Types.CLOB:
+ setString(parameterIndex, x.toString());
+ break;
default:
throw new SQLException("Conversion not
allowed", "M1M05");
}
@@ -2281,7 +2297,7 @@ public class MonetPreparedStatement
*/
@Override
public void setShort(int parameterIndex, short x) throws SQLException {
- setValue(parameterIndex, "" + x);
+ setValue(parameterIndex, Short.toString(x));
}
/**
diff --git a/tests/Bug_PrepStmtSetObject_CLOB_6349.java
b/tests/Bug_PrepStmtSetObject_CLOB_6349.java
new file mode 100644
--- /dev/null
+++ b/tests/Bug_PrepStmtSetObject_CLOB_6349.java
@@ -0,0 +1,55 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2017 MonetDB B.V.
+ */
+
+import java.sql.*;
+
+public class Bug_PrepStmtSetObject_CLOB_6349 {
+ public static void main(String[] args) throws Exception {
+ // Class.forName("nl.cwi.monetdb.jdbc.MonetDriver"); // not
needed anymore for self registering JDBC drivers
+ Connection con = DriverManager.getConnection(args[0]);
+ Statement stmt = con.createStatement();
+ PreparedStatement pstmt = null;
+ ParameterMetaData pmd = null;
+ ResultSet rs = null;
+ ResultSetMetaData rsmd = null;
+
+ System.out.println("0. true\t" + con.getAutoCommit());
+
+ try {
+ stmt.executeUpdate("CREATE TABLE PrepStmtSetObject_CLOB
(myint INT, myvarchar VARCHAR(15), myclob CLOB)");
+ stmt.executeUpdate("INSERT INTO PrepStmtSetObject_CLOB
VALUES (123, 'A string', 'A longer string')");
+ stmt.executeUpdate("INSERT INTO PrepStmtSetObject_CLOB
VALUES (NULL, NULL, NULL)"); // all NULLs
+
+ pstmt = con.prepareStatement("SELECT myclob, myvarchar,
myint FROM PrepStmtSetObject_CLOB WHERE myclob = ?");
+ pmd = pstmt.getParameterMetaData();
+ System.out.println("Prepared Query has " +
pmd.getParameterCount() + " parameters. Type of first is: " +
pmd.getParameterTypeName(1));
+ rsmd = pstmt.getMetaData();
+ System.out.println("Prepared Query has " +
rsmd.getColumnCount() + " columns. Type of first is: " +
rsmd.getColumnTypeName(1));
+
+ pstmt.setObject(1, "A longer string");
+ rs = pstmt.executeQuery();
+ rsmd = rs.getMetaData();
+ System.out.println("Query ResultSet has " +
rsmd.getColumnCount() + " columns. Type of first is: " +
rsmd.getColumnTypeName(1));
+
+ stmt.executeUpdate("DROP TABLE PrepStmtSetObject_CLOB");
+
+ } catch (SQLException e) {
+ System.out.println("FAILED :( "+ e.getMessage());
+ while ((e = e.getNextException()) != null)
+ System.out.println("FAILED :( " +
e.getMessage());
+ System.out.println("ABORTING TEST!!!");
+ } finally {
+ if (rs != null) rs.close();
+ if (pstmt != null) pstmt.close();
+ stmt.close();
+ }
+
+ con.close();
+ }
+}
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list