You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Heath Thomann (JIRA)" <ji...@apache.org> on 2015/03/06 20:51:38 UTC

[jira] [Created] (OPENJPA-2572) Parentheses before an IN operator causes a parser exception.

Heath Thomann created OPENJPA-2572:
--------------------------------------

             Summary: Parentheses before an IN operator causes a parser exception.
                 Key: OPENJPA-2572
                 URL: https://issues.apache.org/jira/browse/OPENJPA-2572
             Project: OpenJPA
          Issue Type: Bug
          Components: sql
    Affects Versions: 2.2.3, 2.4.0
            Reporter: Heath Thomann
            Priority: Critical


I have recreated a simple version of a more complex query which is not working.  Take these two queries which work fine and as expected:

em.createQuery("select m from MyEntity2 m WHERE (m.id = 1)");
em.createQuery("select m from MyEntity2 m WHERE m.id IN (1,2,5)");

Now take this query and note the parentheses around m.id:

em.createQuery("select m from MyEntity2 m WHERE (m.id) IN (1,2,5)");

This yields the following exception:

Caused by: <openjpa-2.2.3-SNAPSHOT-r422266:1655221M nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Encountered "m . id ) IN" at character 34, 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", "TYPE", "UPDATE", "UPPER", "WHERE", <DATE_LITERAL>, <DECIMAL_LITERAL>, <IDENTIFIER>, <INTEGER_LITERAL>, <STRING_LITERAL2>, <STRING_LITERAL>, <TIMESTAMP_LITERAL>, <TIME_LITERAL>].
	at org.apache.openjpa.kernel.jpql.JPQL.generateParseException(JPQL.java:13180)
	at org.apache.openjpa.kernel.jpql.JPQL.jj_consume_token(JPQL.java:13054)
	at org.apache.openjpa.kernel.jpql.JPQL.conditional_primary(JPQL.java:1980)
........


Looks like something in our parser doesn't expect this.

Oh, BTW, the answer is not to simply remove the parentheses......ultimately what we want to do is something more like the following (this works when I execute from my Oracle SQL editor):

SELECT * FROM MyEntity2 t0 WHERE (t0.id, t0.num) IN (SELECT t1.id, t1.num FROM MyEntity2 t1 GROUP BY t1.id, t1.num);

I.e. we need the parentheses.

Thanks,

Heath Thomann



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)