From a00e4c2a7452396da907c999944d92171ca85764 Mon Sep 17 00:00:00 2001
From: gmantele <gmantele@ari.uni-heidelberg.de>
Date: Wed, 20 Apr 2016 14:30:29 +0200
Subject: [PATCH] [ADQL] Fix content of GROUP BY ; it must be only column names
 or aliases. Before this commit, unsigned integers were also allowed (as for
 ORDER BY).

---
 src/adql/parser/ADQLParser.java | 392 +++++++++++++++-----------------
 src/adql/parser/adqlGrammar.jj  |  11 +-
 2 files changed, 189 insertions(+), 214 deletions(-)

diff --git a/src/adql/parser/ADQLParser.java b/src/adql/parser/ADQLParser.java
index a56c08a..609111c 100644
--- a/src/adql/parser/ADQLParser.java
+++ b/src/adql/parser/ADQLParser.java
@@ -1088,31 +1088,11 @@ public class ADQLParser implements ADQLParserConstants {
 		trace_call("ColumnRef");
 		try{
 			IdentifierItem identifier = null;
-			Token ind = null;
-			switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
-				case DELIMITED_IDENTIFIER:
-				case REGULAR_IDENTIFIER:{
-					identifier = Identifier();
-					break;
-				}
-				case UNSIGNED_INTEGER:{
-					ind = jj_consume_token(UNSIGNED_INTEGER);
-					break;
-				}
-				default:
-					jj_la1[20] = jj_gen;
-					jj_consume_token(-1);
-					throw new ParseException();
-			}
+			identifier = Identifier();
 			try{
-				ColumnReference colRef = null;
-				if (identifier != null)
-					colRef = queryFactory.createColRef(identifier);
-				else
-					colRef = queryFactory.createColRef(Integer.parseInt(ind.image), new TextPosition(ind));
 				{
 					if ("" != null)
-						return colRef;
+						return queryFactory.createColRef(identifier);
 				}
 			}catch(Exception ex){
 				{
@@ -1142,7 +1122,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[21] = jj_gen;
+					jj_la1[20] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -1159,14 +1139,14 @@ public class ADQLParser implements ADQLParserConstants {
 							break;
 						}
 						default:
-							jj_la1[22] = jj_gen;
+							jj_la1[21] = jj_gen;
 							jj_consume_token(-1);
 							throw new ParseException();
 					}
 					break;
 				}
 				default:
-					jj_la1[23] = jj_gen;;
+					jj_la1[22] = jj_gen;;
 			}
 			try{
 				ADQLOrder order = null;
@@ -1216,13 +1196,13 @@ public class ADQLParser implements ADQLParserConstants {
 										break;
 									}
 									default:
-										jj_la1[24] = jj_gen;;
+										jj_la1[23] = jj_gen;;
 								}
 								alias = Identifier();
 								break;
 							}
 							default:
-								jj_la1[25] = jj_gen;;
+								jj_la1[24] = jj_gen;;
 						}
 						content = queryFactory.createTable(identifiers, alias);
 						if (alias == null)
@@ -1236,7 +1216,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[27] = jj_gen;
+						jj_la1[26] = jj_gen;
 						if (jj_2_2(2)){
 							subQuery = SubQueryExpression();
 							switch((jj_ntk == -1) ? jj_ntk_f() : jj_ntk){
@@ -1245,7 +1225,7 @@ public class ADQLParser implements ADQLParserConstants {
 									break;
 								}
 								default:
-									jj_la1[26] = jj_gen;;
+									jj_la1[25] = jj_gen;;
 							}
 							alias = Identifier();
 							content = queryFactory.createTable(subQuery, alias);
@@ -1271,7 +1251,7 @@ public class ADQLParser implements ADQLParserConstants {
 									break;
 								}
 								default:
-									jj_la1[28] = jj_gen;
+									jj_la1[27] = jj_gen;
 									jj_consume_token(-1);
 									throw new ParseException();
 							}
@@ -1330,7 +1310,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[29] = jj_gen;
+						jj_la1[28] = jj_gen;
 						break label_6;
 				}
 			}
@@ -1390,7 +1370,7 @@ public class ADQLParser implements ADQLParserConstants {
 												break;
 											}
 											default:
-												jj_la1[30] = jj_gen;
+												jj_la1[29] = jj_gen;
 												jj_consume_token(-1);
 												throw new ParseException();
 										}
@@ -1400,19 +1380,19 @@ public class ADQLParser implements ADQLParserConstants {
 												break;
 											}
 											default:
-												jj_la1[31] = jj_gen;;
+												jj_la1[30] = jj_gen;;
 										}
 										break;
 									}
 									default:
-										jj_la1[32] = jj_gen;
+										jj_la1[31] = jj_gen;
 										jj_consume_token(-1);
 										throw new ParseException();
 								}
 								break;
 							}
 							default:
-								jj_la1[33] = jj_gen;;
+								jj_la1[32] = jj_gen;;
 						}
 						jj_consume_token(JOIN);
 						rightTable = TableRef();
@@ -1459,7 +1439,7 @@ public class ADQLParser implements ADQLParserConstants {
 												break;
 											}
 											default:
-												jj_la1[34] = jj_gen;
+												jj_la1[33] = jj_gen;
 												jj_consume_token(-1);
 												throw new ParseException();
 										}
@@ -1469,19 +1449,19 @@ public class ADQLParser implements ADQLParserConstants {
 												break;
 											}
 											default:
-												jj_la1[35] = jj_gen;;
+												jj_la1[34] = jj_gen;;
 										}
 										break;
 									}
 									default:
-										jj_la1[36] = jj_gen;
+										jj_la1[35] = jj_gen;
 										jj_consume_token(-1);
 										throw new ParseException();
 								}
 								break;
 							}
 							default:
-								jj_la1[37] = jj_gen;;
+								jj_la1[36] = jj_gen;;
 						}
 						jj_consume_token(JOIN);
 						rightTable = TableRef();
@@ -1509,7 +1489,7 @@ public class ADQLParser implements ADQLParserConstants {
 											break;
 										}
 										default:
-											jj_la1[38] = jj_gen;
+											jj_la1[37] = jj_gen;
 											break label_7;
 									}
 									jj_consume_token(COMMA);
@@ -1526,14 +1506,14 @@ public class ADQLParser implements ADQLParserConstants {
 								break;
 							}
 							default:
-								jj_la1[39] = jj_gen;
+								jj_la1[38] = jj_gen;
 								jj_consume_token(-1);
 								throw new ParseException();
 						}
 						break;
 					}
 					default:
-						jj_la1[40] = jj_gen;
+						jj_la1[39] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -1569,7 +1549,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[41] = jj_gen;
+						jj_la1[40] = jj_gen;
 						break label_8;
 				}
 			}
@@ -1614,7 +1594,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[42] = jj_gen;
+					jj_la1[41] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -1652,7 +1632,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[43] = jj_gen;
+					jj_la1[42] = jj_gen;
 					jj_consume_token(-1);
 					throw new ParseException();
 			}
@@ -1693,14 +1673,14 @@ public class ADQLParser implements ADQLParserConstants {
 							break;
 						}
 						default:
-							jj_la1[44] = jj_gen;
+							jj_la1[43] = jj_gen;
 							jj_consume_token(-1);
 							throw new ParseException();
 					}
 					break;
 				}
 				default:
-					jj_la1[45] = jj_gen;;
+					jj_la1[44] = jj_gen;;
 			}
 			number = jj_consume_token(UNSIGNED_INTEGER);
 			try{
@@ -1784,7 +1764,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[46] = jj_gen;
+						jj_la1[45] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -1841,7 +1821,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[47] = jj_gen;
+						jj_la1[46] = jj_gen;
 						jj_consume_token(-1);
 						throw new ParseException();
 				}
@@ -1887,7 +1867,7 @@ public class ADQLParser implements ADQLParserConstants {
 							break;
 						}
 						default:
-							jj_la1[48] = jj_gen;
+							jj_la1[47] = jj_gen;
 							if (jj_2_8(2147483647)){
 								valueExpr = Column();
 							}else if (jj_2_9(2147483647)){
@@ -1940,7 +1920,7 @@ public class ADQLParser implements ADQLParserConstants {
 										break;
 									}
 									default:
-										jj_la1[49] = jj_gen;
+										jj_la1[48] = jj_gen;
 										jj_consume_token(-1);
 										throw new ParseException();
 								}
@@ -1982,7 +1962,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();
 					}
@@ -1990,7 +1970,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[51] = jj_gen;;
+					jj_la1[50] = jj_gen;;
 			}
 			if (sign == null){
 				if ("" != null)
@@ -2035,7 +2015,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();
 					}
@@ -2043,7 +2023,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[53] = jj_gen;;
+					jj_la1[52] = jj_gen;;
 			}
 			if (sign == null){
 				if ("" != null)
@@ -2089,14 +2069,14 @@ 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)){
 				op = NumericFunction();
@@ -2117,7 +2097,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();
 				}
@@ -2162,7 +2142,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);
@@ -2205,7 +2185,7 @@ public class ADQLParser implements ADQLParserConstants {
 					break;
 				}
 				default:
-					jj_la1[58] = jj_gen;
+					jj_la1[57] = jj_gen;
 					if (jj_2_11(2)){
 						op = UserDefinedFunction();
 						((UserDefinedFunction)op).setExpectedType('S');
@@ -2219,7 +2199,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();
 						}
@@ -2256,7 +2236,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();
 			}
@@ -2293,7 +2273,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[61] = jj_gen;;
+						jj_la1[60] = jj_gen;;
 				}
 				constraint = Constraint();
 				if (notOp){
@@ -2315,7 +2295,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){
@@ -2328,7 +2308,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();
 					}
@@ -2339,7 +2319,7 @@ public class ADQLParser implements ADQLParserConstants {
 							break;
 						}
 						default:
-							jj_la1[64] = jj_gen;;
+							jj_la1[63] = jj_gen;;
 					}
 					constraint = Constraint();
 					if (notOp){
@@ -2400,7 +2380,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();
 				}
@@ -2438,7 +2418,7 @@ public class ADQLParser implements ADQLParserConstants {
 						break;
 					}
 					default:
-						jj_la1[70] = jj_gen;
+						jj_la1[69] = jj_gen;
 						if (jj_2_14(2147483647)){
 							column = Column();
 							jj_consume_token(IS);
@@ -2448,7 +2428,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);
@@ -2465,7 +2445,7 @@ public class ADQLParser implements ADQLParserConstants {
 									break;
 								}
 								default:
-									jj_la1[67] = jj_gen;;
+									jj_la1[66] = jj_gen;;
 							}
 							jj_consume_token(LIKE);
 							strExpr2 = StringExpression();
@@ -2539,7 +2519,7 @@ public class ADQLParser implements ADQLParserConstants {
 											break;
 										}
 										default:
-											jj_la1[68] = jj_gen;
+											jj_la1[67] = jj_gen;
 											if (jj_2_13(2)){
 												constraint = BetweenEnd(op);
 											}else{
@@ -2550,7 +2530,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();
 												}
@@ -2559,7 +2539,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();
 							}
@@ -2612,7 +2592,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();
 			}
@@ -2647,7 +2627,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();
@@ -2687,7 +2667,7 @@ 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)){
@@ -2705,7 +2685,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);
@@ -2716,7 +2696,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();
 				}
@@ -2771,7 +2751,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:{
@@ -2832,7 +2812,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();
 						}
@@ -2863,7 +2843,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();
 						}
@@ -2874,7 +2854,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);
@@ -2883,7 +2863,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();
 				}
@@ -2946,7 +2926,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();
 						}
@@ -2986,7 +2966,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();
 						}
@@ -3010,7 +2990,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();
 						}
@@ -3031,7 +3011,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();
 						}
@@ -3053,7 +3033,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();
 						}
@@ -3068,7 +3048,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();
 				}
@@ -3179,7 +3159,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);
@@ -3200,7 +3180,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();
 				}
@@ -3333,7 +3313,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();
 			}
@@ -3485,7 +3465,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;
@@ -3501,7 +3481,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;
@@ -3524,13 +3504,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();
 				}
@@ -3617,7 +3597,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();
 			}
@@ -3708,7 +3688,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);
@@ -3718,7 +3698,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 !");
@@ -3946,8 +3926,43 @@ public class ADQLParser implements ADQLParserConstants {
 		}
 	}
 
-	private boolean jj_3R_104(){
-		if (jj_scan_token(FULL))
+	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;
+	}
+
+	private boolean jj_3R_116(){
+		if (jj_3R_22())
 			return true;
 		return false;
 	}
@@ -3958,12 +3973,32 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
+	private boolean jj_3R_151(){
+		if (jj_3R_21())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3R_104(){
+		if (jj_scan_token(FULL))
+			return true;
+		return false;
+	}
+
 	private boolean jj_3R_146(){
 		if (jj_3R_137())
 			return true;
 		return false;
 	}
 
+	private boolean jj_3R_16(){
+		if (jj_scan_token(LEFT_PAR))
+			return true;
+		if (jj_3R_31())
+			return true;
+		return false;
+	}
+
 	private boolean jj_3R_101(){
 		Token xsp;
 		xsp = jj_scanpos;
@@ -4041,14 +4076,6 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_16(){
-		if (jj_scan_token(LEFT_PAR))
-			return true;
-		if (jj_3R_31())
-			return true;
-		return false;
-	}
-
 	private boolean jj_3R_111(){
 		if (jj_3R_21())
 			return true;
@@ -4167,6 +4194,12 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
+	private boolean jj_3R_31(){
+		if (jj_3R_44())
+			return true;
+		return false;
+	}
+
 	private boolean jj_3R_103(){
 		if (jj_scan_token(RIGHT))
 			return true;
@@ -4184,12 +4217,6 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_31(){
-		if (jj_3R_44())
-			return true;
-		return false;
-	}
-
 	private boolean jj_3R_95(){
 		Token xsp;
 		xsp = jj_scanpos;
@@ -4569,6 +4596,12 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
+	private boolean jj_3R_21(){
+		if (jj_3R_36())
+			return true;
+		return false;
+	}
+
 	private boolean jj_3R_115(){
 		if (jj_3R_42())
 			return true;
@@ -4583,12 +4616,6 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_21(){
-		if (jj_3R_36())
-			return true;
-		return false;
-	}
-
 	private boolean jj_3R_143(){
 		if (jj_scan_token(COMMA))
 			return true;
@@ -4644,12 +4671,6 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3R_132(){
-		if (jj_3R_101())
-			return true;
-		return false;
-	}
-
 	private boolean jj_3R_29(){
 		if (jj_scan_token(DELIMITED_IDENTIFIER))
 			return true;
@@ -4662,6 +4683,12 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
+	private boolean jj_3R_132(){
+		if (jj_3R_101())
+			return true;
+		return false;
+	}
+
 	private boolean jj_3R_24(){
 		if (jj_scan_token(REGULAR_IDENTIFIER))
 			return true;
@@ -5169,6 +5196,14 @@ public class ADQLParser implements ADQLParserConstants {
 		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_38(){
 		if (jj_3R_53())
 			return true;
@@ -5192,14 +5227,6 @@ public class ADQLParser implements ADQLParserConstants {
 		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_3_10(){
 		if (jj_3R_23())
 			return true;
@@ -5366,18 +5393,6 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
-	private boolean jj_3_9(){
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3_8(){
-		if (jj_3R_21())
-			return true;
-		return false;
-	}
-
 	private boolean jj_3_1(){
 		if (jj_3R_14())
 			return true;
@@ -5392,6 +5407,18 @@ public class ADQLParser implements ADQLParserConstants {
 		return false;
 	}
 
+	private boolean jj_3_9(){
+		if (jj_3R_22())
+			return true;
+		return false;
+	}
+
+	private boolean jj_3_8(){
+		if (jj_3R_21())
+			return true;
+		return false;
+	}
+
 	private boolean jj_3_7(){
 		if (jj_scan_token(REGULAR_IDENTIFIER))
 			return true;
@@ -5605,53 +5632,6 @@ public class ADQLParser implements ADQLParserConstants {
 		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;
-	}
-
-	private boolean jj_3R_116(){
-		if (jj_3R_22())
-			return true;
-		return false;
-	}
-
-	private boolean jj_3R_151(){
-		if (jj_3R_21())
-			return true;
-		return false;
-	}
-
 	/** Generated Token Manager. */
 	public ADQLParserTokenManager token_source;
 	SimpleCharStream jj_input_stream;
@@ -5663,7 +5643,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;
@@ -5676,19 +5656,19 @@ public class ADQLParser implements ADQLParserConstants {
 	}
 
 	private static void jj_la1_init_0(){
-		jj_la1_0 = new int[]{0x41,0x0,0x0,0x0,0x0,0x80000,0x100000,0x20,0x0,0x0,0x400000,0x400,0x304,0x20,0x20,0x20,0x0,0x10,0x10,0x10,0x0,0x0,0x0,0x0,0x400000,0x400000,0x400000,0x0,0x4,0x3d800000,0x1c000000,0x2000000,0x1d000000,0x1d000000,0x1c000000,0x2000000,0x1d000000,0x1d000000,0x20,0xc0000000,0x3d800000,0x0,0x0,0x0,0x300,0x300,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,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,};
 	}
 
 	private static void jj_la1_init_1(){
-		jj_la1_1 = new int[]{0x0,0x1,0x400,0x800,0x1000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6000,0x6000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf8000,0x0,0x3f00000,0x7c0f8000,0x0,0x0,0x0,0x0,0x0,0x0,0xf8000,0x0,0x80000000,0x0,0x3f00000,0x8,0x6,0x6,0x8,0x0,0x8,0x8,0x0,0x108,0x200,0xffff8000,0x0,0x8,0x8,0x0,0x0,0x0,0xffff8000,0x78000,0x0,0xf8000,0xc000000,0x800000,0x800000,0x800000,0x800000,0x7c000000,0x0,0x3f00000,0x7c000000,0x7c0f8000,0x0,0x0,0x0,0x0,0x0,0xffff8000,};
+		jj_la1_1 = new int[]{0x0,0x1,0x400,0x800,0x1000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6000,0x6000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf8000,0x0,0x3f00000,0x7c0f8000,0x0,0x0,0x0,0x0,0x0,0x0,0xf8000,0x0,0x80000000,0x0,0x3f00000,0x8,0x6,0x6,0x8,0x0,0x8,0x8,0x0,0x108,0x200,0xffff8000,0x0,0x8,0x8,0x0,0x0,0x0,0xffff8000,0x78000,0x0,0xf8000,0xc000000,0x800000,0x800000,0x800000,0x800000,0x7c000000,0x0,0x3f00000,0x7c000000,0x7c0f8000,0x0,0x0,0x0,0x0,0x0,0xffff8000,};
 	}
 
 	private static void jj_la1_init_2(){
-		jj_la1_2 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0xffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xffffff,0xffffff,0x0,0x0,0xfffe,0xff0000,0x0,0x20ffffff,};
+		jj_la1_2 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0xffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x20ffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xffffff,0xffffff,0x0,0x0,0xfffe,0xff0000,0x0,0x20ffffff,};
 	}
 
 	private static void jj_la1_init_3(){
-		jj_la1_3 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x3,0x0,0x0,0x3b,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x23,0x23,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x30,0x0,0x0,0x3b,0x3,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x3,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x3,0x3,0x3,0x3,0x0,0x0,0x0,0x2,0x3b,0x0,0x0,0x0,0x0,0x0,0x3b,};
+		jj_la1_3 = new int[]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x3,0x0,0x0,0x3b,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x30,0x0,0x0,0x3b,0x3,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x3,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x3,0x3,0x3,0x3,0x0,0x0,0x0,0x2,0x3b,0x0,0x0,0x0,0x0,0x0,0x3b,};
 	}
 
 	final private JJCalls[] jj_2_rtns = new JJCalls[16];
@@ -5711,7 +5691,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();
@@ -5733,7 +5713,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();
@@ -5746,7 +5726,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();
@@ -5759,7 +5739,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();
@@ -5771,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();
@@ -5783,7 +5763,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();
@@ -5922,7 +5902,7 @@ public class ADQLParser implements ADQLParserConstants {
 			la1tokens[jj_kind] = true;
 			jj_kind = -1;
 		}
-		for(int i = 0; i < 98; i++){
+		for(int i = 0; i < 97; i++){
 			if (jj_la1[i] == jj_gen){
 				for(int j = 0; j < 32; j++){
 					if ((jj_la1_0[i] & (1 << j)) != 0){
diff --git a/src/adql/parser/adqlGrammar.jj b/src/adql/parser/adqlGrammar.jj
index f2936cd..68a9ada 100644
--- a/src/adql/parser/adqlGrammar.jj
+++ b/src/adql/parser/adqlGrammar.jj
@@ -918,16 +918,11 @@ ADQLColumn Column(): {IdentifierItems identifiers;} {
 	}
 }
 
-ColumnReference ColumnRef(): {IdentifierItem identifier = null; Token ind = null;}{
-	( identifier=Identifier() | ind=<UNSIGNED_INTEGER> )
+ColumnReference ColumnRef(): {IdentifierItem identifier = null;}{
+	identifier=Identifier()
 	{
 		try{
-			ColumnReference colRef = null;
-			if (identifier != null)
-				colRef = queryFactory.createColRef(identifier);
-			else
-				colRef = queryFactory.createColRef(Integer.parseInt(ind.image), new TextPosition(ind));
-			return colRef;
+			return queryFactory.createColRef(identifier);
 		}catch(Exception ex){
 			throw generateParseException(ex);
 		}
-- 
GitLab