/*
 * 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(null, pos, null, null, null);
    String formatted = SqlConverter.formatSQLParsingError(sql, ex);
    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);
    }
  }
}
