import type { SqlParserLike } from './parser.js';
/**
 * Thrown when a statement is not a single, read-only SELECT — i.e. it is an
 * INSERT/UPDATE/DELETE, DDL, a CALL, a multi-statement string, or it fails to
 * parse. The handler surfaces `.message` to the model so it can re-plan.
 */
export declare class SqlValidationError extends Error {
    constructor(message: string);
}
export interface SqlValidationResult {
    /** Every base table the statement references (CTEs, joins, subqueries walked). */
    tables: string[];
}
/**
 * Parses SQL (MySQL dialect) and asserts it is a single SELECT, returning the
 * set of tables it touches. Domain-agnostic: it knows nothing about which
 * tables a caller may read — that is the `TableAccessPolicy`'s job.
 *
 * The `node-sql-parser` `Parser` is injected (see {@link loadSqlParser}) so this file never imports the
 * optional peer at module load.
 */
export declare class SqlValidator {
    private readonly parser;
    constructor(parser: SqlParserLike);
    /**
     * Throws `SqlValidationError` unless `sql` is exactly one SELECT statement.
     * On success returns the distinct base table names referenced.
     */
    validate(sql: string): SqlValidationResult;
    /**
     * Distinct base table names a statement touches — walking CTEs, subqueries,
     * and joins. Backed by `node-sql-parser`'s `tableList`, which emits
     * `mode::db::table` strings; the table name is the last segment.
     */
    private extractReferencedTables;
}
//# sourceMappingURL=sql-validator.d.ts.map