type SyntaxNode = StatementNode | SelectSourceNode | TableNode | ColumnNode | ColumnOrderNode | FunctionNode | JoinNode | ConditionNode | WildcardNode | IdentifierNode | LiteralNode | InputNode | OffsetNode | LimitNode | InsertStatementNode | ValuesNode | AssignmentNode | NewIdNode; type StatementNode = SelectStatementNode | InsertStatementNode | UpdateStatementNode; type SelectStatementNode = { kind: "select"; select: SelectSourceNode[]; from: TableNode; joins: JoinNode[] | null; where: ConditionNode | null; groupBy: ColumnNode[] | null; orderBy: ColumnOrderNode[] | null; offset: OffsetNode | null; limit: LimitNode | null; }; type SelectSourceNode = { kind: "select-source"; source: ColumnNode | WildcardNode | FunctionNode; alias: IdentifierNode | null; }; type TableNode = { kind: "table"; db: IdentifierNode; table: IdentifierNode; alias: IdentifierNode | null; }; type ColumnNode = { kind: "column"; name: IdentifierNode; alias: IdentifierNode | null; }; type ColumnOrderNode = { kind: "order"; column: ColumnNode; direction: "asc" | "desc"; }; type FunctionNode = CountFunctionNode; type CountFunctionNode = { kind: "function"; name: "count"; args: [ColumnNode | WildcardNode]; }; type JoinNode = { kind: "join"; type: "inner" | "left outer" | "right outer"; source: TableNode; condition: ConditionNode; }; type ConditionNode = EqualityConditionNode | LogicalConditionNode | GroupedConditionNode; type EqualityConditionNode = { kind: "condition"; left: ColumnNode; type: "equality" | "inequality"; right: ColumnNode | LiteralNode | InputNode; }; type LogicalConditionNode = { kind: "condition"; type: "and" | "or"; left: ConditionNode; right: ConditionNode; }; type GroupedConditionNode = { kind: "condition-group"; condition: ConditionNode; }; type InsertStatementNode = { kind: "insert"; target: TableNode; columns: ColumnNode[]; values: ValuesNode; output: ColumnNode[] | null; }; type ValuesNode = { kind: "values"; values: (LiteralNode | InputNode | NewIdNode)[]; }; type NewIdNode = { kind: "function"; name: "newid"; args: []; }; type WildcardNode = { kind: "literal"; type: "wildcard"; }; type IdentifierNode = { kind: "identifier"; name: string; }; type LiteralNode = NullLiteralNode | StringLiteralNode | NumberLiteralNode; type NullLiteralNode = { kind: "literal"; type: "null"; }; type StringLiteralNode = { kind: "literal"; type: "string"; value: string; }; type NumberLiteralNode = { kind: "literal"; type: "number"; value: number; }; type InputNode = { kind: "input"; identifier: string; }; type OffsetNode = { kind: "offset"; rows: NumberLiteralNode | InputNode; }; type LimitNode = { kind: "limit"; rows: NumberLiteralNode | InputNode; }; type UpdateStatementNode = { kind: "update"; target: TableNode; set: AssignmentNode[]; where: ConditionNode | null; output: ColumnNode[] | null; }; type AssignmentNode = { kind: "assignment"; column: ColumnNode; value: LiteralNode | InputNode; }; type Visitor = { enter?: (node: SyntaxNode, parent: SyntaxNode | null) => T | void; leave?: (node: SyntaxNode, parent: SyntaxNode | null) => void; }; declare function traverse(node: SyntaxNode, visitor: Visitor, parent?: SyntaxNode | null): void; declare const prettyPrint: (node: SyntaxNode) => string; declare const parseMSSQLStatement: (query: string) => StatementNode; export { type AssignmentNode, type ColumnNode, type ColumnOrderNode, type ConditionNode, type CountFunctionNode, type EqualityConditionNode, type FunctionNode, type GroupedConditionNode, type IdentifierNode, type InputNode, type InsertStatementNode, type JoinNode, type LimitNode, type LiteralNode, type LogicalConditionNode, type NewIdNode, type NullLiteralNode, type NumberLiteralNode, type OffsetNode, type SelectSourceNode, type SelectStatementNode, type StatementNode, type StringLiteralNode, type SyntaxNode, type TableNode, type UpdateStatementNode, type ValuesNode, type WildcardNode, parseMSSQLStatement, prettyPrint, traverse };