diff --git a/src/adql/parser/ADQLParser.java b/src/adql/parser/ADQLParser.java
index 86491d846b1fd9a91623e08601cf2bd9c313c514..0ebb8f6a8b91924b9586f0e7bdfc9eb46590d16d 100644
--- a/src/adql/parser/ADQLParser.java
+++ b/src/adql/parser/ADQLParser.java
@@ -1904,76 +1904,25 @@ public class ADQLParser implements ADQLParserConstants {
 					((WrappedOperand)valueExpr).setPosition(new TextPosition(left, right));
 				}else if (jj_2_7(2147483647)){
 					valueExpr = UserDefinedFunction();
+				}else if (jj_2_8(2)){
+					valueExpr = GeometryValueFunction();
+				}else if (jj_2_9(2147483647)){
+					valueExpr = Column();
+				}else if (jj_2_10(2147483647)){
+					valueExpr = StringFactor();
+				}else if (jj_2_11(3)){
+					valueExpr = Factor();
 				}else{
 					switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
-						case BOX:
-						case CENTROID:
-						case CIRCLE:
-						case POINT:
-						case POLYGON:
-						case REGION:{
-							valueExpr = GeometryValueFunction();
+						case DELIMITED_IDENTIFIER:
+						case REGULAR_IDENTIFIER:{
+							valueExpr = Column();
 							break;
 						}
 						default:
 							jj_la1[48] = jj_gen;
-							if (jj_2_8(2147483647)){
-								valueExpr = Column();
-							}else if (jj_2_9(2147483647)){
-								valueExpr = StringFactor();
-							}else{
-								switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
-									case LEFT_PAR:
-									case PLUS:
-									case MINUS:
-									case AVG:
-									case MAX:
-									case MIN:
-									case SUM:
-									case COUNT:
-									case CONTAINS:
-									case INTERSECTS:
-									case AREA:
-									case COORD1:
-									case COORD2:
-									case DISTANCE:
-									case ABS:
-									case CEILING:
-									case DEGREES:
-									case EXP:
-									case FLOOR:
-									case LOG:
-									case LOG10:
-									case MOD:
-									case PI:
-									case POWER:
-									case RADIANS:
-									case RAND:
-									case ROUND:
-									case SQRT:
-									case TRUNCATE:
-									case ACOS:
-									case ASIN:
-									case ATAN:
-									case ATAN2:
-									case COS:
-									case COT:
-									case SIN:
-									case TAN:
-									case DELIMITED_IDENTIFIER:
-									case REGULAR_IDENTIFIER:
-									case SCIENTIFIC_NUMBER:
-									case UNSIGNED_FLOAT:
-									case UNSIGNED_INTEGER:{
-										valueExpr = Factor();
-										break;
-									}
-									default:
-										jj_la1[49] = jj_gen;
-										jj_consume_token(-1);
-										throw new ParseException();
-								}
-							}
+							jj_consume_token(-1);
+							throw new ParseException();
 					}
 				}
 				{
@@ -2011,7 +1960,7 @@ public class ADQLParser implements ADQLParserConstants {
 							break;
 						}
 						default:
-							jj_la1[50] = jj_gen;
+							jj_la1[49] = jj_gen;
 							jj_consume_token(-1);
 							throw new ParseException();
 					}
@@ -2019,7 +1968,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[51] = jj_gen;;
+					jj_la1[50] = jj_gen;;
 			}
 			if (sign == null){
 				if ("" != null)
@@ -2064,7 +2013,7 @@ public class ADQLParser implements ADQLParserConstants {
 							break;
 						}
 						default:
-							jj_la1[52] = jj_gen;
+							jj_la1[51] = jj_gen;
 							jj_consume_token(-1);
 							throw new ParseException();
 					}
@@ -2072,7 +2021,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[53] = jj_gen;;
+					jj_la1[52] = jj_gen;;
 			}
 			if (sign == null){
 				if ("" != null)
@@ -2118,16 +2067,16 @@ public class ADQLParser implements ADQLParserConstants {
 							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_10(2)){
+			if (jj_2_12(2)){
 				op = NumericFunction();
 			}else{
 				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
@@ -2146,7 +2095,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[56] = jj_gen;
+						jj_la1[55] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -2191,7 +2140,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);
@@ -2234,8 +2183,8 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[58] = jj_gen;
-					if (jj_2_11(2)){
+					jj_la1[57] = jj_gen;
+					if (jj_2_13(2)){
 						op = UserDefinedFunction();
 						((UserDefinedFunction)op).setExpectedType('S');
 					}else{
@@ -2248,7 +2197,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[59] = jj_gen;
+								jj_la1[58] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2285,7 +2234,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[60] = jj_gen;
+					jj_la1[59] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -2322,7 +2271,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[61] = jj_gen;;
+						jj_la1[60] = jj_gen;;
 				}
 				constraint = Constraint();
 				if (notOp){
@@ -2344,7 +2293,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_f() : jj_ntk){
@@ -2357,7 +2306,7 @@ public class ADQLParser implements ADQLParserConstants {
 							break;
 						}
 						default:
-							jj_la1[63] = jj_gen;
+							jj_la1[62] = jj_gen;
 							jj_consume_token(-1);
 							throw new ParseException();
 					}
@@ -2368,7 +2317,7 @@ public class ADQLParser implements ADQLParserConstants {
 							break;
 						}
 						default:
-							jj_la1[64] = jj_gen;;
+							jj_la1[63] = jj_gen;;
 					}
 					constraint = Constraint();
 					if (notOp){
@@ -2409,7 +2358,7 @@ public class ADQLParser implements ADQLParserConstants {
 		try{
 			ADQLConstraint constraint = null;
 			Token start, end;
-			if (jj_2_12(2147483647)){
+			if (jj_2_14(2147483647)){
 				constraint = Predicate();
 			}else{
 				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
@@ -2429,7 +2378,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[65] = jj_gen;
+						jj_la1[64] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -2467,8 +2416,8 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[70] = jj_gen;
-						if (jj_2_14(2147483647)){
+						jj_la1[69] = jj_gen;
+						if (jj_2_16(2147483647)){
 							column = Column();
 							jj_consume_token(IS);
 							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
@@ -2477,7 +2426,7 @@ public class ADQLParser implements ADQLParserConstants {
 									break;
 								}
 								default:
-									jj_la1[66] = jj_gen;;
+									jj_la1[65] = jj_gen;;
 							}
 							end = jj_consume_token(NULL);
 							IsNull in = queryFactory.createIsNull((notToken != null), column);
@@ -2486,7 +2435,7 @@ public class ADQLParser implements ADQLParserConstants {
 								if ("" != null)
 									return in;
 							}
-						}else if (jj_2_15(2147483647)){
+						}else if (jj_2_17(2147483647)){
 							strExpr1 = StringExpression();
 							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
 								case NOT:{
@@ -2494,7 +2443,7 @@ public class ADQLParser implements ADQLParserConstants {
 									break;
 								}
 								default:
-									jj_la1[67] = jj_gen;;
+									jj_la1[66] = jj_gen;;
 							}
 							jj_consume_token(LIKE);
 							strExpr2 = StringExpression();
@@ -2568,8 +2517,8 @@ public class ADQLParser implements ADQLParserConstants {
 											break;
 										}
 										default:
-											jj_la1[68] = jj_gen;
-											if (jj_2_13(2)){
+											jj_la1[67] = jj_gen;
+											if (jj_2_15(2)){
 												constraint = BetweenEnd(op);
 											}else{
 												switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
@@ -2579,7 +2528,7 @@ public class ADQLParser implements ADQLParserConstants {
 														break;
 													}
 													default:
-														jj_la1[69] = jj_gen;
+														jj_la1[68] = jj_gen;
 														jj_consume_token(-1);
 														throw new ParseException();
 												}
@@ -2588,7 +2537,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();
 							}
@@ -2641,7 +2590,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[72] = jj_gen;
+					jj_la1[71] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -2676,7 +2625,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[73] = jj_gen;;
+					jj_la1[72] = jj_gen;;
 			}
 			start = jj_consume_token(BETWEEN);
 			min = ValueExpression();
@@ -2716,10 +2665,10 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[74] = jj_gen;;
+					jj_la1[73] = jj_gen;;
 			}
 			start = jj_consume_token(IN);
-			if (jj_2_16(2)){
+			if (jj_2_18(2)){
 				q = SubQueryExpression();
 			}else{
 				switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
@@ -2734,7 +2683,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);
@@ -2745,7 +2694,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[76] = jj_gen;
+						jj_la1[75] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -2800,7 +2749,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[77] = jj_gen;;
+								jj_la1[76] = jj_gen;;
 						}
 						switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
 							case ASTERISK:{
@@ -2861,7 +2810,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[78] = jj_gen;
+								jj_la1[77] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2892,7 +2841,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[79] = jj_gen;
+								jj_la1[78] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -2903,7 +2852,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[80] = jj_gen;;
+								jj_la1[79] = jj_gen;;
 						}
 						op = ValueExpression();
 						end = jj_consume_token(RIGHT_PAR);
@@ -2912,7 +2861,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[81] = jj_gen;
+						jj_la1[80] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -2975,7 +2924,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[82] = jj_gen;
+								jj_la1[81] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -3015,7 +2964,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[83] = jj_gen;
+								jj_la1[82] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -3039,7 +2988,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[84] = jj_gen;
+								jj_la1[83] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -3060,7 +3009,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[85] = jj_gen;
+								jj_la1[84] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -3082,7 +3031,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[86] = jj_gen;
+								jj_la1[85] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
@@ -3097,7 +3046,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[87] = jj_gen;
+						jj_la1[86] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -3208,7 +3157,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);
@@ -3229,7 +3178,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[89] = jj_gen;
+						jj_la1[88] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -3362,7 +3311,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[90] = jj_gen;
+					jj_la1[89] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -3514,7 +3463,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[91] = jj_gen;;
+								jj_la1[90] = jj_gen;;
 						}
 						end = jj_consume_token(RIGHT_PAR);
 						break;
@@ -3530,7 +3479,7 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[92] = jj_gen;;
+								jj_la1[91] = jj_gen;;
 						}
 						end = jj_consume_token(RIGHT_PAR);
 						break;
@@ -3553,13 +3502,13 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[93] = jj_gen;;
+								jj_la1[92] = jj_gen;;
 						}
 						end = jj_consume_token(RIGHT_PAR);
 						break;
 					}
 					default:
-						jj_la1[94] = jj_gen;
+						jj_la1[93] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -3646,7 +3595,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[95] = jj_gen;
+					jj_la1[94] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -3737,7 +3686,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);
@@ -3747,7 +3696,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[97] = jj_gen;;
+					jj_la1[96] = jj_gen;;
 			}
 			end = jj_consume_token(RIGHT_PAR);
 			//System.out.println("INFO [ADQLParser]: \""+fct.image+"\" (from line "+fct.beginLine+" and column "+fct.beginColumn+" to line "+token.endLine+" and column "+(token.endColumn+1)+") is considered as an user defined function !");
@@ -3975,24 +3924,42 @@ public class ADQLParser implements ADQLParserConstants {
 		}
 	}
 
-	private boolean jj_3R_107(){
-		if (jj_scan_token(RIGHT))
+	private boolean jj_2_17(int xla){
+		jj_la = xla;
+		jj_lastpos = jj_scanpos = token;
+		try{
+			return !jj_3_17();
+		}catch(LookaheadSuccess ls){
 			return true;
-		return false;
+		}finally{
+			jj_save(16, xla);
+		}
 	}
 
-	private boolean jj_3R_55(){
+	private boolean jj_2_18(int xla){
+		jj_la = xla;
+		jj_lastpos = jj_scanpos = token;
+		try{
+			return !jj_3_18();
+		}catch(LookaheadSuccess ls){
+			return true;
+		}finally{
+			jj_save(17, xla);
+		}
+	}
+
+	private boolean jj_3R_65(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_96()){
+		if (jj_3R_107()){
 			jj_scanpos = xsp;
-			if (jj_3R_97()){
+			if (jj_3R_108()){
 				jj_scanpos = xsp;
-				if (jj_3R_98()){
+				if (jj_3R_109()){
 					jj_scanpos = xsp;
-					if (jj_3R_99()){
+					if (jj_3R_110()){
 						jj_scanpos = xsp;
-						if (jj_3R_100())
+						if (jj_3R_111())
 							return true;
 					}
 				}
@@ -4001,17 +3968,17 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_135(){
-		if (jj_3R_101())
+	private boolean jj_3R_137(){
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_139(){
+	private boolean jj_3R_134(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(48)){
@@ -4030,28 +3997,20 @@ public class ADQLParser implements ADQLParserConstants {
 		xsp = jj_scanpos;
 		if (jj_scan_token(19))
 			jj_scanpos = xsp;
-		if (jj_3R_42())
+		if (jj_3R_51())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_128(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(98)){
-			jj_scanpos = xsp;
-			if (jj_scan_token(99)){
-				jj_scanpos = xsp;
-				if (jj_scan_token(100))
-					return true;
-			}
-		}
+	private boolean jj_3R_117(){
+		if (jj_scan_token(RIGHT))
+			return true;
 		return false;
 	}
 
-	private boolean jj_3R_138(){
+	private boolean jj_3R_133(){
 		if (jj_scan_token(COUNT))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
@@ -4063,7 +4022,7 @@ public class ADQLParser implements ADQLParserConstants {
 		xsp = jj_scanpos;
 		if (jj_scan_token(10)){
 			jj_scanpos = xsp;
-			if (jj_3R_151())
+			if (jj_3R_146())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -4071,61 +4030,75 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_103(){
+	private boolean jj_3R_126(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_scan_token(98)){
+			jj_scanpos = xsp;
+			if (jj_scan_token(99)){
+				jj_scanpos = xsp;
+				if (jj_scan_token(100))
+					return true;
+			}
+		}
+		return false;
+	}
+
+	private boolean jj_3R_113(){
 		if (jj_scan_token(LEFT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_64(){
+	private boolean jj_3R_73(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_103()){
+		if (jj_3R_113()){
 			jj_scanpos = xsp;
-			if (jj_3R_104()){
+			if (jj_3R_114()){
 				jj_scanpos = xsp;
-				if (jj_3R_105())
+				if (jj_3R_115())
 					return true;
 			}
 		}
 		return false;
 	}
 
-	private boolean jj_3R_45(){
+	private boolean jj_3R_127(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_scan_token(24)){
+		if (jj_3R_133()){
 			jj_scanpos = xsp;
-			if (jj_3R_64())
+			if (jj_3R_134())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_129(){
+	private boolean jj_3R_54(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_138()){
+		if (jj_scan_token(24)){
 			jj_scanpos = xsp;
-			if (jj_3R_139())
+			if (jj_3R_73())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_37(){
+	private boolean jj_3R_44(){
 		if (jj_scan_token(STRING_LITERAL))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_22(){
+	private boolean jj_3R_23(){
 		Token xsp;
-		if (jj_3R_37())
+		if (jj_3R_44())
 			return true;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_37()){
+			if (jj_3R_44()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -4133,20 +4106,20 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_106(){
+	private boolean jj_3R_116(){
 		if (jj_scan_token(LEFT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_65(){
+	private boolean jj_3R_74(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_106()){
+		if (jj_3R_116()){
 			jj_scanpos = xsp;
-			if (jj_3R_107()){
+			if (jj_3R_117()){
 				jj_scanpos = xsp;
-				if (jj_3R_108())
+				if (jj_3R_118())
 					return true;
 			}
 		}
@@ -4156,43 +4129,61 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_46(){
+	private boolean jj_3R_55(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(24)){
 			jj_scanpos = xsp;
-			if (jj_3R_65())
+			if (jj_3R_74())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_33(){
+	private boolean jj_3_18(){
+		if (jj_3R_16())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_35(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_46())
+		if (jj_3R_55())
 			jj_scanpos = xsp;
 		if (jj_scan_token(JOIN))
 			return true;
-		if (jj_3R_47())
+		if (jj_3R_56())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_32(){
+	private boolean jj_3R_34(){
 		if (jj_scan_token(NATURAL))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_45())
+		if (jj_3R_54())
 			jj_scanpos = xsp;
 		if (jj_scan_token(JOIN))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_16(){
-		if (jj_3R_16())
+	private boolean jj_3R_28(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_scan_token(35))
+			jj_scanpos = xsp;
+		if (jj_scan_token(BETWEEN))
+			return true;
+		if (jj_3R_51())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3_15(){
+		if (jj_3R_28())
 			return true;
 		return false;
 	}
@@ -4200,141 +4191,113 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_17(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_32()){
+		if (jj_3R_34()){
 			jj_scanpos = xsp;
-			if (jj_3R_33())
+			if (jj_3R_35())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_26(){
+	private boolean jj_3_17(){
+		if (jj_3R_29())
+			return true;
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(35))
 			jj_scanpos = xsp;
-		if (jj_scan_token(BETWEEN))
-			return true;
-		if (jj_3R_42())
+		if (jj_scan_token(LIKE))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_67(){
+	private boolean jj_3R_76(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_13(){
-		if (jj_3R_26())
-			return true;
-		return false;
-	}
-
 	private boolean jj_3_3(){
 		if (jj_3R_17())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_15(){
-		if (jj_3R_27())
+	private boolean jj_3_16(){
+		if (jj_3R_22())
 			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(35))
-			jj_scanpos = xsp;
-		if (jj_scan_token(LIKE))
+		if (jj_scan_token(IS))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_14(){
-		if (jj_3R_21())
+	private boolean jj_3_2(){
+		if (jj_3R_16())
 			return true;
-		if (jj_scan_token(IS))
+		return false;
+	}
+
+	private boolean jj_3R_75(){
+		if (jj_3R_79())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_2(){
-		if (jj_3R_16())
+	private boolean jj_3R_132(){
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_51())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_66(){
-		if (jj_3R_72())
+	private boolean jj_3R_27(){
+		if (jj_3R_51())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_47(){
+	private boolean jj_3R_56(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_66()){
+		if (jj_3R_75()){
 			jj_scanpos = xsp;
 			if (jj_3_2()){
 				jj_scanpos = xsp;
-				if (jj_3R_67())
+				if (jj_3R_76())
 					return true;
 			}
 		}
 		return false;
 	}
 
-	private boolean jj_3R_132(){
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_42())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_25(){
-		if (jj_3R_42())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_12(){
+	private boolean jj_3_14(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(41)){
 			jj_scanpos = xsp;
-			if (jj_3R_25())
+			if (jj_3R_27())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_52(){
+	private boolean jj_3R_60(){
 		if (jj_scan_token(DOT))
 			return true;
-		if (jj_3R_72())
+		if (jj_3R_79())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_21(){
-		if (jj_3R_36())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_36(){
-		if (jj_3R_14())
+	private boolean jj_3R_22(){
+		if (jj_3R_43())
 			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_52())
-			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_114(){
-		if (jj_3R_42())
+	private boolean jj_3R_120(){
+		if (jj_3R_51())
 			return true;
 		Token xsp;
 		while(true){
@@ -4347,107 +4310,117 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_119(){
-		if (jj_scan_token(DOT))
+	private boolean jj_3R_148(){
+		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_14())
+		if (jj_3R_151())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_118(){
-		if (jj_scan_token(DOT))
+	private boolean jj_3R_147(){
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_151())
 			return true;
+		return false;
+	}
+
+	private boolean jj_3R_43(){
 		if (jj_3R_14())
 			return true;
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_60())
+			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_142(){
-		if (jj_scan_token(COMMA))
+	private boolean jj_3R_125(){
+		if (jj_scan_token(DOT))
 			return true;
-		if (jj_3R_152())
+		if (jj_3R_14())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_141(){
-		if (jj_scan_token(COMMA))
+	private boolean jj_3R_124(){
+		if (jj_scan_token(DOT))
 			return true;
-		if (jj_3R_152())
+		if (jj_3R_14())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_72(){
+	private boolean jj_3R_79(){
 		if (jj_3R_14())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_118())
+		if (jj_3R_124())
 			jj_scanpos = xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_119())
+		if (jj_3R_125())
 			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_29(){
+	private boolean jj_3R_31(){
 		if (jj_scan_token(DELIMITED_IDENTIFIER))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_28(){
+	private boolean jj_3R_30(){
 		if (jj_scan_token(REGULAR_IDENTIFIER))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_14(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_28()){
-			jj_scanpos = xsp;
-			if (jj_3R_29())
-				return true;
-		}
-		return false;
-	}
-
 	private boolean jj_3R_131(){
-		if (jj_3R_102())
+		if (jj_3R_21())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_24(){
+	private boolean jj_3R_26(){
 		if (jj_scan_token(REGULAR_IDENTIFIER))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_114())
+		if (jj_3R_120())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_140(){
-		if (jj_3R_101())
+	private boolean jj_3R_139(){
+		if (jj_3R_112())
 			return true;
 		return false;
 	}
 
+	private boolean jj_3R_14(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_30()){
+			jj_scanpos = xsp;
+			if (jj_3R_31())
+				return true;
+		}
+		return false;
+	}
+
 	private boolean jj_3R_130(){
-		if (jj_3R_21())
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_113(){
+	private boolean jj_3R_119(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_3R_130()){
@@ -4458,156 +4431,156 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_95(){
+	private boolean jj_3R_106(){
 		if (jj_scan_token(TAN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_94(){
+	private boolean jj_3R_105(){
 		if (jj_scan_token(SIN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_51(){
-		if (jj_3R_71())
+	private boolean jj_3R_58(){
+		if (jj_3R_78())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_93(){
+	private boolean jj_3R_104(){
 		if (jj_scan_token(COT))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_11(){
-		if (jj_3R_24())
+	private boolean jj_3_13(){
+		if (jj_3R_26())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_92(){
+	private boolean jj_3R_103(){
 		if (jj_scan_token(COS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_91(){
+	private boolean jj_3R_102(){
 		if (jj_scan_token(ATAN2))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_50(){
-		if (jj_3R_70())
+	private boolean jj_3R_57(){
+		if (jj_3R_77())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_90(){
+	private boolean jj_3R_101(){
 		if (jj_scan_token(ATAN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_35(){
+	private boolean jj_3R_36(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_50()){
+		if (jj_3R_57()){
 			jj_scanpos = xsp;
-			if (jj_3_11()){
+			if (jj_3_13()){
 				jj_scanpos = xsp;
-				if (jj_3R_51())
+				if (jj_3R_58())
 					return true;
 			}
 		}
 		return false;
 	}
 
-	private boolean jj_3R_89(){
+	private boolean jj_3R_100(){
 		if (jj_scan_token(ASIN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_88(){
+	private boolean jj_3R_99(){
 		if (jj_scan_token(ACOS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_54(){
+	private boolean jj_3R_64(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_88()){
+		if (jj_3R_99()){
 			jj_scanpos = xsp;
-			if (jj_3R_89()){
+			if (jj_3R_100()){
 				jj_scanpos = xsp;
-				if (jj_3R_90()){
+				if (jj_3R_101()){
 					jj_scanpos = xsp;
-					if (jj_3R_91()){
+					if (jj_3R_102()){
 						jj_scanpos = xsp;
-						if (jj_3R_92()){
+						if (jj_3R_103()){
 							jj_scanpos = xsp;
-							if (jj_3R_93()){
+							if (jj_3R_104()){
 								jj_scanpos = xsp;
-								if (jj_3R_94()){
+								if (jj_3R_105()){
 									jj_scanpos = xsp;
-									if (jj_3R_95())
+									if (jj_3R_106())
 										return true;
 								}
 							}
@@ -4619,99 +4592,99 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_49(){
-		if (jj_3R_69())
+	private boolean jj_3R_46(){
+		if (jj_3R_62())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_87(){
+	private boolean jj_3R_98(){
 		if (jj_scan_token(TRUNCATE))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_142())
+		if (jj_3R_148())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_86(){
+	private boolean jj_3R_97(){
 		if (jj_scan_token(SQRT))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_85(){
+	private boolean jj_3R_96(){
 		if (jj_scan_token(ROUND))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_141())
+		if (jj_3R_147())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_84(){
+	private boolean jj_3R_95(){
 		if (jj_scan_token(RAND))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_140())
+		if (jj_3R_139())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_83(){
+	private boolean jj_3R_94(){
 		if (jj_scan_token(RADIANS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_82(){
+	private boolean jj_3R_93(){
 		if (jj_scan_token(POWER))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_81(){
+	private boolean jj_3R_92(){
 		if (jj_scan_token(PI))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
@@ -4721,129 +4694,121 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_80(){
+	private boolean jj_3R_91(){
 		if (jj_scan_token(MOD))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_79(){
+	private boolean jj_3R_90(){
 		if (jj_scan_token(LOG10))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_78(){
+	private boolean jj_3R_89(){
 		if (jj_scan_token(LOG))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_77(){
+	private boolean jj_3R_88(){
 		if (jj_scan_token(FLOOR))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_76(){
+	private boolean jj_3R_87(){
 		if (jj_scan_token(EXP))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_43(){
+	private boolean jj_3R_52(){
 		if (jj_scan_token(CONCAT))
 			return true;
-		if (jj_3R_35())
+		if (jj_3R_36())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_75(){
+	private boolean jj_3R_86(){
 		if (jj_scan_token(DEGREES))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_74(){
+	private boolean jj_3R_85(){
 		if (jj_scan_token(CEILING))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_73(){
+	private boolean jj_3R_84(){
 		if (jj_scan_token(ABS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_30(){
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_27(){
-		if (jj_3R_35())
+	private boolean jj_3R_29(){
+		if (jj_3R_36())
 			return true;
 		Token xsp;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_43()){
+			if (jj_3R_52()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -4851,38 +4816,38 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_53(){
+	private boolean jj_3R_63(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_73()){
+		if (jj_3R_84()){
 			jj_scanpos = xsp;
-			if (jj_3R_74()){
+			if (jj_3R_85()){
 				jj_scanpos = xsp;
-				if (jj_3R_75()){
+				if (jj_3R_86()){
 					jj_scanpos = xsp;
-					if (jj_3R_76()){
+					if (jj_3R_87()){
 						jj_scanpos = xsp;
-						if (jj_3R_77()){
+						if (jj_3R_88()){
 							jj_scanpos = xsp;
-							if (jj_3R_78()){
+							if (jj_3R_89()){
 								jj_scanpos = xsp;
-								if (jj_3R_79()){
+								if (jj_3R_90()){
 									jj_scanpos = xsp;
-									if (jj_3R_80()){
+									if (jj_3R_91()){
 										jj_scanpos = xsp;
-										if (jj_3R_81()){
+										if (jj_3R_92()){
 											jj_scanpos = xsp;
-											if (jj_3R_82()){
+											if (jj_3R_93()){
 												jj_scanpos = xsp;
-												if (jj_3R_83()){
+												if (jj_3R_94()){
 													jj_scanpos = xsp;
-													if (jj_3R_84()){
+													if (jj_3R_95()){
 														jj_scanpos = xsp;
-														if (jj_3R_85()){
+														if (jj_3R_96()){
 															jj_scanpos = xsp;
-															if (jj_3R_86()){
+															if (jj_3R_97()){
 																jj_scanpos = xsp;
-																if (jj_3R_87())
+																if (jj_3R_98())
 																	return true;
 															}
 														}
@@ -4901,58 +4866,54 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_68(){
+	private boolean jj_3R_61(){
 		if (jj_scan_token(MINUS))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_41(){
-		if (jj_3R_24())
+	private boolean jj_3R_50(){
+		if (jj_3R_26())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_40(){
-		if (jj_3R_55())
+	private boolean jj_3R_49(){
+		if (jj_3R_65())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_15(){
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
+	private boolean jj_3R_48(){
+		if (jj_3R_64())
 			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_30())
-			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_39(){
-		if (jj_3R_54())
+	private boolean jj_3R_32(){
+		if (jj_3R_14())
+			return true;
+		if (jj_scan_token(DOT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_38(){
-		if (jj_3R_53())
+	private boolean jj_3R_47(){
+		if (jj_3R_63())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_23(){
+	private boolean jj_3R_25(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_38()){
+		if (jj_3R_47()){
 			jj_scanpos = xsp;
-			if (jj_3R_39()){
+			if (jj_3R_48()){
 				jj_scanpos = xsp;
-				if (jj_3R_40()){
+				if (jj_3R_49()){
 					jj_scanpos = xsp;
-					if (jj_3R_41())
+					if (jj_3R_50())
 						return true;
 				}
 			}
@@ -4960,24 +4921,36 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3_10(){
-		if (jj_3R_23())
+	private boolean jj_3_12(){
+		if (jj_3R_25())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_48(){
+	private boolean jj_3R_45(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(8)){
 			jj_scanpos = xsp;
-			if (jj_3R_68())
+			if (jj_3R_61())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_133(){
+	private boolean jj_3R_15(){
+		if (jj_3R_14())
+			return true;
+		if (jj_scan_token(DOT))
+			return true;
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_32())
+			jj_scanpos = xsp;
+		return false;
+	}
+
+	private boolean jj_3R_135(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(10)){
@@ -4985,53 +4958,104 @@ public class ADQLParser implements ADQLParserConstants {
 			if (jj_scan_token(11))
 				return true;
 		}
-		if (jj_3R_120())
+		if (jj_3R_128())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_34(){
+	private boolean jj_3R_24(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_48())
+		if (jj_3R_45())
 			jj_scanpos = xsp;
 		xsp = jj_scanpos;
-		if (jj_3_10()){
+		if (jj_3_12()){
 			jj_scanpos = xsp;
-			if (jj_3R_49())
+			if (jj_3R_46())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_70(){
+	private boolean jj_3R_77(){
 		if (jj_scan_token(COORDSYS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_113())
+		if (jj_3R_119())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_146(){
-		if (jj_3R_21())
+	private boolean jj_3R_143(){
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_144(){
-		if (jj_3R_21())
+	private boolean jj_3R_141(){
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_137(){
+	private boolean jj_3R_138(){
 		if (jj_scan_token(COMMA))
 			return true;
+		if (jj_3R_137())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_129(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_scan_token(8)){
+			jj_scanpos = xsp;
+			if (jj_scan_token(9))
+				return true;
+		}
+		if (jj_3R_112())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_59(){
+		if (jj_scan_token(POINT))
+			return true;
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		if (jj_3R_136())
+			return true;
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_137())
+			return true;
+		if (jj_scan_token(RIGHT_PAR))
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_128(){
+		if (jj_3R_24())
+			return true;
+		Token xsp;
+		xsp = jj_scanpos;
 		if (jj_3R_135())
+			jj_scanpos = xsp;
+		return false;
+	}
+
+	private boolean jj_3R_42(){
+		if (jj_scan_token(REGION))
+			return true;
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		if (jj_3R_29())
+			return true;
+		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
@@ -5051,7 +5075,7 @@ public class ADQLParser implements ADQLParserConstants {
 	}
 
 	private boolean jj_3R_19(){
-		if (jj_3R_34())
+		if (jj_3R_24())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
@@ -5069,73 +5093,76 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_121(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(8)){
-			jj_scanpos = xsp;
-			if (jj_scan_token(9))
-				return true;
-		}
-		if (jj_3R_101())
-			return true;
-		return false;
-	}
-
 	private boolean jj_3R_20(){
-		if (jj_3R_35())
+		if (jj_3R_36())
 			return true;
 		if (jj_scan_token(CONCAT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_136(){
-		if (jj_scan_token(POINT))
+	private boolean jj_3R_41(){
+		if (jj_scan_token(POLYGON))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_134())
+		if (jj_3R_136())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_135())
+		if (jj_3R_137())
 			return true;
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_137())
+			return true;
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_137())
+			return true;
+		Token xsp;
+		while(true){
+			xsp = jj_scanpos;
+			if (jj_3R_138()){
+				jj_scanpos = xsp;
+				break;
+			}
+		}
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_120(){
-		if (jj_3R_34())
+	private boolean jj_3R_72(){
+		if (jj_3R_22())
 			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_133())
-			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_127(){
-		if (jj_scan_token(REGION))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_27())
+	private boolean jj_3R_40(){
+		if (jj_3R_59())
 			return true;
-		if (jj_scan_token(RIGHT_PAR))
+		return false;
+	}
+
+	private boolean jj_3_10(){
+		if (jj_3R_23())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_9(){
-		if (jj_3R_22())
+	private boolean jj_3R_112(){
+		if (jj_3R_128())
 			return true;
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_129())
+			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3_8(){
-		if (jj_3R_21())
+	private boolean jj_3_9(){
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
@@ -5154,46 +5181,34 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3_5(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(64)){
-			jj_scanpos = xsp;
-			if (jj_3R_20())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_126(){
-		if (jj_scan_token(POLYGON))
+	private boolean jj_3R_39(){
+		if (jj_scan_token(CIRCLE))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_134())
+		if (jj_3R_136())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_135())
+		if (jj_3R_137())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_135())
-			return true;
-		if (jj_scan_token(COMMA))
+		if (jj_3R_112())
 			return true;
-		if (jj_3R_135())
+		if (jj_scan_token(RIGHT_PAR))
 			return true;
+		return false;
+	}
+
+	private boolean jj_3_5(){
 		Token xsp;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_137()){
-				jj_scanpos = xsp;
-				break;
-			}
+		xsp = jj_scanpos;
+		if (jj_scan_token(64)){
+			jj_scanpos = xsp;
+			if (jj_3R_20())
+				return true;
 		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
 		return false;
 	}
 
@@ -5219,181 +5234,145 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_63(){
-		if (jj_3R_34())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_125(){
-		if (jj_3R_136())
+	private boolean jj_3R_38(){
+		if (jj_scan_token(CENTROID))
+			return true;
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		if (jj_3R_119())
+			return true;
+		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_62(){
-		if (jj_3R_35())
+	private boolean jj_3_11(){
+		if (jj_3R_24())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_61(){
-		if (jj_3R_21())
+	private boolean jj_3R_71(){
+		if (jj_3R_36())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_101(){
-		if (jj_3R_120())
+	private boolean jj_3R_70(){
+		if (jj_3R_22())
 			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_121())
-			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_60(){
-		if (jj_3R_102())
+	private boolean jj_3_8(){
+		if (jj_3R_21())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_59(){
-		if (jj_3R_24())
+	private boolean jj_3R_69(){
+		if (jj_3R_26())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_58(){
+	private boolean jj_3R_68(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_42())
+		if (jj_3R_51())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_57(){
-		if (jj_3R_27())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_124(){
-		if (jj_scan_token(CIRCLE))
+	private boolean jj_3R_37(){
+		if (jj_scan_token(BOX))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_134())
+		if (jj_3R_136())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_135())
+		if (jj_3R_137())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_101())
+		if (jj_3R_112())
+			return true;
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_112())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_44(){
-		if (jj_scan_token(SELECT))
+	private boolean jj_3R_67(){
+		if (jj_3R_29())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_56(){
-		if (jj_3R_101())
+	private boolean jj_3R_53(){
+		if (jj_scan_token(SELECT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_123(){
-		if (jj_scan_token(CENTROID))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_113())
+	private boolean jj_3R_66(){
+		if (jj_3R_112())
 			return true;
-		if (jj_scan_token(RIGHT_PAR))
+		return false;
+	}
+
+	private boolean jj_3R_150(){
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_117(){
+	private boolean jj_3R_123(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_27())
+		if (jj_3R_29())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_16(){
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_31())
+	private boolean jj_3R_142(){
+		if (jj_3R_59())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_122(){
-		if (jj_scan_token(BOX))
-			return true;
+	private boolean jj_3R_16(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_134())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_135())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_101())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_101())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_116(){
-		if (jj_3R_21())
+		if (jj_3R_33())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_42(){
+	private boolean jj_3R_21(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_56()){
+		if (jj_3R_37()){
 			jj_scanpos = xsp;
-			if (jj_3R_57()){
+			if (jj_3R_38()){
 				jj_scanpos = xsp;
-				if (jj_3R_58()){
+				if (jj_3R_39()){
 					jj_scanpos = xsp;
-					if (jj_3R_59()){
+					if (jj_3R_40()){
 						jj_scanpos = xsp;
-						if (jj_3R_60()){
+						if (jj_3R_41()){
 							jj_scanpos = xsp;
-							if (jj_3R_61()){
-								jj_scanpos = xsp;
-								if (jj_3R_62()){
-									jj_scanpos = xsp;
-									if (jj_3R_63())
-										return true;
-								}
-							}
+							if (jj_3R_42())
+								return true;
 						}
 					}
 				}
@@ -5402,45 +5381,48 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_115(){
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_150(){
-		if (jj_3R_21())
+	private boolean jj_3R_146(){
+		if (jj_3R_51())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_105(){
-		if (jj_scan_token(FULL))
+	private boolean jj_3R_140(){
+		if (jj_3R_59())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_145(){
-		if (jj_3R_136())
+	private boolean jj_3R_122(){
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_102(){
+	private boolean jj_3R_51(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_122()){
+		if (jj_3R_66()){
 			jj_scanpos = xsp;
-			if (jj_3R_123()){
+			if (jj_3R_67()){
 				jj_scanpos = xsp;
-				if (jj_3R_124()){
+				if (jj_3R_68()){
 					jj_scanpos = xsp;
-					if (jj_3R_125()){
+					if (jj_3R_69()){
 						jj_scanpos = xsp;
-						if (jj_3R_126()){
+						if (jj_3_8()){
 							jj_scanpos = xsp;
-							if (jj_3R_127())
-								return true;
+							if (jj_3R_70()){
+								jj_scanpos = xsp;
+								if (jj_3R_71()){
+									jj_scanpos = xsp;
+									if (jj_3_11()){
+										jj_scanpos = xsp;
+										if (jj_3R_72())
+											return true;
+									}
+								}
+							}
 						}
 					}
 				}
@@ -5449,123 +5431,100 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_151(){
-		if (jj_3R_42())
+	private boolean jj_3R_145(){
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_143(){
-		if (jj_3R_136())
+	private boolean jj_3R_121(){
+		if (jj_3R_23())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_112(){
-		if (jj_scan_token(LEFT_PAR))
+	private boolean jj_3R_149(){
+		if (jj_3R_59())
 			return true;
-		if (jj_3R_101())
+		return false;
+	}
+
+	private boolean jj_3R_136(){
+		if (jj_3R_29())
 			return true;
-		if (jj_scan_token(RIGHT_PAR))
+		return false;
+	}
+
+	private boolean jj_3R_115(){
+		if (jj_scan_token(FULL))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_148(){
-		if (jj_3R_21())
+	private boolean jj_3R_83(){
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		if (jj_3R_112())
+			return true;
+		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_111(){
-		if (jj_3R_129())
+	private boolean jj_3R_144(){
+		if (jj_3R_59())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_149(){
-		if (jj_3R_136())
+	private boolean jj_3R_82(){
+		if (jj_3R_127())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_71(){
+	private boolean jj_3R_78(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_115()){
+		if (jj_3R_121()){
 			jj_scanpos = xsp;
-			if (jj_3R_116()){
+			if (jj_3R_122()){
 				jj_scanpos = xsp;
-				if (jj_3R_117())
+				if (jj_3R_123())
 					return true;
 			}
 		}
 		return false;
 	}
 
-	private boolean jj_3R_110(){
-		if (jj_3R_21())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_134(){
-		if (jj_3R_27())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_109(){
-		if (jj_3R_128())
+	private boolean jj_3R_81(){
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_147(){
-		if (jj_3R_136())
+	private boolean jj_3R_80(){
+		if (jj_3R_126())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_108(){
+	private boolean jj_3R_118(){
 		if (jj_scan_token(FULL))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_69(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_109()){
-			jj_scanpos = xsp;
-			if (jj_3R_110()){
-				jj_scanpos = xsp;
-				if (jj_3R_111()){
-					jj_scanpos = xsp;
-					if (jj_3R_112())
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_31(){
-		if (jj_3R_44())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_100(){
+	private boolean jj_3R_111(){
 		if (jj_scan_token(DISTANCE))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_147()){
+		if (jj_3R_144()){
 			jj_scanpos = xsp;
-			if (jj_3R_148())
+			if (jj_3R_145())
 				return true;
 		}
 		if (jj_scan_token(COMMA))
@@ -5581,16 +5540,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_99(){
+	private boolean jj_3R_110(){
 		if (jj_scan_token(COORD2))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_145()){
+		if (jj_3R_142()){
 			jj_scanpos = xsp;
-			if (jj_3R_146())
+			if (jj_3R_143())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -5598,16 +5557,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_98(){
+	private boolean jj_3R_109(){
 		if (jj_scan_token(COORD1))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_143()){
+		if (jj_3R_140()){
 			jj_scanpos = xsp;
-			if (jj_3R_144())
+			if (jj_3R_141())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -5615,36 +5574,42 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_97(){
+	private boolean jj_3R_108(){
 		if (jj_scan_token(AREA))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_113())
+		if (jj_3R_119())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_104(){
-		if (jj_scan_token(RIGHT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_153(){
+	private boolean jj_3R_62(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_scan_token(8)){
+		if (jj_3R_80()){
 			jj_scanpos = xsp;
-			if (jj_scan_token(9))
-				return true;
+			if (jj_3R_81()){
+				jj_scanpos = xsp;
+				if (jj_3R_82()){
+					jj_scanpos = xsp;
+					if (jj_3R_83())
+						return true;
+				}
+			}
 		}
 		return false;
 	}
 
-	private boolean jj_3R_96(){
+	private boolean jj_3R_33(){
+		if (jj_3R_53())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_107(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(59)){
@@ -5654,21 +5619,38 @@ public class ADQLParser implements ADQLParserConstants {
 		}
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_113())
+		if (jj_3R_119())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_113())
+		if (jj_3R_119())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
+	private boolean jj_3R_114(){
+		if (jj_scan_token(RIGHT))
+			return true;
+		return false;
+	}
+
 	private boolean jj_3R_152(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_153())
+		if (jj_scan_token(8)){
+			jj_scanpos = xsp;
+			if (jj_scan_token(9))
+				return true;
+		}
+		return false;
+	}
+
+	private boolean jj_3R_151(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_152())
 			jj_scanpos = xsp;
 		if (jj_scan_token(UNSIGNED_INTEGER))
 			return true;
@@ -5686,7 +5668,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;
@@ -5699,22 +5681,22 @@ 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,0x400000,0x400,0x304,0x20,0x20,0x20,0x0,0x10,0x10,0x10,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,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,0x400000,0x400,0x304,0x20,0x20,0x20,0x0,0x10,0x10,0x10,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,0x4,0x0,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,0x800,0x1000,0x2000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff0000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc000,0xc000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f0000,0x0,0x7e00000,0xf81f0000,0x0,0x0,0x0,0x0,0x0,0x0,0x1f0000,0x0,0x0,0x0,0x7e00000,0x8,0x6,0x6,0x8,0x0,0x8,0x8,0x0,0x108,0x200,0xffff0000,0x0,0x8,0x8,0x0,0x0,0x0,0xffff0000,0xf0000,0x0,0x1f0000,0x18000000,0x1000000,0x1000000,0x1000000,0x1000000,0xf8000000,0x0,0x7e00000,0xf8000000,0xf81f0000,0x0,0x0,0x0,0x0,0x0,0xffff0000,};
+		jj_la1_1 = new int[]{0x0,0x1,0x800,0x1000,0x2000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff0000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc000,0xc000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f0000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f0000,0x0,0x0,0x0,0x7e00000,0x8,0x6,0x6,0x8,0x0,0x8,0x8,0x0,0x108,0x200,0xffff0000,0x0,0x8,0x8,0x0,0x0,0x0,0xffff0000,0xf0000,0x0,0x1f0000,0x18000000,0x1000000,0x1000000,0x1000000,0x1000000,0xf8000000,0x0,0x7e00000,0xf8000000,0xf81f0000,0x0,0x0,0x0,0x0,0x0,0xffff0000,};
 	}
 
 	private static void jj_la1_init_2(){
-		jj_la1_2 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000,0x80000000,0x0,0x80000000,0x0,0x91ffffff,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,0x80000000,0x0,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000000,0x0,0x0,0x0,0x0,0x80000000,0x90000000,0x0,0x81fffffe,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000,0x0,0x1,0x90000000,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x91ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x91ffffff,0x0,0x0,0x0,0x0,0x80000000,0x80000000,0x80000000,0x80000000,0x2,0x0,0x0,0x1fffffe,0x81fffffe,0x0,0x0,0x1fffc,0x1fe0000,0x0,0x91ffffff,};
+		jj_la1_2 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000,0x80000000,0x0,0x80000000,0x0,0x91ffffff,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,0x80000000,0x0,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000000,0x0,0x0,0x0,0x0,0x80000000,0x90000000,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000,0x0,0x1,0x90000000,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x91ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x91ffffff,0x0,0x0,0x0,0x0,0x80000000,0x80000000,0x80000000,0x80000000,0x2,0x0,0x0,0x1fffffe,0x81fffffe,0x0,0x0,0x1fffc,0x1fe0000,0x0,0x91ffffff,};
 	}
 
 	private static void jj_la1_init_3(){
-		jj_la1_3 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1d,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x11,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c,0x18,0x0,0x0,0x1d,0x1,0x0,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x1d,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x1d,};
+		jj_la1_3 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1d,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x11,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c,0x18,0x0,0x0,0x1d,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1d,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x1d,};
 	}
 
-	final private JJCalls[] jj_2_rtns = new JJCalls[16];
+	final private JJCalls[] jj_2_rtns = new JJCalls[18];
 	private boolean jj_rescan = false;
 	private int jj_gc = 0;
 
@@ -5734,7 +5716,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();
@@ -5756,7 +5738,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();
@@ -5769,7 +5751,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();
@@ -5782,7 +5764,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();
@@ -5794,7 +5776,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();
@@ -5806,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();
@@ -5945,7 +5927,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){
@@ -6041,7 +6023,7 @@ public class ADQLParser implements ADQLParserConstants {
 
 	private void jj_rescan_token(){
 		jj_rescan = true;
-		for(int i = 0; i < 16; i++){
+		for(int i = 0; i < 18; i++){
 			try{
 				JJCalls p = jj_2_rtns[i];
 				do{
@@ -6097,6 +6079,12 @@ public class ADQLParser implements ADQLParserConstants {
 							case 15:
 								jj_3_16();
 								break;
+							case 16:
+								jj_3_17();
+								break;
+							case 17:
+								jj_3_18();
+								break;
 						}
 					}
 					p = p.next;
diff --git a/src/adql/parser/ParseException.java b/src/adql/parser/ParseException.java
index 2751dcda98e31b93bc4285bcb35884cb65c7dc8f..230d7ce806705a7b7b4e35a0712e8ecf9bcf7cba 100644
--- a/src/adql/parser/ParseException.java
+++ b/src/adql/parser/ParseException.java
@@ -3,7 +3,17 @@
  * 
  * Modified by Gr&eacute;gory Mantelet (CDS), on March 2017
  * Modifications:
- *     - several small modifications.
+ *     - addition of a getPosition() function in order to get the exact location
+ *       of the error in the original ADQL query
+ *     - generate the error message at creation instead of doing that at each
+ *       call of getMessage()
+ *     - use of StringBuffer to build the error message
+ *     - small other alterations of the generated error message
+ * 
+ * Modified by Gr&eacute;gory Mantelet (ARI), on Sept. 2017
+ * Modifications:
+ *     - addition of a HINT in the error message when an ADQL reserved
+ *       word is at the origin of the error (see initialise(...))
  * 
  * /!\ DO NOT RE-GENERATE THIS FILE /!\
  * In case of re-generation, replace it by ParseException.java.backup (but maybe
@@ -95,6 +105,22 @@ public class ParseException extends Exception {
 	/** Line in the ADQL query where the exception occurs. */
 	protected TextPosition position = null;
 
+	/** Regular expression listing all ADQL reserved words.
+	 * 
+	 * <p><i>Note 1:
+	 * 	This list is built NOT from the list given in the ADQL-2.0 standard,
+	 * 	but from the collation of all words potentially used in an ADQL query
+	 * 	(including standard function names).
+	 * </i></p>
+	 * 
+	 * <p><i>Note 2:
+	 * 	This regular expression is only used to display an appropriate hint
+	 * 	to the user in the error message if a such word is at the origin of
+	 * 	the error. (see {@link #initialise(Token, int[][], String[])} for more
+	 * 	details).
+	 * </i></p> */
+	private final static String ADQL_RESERVED_WORDS_REGEX = "(ABS|ACOS|AREA|ASIN|ATAN|ATAN2|BOX|CEILING|CENTROID|CIRCLE|CONTAINS|COORD1|COORD2|COORDSYS|COS|DEGREES|DISTANCE|EXP|FLOOR|INTERSECTS|LOG|LOG10|MOD|PI|POINT|POLYGON|POWER|RADIANS|REGION|RAND|ROUND|SIN|SQRT|TOP|TAN|TRUNCATE|SELECT|TOP|DISTINCT|ALL|AS|COUNT|AVG|MAX|MIN|SUM|FROM|JOIN|CROSS|INNER|OUTER|LEFT|RIGHT|FULL|NATURAL|USING|ON|WHERE|IS|NOT|AND|OR|EXISTS|IN|LIKE|NULL|BETWEEN|ORDER|ASC|DESC|GROUP|BY|HAVING)";
+
 	/**
 	 * Gets the position in the ADQL query of the token which generates this exception.
 	 * 
@@ -130,17 +156,18 @@ public class ParseException extends Exception {
 		StringBuffer msg = new StringBuffer();
 		msg.append(" Encountered \"");
 		Token tok = currentToken.next;
+		StringBuffer tokenName = new StringBuffer();
 		for(int i = 0; i < maxSize; i++){
 			if (i != 0)
-				msg.append(' ');
+				tokenName.append(' ');
 			if (tok.kind == 0){
-				msg.append(tokenImage[0]);
+				tokenName.append(tokenImage[0]);
 				break;
 			}
-			msg.append(add_escapes(tok.image));
+			tokenName.append(add_escapes(tok.image));
 			tok = tok.next;
 		}
-		msg.append("\".");
+		msg.append(tokenName.toString()).append("\".");
 
 		// Append the expected tokens list:
 		if (expectedTokenSequences.length == 1){
@@ -150,6 +177,11 @@ public class ParseException extends Exception {
 		}
 		msg.append(expected);
 
+		// Append a hint about reserved words if it is one:
+		String word = tokenName.toString().trim();
+		if (word.toUpperCase().matches(ADQL_RESERVED_WORDS_REGEX))
+			msg.append(System.getProperty("line.separator", "\n")).append("(HINT: \"").append(word).append("\" is a reserved ADQL word. To use it as a column/table/schema name/alias, write it between double quotes.)");
+
 		return msg.toString();
 		/*String eol = System.getProperty("line.separator", "\n");
 		StringBuffer expected = new StringBuffer();
diff --git a/src/adql/parser/ParseException.java.backup b/src/adql/parser/ParseException.java.backup
index 2751dcda98e31b93bc4285bcb35884cb65c7dc8f..230d7ce806705a7b7b4e35a0712e8ecf9bcf7cba 100644
--- a/src/adql/parser/ParseException.java.backup
+++ b/src/adql/parser/ParseException.java.backup
@@ -3,7 +3,17 @@
  * 
  * Modified by Gr&eacute;gory Mantelet (CDS), on March 2017
  * Modifications:
- *     - several small modifications.
+ *     - addition of a getPosition() function in order to get the exact location
+ *       of the error in the original ADQL query
+ *     - generate the error message at creation instead of doing that at each
+ *       call of getMessage()
+ *     - use of StringBuffer to build the error message
+ *     - small other alterations of the generated error message
+ * 
+ * Modified by Gr&eacute;gory Mantelet (ARI), on Sept. 2017
+ * Modifications:
+ *     - addition of a HINT in the error message when an ADQL reserved
+ *       word is at the origin of the error (see initialise(...))
  * 
  * /!\ DO NOT RE-GENERATE THIS FILE /!\
  * In case of re-generation, replace it by ParseException.java.backup (but maybe
@@ -95,6 +105,22 @@ public class ParseException extends Exception {
 	/** Line in the ADQL query where the exception occurs. */
 	protected TextPosition position = null;
 
+	/** Regular expression listing all ADQL reserved words.
+	 * 
+	 * <p><i>Note 1:
+	 * 	This list is built NOT from the list given in the ADQL-2.0 standard,
+	 * 	but from the collation of all words potentially used in an ADQL query
+	 * 	(including standard function names).
+	 * </i></p>
+	 * 
+	 * <p><i>Note 2:
+	 * 	This regular expression is only used to display an appropriate hint
+	 * 	to the user in the error message if a such word is at the origin of
+	 * 	the error. (see {@link #initialise(Token, int[][], String[])} for more
+	 * 	details).
+	 * </i></p> */
+	private final static String ADQL_RESERVED_WORDS_REGEX = "(ABS|ACOS|AREA|ASIN|ATAN|ATAN2|BOX|CEILING|CENTROID|CIRCLE|CONTAINS|COORD1|COORD2|COORDSYS|COS|DEGREES|DISTANCE|EXP|FLOOR|INTERSECTS|LOG|LOG10|MOD|PI|POINT|POLYGON|POWER|RADIANS|REGION|RAND|ROUND|SIN|SQRT|TOP|TAN|TRUNCATE|SELECT|TOP|DISTINCT|ALL|AS|COUNT|AVG|MAX|MIN|SUM|FROM|JOIN|CROSS|INNER|OUTER|LEFT|RIGHT|FULL|NATURAL|USING|ON|WHERE|IS|NOT|AND|OR|EXISTS|IN|LIKE|NULL|BETWEEN|ORDER|ASC|DESC|GROUP|BY|HAVING)";
+
 	/**
 	 * Gets the position in the ADQL query of the token which generates this exception.
 	 * 
@@ -130,17 +156,18 @@ public class ParseException extends Exception {
 		StringBuffer msg = new StringBuffer();
 		msg.append(" Encountered \"");
 		Token tok = currentToken.next;
+		StringBuffer tokenName = new StringBuffer();
 		for(int i = 0; i < maxSize; i++){
 			if (i != 0)
-				msg.append(' ');
+				tokenName.append(' ');
 			if (tok.kind == 0){
-				msg.append(tokenImage[0]);
+				tokenName.append(tokenImage[0]);
 				break;
 			}
-			msg.append(add_escapes(tok.image));
+			tokenName.append(add_escapes(tok.image));
 			tok = tok.next;
 		}
-		msg.append("\".");
+		msg.append(tokenName.toString()).append("\".");
 
 		// Append the expected tokens list:
 		if (expectedTokenSequences.length == 1){
@@ -150,6 +177,11 @@ public class ParseException extends Exception {
 		}
 		msg.append(expected);
 
+		// Append a hint about reserved words if it is one:
+		String word = tokenName.toString().trim();
+		if (word.toUpperCase().matches(ADQL_RESERVED_WORDS_REGEX))
+			msg.append(System.getProperty("line.separator", "\n")).append("(HINT: \"").append(word).append("\" is a reserved ADQL word. To use it as a column/table/schema name/alias, write it between double quotes.)");
+
 		return msg.toString();
 		/*String eol = System.getProperty("line.separator", "\n");
 		StringBuffer expected = new StringBuffer();
diff --git a/src/adql/parser/adqlGrammar.jj b/src/adql/parser/adqlGrammar.jj
index 7f67e4ebffdea92978201d506ab4550e90d6e872..8eb9fcc2673c011361b0c221d11598f39899a5ab 100644
--- a/src/adql/parser/adqlGrammar.jj
+++ b/src/adql/parser/adqlGrammar.jj
@@ -1192,10 +1192,21 @@ ADQLOperand ValueExpression(): {ADQLOperand valueExpr = null; Token left, right;
 		| LOOKAHEAD(<COORDSYS> | (StringFactor() <CONCAT>)) valueExpr=StringExpression()
 		| LOOKAHEAD(<LEFT_PAR>) left=<LEFT_PAR> valueExpr=ValueExpression() right=<RIGHT_PAR> { valueExpr = queryFactory.createWrappedOperand(valueExpr); ((WrappedOperand)valueExpr).setPosition(new TextPosition(left, right)); }
 		| LOOKAHEAD(<REGULAR_IDENTIFIER> <LEFT_PAR>) valueExpr=UserDefinedFunction()
-		| valueExpr=GeometryValueFunction()
+		| LOOKAHEAD(2) valueExpr=GeometryValueFunction()
 		| LOOKAHEAD(Column()) valueExpr=Column()
 		| LOOKAHEAD(String()) valueExpr=StringFactor()
-		| valueExpr=Factor())
+		| LOOKAHEAD(3) valueExpr=Factor()
+
+		/* At this position in this switch, all possibilities (including
+		 * Column()) have already been tested and failed.
+		 * 
+		 * So, this final choice actually aims to throw an error set with the
+		 * current token and with an error message implying that a column name
+		 * was expected (which is generally the case in an ADQL query).
+		 *
+		 * Note: This choice will generally be reached if an unexpected ADQL
+		 *       word is ending the query. */
+		| valueExpr=Column() )
 		{return valueExpr;}
 	}catch(Exception ex){
 		throw generateParseException(ex);
diff --git a/test/adql/parser/TestADQLParser.java b/test/adql/parser/TestADQLParser.java
index 679ed01a68050b83df3d574582ba5441659caf35..bea813b5d16711d731f5a340e8e413773fcb30be 100644
--- a/test/adql/parser/TestADQLParser.java
+++ b/test/adql/parser/TestADQLParser.java
@@ -206,4 +206,82 @@ public class TestADQLParser {
 		}
 	}
 
+	@Test
+	public void testADQLReservedWord(){
+		ADQLParser parser = new ADQLParser();
+
+		final String hintAbs = "\n(HINT: \"abs\" is a reserved ADQL word. To use it as a column/table/schema name/alias, write it between double quotes.)";
+		final String hintPoint = "\n(HINT: \"point\" is a reserved ADQL word. To use it as a column/table/schema name/alias, write it between double quotes.)";
+		final String hintExists = "\n(HINT: \"exists\" is a reserved ADQL word. To use it as a column/table/schema name/alias, write it between double quotes.)";
+		final String hintLike = "\n(HINT: \"LIKE\" is a reserved ADQL word. To use it as a column/table/schema name/alias, write it between double quotes.)";
+
+		/* TEST AS A COLUMN/TABLE/SCHEMA NAME... */
+		// ...with a numeric function name (but no param):
+		try{
+			parser.parseQuery("select abs from aTable");
+		}catch(Throwable t){
+			assertEquals(ParseException.class, t.getClass());
+			assertTrue(t.getMessage().endsWith(hintAbs));
+		}
+		// ...with a geometric function name (but no param):
+		try{
+			parser.parseQuery("select point from aTable");
+		}catch(Throwable t){
+			assertEquals(ParseException.class, t.getClass());
+			assertTrue(t.getMessage().endsWith(hintPoint));
+		}
+		// ...with an ADQL function name (but no param):
+		try{
+			parser.parseQuery("select exists from aTable");
+		}catch(Throwable t){
+			assertEquals(ParseException.class, t.getClass());
+			assertTrue(t.getMessage().endsWith(hintExists));
+		}
+		// ...with an ADQL syntax item:
+		try{
+			parser.parseQuery("select LIKE from aTable");
+		}catch(Throwable t){
+			assertEquals(ParseException.class, t.getClass());
+			assertTrue(t.getMessage().endsWith(hintLike));
+		}
+
+		/* TEST AS AN ALIAS... */
+		// ...with a numeric function name (but no param):
+		try{
+			parser.parseQuery("select aCol AS abs from aTable");
+		}catch(Throwable t){
+			assertEquals(ParseException.class, t.getClass());
+			assertTrue(t.getMessage().endsWith(hintAbs));
+		}
+		// ...with a geometric function name (but no param):
+		try{
+			parser.parseQuery("select aCol AS point from aTable");
+		}catch(Throwable t){
+			assertEquals(ParseException.class, t.getClass());
+			assertTrue(t.getMessage().endsWith(hintPoint));
+		}
+		// ...with an ADQL function name (but no param):
+		try{
+			parser.parseQuery("select aCol AS exists from aTable");
+		}catch(Throwable t){
+			assertEquals(ParseException.class, t.getClass());
+			assertTrue(t.getMessage().endsWith(hintExists));
+		}
+		// ...with an ADQL syntax item:
+		try{
+			parser.parseQuery("select aCol AS LIKE from aTable");
+		}catch(Throwable t){
+			assertEquals(ParseException.class, t.getClass());
+			assertTrue(t.getMessage().endsWith(hintLike));
+		}
+
+		/* TEST AT THE END OF THE QUERY (AND IN A WHERE) */
+		try{
+			parser.parseQuery("select aCol from aTable WHERE toto = abs");
+		}catch(Throwable t){
+			assertEquals(ParseException.class, t.getClass());
+			assertTrue(t.getMessage().endsWith(hintAbs));
+		}
+	}
+
 }