From c85a8b7c03d0f0efb03205c57044784edf1fb7df Mon Sep 17 00:00:00 2001
From: gmantele <gmantele@ari.uni-heidelberg.de>
Date: Thu, 10 Apr 2014 11:42:37 +0200
Subject: [PATCH] ADQL: Fix 2 bugs: 1/ let the function ROUND having 2
 parameters 2/ wrap Operations (WrappedOperand) with brackets when there are
 brackets in the ADQL query

---
 src/adql/parser/ADQLParser.java               | 839 +++++++++---------
 src/adql/parser/adqlGrammar.jj                |  32 +-
 .../query/operand/function/MathFunction.java  |  71 +-
 .../operand/function/MathFunctionType.java    |  29 +-
 4 files changed, 491 insertions(+), 480 deletions(-)

diff --git a/src/adql/parser/ADQLParser.java b/src/adql/parser/ADQLParser.java
index ff43fa3..b1649f8 100644
--- a/src/adql/parser/ADQLParser.java
+++ b/src/adql/parser/ADQLParser.java
@@ -1591,74 +1591,63 @@ public class ADQLParser implements ADQLParserConstants {
 			String expr;
 			ADQLColumn column;
 			ADQLOperand op;
-			switch((jj_ntk == -1) ? jj_ntk() : jj_ntk){
-				case STRING_LITERAL:
-				case SCIENTIFIC_NUMBER:
-				case UNSIGNED_FLOAT:
-				case UNSIGNED_INTEGER:
-					try{
-						switch((jj_ntk == -1) ? jj_ntk() : jj_ntk){
-							case SCIENTIFIC_NUMBER:
-							case UNSIGNED_FLOAT:
-							case UNSIGNED_INTEGER:
-								// unsigned_value_specification
-								expr = UnsignedNumeric();
-								{
-									if (true)
-										return queryFactory.createNumericConstant(expr);
-								}
-								break;
-							case STRING_LITERAL:
-								expr = String();
-								{
-									if (true)
-										return queryFactory.createStringConstant(expr);
-								}
-								break;
-							default:
-								jj_la1[46] = jj_gen;
-								jj_consume_token(-1);
-								throw new ParseException();
+			try{
+				switch((jj_ntk == -1) ? jj_ntk() : jj_ntk){
+					case SCIENTIFIC_NUMBER:
+					case UNSIGNED_FLOAT:
+					case UNSIGNED_INTEGER:
+						// unsigned_value_specification
+						expr = UnsignedNumeric();
+						{
+							if (true)
+								return queryFactory.createNumericConstant(expr);
 						}
-					}catch(Exception ex){
+						break;
+					case STRING_LITERAL:
+						expr = String();
 						{
 							if (true)
-								throw generateParseException(ex);
+								return queryFactory.createStringConstant(expr);
 						}
-					}
-					break;
-				case DELIMITED_IDENTIFIER:
-				case REGULAR_IDENTIFIER:
-					column = Column();
-					{
-						if (true)
-							return column;
-					}
-					break;
-				case AVG:
-				case MAX:
-				case MIN:
-				case SUM:
-				case COUNT:
-					op = SqlFunction();
-					{
-						if (true)
-							return op;
-					}
-					break;
-				case LEFT_PAR:
-					jj_consume_token(LEFT_PAR);
-					op = ValueExpression();
-					jj_consume_token(RIGHT_PAR);
-					{
-						if (true)
-							return op;
-					}
-					break;
-				default:
-					jj_la1[47] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
+						break;
+					case DELIMITED_IDENTIFIER:
+					case REGULAR_IDENTIFIER:
+						column = Column();
+						{
+							if (true)
+								return column;
+						}
+						break;
+					case AVG:
+					case MAX:
+					case MIN:
+					case SUM:
+					case COUNT:
+						op = SqlFunction();
+						{
+							if (true)
+								return op;
+						}
+						break;
+					case LEFT_PAR:
+						jj_consume_token(LEFT_PAR);
+						op = ValueExpression();
+						jj_consume_token(RIGHT_PAR);
+						{
+							if (true)
+								return queryFactory.createWrappedOperand(op);
+						}
+						break;
+					default:
+						jj_la1[46] = jj_gen;
+						jj_consume_token(-1);
+						throw new ParseException();
+				}
+			}catch(Exception ex){
+				{
+					if (true)
+						throw generateParseException(ex);
+				}
 			}
 			throw new Error("Missing return statement in function");
 		}finally{
@@ -1680,7 +1669,7 @@ public class ADQLParser implements ADQLParserConstants {
 					valueExpr = GeometryValueFunction();
 					break;
 				default:
-					jj_la1[48] = jj_gen;
+					jj_la1[47] = jj_gen;
 					if (jj_2_4(2147483647)){
 						valueExpr = NumericExpression();
 					}else if (jj_2_5(2147483647)){
@@ -1735,7 +1724,7 @@ public class ADQLParser implements ADQLParserConstants {
 								valueExpr = NumericExpression();
 								break;
 							default:
-								jj_la1[49] = jj_gen;
+								jj_la1[48] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -1768,14 +1757,14 @@ public class ADQLParser implements ADQLParserConstants {
 							sign = jj_consume_token(MINUS);
 							break;
 						default:
-							jj_la1[50] = jj_gen;
+							jj_la1[49] = jj_gen;
 							jj_consume_token(-1);
 							throw new ParseException();
 					}
 					rightOp = NumericExpression();
 					break;
 				default:
-					jj_la1[51] = jj_gen;
+					jj_la1[50] = jj_gen;
 					;
 			}
 			if (sign == null){
@@ -1817,14 +1806,14 @@ public class ADQLParser implements ADQLParserConstants {
 							sign = jj_consume_token(DIVIDE);
 							break;
 						default:
-							jj_la1[52] = jj_gen;
+							jj_la1[51] = jj_gen;
 							jj_consume_token(-1);
 							throw new ParseException();
 					}
 					rightOp = NumericTerm();
 					break;
 				default:
-					jj_la1[53] = jj_gen;
+					jj_la1[52] = jj_gen;
 					;
 			}
 			if (sign == null){
@@ -1866,13 +1855,13 @@ public class ADQLParser implements ADQLParserConstants {
 							negative = true;
 							break;
 						default:
-							jj_la1[54] = jj_gen;
+							jj_la1[53] = jj_gen;
 							jj_consume_token(-1);
 							throw new ParseException();
 					}
 					break;
 				default:
-					jj_la1[55] = jj_gen;
+					jj_la1[54] = jj_gen;
 					;
 			}
 			if (jj_2_7(2)){
@@ -1894,7 +1883,7 @@ public class ADQLParser implements ADQLParserConstants {
 						op = ValueExpressionPrimary();
 						break;
 					default:
-						jj_la1[56] = jj_gen;
+						jj_la1[55] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -1932,7 +1921,7 @@ public class ADQLParser implements ADQLParserConstants {
 						;
 						break;
 					default:
-						jj_la1[57] = jj_gen;
+						jj_la1[56] = jj_gen;
 						break label_9;
 				}
 				jj_consume_token(CONCAT);
@@ -1970,7 +1959,7 @@ public class ADQLParser implements ADQLParserConstants {
 					op = ExtractCoordSys();
 					break;
 				default:
-					jj_la1[58] = jj_gen;
+					jj_la1[57] = jj_gen;
 					if (jj_2_8(2)){
 						op = UserDefinedFunction();
 					}else{
@@ -1990,7 +1979,7 @@ public class ADQLParser implements ADQLParserConstants {
 								op = ValueExpressionPrimary();
 								break;
 							default:
-								jj_la1[59] = jj_gen;
+								jj_la1[58] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2025,7 +2014,7 @@ public class ADQLParser implements ADQLParserConstants {
 					gf = GeometryValueFunction();
 					break;
 				default:
-					jj_la1[60] = jj_gen;
+					jj_la1[59] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -2058,7 +2047,7 @@ public class ADQLParser implements ADQLParserConstants {
 						notOp = true;
 						break;
 					default:
-						jj_la1[61] = jj_gen;
+						jj_la1[60] = jj_gen;
 						;
 				}
 				constraint = Constraint();
@@ -2076,7 +2065,7 @@ public class ADQLParser implements ADQLParserConstants {
 							;
 							break;
 						default:
-							jj_la1[62] = jj_gen;
+							jj_la1[61] = jj_gen;
 							break label_10;
 					}
 					switch((jj_ntk == -1) ? jj_ntk() : jj_ntk){
@@ -2087,7 +2076,7 @@ public class ADQLParser implements ADQLParserConstants {
 							op = jj_consume_token(OR);
 							break;
 						default:
-							jj_la1[63] = jj_gen;
+							jj_la1[62] = jj_gen;
 							jj_consume_token(-1);
 							throw new ParseException();
 					}
@@ -2097,7 +2086,7 @@ public class ADQLParser implements ADQLParserConstants {
 							notOp = true;
 							break;
 						default:
-							jj_la1[64] = jj_gen;
+							jj_la1[63] = jj_gen;
 							;
 					}
 					constraint = Constraint();
@@ -2147,7 +2136,7 @@ public class ADQLParser implements ADQLParserConstants {
 						jj_consume_token(RIGHT_PAR);
 						break;
 					default:
-						jj_la1[65] = jj_gen;
+						jj_la1[64] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -2182,7 +2171,7 @@ public class ADQLParser implements ADQLParserConstants {
 						}
 						break;
 					default:
-						jj_la1[70] = jj_gen;
+						jj_la1[69] = jj_gen;
 						if (jj_2_11(2147483647)){
 							column = Column();
 							jj_consume_token(IS);
@@ -2191,7 +2180,7 @@ public class ADQLParser implements ADQLParserConstants {
 									notToken = jj_consume_token(NOT);
 									break;
 								default:
-									jj_la1[66] = jj_gen;
+									jj_la1[65] = jj_gen;
 									;
 							}
 							jj_consume_token(NULL);
@@ -2206,7 +2195,7 @@ public class ADQLParser implements ADQLParserConstants {
 									notToken = jj_consume_token(NOT);
 									break;
 								default:
-									jj_la1[67] = jj_gen;
+									jj_la1[66] = jj_gen;
 									;
 							}
 							jj_consume_token(LIKE);
@@ -2278,7 +2267,7 @@ public class ADQLParser implements ADQLParserConstants {
 											constraint = ComparisonEnd(op);
 											break;
 										default:
-											jj_la1[68] = jj_gen;
+											jj_la1[67] = jj_gen;
 											if (jj_2_10(2)){
 												constraint = BetweenEnd(op);
 											}else{
@@ -2288,7 +2277,7 @@ public class ADQLParser implements ADQLParserConstants {
 														constraint = InEnd(op);
 														break;
 													default:
-														jj_la1[69] = jj_gen;
+														jj_la1[68] = jj_gen;
 														jj_consume_token(-1);
 														throw new ParseException();
 												}
@@ -2296,7 +2285,7 @@ public class ADQLParser implements ADQLParserConstants {
 									}
 									break;
 								default:
-									jj_la1[71] = jj_gen;
+									jj_la1[70] = jj_gen;
 									jj_consume_token(-1);
 									throw new ParseException();
 							}
@@ -2343,7 +2332,7 @@ public class ADQLParser implements ADQLParserConstants {
 					comp = jj_consume_token(GREATER_EQUAL_THAN);
 					break;
 				default:
-					jj_la1[72] = jj_gen;
+					jj_la1[71] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -2375,7 +2364,7 @@ public class ADQLParser implements ADQLParserConstants {
 					notToken = jj_consume_token(NOT);
 					break;
 				default:
-					jj_la1[73] = jj_gen;
+					jj_la1[72] = jj_gen;
 					;
 			}
 			jj_consume_token(BETWEEN);
@@ -2411,7 +2400,7 @@ public class ADQLParser implements ADQLParserConstants {
 					not = jj_consume_token(NOT);
 					break;
 				default:
-					jj_la1[74] = jj_gen;
+					jj_la1[73] = jj_gen;
 					;
 			}
 			jj_consume_token(IN);
@@ -2429,7 +2418,7 @@ public class ADQLParser implements ADQLParserConstants {
 									;
 									break;
 								default:
-									jj_la1[75] = jj_gen;
+									jj_la1[74] = jj_gen;
 									break label_11;
 							}
 							jj_consume_token(COMMA);
@@ -2439,7 +2428,7 @@ public class ADQLParser implements ADQLParserConstants {
 						jj_consume_token(RIGHT_PAR);
 						break;
 					default:
-						jj_la1[76] = jj_gen;
+						jj_la1[75] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -2489,7 +2478,7 @@ public class ADQLParser implements ADQLParserConstants {
 								distinct = jj_consume_token(QUANTIFIER);
 								break;
 							default:
-								jj_la1[77] = jj_gen;
+								jj_la1[76] = jj_gen;
 								;
 						}
 						switch((jj_ntk == -1) ? jj_ntk() : jj_ntk){
@@ -2549,7 +2538,7 @@ public class ADQLParser implements ADQLParserConstants {
 								op = ValueExpression();
 								break;
 							default:
-								jj_la1[78] = jj_gen;
+								jj_la1[77] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2574,7 +2563,7 @@ public class ADQLParser implements ADQLParserConstants {
 								fct = jj_consume_token(SUM);
 								break;
 							default:
-								jj_la1[79] = jj_gen;
+								jj_la1[78] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2584,7 +2573,7 @@ public class ADQLParser implements ADQLParserConstants {
 								distinct = jj_consume_token(QUANTIFIER);
 								break;
 							default:
-								jj_la1[80] = jj_gen;
+								jj_la1[79] = jj_gen;
 								;
 						}
 						op = ValueExpression();
@@ -2592,7 +2581,7 @@ public class ADQLParser implements ADQLParserConstants {
 						funct = queryFactory.createSQLFunction(SQLFunctionType.valueOf(fct.image.toUpperCase()), op, distinct != null && distinct.image.equalsIgnoreCase("distinct"));
 						break;
 					default:
-						jj_la1[81] = jj_gen;
+						jj_la1[80] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -2653,7 +2642,7 @@ public class ADQLParser implements ADQLParserConstants {
 								t = jj_consume_token(INTERSECTS);
 								break;
 							default:
-								jj_la1[82] = jj_gen;
+								jj_la1[81] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2688,7 +2677,7 @@ public class ADQLParser implements ADQLParserConstants {
 								gf = queryFactory.createCoord1(col1);
 								break;
 							default:
-								jj_la1[83] = jj_gen;
+								jj_la1[82] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2708,7 +2697,7 @@ public class ADQLParser implements ADQLParserConstants {
 								gf = queryFactory.createCoord2(col1);
 								break;
 							default:
-								jj_la1[84] = jj_gen;
+								jj_la1[83] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2726,7 +2715,7 @@ public class ADQLParser implements ADQLParserConstants {
 								col1 = Column();
 								break;
 							default:
-								jj_la1[85] = jj_gen;
+								jj_la1[84] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2744,7 +2733,7 @@ public class ADQLParser implements ADQLParserConstants {
 								col2 = Column();
 								break;
 							default:
-								jj_la1[86] = jj_gen;
+								jj_la1[85] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2756,7 +2745,7 @@ public class ADQLParser implements ADQLParserConstants {
 						gf = queryFactory.createDistance(gvp1, gvp2);
 						break;
 					default:
-						jj_la1[87] = jj_gen;
+						jj_la1[86] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -2873,7 +2862,7 @@ public class ADQLParser implements ADQLParserConstants {
 									;
 									break;
 								default:
-									jj_la1[88] = jj_gen;
+									jj_la1[87] = jj_gen;
 									break label_12;
 							}
 							jj_consume_token(COMMA);
@@ -2892,7 +2881,7 @@ public class ADQLParser implements ADQLParserConstants {
 						gf = queryFactory.createRegion(op);
 						break;
 					default:
-						jj_la1[89] = jj_gen;
+						jj_la1[88] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -3012,7 +3001,7 @@ public class ADQLParser implements ADQLParserConstants {
 					fct = UserDefinedFunction();
 					break;
 				default:
-					jj_la1[90] = jj_gen;
+					jj_la1[89] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -3153,7 +3142,7 @@ public class ADQLParser implements ADQLParserConstants {
 								param1 = NumericExpression();
 								break;
 							default:
-								jj_la1[91] = jj_gen;
+								jj_la1[90] = jj_gen;
 								;
 						}
 						jj_consume_token(RIGHT_PAR);
@@ -3166,10 +3155,10 @@ public class ADQLParser implements ADQLParserConstants {
 							case COMMA:
 								jj_consume_token(COMMA);
 								integerValue = SignedInteger();
-								param2 = queryFactory.createOperation(queryFactory.createNumericConstant(integerValue), null, null);
+								param2 = queryFactory.createNumericConstant(integerValue);
 								break;
 							default:
-								jj_la1[92] = jj_gen;
+								jj_la1[91] = jj_gen;
 								;
 						}
 						jj_consume_token(RIGHT_PAR);
@@ -3188,16 +3177,16 @@ public class ADQLParser implements ADQLParserConstants {
 							case COMMA:
 								jj_consume_token(COMMA);
 								integerValue = SignedInteger();
-								param2 = queryFactory.createOperation(queryFactory.createNumericConstant(integerValue), null, null);
+								param2 = queryFactory.createNumericConstant(integerValue);
 								break;
 							default:
-								jj_la1[93] = jj_gen;
+								jj_la1[92] = jj_gen;
 								;
 						}
 						jj_consume_token(RIGHT_PAR);
 						break;
 					default:
-						jj_la1[94] = jj_gen;
+						jj_la1[93] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -3277,7 +3266,7 @@ public class ADQLParser implements ADQLParserConstants {
 					jj_consume_token(RIGHT_PAR);
 					break;
 				default:
-					jj_la1[95] = jj_gen;
+					jj_la1[94] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -3369,7 +3358,7 @@ public class ADQLParser implements ADQLParserConstants {
 								;
 								break;
 							default:
-								jj_la1[96] = jj_gen;
+								jj_la1[95] = jj_gen;
 								break label_13;
 						}
 						jj_consume_token(COMMA);
@@ -3378,7 +3367,7 @@ public class ADQLParser implements ADQLParserConstants {
 					}
 					break;
 				default:
-					jj_la1[97] = jj_gen;
+					jj_la1[96] = jj_gen;
 					;
 			}
 			jj_consume_token(RIGHT_PAR);
@@ -3574,22 +3563,22 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_112(){
-		if (jj_3R_100())
+	private boolean jj_3R_113(){
+		if (jj_3R_101())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_153(){
+	private boolean jj_3R_152(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_165())
+		if (jj_3R_164())
 			jj_scanpos = xsp;
-		if (jj_3R_166())
+		if (jj_3R_165())
 			return true;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_167()){
+			if (jj_3R_166()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -3597,37 +3586,37 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_121(){
+	private boolean jj_3R_122(){
 		if (jj_3R_144())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_120(){
+	private boolean jj_3R_121(){
 		if (jj_3R_143())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_119(){
+	private boolean jj_3R_120(){
 		if (jj_3R_142())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_118(){
+	private boolean jj_3R_119(){
 		if (jj_3R_141())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_111(){
+	private boolean jj_3R_112(){
 		if (jj_3R_23())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_163(){
+	private boolean jj_3R_162(){
 		if (jj_3R_49())
 			return true;
 		return false;
@@ -3636,9 +3625,9 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_64(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_111()){
+		if (jj_3R_112()){
 			jj_scanpos = xsp;
-			if (jj_3R_112())
+			if (jj_3R_113())
 				return true;
 		}
 		return false;
@@ -3679,13 +3668,10 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_28(){
 		if (jj_3R_44())
 			return true;
-		if (jj_3R_117())
+		if (jj_3R_118())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_118())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
 		if (jj_3R_119())
 			jj_scanpos = xsp;
 		xsp = jj_scanpos;
@@ -3694,6 +3680,9 @@ public class ADQLParser implements ADQLParserConstants {
 		xsp = jj_scanpos;
 		if (jj_3R_121())
 			jj_scanpos = xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_122())
+			jj_scanpos = xsp;
 		return false;
 	}
 
@@ -3703,7 +3692,7 @@ public class ADQLParser implements ADQLParserConstants {
 		Token xsp;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_113()){
+			if (jj_3R_114()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -3711,10 +3700,10 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_183(){
+	private boolean jj_3R_182(){
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_192())
+		if (jj_3R_191())
 			return true;
 		return false;
 	}
@@ -3727,21 +3716,21 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_182(){
+	private boolean jj_3R_181(){
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_192())
+		if (jj_3R_191())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_105(){
+	private boolean jj_3R_106(){
 		if (jj_scan_token(FULL))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_171(){
+	private boolean jj_3R_170(){
 		if (jj_scan_token(MINUS))
 			return true;
 		return false;
@@ -3767,18 +3756,18 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_162(){
+	private boolean jj_3R_161(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(8)){
 			jj_scanpos = xsp;
-			if (jj_3R_171())
+			if (jj_3R_170())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_161(){
+	private boolean jj_3R_160(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(10)){
@@ -3786,7 +3775,7 @@ public class ADQLParser implements ADQLParserConstants {
 			if (jj_scan_token(11))
 				return true;
 		}
-		if (jj_3R_129())
+		if (jj_3R_130())
 			return true;
 		return false;
 	}
@@ -3794,12 +3783,12 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_148(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_162())
+		if (jj_3R_161())
 			jj_scanpos = xsp;
 		xsp = jj_scanpos;
 		if (jj_3_7()){
 			jj_scanpos = xsp;
-			if (jj_3R_163())
+			if (jj_3R_162())
 				return true;
 		}
 		return false;
@@ -3819,14 +3808,14 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_108(){
+	private boolean jj_3R_109(){
 		if (jj_scan_token(FULL))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_181(){
-		if (jj_3R_101())
+	private boolean jj_3R_180(){
+		if (jj_3R_102())
 			return true;
 		return false;
 	}
@@ -3839,121 +3828,121 @@ public class ADQLParser implements ADQLParserConstants {
 			if (jj_scan_token(9))
 				return true;
 		}
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_92(){
+	private boolean jj_3R_93(){
 		if (jj_scan_token(TAN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_91(){
+	private boolean jj_3R_92(){
 		if (jj_scan_token(SIN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_129(){
+	private boolean jj_3R_130(){
 		if (jj_3R_148())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_161())
+		if (jj_3R_160())
 			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_90(){
+	private boolean jj_3R_91(){
 		if (jj_scan_token(COT))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_89(){
+	private boolean jj_3R_90(){
 		if (jj_scan_token(COS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_88(){
+	private boolean jj_3R_89(){
 		if (jj_scan_token(ATAN2))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_87(){
+	private boolean jj_3R_88(){
 		if (jj_scan_token(ATAN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_104(){
+	private boolean jj_3R_105(){
 		if (jj_scan_token(RIGHT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_86(){
+	private boolean jj_3R_87(){
 		if (jj_scan_token(ASIN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_85(){
+	private boolean jj_3R_86(){
 		if (jj_scan_token(ACOS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -3963,21 +3952,21 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_51(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_85()){
+		if (jj_3R_86()){
 			jj_scanpos = xsp;
-			if (jj_3R_86()){
+			if (jj_3R_87()){
 				jj_scanpos = xsp;
-				if (jj_3R_87()){
+				if (jj_3R_88()){
 					jj_scanpos = xsp;
-					if (jj_3R_88()){
+					if (jj_3R_89()){
 						jj_scanpos = xsp;
-						if (jj_3R_89()){
+						if (jj_3R_90()){
 							jj_scanpos = xsp;
-							if (jj_3R_90()){
+							if (jj_3R_91()){
 								jj_scanpos = xsp;
-								if (jj_3R_91()){
+								if (jj_3R_92()){
 									jj_scanpos = xsp;
-									if (jj_3R_92())
+									if (jj_3R_93())
 										return true;
 								}
 							}
@@ -4003,16 +3992,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_84(){
+	private boolean jj_3R_85(){
 		if (jj_scan_token(TRUNCATE))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_183())
+		if (jj_3R_182())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -4030,62 +4019,62 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_83(){
+	private boolean jj_3R_84(){
 		if (jj_scan_token(SQRT))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_82(){
+	private boolean jj_3R_83(){
 		if (jj_scan_token(ROUND))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_182())
+		if (jj_3R_181())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_81(){
+	private boolean jj_3R_82(){
 		if (jj_scan_token(RAND))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_181())
+		if (jj_3R_180())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_80(){
+	private boolean jj_3R_81(){
 		if (jj_scan_token(RADIANS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_101(){
-		if (jj_3R_129())
+	private boolean jj_3R_102(){
+		if (jj_3R_130())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
@@ -4094,23 +4083,23 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_79(){
+	private boolean jj_3R_80(){
 		if (jj_scan_token(POWER))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_78(){
+	private boolean jj_3R_79(){
 		if (jj_scan_token(PI))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
@@ -4120,16 +4109,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_77(){
+	private boolean jj_3R_78(){
 		if (jj_scan_token(MOD))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -4137,17 +4126,17 @@ public class ADQLParser implements ADQLParserConstants {
 	}
 
 	private boolean jj_3R_59(){
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_76(){
+	private boolean jj_3R_77(){
 		if (jj_scan_token(LOG10))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -4160,12 +4149,12 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_75(){
+	private boolean jj_3R_76(){
 		if (jj_scan_token(LOG))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -4178,72 +4167,76 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_74(){
+	private boolean jj_3R_75(){
 		if (jj_scan_token(FLOOR))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_56(){
-		if (jj_3R_101())
+	private boolean jj_3R_70(){
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		if (jj_3R_41())
+			return true;
+		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_115(){
-		if (jj_3R_133())
+	private boolean jj_3R_56(){
+		if (jj_3R_102())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_73(){
+	private boolean jj_3R_74(){
 		if (jj_scan_token(EXP))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_114(){
-		if (jj_3R_132())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_72(){
+	private boolean jj_3R_73(){
 		if (jj_scan_token(DEGREES))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
+	private boolean jj_3R_69(){
+		if (jj_3R_117())
+			return true;
+		return false;
+	}
+
 	private boolean jj_3R_55(){
-		if (jj_3R_100())
+		if (jj_3R_101())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_71(){
+	private boolean jj_3R_72(){
 		if (jj_scan_token(CEILING))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -4270,89 +4263,74 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_70(){
-		if (jj_scan_token(ABS))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_101())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
+	private boolean jj_3R_68(){
+		if (jj_3R_23())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_69(){
+	private boolean jj_3R_71(){
+		if (jj_scan_token(ABS))
+			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_41())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_107(){
-		if (jj_scan_token(RIGHT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_68(){
+	private boolean jj_3R_67(){
 		if (jj_3R_116())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_67(){
-		if (jj_3R_23())
+	private boolean jj_3R_108(){
+		if (jj_scan_token(RIGHT))
 			return true;
 		return false;
 	}
 
 	private boolean jj_3R_66(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_114()){
-			jj_scanpos = xsp;
-			if (jj_3R_115())
-				return true;
-		}
+		if (jj_3R_115())
+			return true;
 		return false;
 	}
 
 	private boolean jj_3R_50(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_70()){
+		if (jj_3R_71()){
 			jj_scanpos = xsp;
-			if (jj_3R_71()){
+			if (jj_3R_72()){
 				jj_scanpos = xsp;
-				if (jj_3R_72()){
+				if (jj_3R_73()){
 					jj_scanpos = xsp;
-					if (jj_3R_73()){
+					if (jj_3R_74()){
 						jj_scanpos = xsp;
-						if (jj_3R_74()){
+						if (jj_3R_75()){
 							jj_scanpos = xsp;
-							if (jj_3R_75()){
+							if (jj_3R_76()){
 								jj_scanpos = xsp;
-								if (jj_3R_76()){
+								if (jj_3R_77()){
 									jj_scanpos = xsp;
-									if (jj_3R_77()){
+									if (jj_3R_78()){
 										jj_scanpos = xsp;
-										if (jj_3R_78()){
+										if (jj_3R_79()){
 											jj_scanpos = xsp;
-											if (jj_3R_79()){
+											if (jj_3R_80()){
 												jj_scanpos = xsp;
-												if (jj_3R_80()){
+												if (jj_3R_81()){
 													jj_scanpos = xsp;
-													if (jj_3R_81()){
+													if (jj_3R_82()){
 														jj_scanpos = xsp;
-														if (jj_3R_82()){
+														if (jj_3R_83()){
 															jj_scanpos = xsp;
-															if (jj_3R_83()){
+															if (jj_3R_84()){
 																jj_scanpos = xsp;
-																if (jj_3R_84())
+																if (jj_3R_85())
 																	return true;
 															}
 														}
@@ -4371,7 +4349,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_180(){
+	private boolean jj_3R_179(){
 		if (jj_scan_token(COMMA))
 			return true;
 		if (jj_3R_14())
@@ -4406,15 +4384,18 @@ public class ADQLParser implements ADQLParserConstants {
 				jj_scanpos = xsp;
 				if (jj_3R_68()){
 					jj_scanpos = xsp;
-					if (jj_3R_69())
-						return true;
+					if (jj_3R_69()){
+						jj_scanpos = xsp;
+						if (jj_3R_70())
+							return true;
+					}
 				}
 			}
 		}
 		return false;
 	}
 
-	private boolean jj_3R_103(){
+	private boolean jj_3R_104(){
 		if (jj_scan_token(LEFT))
 			return true;
 		return false;
@@ -4429,11 +4410,11 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_61(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_103()){
+		if (jj_3R_104()){
 			jj_scanpos = xsp;
-			if (jj_3R_104()){
+			if (jj_3R_105()){
 				jj_scanpos = xsp;
-				if (jj_3R_105())
+				if (jj_3R_106())
 					return true;
 			}
 		}
@@ -4460,7 +4441,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_193(){
+	private boolean jj_3R_192(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(8)){
@@ -4471,10 +4452,10 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_192(){
+	private boolean jj_3R_191(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_193())
+		if (jj_3R_192())
 			jj_scanpos = xsp;
 		if (jj_scan_token(UNSIGNED_INTEGER))
 			return true;
@@ -4504,15 +4485,15 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_160(){
+	private boolean jj_3R_159(){
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_159())
+		if (jj_3R_158())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_132(){
+	private boolean jj_3R_115(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(99)){
@@ -4526,13 +4507,13 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_187(){
+	private boolean jj_3R_186(){
 		if (jj_3R_23())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_179(){
+	private boolean jj_3R_178(){
 		if (jj_scan_token(USING))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
@@ -4542,7 +4523,7 @@ public class ADQLParser implements ADQLParserConstants {
 		Token xsp;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_180()){
+			if (jj_3R_179()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -4552,13 +4533,13 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_106(){
+	private boolean jj_3R_107(){
 		if (jj_scan_token(LEFT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_185(){
+	private boolean jj_3R_184(){
 		if (jj_3R_23())
 			return true;
 		return false;
@@ -4567,11 +4548,11 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_62(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_106()){
+		if (jj_3R_107()){
 			jj_scanpos = xsp;
-			if (jj_3R_107()){
+			if (jj_3R_108()){
 				jj_scanpos = xsp;
-				if (jj_3R_108())
+				if (jj_3R_109())
 					return true;
 			}
 		}
@@ -4581,15 +4562,15 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_178(){
+	private boolean jj_3R_177(){
 		if (jj_scan_token(ON))
 			return true;
-		if (jj_3R_153())
+		if (jj_3R_152())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_128(){
+	private boolean jj_3R_129(){
 		if (jj_scan_token(REGION))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
@@ -4601,22 +4582,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_149(){
-		if (jj_scan_token(STRING_LITERAL))
-			return true;
-		return false;
-	}
-
 	private boolean jj_3R_147(){
 		if (jj_scan_token(POINT))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_158())
+		if (jj_3R_157())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_159())
+		if (jj_3R_158())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -4624,12 +4599,18 @@ public class ADQLParser implements ADQLParserConstants {
 	}
 
 	private boolean jj_3R_133(){
+		if (jj_scan_token(STRING_LITERAL))
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_116(){
 		Token xsp;
-		if (jj_3R_149())
+		if (jj_3R_133())
 			return true;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_149()){
+			if (jj_3R_133()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -4658,37 +4639,37 @@ public class ADQLParser implements ADQLParserConstants {
 		if (jj_3R_47())
 			return true;
 		xsp = jj_scanpos;
-		if (jj_3R_178()){
+		if (jj_3R_177()){
 			jj_scanpos = xsp;
-			if (jj_3R_179())
+			if (jj_3R_178())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_127(){
+	private boolean jj_3R_128(){
 		if (jj_scan_token(POLYGON))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_158())
+		if (jj_3R_157())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_159())
+		if (jj_3R_158())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_159())
+		if (jj_3R_158())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_159())
+		if (jj_3R_158())
 			return true;
 		Token xsp;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_160()){
+			if (jj_3R_159()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -4712,13 +4693,13 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_126(){
+	private boolean jj_3R_127(){
 		if (jj_3R_147())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_172(){
+	private boolean jj_3R_171(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(22))
@@ -4728,27 +4709,27 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_125(){
+	private boolean jj_3R_126(){
 		if (jj_scan_token(CIRCLE))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_158())
+		if (jj_3R_157())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_159())
+		if (jj_3R_158())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_124(){
+	private boolean jj_3R_125(){
 		if (jj_scan_token(CENTROID))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
@@ -4760,7 +4741,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_170(){
+	private boolean jj_3R_169(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(45)){
@@ -4771,24 +4752,24 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_123(){
+	private boolean jj_3R_124(){
 		if (jj_scan_token(BOX))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_158())
+		if (jj_3R_157())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_159())
+		if (jj_3R_158())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -4806,31 +4787,31 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_177(){
+	private boolean jj_3R_176(){
 		if (jj_3R_17())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_110(){
+	private boolean jj_3R_111(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_173())
+		if (jj_3R_172())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_173(){
+	private boolean jj_3R_172(){
 		if (jj_3R_63())
 			return true;
 		Token xsp;
-		if (jj_3R_177())
+		if (jj_3R_176())
 			return true;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_177()){
+			if (jj_3R_176()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -4838,7 +4819,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_191(){
+	private boolean jj_3R_190(){
 		if (jj_3R_23())
 			return true;
 		return false;
@@ -4850,20 +4831,20 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_100(){
+	private boolean jj_3R_101(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_123()){
+		if (jj_3R_124()){
 			jj_scanpos = xsp;
-			if (jj_3R_124()){
+			if (jj_3R_125()){
 				jj_scanpos = xsp;
-				if (jj_3R_125()){
+				if (jj_3R_126()){
 					jj_scanpos = xsp;
-					if (jj_3R_126()){
+					if (jj_3R_127()){
 						jj_scanpos = xsp;
-						if (jj_3R_127()){
+						if (jj_3R_128()){
 							jj_scanpos = xsp;
-							if (jj_3R_128())
+							if (jj_3R_129())
 								return true;
 						}
 					}
@@ -4873,18 +4854,18 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_150(){
+	private boolean jj_3R_149(){
 		if (jj_3R_41())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_109(){
-		if (jj_3R_102())
+	private boolean jj_3R_110(){
+		if (jj_3R_103())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_172())
+		if (jj_3R_171())
 			jj_scanpos = xsp;
 		return false;
 	}
@@ -4903,13 +4884,13 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_189(){
+	private boolean jj_3R_188(){
 		if (jj_3R_23())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_186(){
+	private boolean jj_3R_185(){
 		if (jj_3R_147())
 			return true;
 		return false;
@@ -4927,25 +4908,25 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_184(){
+	private boolean jj_3R_183(){
 		if (jj_3R_147())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_190(){
+	private boolean jj_3R_189(){
 		if (jj_3R_147())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_158(){
+	private boolean jj_3R_157(){
 		if (jj_3R_24())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_188(){
+	private boolean jj_3R_187(){
 		if (jj_3R_147())
 			return true;
 		return false;
@@ -4954,35 +4935,35 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_63(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_109()){
+		if (jj_3R_110()){
 			jj_scanpos = xsp;
 			if (jj_3_2()){
 				jj_scanpos = xsp;
-				if (jj_3R_110())
+				if (jj_3R_111())
 					return true;
 			}
 		}
 		return false;
 	}
 
-	private boolean jj_3R_97(){
+	private boolean jj_3R_98(){
 		if (jj_scan_token(DISTANCE))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_188()){
+		if (jj_3R_187()){
 			jj_scanpos = xsp;
-			if (jj_3R_189())
+			if (jj_3R_188())
 				return true;
 		}
 		if (jj_scan_token(COMMA))
 			return true;
 		xsp = jj_scanpos;
-		if (jj_3R_190()){
+		if (jj_3R_189()){
 			jj_scanpos = xsp;
-			if (jj_3R_191())
+			if (jj_3R_190())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -4990,16 +4971,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_96(){
+	private boolean jj_3R_97(){
 		if (jj_scan_token(COORD2))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_186()){
+		if (jj_3R_185()){
 			jj_scanpos = xsp;
-			if (jj_3R_187())
+			if (jj_3R_186())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -5007,16 +4988,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_95(){
+	private boolean jj_3R_96(){
 		if (jj_scan_token(COORD1))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_184()){
+		if (jj_3R_183()){
 			jj_scanpos = xsp;
-			if (jj_3R_185())
+			if (jj_3R_184())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -5024,7 +5005,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_94(){
+	private boolean jj_3R_95(){
 		if (jj_scan_token(AREA))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
@@ -5036,27 +5017,27 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_169(){
+	private boolean jj_3R_168(){
 		if (jj_3R_42())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_156(){
+	private boolean jj_3R_155(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_169()){
+		if (jj_3R_168()){
 			jj_scanpos = xsp;
 			if (jj_scan_token(101))
 				return true;
 		}
 		xsp = jj_scanpos;
-		if (jj_3R_170())
+		if (jj_3R_169())
 			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_93(){
+	private boolean jj_3R_94(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(58)){
@@ -5085,16 +5066,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_168(){
+	private boolean jj_3R_167(){
 		if (jj_3R_42())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_154(){
+	private boolean jj_3R_153(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_168()){
+		if (jj_3R_167()){
 			jj_scanpos = xsp;
 			if (jj_scan_token(101))
 				return true;
@@ -5105,7 +5086,7 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_60(){
 		if (jj_scan_token(DOT))
 			return true;
-		if (jj_3R_102())
+		if (jj_3R_103())
 			return true;
 		return false;
 	}
@@ -5113,15 +5094,15 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_52(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_93()){
+		if (jj_3R_94()){
 			jj_scanpos = xsp;
-			if (jj_3R_94()){
+			if (jj_3R_95()){
 				jj_scanpos = xsp;
-				if (jj_3R_95()){
+				if (jj_3R_96()){
 					jj_scanpos = xsp;
-					if (jj_3R_96()){
+					if (jj_3R_97()){
 						jj_scanpos = xsp;
-						if (jj_3R_97())
+						if (jj_3R_98())
 							return true;
 					}
 				}
@@ -5156,12 +5137,12 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_159(){
-		if (jj_3R_101())
+	private boolean jj_3R_158(){
+		if (jj_3R_102())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_102())
 			return true;
 		return false;
 	}
@@ -5184,7 +5165,7 @@ public class ADQLParser implements ADQLParserConstants {
 		xsp = jj_scanpos;
 		if (jj_scan_token(10)){
 			jj_scanpos = xsp;
-			if (jj_3R_150())
+			if (jj_3R_149())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -5202,7 +5183,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_131(){
+	private boolean jj_3R_132(){
 		if (jj_scan_token(DOT))
 			return true;
 		if (jj_3R_14())
@@ -5210,7 +5191,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_130(){
+	private boolean jj_3R_131(){
 		if (jj_scan_token(DOT))
 			return true;
 		if (jj_3R_14())
@@ -5218,7 +5199,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_116(){
+	private boolean jj_3R_117(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_3R_134()){
@@ -5229,15 +5210,15 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_102(){
+	private boolean jj_3R_103(){
 		if (jj_3R_14())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_130())
+		if (jj_3R_131())
 			jj_scanpos = xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_131())
+		if (jj_3R_132())
 			jj_scanpos = xsp;
 		return false;
 	}
@@ -5254,7 +5235,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_122(){
+	private boolean jj_3R_123(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		if (jj_3R_41())
@@ -5289,7 +5270,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_99(){
+	private boolean jj_3R_100(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(35))
@@ -5299,16 +5280,16 @@ public class ADQLParser implements ADQLParserConstants {
 		xsp = jj_scanpos;
 		if (jj_3_13()){
 			jj_scanpos = xsp;
-			if (jj_3R_122())
+			if (jj_3R_123())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_157(){
+	private boolean jj_3R_156(){
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_156())
+		if (jj_3R_155())
 			return true;
 		return false;
 	}
@@ -5316,12 +5297,12 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_144(){
 		if (jj_scan_token(ORDER_BY))
 			return true;
-		if (jj_3R_156())
+		if (jj_3R_155())
 			return true;
 		Token xsp;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_157()){
+			if (jj_3R_156()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -5332,15 +5313,15 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_143(){
 		if (jj_scan_token(HAVING))
 			return true;
-		if (jj_3R_153())
+		if (jj_3R_152())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_155(){
+	private boolean jj_3R_154(){
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_154())
+		if (jj_3R_153())
 			return true;
 		return false;
 	}
@@ -5361,7 +5342,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_164(){
+	private boolean jj_3R_163(){
 		if (jj_scan_token(AS))
 			return true;
 		if (jj_3R_14())
@@ -5372,12 +5353,12 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_142(){
 		if (jj_scan_token(GROUP_BY))
 			return true;
-		if (jj_3R_154())
+		if (jj_3R_153())
 			return true;
 		Token xsp;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_155()){
+			if (jj_3R_154()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -5386,7 +5367,7 @@ public class ADQLParser implements ADQLParserConstants {
 	}
 
 	private boolean jj_3R_54(){
-		if (jj_3R_99())
+		if (jj_3R_100())
 			return true;
 		return false;
 	}
@@ -5408,7 +5389,7 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_141(){
 		if (jj_scan_token(WHERE))
 			return true;
-		if (jj_3R_153())
+		if (jj_3R_152())
 			return true;
 		return false;
 	}
@@ -5426,7 +5407,7 @@ public class ADQLParser implements ADQLParserConstants {
 	}
 
 	private boolean jj_3R_53(){
-		if (jj_3R_98())
+		if (jj_3R_99())
 			return true;
 		return false;
 	}
@@ -5439,7 +5420,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_98(){
+	private boolean jj_3R_99(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(12)){
@@ -5472,7 +5453,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_117(){
+	private boolean jj_3R_118(){
 		if (jj_scan_token(FROM))
 			return true;
 		if (jj_3R_47())
@@ -5540,12 +5521,12 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_152(){
+	private boolean jj_3R_151(){
 		if (jj_3R_41())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_164())
+		if (jj_3R_163())
 			jj_scanpos = xsp;
 		return false;
 	}
@@ -5585,40 +5566,40 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_151(){
+	private boolean jj_3R_150(){
 		if (jj_scan_token(ASTERISK))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_175(){
+	private boolean jj_3R_174(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_153())
+		if (jj_3R_152())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_174(){
+	private boolean jj_3R_173(){
 		if (jj_3R_21())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_166(){
+	private boolean jj_3R_165(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_174()){
+		if (jj_3R_173()){
 			jj_scanpos = xsp;
-			if (jj_3R_175())
+			if (jj_3R_174())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_176(){
+	private boolean jj_3R_175(){
 		if (jj_scan_token(NOT))
 			return true;
 		return false;
@@ -5638,7 +5619,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_167(){
+	private boolean jj_3R_166(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(33)){
@@ -5647,9 +5628,9 @@ public class ADQLParser implements ADQLParserConstants {
 				return true;
 		}
 		xsp = jj_scanpos;
-		if (jj_3R_176())
+		if (jj_3R_175())
 			jj_scanpos = xsp;
-		if (jj_3R_166())
+		if (jj_3R_165())
 			return true;
 		return false;
 	}
@@ -5657,11 +5638,11 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_138(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_151()){
+		if (jj_3R_150()){
 			jj_scanpos = xsp;
 			if (jj_3_1()){
 				jj_scanpos = xsp;
-				if (jj_3R_152())
+				if (jj_3R_151())
 					return true;
 			}
 		}
@@ -5676,7 +5657,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_113(){
+	private boolean jj_3R_114(){
 		if (jj_scan_token(COMMA))
 			return true;
 		if (jj_3R_41())
@@ -5698,7 +5679,7 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_165(){
+	private boolean jj_3R_164(){
 		if (jj_scan_token(NOT))
 			return true;
 		return false;
@@ -5737,7 +5718,7 @@ public class ADQLParser implements ADQLParserConstants {
 	private Token jj_scanpos, jj_lastpos;
 	private int jj_la;
 	private int jj_gen;
-	final private int[] jj_la1 = new int[98];
+	final private int[] jj_la1 = new int[97];
 	static private int[] jj_la1_0;
 	static private int[] jj_la1_1;
 	static private int[] jj_la1_2;
@@ -5750,19 +5731,19 @@ public class ADQLParser implements ADQLParserConstants {
 	}
 
 	private static void jj_la1_init_0(){
-		jj_la1_0 = new int[]{0x41,0x0,0x0,0x0,0x0,0x80000,0x100000,0x20,0x0,0x0,0x400000,0x400,0x304,0x20,0x20,0x20,0x0,0x10,0x10,0x10,0x0,0x0,0x0,0x0,0x400000,0x400000,0x400000,0x0,0x4,0x3d800000,0x1c000000,0x2000000,0x1d000000,0x1d000000,0x1c000000,0x2000000,0x1d000000,0x1d000000,0x20,0xc0000000,0x3d800000,0x0,0x0,0x0,0x300,0x300,0x0,0x4,0x0,0x304,0x300,0x300,0xc00,0xc00,0x300,0x300,0x4,0x80,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x3f000,0x0,0x0,0x304,0x3f000,0x0,0x0,0x20,0x4,0x80000,0x704,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x304,0x20,0x20,0x0,0x0,0x20,0x304,};
+		jj_la1_0 = new int[]{0x41,0x0,0x0,0x0,0x0,0x80000,0x100000,0x20,0x0,0x0,0x400000,0x400,0x304,0x20,0x20,0x20,0x0,0x10,0x10,0x10,0x0,0x0,0x0,0x0,0x400000,0x400000,0x400000,0x0,0x4,0x3d800000,0x1c000000,0x2000000,0x1d000000,0x1d000000,0x1c000000,0x2000000,0x1d000000,0x1d000000,0x20,0xc0000000,0x3d800000,0x0,0x0,0x0,0x300,0x300,0x4,0x0,0x304,0x300,0x300,0xc00,0xc00,0x300,0x300,0x4,0x80,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x3f000,0x0,0x0,0x304,0x3f000,0x0,0x0,0x20,0x4,0x80000,0x704,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x304,0x20,0x20,0x0,0x0,0x20,0x304,};
 	}
 
 	private static void jj_la1_init_1(){
-		jj_la1_1 = new int[]{0x0,0x1,0x400,0x800,0x1000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6000,0x6000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf8000,0x3f00000,0x7c0f8000,0x0,0x0,0x0,0x0,0x0,0x0,0xf8000,0x0,0x80000000,0xf8000,0x3f00000,0x8,0x6,0x6,0x8,0x0,0x8,0x8,0x0,0x108,0x200,0xffff8000,0x0,0x8,0x8,0x0,0x0,0x0,0xffff8000,0x78000,0x0,0xf8000,0xc000000,0x800000,0x800000,0x800000,0x800000,0x7c000000,0x0,0x3f00000,0x7c000000,0x7c0f8000,0x0,0x0,0x0,0x0,0x0,0xffff8000,};
+		jj_la1_1 = new int[]{0x0,0x1,0x400,0x800,0x1000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6000,0x6000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf8000,0x3f00000,0x7c0f8000,0x0,0x0,0x0,0x0,0x0,0x0,0xf8000,0x0,0x80000000,0xf8000,0x3f00000,0x8,0x6,0x6,0x8,0x0,0x8,0x8,0x0,0x108,0x200,0xffff8000,0x0,0x8,0x8,0x0,0x0,0x0,0xffff8000,0x78000,0x0,0xf8000,0xc000000,0x800000,0x800000,0x800000,0x800000,0x7c000000,0x0,0x3f00000,0x7c000000,0x7c0f8000,0x0,0x0,0x0,0x0,0x0,0xffff8000,};
 	}
 
 	private static void jj_la1_init_2(){
-		jj_la1_2 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x20000000,0x20000000,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xffffff,0x20ffffff,0x0,0x0,0xfffe,0xff0000,0x0,0x20ffffff,};
+		jj_la1_2 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x20000000,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xffffff,0x20ffffff,0x0,0x0,0xfffe,0xff0000,0x0,0x20ffffff,};
 	}
 
 	private static void jj_la1_init_3(){
-		jj_la1_3 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x3,0x0,0x0,0x3b,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x23,0x23,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x30,0x0,0x0,0x38,0x3b,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x3b,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x3,0x3,0x3,0x3,0x0,0x0,0x0,0x2,0x3b,0x0,0x0,0x0,0x0,0x0,0x3b,};
+		jj_la1_3 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x3,0x0,0x0,0x3b,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x23,0x23,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x30,0x0,0x0,0x3b,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x3b,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x3,0x3,0x3,0x3,0x0,0x0,0x0,0x2,0x3b,0x0,0x0,0x0,0x0,0x0,0x3b,};
 	}
 
 	final private JJCalls[] jj_2_rtns = new JJCalls[13];
@@ -5785,7 +5766,7 @@ public class ADQLParser implements ADQLParserConstants {
 		token = new Token();
 		jj_ntk = -1;
 		jj_gen = 0;
-		for(int i = 0; i < 98; i++)
+		for(int i = 0; i < 97; i++)
 			jj_la1[i] = -1;
 		for(int i = 0; i < jj_2_rtns.length; i++)
 			jj_2_rtns[i] = new JJCalls();
@@ -5807,7 +5788,7 @@ public class ADQLParser implements ADQLParserConstants {
 		token = new Token();
 		jj_ntk = -1;
 		jj_gen = 0;
-		for(int i = 0; i < 98; i++)
+		for(int i = 0; i < 97; i++)
 			jj_la1[i] = -1;
 		for(int i = 0; i < jj_2_rtns.length; i++)
 			jj_2_rtns[i] = new JJCalls();
@@ -5820,7 +5801,7 @@ public class ADQLParser implements ADQLParserConstants {
 		token = new Token();
 		jj_ntk = -1;
 		jj_gen = 0;
-		for(int i = 0; i < 98; i++)
+		for(int i = 0; i < 97; i++)
 			jj_la1[i] = -1;
 		for(int i = 0; i < jj_2_rtns.length; i++)
 			jj_2_rtns[i] = new JJCalls();
@@ -5833,7 +5814,7 @@ public class ADQLParser implements ADQLParserConstants {
 		token = new Token();
 		jj_ntk = -1;
 		jj_gen = 0;
-		for(int i = 0; i < 98; i++)
+		for(int i = 0; i < 97; i++)
 			jj_la1[i] = -1;
 		for(int i = 0; i < jj_2_rtns.length; i++)
 			jj_2_rtns[i] = new JJCalls();
@@ -5845,7 +5826,7 @@ public class ADQLParser implements ADQLParserConstants {
 		token = new Token();
 		jj_ntk = -1;
 		jj_gen = 0;
-		for(int i = 0; i < 98; i++)
+		for(int i = 0; i < 97; i++)
 			jj_la1[i] = -1;
 		for(int i = 0; i < jj_2_rtns.length; i++)
 			jj_2_rtns[i] = new JJCalls();
@@ -5857,7 +5838,7 @@ public class ADQLParser implements ADQLParserConstants {
 		token = new Token();
 		jj_ntk = -1;
 		jj_gen = 0;
-		for(int i = 0; i < 98; i++)
+		for(int i = 0; i < 97; i++)
 			jj_la1[i] = -1;
 		for(int i = 0; i < jj_2_rtns.length; i++)
 			jj_2_rtns[i] = new JJCalls();
@@ -5995,7 +5976,7 @@ public class ADQLParser implements ADQLParserConstants {
 			la1tokens[jj_kind] = true;
 			jj_kind = -1;
 		}
-		for(int i = 0; i < 98; i++){
+		for(int i = 0; i < 97; i++){
 			if (jj_la1[i] == jj_gen){
 				for(int j = 0; j < 32; j++){
 					if ((jj_la1_0[i] & (1 << j)) != 0){
diff --git a/src/adql/parser/adqlGrammar.jj b/src/adql/parser/adqlGrammar.jj
index fe8fd02..bfac21d 100644
--- a/src/adql/parser/adqlGrammar.jj
+++ b/src/adql/parser/adqlGrammar.jj
@@ -1012,20 +1012,20 @@ String SignedInteger(): {Token sign=null, number;} {
 /* EXPRESSIONS */
 /* *********** */
 ADQLOperand ValueExpressionPrimary(): {String expr; ADQLColumn column; ADQLOperand op;} {
-	(
-		try{
-	// unsigned_value_specification
-			expr=UnsignedNumeric() {return queryFactory.createNumericConstant(expr);}
-	| 		expr=String() {return queryFactory.createStringConstant(expr);}
-		}catch(Exception ex){
-			throw generateParseException(ex);
-		}
-	// column_reference
-	| column=Column() {return column;}
-	// set_function_specification
-	| op=SqlFunction() {return op;}
-	// LEFT_PAR value_expression RIGHT_PAR
-	| (<LEFT_PAR> op=ValueExpression() <RIGHT_PAR>) {return op;})
+	try{
+		(// unsigned_value_specification
+		  expr=UnsignedNumeric() {return queryFactory.createNumericConstant(expr);}
+		// string
+		| expr=String() {return queryFactory.createStringConstant(expr);}
+		// column_reference
+		| column=Column() {return column;}
+		// set_function_specification
+		| op=SqlFunction() {return op;}
+		// LEFT_PAR value_expression RIGHT_PAR
+		| (<LEFT_PAR> op=ValueExpression() <RIGHT_PAR>) {return queryFactory.createWrappedOperand(op);})
+	}catch(Exception ex){
+		throw generateParseException(ex);
+	}
 }
 
 ADQLOperand ValueExpression(): {ADQLOperand valueExpr = null; } {
@@ -1414,9 +1414,9 @@ MathFunction MathFunction(): {Token fct=null; ADQLOperand param1=null, param2=nu
 		| (fct=<POWER> <LEFT_PAR> param1=NumericExpression() <COMMA> param2=NumericExpression() <RIGHT_PAR>)
 		| (fct=<RADIANS> <LEFT_PAR> param1=NumericExpression() <RIGHT_PAR>)
 		| (fct=<RAND> <LEFT_PAR> (param1=NumericExpression())? <RIGHT_PAR>)
-		| (fct=<ROUND> <LEFT_PAR> param1=NumericExpression() (<COMMA> integerValue=SignedInteger() {param2 = queryFactory.createOperation(queryFactory.createNumericConstant(integerValue), null, null);})? <RIGHT_PAR>)
+		| (fct=<ROUND> <LEFT_PAR> param1=NumericExpression() (<COMMA> integerValue=SignedInteger() {param2 = queryFactory.createNumericConstant(integerValue);})? <RIGHT_PAR>)
 		| (fct=<SQRT> <LEFT_PAR> param1=NumericExpression() <RIGHT_PAR>)
-		| (fct=<TRUNCATE> <LEFT_PAR> param1=NumericExpression() (<COMMA> integerValue=SignedInteger() {param2 = queryFactory.createOperation(queryFactory.createNumericConstant(integerValue), null, null);})? <RIGHT_PAR>))
+		| (fct=<TRUNCATE> <LEFT_PAR> param1=NumericExpression() (<COMMA> integerValue=SignedInteger() {param2 = queryFactory.createNumericConstant(integerValue);})? <RIGHT_PAR>))
 		{
 			if (param1 != null)
 				return queryFactory.createMathFunction(MathFunctionType.valueOf(fct.image.toUpperCase()), param1, param2);
diff --git a/src/adql/query/operand/function/MathFunction.java b/src/adql/query/operand/function/MathFunction.java
index 24ce621..0e89163 100644
--- a/src/adql/query/operand/function/MathFunction.java
+++ b/src/adql/query/operand/function/MathFunction.java
@@ -16,18 +16,18 @@ package adql.query.operand.function;
  * You should have received a copy of the GNU Lesser General Public License
  * along with ADQLLibrary.  If not, see <http://www.gnu.org/licenses/>.
  * 
- * Copyright 2012 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
+ * Copyright 2012-2014 - UDS/Centre de Données astronomiques de Strasbourg (CDS),
+ *                       Astronomisches Rechen Institute (ARI)
  */
 
 import adql.query.ADQLObject;
-
 import adql.query.operand.ADQLOperand;
 
 /**
  * It represents any basic mathematical function.
  * 
- * @author Gr&eacute;gory Mantelet (CDS)
- * @version 06/2011
+ * @author Gr&eacute;gory Mantelet (CDS;ARI)
+ * @version 1.2 (03/2014)
  * 
  * @see MathFunctionType
  */
@@ -42,6 +42,10 @@ public class MathFunction extends ADQLFunction {
 	/** Second parameter of this function (may be null). */
 	private ADQLOperand param2 = null;
 
+	/** Number of given parameters.
+	 * @since 1.2*/
+	private int nbParams;
+
 	/**
 	 * Creates a mathematical function without parameter.
 	 * 
@@ -75,23 +79,29 @@ public class MathFunction extends ADQLFunction {
 	 * @throws Exception	If the given function parameters are incorrect.
 	 */
 	public MathFunction(MathFunctionType t, ADQLOperand parameter1, ADQLOperand parameter2) throws Exception{
+		// Set the function type:
 		type = t;
-		switch(type.nbParams()){
-			case 0:
-				if (parameter1 != null || parameter2 != null)
-					throw new Exception("The function " + type.name() + " must have no parameter !");
-				break;
-			case 1:
-				if (parameter1 == null || parameter2 != null)
-					throw new Exception("The function " + type.name() + " must have only one parameter !");
-				break;
-			case 2:
-				if (parameter1 == null || parameter2 == null)
-					throw new Exception("The function " + type.name() + " must have two parameters !");
-				break;
-			default:
-				throw new Exception("Impossible for MathFunction object to have " + type.nbParams() + " ! It is limited to 2 parameters !");
+		// Only two parameters can be managed inside this class.
+		if (type.nbMaxParams() > 2)
+			throw new Exception("Impossible for MathFunction object to have " + type.nbMaxParams() + " ! It is limited to 2 parameters !");
+		// Compute the number of given parameters:
+		nbParams = ((parameter1 != null) ? 1 : 0) + ((parameter2 != null) ? 1 : 0);
+		// Check it and throw immediately an exception if incorrect:
+		if (nbParams < type.nbMinParams() || nbParams > type.nbMaxParams()){
+			if (type.nbMinParams() == type.nbMaxParams())
+				throw new Exception("The function " + type.name() + " must have " + ((type.nbMaxParams() == 0) ? "no parameter!" : ("exactly " + type.nbMaxParams() + " parameters!")));
+			else{
+				switch(type.nbMaxParams()){
+					case 0:
+						throw new Exception("The function " + type.name() + " must have no parameter !");
+					case 1:
+						throw new Exception("The function " + type.name() + " must have only one parameter !");
+					case 2:
+						throw new Exception("The function " + type.name() + " must have two parameters !");
+				}
+			}
 		}
+		// Set the function parameters:
 		param1 = parameter1;
 		param2 = parameter2;
 	}
@@ -119,42 +129,47 @@ public class MathFunction extends ADQLFunction {
 		return type;
 	}
 
+	@Override
 	public ADQLObject getCopy() throws Exception{
 		return new MathFunction(this);
 	}
 
+	@Override
 	public String getName(){
 		return type.name();
 	}
 
+	@Override
 	public final boolean isNumeric(){
 		return true;
 	}
 
+	@Override
 	public final boolean isString(){
 		return false;
 	}
 
 	@Override
 	public ADQLOperand[] getParameters(){
-		if (param1 != null){
-			if (param2 != null)
-				return new ADQLOperand[]{param1,param2};
-			else
+		switch(getNbParameters()){
+			case 1:
 				return new ADQLOperand[]{param1};
-		}else
-			return new ADQLOperand[0];
+			case 2:
+				return new ADQLOperand[]{param1,param2};
+			default:
+				return new ADQLOperand[0];
+		}
 	}
 
 	@Override
 	public int getNbParameters(){
-		return type.nbParams();
+		return nbParams;
 	}
 
 	@Override
 	public ADQLOperand getParameter(int index) throws ArrayIndexOutOfBoundsException{
 		if (index < 0 || index >= getNbParameters())
-			throw new ArrayIndexOutOfBoundsException("No " + index + "-th parameter for the function \"" + type.name() + "\" (nb required params = " + type.nbParams() + ") !");
+			throw new ArrayIndexOutOfBoundsException("No " + index + "-th parameter for the function \"" + type.name() + "\" (nb required params = " + type.nbMaxParams() + ") !");
 
 		switch(index){
 			case 0:
@@ -169,7 +184,7 @@ public class MathFunction extends ADQLFunction {
 	@Override
 	public ADQLOperand setParameter(int index, ADQLOperand replacer) throws ArrayIndexOutOfBoundsException, NullPointerException, Exception{
 		if (index < 0 || index >= getNbParameters())
-			throw new ArrayIndexOutOfBoundsException("No " + index + "-th parameter for the function \"" + type.name() + "\" (nb required params = " + type.nbParams() + ") !");
+			throw new ArrayIndexOutOfBoundsException("No " + index + "-th parameter for the function \"" + type.name() + "\" (nb required params = " + type.nbMaxParams() + ") !");
 		else if (replacer == null)
 			throw new NullPointerException("Impossible to remove any parameter from a mathematical function ! All parameters are required !");
 		else{
diff --git a/src/adql/query/operand/function/MathFunctionType.java b/src/adql/query/operand/function/MathFunctionType.java
index 3dca4aa..23c6062 100644
--- a/src/adql/query/operand/function/MathFunctionType.java
+++ b/src/adql/query/operand/function/MathFunctionType.java
@@ -22,25 +22,40 @@ package adql.query.operand.function;
 /**
  * All types of managed mathematical functions.
  * 
- * @author Gr&eacute;gory Mantelet (CDS)
- * @version 11/2010
+ * @author Gr&eacute;gory Mantelet (CDS,ARI)
+ * @version 03/2014
  * 
  * @see MathFunction
  */
 public enum MathFunctionType{
 	ABS(1), CEILING(1), DEGREES(1), EXP(1), FLOOR(1), LOG(1),		// returns the natural logarithm (base e) of a double value.
 	LOG10(1),	// returns the base 10 logarithm of a double value.
-	MOD(2), PI(0), POWER(2), RADIANS(1), SQRT(1), RAND(1), ROUND(2), TRUNCATE(2),
+	MOD(2), PI(0), POWER(2), RADIANS(1), SQRT(1), RAND(0,1), ROUND(1,2), TRUNCATE(1,2),
 
 	ACOS(1), ASIN(1), ATAN(1), ATAN2(2), COS(1), COT(1), SIN(1), TAN(1);
 
-	private final int nbRequiredParameters;
+	/** @since 1.2 */
+	private final int nbMinRequiredParameters;
+	/** @since 1.2 */
+	private final int nbMaxRequiredParameters;
 
 	private MathFunctionType(int nbParams){
-		nbRequiredParameters = nbParams;
+		this(nbParams, nbParams);
 	}
 
-	public final int nbParams(){
-		return nbRequiredParameters;
+	/** @since 1.2 */
+	private MathFunctionType(int nbMinParams, int nbMaxParams){
+		nbMinRequiredParameters = nbMinParams;
+		nbMaxRequiredParameters = nbMaxParams;
+	}
+
+	/** @since 1.2 */
+	public final int nbMinParams(){
+		return nbMinRequiredParameters;
+	}
+
+	/** @since 1.2 */
+	public final int nbMaxParams(){
+		return nbMaxRequiredParameters;
 	}
 }
-- 
GitLab