import { SelectQuery, SimpleSelectQuery } from "../models/SelectQuery";
import { SqlComponentFormatOptions } from "./SqlComponentFormatter";
export type PredicateReachabilityInput = string | SelectQuery | SimpleSelectQuery;
export interface PredicateReachabilityOptions extends SqlComponentFormatOptions {
    cloneInput?: boolean;
}
export interface PredicateReachabilityWarning {
    code: string;
    message: string;
    detail?: unknown;
}
export interface PredicateReachabilityError {
    code: string;
    message: string;
    detail?: unknown;
}
export type PredicateReachabilityMode = "rewrite_safe" | "debug_only";
export type PredicateReachabilityRelation = "origin" | "direct_output" | "join_equivalence";
export type PredicateReachabilityProbeKind = "count" | "sample";
export interface PredicateReachabilityScopeTarget {
    kind: "scope" | "cte" | "table" | "subquery" | "source";
    name: string;
}
export interface PredicateReachabilityTarget {
    scopeId: string;
    relation: PredicateReachabilityRelation;
    mode: PredicateReachabilityMode;
    predicateSql: string;
    targetPredicateSql?: string;
    via?: readonly string[];
}
export interface PredicateReachabilityBlocked {
    scopeId: string;
    relation: PredicateReachabilityRelation;
    code: string;
    reason: string;
    via?: readonly string[];
}
export interface PredicateReachabilityProbeTarget {
    scopeId: string;
    relation: PredicateReachabilityRelation;
    mode: PredicateReachabilityMode;
    predicateSql: string;
    targetPredicateSql?: string;
    target: PredicateReachabilityScopeTarget;
    probeKinds: readonly PredicateReachabilityProbeKind[];
    caution?: string;
}
export interface PredicateReachabilityPredicate {
    predicateSql: string;
    originScopeId: string;
    columnReferences: readonly string[];
    reaches: readonly PredicateReachabilityTarget[];
    blocked: readonly PredicateReachabilityBlocked[];
    probeTargets: readonly PredicateReachabilityProbeTarget[];
}
export interface PredicateReachabilitySafety {
    mode: "debug_only";
    sqlRewritten: false;
}
export interface PredicateReachabilityResult {
    ok: boolean;
    query: SelectQuery | null;
    predicates: readonly PredicateReachabilityPredicate[];
    warnings: readonly PredicateReachabilityWarning[];
    errors: readonly PredicateReachabilityError[];
    safety: PredicateReachabilitySafety;
}
export declare class PredicateReachabilityAnalyzer {
    analyze(input: PredicateReachabilityInput, options?: PredicateReachabilityOptions): PredicateReachabilityResult;
    private analyzeScope;
    private buildProbeTargets;
    private describeScopeTarget;
    private resolveDirectOutputReach;
    private resolveJoinEquivalenceReach;
    private collectJoinEqualities;
    private resolveSourceQuery;
    private resolveDirectOutputColumn;
    private collectSelectOutputs;
    private findCte;
    private resolveSourceBinding;
    private resolveSourceBindingFromList;
    private getSourceBindings;
    private scopeIdForBinding;
    private isInnerJoin;
    private isLeftJoinPreservedToNullableReach;
    private rebasePredicateToSourceQuery;
    private rebasePredicate;
    private collectOuterColumnReferences;
    private buildResult;
}
export declare const analyzePredicateReachability: (input: PredicateReachabilityInput, options?: PredicateReachabilityOptions) => PredicateReachabilityResult;
