[ 
https://issues.apache.org/jira/browse/DERBY-3032?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kathey Marsden updated DERBY-3032:
----------------------------------

    Attachment: derby-3032_stat.txt
                derby-3032_diff.txt

Attached is an initial patch for this issue.  My solution was to have 
recastNullNodes rebind the expressions whenever a cast is performed.  This 
corrected the ClassCastException  and preserved the performance for the 
DERBY-2986 issue.

While this approach seems to work fine, I somehow have the feeling that the 
indirect binding through both findType and recastNullNodes is a bit unclear.  I 
added comments to try to make it apparent that that is what is happenning, but 
wonder if there is better way to reorganize this to make it clearer.  
Suggestions welcome.

Tests are running now.  


> java.lang.ClassCastException returning null from a case statement  in subquery
> ------------------------------------------------------------------------------
>
>                 Key: DERBY-3032
>                 URL: https://issues.apache.org/jira/browse/DERBY-3032
>             Project: Derby
>          Issue Type: Bug
>    Affects Versions: 10.3.1.5
>            Reporter: Kathey Marsden
>            Assignee: Kathey Marsden
>         Attachments: derby-3032_diff.txt, derby-3032_stat.txt
>
>
> The following query returning NULL date from a case statement in a subquery 
> causees a ClassCastException in 10.3.
> The query works fine in 10.2
> ij> create table t (d date, vc varchar(30));
> 0 rows inserted/updated/deleted
> ij> insert into t values(CURRENT_DATE, 'hello');
> 1 row inserted/updated/deleted
> ij> SELECT d from t where d = (SELECT CASE WHEN 1 = 1 THEN CURRENT_DATE ELSE 
> NULL END from t);
> D
> ----------
> 2007-08-28
> 1 row selected
> ij> SELECT d from t where d = (SELECT CASE WHEN 1 = 0 THEN CURRENT_DATE  ELSE 
> NULL END from t);
> D
> ----------
> ERROR 38000: The exception 'java.lang.ClassCastException: 
> org.apache.derby.iapi.types.SQLChar incompatible with org.apac
> he.derby.iapi.types.DateTimeDataValue' was thrown while evaluating an 
> expression.
> java.sql.SQLException: The exception 'java.lang.ClassCastException: 
> org.apache.derby.iapi.types.SQLChar incompatible wit
> h org.apache.derby.iapi.types.DateTimeDataValue' was thrown while evaluating 
> an expression.
>        at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
>        at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:88)
>        at org.apache.derby.impl.jdbc.Util.seeNextException(Util.java:224)
>        at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:398)
>        at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:346)
>        at 
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:1572)
>        at 
> org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:81)
>        at 
> org.apache.derby.impl.jdbc.EmbedResultSet.closeOnTransactionError(EmbedResultSet.java:4323)
>        at 
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:464)
>        at 
> org.apache.derby.impl.jdbc.EmbedResultSet.next(EmbedResultSet.java:368)
>        at 
> org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayResults(JDBCDisplayUtil.java:382)
>        at 
> org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayResults(JDBCDisplayUtil.java:338)
>        at 
> org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayResults(JDBCDisplayUtil.java:241)
>        at 
> org.apache.derby.tools.JDBCDisplayUtil.DisplayResults(JDBCDisplayUtil.java:229)
>        at 
> org.apache.derby.impl.tools.ij.utilMain.displayResult(utilMain.java:449)
>        at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:523)
>        at 
> org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(utilMain.java:364)
>        at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:262)
>        at org.apache.derby.impl.tools.ij.Main.go(Main.java:215)
>        at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:181)
>        at org.apache.derby.impl.tools.ij.Main14.main(Main14.java:56)
>        at org.apache.derby.tools.ij.main(ij.java:71)
> Caused by: java.sql.SQLException: Java exception: 
> 'org.apache.derby.iapi.types.SQLChar incompatible with org.apache.derb
> y.iapi.types.DateTimeDataValue: java.lang.ClassCastException'.
>        at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
>        at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:88)
>        at org.apache.derby.impl.jdbc.Util.javaException(Util.java:245)
>        at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:403)
>        ... 19 more
> Caused by: java.lang.ClassCastException: org.apache.derby.iapi.types.SQLChar 
> incompatible with org.apache.derby.iapi.typ
> es.DateTimeDataValue
>        at 
> org.apache.derby.exe.ac12564092x0114xaec2x9627x0000002183d82.g0(Unknown 
> Source)
>        at 
> org.apache.derby.exe.ac12564092x0114xaec2x9627x0000002183d82.e1(Unknown 
> Source)
>        at 
> org.apache.derby.impl.services.reflect.DirectCall.invoke(ReflectGeneratedClass.java:141)
>        at 
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(ProjectRestrictResultSet.java:267)
>        at 
> org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(BasicNoPutResultSetImpl.java:468)
>        at 
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:424)
>        ... 13 more
> ERROR XJ001: Java exception: 'org.apache.derby.iapi.types.SQLChar 
> incompatible with org.apache.derby.iapi.types.DateTime
> DataValue: java.lang.ClassCastException'.
> java.sql.SQLException: Java exception: 'org.apache.derby.iapi.types.SQLChar 
> incompatible with org.apache.derby.iapi.type
> s.DateTimeDataValue: java.lang.ClassCastException'.
>        at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
>        at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:88)
>        at org.apache.derby.impl.jdbc.Util.javaException(Util.java:245)
>        at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:403)
>        at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:398)
>        at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:346)
>        at 
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:1572)
>        at 
> org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:81)
>        at 
> org.apache.derby.impl.jdbc.EmbedResultSet.closeOnTransactionError(EmbedResultSet.java:4323)
>        at 
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:464)
>        at 
> org.apache.derby.impl.jdbc.EmbedResultSet.next(EmbedResultSet.java:368)
>        at 
> org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayResults(JDBCDisplayUtil.java:382)
>        at 
> org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayResults(JDBCDisplayUtil.java:338)
>        at 
> org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayResults(JDBCDisplayUtil.java:241)
>        at 
> org.apache.derby.tools.JDBCDisplayUtil.DisplayResults(JDBCDisplayUtil.java:229)
>        at 
> org.apache.derby.impl.tools.ij.utilMain.displayResult(utilMain.java:449)
>        at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:523)
>        at 
> org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(utilMain.java:364)
>        at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:262)
>        at org.apache.derby.impl.tools.ij.Main.go(Main.java:215)
>        at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:181)
>        at org.apache.derby.impl.tools.ij.Main14.main(Main14.java:56)
>        at org.apache.derby.tools.ij.main(ij.java:71)
> Caused by: java.lang.ClassCastException: org.apache.derby.iapi.types.SQLChar 
> incompatible with org.apache.derby.iapi.typ
> es.DateTimeDataValue
>        at 
> org.apache.derby.exe.ac12564092x0114xaec2x9627x0000002183d82.g0(Unknown 
> Source)
>        at 
> org.apache.derby.exe.ac12564092x0114xaec2x9627x0000002183d82.e1(Unknown 
> Source)
>        at 
> org.apache.derby.impl.services.reflect.DirectCall.invoke(ReflectGeneratedClass.java:141)
>        at 
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(ProjectRestrictResultSet.java:267)
>        at 
> org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(BasicNoPutResultSetImpl.java:468)
>        at 
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:424)
>        ... 13 more

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to