/** * Tests that you can't quote the names of builtin functions. * * @see org.eigenbase.test.SqlValidatorTest#testQuotedFunction() */ @Test public void testQuotedFunction() { checkExpFails( "\"CAST\"(1 ^as^ double)", "(?s).*Encountered \"as\" at .*"); checkExpFails( "\"POSITION\"('b' ^in^ 'alphabet')", "(?s).*Encountered \"in \\\\'alphabet\\\\'\" at .*"); checkExpFails( "\"OVERLAY\"('a' ^PLAcing^ 'b' from 1)", "(?s).*Encountered \"PLAcing\" at.*"); checkExpFails( "\"SUBSTRING\"('a' ^from^ 1)", "(?s).*Encountered \"from\" at .*"); }
/** * Tests that you can't quote the names of builtin functions. * * @see org.eigenbase.test.SqlValidatorTest#testQuotedFunction() */ @Test public void testQuotedFunction() { checkExpFails( "\"CAST\"(1 ^as^ double)", "(?s).*Encountered \"as\" at .*"); checkExpFails( "\"POSITION\"('b' ^in^ 'alphabet')", "(?s).*Encountered \"in \\\\'alphabet\\\\'\" at .*"); checkExpFails( "\"OVERLAY\"('a' ^PLAcing^ 'b' from 1)", "(?s).*Encountered \"PLAcing\" at.*"); checkExpFails( "\"SUBSTRING\"('a' ^from^ 1)", "(?s).*Encountered \"from\" at .*"); }
@Test public void testIllegalUnicodeEscape() { checkExpFails( "U&'abc' UESCAPE '!!'", ".*must be exactly one character.*"); checkExpFails( "U&'abc' UESCAPE ''", ".*must be exactly one character.*"); checkExpFails( "U&'abc' UESCAPE '0'", ".*hex digit.*"); checkExpFails( "U&'abc' UESCAPE 'a'", ".*hex digit.*"); checkExpFails( "U&'abc' UESCAPE 'F'", ".*hex digit.*"); checkExpFails( "U&'abc' UESCAPE ' '", ".*whitespace.*"); checkExpFails( "U&'abc' UESCAPE '+'", ".*plus sign.*"); checkExpFails( "U&'abc' UESCAPE '\"'", ".*double quote.*"); checkExpFails( "'abc' UESCAPE ^'!'^", ".*without Unicode literal introducer.*"); checkExpFails( "^U&'\\0A'^",
@Test public void testOverlaps() { checkExp( "(x,xx) overlaps (y,yy)", "((`X`, `XX`) OVERLAPS (`Y`, `YY`))"); checkExp( "(x,xx) overlaps (y,yy) or false", "(((`X`, `XX`) OVERLAPS (`Y`, `YY`)) OR FALSE)"); checkExp( "true and not (x,xx) overlaps (y,yy) or false", "((TRUE AND (NOT ((`X`, `XX`) OVERLAPS (`Y`, `YY`)))) OR FALSE)"); checkExpFails( "^(x,xx,xxx) overlaps (y,yy)^ or false", "(?s).*Illegal overlaps expression.*"); checkExpFails( "true or ^(x,xx,xxx) overlaps (y,yy,yyy)^ or false", "(?s).*Illegal overlaps expression.*"); checkExpFails( "^(x,xx) overlaps (y,yy,yyy)^ or false", "(?s).*Illegal overlaps expression.*"); }
@Test public void testWindowReference() { checkExp("sum(sal) over (w)", "(SUM(`SAL`) OVER (`W`))"); // Only 1 window reference allowed checkExpFails( "sum(sal) over (w ^w1^ partition by deptno)", "(?s)Encountered \"w1\" at.*"); }
@Test public void testOverlaps() { checkExp( "(x,xx) overlaps (y,yy)", "((`X`, `XX`) OVERLAPS (`Y`, `YY`))"); checkExp( "(x,xx) overlaps (y,yy) or false", "(((`X`, `XX`) OVERLAPS (`Y`, `YY`)) OR FALSE)"); checkExp( "true and not (x,xx) overlaps (y,yy) or false", "((TRUE AND (NOT ((`X`, `XX`) OVERLAPS (`Y`, `YY`)))) OR FALSE)"); checkExpFails( "^(x,xx,xxx) overlaps (y,yy)^ or false", "(?s).*Illegal overlaps expression.*"); checkExpFails( "true or ^(x,xx,xxx) overlaps (y,yy,yyy)^ or false", "(?s).*Illegal overlaps expression.*"); checkExpFails( "^(x,xx) overlaps (y,yy,yyy)^ or false", "(?s).*Illegal overlaps expression.*"); }
@Test public void testNullIf() { checkExp( "nullif(v1,v2)", "NULLIF(`V1`, `V2`)"); checkExpFails( "1 ^+^ nullif + 3", "(?s)Encountered \"\\+ nullif \\+\" at line 1, column 3.*"); }
@Test public void testNullIf() { checkExp( "nullif(v1,v2)", "NULLIF(`V1`, `V2`)"); checkExpFails( "1 ^+^ nullif + 3", "(?s)Encountered \"\\+ nullif \\+\" at line 1, column 3.*"); }
@Test public void testWindowReference() { checkExp("sum(sal) over (w)", "(SUM(`SAL`) OVER (`W`))"); // Only 1 window reference allowed checkExpFails( "sum(sal) over (w ^w1^ partition by deptno)", "(?s)Encountered \"w1\" at.*"); }
@Test public void testMiscIntervalQualifier() { checkExp("interval '-' day", "INTERVAL '-' DAY"); checkExpFails( "interval '1 2:3:4.567' day to hour ^to^ second", "(?s)Encountered \"to\" at.*"); checkExpFails( "interval '1:2' minute to second(2^,^ 2)", "(?s)Encountered \",\" at.*"); checkExp( "interval '1:x' hour to minute", "INTERVAL '1:x' HOUR TO MINUTE"); checkExp( "interval '1:x:2' hour to second", "INTERVAL '1:x:2' HOUR TO SECOND"); }
@Test public void testIdentifier() { checkExp("ab", "`AB`"); checkExp(" \"a \"\" b!c\"", "`a \" b!c`"); checkExpFails(" ^`^a \" b!c`", "(?s).*Encountered.*"); checkExp("\"x`y`z\"", "`x``y``z`"); checkExpFails("^`^x`y`z`", "(?s).*Encountered.*"); checkExp("myMap[field] + myArray[1 + 2]", "(`MYMAP`[`FIELD`] + `MYARRAY`[(1 + 2)])"); }
@Test public void testDateMinusDate() { checkExp("(date1 - date2) HOUR", "((`DATE1` - `DATE2`) HOUR)"); checkExp( "(date1 - date2) YEAR TO MONTH", "((`DATE1` - `DATE2`) YEAR TO MONTH)"); checkExp( "(date1 - date2) HOUR > interval '1' HOUR", "(((`DATE1` - `DATE2`) HOUR) > INTERVAL '1' HOUR)"); checkExpFails( "^(date1 + date2) second^", "(?s).*Illegal expression. Was expecting ..DATETIME - DATETIME. INTERVALQUALIFIER.*"); checkExpFails( "^(date1,date2,date2) second^", "(?s).*Illegal expression. Was expecting ..DATETIME - DATETIME. INTERVALQUALIFIER.*"); }
@Test public void testMiscIntervalQualifier() { checkExp("interval '-' day", "INTERVAL '-' DAY"); checkExpFails( "interval '1 2:3:4.567' day to hour ^to^ second", "(?s)Encountered \"to\" at.*"); checkExpFails( "interval '1:2' minute to second(2^,^ 2)", "(?s)Encountered \",\" at.*"); checkExp( "interval '1:x' hour to minute", "INTERVAL '1:x' HOUR TO MINUTE"); checkExp( "interval '1:x:2' hour to second", "INTERVAL '1:x:2' HOUR TO SECOND"); }
@Test public void testDateMinusDate() { checkExp("(date1 - date2) HOUR", "((`DATE1` - `DATE2`) HOUR)"); checkExp( "(date1 - date2) YEAR TO MONTH", "((`DATE1` - `DATE2`) YEAR TO MONTH)"); checkExp( "(date1 - date2) HOUR > interval '1' HOUR", "(((`DATE1` - `DATE2`) HOUR) > INTERVAL '1' HOUR)"); checkExpFails( "^(date1 + date2) second^", "(?s).*Illegal expression. Was expecting ..DATETIME - DATETIME. INTERVALQUALIFIER.*"); checkExpFails( "^(date1,date2,date2) second^", "(?s).*Illegal expression. Was expecting ..DATETIME - DATETIME. INTERVALQUALIFIER.*"); }
@Test public void testBackTickIdentifier() { quoting = Quoting.BACK_TICK; checkExp("ab", "`AB`"); checkExp(" `a \" b!c`", "`a \" b!c`"); checkExpFails(" ^\"^a \"\" b!c\"", "(?s).*Encountered.*"); checkExpFails("^\"^x`y`z\"", "(?s).*Encountered.*"); checkExp("`x``y``z`", "`x``y``z`"); checkExp("myMap[field] + myArray[1 + 2]", "(`MYMAP`[`FIELD`] + `MYARRAY`[(1 + 2)])"); }
@Test public void testBracketIdentifier() { quoting = Quoting.BRACKET; checkExp("ab", "`AB`"); checkExp(" [a \" b!c]", "`a \" b!c`"); checkExpFails(" ^`^a \" b!c`", "(?s).*Encountered.*"); checkExpFails(" ^\"^a \"\" b!c\"", "(?s).*Encountered.*"); checkExp("[x`y`z]", "`x``y``z`"); checkExpFails("^\"^x`y`z\"", "(?s).*Encountered.*"); checkExpFails("^`^x``y``z`", "(?s).*Encountered.*"); checkExp("[anything [even brackets]] is].[ok]", "`anything [even brackets] is`.`ok`"); // What would be a call to the 'item' function in DOUBLE_QUOTE and BACK_TICK // is a table alias. check("select * from myMap[field], myArray[1 + 2]", "SELECT *\n" + "FROM `MYMAP` AS `field`,\n" + "`MYARRAY` AS `1 + 2`"); check("select * from myMap [field], myArray [1 + 2]", "SELECT *\n" + "FROM `MYMAP` AS `field`,\n" + "`MYARRAY` AS `1 + 2`"); }
@Test public void testExtract() { checkExp("extract(year from x)", "EXTRACT(YEAR FROM `X`)"); checkExp("extract(month from x)", "EXTRACT(MONTH FROM `X`)"); checkExp("extract(day from x)", "EXTRACT(DAY FROM `X`)"); checkExp("extract(hour from x)", "EXTRACT(HOUR FROM `X`)"); checkExp("extract(minute from x)", "EXTRACT(MINUTE FROM `X`)"); checkExp("extract(second from x)", "EXTRACT(SECOND FROM `X`)"); checkExpFails( "extract(day ^to^ second from x)", "(?s)Encountered \"to\".*"); }
@Test public void testExtract() { checkExp("extract(year from x)", "EXTRACT(YEAR FROM `X`)"); checkExp("extract(month from x)", "EXTRACT(MONTH FROM `X`)"); checkExp("extract(day from x)", "EXTRACT(DAY FROM `X`)"); checkExp("extract(hour from x)", "EXTRACT(HOUR FROM `X`)"); checkExp("extract(minute from x)", "EXTRACT(MINUTE FROM `X`)"); checkExp("extract(second from x)", "EXTRACT(SECOND FROM `X`)"); checkExpFails( "extract(day ^to^ second from x)", "(?s)Encountered \"to\".*"); }
@Test public void testIntervalOperators() { checkExp("-interval '1' day", "(- INTERVAL '1' DAY)"); checkExp( "interval '1' day + interval '1' day", "(INTERVAL '1' DAY + INTERVAL '1' DAY)"); checkExp( "interval '1' day - interval '1:2:3' hour to second", "(INTERVAL '1' DAY - INTERVAL '1:2:3' HOUR TO SECOND)"); checkExp("interval -'1' day", "INTERVAL -'1' DAY"); checkExp("interval '-1' day", "INTERVAL '-1' DAY"); checkExpFails( "interval 'wael was here^'^", "(?s)Encountered \"<EOF>\".*"); checkExp( "interval 'wael was here' HOUR", "INTERVAL 'wael was here' HOUR"); // ok in parser, not in validator }
@Test public void testIntervalOperators() { checkExp("-interval '1' day", "(- INTERVAL '1' DAY)"); checkExp( "interval '1' day + interval '1' day", "(INTERVAL '1' DAY + INTERVAL '1' DAY)"); checkExp( "interval '1' day - interval '1:2:3' hour to second", "(INTERVAL '1' DAY - INTERVAL '1:2:3' HOUR TO SECOND)"); checkExp("interval -'1' day", "INTERVAL -'1' DAY"); checkExp("interval '-1' day", "INTERVAL '-1' DAY"); checkExpFails( "interval 'wael was here^'^", "(?s)Encountered \"<EOF>\".*"); checkExp( "interval 'wael was here' HOUR", "INTERVAL 'wael was here' HOUR"); // ok in parser, not in validator }