content: /*
   * 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.calcite.sql.validate;
  
  import org.apache.calcite.sql.SqlIdentifier;
  import org.apache.calcite.sql.SqlNode;
  import org.apache.calcite.sql.parser.SqlParserPos;
  
  import org.checkerframework.checker.nullness.qual.Nullable;
  
  import java.util.List;
  
  /**
   * Extends {@link SqlValidator} to allow discovery of useful data such as fully
   * qualified names of SQL objects, alternative valid SQL objects that can be
   * used in the SQL statement (dubbed as hints).
   */
  public interface SqlValidatorWithHints extends SqlValidator {
    //~ Methods ----------------------------------------------------------------
  
    /**
     * Looks up completion hints for a syntactically correct SQL statement that
     * has been parsed into an expression tree. (Note this should be called
     * after {@link #validate(org.apache.calcite.sql.SqlNode)}.
     *
     * @param topNode top of expression tree in which to lookup completion hints
     * @param pos     indicates the position in the sql statement we want to get
     *                completion hints for. 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
     * @return an array of {@link SqlMoniker} (sql identifiers) that can fill in
     * at the indicated position
     */
    List<SqlMoniker> lookupHints(SqlNode topNode, SqlParserPos pos);
  
    /**
     * Looks up the fully qualified name for a {@link SqlIdentifier} at a given
     * Parser Position in a parsed expression tree Note: call this only after
     * {@link #validate} has been called.
     *
     * @param topNode top of expression tree in which to lookup the qualified
     *                name for the SqlIdentifier
     * @param pos indicates the position of the {@link SqlIdentifier} in
     *                the SQL statement we want to get the qualified
     *                name for
     * @return a string of the fully qualified name of the {@link SqlIdentifier}
     * if the Parser position represents a valid {@link SqlIdentifier}. Else
     * return null
     */
    @Nullable SqlMoniker lookupQualifiedName(SqlNode topNode, SqlParserPos pos);
  }
  