You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/11/18 20:29:13 UTC

svn commit: r881892 - in /openjpa/branches/1.3.x: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/ openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/

Author: fancy
Date: Wed Nov 18 19:29:13 2009
New Revision: 881892

URL: http://svn.apache.org/viewvc?rev=881892&view=rev
Log:
OPENJPA-1388 JPQL named parameter using a reserved word (:vlaue) resulting in ArgumentException

Added:
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java
Modified:
    openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
    openjpa/branches/1.3.x/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt

Modified: openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=881892&r1=881891&r2=881892&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java (original)
+++ openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java Wed Nov 18 19:29:13 2009
@@ -810,7 +810,7 @@
                 return eval(firstChild(node));
 
             case JJTNAMEDINPUTPARAMETER:
-                return getParameter(node.text, false);
+                return getParameter(onlyChild(node).text, false);
 
             case JJTPOSITIONALINPUTPARAMETER:
                 return getParameter(node.text, true);

Modified: openjpa/branches/1.3.x/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt?rev=881892&r1=881891&r2=881892&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt (original)
+++ openjpa/branches/1.3.x/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt Wed Nov 18 19:29:13 2009
@@ -1,1308 +1,1307 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *  
- * http://www.apache.org/licenses/LICENSE-2.0
- *  
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.   
- */
-
-/**
- *  An JP QL grammar parser.
- * 
- *  Samples:
- *	  SELECT COUNT(p) FROM Person AS p
- *	  SELECT OBJECT(identifier) FROM schema identifier
- *	  SELECT identifier FROM schema AS identifier
- *	
- *	@author Patrick Linskey
- *	@author Marc Prud'hommeaux
- */
-options {
-	NODE_PREFIX = "JPQL";
-	NODE_PACKAGE = "org.apache.openjpa.kernel.jpql";
-	MULTI = false;
-	NODE_DEFAULT_VOID = true;
-	JAVA_UNICODE_ESCAPE = true;
-	STATIC = false;
-	NODE_USES_PARSER = true;
-
-	LOOKAHEAD = 1;
-
-
-	// debugging variables
-	// DEBUG_PARSER = true; 		// simple parser debug
-	// DEBUG_TOKEN_MANAGER = true; 	// more verbose token manager debug
-	// DEBUG_LOOKAHEAD = true; 		// more verbose lookahead debug
-
-	SANITY_CHECK = true; // check for left-recursion, etc (must always be true)
-
-
-	// FORCE_LA_CHECK = true;
-}
-
-PARSER_BEGIN(JPQL)
-package org.apache.openjpa.kernel.jpql;
-
-import java.io.*;
-
-
-
-/**
- *	@nojavadoc
- */
-public class JPQL
-{
-	String jpql;
-	boolean inEnumPath;
-
-
-	public JPQL (String jpql)
-	{
-		this (new StringReader (jpql));
-
-		this.jpql = jpql;
-	}
-
-
-	public static void main (String[] args)
-		throws Exception
-	{
-		if (args.length > 0)
-		{
-			for (int i = 0; i < args.length; i++)
-			{
-				JPQL parser = new JPQL (args[i]);
-				SimpleNode ast = (SimpleNode) parser.parseQuery ();
-				ast.dump (System.out, "");
-			}
-		}
-		else
-		{
-			JPQL parser = new JPQL (System.in);
-			while (true)
-			{
-				System.out.print ("Enter Expression: ");
-				System.out.flush ();
-				try
-				{
-					SimpleNode ast = (SimpleNode) parser.parseQuery ();
-					if (ast == null)
-						return;
-					else
-						ast.dump (System.out, "");
-				}
-				catch (Throwable x)
-				{
-					x.printStackTrace ();
-					return;
-				}
-			}
-		}
-	}
-}
-
-PARSER_END(JPQL)
-
-
-SKIP :
-{
- 	" "
-    | "\n"
-	| "\r"
-	| "\t"
-}
-
-
-TOKEN [ IGNORE_CASE ]: /* basics */
-{
-	< COMMA: "," >
-
-	|	< DOT: "." >
-
-	|	< EQ: "=" >
-	|	< NE: "<>" >
-	|	< GT: ">" >
-	|	< GE: ">=" >
-	|	< LT: "<" >
-	|	< LE: "<=" >
-
-	|	< PLUS: "+" >
-	|	< MINUS: "-" >
-
-	|	< TIMES: "*" >
-	|	< DIV: "/" >
-
-	|	< NEW: "NEW" >
-
-	|	< ALL: "ALL" >
-	|	< ANY: "ANY" >
-	|	< EXISTS: "EXISTS" >
-	|	< SOME: "SOME" >
-	|	< EMPTY: "EMPTY" >
-
-	|	< ASC: "ASC" >
-	|	< DESC: "DESC" >
-	|	< ORDER: "ORDER" >
-	|	< BY: "BY" >
-
-	|	< IS: "IS" >
-	|	< MEMBER: "MEMBER" >
-	|	< OF: "OF" >
-	|	< LIKE: "LIKE" >
-	|	< ESCAPE: "ESCAPE" >
-	|	< BETWEEN: "BETWEEN" >
-
-	|	< NULL: "NULL" >
-}
-
-TOKEN [ IGNORE_CASE ]: /* aggregates */
-{
-	< AVG: "AVG" >
-	|	< MIN: "MIN" >
-	|	< MAX: "MAX" >
-	|	< SUM: "SUM" >
-	|	< COUNT: "COUNT" >
-}
-
-TOKEN [ IGNORE_CASE ]: /* boolean arithmetic */
-{
-	< OR: "OR" >
-	|	< AND: "AND" >
-	|	< NOT: "NOT" >
-}
-
-TOKEN [ IGNORE_CASE ]: /* functions returning strings */
-{
-	< CONCAT: "CONCAT" >
-	|	< SUBSTRING: "SUBSTRING" >
-	|	< TRIM: "TRIM" >
-	|	< LOWER: "LOWER" >
-	|	< UPPER: "UPPER" >
-}
-
-TOKEN [ IGNORE_CASE ]: /* trim specification */
-{
-	< LEADING: "LEADING" >
-	|	< TRAILING: "TRAILING" >
-	|	< BOTH: "BOTH" >
-}
-
-
-TOKEN [ IGNORE_CASE ]: /* functions returning numerics */
-{
-	< LENGTH: "LENGTH" >
-	|	< LOCATE: "LOCATE" >
-	|	< ABS: "ABS" >
-	|	< SQRT: "SQRT" >
-	|	< MOD: "MOD" >
-	|	< SIZE: "SIZE" >
-}
-
-
-TOKEN [ IGNORE_CASE ]: /* functions returning datetime */
-{
-	< CURRENT_DATE: "CURRENT_DATE" >
-	|	< CURRENT_TIME: "CURRENT_TIME" >
-	|	< CURRENT_TIMESTAMP: "CURRENT_TIMESTAMP" >
-}
-
-TOKEN [ IGNORE_CASE ]: /* type of query */
-{
-	< SELECT: "SELECT" >
-	|	< DISTINCT: "DISTINCT" >
-	|	< FROM: "FROM" >
-
-	|	< UPDATE: "UPDATE" >
-	|	< DELETE: "DELETE" >
-
-	|	< WHERE: "WHERE" >
-	|	< GROUP: "GROUP" >
-	|	< HAVING: "HAVING" >
-
-	|	< AS: "AS" >
-	|	< LEFT: "LEFT" >
-	|	< OUTER: "OUTER" >
-	|	< INNER: "INNER" >
-	|	< JOIN: "JOIN" >
-	|	< FETCH: "FETCH" >
-	|	< IN: "IN" >
-	|	< SET: "SET" >
-
-	|	< OBJECT: "OBJECT" >
-}
-
-
-/* inspired by the Java 1.0.2 specification */
-/* ### should we limit this to the length that is valid in java? */
-TOKEN : /* literals */
-{
-	< INTEGER_LITERAL: ((["0"-"9"])+) (["l","L"])? >
-	| < DECIMAL_LITERAL:
-		(((["0"-"9"])* "." (["0"-"9"])+) (<EXPONENT>)? (["f","F","d","D"])?
-		| ((["0"-"9"])+ ".") (<EXPONENT>)? (["f","F","d","D"])?
-		| ((["0"-"9"])+) (<EXPONENT>) (["f","F","d","D"])?
-		| ((["0"-"9"])+) (<EXPONENT>)? (["f","F","d","D"])?) >
-	| < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
-	| < STRING_LITERAL: "'"
-	  (("''" | ~["'"])
-		/*
-	  (("''" | ~["'","\\","\n","\r"])
-		| ("\\"
-			( ["n","t","b","r","f","\\","'"]
-			| ["0"-"7"] ( ["0"-"7"] )?
-			| ["0"-"3"] ["0"-"7"] ["0"-"7"]
-			)
-		  )
-		*/
-	  )*
-	  "'"
-	>
-	| < CHARACTER_LITERAL: "'"
-	  (   (~["'","\\","\n","\r"])
-		| ("\\"
-			( ["n","t","b","r","f","\\","'"]
-			| ["0"-"7"] ( ["0"-"7"] )?
-			| ["0"-"3"] ["0"-"7"] ["0"-"7"]
-			)
-		  )
-	  )
-	  "'"
-	>
-}
-
-TOKEN [ IGNORE_CASE ]: /* boolean literals can be case-insensitive */
-{
-	< BOOLEAN_LITERAL: "TRUE" | "FALSE" >
-}
-
-/* From the Java 1.0.2 specification */
-TOKEN : /* IDENTIFIERS */
-{
-  < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
-	|
-  < #LETTER:
-	  [
-	   "\u0024", 			// $
-	   "\u0041"-"\u005a", 	// A-Z
-	   "\u005f", 			// _
-	   "\u0061"-"\u007a", 	// a-z
-	   "\u00c0"-"\u00d6",
-	   "\u00d8"-"\u00f6",
-	   "\u00f8"-"\u00ff",
-	   "\u0100"-"\u1fff",
-	   "\u3040"-"\u318f",
-	   "\u3300"-"\u337f",
-	   "\u3400"-"\u3d2d",
-	   "\u4e00"-"\u9fff",
-	   "\uf900"-"\ufaff"
-	  ]
-  >
-	|
-  < #DIGIT:
-	  [
-	   "\u0030"-"\u0039", 	// 0-9
-	   "\u0660"-"\u0669",
-	   "\u06f0"-"\u06f9",
-	   "\u0966"-"\u096f",
-	   "\u09e6"-"\u09ef",
-	   "\u0a66"-"\u0a6f",
-	   "\u0ae6"-"\u0aef",
-	   "\u0b66"-"\u0b6f",
-	   "\u0be7"-"\u0bef",
-	   "\u0c66"-"\u0c6f",
-	   "\u0ce6"-"\u0cef",
-	   "\u0d66"-"\u0d6f",
-	   "\u0e50"-"\u0e59",
-	   "\u0ed0"-"\u0ed9",
-	   "\u1040"-"\u1049"
-	  ]
-  >
-}
-
-
-Node parseQuery() : { }
-{
-	(select_statement() | update_statement() | delete_statement()) <EOF>
-	{
-		return jjtree.rootNode();
-	}
-}
-
-
-void select_statement() #SELECT : { }
-{
-	select_clause()
-		from_clause()
-		[where_clause()]
-		[groupby_clause()]
-		[having_clause()]
-		[orderby_clause()]
-}
-
-
-void update_statement() #UPDATE : { }
-{
-	update_clause() [ where_clause() ]
-}
-
-
-void delete_statement() #DELETE : { }
-{
-	<DELETE> <FROM> (from_item() #FROM) [where_clause()]
-}
-
-
-void from_clause() #FROM : { }
-{
-	<FROM> identification_variable_declaration()
-	(LOOKAHEAD(1) <COMMA> (LOOKAHEAD(collection_member_declaration()) collection_member_declaration() | LOOKAHEAD(identification_variable_declaration())identification_variable_declaration()))*
-}
-
-
-void identification_variable_declaration(): { }
-{
-	from_item() (LOOKAHEAD(fetch_join()) fetch_join() | LOOKAHEAD(inner_join()) inner_join() | LOOKAHEAD(outer_join()) outer_join())*
-}
-
-
-void from_item() #FROMITEM : { }
-{
-	abstract_schema_name() [LOOKAHEAD(1)<AS>] [LOOKAHEAD(identification_variable())identification_variable()]
-}
-
-
-void subquery_from_clause() #FROM : { }
-{
-	<FROM> subquery_from_item()
-		( LOOKAHEAD(1) <COMMA> subquery_from_item() )*
-}
-
-void subquery_from_item() : { }
-{
-        LOOKAHEAD(collection_member_declaration()) collection_member_declaration()
-	| LOOKAHEAD(identification_variable_declaration()) identification_variable_declaration()
-}
-
-void inner_join() #INNERJOIN : { }
-{
-	[<INNER>] <JOIN> path() [<AS>] identification_variable()
-}
-
-
-void collection_member_declaration() #INNERJOIN : { }
-{
-	// synonymous with "INNER JOIN path AS identifier" (InnerJoin)
-	<IN> "(" path() ")" [ LOOKAHEAD(1)<AS>] identification_variable()
-}
-
-void outer_join() #OUTERJOIN : { }
-{
-	<LEFT> [ <OUTER>] <JOIN> path() [ LOOKAHEAD(1)<AS>] identification_variable()
-}
-
-
-void fetch_join() : { }
-{
-	outer_fetch_join() | inner_fetch_join()
-}
-
-
-void outer_fetch_join() #OUTERFETCHJOIN : { }
-{
-	<LEFT> [<OUTER>] <JOIN> <FETCH> path()
-}
-
-
-void inner_fetch_join() #INNERFETCHJOIN : { }
-{
-	[<INNER>] <JOIN> <FETCH> path()
-}
-
-
-void path() #PATH : { }
-{
-	// a path is any dot-separated path expression starting with a
-	// non-reserved word
-	identification_variable() (<DOT> path_component())+
-}
-
-
-void update_clause() : { }
-{
-	<UPDATE> from_item() #FROM set_clause()
-}
-
-
-void set_clause() : { }
-{
-	<SET> update_item() (<COMMA> update_item())*
-}
-
-
-void update_item() #UPDATEITEM : { }
-{
-	path() EQ() new_value()
-}
-
-
-void new_value() #UPDATEVALUE : { }
-{
-	LOOKAHEAD(arithmetic_expression()) arithmetic_expression() |
-	LOOKAHEAD(string_primary()) string_primary() |
-	LOOKAHEAD(datetime_primary()) datetime_primary() |
-	LOOKAHEAD(boolean_primary()) boolean_primary() |
-	LOOKAHEAD(enum_primary()) enum_primary() |
-	LOOKAHEAD(simple_entity_expression()) simple_entity_expression() |
-	<NULL>
-}
-
-
-void simple_entity_expression() : { }
-{
-	identification_variable() | input_parameter()
-}
-
-
-void select_clause() #SELECTCLAUSE : { }
-{
-	<SELECT> [distinct()] select_expressions()
-}
-
-
-void simple_select_clause() #SELECTCLAUSE : { }
-{
-	<SELECT> [distinct()] subselect_expressions() 
-}
-
-
-void select_expressions() #SELECTEXPRESSIONS : { }
-{
-	select_expression() (<COMMA> select_expression())*
-}
-
-
-void select_expression() #SELECTEXPRESSION : { }
-{
-	aggregate_select_expression()
-		| LOOKAHEAD(path()) path()
-		| identification_variable()
-		| (<OBJECT> "(" identification_variable() ")")
-		| constructor_expression()
-		| select_extension()
-}
-
-
-void select_extension() #SELECTEXTENSION : { }
-{
-    scalar_function()
-}
-
-
-void subselect_expressions() #SELECTEXPRESSIONS : { }
-{
-	subselect_expression() (<COMMA> subselect_expression())*
-}
-
-
-void subselect_expression() #SELECTEXPRESSION : { }
-{
-	LOOKAHEAD(path()) path() 
-		| aggregate_select_expression()
-		| LOOKAHEAD(1) identification_variable()
-}
-
-
-void constructor_expression() #CONSTRUCTOR : { }
-{
-	<NEW> classname() constructor_parameters()
-}
-
-
-void classname() #CLASSNAME :
-{ Token t; }
-{
-	identification_variable() (<DOT> identification_variable())*
-}
-
-
-void constructor_parameters() #CONSTRUCTORPARAMS : { }
-{
-	"(" (constructor_parameter()) (<COMMA> (constructor_parameter()))* ")" 
-}
-
-
-void constructor_parameter() #CONSTRUCTORPARAM : { }
-{
-	(path() | aggregate_select_expression())
-}
-
-
-/* rewritten to reduce lookaheads */
-void aggregate_select_expression() #AGGREGATE : { }
-{
-	(avg() | max() | min() | sum() | count())
-}
-
-
-void distinct() #DISTINCT : { }
-{
-	<DISTINCT>
-}
-
-
-void aggregate_path() : { }
-{
-	"(" (
-		LOOKAHEAD(arithmetic_expression()) arithmetic_expression() |
-		LOOKAHEAD(distinct_path()) distinct_path() |
-		LOOKAHEAD(path()) path() |
-		LOOKAHEAD(identification_variable()) identification_variable()
-	) ")"
-}
-
-
-void distinct_path() #DISTINCTPATH : { }
-{
-	<DISTINCT> (LOOKAHEAD(path()) path() | identification_variable())
-}
-
-
-void count() #COUNT : { }
-{
-	<COUNT> aggregate_path()
-}
-
-
-void avg() #AVERAGE : { }
-{
-	<AVG> aggregate_path()
-}
-
-
-void max() #MAX : { }
-{
-	<MAX> aggregate_path()
-}
-
-
-void min() #MIN : { }
-{
-	<MIN> aggregate_path()
-}
-
-
-void sum() #SUM : { }
-{
-	<SUM> aggregate_path()
-}
-
-
-void where_clause() #WHERE : { }
-{
-	<WHERE> conditional_expression() 
-}
-
-
-void groupby_clause() #GROUPBY : { }
-{
-	<GROUP> <BY> groupby_item()
-		(LOOKAHEAD(2) <COMMA> (groupby_item()))* 
-}
-
-
-void groupby_item() : { }
-{
-	LOOKAHEAD(path()) path() | identification_variable() | groupby_extension()
-}
-
-
-void groupby_extension() #GROUPBYEXTENSION : { }
-{
-    scalar_function()
-}
-
-
-void having_clause() #HAVING : { }
-{
-	<HAVING> conditional_expression() 
-}
-
-
-void subquery() #SUBSELECT : { }
-{
-	simple_select_clause()
-		subquery_from_clause() 
-		[LOOKAHEAD(where_clause()) where_clause()] 
-		[LOOKAHEAD(groupby_clause()) groupby_clause()] 
-		[LOOKAHEAD(having_clause()) having_clause()] 
-}
-
-
-/* changed to eliminate left recursion */
-void conditional_expression() : { }
-{
-	conditional_term() (LOOKAHEAD(2) <OR> (conditional_expression() #OR(2)))*
-}
-
-
-/* changed to eliminate left recursion */
-void conditional_term() : { }
-{
-	conditional_factor() (LOOKAHEAD(2) <AND> (conditional_term() #AND(2)))*
-}
-
-
-void conditional_factor() : { }
-{
-	LOOKAHEAD(<NOT> conditional_primary())
-	(<NOT> conditional_primary() #NOT) | conditional_primary()
-}
-
-
-void conditional_primary() : { }
-{
-	LOOKAHEAD(simple_cond_expression())
-	simple_cond_expression() | "(" conditional_expression() ")" 
-}
-
-
-void simple_cond_expression() : { }
-{
-	//LOOKAHEAD(all_or_any_expression()) all_or_any_expression() |
-	LOOKAHEAD(exists_expression()) exists_expression() |
-	LOOKAHEAD(comparison_expression()) comparison_expression() | 
-	LOOKAHEAD(between_expression()) between_expression() | 
-	LOOKAHEAD(like_expression()) like_expression() | 
-	LOOKAHEAD(in_expression()) in_expression() | 
-	LOOKAHEAD(null_comparison_expression()) null_comparison_expression() | 
-	LOOKAHEAD(empty_collection_comparison_expression()) empty_collection_comparison_expression() | 
-	LOOKAHEAD(collection_member_expression()) collection_member_expression()
-}
-
-
-void between_expression() #BETWEEN : { }
-{
-	LOOKAHEAD(6) arithmetic_expression()
-		[<NOT> { jjtThis.not = true; }] <BETWEEN> arithmetic_expression()
-		<AND> arithmetic_expression()
-	| LOOKAHEAD(6) string_expression()
-		[<NOT> { jjtThis.not = true; }] <BETWEEN> string_expression() <AND> string_expression()
-	| LOOKAHEAD(6) datetime_expression()
-		[<NOT> { jjtThis.not = true; }] <BETWEEN> datetime_expression() <AND> datetime_expression()
-}
-
-
-void in_expression() #IN : { }
-{
-	path() [ LOOKAHEAD(1) <NOT> { jjtThis.not = true; }] <IN>
-		"(" (literal_or_param()
-			(<COMMA> (literal_or_param()))* | subquery())
-		")" 
-}
-
-
-void literal_or_param() : { }
-{
-	(numeric_literal()
-	| string_literal()
-	| boolean_literal()
-	| input_parameter())
-}
-
-
-void like_expression() #LIKE : { }
-{
-	string_expression() [<NOT> { jjtThis.not = true; }] <LIKE> pattern_value() 
-}
-
-
-void null_comparison_expression() #ISNULL : { }
-{
-	(input_parameter() | path() | aggregate_select_expression())
-	<IS> [<NOT> { jjtThis.not = true; }] <NULL> 
-}
-
-
-void empty_collection_comparison_expression() #ISEMPTY : { }
-{
-	path() <IS> [<NOT> { jjtThis.not = true; }] <EMPTY> 
-}
-
-
-void collection_member_expression() #MEMBEROF : { }
-{
-	(LOOKAHEAD(path()) path() | input_parameter() | path_component()) 
-	[<NOT> { jjtThis.not = true; }] <MEMBER> [<OF>] path()
-}
-
-
-void exists_expression() #EXISTS : { }
-{
-	[<NOT> { jjtThis.not = true; }] <EXISTS> "(" subquery() ")" 
-}
-
-
-void all_or_any_expression() : { }
-{
-	any_expression() | some_expression() | all_expression()
-}
-
-
-void any_expression() #ANY : { }
-{
-	<ANY> "(" subquery() ")" 
-}
-
-
-void some_expression() #ANY : { }
-{
-	// SOME and ANY are synonymous
-	<SOME> "(" subquery() ")" 
-}
-
-
-void all_expression() #ALL : { }
-{
-	<ALL> "(" subquery() ")" 
-}
-
-
-void comparison_expression() : { }
-{
-	// comparison_expression ::= string_value comparison_operator {string_expression | all_or_any_expression} | boolean_value { =|<>} {boolean_expression | all_or_any_expression} | datetime_primary comparison_operator {datetime_expression | all_or_any_expression} | entity_bean_value { = | <> } {entity_bean_expression | all_or_any_expression} | arithmetic_value comparison_operator {arithmetic_expression | all_or_any_expression
-
-	LOOKAHEAD(arithmetic_comp()) arithmetic_comp() |
-	LOOKAHEAD(string_comp()) string_comp() |
-	LOOKAHEAD(boolean_comp()) boolean_comp() | 
-	LOOKAHEAD(enum_comp()) enum_comp() | 
-	LOOKAHEAD(datetime_comp()) datetime_comp() |
-	LOOKAHEAD(entity_comp()) entity_comp()
-}
-
-
-void string_comp() : { }
-{
-	string_expression() (
-		(<EQ> (string_expression()|all_or_any_expression()) #EQUALS(2))
-		| (<NE> (string_expression()|all_or_any_expression()) #NOTEQUALS(2))
-		| (<GT> (string_expression() | all_or_any_expression()) #GREATERTHAN(2))
-		| (<GE> (string_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
-		| (<LT> (string_expression() | all_or_any_expression()) #LESSTHAN(2))
-		| (<LE> (string_expression() | all_or_any_expression()) #LESSOREQUAL(2))
-		)
-}
-
-
-void boolean_comp() : { }
-{
-	boolean_expression() (
-	(<EQ> (boolean_expression() | all_or_any_expression()) #EQUALS(2))
-	| (<NE> (boolean_expression() | all_or_any_expression()) #NOTEQUALS(2))
-	)
-}
-
-void enum_comp() : { }
-{
-	enum_expression() (
-	(<EQ> (enum_expression() | all_or_any_expression()) #EQUALS(2))
-	| (<NE> (enum_expression() | all_or_any_expression()) #NOTEQUALS(2))
-	)
-}
-
-void entity_comp() : { }
-{
-	entity_bean_expression() (
-	(<EQ> ((LOOKAHEAD(all_or_any_expression()) all_or_any_expression() | entity_bean_expression()) #EQUALS(2)))
-	| (<NE> ((LOOKAHEAD(all_or_any_expression()) all_or_any_expression() | entity_bean_expression()) #NOTEQUALS(2)))
-	)
-}
-
-
-void arithmetic_comp() : { }
-{
-	// arithmetic_value() (
-	arithmetic_expression() (
-	(<EQ> (arithmetic_expression() | all_or_any_expression()) #EQUALS(2))
-	| (<GT> (arithmetic_expression() | all_or_any_expression()) #GREATERTHAN(2))
-	| (<GE> (arithmetic_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
-	| (<LT> (arithmetic_expression() | all_or_any_expression()) #LESSTHAN(2))
-	| (<LE> (arithmetic_expression() | all_or_any_expression()) #LESSOREQUAL(2))
-	| (<NE> (arithmetic_expression() | all_or_any_expression()) #NOTEQUALS(2))
-	)
-}
-
-
-void datetime_comp() : { }
-{
-	datetime_expression() (
-	(<EQ> (datetime_expression() | all_or_any_expression()) #EQUALS(2))
-	| (<GT> (datetime_expression() | all_or_any_expression()) #GREATERTHAN(2))
-	| (<GE> (datetime_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
-	| (<LT> (datetime_expression() | all_or_any_expression()) #LESSTHAN(2))
-	| (<LE> (datetime_expression() | all_or_any_expression()) #LESSOREQUAL(2))
-	| (<NE> (datetime_expression() | all_or_any_expression()) #NOTEQUALS(2))
-	)
-}
-
-void scalar_function() : { }
-{
-    functions_returning_numerics()
-        | functions_returning_datetime()
-        | functions_returning_strings()
-}
-
-void arithmetic_value() : { }
-{
-	path() | functions_returning_numerics() | "(" subquery() ")"
-}
-
-
-/* changed to eliminate left recursion */
-void arithmetic_expression() : { }
-{
-	arithmetic_term()
-		((<PLUS> arithmetic_expression() #ADD(2))
-		| (<MINUS> arithmetic_expression() #SUBTRACT(2)))*
-}
-
-
-/* changed to eliminate left recursion */
-void arithmetic_term() : { }
-{
-	arithmetic_factor()
-		((<TIMES> arithmetic_term() #MULTIPLY(2))
-		| (<DIV> arithmetic_term() #DIVIDE(2)))*
-}
-
-
-void arithmetic_factor() : { }
-{
-	numeric_literal() | 
-	input_parameter() | 
-	path() |
-	LOOKAHEAD(2) "(" arithmetic_expression() ")" | 
-	functions_returning_numerics() | 
-	aggregate_select_expression() |	
-	subquery()
-}
-
-
-void negative() #NEGATIVE : { }
-{
-	<MINUS>
-}
-
-
-void string_value() : { }
-{
-	path() | functions_returning_strings() | "(" subquery() ")"
-}
-
-
-void string_expression() : { }
-{
-	input_parameter() | string_primary()
-}
-
-
-void string_primary() : { }
-{
-	string_literal() | path() | LOOKAHEAD(2) "(" string_expression() ")" | 
-	functions_returning_strings() | LOOKAHEAD(2)  "(" subquery() ")"
-}
-
-
-void datetime_expression() : { }
-{
-	datetime_primary() | "(" subquery() ")"
-}
-
-
-void datetime_primary() : { }
-{
-	path() | functions_returning_datetime() | input_parameter() | aggregate_select_expression()
-}
-
-
-void boolean_value() : { }
-{
-	path() | "(" subquery() ")"
-}
-
-
-void boolean_expression() : { }
-{
-	boolean_primary() | "(" subquery() ")"
-}
-
-
-void boolean_primary() : { }
-{
-	LOOKAHEAD(2) path() | boolean_literal() | input_parameter()
-}
-
-
-void enum_expression() : { }
-{
-	enum_primary() | "(" subquery() ")"
-}
-
-
-void enum_primary() : { }
-{
-	LOOKAHEAD(2) path()
-	| LOOKAHEAD(enum_literal()) enum_literal()
-	| LOOKAHEAD(input_parameter()) input_parameter()
-}
-
-
-void enum_literal() : { }
-{
-	{ inEnumPath = true; }
-	path()
-	{ inEnumPath = false; }
-}
-
-
-void entity_bean_value() : { }
-{
-	LOOKAHEAD(path()) path() | path_component()
-}
-
-
-void entity_bean_expression() : { }
-{
-	input_parameter() | entity_bean_value()
-}
-
-
-void functions_returning_strings() : { }
-{
-	concat() | substring() | trim() | lower() | upper()
-}
-
-
-void concat() #CONCAT : { }
-{
-	<CONCAT> "(" string_expression() <COMMA> string_expression() ")"
-}
-
-
-void substring() #SUBSTRING : { }
-{
-	<SUBSTRING> "(" string_expression() <COMMA> arithmetic_expression() <COMMA> arithmetic_expression() ")"
-}
-
-
-void trim() #TRIM : { }
-{
-	<TRIM> "(" [LOOKAHEAD(2)[trim_specification()] [trim_character()] <FROM>]
-		string_expression() ")"
-}
-
-
-void lower() #LOWER : { }
-{
-	<LOWER> "(" string_expression() ")"
-}
-
-
-void upper() #UPPER : { }
-{
-	<UPPER> "(" string_expression() ")"
-}
-
-
-
-void trim_specification() : { }
-{
-	LOOKAHEAD(2) (<LEADING> #TRIMLEADING) | (<TRAILING> #TRIMTRAILING) | (<BOTH> #TRIMBOTH)
-}
-
-
-void functions_returning_numerics() : { }
-{
-	length() | locate() | abs() | sqrt() | mod() | size()
-}
-
-
-void length() #LENGTH : { }
-{
-	<LENGTH> "(" string_expression() ")"
-
-}
-
-
-void locate() #LOCATE : { }
-{
-	<LOCATE> "(" string_expression() <COMMA> string_expression()
-		[<COMMA> arithmetic_expression()] ")"
-
-}
-
-
-void abs() #ABS : { }
-{
-	<ABS> "(" arithmetic_expression() ")"
-
-}
-
-
-void sqrt() #SQRT : { }
-{
-	<SQRT> "(" arithmetic_expression() ")"
-
-}
-
-
-void mod() #MOD : { }
-{
-	<MOD> "(" arithmetic_expression() <COMMA> arithmetic_expression() ")"
-
-}
-
-
-void size() #SIZE : { }
-{
-	<SIZE> "(" path() ")"
-}
-
-
-void functions_returning_datetime() : { }
-{
-	(<CURRENT_DATE> #CURRENTDATE)
-	| (<CURRENT_TIME> #CURRENTTIME)
-	| (<CURRENT_TIMESTAMP> #CURRENTTIMESTAMP)
-}
-
-
-void orderby_clause() #ORDERBY : { }
-{
-	<ORDER> <BY> orderby_item() (<COMMA> orderby_item())* 
-}
-
-
-void orderby_item() #ORDERBYITEM : { }
-{
-	(LOOKAHEAD(path()) path() | orderby_extension())
-	    [ <ASC> #ASCENDING | <DESC> #DESCENDING ]
-}
-
-
-void orderby_extension() #ORDERBYEXTENSION : { }
-{
-    aggregate_select_expression()
-}
-
-
-void abstract_schema_name() #ABSTRACTSCHEMANAME : { }
-{
-	path_component() (<DOT> path_component())*
-}
-
-
-void tok() #TOK :
-{ Token t; }
-{
-	t = <IDENTIFIER> { jjtThis.setToken (t); }
-}
-
-
-void identification_variable() #IDENTIFIER :
-{ Token t; }
-{
-	t = <IDENTIFIER> { jjtThis.setToken (t); }
-}
-
-
-void path_component() #IDENTIFICATIONVARIABLE :
-{ Token t; }
-{
-	// unlike the identifier(), the path_component() *can* be a
-	// reserved word. E.g., Order.group.length is a perfectly
-	// valid path expression
-	(
-	t = <NEW>
-	| t = <ALL>
-	| t = <ANY>
-	| t = <EXISTS>
-	| t = <SOME>
-	| t = <EMPTY>
-	| t = <ASC>
-	| t = <DESC>
-	| t = <ORDER>
-	| t = <IS>
-	| t = <MEMBER>
-	| t = <OF>
-	| t = <LIKE>
-	| t = <ESCAPE>
-	| t = <BETWEEN>
-	| t = <NULL>
-	| t = <AVG>
-	| t = <MIN>
-	| t = <MAX>
-	| t = <SUM>
-	| t = <COUNT>
-	| t = <OR>
-	| t = <AND>
-	| t = <NOT>
-	| t = <CONCAT>
-	| t = <SUBSTRING>
-	| t = <TRIM>
-	| t = <LOWER>
-	| t = <UPPER>
-	| t = <LEADING>
-	| t = <TRAILING>
-	| t = <BOTH>
-	| t = <LENGTH>
-	| t = <LOCATE>
-	| t = <ABS>
-	| t = <SQRT>
-	| t = <MOD>
-	| t = <SIZE>
-	| t = <CURRENT_DATE>
-	| t = <CURRENT_TIME>
-	| t = <CURRENT_TIMESTAMP>
-	| t = <SELECT>
-	| t = <DISTINCT>
-	| t = <FROM>
-	| t = <UPDATE>
-	| t = <DELETE>
-	| t = <WHERE>
-	| t = <GROUP>
-	| t = <BY>
-	| t = <HAVING>
-	| t = <AS>
-	| t = <LEFT>
-	| t = <OUTER>
-	| t = <INNER>
-	| t = <JOIN>
-	| t = <FETCH>
-	| t = <IN>
-	| t = <SET>
-	| t = <OBJECT>
-	| t = <IDENTIFIER>
-    ) { jjtThis.setToken (t); }
-}
-
-
-void numeric_literal() : { }
-{
-	LOOKAHEAD(decimal_literal()) decimal_literal() | integer_literal()
-}
-
-
-void integer_literal() #INTEGERLITERAL :
-{ Token t; }
-{
-	[<PLUS> | negative()] t = <INTEGER_LITERAL> { jjtThis.setToken (t); }
-}
-
-
-void decimal_literal() #DECIMALLITERAL :
-{ Token t; }
-{
-	 [<PLUS> | negative()] t = <DECIMAL_LITERAL> { jjtThis.setToken (t); }
-}
-
-
-void boolean_literal() #BOOLEANLITERAL :
-{ Token t; }
-{
-	t = <BOOLEAN_LITERAL> { jjtThis.setToken (t); }
-}
-
-
-void string_literal() #STRINGLITERAL :
-{ Token t; }
-{
-	t = <STRING_LITERAL> { jjtThis.setToken (t); }
-}
-
-
-void input_parameter() : { }
-{
-	named_input_parameter() | positional_input_parameter()
-}
-
-
-void named_input_parameter() #NAMEDINPUTPARAMETER :
-{ Token t; }
-{
-	":" t = <IDENTIFIER> { jjtThis.setToken (t); }
-}
-
-
-void positional_input_parameter() #POSITIONALINPUTPARAMETER :
-{ Token t; }
-{
-	"?" t = <INTEGER_LITERAL> { jjtThis.setToken (t); }
-}
-
-
-void pattern_value() #PATTERNVALUE : { }
-{
-	(input_parameter() | string_literal())
-	[(<ESCAPE> escape_character() #ESCAPECHARACTER)]
-}
-
-
-void escape_character() #ESCAPECHARACTER :
-{ Token t; }
-{
-	t = <STRING_LITERAL> { jjtThis.setToken (t); }
-}
-
-
-void trim_character() #TRIMCHARACTER :
-{ Token t; }
-{
-	t = <STRING_LITERAL> { jjtThis.setToken (t); }
-}
-
-
-void EQ() #EQUALS : { }
-{
-	<EQ>
-}
-
-
-void NE() #NOTEQUALS : { }
-{
-	<NE>
-}
-
-
-void GT() #GREATERTHAN : { }
-{
-	<GT>
-}
-
-
-void GE() #GREATEROREQUAL : { }
-{
-	<GE>
-}
-
-
-void LT() #LESSTHAN : { }
-{
-	<LT>
-}
-
-
-void LE() #LESSOREQUAL : { }
-{
-	<LE>
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *  
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.   
+ */
+
+/**
+ *  An JP QL grammar parser.
+ * 
+ *  Samples:
+ *	  SELECT COUNT(p) FROM Person AS p
+ *	  SELECT OBJECT(identifier) FROM schema identifier
+ *	  SELECT identifier FROM schema AS identifier
+ *	
+ *	@author Patrick Linskey
+ *	@author Marc Prud'hommeaux
+ */
+options {
+	NODE_PREFIX = "JPQL";
+	NODE_PACKAGE = "org.apache.openjpa.kernel.jpql";
+	MULTI = false;
+	NODE_DEFAULT_VOID = true;
+	JAVA_UNICODE_ESCAPE = true;
+	STATIC = false;
+	NODE_USES_PARSER = true;
+
+	LOOKAHEAD = 1;
+
+
+	// debugging variables
+	// DEBUG_PARSER = true; 		// simple parser debug
+	// DEBUG_TOKEN_MANAGER = true; 	// more verbose token manager debug
+	// DEBUG_LOOKAHEAD = true; 		// more verbose lookahead debug
+
+	SANITY_CHECK = true; // check for left-recursion, etc (must always be true)
+
+
+	// FORCE_LA_CHECK = true;
+}
+
+PARSER_BEGIN(JPQL)
+package org.apache.openjpa.kernel.jpql;
+
+import java.io.*;
+
+
+
+/**
+ *	@nojavadoc
+ */
+public class JPQL
+{
+	String jpql;
+	boolean inEnumPath;
+
+
+	public JPQL (String jpql)
+	{
+		this (new StringReader (jpql));
+
+		this.jpql = jpql;
+	}
+
+
+	public static void main (String[] args)
+		throws Exception
+	{
+		if (args.length > 0)
+		{
+			for (int i = 0; i < args.length; i++)
+			{
+				JPQL parser = new JPQL (args[i]);
+				SimpleNode ast = (SimpleNode) parser.parseQuery ();
+				ast.dump (System.out, "");
+			}
+		}
+		else
+		{
+			JPQL parser = new JPQL (System.in);
+			while (true)
+			{
+				System.out.print ("Enter Expression: ");
+				System.out.flush ();
+				try
+				{
+					SimpleNode ast = (SimpleNode) parser.parseQuery ();
+					if (ast == null)
+						return;
+					else
+						ast.dump (System.out, "");
+				}
+				catch (Throwable x)
+				{
+					x.printStackTrace ();
+					return;
+				}
+			}
+		}
+	}
+}
+
+PARSER_END(JPQL)
+
+
+SKIP :
+{
+ 	" "
+    | "\n"
+	| "\r"
+	| "\t"
+}
+
+
+TOKEN [ IGNORE_CASE ]: /* basics */
+{
+	< COMMA: "," >
+
+	|	< DOT: "." >
+
+	|	< EQ: "=" >
+	|	< NE: "<>" >
+	|	< GT: ">" >
+	|	< GE: ">=" >
+	|	< LT: "<" >
+	|	< LE: "<=" >
+
+	|	< PLUS: "+" >
+	|	< MINUS: "-" >
+
+	|	< TIMES: "*" >
+	|	< DIV: "/" >
+
+	|	< NEW: "NEW" >
+
+	|	< ALL: "ALL" >
+	|	< ANY: "ANY" >
+	|	< EXISTS: "EXISTS" >
+	|	< SOME: "SOME" >
+	|	< EMPTY: "EMPTY" >
+
+	|	< ASC: "ASC" >
+	|	< DESC: "DESC" >
+	|	< ORDER: "ORDER" >
+	|	< BY: "BY" >
+
+	|	< IS: "IS" >
+	|	< MEMBER: "MEMBER" >
+	|	< OF: "OF" >
+	|	< LIKE: "LIKE" >
+	|	< ESCAPE: "ESCAPE" >
+	|	< BETWEEN: "BETWEEN" >
+
+	|	< NULL: "NULL" >
+}
+
+TOKEN [ IGNORE_CASE ]: /* aggregates */
+{
+	< AVG: "AVG" >
+	|	< MIN: "MIN" >
+	|	< MAX: "MAX" >
+	|	< SUM: "SUM" >
+	|	< COUNT: "COUNT" >
+}
+
+TOKEN [ IGNORE_CASE ]: /* boolean arithmetic */
+{
+	< OR: "OR" >
+	|	< AND: "AND" >
+	|	< NOT: "NOT" >
+}
+
+TOKEN [ IGNORE_CASE ]: /* functions returning strings */
+{
+	< CONCAT: "CONCAT" >
+	|	< SUBSTRING: "SUBSTRING" >
+	|	< TRIM: "TRIM" >
+	|	< LOWER: "LOWER" >
+	|	< UPPER: "UPPER" >
+}
+
+TOKEN [ IGNORE_CASE ]: /* trim specification */
+{
+	< LEADING: "LEADING" >
+	|	< TRAILING: "TRAILING" >
+	|	< BOTH: "BOTH" >
+}
+
+
+TOKEN [ IGNORE_CASE ]: /* functions returning numerics */
+{
+	< LENGTH: "LENGTH" >
+	|	< LOCATE: "LOCATE" >
+	|	< ABS: "ABS" >
+	|	< SQRT: "SQRT" >
+	|	< MOD: "MOD" >
+	|	< SIZE: "SIZE" >
+}
+
+
+TOKEN [ IGNORE_CASE ]: /* functions returning datetime */
+{
+	< CURRENT_DATE: "CURRENT_DATE" >
+	|	< CURRENT_TIME: "CURRENT_TIME" >
+	|	< CURRENT_TIMESTAMP: "CURRENT_TIMESTAMP" >
+}
+
+TOKEN [ IGNORE_CASE ]: /* type of query */
+{
+	< SELECT: "SELECT" >
+	|	< DISTINCT: "DISTINCT" >
+	|	< FROM: "FROM" >
+
+	|	< UPDATE: "UPDATE" >
+	|	< DELETE: "DELETE" >
+
+	|	< WHERE: "WHERE" >
+	|	< GROUP: "GROUP" >
+	|	< HAVING: "HAVING" >
+
+	|	< AS: "AS" >
+	|	< LEFT: "LEFT" >
+	|	< OUTER: "OUTER" >
+	|	< INNER: "INNER" >
+	|	< JOIN: "JOIN" >
+	|	< FETCH: "FETCH" >
+	|	< IN: "IN" >
+	|	< SET: "SET" >
+
+	|	< OBJECT: "OBJECT" >
+}
+
+
+/* inspired by the Java 1.0.2 specification */
+/* ### should we limit this to the length that is valid in java? */
+TOKEN : /* literals */
+{
+	< INTEGER_LITERAL: ((["0"-"9"])+) (["l","L"])? >
+	| < DECIMAL_LITERAL:
+		(((["0"-"9"])* "." (["0"-"9"])+) (<EXPONENT>)? (["f","F","d","D"])?
+		| ((["0"-"9"])+ ".") (<EXPONENT>)? (["f","F","d","D"])?
+		| ((["0"-"9"])+) (<EXPONENT>) (["f","F","d","D"])?
+		| ((["0"-"9"])+) (<EXPONENT>)? (["f","F","d","D"])?) >
+	| < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
+	| < STRING_LITERAL: "'"
+	  (("''" | ~["'"])
+		/*
+	  (("''" | ~["'","\\","\n","\r"])
+		| ("\\"
+			( ["n","t","b","r","f","\\","'"]
+			| ["0"-"7"] ( ["0"-"7"] )?
+			| ["0"-"3"] ["0"-"7"] ["0"-"7"]
+			)
+		  )
+		*/
+	  )*
+	  "'"
+	>
+	| < CHARACTER_LITERAL: "'"
+	  (   (~["'","\\","\n","\r"])
+		| ("\\"
+			( ["n","t","b","r","f","\\","'"]
+			| ["0"-"7"] ( ["0"-"7"] )?
+			| ["0"-"3"] ["0"-"7"] ["0"-"7"]
+			)
+		  )
+	  )
+	  "'"
+	>
+}
+
+TOKEN [ IGNORE_CASE ]: /* boolean literals can be case-insensitive */
+{
+	< BOOLEAN_LITERAL: "TRUE" | "FALSE" >
+}
+
+/* From the Java 1.0.2 specification */
+TOKEN : /* IDENTIFIERS */
+{
+  < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
+	|
+  < #LETTER:
+	  [
+	   "\u0024", 			// $
+	   "\u0041"-"\u005a", 	// A-Z
+	   "\u005f", 			// _
+	   "\u0061"-"\u007a", 	// a-z
+	   "\u00c0"-"\u00d6",
+	   "\u00d8"-"\u00f6",
+	   "\u00f8"-"\u00ff",
+	   "\u0100"-"\u1fff",
+	   "\u3040"-"\u318f",
+	   "\u3300"-"\u337f",
+	   "\u3400"-"\u3d2d",
+	   "\u4e00"-"\u9fff",
+	   "\uf900"-"\ufaff"
+	  ]
+  >
+	|
+  < #DIGIT:
+	  [
+	   "\u0030"-"\u0039", 	// 0-9
+	   "\u0660"-"\u0669",
+	   "\u06f0"-"\u06f9",
+	   "\u0966"-"\u096f",
+	   "\u09e6"-"\u09ef",
+	   "\u0a66"-"\u0a6f",
+	   "\u0ae6"-"\u0aef",
+	   "\u0b66"-"\u0b6f",
+	   "\u0be7"-"\u0bef",
+	   "\u0c66"-"\u0c6f",
+	   "\u0ce6"-"\u0cef",
+	   "\u0d66"-"\u0d6f",
+	   "\u0e50"-"\u0e59",
+	   "\u0ed0"-"\u0ed9",
+	   "\u1040"-"\u1049"
+	  ]
+  >
+}
+
+
+Node parseQuery() : { }
+{
+	(select_statement() | update_statement() | delete_statement()) <EOF>
+	{
+		return jjtree.rootNode();
+	}
+}
+
+
+void select_statement() #SELECT : { }
+{
+	select_clause()
+		from_clause()
+		[where_clause()]
+		[groupby_clause()]
+		[having_clause()]
+		[orderby_clause()]
+}
+
+
+void update_statement() #UPDATE : { }
+{
+	update_clause() [ where_clause() ]
+}
+
+
+void delete_statement() #DELETE : { }
+{
+	<DELETE> <FROM> (from_item() #FROM) [where_clause()]
+}
+
+
+void from_clause() #FROM : { }
+{
+	<FROM> identification_variable_declaration()
+	(LOOKAHEAD(1) <COMMA> (LOOKAHEAD(collection_member_declaration()) collection_member_declaration() | LOOKAHEAD(identification_variable_declaration())identification_variable_declaration()))*
+}
+
+
+void identification_variable_declaration(): { }
+{
+	from_item() (LOOKAHEAD(fetch_join()) fetch_join() | LOOKAHEAD(inner_join()) inner_join() | LOOKAHEAD(outer_join()) outer_join())*
+}
+
+
+void from_item() #FROMITEM : { }
+{
+	abstract_schema_name() [LOOKAHEAD(1)<AS>] [LOOKAHEAD(identification_variable())identification_variable()]
+}
+
+
+void subquery_from_clause() #FROM : { }
+{
+	<FROM> subquery_from_item()
+		( LOOKAHEAD(1) <COMMA> subquery_from_item() )*
+}
+
+void subquery_from_item() : { }
+{
+        LOOKAHEAD(collection_member_declaration()) collection_member_declaration()
+	| LOOKAHEAD(identification_variable_declaration()) identification_variable_declaration()
+}
+
+void inner_join() #INNERJOIN : { }
+{
+	[<INNER>] <JOIN> path() [<AS>] identification_variable()
+}
+
+
+void collection_member_declaration() #INNERJOIN : { }
+{
+	// synonymous with "INNER JOIN path AS identifier" (InnerJoin)
+	<IN> "(" path() ")" [ LOOKAHEAD(1)<AS>] identification_variable()
+}
+
+void outer_join() #OUTERJOIN : { }
+{
+	<LEFT> [ <OUTER>] <JOIN> path() [ LOOKAHEAD(1)<AS>] identification_variable()
+}
+
+
+void fetch_join() : { }
+{
+	outer_fetch_join() | inner_fetch_join()
+}
+
+
+void outer_fetch_join() #OUTERFETCHJOIN : { }
+{
+	<LEFT> [<OUTER>] <JOIN> <FETCH> path()
+}
+
+
+void inner_fetch_join() #INNERFETCHJOIN : { }
+{
+	[<INNER>] <JOIN> <FETCH> path()
+}
+
+
+void path() #PATH : { }
+{
+	// a path is any dot-separated path expression starting with a
+	// non-reserved word
+	identification_variable() (<DOT> path_component())+
+}
+
+
+void update_clause() : { }
+{
+	<UPDATE> from_item() #FROM set_clause()
+}
+
+
+void set_clause() : { }
+{
+	<SET> update_item() (<COMMA> update_item())*
+}
+
+
+void update_item() #UPDATEITEM : { }
+{
+	path() EQ() new_value()
+}
+
+
+void new_value() #UPDATEVALUE : { }
+{
+	LOOKAHEAD(arithmetic_expression()) arithmetic_expression() |
+	LOOKAHEAD(string_primary()) string_primary() |
+	LOOKAHEAD(datetime_primary()) datetime_primary() |
+	LOOKAHEAD(boolean_primary()) boolean_primary() |
+	LOOKAHEAD(enum_primary()) enum_primary() |
+	LOOKAHEAD(simple_entity_expression()) simple_entity_expression() |
+	<NULL>
+}
+
+
+void simple_entity_expression() : { }
+{
+	identification_variable() | input_parameter()
+}
+
+
+void select_clause() #SELECTCLAUSE : { }
+{
+	<SELECT> [distinct()] select_expressions()
+}
+
+
+void simple_select_clause() #SELECTCLAUSE : { }
+{
+	<SELECT> [distinct()] subselect_expressions() 
+}
+
+
+void select_expressions() #SELECTEXPRESSIONS : { }
+{
+	select_expression() (<COMMA> select_expression())*
+}
+
+
+void select_expression() #SELECTEXPRESSION : { }
+{
+	aggregate_select_expression()
+		| LOOKAHEAD(path()) path()
+		| identification_variable()
+		| (<OBJECT> "(" identification_variable() ")")
+		| constructor_expression()
+		| select_extension()
+}
+
+
+void select_extension() #SELECTEXTENSION : { }
+{
+    scalar_function()
+}
+
+
+void subselect_expressions() #SELECTEXPRESSIONS : { }
+{
+	subselect_expression() (<COMMA> subselect_expression())*
+}
+
+
+void subselect_expression() #SELECTEXPRESSION : { }
+{
+	LOOKAHEAD(path()) path() 
+		| aggregate_select_expression()
+		| LOOKAHEAD(1) identification_variable()
+}
+
+
+void constructor_expression() #CONSTRUCTOR : { }
+{
+	<NEW> classname() constructor_parameters()
+}
+
+
+void classname() #CLASSNAME :
+{ Token t; }
+{
+	identification_variable() (<DOT> identification_variable())*
+}
+
+
+void constructor_parameters() #CONSTRUCTORPARAMS : { }
+{
+	"(" (constructor_parameter()) (<COMMA> (constructor_parameter()))* ")" 
+}
+
+
+void constructor_parameter() #CONSTRUCTORPARAM : { }
+{
+	(path() | aggregate_select_expression())
+}
+
+
+/* rewritten to reduce lookaheads */
+void aggregate_select_expression() #AGGREGATE : { }
+{
+	(avg() | max() | min() | sum() | count())
+}
+
+
+void distinct() #DISTINCT : { }
+{
+	<DISTINCT>
+}
+
+
+void aggregate_path() : { }
+{
+	"(" (
+		LOOKAHEAD(arithmetic_expression()) arithmetic_expression() |
+		LOOKAHEAD(distinct_path()) distinct_path() |
+		LOOKAHEAD(path()) path() |
+		LOOKAHEAD(identification_variable()) identification_variable()
+	) ")"
+}
+
+
+void distinct_path() #DISTINCTPATH : { }
+{
+	<DISTINCT> (LOOKAHEAD(path()) path() | identification_variable())
+}
+
+
+void count() #COUNT : { }
+{
+	<COUNT> aggregate_path()
+}
+
+
+void avg() #AVERAGE : { }
+{
+	<AVG> aggregate_path()
+}
+
+
+void max() #MAX : { }
+{
+	<MAX> aggregate_path()
+}
+
+
+void min() #MIN : { }
+{
+	<MIN> aggregate_path()
+}
+
+
+void sum() #SUM : { }
+{
+	<SUM> aggregate_path()
+}
+
+
+void where_clause() #WHERE : { }
+{
+	<WHERE> conditional_expression() 
+}
+
+
+void groupby_clause() #GROUPBY : { }
+{
+	<GROUP> <BY> groupby_item()
+		(LOOKAHEAD(2) <COMMA> (groupby_item()))* 
+}
+
+
+void groupby_item() : { }
+{
+	LOOKAHEAD(path()) path() | identification_variable() | groupby_extension()
+}
+
+
+void groupby_extension() #GROUPBYEXTENSION : { }
+{
+    scalar_function()
+}
+
+
+void having_clause() #HAVING : { }
+{
+	<HAVING> conditional_expression() 
+}
+
+
+void subquery() #SUBSELECT : { }
+{
+	simple_select_clause()
+		subquery_from_clause() 
+		[LOOKAHEAD(where_clause()) where_clause()] 
+		[LOOKAHEAD(groupby_clause()) groupby_clause()] 
+		[LOOKAHEAD(having_clause()) having_clause()] 
+}
+
+
+/* changed to eliminate left recursion */
+void conditional_expression() : { }
+{
+	conditional_term() (LOOKAHEAD(2) <OR> (conditional_expression() #OR(2)))*
+}
+
+
+/* changed to eliminate left recursion */
+void conditional_term() : { }
+{
+	conditional_factor() (LOOKAHEAD(2) <AND> (conditional_term() #AND(2)))*
+}
+
+
+void conditional_factor() : { }
+{
+	LOOKAHEAD(<NOT> conditional_primary())
+	(<NOT> conditional_primary() #NOT) | conditional_primary()
+}
+
+
+void conditional_primary() : { }
+{
+	LOOKAHEAD(simple_cond_expression())
+	simple_cond_expression() | "(" conditional_expression() ")" 
+}
+
+
+void simple_cond_expression() : { }
+{
+	//LOOKAHEAD(all_or_any_expression()) all_or_any_expression() |
+	LOOKAHEAD(exists_expression()) exists_expression() |
+	LOOKAHEAD(comparison_expression()) comparison_expression() | 
+	LOOKAHEAD(between_expression()) between_expression() | 
+	LOOKAHEAD(like_expression()) like_expression() | 
+	LOOKAHEAD(in_expression()) in_expression() | 
+	LOOKAHEAD(null_comparison_expression()) null_comparison_expression() | 
+	LOOKAHEAD(empty_collection_comparison_expression()) empty_collection_comparison_expression() | 
+	LOOKAHEAD(collection_member_expression()) collection_member_expression()
+}
+
+
+void between_expression() #BETWEEN : { }
+{
+	LOOKAHEAD(6) arithmetic_expression()
+		[<NOT> { jjtThis.not = true; }] <BETWEEN> arithmetic_expression()
+		<AND> arithmetic_expression()
+	| LOOKAHEAD(6) string_expression()
+		[<NOT> { jjtThis.not = true; }] <BETWEEN> string_expression() <AND> string_expression()
+	| LOOKAHEAD(6) datetime_expression()
+		[<NOT> { jjtThis.not = true; }] <BETWEEN> datetime_expression() <AND> datetime_expression()
+}
+
+
+void in_expression() #IN : { }
+{
+	path() [ LOOKAHEAD(1) <NOT> { jjtThis.not = true; }] <IN>
+		"(" (literal_or_param()
+			(<COMMA> (literal_or_param()))* | subquery())
+		")" 
+}
+
+
+void literal_or_param() : { }
+{
+	(numeric_literal()
+	| string_literal()
+	| boolean_literal()
+	| input_parameter())
+}
+
+
+void like_expression() #LIKE : { }
+{
+	string_expression() [<NOT> { jjtThis.not = true; }] <LIKE> pattern_value() 
+}
+
+
+void null_comparison_expression() #ISNULL : { }
+{
+	(input_parameter() | path() | aggregate_select_expression())
+	<IS> [<NOT> { jjtThis.not = true; }] <NULL> 
+}
+
+
+void empty_collection_comparison_expression() #ISEMPTY : { }
+{
+	path() <IS> [<NOT> { jjtThis.not = true; }] <EMPTY> 
+}
+
+
+void collection_member_expression() #MEMBEROF : { }
+{
+	(LOOKAHEAD(path()) path() | input_parameter() | path_component()) 
+	[<NOT> { jjtThis.not = true; }] <MEMBER> [<OF>] path()
+}
+
+
+void exists_expression() #EXISTS : { }
+{
+	[<NOT> { jjtThis.not = true; }] <EXISTS> "(" subquery() ")" 
+}
+
+
+void all_or_any_expression() : { }
+{
+	any_expression() | some_expression() | all_expression()
+}
+
+
+void any_expression() #ANY : { }
+{
+	<ANY> "(" subquery() ")" 
+}
+
+
+void some_expression() #ANY : { }
+{
+	// SOME and ANY are synonymous
+	<SOME> "(" subquery() ")" 
+}
+
+
+void all_expression() #ALL : { }
+{
+	<ALL> "(" subquery() ")" 
+}
+
+
+void comparison_expression() : { }
+{
+	// comparison_expression ::= string_value comparison_operator {string_expression | all_or_any_expression} | boolean_value { =|<>} {boolean_expression | all_or_any_expression} | datetime_primary comparison_operator {datetime_expression | all_or_any_expression} | entity_bean_value { = | <> } {entity_bean_expression | all_or_any_expression} | arithmetic_value comparison_operator {arithmetic_expression | all_or_any_expression
+
+	LOOKAHEAD(arithmetic_comp()) arithmetic_comp() |
+	LOOKAHEAD(string_comp()) string_comp() |
+	LOOKAHEAD(boolean_comp()) boolean_comp() | 
+	LOOKAHEAD(enum_comp()) enum_comp() | 
+	LOOKAHEAD(datetime_comp()) datetime_comp() |
+	LOOKAHEAD(entity_comp()) entity_comp()
+}
+
+
+void string_comp() : { }
+{
+	string_expression() (
+		(<EQ> (string_expression()|all_or_any_expression()) #EQUALS(2))
+		| (<NE> (string_expression()|all_or_any_expression()) #NOTEQUALS(2))
+		| (<GT> (string_expression() | all_or_any_expression()) #GREATERTHAN(2))
+		| (<GE> (string_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
+		| (<LT> (string_expression() | all_or_any_expression()) #LESSTHAN(2))
+		| (<LE> (string_expression() | all_or_any_expression()) #LESSOREQUAL(2))
+		)
+}
+
+
+void boolean_comp() : { }
+{
+	boolean_expression() (
+	(<EQ> (boolean_expression() | all_or_any_expression()) #EQUALS(2))
+	| (<NE> (boolean_expression() | all_or_any_expression()) #NOTEQUALS(2))
+	)
+}
+
+void enum_comp() : { }
+{
+	enum_expression() (
+	(<EQ> (enum_expression() | all_or_any_expression()) #EQUALS(2))
+	| (<NE> (enum_expression() | all_or_any_expression()) #NOTEQUALS(2))
+	)
+}
+
+void entity_comp() : { }
+{
+	entity_bean_expression() (
+	(<EQ> ((LOOKAHEAD(all_or_any_expression()) all_or_any_expression() | entity_bean_expression()) #EQUALS(2)))
+	| (<NE> ((LOOKAHEAD(all_or_any_expression()) all_or_any_expression() | entity_bean_expression()) #NOTEQUALS(2)))
+	)
+}
+
+
+void arithmetic_comp() : { }
+{
+	// arithmetic_value() (
+	arithmetic_expression() (
+	(<EQ> (arithmetic_expression() | all_or_any_expression()) #EQUALS(2))
+	| (<GT> (arithmetic_expression() | all_or_any_expression()) #GREATERTHAN(2))
+	| (<GE> (arithmetic_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
+	| (<LT> (arithmetic_expression() | all_or_any_expression()) #LESSTHAN(2))
+	| (<LE> (arithmetic_expression() | all_or_any_expression()) #LESSOREQUAL(2))
+	| (<NE> (arithmetic_expression() | all_or_any_expression()) #NOTEQUALS(2))
+	)
+}
+
+
+void datetime_comp() : { }
+{
+	datetime_expression() (
+	(<EQ> (datetime_expression() | all_or_any_expression()) #EQUALS(2))
+	| (<GT> (datetime_expression() | all_or_any_expression()) #GREATERTHAN(2))
+	| (<GE> (datetime_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
+	| (<LT> (datetime_expression() | all_or_any_expression()) #LESSTHAN(2))
+	| (<LE> (datetime_expression() | all_or_any_expression()) #LESSOREQUAL(2))
+	| (<NE> (datetime_expression() | all_or_any_expression()) #NOTEQUALS(2))
+	)
+}
+
+void scalar_function() : { }
+{
+    functions_returning_numerics()
+        | functions_returning_datetime()
+        | functions_returning_strings()
+}
+
+void arithmetic_value() : { }
+{
+	path() | functions_returning_numerics() | "(" subquery() ")"
+}
+
+
+/* changed to eliminate left recursion */
+void arithmetic_expression() : { }
+{
+	arithmetic_term()
+		((<PLUS> arithmetic_expression() #ADD(2))
+		| (<MINUS> arithmetic_expression() #SUBTRACT(2)))*
+}
+
+
+/* changed to eliminate left recursion */
+void arithmetic_term() : { }
+{
+	arithmetic_factor()
+		((<TIMES> arithmetic_term() #MULTIPLY(2))
+		| (<DIV> arithmetic_term() #DIVIDE(2)))*
+}
+
+
+void arithmetic_factor() : { }
+{
+	numeric_literal() | 
+	input_parameter() | 
+	path() |
+	LOOKAHEAD(2) "(" arithmetic_expression() ")" | 
+	functions_returning_numerics() | 
+	aggregate_select_expression() |	
+	subquery()
+}
+
+
+void negative() #NEGATIVE : { }
+{
+	<MINUS>
+}
+
+
+void string_value() : { }
+{
+	path() | functions_returning_strings() | "(" subquery() ")"
+}
+
+
+void string_expression() : { }
+{
+	input_parameter() | string_primary()
+}
+
+
+void string_primary() : { }
+{
+	string_literal() | path() | LOOKAHEAD(2) "(" string_expression() ")" | 
+	functions_returning_strings() | LOOKAHEAD(2)  "(" subquery() ")"
+}
+
+
+void datetime_expression() : { }
+{
+	datetime_primary() | "(" subquery() ")"
+}
+
+
+void datetime_primary() : { }
+{
+	path() | functions_returning_datetime() | input_parameter() | aggregate_select_expression()
+}
+
+
+void boolean_value() : { }
+{
+	path() | "(" subquery() ")"
+}
+
+
+void boolean_expression() : { }
+{
+	boolean_primary() | "(" subquery() ")"
+}
+
+
+void boolean_primary() : { }
+{
+	LOOKAHEAD(2) path() | boolean_literal() | input_parameter()
+}
+
+
+void enum_expression() : { }
+{
+	enum_primary() | "(" subquery() ")"
+}
+
+
+void enum_primary() : { }
+{
+	LOOKAHEAD(2) path()
+	| LOOKAHEAD(enum_literal()) enum_literal()
+	| LOOKAHEAD(input_parameter()) input_parameter()
+}
+
+
+void enum_literal() : { }
+{
+	{ inEnumPath = true; }
+	path()
+	{ inEnumPath = false; }
+}
+
+
+void entity_bean_value() : { }
+{
+	LOOKAHEAD(path()) path() | path_component()
+}
+
+
+void entity_bean_expression() : { }
+{
+	input_parameter() | entity_bean_value()
+}
+
+
+void functions_returning_strings() : { }
+{
+	concat() | substring() | trim() | lower() | upper()
+}
+
+
+void concat() #CONCAT : { }
+{
+	<CONCAT> "(" string_expression() <COMMA> string_expression() ")"
+}
+
+
+void substring() #SUBSTRING : { }
+{
+	<SUBSTRING> "(" string_expression() <COMMA> arithmetic_expression() <COMMA> arithmetic_expression() ")"
+}
+
+
+void trim() #TRIM : { }
+{
+	<TRIM> "(" [LOOKAHEAD(2)[trim_specification()] [trim_character()] <FROM>]
+		string_expression() ")"
+}
+
+
+void lower() #LOWER : { }
+{
+	<LOWER> "(" string_expression() ")"
+}
+
+
+void upper() #UPPER : { }
+{
+	<UPPER> "(" string_expression() ")"
+}
+
+
+
+void trim_specification() : { }
+{
+	LOOKAHEAD(2) (<LEADING> #TRIMLEADING) | (<TRAILING> #TRIMTRAILING) | (<BOTH> #TRIMBOTH)
+}
+
+
+void functions_returning_numerics() : { }
+{
+	length() | locate() | abs() | sqrt() | mod() | size()
+}
+
+
+void length() #LENGTH : { }
+{
+	<LENGTH> "(" string_expression() ")"
+
+}
+
+
+void locate() #LOCATE : { }
+{
+	<LOCATE> "(" string_expression() <COMMA> string_expression()
+		[<COMMA> arithmetic_expression()] ")"
+
+}
+
+
+void abs() #ABS : { }
+{
+	<ABS> "(" arithmetic_expression() ")"
+
+}
+
+
+void sqrt() #SQRT : { }
+{
+	<SQRT> "(" arithmetic_expression() ")"
+
+}
+
+
+void mod() #MOD : { }
+{
+	<MOD> "(" arithmetic_expression() <COMMA> arithmetic_expression() ")"
+
+}
+
+
+void size() #SIZE : { }
+{
+	<SIZE> "(" path() ")"
+}
+
+
+void functions_returning_datetime() : { }
+{
+	(<CURRENT_DATE> #CURRENTDATE)
+	| (<CURRENT_TIME> #CURRENTTIME)
+	| (<CURRENT_TIMESTAMP> #CURRENTTIMESTAMP)
+}
+
+
+void orderby_clause() #ORDERBY : { }
+{
+	<ORDER> <BY> orderby_item() (<COMMA> orderby_item())* 
+}
+
+
+void orderby_item() #ORDERBYITEM : { }
+{
+	(LOOKAHEAD(path()) path() | orderby_extension())
+	    [ <ASC> #ASCENDING | <DESC> #DESCENDING ]
+}
+
+
+void orderby_extension() #ORDERBYEXTENSION : { }
+{
+    aggregate_select_expression()
+}
+
+
+void abstract_schema_name() #ABSTRACTSCHEMANAME : { }
+{
+	path_component() (<DOT> path_component())*
+}
+
+
+void tok() #TOK :
+{ Token t; }
+{
+	t = <IDENTIFIER> { jjtThis.setToken (t); }
+}
+
+
+void identification_variable() #IDENTIFIER :
+{ Token t; }
+{
+	t = <IDENTIFIER> { jjtThis.setToken (t); }
+}
+
+
+void path_component() #IDENTIFICATIONVARIABLE :
+{ Token t; }
+{
+	// unlike the identifier(), the path_component() *can* be a
+	// reserved word. E.g., Order.group.length is a perfectly
+	// valid path expression
+	(
+	t = <NEW>
+	| t = <ALL>
+	| t = <ANY>
+	| t = <EXISTS>
+	| t = <SOME>
+	| t = <EMPTY>
+	| t = <ASC>
+	| t = <DESC>
+	| t = <ORDER>
+	| t = <IS>
+	| t = <MEMBER>
+	| t = <OF>
+	| t = <LIKE>
+	| t = <ESCAPE>
+	| t = <BETWEEN>
+	| t = <NULL>
+	| t = <AVG>
+	| t = <MIN>
+	| t = <MAX>
+	| t = <SUM>
+	| t = <COUNT>
+	| t = <OR>
+	| t = <AND>
+	| t = <NOT>
+	| t = <CONCAT>
+	| t = <SUBSTRING>
+	| t = <TRIM>
+	| t = <LOWER>
+	| t = <UPPER>
+	| t = <LEADING>
+	| t = <TRAILING>
+	| t = <BOTH>
+	| t = <LENGTH>
+	| t = <LOCATE>
+	| t = <ABS>
+	| t = <SQRT>
+	| t = <MOD>
+	| t = <SIZE>
+	| t = <CURRENT_DATE>
+	| t = <CURRENT_TIME>
+	| t = <CURRENT_TIMESTAMP>
+	| t = <SELECT>
+	| t = <DISTINCT>
+	| t = <FROM>
+	| t = <UPDATE>
+	| t = <DELETE>
+	| t = <WHERE>
+	| t = <GROUP>
+	| t = <BY>
+	| t = <HAVING>
+	| t = <AS>
+	| t = <LEFT>
+	| t = <OUTER>
+	| t = <INNER>
+	| t = <JOIN>
+	| t = <FETCH>
+	| t = <IN>
+	| t = <SET>
+	| t = <OBJECT>
+	| t = <IDENTIFIER>
+    ) { jjtThis.setToken (t); }
+}
+
+
+void numeric_literal() : { }
+{
+	LOOKAHEAD(decimal_literal()) decimal_literal() | integer_literal()
+}
+
+
+void integer_literal() #INTEGERLITERAL :
+{ Token t; }
+{
+	[<PLUS> | negative()] t = <INTEGER_LITERAL> { jjtThis.setToken (t); }
+}
+
+
+void decimal_literal() #DECIMALLITERAL :
+{ Token t; }
+{
+	 [<PLUS> | negative()] t = <DECIMAL_LITERAL> { jjtThis.setToken (t); }
+}
+
+
+void boolean_literal() #BOOLEANLITERAL :
+{ Token t; }
+{
+	t = <BOOLEAN_LITERAL> { jjtThis.setToken (t); }
+}
+
+
+void string_literal() #STRINGLITERAL :
+{ Token t; }
+{
+	t = <STRING_LITERAL> { jjtThis.setToken (t); }
+}
+
+
+void input_parameter() : { }
+{
+	named_input_parameter() | positional_input_parameter()
+}
+
+
+void named_input_parameter() #NAMEDINPUTPARAMETER :{ }
+{
+	":" path_component()
+}
+
+
+void positional_input_parameter() #POSITIONALINPUTPARAMETER :
+{ Token t; }
+{
+	"?" t = <INTEGER_LITERAL> { jjtThis.setToken (t); }
+}
+
+
+void pattern_value() #PATTERNVALUE : { }
+{
+	(input_parameter() | string_literal())
+	[(<ESCAPE> escape_character() #ESCAPECHARACTER)]
+}
+
+
+void escape_character() #ESCAPECHARACTER :
+{ Token t; }
+{
+	t = <STRING_LITERAL> { jjtThis.setToken (t); }
+}
+
+
+void trim_character() #TRIMCHARACTER :
+{ Token t; }
+{
+	t = <STRING_LITERAL> { jjtThis.setToken (t); }
+}
+
+
+void EQ() #EQUALS : { }
+{
+	<EQ>
+}
+
+
+void NE() #NOTEQUALS : { }
+{
+	<NE>
+}
+
+
+void GT() #GREATERTHAN : { }
+{
+	<GT>
+}
+
+
+void GE() #GREATEROREQUAL : { }
+{
+	<GE>
+}
+
+
+void LT() #LESSTHAN : { }
+{
+	<LT>
+}
+
+
+void LE() #LESSOREQUAL : { }
+{
+	<LE>
+}

Added: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java?rev=881892&view=auto
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java (added)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java Wed Nov 18 19:29:13 2009
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.query;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+/**
+ * Tests query parameters.
+ * 
+ * @author Catalina Wei
+ *
+ */
+public class TestQueryParameters extends SingleEMFTestCase {
+    private static OpenJPAEntityManagerFactorySPI oemf;
+    private EntityManager em;
+    
+    public void setUp() {
+        if (oemf == null) {
+            super.setUp(SimpleEntity.class);
+            oemf = (OpenJPAEntityManagerFactorySPI)OpenJPAPersistence.cast(emf);
+        }
+        em = oemf.createEntityManager();
+    }
+    
+    public void tearDown() {
+        // do not close the factory
+    }
+    
+    public void testNamedParameterUsingReservedWord() {
+        String jpql = "select e from simple e WHERE e.name=:order order by e.id";
+        Query q = em.createQuery(jpql)
+                    .setParameter("order", "XYZ");        
+        q.getResultList();
+    }
+}