openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Fay Wang (JIRA)" <j...@apache.org>
Subject [jira] Created: (OPENJPA-1814) JPQL fails with Group By and Having aggregate_expression IN (subquery)
Date Fri, 24 Sep 2010 18:16:32 GMT
JPQL fails with Group By and Having aggregate_expression IN (subquery)
----------------------------------------------------------------------

                 Key: OPENJPA-1814
                 URL: https://issues.apache.org/jira/browse/OPENJPA-1814
             Project: OpenJPA
          Issue Type: Bug
          Components: kernel
    Affects Versions: 2.1.0
            Reporter: Fay Wang
            Assignee: Fay Wang


The following JPQL fail:

    	String jpql = "SELECT a.uuid from EntityA a WHERE a.name = 'test' " + 
    	    "GROUP BY a.date1, a.uuid " +

(1)    "HAVING MAX(a.date1) IN (SELECT MAX(a1.date2) from EntityA a1 WHERE a1.name = 'test')
";
(2)    "HAVING MAX(a.date1) = (SELECT MAX(a1.date2) from EntityA a1 WHERE a1.name = 'test')
";

org.apache.openjpa.persistence.ArgumentException: Encountered "MAX ( a .date1) IN" at character
168, but expected: ["(", ")", "*", "+", "-", ".", "/", ":", "<", "<=", "<>", "=",
">", ">=", "?", "ABS", "ALL", "AND", "ANY", "AS", "ASC", "AVG", "BETWEEN", "BOTH", "BY",
"CONCAT","COUNT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DELETE", "DESC", "DISTINCT",
"EMPTY", "ESCAPE", "EXISTS", "FETCH", "FROM", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN",
"LEADING", "LEFT","LENGTH", "LIKE", "LOCATE", "LOWER", "MAX", "MEMBER", "MIN", "MOD","NEW",
"NOT", "NULL", "OBJECT", "OF", "OR", "ORDER", "OUTER", "SELECT",
"SET", "SIZE", "SOME", "SQRT", "SUBSTRING", "SUM", "TRAILING", "TRIM","UPDATE", "UPPER", "WHERE",
<BOOLEAN_LITERAL>, <DECIMAL_LITERAL>,<IDENTIFIER>, <INTEGER_LITERAL>,
<STRING_LITERAL>].
 at org.apache.openjpa.kernel.jpql.JPQL.generateParseException(JPQL.java:9566)
 at org.apache.openjpa.kernel.jpql.JPQL.jj_consume_token(JPQL.java:9443)
 at org.apache.openjpa.kernel.jpql.JPQL.conditional_primary(JPQL.java:1947)
 at org.apache.openjpa.kernel.jpql.JPQL.conditional_factor(JPQL.java:1925)
 at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1791)

The fix involves two changes:
(1) jjt grammar change
(2) OpenJPA performs a preliminary validation to ensure the expression in the having clause
is included in the group-by list. However, this validation checking should be done only on
the LHS of the having clause (see expr1 below), not on the RHS (see expr2 below).  For example:

     Having expr1 = expr2

Only expr1 should be in the group-by list

The current visitor pattern can not tell which node to visit without massive change. The alternative
is to disable the checking by OpenJPA and let the backend to determine whether the generated
SQL is valid or not.


 


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


Mime
View raw message