import { QueryConfig } from "./config";
export interface SqlBuilder<T = any> {
    $type: symbol;
    values: T[];
    buildText(nextParamID: number): string;
}
/**
 * Generate the full SQL query.
 */
export declare function buildSql<T>(builder: SqlBuilder<T>): QueryConfig<T>;
/**
 * Merge the given SqlBuilders, concatenating the text values and parametrized
 * values.
 *
 * @example
 * const builder = joinSql([rawSqlBuilder("foo = "), paramSqlBuilder("bar")])
 * builder.buildFragment(1) ==> {
 *   text: "foo = $1",
 *   values: ["bar"]
 * }
 *
 * @example
 * const builder = joinSql(
 *   [rawSqlBuilder("foo"), paramSqlBuilder("bar")]
 *   " = "
 * )
 * builder.buildFragment(1) ==> {
 *   text: "foo = $1",
 *   values: ["bar"]
 * }
 */
export declare function joinSql<T>(builders: Array<SqlBuilder<T>>, delimiter?: string): SqlBuilder<T>;
/**
 * Convert the given value to a SqlBuilder if it's not already.
 */
export declare function toSqlBuilder<T>(value: SqlBuilder<T> | T): SqlBuilder<T>;
/**
 * A SqlBuilder that renders the given value directly.
 *
 * @example
 * rawSqlBuilder("hello").buildFragment(1) ==> {
 *   text: "hello",
 *   values: []
 * }
 */
export declare function rawSqlBuilder(value: string): SqlBuilder<string>;
/**
 * A SqlBuilder that marks the given value to be parametrized.
 *
 * @example
 * paramSqlBuilder("hello").buildFragment(1) ==> {
 *   text: "$1",
 *   values: ["hello"]
 * }
 */
export declare function paramSqlBuilder<T>(value: T): SqlBuilder<T>;
