fail("The ADQL query is strictly correct! No error should have occured. (see stdout for more details)");
}
}
@Test
publicvoidtestJoinTree(){
publicvoidtestJoinTree(){
ADQLParserparser=newADQLParser();
try{
try{
String[]queries=newString[]{"SELECT * FROM aTable A JOIN aSecondTable B ON A.id = B.id JOIN aThirdTable C ON B.id = C.id;","SELECT * FROM aTable A NATURAL JOIN aSecondTable B NATURAL JOIN aThirdTable C;"};
for(Stringq:queries){
for(Stringq:queries){
ADQLQueryquery=parser.parseQuery(q);
assertTrue(query.getFrom()instanceofADQLJoin);
...
...
@@ -134,68 +134,68 @@ public class TestADQLParser {
fail("String litteral concatenation is perfectly legal according to the ADQL standard.");
}
// With a comment ending the query
try{
try{
ADQLQueryquery=parser.parseQuery("SELECT TOP 1 * FROM ivoa.ObsCore -- comment");
assertNotNull(query);
}catch(Exceptionex){
}catch(Exceptionex){
ex.printStackTrace();
fail("String litteral concatenation is perfectly legal according to the ADQL standard.");
}
}
@Test
publicvoidtestIncorrectCharacter(){
publicvoidtestIncorrectCharacter(){
/* An identifier must be written only with digits, an underscore or
* regular latin characters: */
try{
try{
(newADQLParser()).parseQuery("select gr\u00e9gory FROM aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().startsWith("Incorrect character encountered at l.1, c.10: "));
assertTrue(t.getMessage().endsWith("Possible cause: a non-ASCI/UTF-8 character (solution: remove/replace it)."));
}
/* Un-finished double/single quoted string: */
try{
try{
(newADQLParser()).parseQuery("select \"stuff FROM aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().startsWith("Incorrect character encountered at l.1, c.26: <EOF>"));
assertTrue(t.getMessage().endsWith("Possible cause: a string between single or double quotes which is never closed (solution: well...just close it!)."));
}
// But in a string, delimited identifier or a comment, it is fine:
try{
try{
(newADQLParser()).parseQuery("select 'gr\u00e9gory' FROM aTable");
(newADQLParser()).parseQuery("select \"gr\u00e9gory\" FROM aTable");
(newADQLParser()).parseQuery("select * FROM aTable -- a comment by Gr\u00e9gory");
}catch(Throwablet){
}catch(Throwablet){
fail("This error should never occurs because all these queries have an accentuated character but at a correct place.");
}
}
@Test
publicvoidtestMultipleSpacesInOrderAndGroupBy(){
try{
publicvoidtestMultipleSpacesInOrderAndGroupBy(){
try{
ADQLParserparser=newADQLParser();
// Single space:
...
...
@@ -214,14 +214,14 @@ public class TestADQLParser {
parser.parseQuery("select * from aTable GROUP\tBY aCol");
parser.parseQuery("select * from aTable GROUP\nBY aCol");
parser.parseQuery("select * from aTable GROUP \t\nBY aCol");
}catch(Throwablet){
}catch(Throwablet){
t.printStackTrace();
fail("Having multiple space characters between the ORDER/GROUP and the BY keywords should not generate any parsing error.");
}
}
@Test
publicvoidtestADQLReservedWord(){
publicvoidtestADQLReservedWord(){
ADQLParserparser=newADQLParser();
finalStringhintAbs="\n(HINT: \"abs\" is a reserved ADQL word. To use it as a column/table/schema name/alias, write it between double quotes.)";
...
...
@@ -231,113 +231,113 @@ public class TestADQLParser {
/* TEST AS A COLUMN/TABLE/SCHEMA NAME... */
// ...with a numeric function name (but no param):
try{
try{
parser.parseQuery("select abs from aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith(hintAbs));
}
// ...with a geometric function name (but no param):
try{
try{
parser.parseQuery("select point from aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith(hintPoint));
}
// ...with an ADQL function name (but no param):
try{
try{
parser.parseQuery("select exists from aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith(hintExists));
}
// ...with an ADQL syntax item:
try{
try{
parser.parseQuery("select LIKE from aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith(hintLike));
}
/* TEST AS AN ALIAS... */
// ...with a numeric function name (but no param):
try{
try{
parser.parseQuery("select aCol AS abs from aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith(hintAbs));
}
// ...with a geometric function name (but no param):
try{
try{
parser.parseQuery("select aCol AS point from aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith(hintPoint));
}
// ...with an ADQL function name (but no param):
try{
try{
parser.parseQuery("select aCol AS exists from aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith(hintExists));
}
// ...with an ADQL syntax item:
try{
try{
parser.parseQuery("select aCol AS LIKE from aTable");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith(hintLike));
}
/* TEST AT THE END OF THE QUERY (AND IN A WHERE) */
try{
try{
parser.parseQuery("select aCol from aTable WHERE toto = abs");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith(hintAbs));
}
}
@Test
publicvoidtestSQLReservedWord(){
publicvoidtestSQLReservedWord(){
ADQLParserparser=newADQLParser();
try{
try{
parser.parseQuery("SELECT rows FROM aTable");
fail("\"ROWS\" is an SQL reserved word. This query should not pass.");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith("\n(HINT: \"rows\" is not supported in ADQL, but is however a reserved word. To use it as a column/table/schema name/alias, write it between double quotes.)"));
}
try{
try{
parser.parseQuery("SELECT CASE WHEN aCol = 2 THEN 'two' ELSE 'smth else' END as str FROM aTable");
fail("ADQL does not support the CASE syntax. This query should not pass.");
}catch(Throwablet){
}catch(Throwablet){
assertEquals(ParseException.class,t.getClass());
assertTrue(t.getMessage().endsWith("\n(HINT: \"CASE\" is not supported in ADQL, but is however a reserved word. To use it as a column/table/schema name/alias, write it between double quotes.)"));
}
}
@Test
publicvoidtestUDFName(){
publicvoidtestUDFName(){
ADQLParserparser=newADQLParser();
// CASE: Valid UDF name => OK
try{
try{
parser.parseQuery("SELECT foo(p1,p2) FROM aTable");
}catch(Throwablet){
}catch(Throwablet){
t.printStackTrace();
fail("Unexpected parsing error! This query should have passed. (see console for more details)");