import { CTEQuery } from "../models/Clause";
import { SqlComponent } from "../models/SqlComponent";
/**
 * Source span for a named query definition when parser position metadata is available.
 *
 * @remarks The current extractor does not synthesize ranges. `range` and `nameRange`
 * are returned as `null` until AST nodes expose reliable definition spans.
 */
export interface NamedQueryDefinitionSourceRange {
    start: number;
    end: number;
}
/**
 * DTO-style representation of a named query definition from a SQL AST.
 */
export interface NamedQueryDefinition {
    /** The stable definition name, such as a CTE alias. */
    name: string;
    /** The AST query node that defines the named query. */
    query: CTEQuery;
    /** Whether the definition belongs to a `WITH RECURSIVE` clause, when that context is available. */
    recursive?: boolean;
    /** Full definition source range when available. Currently `null`. */
    range: NamedQueryDefinitionSourceRange | null;
    /** Definition-name source range when available. Currently `null`. */
    nameRange: NamedQueryDefinitionSourceRange | null;
}
/**
 * Extracts named query definitions, starting with CTE definitions from `WITH` clauses.
 *
 * @remarks Definitions are emitted in SQL source order. For nested CTEs, the outer
 * CTE definition is emitted when its name is encountered, then definitions inside
 * that CTE body are emitted before later sibling CTE definitions.
 */
export declare class NamedQueryDefinitionExtractor {
    private readonly definitions;
    private readonly visited;
    /**
     * Extract named query definitions from an AST component.
     */
    static extract(input: SqlComponent | null | undefined): NamedQueryDefinition[];
    private visit;
    private visitSelectQuery;
    private visitSimpleSelectQuery;
    private visitInsertQuery;
    private visitUpdateQuery;
    private visitDeleteQuery;
    private visitMergeQuery;
    private visitWithClause;
    private visitCommonTable;
    private visitKnownSqlComponent;
    private visitKnownValueComponent;
}
