From 8b1c7efdc5e013a4962014a289d4fe65110320aa Mon Sep 17 00:00:00 2001
From: gmantele <gmantele@ari.uni-heidelberg.de>
Date: Mon, 8 Jun 2015 20:14:06 +0200
Subject: [PATCH] [ADQL] Fix merge side-effects (e.g. '' were not translated
 any more as a single ' ; NullPointerExceptions when building positions) +
 transform the test main class for positions into a JUnit test case + Fix some
 position mistakes. (note: a tabulation character seems to be interpreted by
 JavaCC as 8 characters)

---
 src/adql/parser/ADQLParser.java               | 1735 ++++++-----------
 src/adql/parser/adqlGrammar.jj                |   52 +-
 test/adql/TestADQLObjectPosition.java         |  143 ++
 test/adql/TestGetPositionInAllADQLObject.java |   27 -
 4 files changed, 764 insertions(+), 1193 deletions(-)
 create mode 100644 test/adql/TestADQLObjectPosition.java
 delete mode 100644 test/adql/TestGetPositionInAllADQLObject.java

diff --git a/src/adql/parser/ADQLParser.java b/src/adql/parser/ADQLParser.java
index 9a57a12..a2b45c9 100644
--- a/src/adql/parser/ADQLParser.java
+++ b/src/adql/parser/ADQLParser.java
@@ -927,7 +927,7 @@ public class ADQLParser implements ADQLParserConstants {
 				order = OrderItem();
 				orderBy.add(order);
 			}
-			orderBy.setPosition(new TextPosition(start.beginLine, start.beginColumn, order.getPosition().endLine, order.getPosition().endColumn));
+			orderBy.setPosition(new TextPosition(start, token));
 		}finally{
 			trace_return("OrderBy");
 		}
@@ -1512,12 +1512,14 @@ public class ADQLParser implements ADQLParserConstants {
 	final public StringConstant String() throws ParseException{
 		trace_call("String");
 		try{
-			Token t;
+			Token t, start = null;
 			String str = "";
 			StringConstant cst;
 			label_8: while(true){
 				t = jj_consume_token(STRING_LITERAL);
-				str += t.image;
+				str += t.image.substring(1, t.image.length() - 1).replaceAll("''", "'");
+				if (start == null)
+					start = t;
 				switch((jj_ntk == -1) ? jj_ntk() : jj_ntk){
 					case STRING_LITERAL:
 						;
@@ -1528,9 +1530,8 @@ public class ADQLParser implements ADQLParserConstants {
 				}
 			}
 			try{
-				str = (str != null) ? str.substring(1, str.length() - 1) : str;
 				cst = queryFactory.createStringConstant(str);
-				cst.setPosition(new TextPosition(t));
+				cst.setPosition(new TextPosition(start, t));
 				{
 					if (true)
 						return cst;
@@ -1751,6 +1752,7 @@ public class ADQLParser implements ADQLParserConstants {
 			StringConstant expr;
 			ADQLColumn column;
 			ADQLOperand op;
+			Token left, right;
 			try{
 				switch((jj_ntk == -1) ? jj_ntk() : jj_ntk){
 					case STRING_LITERAL:
@@ -1771,12 +1773,14 @@ public class ADQLParser implements ADQLParserConstants {
 						}
 						break;
 					case LEFT_PAR:
-						jj_consume_token(LEFT_PAR);
+						left = jj_consume_token(LEFT_PAR);
 						op = StringExpression();
-						jj_consume_token(RIGHT_PAR);
+						right = jj_consume_token(RIGHT_PAR);
+						WrappedOperand wop = queryFactory.createWrappedOperand(op);
+						wop.setPosition(new TextPosition(left, right));
 						{
 							if (true)
-								return queryFactory.createWrappedOperand(op);
+								return wop;
 						}
 						break;
 					default:
@@ -1800,16 +1804,18 @@ public class ADQLParser implements ADQLParserConstants {
 		trace_call("ValueExpression");
 		try{
 			ADQLOperand valueExpr = null;
+			Token left, right;
 			try{
 				if (jj_2_4(2147483647)){
 					valueExpr = NumericExpression();
 				}else if (jj_2_5(2147483647)){
 					valueExpr = StringExpression();
 				}else if (jj_2_6(2147483647)){
-					jj_consume_token(LEFT_PAR);
+					left = jj_consume_token(LEFT_PAR);
 					valueExpr = ValueExpression();
-					jj_consume_token(RIGHT_PAR);
+					right = jj_consume_token(RIGHT_PAR);
 					valueExpr = queryFactory.createWrappedOperand(valueExpr);
+					((WrappedOperand)valueExpr).setPosition(new TextPosition(left, right));
 				}else if (jj_2_7(2147483647)){
 					valueExpr = UserDefinedFunction();
 				}else{
@@ -2014,7 +2020,7 @@ public class ADQLParser implements ADQLParserConstants {
 							jj_consume_token(PLUS);
 							break;
 						case MINUS:
-							jj_consume_token(MINUS);
+							minusSign = jj_consume_token(MINUS);
 							negative = true;
 							break;
 						default:
@@ -2052,9 +2058,13 @@ public class ADQLParser implements ADQLParserConstants {
 			}
 			if (negative){
 				try{
+					TextPosition position = op.getPosition();
 					op = queryFactory.createNegativeOperand(op);
 					NegativeOperand negativeOp = (NegativeOperand)op;
-					negativeOp.setPosition(new TextPosition(minusSign.beginLine, minusSign.beginColumn, negativeOp.getPosition().endLine, negativeOp.getPosition().endColumn));
+					if (minusSign != null)
+						negativeOp.setPosition(new TextPosition(minusSign.beginLine, minusSign.beginColumn, position.endLine, position.endColumn));
+					else
+						negativeOp.setPosition(position);
 				}catch(Exception ex){
 					{
 						if (true)
@@ -3801,55 +3811,51 @@ public class ADQLParser implements ADQLParserConstants {
 		}
 	}
 
-	private boolean jj_3R_126(){
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_27())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
+	private boolean jj_3R_116(){
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_137(){
-		if (jj_scan_token(CENTROID))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
+	private boolean jj_3R_151(){
+		if (jj_3R_21())
 			return true;
-		if (jj_3R_122())
+		return false;
+	}
+
+	private boolean jj_3R_104(){
+		if (jj_scan_token(FULL))
 			return true;
-		if (jj_scan_token(RIGHT_PAR))
+		return false;
+	}
+
+	private boolean jj_3R_146(){
+		if (jj_3R_137())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_125(){
-		if (jj_3R_21())
+	private boolean jj_3R_44(){
+		if (jj_scan_token(SELECT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_46(){
+	private boolean jj_3R_101(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_62()){
+		if (jj_3R_123()){
 			jj_scanpos = xsp;
-			if (jj_3R_63()){
+			if (jj_3R_124()){
 				jj_scanpos = xsp;
-				if (jj_3R_64()){
+				if (jj_3R_125()){
 					jj_scanpos = xsp;
-					if (jj_3R_65()){
+					if (jj_3R_126()){
 						jj_scanpos = xsp;
-						if (jj_3R_66()){
+						if (jj_3R_127()){
 							jj_scanpos = xsp;
-							if (jj_3R_67()){
-								jj_scanpos = xsp;
-								if (jj_3R_68()){
-									jj_scanpos = xsp;
-									if (jj_3R_69())
-										return true;
-								}
-							}
+							if (jj_3R_128())
+								return true;
 						}
 					}
 				}
@@ -3858,217 +3864,108 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_148(){
-		if (jj_scan_token(TOP))
-			return true;
-		if (jj_scan_token(UNSIGNED_INTEGER))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_124(){
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_147(){
-		if (jj_scan_token(QUANTIFIER))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_112(){
-		if (jj_scan_token(FULL))
+	private boolean jj_3R_152(){
+		if (jj_3R_42())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_48(){
-		if (jj_scan_token(SELECT))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_147())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_148())
-			jj_scanpos = xsp;
-		if (jj_3R_149())
+	private boolean jj_3R_144(){
+		if (jj_3R_137())
 			return true;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_150()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
 		return false;
 	}
 
-	private boolean jj_3R_136(){
-		if (jj_scan_token(BOX))
-			return true;
+	private boolean jj_3R_113(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_169())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_170())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_108())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_182(){
+	private boolean jj_3R_149(){
 		if (jj_3R_21())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_121(){
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_108())
-			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())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
+	private boolean jj_3R_112(){
+		if (jj_3R_130())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_120(){
-		if (jj_3R_143())
+	private boolean jj_3R_150(){
+		if (jj_3R_137())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_76(){
+	private boolean jj_3R_70(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_124()){
+		if (jj_3R_116()){
 			jj_scanpos = xsp;
-			if (jj_3R_125()){
+			if (jj_3R_117()){
 				jj_scanpos = xsp;
-				if (jj_3R_126())
+				if (jj_3R_118())
 					return true;
 			}
 		}
 		return false;
 	}
 
-	private boolean jj_3R_119(){
+	private boolean jj_3R_111(){
 		if (jj_3R_21())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_177(){
-		if (jj_3R_158())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_118(){
-		if (jj_3R_142())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_109(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_136()){
-			jj_scanpos = xsp;
-			if (jj_3R_137()){
-				jj_scanpos = xsp;
-				if (jj_3R_138()){
-					jj_scanpos = xsp;
-					if (jj_3R_139()){
-						jj_scanpos = xsp;
-						if (jj_3R_140()){
-							jj_scanpos = xsp;
-							if (jj_3R_141())
-								return true;
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_183(){
-		if (jj_3R_46())
+	private boolean jj_3R_135(){
+		if (jj_3R_27())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_175(){
-		if (jj_3R_158())
+	private boolean jj_3R_110(){
+		if (jj_3R_129())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_180(){
-		if (jj_3R_21())
+	private boolean jj_3R_16(){
+		if (jj_scan_token(LEFT_PAR))
 			return true;
-		return false;
-	}
-
-	private boolean jj_3R_181(){
-		if (jj_3R_158())
+		if (jj_3R_31())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_169(){
-		if (jj_3R_27())
+	private boolean jj_3R_148(){
+		if (jj_3R_137())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_115(){
+	private boolean jj_3R_107(){
 		if (jj_scan_token(FULL))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_133(){
-		if (jj_3R_155())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_74(){
+	private boolean jj_3R_68(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_118()){
+		if (jj_3R_110()){
 			jj_scanpos = xsp;
-			if (jj_3R_119()){
+			if (jj_3R_111()){
 				jj_scanpos = xsp;
-				if (jj_3R_120()){
+				if (jj_3R_112()){
 					jj_scanpos = xsp;
-					if (jj_3R_121())
+					if (jj_3R_113())
 						return true;
 				}
 			}
@@ -4076,54 +3973,24 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_132(){
-		if (jj_3R_154())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_179(){
-		if (jj_3R_158())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_131(){
-		if (jj_3R_153())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_130(){
-		if (jj_3R_152())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_111(){
-		if (jj_scan_token(RIGHT))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_105(){
+	private boolean jj_3R_99(){
 		if (jj_scan_token(DISTANCE))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_179()){
+		if (jj_3R_148()){
 			jj_scanpos = xsp;
-			if (jj_3R_180())
+			if (jj_3R_149())
 				return true;
 		}
 		if (jj_scan_token(COMMA))
 			return true;
 		xsp = jj_scanpos;
-		if (jj_3R_181()){
+		if (jj_3R_150()){
 			jj_scanpos = xsp;
-			if (jj_3R_182())
+			if (jj_3R_151())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -4131,16 +3998,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_104(){
+	private boolean jj_3R_98(){
 		if (jj_scan_token(COORD2))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_177()){
+		if (jj_3R_146()){
 			jj_scanpos = xsp;
-			if (jj_3R_178())
+			if (jj_3R_147())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -4148,37 +4015,16 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_31(){
-		if (jj_3R_48())
-			return true;
-		if (jj_3R_129())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_130())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_131())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_132())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_133())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_103(){
+	private boolean jj_3R_97(){
 		if (jj_scan_token(COORD1))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_175()){
+		if (jj_3R_144()){
 			jj_scanpos = xsp;
-			if (jj_3R_176())
+			if (jj_3R_145())
 				return true;
 		}
 		if (jj_scan_token(RIGHT_PAR))
@@ -4186,40 +4032,19 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_102(){
+	private boolean jj_3R_96(){
 		if (jj_scan_token(AREA))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_122())
+		if (jj_3R_114())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_197(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(8)){
-			jj_scanpos = xsp;
-			if (jj_scan_token(9))
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_191(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_197())
-			jj_scanpos = xsp;
-		if (jj_scan_token(UNSIGNED_INTEGER))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_101(){
+	private boolean jj_3R_95(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(58)){
@@ -4229,43 +4054,62 @@ public class ADQLParser implements ADQLParserConstants {
 		}
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_122())
+		if (jj_3R_114())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_122())
+		if (jj_3R_114())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_114(){
+	private boolean jj_3R_103(){
 		if (jj_scan_token(RIGHT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_201(){
-		if (jj_scan_token(COMMA))
+	private boolean jj_3R_154(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_scan_token(8)){
+			jj_scanpos = xsp;
+			if (jj_scan_token(9))
+				return true;
+		}
+		return false;
+	}
+
+	private boolean jj_3R_31(){
+		if (jj_3R_44())
 			return true;
-		if (jj_3R_14())
+		return false;
+	}
+
+	private boolean jj_3R_153(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_154())
+			jj_scanpos = xsp;
+		if (jj_scan_token(UNSIGNED_INTEGER))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_59(){
+	private boolean jj_3R_55(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_101()){
+		if (jj_3R_95()){
 			jj_scanpos = xsp;
-			if (jj_3R_102()){
+			if (jj_3R_96()){
 				jj_scanpos = xsp;
-				if (jj_3R_103()){
+				if (jj_3R_97()){
 					jj_scanpos = xsp;
-					if (jj_3R_104()){
+					if (jj_3R_98()){
 						jj_scanpos = xsp;
-						if (jj_3R_105())
+						if (jj_3R_99())
 							return true;
 					}
 				}
@@ -4274,25 +4118,23 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_157(){
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_46())
+	private boolean jj_3R_106(){
+		if (jj_scan_token(RIGHT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_170(){
-		if (jj_3R_108())
+	private boolean jj_3R_136(){
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_160(){
+	private boolean jj_3R_140(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(47)){
@@ -4311,14 +4153,34 @@ public class ADQLParser implements ADQLParserConstants {
 		xsp = jj_scanpos;
 		if (jj_scan_token(19))
 			jj_scanpos = xsp;
-		if (jj_3R_46())
+		if (jj_3R_42())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_142(){
+	private boolean jj_3R_139(){
+		if (jj_scan_token(COUNT))
+			return true;
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_scan_token(19))
+			jj_scanpos = xsp;
+		xsp = jj_scanpos;
+		if (jj_scan_token(10)){
+			jj_scanpos = xsp;
+			if (jj_3R_152())
+				return true;
+		}
+		if (jj_scan_token(RIGHT_PAR))
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_129(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(99)){
@@ -4332,80 +4194,48 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_110(){
+	private boolean jj_3R_102(){
 		if (jj_scan_token(LEFT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_70(){
+	private boolean jj_3R_64(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_110()){
+		if (jj_3R_102()){
 			jj_scanpos = xsp;
-			if (jj_3R_111()){
+			if (jj_3R_103()){
 				jj_scanpos = xsp;
-				if (jj_3R_112())
+				if (jj_3R_104())
 					return true;
 			}
 		}
-		xsp = jj_scanpos;
-		if (jj_scan_token(25))
-			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_159(){
-		if (jj_scan_token(COUNT))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
+	private boolean jj_3R_130(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_scan_token(19))
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(10)){
+		if (jj_3R_139()){
 			jj_scanpos = xsp;
-			if (jj_3R_183())
+			if (jj_3R_140())
 				return true;
 		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
 		return false;
 	}
 
-	private boolean jj_3R_49(){
+	private boolean jj_3R_45(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(24)){
 			jj_scanpos = xsp;
-			if (jj_3R_70())
+			if (jj_3R_64())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_200(){
-		if (jj_scan_token(USING))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_14())
-			return true;
-		Token xsp;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_201()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
 	private boolean jj_3R_37(){
 		if (jj_scan_token(STRING_LITERAL))
 			return true;
@@ -4426,20 +4256,20 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_113(){
+	private boolean jj_3R_105(){
 		if (jj_scan_token(LEFT))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_71(){
+	private boolean jj_3R_65(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_113()){
+		if (jj_3R_105()){
 			jj_scanpos = xsp;
-			if (jj_3R_114()){
+			if (jj_3R_106()){
 				jj_scanpos = xsp;
-				if (jj_3R_115())
+				if (jj_3R_107())
 					return true;
 			}
 		}
@@ -4449,31 +4279,12 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_199(){
-		if (jj_scan_token(ON))
-			return true;
-		if (jj_3R_163())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_143(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_159()){
-			jj_scanpos = xsp;
-			if (jj_3R_160())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_50(){
+	private boolean jj_3R_46(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(24)){
 			jj_scanpos = xsp;
-			if (jj_3R_71())
+			if (jj_3R_65())
 				return true;
 		}
 		return false;
@@ -4482,18 +4293,12 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_33(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_50())
+		if (jj_3R_46())
 			jj_scanpos = xsp;
 		if (jj_scan_token(JOIN))
 			return true;
-		if (jj_3R_51())
+		if (jj_3R_47())
 			return true;
-		xsp = jj_scanpos;
-		if (jj_3R_199()){
-			jj_scanpos = xsp;
-			if (jj_3R_200())
-				return true;
-		}
 		return false;
 	}
 
@@ -4502,30 +4307,10 @@ public class ADQLParser implements ADQLParserConstants {
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_49())
+		if (jj_3R_45())
 			jj_scanpos = xsp;
 		if (jj_scan_token(JOIN))
 			return true;
-		if (jj_3R_51())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_134(){
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_46())
-			return true;
-		Token xsp;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_157()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
 		return false;
 	}
 
@@ -4535,19 +4320,15 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_107(){
+	private boolean jj_3R_26(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(35))
 			jj_scanpos = xsp;
-		if (jj_scan_token(IN))
+		if (jj_scan_token(BETWEEN))
+			return true;
+		if (jj_3R_42())
 			return true;
-		xsp = jj_scanpos;
-		if (jj_3_16()){
-			jj_scanpos = xsp;
-			if (jj_3R_134())
-				return true;
-		}
 		return false;
 	}
 
@@ -4562,88 +4343,108 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_198(){
+	private boolean jj_3_13(){
+		if (jj_3R_26())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_109(){
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		return false;
+	}
+
+	private boolean jj_3_3(){
 		if (jj_3R_17())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_192(){
+	private boolean jj_3R_47(){
+		if (jj_3R_66())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3_15(){
+		if (jj_3R_27())
+			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_scan_token(22))
+		if (jj_scan_token(35))
 			jj_scanpos = xsp;
-		if (jj_3R_14())
+		if (jj_scan_token(LIKE))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_193(){
-		if (jj_3R_72())
+	private boolean jj_3_14(){
+		if (jj_3R_21())
 			return true;
-		Token xsp;
-		if (jj_3R_198())
+		if (jj_scan_token(IS))
 			return true;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_198()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
 		return false;
 	}
 
-	private boolean jj_3R_117(){
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_193())
+	private boolean jj_3_2(){
+		if (jj_3R_16())
 			return true;
-		if (jj_scan_token(RIGHT_PAR))
+		return false;
+	}
+
+	private boolean jj_3R_108(){
+		if (jj_3R_71())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_3(){
-		if (jj_3R_17())
+	private boolean jj_3R_133(){
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_42())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_26(){
+	private boolean jj_3R_66(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_scan_token(35))
+		if (jj_3R_108()){
 			jj_scanpos = xsp;
-		if (jj_scan_token(BETWEEN))
-			return true;
-		if (jj_3R_46())
-			return true;
-		if (jj_scan_token(AND))
-			return true;
-		if (jj_3R_46())
+			if (jj_3_2()){
+				jj_scanpos = xsp;
+				if (jj_3R_109())
+					return true;
+			}
+		}
+		return false;
+	}
+
+	private boolean jj_3R_25(){
+		if (jj_3R_42())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_190(){
+	private boolean jj_3_12(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_scan_token(45)){
+		if (jj_scan_token(41)){
 			jj_scanpos = xsp;
-			if (jj_scan_token(46))
+			if (jj_3R_25())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_51(){
-		if (jj_3R_72())
+	private boolean jj_3R_115(){
+		if (jj_3R_42())
 			return true;
 		Token xsp;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3_3()){
+			if (jj_3R_133()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -4651,407 +4452,138 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_61(){
-		if (jj_3R_107())
+	private boolean jj_3R_52(){
+		if (jj_scan_token(DOT))
+			return true;
+		if (jj_3R_71())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_13(){
-		if (jj_3R_26())
+	private boolean jj_3R_143(){
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_153())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_60(){
-		if (jj_3R_106())
+	private boolean jj_3R_21(){
+		if (jj_3R_36())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_106(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(12)){
-			jj_scanpos = xsp;
-			if (jj_scan_token(13)){
-				jj_scanpos = xsp;
-				if (jj_scan_token(14)){
-					jj_scanpos = xsp;
-					if (jj_scan_token(15)){
-						jj_scanpos = xsp;
-						if (jj_scan_token(16)){
-							jj_scanpos = xsp;
-							if (jj_scan_token(17))
-								return true;
-						}
-					}
-				}
-			}
-		}
-		if (jj_3R_46())
+	private boolean jj_3R_142(){
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_153())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_15(){
-		if (jj_3R_27())
+	private boolean jj_3R_36(){
+		if (jj_3R_14())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_scan_token(35))
+		if (jj_3R_52())
 			jj_scanpos = xsp;
-		if (jj_scan_token(LIKE))
-			return true;
 		return false;
 	}
 
-	private boolean jj_3_2(){
-		if (jj_3R_16())
+	private boolean jj_3R_120(){
+		if (jj_scan_token(DOT))
 			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(22))
-			jj_scanpos = xsp;
 		if (jj_3R_14())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_116(){
-		if (jj_3R_77())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_192())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_45(){
-		if (jj_3R_46())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_60()){
-			jj_scanpos = xsp;
-			if (jj_3_13()){
-				jj_scanpos = xsp;
-				if (jj_3R_61())
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3_14(){
-		if (jj_3R_21())
-			return true;
-		if (jj_scan_token(IS))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_44(){
-		if (jj_3R_27())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(35))
-			jj_scanpos = xsp;
-		if (jj_scan_token(LIKE))
-			return true;
-		if (jj_3R_27())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_43(){
-		if (jj_3R_21())
-			return true;
-		if (jj_scan_token(IS))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(35))
-			jj_scanpos = xsp;
-		if (jj_scan_token(NULL))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_72(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_116()){
-			jj_scanpos = xsp;
-			if (jj_3_2()){
-				jj_scanpos = xsp;
-				if (jj_3R_117())
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_42(){
-		if (jj_scan_token(EXISTS))
-			return true;
-		if (jj_3R_16())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_146(){
-		if (jj_scan_token(COMMA))
+	private boolean jj_3R_119(){
+		if (jj_scan_token(DOT))
 			return true;
-		if (jj_3R_46())
+		if (jj_3R_14())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_25(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_42()){
-			jj_scanpos = xsp;
-			if (jj_3R_43()){
-				jj_scanpos = xsp;
-				if (jj_3R_44()){
-					jj_scanpos = xsp;
-					if (jj_3R_45())
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_189(){
-		if (jj_3R_36())
+	private boolean jj_3R_132(){
+		if (jj_3R_101())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_166(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_189()){
-			jj_scanpos = xsp;
-			if (jj_scan_token(101))
-				return true;
-		}
-		xsp = jj_scanpos;
-		if (jj_3R_190())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3_12(){
-		if (jj_3R_25())
+	private boolean jj_3R_24(){
+		if (jj_scan_token(REGULAR_IDENTIFIER))
 			return true;
-		return false;
-	}
-
-	private boolean jj_3R_195(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_163())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_194(){
-		if (jj_3R_25())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_188(){
-		if (jj_3R_36())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_186(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_194()){
-			jj_scanpos = xsp;
-			if (jj_3R_195())
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_164(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_188()){
+		if (jj_3R_115())
 			jj_scanpos = xsp;
-			if (jj_scan_token(101))
-				return true;
-		}
-		return false;
-	}
-
-	private boolean jj_3R_56(){
-		if (jj_scan_token(DOT))
-			return true;
-		if (jj_3R_77())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_21(){
-		if (jj_3R_36())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_123(){
-		if (jj_3R_46())
+		if (jj_scan_token(RIGHT_PAR))
 			return true;
-		Token xsp;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_146()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
 		return false;
 	}
 
-	private boolean jj_3R_196(){
-		if (jj_scan_token(NOT))
+	private boolean jj_3R_71(){
+		if (jj_3R_14())
 			return true;
-		return false;
-	}
-
-	private boolean jj_3R_187(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_scan_token(33)){
+		if (jj_3R_119())
 			jj_scanpos = xsp;
-			if (jj_scan_token(34))
-				return true;
-		}
 		xsp = jj_scanpos;
-		if (jj_3R_196())
+		if (jj_3R_120())
 			jj_scanpos = xsp;
-		if (jj_3R_186())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_174(){
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_191())
-			return true;
 		return false;
 	}
 
-	private boolean jj_3R_36(){
-		if (jj_3R_14())
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_56())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_128(){
-		if (jj_scan_token(DOT))
-			return true;
-		if (jj_3R_14())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_173(){
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_191())
+	private boolean jj_3R_29(){
+		if (jj_scan_token(DELIMITED_IDENTIFIER))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_127(){
-		if (jj_scan_token(DOT))
-			return true;
-		if (jj_3R_14())
+	private boolean jj_3R_141(){
+		if (jj_3R_100())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_185(){
-		if (jj_scan_token(NOT))
+	private boolean jj_3R_28(){
+		if (jj_scan_token(REGULAR_IDENTIFIER))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_77(){
-		if (jj_3R_14())
+	private boolean jj_3R_94(){
+		if (jj_scan_token(TAN))
 			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_127())
-			jj_scanpos = xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_128())
-			jj_scanpos = xsp;
-		return false;
-	}
-
-	private boolean jj_3R_29(){
-		if (jj_scan_token(DELIMITED_IDENTIFIER))
+		if (jj_scan_token(LEFT_PAR))
 			return true;
-		return false;
-	}
-
-	private boolean jj_3R_28(){
-		if (jj_scan_token(REGULAR_IDENTIFIER))
+		if (jj_3R_100())
 			return true;
-		return false;
-	}
-
-	private boolean jj_3R_145(){
-		if (jj_3R_109())
+		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_163(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_185())
-			jj_scanpos = xsp;
-		if (jj_3R_186())
+	private boolean jj_3R_131(){
+		if (jj_3R_21())
 			return true;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_187()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
 		return false;
 	}
 
-	private boolean jj_3R_24(){
-		if (jj_scan_token(REGULAR_IDENTIFIER))
+	private boolean jj_3R_93(){
+		if (jj_scan_token(SIN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_123())
-			jj_scanpos = xsp;
+		if (jj_3R_100())
+			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
@@ -5068,217 +4600,143 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_172(){
-		if (jj_3R_108())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_167(){
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_166())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_144(){
-		if (jj_3R_21())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_155(){
-		if (jj_scan_token(ORDER_BY))
-			return true;
-		if (jj_3R_166())
-			return true;
-		Token xsp;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_167()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_122(){
+	private boolean jj_3R_114(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_144()){
+		if (jj_3R_131()){
 			jj_scanpos = xsp;
-			if (jj_3R_145())
+			if (jj_3R_132())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_100(){
-		if (jj_scan_token(TAN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_108())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_99(){
-		if (jj_scan_token(SIN))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_108())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_55(){
-		if (jj_3R_76())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_98(){
+	private boolean jj_3R_92(){
 		if (jj_scan_token(COT))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3_11(){
-		if (jj_3R_24())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_97(){
+	private boolean jj_3R_91(){
 		if (jj_scan_token(COS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_96(){
+	private boolean jj_3R_90(){
 		if (jj_scan_token(ATAN2))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_54(){
-		if (jj_3R_75())
+	private boolean jj_3R_51(){
+		if (jj_3R_70())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_95(){
+	private boolean jj_3R_89(){
 		if (jj_scan_token(ATAN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_35(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_54()){
-			jj_scanpos = xsp;
-			if (jj_3_11()){
-				jj_scanpos = xsp;
-				if (jj_3R_55())
-					return true;
-			}
-		}
+	private boolean jj_3_11(){
+		if (jj_3R_24())
+			return true;
 		return false;
 	}
 
-	private boolean jj_3R_94(){
+	private boolean jj_3R_88(){
 		if (jj_scan_token(ASIN))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_154(){
-		if (jj_scan_token(HAVING))
-			return true;
-		if (jj_3R_163())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_53(){
-		if (jj_3R_74())
+	private boolean jj_3R_50(){
+		if (jj_3R_69())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_93(){
+	private boolean jj_3R_87(){
 		if (jj_scan_token(ACOS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_58(){
+	private boolean jj_3R_35(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_93()){
+		if (jj_3R_50()){
 			jj_scanpos = xsp;
-			if (jj_3R_94()){
+			if (jj_3_11()){
 				jj_scanpos = xsp;
-				if (jj_3R_95()){
+				if (jj_3R_51())
+					return true;
+			}
+		}
+		return false;
+	}
+
+	private boolean jj_3R_54(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_87()){
+			jj_scanpos = xsp;
+			if (jj_3R_88()){
+				jj_scanpos = xsp;
+				if (jj_3R_89()){
 					jj_scanpos = xsp;
-					if (jj_3R_96()){
+					if (jj_3R_90()){
 						jj_scanpos = xsp;
-						if (jj_3R_97()){
+						if (jj_3R_91()){
 							jj_scanpos = xsp;
-							if (jj_3R_98()){
+							if (jj_3R_92()){
 								jj_scanpos = xsp;
-								if (jj_3R_99()){
+								if (jj_3R_93()){
 									jj_scanpos = xsp;
-									if (jj_3R_100())
+									if (jj_3R_94())
 										return true;
 								}
 							}
@@ -5290,117 +4748,99 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_165(){
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_164())
+	private boolean jj_3R_49(){
+		if (jj_3R_68())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_153(){
-		if (jj_scan_token(GROUP_BY))
-			return true;
-		if (jj_3R_164())
-			return true;
-		Token xsp;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_165()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_92(){
+	private boolean jj_3R_86(){
 		if (jj_scan_token(TRUNCATE))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_174())
+		if (jj_3R_143())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_91(){
+	private boolean jj_3R_85(){
 		if (jj_scan_token(SQRT))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_90(){
+	private boolean jj_3R_84(){
 		if (jj_scan_token(ROUND))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_173())
+		if (jj_3R_142())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_89(){
+	private boolean jj_3R_83(){
 		if (jj_scan_token(RAND))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_172())
+		if (jj_3R_141())
 			jj_scanpos = xsp;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_88(){
+	private boolean jj_3R_82(){
 		if (jj_scan_token(RADIANS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_87(){
+	private boolean jj_3R_81(){
 		if (jj_scan_token(POWER))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_86(){
+	private boolean jj_3R_80(){
 		if (jj_scan_token(PI))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
@@ -5410,132 +4850,108 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_152(){
-		if (jj_scan_token(WHERE))
-			return true;
-		if (jj_3R_163())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_85(){
+	private boolean jj_3R_79(){
 		if (jj_scan_token(MOD))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_84(){
+	private boolean jj_3R_78(){
 		if (jj_scan_token(LOG10))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_47(){
-		if (jj_scan_token(CONCAT))
-			return true;
-		if (jj_3R_35())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_83(){
+	private boolean jj_3R_77(){
 		if (jj_scan_token(LOG))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_82(){
+	private boolean jj_3R_76(){
 		if (jj_scan_token(FLOOR))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_81(){
+	private boolean jj_3R_75(){
 		if (jj_scan_token(EXP))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_184(){
-		if (jj_scan_token(AS))
-			return true;
-		if (jj_3R_14())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_151(){
-		if (jj_scan_token(COMMA))
+	private boolean jj_3R_43(){
+		if (jj_scan_token(CONCAT))
 			return true;
-		if (jj_3R_51())
+		if (jj_3R_35())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_80(){
+	private boolean jj_3R_74(){
 		if (jj_scan_token(DEGREES))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_79(){
+	private boolean jj_3R_73(){
 		if (jj_scan_token(CEILING))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_78(){
+	private boolean jj_3R_72(){
 		if (jj_scan_token(ABS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -5548,29 +4964,7 @@ public class ADQLParser implements ADQLParserConstants {
 		Token xsp;
 		while(true){
 			xsp = jj_scanpos;
-			if (jj_3R_47()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
-		return false;
-	}
-
-	private boolean jj_3R_73(){
-		if (jj_scan_token(MINUS))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_129(){
-		if (jj_scan_token(FROM))
-			return true;
-		if (jj_3R_51())
-			return true;
-		Token xsp;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_151()){
+			if (jj_3R_43()){
 				jj_scanpos = xsp;
 				break;
 			}
@@ -5578,38 +4972,38 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_57(){
+	private boolean jj_3R_53(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_78()){
+		if (jj_3R_72()){
 			jj_scanpos = xsp;
-			if (jj_3R_79()){
+			if (jj_3R_73()){
 				jj_scanpos = xsp;
-				if (jj_3R_80()){
+				if (jj_3R_74()){
 					jj_scanpos = xsp;
-					if (jj_3R_81()){
+					if (jj_3R_75()){
 						jj_scanpos = xsp;
-						if (jj_3R_82()){
+						if (jj_3R_76()){
 							jj_scanpos = xsp;
-							if (jj_3R_83()){
+							if (jj_3R_77()){
 								jj_scanpos = xsp;
-								if (jj_3R_84()){
+								if (jj_3R_78()){
 									jj_scanpos = xsp;
-									if (jj_3R_85()){
+									if (jj_3R_79()){
 										jj_scanpos = xsp;
-										if (jj_3R_86()){
+										if (jj_3R_80()){
 											jj_scanpos = xsp;
-											if (jj_3R_87()){
+											if (jj_3R_81()){
 												jj_scanpos = xsp;
-												if (jj_3R_88()){
+												if (jj_3R_82()){
 													jj_scanpos = xsp;
-													if (jj_3R_89()){
+													if (jj_3R_83()){
 														jj_scanpos = xsp;
-														if (jj_3R_90()){
+														if (jj_3R_84()){
 															jj_scanpos = xsp;
-															if (jj_3R_91()){
+															if (jj_3R_85()){
 																jj_scanpos = xsp;
-																if (jj_3R_92())
+																if (jj_3R_86())
 																	return true;
 															}
 														}
@@ -5628,10 +5022,8 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_30(){
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
+	private boolean jj_3R_67(){
+		if (jj_scan_token(MINUS))
 			return true;
 		return false;
 	}
@@ -5642,37 +5034,20 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3_10(){
-		if (jj_3R_23())
-			return true;
-		return false;
-	}
-
 	private boolean jj_3R_40(){
-		if (jj_3R_59())
+		if (jj_3R_55())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_52(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(8)){
-			jj_scanpos = xsp;
-			if (jj_3R_73())
-				return true;
-		}
-		return false;
-	}
-
 	private boolean jj_3R_39(){
-		if (jj_3R_58())
+		if (jj_3R_54())
 			return true;
 		return false;
 	}
 
 	private boolean jj_3R_38(){
-		if (jj_3R_57())
+		if (jj_3R_53())
 			return true;
 		return false;
 	}
@@ -5694,29 +5069,32 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_162(){
-		if (jj_3R_46())
+	private boolean jj_3_10(){
+		if (jj_3R_23())
 			return true;
+		return false;
+	}
+
+	private boolean jj_3R_48(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_184())
+		if (jj_scan_token(8)){
 			jj_scanpos = xsp;
+			if (jj_3R_67())
+				return true;
+		}
 		return false;
 	}
 
-	private boolean jj_3R_15(){
+	private boolean jj_3R_30(){
 		if (jj_3R_14())
 			return true;
 		if (jj_scan_token(DOT))
 			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_30())
-			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_168(){
+	private boolean jj_3R_134(){
 		Token xsp;
 		xsp = jj_scanpos;
 		if (jj_scan_token(10)){
@@ -5724,7 +5102,7 @@ public class ADQLParser implements ADQLParserConstants {
 			if (jj_scan_token(11))
 				return true;
 		}
-		if (jj_3R_135())
+		if (jj_3R_121())
 			return true;
 		return false;
 	}
@@ -5732,38 +5110,57 @@ public class ADQLParser implements ADQLParserConstants {
 	private boolean jj_3R_34(){
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_52())
+		if (jj_3R_48())
 			jj_scanpos = xsp;
 		xsp = jj_scanpos;
 		if (jj_3_10()){
 			jj_scanpos = xsp;
-			if (jj_3R_53())
+			if (jj_3R_49())
 				return true;
 		}
 		return false;
 	}
 
-	private boolean jj_3R_75(){
+	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_30())
+			jj_scanpos = xsp;
+		return false;
+	}
+
+	private boolean jj_3R_69(){
 		if (jj_scan_token(COORDSYS))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_122())
+		if (jj_3R_114())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_156(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_scan_token(8)){
-			jj_scanpos = xsp;
-			if (jj_scan_token(9))
-				return true;
-		}
-		if (jj_3R_108())
+	private boolean jj_3R_147(){
+		if (jj_3R_21())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_145(){
+		if (jj_3R_21())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_138(){
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_136())
 			return true;
 		return false;
 	}
@@ -5787,8 +5184,15 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_178(){
-		if (jj_3R_21())
+	private boolean jj_3R_122(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_scan_token(8)){
+			jj_scanpos = xsp;
+			if (jj_scan_token(9))
+				return true;
+		}
+		if (jj_3R_100())
 			return true;
 		return false;
 	}
@@ -5801,40 +5205,38 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_176(){
-		if (jj_3R_21())
+	private boolean jj_3R_137(){
+		if (jj_scan_token(POINT))
+			return true;
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		if (jj_3R_135())
 			return true;
-		return false;
-	}
-
-	private boolean jj_3R_171(){
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_170())
+		if (jj_3R_136())
+			return true;
+		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_135(){
+	private boolean jj_3R_121(){
 		if (jj_3R_34())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_168())
+		if (jj_3R_134())
 			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_158(){
-		if (jj_scan_token(POINT))
+	private boolean jj_3R_128(){
+		if (jj_scan_token(REGION))
 			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_169())
-			return true;
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_170())
+		if (jj_3R_27())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
@@ -5847,44 +5249,12 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_161(){
-		if (jj_scan_token(ASTERISK))
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_1(){
-		if (jj_3R_14())
-			return true;
-		if (jj_scan_token(DOT))
-			return true;
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_15())
-			jj_scanpos = xsp;
-		if (jj_scan_token(ASTERISK))
-			return true;
-		return false;
-	}
-
 	private boolean jj_3_8(){
 		if (jj_3R_21())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_141(){
-		if (jj_scan_token(REGION))
-			return true;
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_27())
-			return true;
-		if (jj_scan_token(RIGHT_PAR))
-			return true;
-		return false;
-	}
-
 	private boolean jj_3_7(){
 		if (jj_scan_token(REGULAR_IDENTIFIER))
 			return true;
@@ -5910,6 +5280,52 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
+	private boolean jj_3_1(){
+		if (jj_3R_14())
+			return true;
+		if (jj_scan_token(DOT))
+			return true;
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_15())
+			jj_scanpos = xsp;
+		if (jj_scan_token(ASTERISK))
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_127(){
+		if (jj_scan_token(POLYGON))
+			return true;
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		if (jj_3R_135())
+			return true;
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_136())
+			return true;
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_136())
+			return true;
+		if (jj_scan_token(COMMA))
+			return true;
+		if (jj_3R_136())
+			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_3_4(){
 		Token xsp;
 		xsp = jj_scanpos;
@@ -5932,148 +5348,175 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_69(){
+	private boolean jj_3R_63(){
 		if (jj_3R_34())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_149(){
-		Token xsp;
-		xsp = jj_scanpos;
-		if (jj_3R_161()){
-			jj_scanpos = xsp;
-			if (jj_3_1()){
-				jj_scanpos = xsp;
-				if (jj_3R_162())
-					return true;
-			}
-		}
+	private boolean jj_3R_126(){
+		if (jj_3R_137())
+			return true;
 		return false;
 	}
 
-	private boolean jj_3R_68(){
+	private boolean jj_3R_62(){
 		if (jj_3R_35())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_67(){
+	private boolean jj_3R_61(){
 		if (jj_3R_21())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_108(){
-		if (jj_3R_135())
+	private boolean jj_3R_100(){
+		if (jj_3R_121())
 			return true;
 		Token xsp;
 		xsp = jj_scanpos;
-		if (jj_3R_156())
+		if (jj_3R_122())
 			jj_scanpos = xsp;
 		return false;
 	}
 
-	private boolean jj_3R_66(){
-		if (jj_3R_109())
+	private boolean jj_3R_60(){
+		if (jj_3R_101())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_140(){
-		if (jj_scan_token(POLYGON))
+	private boolean jj_3R_59(){
+		if (jj_3R_24())
 			return true;
+		return false;
+	}
+
+	private boolean jj_3R_58(){
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_169())
+		if (jj_3R_42())
 			return true;
-		if (jj_scan_token(COMMA))
+		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_125(){
+		if (jj_scan_token(CIRCLE))
 			return true;
-		if (jj_3R_170())
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		if (jj_3R_135())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_170())
+		if (jj_3R_136())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_170())
+		if (jj_3R_100())
 			return true;
-		Token xsp;
-		while(true){
-			xsp = jj_scanpos;
-			if (jj_3R_171()){
-				jj_scanpos = xsp;
-				break;
-			}
-		}
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_65(){
-		if (jj_3R_24())
+	private boolean jj_3R_56(){
+		if (jj_3R_100())
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_64(){
+	private boolean jj_3R_124(){
+		if (jj_scan_token(CENTROID))
+			return true;
 		if (jj_scan_token(LEFT_PAR))
 			return true;
-		if (jj_3R_46())
+		if (jj_3R_114())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_63(){
+	private boolean jj_3R_118(){
+		if (jj_scan_token(LEFT_PAR))
+			return true;
 		if (jj_3R_27())
 			return true;
-		return false;
-	}
-
-	private boolean jj_3R_139(){
-		if (jj_3R_158())
+		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
-	private boolean jj_3R_150(){
-		if (jj_scan_token(COMMA))
-			return true;
-		if (jj_3R_149())
+	private boolean jj_3R_123(){
+		if (jj_scan_token(BOX))
 			return true;
-		return false;
-	}
-
-	private boolean jj_3R_62(){
-		if (jj_3R_108())
+		if (jj_scan_token(LEFT_PAR))
 			return true;
-		return false;
-	}
-
-	private boolean jj_3R_138(){
-		if (jj_scan_token(CIRCLE))
+		if (jj_3R_135())
 			return true;
-		if (jj_scan_token(LEFT_PAR))
+		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_169())
+		if (jj_3R_136())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_170())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(COMMA))
 			return true;
-		if (jj_3R_108())
+		if (jj_3R_100())
 			return true;
 		if (jj_scan_token(RIGHT_PAR))
 			return true;
 		return false;
 	}
 
+	private boolean jj_3R_117(){
+		if (jj_3R_21())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_42(){
+		Token xsp;
+		xsp = jj_scanpos;
+		if (jj_3R_56()){
+			jj_scanpos = xsp;
+			if (jj_3R_57()){
+				jj_scanpos = xsp;
+				if (jj_3R_58()){
+					jj_scanpos = xsp;
+					if (jj_3R_59()){
+						jj_scanpos = xsp;
+						if (jj_3R_60()){
+							jj_scanpos = xsp;
+							if (jj_3R_61()){
+								jj_scanpos = xsp;
+								if (jj_3R_62()){
+									jj_scanpos = xsp;
+									if (jj_3R_63())
+										return true;
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		return false;
+	}
+
 	/** Generated Token Manager. */
 	public ADQLParserTokenManager token_source;
 	SimpleCharStream jj_input_stream;
diff --git a/src/adql/parser/adqlGrammar.jj b/src/adql/parser/adqlGrammar.jj
index ddd6b25..35e4352 100644
--- a/src/adql/parser/adqlGrammar.jj
+++ b/src/adql/parser/adqlGrammar.jj
@@ -854,7 +854,7 @@ void Having(): {ClauseConstraints having = query.getHaving(); Token start;} {
 void OrderBy(): {ClauseADQL<ADQLOrder> orderBy = query.getOrderBy(); ADQLOrder order = null; Token start;} {
 	start=<ORDER_BY> order=OrderItem() {orderBy.add(order);}
 	( <COMMA> order=OrderItem() {orderBy.add(order);} )*
-	{ orderBy.setPosition(new TextPosition(start.beginLine, start.beginColumn, order.getPosition().endLine, order.getPosition().endColumn)); }
+	{ orderBy.setPosition(new TextPosition(start, token)); }
 }
 
 /* *************************** */
@@ -1034,13 +1034,18 @@ ADQLJoin JoinSpecification(FromContent leftTable): { boolean natural = false; Jo
 /* ****** */
 /* STRING */
 /* ****** */
-StringConstant String(): {Token t; String str=""; StringConstant cst;} {
-	(t=<STRING_LITERAL> {str += t.image;})+
+StringConstant String(): {Token t, start=null; String str=""; StringConstant cst;} {
+	(t=<STRING_LITERAL>
+	 {
+	   	str += t.image.substring(1, t.image.length()-1).replaceAll("''", "'");
+	   	if (start == null)
+	   		start = t;
+	 }
+	)+
 	{
 		try{
-		  str = (str!=null)?str.substring(1,str.length()-1):str;
 		  cst = queryFactory.createStringConstant(str);
-		  cst.setPosition(new TextPosition(t));
+		  cst.setPosition(new TextPosition(start, t));
 		  return cst;
 		}catch(Exception ex){
 			throw generateParseException(ex);
@@ -1107,30 +1112,30 @@ ADQLOperand NumericValueExpressionPrimary(): {String expr; ADQLColumn column; AD
 		// set_function_specification
 		| op=SqlFunction() {return op;}
 		// LEFT_PAR value_expression RIGHT_PAR
-		| (left=<LEFT_PAR> op=NumericExpression() right=<RIGHT_PAR>) { WrappedOperand wop = queryFactory.createWrappedOperand(op); wop.setPosition(new TextPosition(left, right)); return wop;})
+		| (left=<LEFT_PAR> op=NumericExpression() right=<RIGHT_PAR>) { WrappedOperand wop = queryFactory.createWrappedOperand(op); wop.setPosition(new TextPosition(left, right)); return wop; })
 	}catch(Exception ex){
 		throw generateParseException(ex);
 	}
 }
 
-ADQLOperand StringValueExpressionPrimary(): {StringConstant expr; ADQLColumn column; ADQLOperand op;} {
+ADQLOperand StringValueExpressionPrimary(): {StringConstant expr; ADQLColumn column; ADQLOperand op; Token left, right;} {
 	try{
 		(// string
 		  expr=String() {return expr;}
 		// column_reference
 		| column=Column() {column.setExpectedType('S'); return column;}
 		// LEFT_PAR value_expression RIGHT_PAR
-		| (<LEFT_PAR> (op=StringExpression()) <RIGHT_PAR>) {return queryFactory.createWrappedOperand(op);})
+		| (left=<LEFT_PAR> (op=StringExpression()) right=<RIGHT_PAR>) { WrappedOperand wop = queryFactory.createWrappedOperand(op); wop.setPosition(new TextPosition(left, right)); return wop; })
 	}catch(Exception ex){
 		throw generateParseException(ex);
 	}
 }
 
-ADQLOperand ValueExpression(): {ADQLOperand valueExpr = null; } {
+ADQLOperand ValueExpression(): {ADQLOperand valueExpr = null; Token left, right; } {
 	try{
 		(LOOKAHEAD((<PLUS>|<MINUS>) | (Factor() (<PLUS>|<MINUS>|<ASTERISK>|<DIVIDE>))) valueExpr=NumericExpression()
 		| LOOKAHEAD(<COORDSYS> | (StringFactor() <CONCAT>)) valueExpr=StringExpression()
-		| LOOKAHEAD(<LEFT_PAR>) <LEFT_PAR> valueExpr=ValueExpression() <RIGHT_PAR> { valueExpr = queryFactory.createWrappedOperand(valueExpr); }
+		| 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(Column()) valueExpr=Column()
@@ -1178,16 +1183,20 @@ ADQLOperand NumericTerm(): {Token sign=null; ADQLOperand leftOp, rightOp=null;}
 
 ADQLOperand Factor(): {boolean negative = false; Token minusSign = null; ADQLOperand op;} {
 	(
-		(<PLUS> | (<MINUS> {negative = true;}))?
+		(<PLUS> | (minusSign=<MINUS> {negative = true;}))?
 		(LOOKAHEAD(2) op=NumericFunction() | op=NumericValueExpressionPrimary())
 	)
 	
 	{
 		if (negative){
 			try{
+			  	TextPosition position = op.getPosition();
 				op = queryFactory.createNegativeOperand(op);
 				NegativeOperand negativeOp = (NegativeOperand)op;
-				negativeOp.setPosition(new TextPosition(minusSign.beginLine, minusSign.beginColumn, negativeOp.getPosition().endLine, negativeOp.getPosition().endColumn));
+				if (minusSign != null)
+					negativeOp.setPosition(new TextPosition(minusSign.beginLine, minusSign.beginColumn, position.endLine, position.endColumn));
+				else
+					negativeOp.setPosition(position);
 			}catch(Exception ex){
 				throw generateParseException(ex);
 			}
@@ -1290,7 +1299,7 @@ ClauseConstraints ConditionsList(ClauseConstraints clause): {ADQLConstraint cons
 }
 
 ADQLConstraint Constraint(): {ADQLConstraint constraint =  null; Token start, end;} {
-	(LOOKAHEAD(Predicate()) constraint=Predicate()
+	(LOOKAHEAD(<EXISTS> | ValueExpression()) constraint=Predicate()
 	| (
 		start=<LEFT_PAR>
 		{
@@ -1310,12 +1319,14 @@ ADQLConstraint Constraint(): {ADQLConstraint constraint =  null; Token start, en
 ADQLConstraint Predicate(): {ADQLQuery q=null; ADQLColumn column=null; ADQLOperand strExpr1=null, strExpr2=null; ADQLOperand op; Token start, notToken = null, end; ADQLConstraint constraint = null;} {
 	try{
 		// exists_predicate
-		((start=<EXISTS> q=SubQueryExpression())
-		 {
-		   Exists e = queryFactory.createExists(q);
-		   e.setPosition(new TextPosition(start.beginLine, start.beginColumn, q.getPosition().endLine, q.getPosition().endColumn));
-		   return e;
-		 }
+		(
+		  (start=<EXISTS> q=SubQueryExpression()
+			{
+			  Exists e = queryFactory.createExists(q);
+			  e.setPosition(new TextPosition(start.beginLine, start.beginColumn, q.getPosition().endLine, q.getPosition().endColumn));
+			  return e;
+			}
+		  )
 		// null_predicate
 		| LOOKAHEAD(Column() <IS>)(column=Column() <IS> [notToken=<NOT>] end=<NULL>
 		    {
@@ -1340,7 +1351,8 @@ ADQLConstraint Predicate(): {ADQLQuery q=null; ADQLColumn column=null; ADQLOpera
 			// in_predicate
 			| constraint=InEnd(op)
 			)
-		))
+		  )
+		)
 	}catch(Exception ex){
 		throw generateParseException(ex);
 	}
diff --git a/test/adql/TestADQLObjectPosition.java b/test/adql/TestADQLObjectPosition.java
new file mode 100644
index 0000000..7c1b8d4
--- /dev/null
+++ b/test/adql/TestADQLObjectPosition.java
@@ -0,0 +1,143 @@
+package adql;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import adql.parser.ADQLParser;
+import adql.parser.ParseException;
+import adql.query.ADQLObject;
+import adql.query.ADQLQuery;
+import adql.query.TextPosition;
+import adql.query.constraint.Comparison;
+import adql.query.from.ADQLJoin;
+import adql.query.from.ADQLTable;
+import adql.query.operand.ADQLColumn;
+import adql.query.operand.ADQLOperand;
+import adql.query.operand.function.ADQLFunction;
+import adql.search.SimpleSearchHandler;
+
+public class TestADQLObjectPosition {
+
+	private ADQLParser parser = new ADQLParser();
+
+	@Before
+	public void setUp(){
+
+	}
+
+	@Test
+	public void testPositionInAllClauses(){
+		try{
+			ADQLQuery query = parser.parseQuery("SELECT truc, bidule.machin, toto(truc, chose) AS \"super\" FROM foo JOIN bidule USING(id) WHERE truc > 12.5 AND bidule.machin < 5 GROUP BY chose HAVING try > 0 ORDER BY chouetteAlors");
+
+			Iterator<ADQLObject> results = query.search(new SimpleSearchHandler(true){
+				@Override
+				protected boolean match(ADQLObject obj){
+					return obj.getPosition() == null;
+				}
+			});
+			if (results.hasNext()){
+				System.err.println("OBJECT WITH NO DEFINED POSITION:");
+				while(results.hasNext())
+					System.err.println("    * " + results.next().toADQL());
+				fail("At least one item of the generated ADQL tree does not have a position information! (see System.err for more details)");
+			}
+		}catch(ParseException pe){
+			pe.printStackTrace();
+			fail("No error should have occured here: the ADQL query is syntactically correct!");
+		}
+	}
+
+	private void assertEquality(final TextPosition expected, final TextPosition realPos){
+		assertEquals(expected.beginLine, realPos.beginLine);
+		assertEquals(expected.beginColumn, realPos.beginColumn);
+		assertEquals(expected.endLine, realPos.endLine);
+		assertEquals(expected.endColumn, realPos.endColumn);
+	}
+
+	@Test
+	public void testPositionAccuracy(){
+		try{
+			ADQLQuery query = parser.parseQuery("SELECT TOP 1000 oid FROM foo JOIN bar USING(oid)\nWHERE foo || toto = 'truc'\n      AND 2 > 1+0 GROUP BY oid HAVING COUNT(oid) > 10\n\tORDER BY 1 DESC");
+			// Test SELECT
+			assertEquality(new TextPosition(1, 1, 1, 20), query.getSelect().getPosition());
+			// Test ADQLColumn (here: "oid")
+			assertEquality(new TextPosition(1, 17, 1, 20), query.getSelect().get(0).getPosition());
+			// Test FROM & ADQLJoin
+			/* NB: The clause FROM is the only one which is not a list but a single item of type FromContent (JOIN or table).
+			 *     That's why, it is not possible to get its exact starting position ('FROM') ; the starting position is
+			 *     the one of the first table of the clause FROM. */
+			assertEquality(new TextPosition(1, 26, 1, 49), query.getFrom().getPosition());
+			// Test ADQLTable
+			ArrayList<ADQLTable> tables = query.getFrom().getTables();
+			assertEquality(new TextPosition(1, 26, 1, 29), tables.get(0).getPosition());
+			assertEquality(new TextPosition(1, 35, 1, 38), tables.get(1).getPosition());
+			// Test the join condition:
+			Iterator<ADQLColumn> itCol = ((ADQLJoin)query.getFrom()).getJoinedColumns();
+			assertEquality(new TextPosition(1, 45, 1, 48), itCol.next().getPosition());
+			// Test WHERE
+			assertEquality(new TextPosition(2, 1, 3, 18), query.getWhere().getPosition());
+			// Test COMPARISON = CONSTRAINT
+			Comparison comp = (Comparison)(query.getWhere().get(0));
+			assertEquality(new TextPosition(2, 7, 2, 27), comp.getPosition());
+			// Test left operand = concatenation:
+			ADQLOperand operand = comp.getLeftOperand();
+			assertEquality(new TextPosition(2, 7, 2, 18), operand.getPosition());
+			Iterator<ADQLObject> itObj = operand.adqlIterator();
+			// foo
+			assertEquality(new TextPosition(2, 7, 2, 10), itObj.next().getPosition());
+			// toto
+			assertEquality(new TextPosition(2, 14, 2, 18), itObj.next().getPosition());
+			// Test right operand = string:
+			operand = comp.getRightOperand();
+			assertEquality(new TextPosition(2, 21, 2, 27), operand.getPosition());
+			// Test COMPARISON > CONSTRAINT:
+			comp = (Comparison)(query.getWhere().get(1));
+			assertEquality(new TextPosition(3, 11, 3, 18), comp.getPosition());
+			// Test left operand = numeric:
+			operand = comp.getLeftOperand();
+			assertEquality(new TextPosition(3, 11, 3, 12), operand.getPosition());
+			// Test right operand = operation:
+			operand = comp.getRightOperand();
+			assertEquality(new TextPosition(3, 15, 3, 18), operand.getPosition());
+			itObj = operand.adqlIterator();
+			// 1
+			assertEquality(new TextPosition(3, 15, 3, 16), itObj.next().getPosition());
+			// 0
+			assertEquality(new TextPosition(3, 17, 3, 18), itObj.next().getPosition());
+			// Test GROUP BY
+			assertEquality(new TextPosition(3, 19, 3, 31), query.getGroupBy().getPosition());
+			// oid
+			assertEquality(new TextPosition(3, 28, 3, 31), query.getGroupBy().get(0).getPosition());
+			// Test HAVING
+			assertEquality(new TextPosition(3, 32, 3, 54), query.getHaving().getPosition());
+			// Test COMPARISON > CONSTRAINT:
+			comp = (Comparison)(query.getHaving().get(0));
+			assertEquality(new TextPosition(3, 39, 3, 54), comp.getPosition());
+			// Test left operand = COUNT function:
+			operand = comp.getLeftOperand();
+			assertEquality(new TextPosition(3, 39, 3, 49), operand.getPosition());
+			// Test parameter = ADQLColumn oid:
+			assertEquality(new TextPosition(3, 45, 3, 48), ((ADQLFunction)operand).getParameter(0).getPosition());
+			// Test right operand = operation:
+			operand = comp.getRightOperand();
+			assertEquality(new TextPosition(3, 52, 3, 54), operand.getPosition());
+			// Test ORDER BY
+			assertEquality(new TextPosition(4, 9, 4, 24), query.getOrderBy().getPosition());
+			// Test column index:
+			assertEquality(new TextPosition(4, 18, 4, 19), query.getOrderBy().get(0).getPosition());
+
+		}catch(ParseException pe){
+			System.err.println("ERROR IN THE ADQL QUERY AT " + pe.getPosition());
+			pe.printStackTrace();
+			fail("No error should have occured here: the ADQL query is syntactically correct!");
+		}
+	}
+
+}
diff --git a/test/adql/TestGetPositionInAllADQLObject.java b/test/adql/TestGetPositionInAllADQLObject.java
deleted file mode 100644
index 5fd4fc5..0000000
--- a/test/adql/TestGetPositionInAllADQLObject.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package adql;
-
-import java.util.Iterator;
-
-import adql.parser.ADQLParser;
-import adql.query.ADQLObject;
-import adql.query.ADQLQuery;
-import adql.search.SimpleSearchHandler;
-
-public class TestGetPositionInAllADQLObject {
-
-	public static void main(String[] args) throws Throwable{
-		ADQLParser parser = new ADQLParser();
-		ADQLQuery query = parser.parseQuery("SELECT truc, bidule.machin FROM foo JOIN bidule USING(id) WHERE truc > 12.5 AND bidule.machin < 5 GROUP BY chose HAVING try > 0 ORDER BY chouetteAlors");
-
-		System.out.println("\nOBJECT WITH NO DEFINED POSITION:");
-		Iterator<ADQLObject> results = query.search(new SimpleSearchHandler(true){
-			@Override
-			protected boolean match(ADQLObject obj){
-				return /*(obj instanceof ADQLList<?> && ((ADQLList<?>)obj).size() > 0) &&*/obj.getPosition() == null;
-			}
-		});
-		while(results.hasNext())
-			System.out.println("    * " + results.next().toADQL());
-	}
-
-}
-- 
GitLab