db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Cédric Gérard (JIRA) <derby-...@db.apache.org>
Subject [jira] Commented: (DERBY-1904) COALESCE with NULL parameter problem
Date Wed, 04 Oct 2006 07:59:20 GMT
    [ http://issues.apache.org/jira/browse/DERBY-1904?page=comments#action_12439757 ] 
            
Cédric Gérard commented on DERBY-1904:
--------------------------------------

No, there is no way to influence in the way JSTL binds the parameter in the SQL queries.

I saw the source code of JSTL 1.0 and 1.1. To bind parameter for PreparedStatement, JSTL uses
the setObject(idx, param) method even if the parameter is null. No type is given whatever
the parameter value is.

So I can conclude that the Jakarta Standard Tag Library are not yet fully compatible with
the Apache Derby Database.

If JSTL will use the setObject(int parameterIndex,  Object x, int targetSqlType), are you
generated a NULL SQL typed ? That is to say that I can use COALESCE(?, COLUMN) without using
the CAST function ? I don't think so, but I'm not sure. So you need the type for null in JDBC
but you do not use this type in SQL ? I really don't understand that. Maybe can you explain.

Other way of putting it is that the constraint of using the CAST function for NULL makes that
my SQL is not SQL 92 compliant but derby specific. CAST is not an SQL 92 function, I think.

I think you can help me if you decide to fix the setObject(int parameterIndex,  Object x)
to detect if the x is null, you can call setNullX that finally makes a setInput(parameterIndex,
null). It will be giant.

Why this full Java database needs to type the untyped Java null ?

Thanks to help me.

Regards,

Cédric Gérard





> COALESCE with NULL parameter problem
> ------------------------------------
>
>                 Key: DERBY-1904
>                 URL: http://issues.apache.org/jira/browse/DERBY-1904
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC, SQL
>    Affects Versions: 10.1.3.1
>         Environment: Windows 2000 SP4
> JSTL 1.0.6 on J2EE 1.3
> Tomcat 5.0.28  using a SUN JVM 1.4.2_03
>            Reporter: Cédric Gérard
>            Priority: Blocker
>         Attachments: dblook.log, stackfromderby.log
>
>
> Hi,
> My  initial objective was to execute this query with  the JSTL sql tag library  :
>   
> SELECT  ID_ITM, ITM_NAME, ITM_CODE
>     FROM  ITEMS
>     WHERE  ITM_CODE = COALESCE(?,ITM_CODE)
>   
> ITM_CODE is a NUMERIC column, here's the DDL script of the ITEMS  table :
> CREATE  TABLE  ITEMS (  
>          ID_ITM                BIGINT NOT  NULL  GENERATED ALWAYS AS  IDENTITY, 
>          ITM_CODE         NUMERIC  (22) NOT  NULL
>  );
> When ITM_CODE is not set in my application, JSTL bind the parameter as null. When ITM_CODE
is set, it works.
>   
>  I  got this message error : 
>  : Invalid  data conversion: Parameter object type is invalid for requested conversion.
 (Apache
> Derby  release 10.1.3.1 client  driver)
> => We try to use CAST(? AS NUMERIC) in place of ?. We obtain the same error when NULL
is passed.
>  : The  exception 'java.lang.ArrayIndexOutOfBoundsException: -1' was thrown while  evaluating
> an expression. SQLSTATE: XJ001: Java exception: '-1:  java.lang.ArrayIndexOutOfBoundsException'.
> (Apache Derby snapshot-10.2.0.4  client driver)
> With ij, we have the same problem (but not the same message)
> ij> SELECT ID_ITM, ITM_NAME, ITM_CODE
>      FROM ITEMS
>      WHERE ITM_CODE = COALESCE(NULL,ITM_CODE );
> ERROR 42X01: Syntax error: Encountered "NULL" at line 3, column 31.
> ij> SELECT ID_ITM, ITM_NAME, ITM_CODE
>      FROM ITEMS
>      WHERE ITM_CODE = COALESCE(NULLIF(1,1),ITM_CODE );
> ID_ITM              |ITM_NAME                                          |ITM_CODE
> ------------------------------------------------------------------------------------------------
> ERROR 38000: The exception 'java.lang.NullPointerException' was thrown while evaluating
an expression. SQLSTATE: XJ001: Java exception: ': java.lang.NullPointerException'.
> ij> SELECT ID_ITM, ITM_NAME, ITM_CODE
>      FROM ITEMS
>      WHERE ITM_CODE = COALESCE(CAST(NULLIF(1,1) AS BIGINT), ITM_CODE);
> ID_ITM              |ITM_NAME                                          |ITM_CODE
> ------------------------------------------------------------------------------------------------
> ERROR 38000: The exception 'java.lang.NullPointerException' was thrown while evaluating
an expression. SQLSTATE: XJ001: Java exception: ': java.lang.NullPointerException'.
> We have the same errors using 10.2.0.4 snapshot.
> The coalesce function should accept NULL parameter.
> Of course, My sample is very simple and I have n search criteria; so I don't want to
create 2^n SQL queries to deal with null or not null criterion.
> I try to replace the coalesce function with a CASE statement but I encountered the same
problems...
> So I don't actually have any workaround.
> Regards,
> Cédric

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

Mime
View raw message