import { AstSymbol, SymbolTable } from "jsymbol";
import * as ast from "./astsql";
import { QueryContext, QueryVisitor, ContextBuilder } from "./queryVisitor";
export declare enum SymbolState {
    Resolved = 0,
    Unresolved = 1,
}
export declare class SqlAstSymbol implements AstSymbol<ast.SqlSymbolType> {
    identifier: string;
    type: ast.SqlSymbolType;
    state: SymbolState;
    parent?: SqlAstSymbol;
    constructor(identifier: string, type: ast.SqlSymbolType);
    toString(): string;
}
export declare class ValidationContext implements QueryContext {
    currentNode: ast.SqlAstNode;
    parentNode?: ast.SqlAstNode;
    symbolTable: SymbolTable<SqlAstSymbol>;
    collectedSymbols: SqlAstSymbol[];
    constructor(currentNode: ast.SqlAstNode);
}
export interface ValidationMethod<TNode extends ast.SqlAstNode = ast.SqlAstNode> {
    (context: ValidationContext, node: TNode): ValidationContext;
}
export declare class QueryValidator extends QueryVisitor<ValidationContext> {
    constructor(dialect: ast.SqlDialect, query: ast.SqlRoot, contextBuilder?: ContextBuilder);
    validate(): SqlAstSymbol[];
    protected visitSelectStatement: ValidationMethod<ast.SelectStatement>;
    protected visitQueryExpression: ValidationMethod<ast.QueryExpression>;
    protected visitTableSpec: ValidationMethod<ast.TableSpec>;
    protected visitAllColumns: ValidationMethod<ast.AllColumns>;
    protected visitColumnName: ValidationMethod<ast.ColumnName>;
    protected visitSimpleFunctionCall: ValidationMethod<ast.SimpleFunctionCall>;
    protected visitAssignedTerm: ValidationMethod<ast.AssignedTerm<ast.SqlAstNode>>;
    protected visitAssignedExpressionAtom: ValidationMethod<ast.AssignedExpressionAtom>;
    protected visitVariable: ValidationMethod<ast.Variable>;
    protected visitSelectIntoFieldsExpression: ValidationMethod<ast.SelectIntoFieldsExpression>;
    protected visitAliasedTerm: ValidationMethod<ast.AliasedTerm<ast.SqlAstNode>>;
    protected addResolvedSymbol(context: ValidationContext, name: string, type: ast.SqlSymbolType): SqlAstSymbol;
    protected lookupOrAddTable(context: ValidationContext, name: string): SqlAstSymbol;
    protected lookupOrAddSymbol(context: ValidationContext, name: string, type: ast.SqlSymbolType): SqlAstSymbol;
}
export declare class MySQLQueryValidator extends QueryValidator {
    constructor(query: ast.SqlRoot);
}
