Class SqlAdvisor

java.lang.Object
org.apache.calcite.sql.advise.SqlAdvisor

public class SqlAdvisor extends Object
An assistant which offers hints and corrections to a partially-formed SQL statement. It is used in the SQL editor user-interface.
  • Field Details

    • LOGGER

      public static final org.slf4j.Logger LOGGER
  • Constructor Details

  • Method Details

    • getCompletionHints

      public List<SqlMoniker> getCompletionHints(String sql, int cursor, String[] replaced)
      Gets completion hints for a partially completed or syntactically incorrect sql statement with cursor pointing to the position where completion hints are requested.

      Writes into replaced[0] the string that is being replaced. Includes the cursor and the preceding identifier. For example, if sql is "select abc^de from t", sets replaced[0] to "abc". If the cursor is in the middle of whitespace, the replaced string is empty. The replaced string is never null.

      Parameters:
      sql - A partial or syntactically incorrect sql statement for which to retrieve completion hints
      cursor - to indicate the 0-based cursor position in the query at
      replaced - String which is being replaced (output)
      Returns:
      completion hints
    • getCompletionHints0

      public List<SqlMoniker> getCompletionHints0(String sql, int cursor)
    • getReplacement

      public String getReplacement(SqlMoniker hint, String word)
    • getReplacement

      public String getReplacement(SqlMoniker hint, boolean quoted, org.apache.calcite.avatica.util.Casing preferredCasing)
    • getCompletionHints

      public List<SqlMoniker> getCompletionHints(String sql, SqlParserPos pos)
      Gets completion hints for a syntactically correct SQL statement with dummy SqlIdentifier.
      Parameters:
      sql - A syntactically correct sql statement for which to retrieve completion hints
      pos - to indicate the line and column position in the query at which completion hints need to be retrieved. For example, "select a.ename, b.deptno from sales.emp a join sales.dept b "on a.deptno=b.deptno where empno=1"; setting pos to 'Line 1, Column 17' returns all the possible column names that can be selected from sales.dept table setting pos to 'Line 1, Column 31' returns all the possible table names in 'sales' schema
      Returns:
      an array of hints (SqlMoniker) that can fill in at the indicated position
    • getQualifiedName

      public @Nullable SqlMoniker getQualifiedName(String sql, int cursor)
      Gets the fully qualified name for a SqlIdentifier at a given position of a sql statement.
      Parameters:
      sql - A syntactically correct sql statement for which to retrieve a fully qualified SQL identifier name
      cursor - to indicate the 0-based cursor position in the query that represents a SQL identifier for which its fully qualified name is to be returned.
      Returns:
      a SqlMoniker that contains the fully qualified name of the specified SQL identifier, returns null if none is found or the SQL statement is invalid.
    • isValid

      public boolean isValid(String sql)
      Attempts to complete and validate a given partially completed sql statement, and returns whether it is valid.
      Parameters:
      sql - A partial or syntactically incorrect sql statement to validate
      Returns:
      whether SQL statement is valid
    • validate

      public @Nullable List<SqlAdvisor.ValidateErrorInfo> validate(String sql)
      Attempts to parse and validate a SQL statement. Throws the first exception encountered. The error message of this exception is to be displayed on the UI
      Parameters:
      sql - A user-input sql statement to be validated
      Returns:
      a List of ValidateErrorInfo (null if sql is valid)
    • simplifySql

      public String simplifySql(String sql, int cursor)
      Turns a partially completed or syntactically incorrect sql statement into a simplified, valid one that can be passed into getCompletionHints(String, SqlParserPos).
      Parameters:
      sql - A partial or syntactically incorrect SQL statement
      cursor - Indicates the position in the query at which completion hints need to be retrieved
      Returns:
      a completed, valid (and possibly simplified SQL statement
    • getReservedAndKeyWords

      @EnsuresNonNull({"reservedWordsSet","reservedWordsList"}) public List<String> getReservedAndKeyWords()
      Returns an array of SQL reserved and keywords.
      Returns:
      an of SQL reserved and keywords
    • getParserMetadata

      protected org.apache.calcite.sql.parser.SqlAbstractParserImpl.Metadata getParserMetadata()
      Returns the underlying Parser metadata.

      To use a different parser (recognizing a different dialect of SQL), derived class should override.

      Returns:
      metadata
    • parseQuery

      protected SqlNode parseQuery(String sql) throws SqlParseException
      Wrapper function to parse a SQL query (SELECT or VALUES, but not INSERT, UPDATE, DELETE, CREATE, DROP etc.), throwing a SqlParseException if the statement is not syntactically valid.
      Parameters:
      sql - SQL statement
      Returns:
      parse tree
      Throws:
      SqlParseException - if not syntactically valid
    • collectParserError

      protected @Nullable SqlNode collectParserError(String sql, List<SqlAdvisor.ValidateErrorInfo> errorList)
      Attempts to parse a SQL statement and adds to the errorList if any syntax error is found. This implementation uses SqlParser. Subclass can re-implement this with a different parser implementation
      Parameters:
      sql - A user-input sql statement to be parsed
      errorList - A List of error to be added to
      Returns:
      SqlNode that is root of the parse tree, null if the sql is not valid