public void checkExpFails(String sql, String expected) { SqlParserTest.this.checkExpFails( sql.replace("$op", op).replace("$p", period), expected.replace("$op", op)); } }
public void checkExpFails(String sql, String expected) { SqlParserTest.this.checkExpFails( sql.replace("$op", op).replace("$p", period), expected.replace("$op", op)); } }
@Test public void testBangEqualIsBad() { // Quoth www.ocelot.ca: // "Other relators besides '=' are what you'd expect if // you've used any programming language: > and >= and < and <=. The // only potential point of confusion is that the operator for 'not // equals' is <> as in BASIC. There are many texts which will tell // you that != is SQL's not-equals operator; those texts are false; // it's one of those unstampoutable urban myths." // Therefore, we only support != with certain SQL conformance levels. checkExpFails("'abc'!=123", "Bang equal '!=' is not allowed under the current SQL conformance level"); }
@Test public void testBangEqualIsBad() { // Quoth www.ocelot.ca: // "Other relators besides '=' are what you'd expect if // you've used any programming language: > and >= and < and <=. The // only potential point of confusion is that the operator for 'not // equals' is <> as in BASIC. There are many texts which will tell // you that != is SQL's not-equals operator; those texts are false; // it's one of those unstampoutable urban myths." // Therefore, we only support != with certain SQL conformance levels. checkExpFails("'abc'!=123", "Bang equal '!=' is not allowed under the current SQL conformance level"); }
@Test public void testFunctionNamedArgument() { checkExp("foo(x => 1)", "`FOO`(`X` => 1)"); checkExp("foo(x => 1, \"y\" => 'a', z => x <= y)", "`FOO`(`X` => 1, `y` => 'a', `Z` => (`X` <= `Y`))"); checkExpFails("foo(x.y ^=>^ 1)", "(?s).*Encountered \"=>\" at .*"); checkExpFails("foo(a => 1, x.y ^=>^ 2, c => 3)", "(?s).*Encountered \"=>\" at .*"); }
@Test public void testFunctionNamedArgument() { checkExp("foo(x => 1)", "`FOO`(`X` => 1)"); checkExp("foo(x => 1, \"y\" => 'a', z => x <= y)", "`FOO`(`X` => 1, `y` => 'a', `Z` => (`X` <= `Y`))"); checkExpFails("foo(x.y ^=>^ 1)", "(?s).*Encountered \"=>\" at .*"); checkExpFails("foo(a => 1, x.y ^=>^ 2, c => 3)", "(?s).*Encountered \"=>\" at .*"); }
@Test public void testNullIf() { checkExp( "nullif(v1,v2)", "(NULLIF(`V1`, `V2`))"); checkExpFails( "1 + ^nullif^ + 3", "(?s)Encountered \"nullif \\+\" at line 1, column 5.*"); }
@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 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 testGeometry() { checkExpFails("cast(null as geometry)", "Geo-spatial extensions and the GEOMETRY data type are not enabled"); conformance = SqlConformanceEnum.LENIENT; checkExp("cast(null as geometry)", "CAST(NULL AS GEOMETRY)"); }
@Test public void testGeometry() { checkExpFails("cast(null as geometry)", "Geo-spatial extensions and the GEOMETRY data type are not enabled"); conformance = SqlConformanceEnum.LENIENT; checkExp("cast(null as geometry)", "CAST(NULL AS GEOMETRY)"); }
@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 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 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 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 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 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 testNullIf() { checkExp( "nullif(v1,v2)", "(NULLIF(`V1`, `V2`))"); if (isReserved("NULLIF")) { checkExpFails( "1 + ^nullif^ + 3", "(?s)Encountered \"nullif \\+\" at line 1, column 5.*"); } }
@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 }