blob: 6be36443fccc4fd5751fe74ec6c0fffa3c3dc753 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.drill.exec.planner.sql;
import static org.junit.Assert.assertEquals;
import org.apache.calcite.avatica.util.Quoting;
import org.apache.calcite.sql.parser.SqlParserPos;
import org.apache.drill.categories.SqlTest;
import org.apache.drill.exec.planner.physical.PlannerSettings;
import org.apache.drill.exec.planner.sql.parser.impl.DrillSqlParseException;
import org.apache.drill.test.BaseTestQuery;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@Category(SqlTest.class)
public class TestDrillSQLWorker extends BaseTestQuery {
private void validateFormattedIs(String sql, SqlParserPos pos, String expected) {
DrillSqlParseException ex = new DrillSqlParseException(sql, pos);
String formatted = ex.getSqlWithErrorPointer();
assertEquals(expected, formatted);
}
@Test
public void testErrorFormatting() {
String sql = "Select * from Foo\n"
+ "where tadadidada;\n";
validateFormattedIs(sql, new SqlParserPos(1, 2),
"SQL Query: Select * from Foo\n"
+ " ^\n"
+ "where tadadidada;");
validateFormattedIs(sql, new SqlParserPos(2, 2),
"SQL Query: Select * from Foo\n"
+ "where tadadidada;\n"
+ " ^" );
validateFormattedIs(sql, new SqlParserPos(1, 10),
"SQL Query: Select * from Foo\n"
+ " ^\n"
+ "where tadadidada;");
validateFormattedIs(sql, new SqlParserPos(-11, -10), "SQL Query: Select * from Foo\nwhere tadadidada;");
validateFormattedIs(sql, new SqlParserPos(0, 10), "SQL Query: Select * from Foo\nwhere tadadidada;");
validateFormattedIs(sql, new SqlParserPos(100, 10), "SQL Query: Select * from Foo\nwhere tadadidada;");
}
@Test
public void testDoubleQuotesForQuotingIdentifiers() throws Exception {
try {
test("ALTER SESSION SET `%s` = '%s'", PlannerSettings.QUOTING_IDENTIFIERS_KEY,
Quoting.DOUBLE_QUOTE.string);
testBuilder()
.sqlQuery("select \"employee_id\", \"full_name\" from cp.\"employee.json\" limit 1")
.ordered()
.baselineColumns("employee_id", "full_name")
.baselineValues(1L, "Sheri Nowmer")
.go();
// Other quoting characters are not acceptable while particular one is chosen,
// since calcite doesn't support parsing sql statements with several quoting identifiers characters
errorMsgTestHelper("select `employee_id`, `full_name` from cp.`employee.json` limit 1", "Encountered: \"`\"");
// Mix of different quotes in the one SQL statement is not acceptable
errorMsgTestHelper("select \"employee_id\", \"full_name\" from cp.`employee.json` limit 1", "Encountered: \"`\"");
} finally {
// Note: can't use the resetSessionOption(), it assumes
// default back-ticks which are not in effect here.
test("ALTER SESSION RESET %s", PlannerSettings.QUOTING_IDENTIFIERS_KEY);
}
}
@Test
public void testBracketsForQuotingIdentifiers() throws Exception {
try {
test("ALTER SESSION SET `%s` = '%s'", PlannerSettings.QUOTING_IDENTIFIERS_KEY,
Quoting.BRACKET.string);
testBuilder()
.sqlQuery("select [employee_id], [full_name] from cp.[employee.json] limit 1")
.ordered()
.baselineColumns("employee_id", "full_name")
.baselineValues(1L, "Sheri Nowmer")
.go();
} finally {
// Note: can't use the resetSessionOption(), it assumes
// default back-ticks which are not in effect here.
test("ALTER SESSION RESET %s", PlannerSettings.QUOTING_IDENTIFIERS_KEY);
}
}
}