Index: java/engine/org/apache/derby/impl/sql/compile/ConstantNode.java =================================================================== --- java/engine/org/apache/derby/impl/sql/compile/ConstantNode.java (revision 468830) +++ java/engine/org/apache/derby/impl/sql/compile/ConstantNode.java (working copy) @@ -282,7 +282,11 @@ { if (isSameNodeType(o)) { ConstantNode other = (ConstantNode)o; - return other.getValue().compare(getValue()) == 0; + + // value can be null which represents a SQL NULL value. + return ( (other.getValue() == null && getValue() == null) || + (other.getValue() != null && + other.getValue().compare(getValue()) == 0) ); } return false; } Index: java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql =================================================================== --- java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql (revision 468830) +++ java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql (working copy) @@ -372,3 +372,29 @@ select substr(vc, 3, 4) from dt group by substr(vc, 3); select substr(vc, 3) from dt group by substr(vc, 3, 4); drop table dt; +create table dt(c1 varchar(10)); +insert into dt values '123 ', 'abc ', '123', 'abc'; +-- ok +select ltrim(c1) from dt group by ltrim(c1); +select rtrim(c1) from dt group by rtrim(c1); +select locate(c1, 'abc') from dt group by locate(c1, 'abc'); +select locate(c1, 'abc', 1) from dt group by locate(c1, 'abc',1); +-- expect errors +select locate(c1, 'abc') from dt group by locate(c1, 'abc',3); +select locate(c1, 'abc',2) from dt group by locate(c1, 'abc'); +select locate(c1, 'abc',2) from dt group by locate(c1, 'abc',3); +drop table dt; + +-- DERBY-2014 +-- test NULLIF with GROUP BY expression +create table t1 (c1 int, c2 int); +insert into t1 values (1,1), (2,2), (2,2), (3,3), (null, null), (5,100); +-- ok +select nullif(c1,c1) from t1 group by nullif(c1,c1); +select nullif(c1,c2) from t1 group by nullif(c1,c2); +select nullif(c1,10) from t1 group by nullif(c1,10); +select nullif(1,c1) from t1 group by nullif(1,c1); +-- expect error +select nullif(c1,c2) from t1 group by nullif(c2,c1); +select nullif(c1,100) from t1 group by nullif(c1,200); +drop table t1; Index: java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out =================================================================== --- java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out (revision 468830) +++ java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out (working copy) @@ -660,4 +660,74 @@ ERROR 42Y30: The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions. ij> drop table dt; 0 rows inserted/updated/deleted +ij> create table dt(c1 varchar(10)); +0 rows inserted/updated/deleted +ij> insert into dt values '123 ', 'abc ', '123', 'abc'; +4 rows inserted/updated/deleted +ij> -- ok +select ltrim(c1) from dt group by ltrim(c1); +1 +---------- +123 +abc +ij> select rtrim(c1) from dt group by rtrim(c1); +1 +---------- +123 +abc +ij> select locate(c1, 'abc') from dt group by locate(c1, 'abc'); +1 +----------- +0 +1 +ij> select locate(c1, 'abc', 1) from dt group by locate(c1, 'abc',1); +1 +----------- +0 +1 +ij> -- expect errors +select locate(c1, 'abc') from dt group by locate(c1, 'abc',3); +ERROR 42Y30: The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions. +ij> select locate(c1, 'abc',2) from dt group by locate(c1, 'abc'); +ERROR 42Y30: The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions. +ij> select locate(c1, 'abc',2) from dt group by locate(c1, 'abc',3); +ERROR 42Y30: The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions. +ij> drop table dt; +0 rows inserted/updated/deleted +ij> -- DERBY-2014 +-- test NULLIF with GROUP BY expression +create table t1 (c1 int, c2 int); +0 rows inserted/updated/deleted +ij> insert into t1 values (1,1), (2,2), (2,2), (3,3), (null, null), (5,100); +6 rows inserted/updated/deleted +ij> -- ok +select nullif(c1,c1) from t1 group by nullif(c1,c1); +1 +----------- +NULL +ij> select nullif(c1,c2) from t1 group by nullif(c1,c2); +1 +----------- +5 +NULL +ij> select nullif(c1,10) from t1 group by nullif(c1,10); +1 +----------- +1 +2 +3 +5 +NULL +ij> select nullif(1,c1) from t1 group by nullif(1,c1); +1 +----------- +1 +NULL +ij> -- expect error +select nullif(c1,c2) from t1 group by nullif(c2,c1); +ERROR 42Y30: The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions. +ij> select nullif(c1,100) from t1 group by nullif(c1,200); +ERROR 42Y30: The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions. +ij> drop table t1; +0 rows inserted/updated/deleted ij>