UNPKG

knex

Version:

A batteries-included SQL query & schema builder for PostgresSQL, MySQL, CockroachDB, MSSQL and SQLite3

1,559 lines (1,429 loc) 106 kB
// Originally based on contributions to DefinitelyTyped: // Definitions by: Qubo <https://github.com/tkQubo> // Pablo Rodríguez <https://github.com/MeLlamoPablo> // Matt R. Wilson <https://github.com/mastermatt> // Satana Charuwichitratana <https://github.com/micksatana> // Shrey Jain <https://github.com/shreyjain1994> // TypeScript Version: 4.1 import type { EventEmitter } from 'events'; import type { Duplex, PassThrough, Stream } from 'stream'; import type { Pool } from 'tarn'; import type { ConnectionOptions } from 'tls'; import type { Registry } from './result'; import type { Tables } from './tables'; // # Generic type-level utilities // If T is object then make it a partial otherwise fallback to any // // This is primarily to prevent type incompatibilities where target can be unknown. // While unknown can be assigned to any, Partial<unknown> can't be. type SafePartial<T> = Partial<AnyOrUnknownToOther<T, {}>>; type MaybeArray<T> = T | T[]; type StrKey<T> = string & keyof T; // If T is unknown then convert to any, else retain original type UnknownToAny<T> = unknown extends T ? any : T; type CurlyCurlyToAny<T> = T extends unknown // distribute ? (<U>() => U extends T ? 0 : 1) extends <U>() => U extends {} ? 0 : 1 ? any : T : never; type UnknownOrCurlyCurlyToAny<T> = [UnknownToAny<T> | CurlyCurlyToAny<T>][0]; type AnyToUnknown<T> = unknown extends T ? unknown : T; type AnyOrUnknownToOther<T1, T2> = unknown extends T1 ? T2 : T1; // Intersection conditionally applied only when TParams is non-empty // This is primarily to keep the signatures more intuitive. type AugmentParams<TTarget, TParams> = TParams extends {} ? keyof TParams extends never ? TTarget : {} & TTarget & TParams : TTarget; // Check if provided keys (expressed as a single or union type) are members of TBase type AreKeysOf<TBase, TKeys> = Boxed<TKeys> extends Boxed<keyof TBase> ? true : false; // https://stackoverflow.com/a/50375286/476712 type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ( k: infer I ) => void ? I : never; type ComparisonOperator = '=' | '>' | '>=' | '<' | '<=' | '<>'; // If T is an array, get the type of member, else fall back to never type ArrayMember<T> = T extends (infer M)[] ? M : never; // If T is an array, get the type of member, else retain original type UnwrapArrayMember<T> = T extends (infer M)[] ? M : T; // Wrap a type in a container, making it an object type. // This is primarily useful in circumventing special handling of union/intersection in typescript interface Boxed<T> { _value: T; } // If T can't be assigned to TBase fallback to an alternate type TAlt type IncompatibleToAlt<T, TBase, TAlt> = T extends TBase ? T : TAlt; type ArrayIfAlready<T1, T2> = AnyToUnknown<T1> extends any[] ? T2[] : T2; // Boxing is necessary to prevent distribution of conditional types: // https://lorefnon.tech/2019/05/02/using-boxing-to-prevent-distribution-of-conditional-types/ type PartialOrAny<TBase, TKeys> = Boxed<TKeys> extends Boxed<never> ? {} : Boxed<TKeys> extends Boxed<keyof TBase> ? SafePick<TBase, TKeys & keyof TBase> : any; // Retain the association of original keys with aliased keys at type level // to facilitates type-safe aliasing for object syntax type MappedAliasType<TBase, TAliasMapping> = {} & { [K in keyof TAliasMapping]: TAliasMapping[K] extends keyof TBase ? TBase[TAliasMapping[K]] : any; }; // Container type for situations when we want a partial/intersection eventually // but the keys being selected or additional properties being augmented are not // all known at once and we would want to effectively build up a partial/intersection // over multiple steps. type DeferredKeySelection< // The base of selection. In intermediate stages this may be unknown. // If it remains unknown at the point of resolution, the selection will fall back to any TBase, // Union of keys to be selected // In intermediate stages this may be never. TKeys extends string, // Changes how the resolution should behave if TKeys is never. // If true, then we assume that some keys were selected, and if TKeys is never, we will fall back to any. // If false, and TKeys is never, then we select TBase in its entirety THasSelect extends true | false = false, // Mapping of aliases <key in result> -> <key in TBase> TAliasMapping extends {} = {}, // If enabled, then instead of extracting a partial, during resolution // we will pick just a single property. TSingle extends boolean = false, // Extra props which will be intersected with the result TIntersectProps extends {} = {}, // Extra props which will be unioned with the result TUnionProps = never > = { // These properties are not actually used, but exist simply because // typescript doesn't end up happy when type parameters are unused _base: TBase; _hasSelection: THasSelect; _keys: TKeys; _aliases: TAliasMapping; _single: TSingle; _intersectProps: TIntersectProps; _unionProps: TUnionProps; }; // An companion namespace for DeferredKeySelection which provides type operators // to build up participants of intersection/partial over multiple invocations // and for final resolution. // // While the comments use wordings such as replacement and addition, it is important // to keep in mind that types are always immutable and all type operators return new altered types. declare namespace DeferredKeySelection { type Any = DeferredKeySelection<any, any, any, any, any, any, any>; // Replace the Base if already a deferred selection. // If not, create a new deferred selection with specified base. type SetBase<TSelection, TBase> = TSelection extends DeferredKeySelection< any, infer TKeys, infer THasSelect, infer TAliasMapping, infer TSingle, infer TIntersectProps, infer TUnionProps > ? DeferredKeySelection< TBase, TKeys, THasSelect, TAliasMapping, TSingle, TIntersectProps, TUnionProps > : DeferredKeySelection<TBase, never>; // If TSelection is already a deferred selection, then replace the base with TBase // If unknown, create a new deferred selection with TBase as the base // Else, retain original // // For practical reasons applicable to current context, we always return arrays of // deferred selections. So, this particular operator may not be useful in generic contexts. type ReplaceBase<TSelection, TBase> = UnwrapArrayMember<TSelection> extends DeferredKeySelection.Any ? ArrayIfAlready< TSelection, DeferredKeySelection.SetBase<UnwrapArrayMember<TSelection>, TBase> > : unknown extends UnwrapArrayMember<TSelection> ? ArrayIfAlready<TSelection, DeferredKeySelection.SetBase<unknown, TBase>> : TSelection; // Type operators to substitute individual type parameters: type SetSingle< TSelection, TSingle extends boolean > = TSelection extends DeferredKeySelection< infer TBase, infer TKeys, infer THasSelect, infer TAliasMapping, any, infer TIntersectProps, infer TUnionProps > ? DeferredKeySelection< TBase, TKeys, THasSelect, TAliasMapping, TSingle, TIntersectProps, TUnionProps > : never; type AddKey< TSelection, TKey extends string > = TSelection extends DeferredKeySelection< infer TBase, infer TKeys, any, infer TAliasMapping, infer TSingle, infer TIntersectProps, infer TUnionProps > ? DeferredKeySelection< TBase, TKeys | TKey, true, TAliasMapping, TSingle, TIntersectProps, TUnionProps > : DeferredKeySelection<unknown, TKey, true>; type AddAliases< TSelection, T extends {} > = TSelection extends DeferredKeySelection< infer TBase, infer TKeys, infer THasSelect, infer TAliasMapping, infer TSingle, infer TIntersectProps, infer TUnionProps > ? DeferredKeySelection< TBase, TKeys, THasSelect, TAliasMapping & T, TSingle, TIntersectProps, TUnionProps > : DeferredKeySelection<unknown, never, false, T>; type AddUnionMember<TSelection, T> = TSelection extends DeferredKeySelection< infer TBase, infer TKeys, infer THasSelect, infer TAliasMapping, infer TSingle, infer TIntersectProps, infer TUnionProps > ? DeferredKeySelection< TBase, TKeys, THasSelect, TAliasMapping, TSingle, TIntersectProps, TUnionProps | T > : DeferredKeySelection<TSelection, never, false, {}, false, {}, T>; // Convenience utility to set base, keys and aliases in a single type // application type Augment< T, TBase, TKey extends string, TAliasMapping extends {} = {} > = AddAliases<AddKey<SetBase<T, TBase>, TKey>, TAliasMapping>; // Core resolution logic -- Refer to docs for DeferredKeySelection for specifics type ResolveOne<TSelection> = TSelection extends DeferredKeySelection< infer TBase, infer TKeys, infer THasSelect, infer TAliasMapping, infer TSingle, infer TIntersectProps, infer TUnionProps > ? UnknownOrCurlyCurlyToAny< // ^ We convert final result to any if it is unknown for backward compatibility. // Historically knex typings have been liberal with returning any and changing // default return type to unknown would be a major breaking change for users. // // So we compromise on type safety here and return any. | AugmentParams< AnyToUnknown<TBase> extends {} ? // ^ Conversion of any -> unknown is needed here to prevent distribution // of any over the conditional TSingle extends true ? TKeys extends keyof TBase ? TBase[TKeys] : any : AugmentParams< true extends THasSelect ? PartialOrAny<TBase, TKeys> : TBase, MappedAliasType<TBase, TAliasMapping> > : unknown, TIntersectProps > | TUnionProps > : TSelection; type Resolve<TSelection> = TSelection extends DeferredKeySelection.Any ? Knex.ResolveTableType<ResolveOne<TSelection>> : TSelection extends DeferredKeySelection.Any[] ? Knex.ResolveTableType<ResolveOne<TSelection[0]>>[] : TSelection extends (infer I)[] ? UnknownOrCurlyCurlyToAny<Knex.ResolveTableType<I>>[] : UnknownOrCurlyCurlyToAny<Knex.ResolveTableType<TSelection>>; } type AggregationQueryResult< TResult, TIntersectProps2 extends {} > = ArrayIfAlready< TResult, UnwrapArrayMember<TResult> extends DeferredKeySelection< infer TBase, infer TKeys, infer THasSelect, infer TAliasMapping, infer TSingle, infer TIntersectProps, infer TUnionProps > ? true extends THasSelect ? DeferredKeySelection< TBase, TKeys, THasSelect, TAliasMapping, TSingle, TIntersectProps & TIntersectProps2, TUnionProps > : DeferredKeySelection<{}, never, true, {}, false, TIntersectProps2> : TIntersectProps2 >; // If we have more categories of deferred selection in future, // this will combine all of them type ResolveResult<S> = DeferredKeySelection.Resolve<S>; // # Type-aliases for common type combinations type Callback = Function; type Client = Function; type Dict<T = any> = { [k: string]: T }; type SafePick<T, K extends keyof T> = T extends {} ? Pick<T, K> : any; type TableOptions = PgTableOptions; interface PgTableOptions { only?: boolean; } interface DMLOptions { includeTriggerModifications?: boolean; } interface Knex<TRecord extends {} = any, TResult = any[]> extends Knex.QueryInterface<TRecord, TResult>, EventEmitter { <TTable extends Knex.TableNames>( tableName: TTable, options?: TableOptions ): Knex.QueryBuilder< Knex.TableType<TTable>, DeferredKeySelection<Knex.ResolveTableType<Knex.TableType<TTable>>, never>[] >; < TRecord2 extends {} = TRecord, TResult2 = DeferredKeySelection<TRecord2, never>[] >( tableName: Knex.TableDescriptor | Knex.AliasDict, options?: TableOptions ): Knex.QueryBuilder<TRecord2, TResult2>; VERSION: string; __knex__: string; raw: Knex.RawBuilder<TRecord>; transactionProvider( config?: Knex.TransactionConfig ): Knex.TransactionProvider; transaction(config?: Knex.TransactionConfig): Promise<Knex.Transaction>; transaction( transactionScope?: null, config?: Knex.TransactionConfig ): Promise<Knex.Transaction>; transaction<T>( transactionScope: (trx: Knex.Transaction) => Promise<T> | void, config?: Knex.TransactionConfig ): Promise<T>; initialize(config?: Knex.Config): void; destroy(callback: Function): void; destroy(): Promise<void>; batchInsert<TRecord2 extends {} = TRecord, TResult2 = number[]>( tableName: Knex.TableDescriptor, data: TRecord2 extends Knex.CompositeTableType<unknown> ? ReadonlyArray<Knex.ResolveTableType<TRecord2, 'insert'>> : ReadonlyArray<Knex.DbRecordArr<TRecord2>>, chunkSize?: number ): Knex.BatchInsertBuilder<TRecord2, TResult2>; schema: Knex.SchemaBuilder; queryBuilder< TRecord2 extends {} = TRecord, TResult2 = TResult >(): Knex.QueryBuilder<TRecord2, TResult2>; client: any; migrate: Knex.Migrator; seed: Knex.Seeder; fn: Knex.FunctionHelper; ref: Knex.RefBuilder; userParams: Record<string, any>; withUserParams(params: Record<string, any>): Knex; isTransaction?: boolean; } declare function knex<TRecord extends {} = any, TResult = unknown[]>( config: Knex.Config | string ): Knex<TRecord, TResult>; declare namespace knex { export { knex, knex as default, Knex }; export class QueryBuilder { static extend( methodName: string, fn: <TRecord extends {} = any, TResult extends {} = unknown[]>( this: Knex.QueryBuilder<TRecord, TResult>, ...args: any[] ) => | Knex.QueryBuilder<TRecord, TResult> | Promise< | Knex.QueryBuilder<TRecord | TResult> | DeferredKeySelection.Resolve<TResult> > ): void; } export class TableBuilder { static extend<T = Knex.TableBuilder, B = Knex.TableBuilder>( methodName: string, fn: (this: T, ...args: any[]) => B ): void; } export class ViewBuilder { static extend<T = Knex.ViewBuilder, B = Knex.ViewBuilder>( methodName: string, fn: (this: T, ...args: any[]) => B ): void; } export class SchemaBuilder { static extend<T = Knex.SchemaBuilder, B = Knex.SchemaBuilder>( methodName: string, fn: (this: T, ...args: any[]) => B ): void; } export class ColumnBuilder { static extend<T = Knex.ColumnBuilder, B = Knex.ColumnBuilder>( methodName: string, fn: (this: T, ...args: any[]) => B ): void; } export class KnexTimeoutError extends Error {} export const Client: typeof Knex.Client; } declare namespace Knex { // // Utility Types // type Value = | string | number | boolean | null | Date | Array<string> | Array<number> | Array<Date> | Array<boolean> | Buffer | Array<Buffer> | Record<string, unknown> | Knex.Raw; type ValueOrBuilder = Value | Knex.QueryBuilder; interface ValueDict extends Dict<Value | Knex.QueryBuilder> {} interface AliasDict extends Dict<string> {} type ColumnDescriptor<TRecord extends {}, TResult> = | string | Knex.Raw | Knex.QueryBuilder<TRecord, TResult> | Dict<string>; type InferrableColumnDescriptor<TRecord extends {}> = | keyof TRecord | Knex.Ref<any, any> | Dict<keyof TRecord>; type TableDescriptor = string | Knex.Raw | Knex.QueryBuilder; type Lookup< TRegistry extends {}, TKey extends string, TDefault = never > = TKey extends keyof TRegistry ? TRegistry[TKey] : TDefault; type MaybeRawColumn<TColumn> = TColumn | Raw<TColumn>; type MaybeRawRecord<TRecord> = { [K in keyof TRecord]: MaybeRawColumn<TRecord[K]>; }; type DbColumn<TColumn> = Readonly<MaybeRawColumn<TColumn>>; type DbRecord<TRecord> = Readonly<SafePartial<MaybeRawRecord<TRecord>>>; type DbRecordArr<TRecord> = Readonly<MaybeArray<DbRecord<TRecord>>>; export type CompositeTableType< TBase, TInsert = TBase, TUpdate = Partial<TInsert>, TUpsert = Partial<TInsert> > = { base: TBase; insert: TInsert; update: TUpdate; upsert: TUpsert; }; type TableNames = keyof Tables; type TableInterfaceScope = keyof CompositeTableType<unknown>; type TableType<TTable extends keyof Tables> = Tables[TTable]; type ResolveTableType< TCompositeTableType, TScope extends TableInterfaceScope = 'base' > = TCompositeTableType extends CompositeTableType<{}> ? TCompositeTableType[TScope] : TCompositeTableType; interface OnConflictQueryBuilder<TRecord extends {}, TResult> { ignore(): QueryBuilder<TRecord, TResult>; merge( mergeColumns?: (keyof ResolveTableType<TRecord, 'update'>)[] ): QueryBuilder<TRecord, TResult>; merge( data?: Extract< DbRecord<ResolveTableType<TRecord, 'update'>>, Record<string, any> > ): QueryBuilder<TRecord, TResult>; } // // QueryInterface // type ClearStatements = | 'with' | 'select' | 'columns' | 'hintComments' | 'where' | 'union' | 'using' | 'join' | 'group' | 'order' | 'having' | 'limit' | 'offset' | 'counter' | 'counters'; interface QueryInterface<TRecord extends {} = any, TResult = any> { select: Select<TRecord, TResult>; as: As<TRecord, TResult>; columns: Select<TRecord, TResult>; column: Select<TRecord, TResult>; comment: Comment<TRecord, TResult>; hintComment: HintComment<TRecord, TResult>; from: Table<TRecord, TResult>; fromRaw: Table<TRecord, TResult>; into: Table<TRecord, TResult>; table: Table<TRecord, TResult>; distinct: Distinct<TRecord, TResult>; distinctOn: DistinctOn<TRecord, TResult>; // Joins join: Join<TRecord, TResult>; joinRaw: JoinRaw<TRecord, TResult>; innerJoin: Join<TRecord, TResult>; leftJoin: Join<TRecord, TResult>; leftOuterJoin: Join<TRecord, TResult>; rightJoin: Join<TRecord, TResult>; rightOuterJoin: Join<TRecord, TResult>; outerJoin: Join<TRecord, TResult>; fullOuterJoin: Join<TRecord, TResult>; crossJoin: Join<TRecord, TResult>; // Json manipulation jsonExtract: JsonExtract<TRecord, TResult>; jsonSet: JsonSet<TRecord, TResult>; jsonInsert: JsonInsert<TRecord, TResult>; jsonRemove: JsonRemove<TRecord, TResult>; // Using using: Using<TRecord, TResult>; // Withs with: With<TRecord, TResult>; withMaterialized: With<TRecord, TResult>; withNotMaterialized: With<TRecord, TResult>; withRecursive: With<TRecord, TResult>; withRaw: WithRaw<TRecord, TResult>; withSchema: WithSchema<TRecord, TResult>; withWrapped: WithWrapped<TRecord, TResult>; // Wheres where: Where<TRecord, TResult>; andWhere: Where<TRecord, TResult>; orWhere: Where<TRecord, TResult>; whereNot: Where<TRecord, TResult>; andWhereNot: Where<TRecord, TResult>; orWhereNot: Where<TRecord, TResult>; whereRaw: WhereRaw<TRecord, TResult>; orWhereRaw: WhereRaw<TRecord, TResult>; andWhereRaw: WhereRaw<TRecord, TResult>; whereWrapped: WhereWrapped<TRecord, TResult>; havingWrapped: WhereWrapped<TRecord, TResult>; whereExists: WhereExists<TRecord, TResult>; orWhereExists: WhereExists<TRecord, TResult>; whereNotExists: WhereExists<TRecord, TResult>; orWhereNotExists: WhereExists<TRecord, TResult>; whereIn: WhereIn<TRecord, TResult>; orWhereIn: WhereIn<TRecord, TResult>; whereNotIn: WhereIn<TRecord, TResult>; orWhereNotIn: WhereIn<TRecord, TResult>; whereLike: Where<TRecord, TResult>; andWhereLike: Where<TRecord, TResult>; orWhereLike: Where<TRecord, TResult>; whereILike: Where<TRecord, TResult>; andWhereILike: Where<TRecord, TResult>; orWhereILike: Where<TRecord, TResult>; whereNull: WhereNull<TRecord, TResult>; orWhereNull: WhereNull<TRecord, TResult>; whereNotNull: WhereNull<TRecord, TResult>; orWhereNotNull: WhereNull<TRecord, TResult>; whereBetween: WhereBetween<TRecord, TResult>; orWhereBetween: WhereBetween<TRecord, TResult>; andWhereBetween: WhereBetween<TRecord, TResult>; whereNotBetween: WhereBetween<TRecord, TResult>; orWhereNotBetween: WhereBetween<TRecord, TResult>; andWhereNotBetween: WhereBetween<TRecord, TResult>; whereJsonObject: WhereJsonObject<TRecord, TResult>; orWhereJsonObject: WhereJsonObject<TRecord, TResult>; andWhereJsonObject: WhereJsonObject<TRecord, TResult>; whereNotJsonObject: WhereJsonObject<TRecord, TResult>; orWhereNotJsonObject: WhereJsonObject<TRecord, TResult>; andWhereNotJsonObject: WhereJsonObject<TRecord, TResult>; whereJsonPath: WhereJsonPath<TRecord, TResult>; orWhereJsonPath: WhereJsonPath<TRecord, TResult>; andWhereJsonPath: WhereJsonPath<TRecord, TResult>; whereJsonSupersetOf: WhereJsonObject<TRecord, TResult>; orWhereJsonSupersetOf: WhereJsonObject<TRecord, TResult>; andWhereJsonSupersetOf: WhereJsonObject<TRecord, TResult>; whereJsonNotSupersetOf: WhereJsonObject<TRecord, TResult>; orWhereJsonNotSupersetOf: WhereJsonObject<TRecord, TResult>; andWhereJsonNotSupersetOf: WhereJsonObject<TRecord, TResult>; whereJsonSubsetOf: WhereJsonObject<TRecord, TResult>; orWhereJsonSubsetOf: WhereJsonObject<TRecord, TResult>; andWhereJsonSubsetOf: WhereJsonObject<TRecord, TResult>; whereJsonNotSubsetOf: WhereJsonObject<TRecord, TResult>; orWhereJsonNotSubsetOf: WhereJsonObject<TRecord, TResult>; andWhereJsonNotSubsetOf: WhereJsonObject<TRecord, TResult>; // Group by groupBy: GroupBy<TRecord, TResult>; groupByRaw: RawQueryBuilder<TRecord, TResult>; // Order by orderBy: OrderBy<TRecord, TResult>; orderByRaw: RawQueryBuilder<TRecord, TResult>; // Partition by partitionBy: PartitionBy<TRecord, TResult>; // Unions union: Union<TRecord, TResult>; unionAll: Union<TRecord, TResult>; intersect: Intersect<TRecord, TResult>; except: Except<TRecord, TResult>; // Having having: Having<TRecord, TResult>; andHaving: Having<TRecord, TResult>; havingRaw: RawQueryBuilder<TRecord, TResult>; orHaving: Having<TRecord, TResult>; orHavingRaw: RawQueryBuilder<TRecord, TResult>; havingIn: HavingRange<TRecord, TResult>; orHavingNotBetween: HavingRange<TRecord, TResult>; havingNotBetween: HavingRange<TRecord, TResult>; orHavingBetween: HavingRange<TRecord, TResult>; havingBetween: HavingRange<TRecord, TResult>; havingNotIn: HavingRange<TRecord, TResult>; andHavingNotIn: HavingRange<TRecord, TResult>; orHavingNotIn: HavingRange<TRecord, TResult>; havingNull: HavingNull<TRecord, TResult>; havingNotNull: HavingNull<TRecord, TResult>; orHavingNull: HavingNull<TRecord, TResult>; orHavingNotNull: HavingNull<TRecord, TResult>; // Clear clearSelect(): QueryBuilder< TRecord, UnwrapArrayMember<TResult> extends DeferredKeySelection< infer TBase, infer TKeys, true, any, any, any, any > ? DeferredKeySelection<TBase, never>[] : TResult >; clearWhere(): QueryBuilder<TRecord, TResult>; clearGroup(): QueryBuilder<TRecord, TResult>; clearOrder(): QueryBuilder<TRecord, TResult>; clearHaving(): QueryBuilder<TRecord, TResult>; clearCounters(): QueryBuilder<TRecord, TResult>; clear(statement: ClearStatements): QueryBuilder<TRecord, TResult>; // Paging offset( offset: number, options?: boolean | Readonly<{ skipBinding?: boolean }> ): QueryBuilder<TRecord, TResult>; limit( limit: number, options?: string | Readonly<{ skipBinding?: boolean }> ): QueryBuilder<TRecord, TResult>; // Aggregation count: AsymmetricAggregation< TRecord, TResult, Lookup<Registry, 'Count', number | string> >; countDistinct: AsymmetricAggregation< TRecord, TResult, Lookup<Registry, 'Count', number | string> >; min: TypePreservingAggregation<TRecord, TResult>; max: TypePreservingAggregation<TRecord, TResult>; sum: TypePreservingAggregation<TRecord, TResult>; sumDistinct: TypePreservingAggregation<TRecord, TResult>; avg: TypePreservingAggregation<TRecord, TResult>; avgDistinct: TypePreservingAggregation<TRecord, TResult>; increment( columnName: keyof ResolveTableType<TRecord, 'update'>, amount?: number ): QueryBuilder<TRecord, number>; increment( columnName: string, amount?: number ): QueryBuilder<TRecord, number>; increment(columns: { [column in keyof ResolveTableType<TRecord, 'update'>]: number; }): QueryBuilder<TRecord, number>; decrement( columnName: keyof ResolveTableType<TRecord, 'update'>, amount?: number ): QueryBuilder<TRecord, number>; decrement( columnName: string, amount?: number ): QueryBuilder<TRecord, number>; decrement(columns: { [column in keyof ResolveTableType<TRecord, 'update'>]: number; }): QueryBuilder<TRecord, number>; // Analytics rank: AnalyticFunction<TRecord, TResult>; denseRank: AnalyticFunction<TRecord, TResult>; rowNumber: AnalyticFunction<TRecord, TResult>; // Others first: Select< TRecord, DeferredKeySelection.AddUnionMember<UnwrapArrayMember<TResult>, undefined> >; pluck<K extends keyof ResolveTableType<TRecord>>( column: K ): QueryBuilder<TRecord, ResolveTableType<TRecord>[K][]>; pluck<TResult2 extends {}>(column: string): QueryBuilder<TRecord, TResult2>; insert( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'insert'> | ReadonlyArray<ResolveTableType<TRecord, 'insert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: '*', options?: DMLOptions ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>; insert< TKey extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'insert'> | ReadonlyArray<ResolveTableType<TRecord, 'insert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: TKey, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; insert< TKey extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'insert'> | ReadonlyArray<ResolveTableType<TRecord, 'insert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; insert< TKey extends string, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'insert'> | ReadonlyArray<ResolveTableType<TRecord, 'insert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: TKey, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; insert< TKey extends string, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'insert'> | ReadonlyArray<ResolveTableType<TRecord, 'insert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; insert<TResult2 = number[]>( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'insert'> | ReadonlyArray<ResolveTableType<TRecord, 'insert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>> ): QueryBuilder<TRecord, TResult2>; upsert( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'upsert'> | ReadonlyArray<ResolveTableType<TRecord, 'upsert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: '*', options?: DMLOptions ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>; upsert< TKey extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'upsert'> | ReadonlyArray<ResolveTableType<TRecord, 'upsert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: TKey, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; upsert< TKey extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'upsert'> | ReadonlyArray<ResolveTableType<TRecord, 'upsert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; upsert< TKey extends string, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'upsert'> | ReadonlyArray<ResolveTableType<TRecord, 'upsert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: TKey, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; upsert< TKey extends string, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'upsert'> | ReadonlyArray<ResolveTableType<TRecord, 'upsert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; upsert<TResult2 = number[]>( data: TRecord extends CompositeTableType<unknown> ? | ResolveTableType<TRecord, 'upsert'> | ReadonlyArray<ResolveTableType<TRecord, 'upsert'>> : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>> ): QueryBuilder<TRecord, TResult2>; modify<TRecord2 extends {} = any, TResult2 extends {} = any>( callback: QueryCallbackWithArgs<TRecord, any>, ...args: any[] ): QueryBuilder<TRecord2, TResult2>; update< K1 extends StrKey<ResolveTableType<TRecord, 'update'>>, K2 extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, K2 >[] >( columnName: K1, value: DbColumn<ResolveTableType<TRecord, 'update'>[K1]>, returning: K2, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; update< K1 extends StrKey<ResolveTableType<TRecord, 'update'>>, K2 extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, K2 >[] >( columnName: K1, value: DbColumn<ResolveTableType<TRecord, 'update'>[K1]> | QueryBuilder, returning: readonly K2[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; update<K extends keyof TRecord>( columnName: K, value: DbColumn<TRecord[K]> ): QueryBuilder<TRecord, number>; update<TResult2 = SafePartial<TRecord>[]>( columnName: string, value: ValueOrBuilder, returning: string | readonly string[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; update( data: DbRecordArr<TRecord>, returning: '*', options?: DMLOptions ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>; update< TKey extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord>, returning: TKey, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; update< TKey extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord>, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; update< TKey extends string = string, TResult2 extends {}[] = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord>, returning: TKey | readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; update< TKey extends string, TResult2 extends {}[] = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, TKey >[] >( data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord>, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; update<TResult2 = number>( data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord> ): QueryBuilder<TRecord, TResult2>; update<TResult2 = number>( columnName: string, value: ValueOrBuilder ): QueryBuilder<TRecord, TResult2>; returning( column: '*', options?: DMLOptions ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>; returning< TKey extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey >[] >( column: TKey, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; returning< TKey extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.SetSingle< DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey >, false >[] >( columns: readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; returning<TResult2 = SafePartial<TRecord>[]>( column: string | readonly (string | Raw)[] | Raw, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; onConflict<TKey extends StrKey<ResolveTableType<TRecord>>>( column: TKey ): OnConflictQueryBuilder<TRecord, TResult>; onConflict<TKey extends StrKey<ResolveTableType<TRecord>>>( columns: readonly TKey[] ): OnConflictQueryBuilder<TRecord, TResult>; onConflict(columns: string): OnConflictQueryBuilder<TRecord, TResult>; onConflict(columns: string[]): OnConflictQueryBuilder<TRecord, TResult>; onConflict(raw: Raw): OnConflictQueryBuilder<TRecord, TResult>; onConflict(): OnConflictQueryBuilder<TRecord, TResult>; updateFrom: Table<TRecord, TResult>; del( returning: '*', options?: DMLOptions ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>; del< TKey extends StrKey<TRecord>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, TKey >[] >( returning: TKey, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; del< TKey extends StrKey<TRecord>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, TKey >[] >( returning: readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2[]>; del<TResult2 = SafePartial<TRecord>[]>( returning: string | readonly string[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; del<TResult2 = number>(): QueryBuilder<TRecord, TResult2>; delete( returning: '*', options?: DMLOptions ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>; delete< TKey extends StrKey<ResolveTableType<TRecord>>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey >[] >( returning: TKey, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; delete< TKey extends StrKey<TRecord>, TResult2 = DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, TKey >[] >( returning: readonly TKey[], options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; delete<TResult2 = any>( returning: string | readonly (string | Raw)[] | Raw, options?: DMLOptions ): QueryBuilder<TRecord, TResult2>; delete<TResult2 = number>(): QueryBuilder<TRecord, TResult2>; truncate(): QueryBuilder<TRecord, void>; } interface As<TRecord extends {}, TResult> { (columnName: keyof TRecord): QueryBuilder<TRecord, TResult>; (columnName: string): QueryBuilder<TRecord, TResult>; } type IntersectAliases<AliasUT> = UnionToIntersection< IncompatibleToAlt< AliasUT extends (infer I)[] ? I extends Ref<any, infer TMapping> ? TMapping : I : never, Dict, {} > > & {}; // filters out `null` and `undefined` interface AliasQueryBuilder<TRecord extends {} = any, TResult = unknown[]> { < AliasUT extends InferrableColumnDescriptor<ResolveTableType<TRecord>>[], TResult2 = ArrayIfAlready< TResult, DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, IncompatibleToAlt<ArrayMember<AliasUT>, string, never>, IntersectAliases<AliasUT> > > >( ...aliases: AliasUT ): QueryBuilder<TRecord, TResult2>; < AliasUT extends InferrableColumnDescriptor<ResolveTableType<TRecord>>[], TResult2 = ArrayIfAlready< TResult, DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, IncompatibleToAlt<ArrayMember<AliasUT>, string, never>, IntersectAliases<AliasUT> > > >( aliases: AliasUT ): QueryBuilder<TRecord, TResult2>; < AliasUT extends (Dict | string)[], TResult2 = ArrayIfAlready< TResult, DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, IncompatibleToAlt<ArrayMember<AliasUT>, string, never>, IntersectAliases<AliasUT> > > >( ...aliases: AliasUT ): QueryBuilder<TRecord, TResult2>; < AliasUT extends (Dict | string)[], TResult2 = ArrayIfAlready< TResult, DeferredKeySelection.Augment< UnwrapArrayMember<TResult>, TRecord, IncompatibleToAlt<ArrayMember<AliasUT>, string, never>, IntersectAliases<AliasUT> > > >( aliases: AliasUT ): QueryBuilder<TRecord, TResult2>; } interface Select<TRecord extends {} = any, TResult = unknown[]> extends AliasQueryBuilder<TRecord, TResult>, ColumnNameQueryBuilder<TRecord, TResult> { (): QueryBuilder<TRecord, TResult>; < TResult2 = ArrayIfAlready<TResult, any>, TInnerRecord extends {} = any, TInnerResult = any >( ...subQueryBuilders: readonly QueryBuilder<TInnerRecord, TInnerResult>[] ): QueryBuilder<TRecord, TResult2>; < TResult2 = ArrayIfAlready<TResult, any>, TInnerRecord extends {} = any, TInnerResult = any >( subQueryBuilders: readonly QueryBuilder<TInnerRecord, TInnerResult>[] ): QueryBuilder<TRecord, TResult2>; } interface JsonExtraction { column: string | Raw | QueryBuilder; path: string; alias?: string; singleValue?: boolean; } interface JsonExtract<TRecord extends {} = any, TResult = any> { ( column: string | Raw | QueryBuilder, path: string, alias?: string, singleValue?: boolean ): QueryBuilder<TRecord, TResult>; (column: JsonExtraction[] | any[][], singleValue?: boolean): QueryBuilder< TRecord, TResult >; } interface JsonSet<TRecord extends {} = any, TResult = any> { ( column: string | Raw | QueryBuilder, path: string, value: any, alias?: string ): QueryBuilder<TRecord, TResult>; } interface JsonInsert<TRecord extends {} = any, TResult = any> { ( column: string | Raw | QueryBuilder, path: string, value: any, alias?: string ): QueryBuilder<TRecord, TResult>; } interface JsonRemove<TRecord extends {} = any, TResult = any> { ( column: string | Raw | QueryBuilder, path: string, alias?: string ): QueryBuilder<TRecord, TResult>; } interface Comment<TRecord extends {} = any, TResult = any> { (comment: string): QueryBuilder<TRecord, TResult>; } interface HintComment<TRecord extends {} = any, TResult = any> { (hint: string): QueryBuilder<TRecord, TResult>; (hints: readonly string[]): QueryBuilder<TRecord, TResult>; } interface Table<TRecord extends {} = any, TResult = any> { < TTable extends TableNames, TRecord2 extends {} = TableType<TTable>, TResult2 = DeferredKeySelection.ReplaceBase< TResult, ResolveTableType<TRecord2> > >( tableName: TTable, options?: TableOptions ): QueryBuilder<TRecord2, TResult2>; < TRecord2 extends {} = {}, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TableDescriptor | AliasDict, options?: TableOptions ): QueryBuilder<TRecord2, TResult2>; < TRecord2 extends {} = {}, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( callback: ( this: QueryBuilder<TRecord, TResult> ) => QueryBuilder<TRecord2, TResult2>, options?: TableOptions ): QueryBuilder<TRecord2, TResult2>; < TRecord2 extends {} = {}, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( raw: Raw, options?: TableOptions ): QueryBuilder<TRecord2, TResult2>; } interface Distinct<TRecord extends {}, TResult = {}[]> extends ColumnNameQueryBuilder<TRecord, TResult> {} interface DistinctOn<TRecord extends {}, TResult = {}[]> { <ColNameUT extends keyof TRecord>( ...columnNames: readonly ColNameUT[] ): QueryBuilder<TRecord, TResult>; <ColNameUT extends keyof TRecord>( columnNames: readonly ColNameUT[] ): QueryBuilder<TRecord, TResult>; (...columnNames: readonly string[]): QueryBuilder<TRecord, TResult>; (columnNames: readonly string[]): QueryBuilder<TRecord, TResult>; } interface JoinCallback { (this: JoinClause, join: JoinClause): void; } interface Join<TRecord extends {} = any, TResult = unknown[]> { < TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( raw: Raw ): QueryBuilder<TRecord2, TResult2>; < TTable extends TableNames, TRecord2 extends {} = ResolveTableType<TRecord> & ResolveTableType<TableType<TTable>>, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TTable, clause: JoinCallback ): QueryBuilder<TRecord2, TResult2>; < TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TableDescriptor | AliasDict | QueryCallback, clause: JoinCallback ): QueryBuilder<TRecord2, TResult2>; < TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TableDescriptor | AliasDict | QueryCallback, columns: { [key: string]: string | number | boolean | Raw } ): QueryBuilder<TRecord2, TResult2>; < TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TableDescriptor | AliasDict | QueryCallback, raw: Raw ): QueryBuilder<TRecord2, TResult2>; < TTable1 extends TableNames, TTable2 extends TableNames, TKey1 extends StrKey<ResolveTableType<TableType<TTable1>>> & StrKey<TRecord1>, TKey2 extends StrKey<ResolveTableType<TableType<TTable2>>>, TRecord1 = ResolveTableType<TRecord>, TRecord2 extends {} = TRecord1 & ResolveTableType<TableType<TTable2>>, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TTable2, column1: `${TTable1}.${TKey1}`, column2: `${TTable2}.${TKey2}` ): QueryBuilder<TRecord2, TResult2>; < TTable1 extends TableNames, TTable2 extends TableNames, TKey1 extends StrKey<ResolveTableType<TableType<TTable1>>> & StrKey<TRecord1>, TKey2 extends StrKey<ResolveTableType<TableType<TTable2>>>, TRecord1 = ResolveTableType<TRecord>, TRecord2 extends {} = TRecord1 & ResolveTableType<TableType<TTable2>>, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TTable2, column1: `${TTable2}.${TKey2}`, column2: `${TTable1}.${TKey1}` ): QueryBuilder<TRecord2, TResult2>; < TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TableDescriptor | AliasDict | QueryCallback, column1: string, column2: string ): QueryBuilder<TRecord2, TResult2>; < TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TableDescriptor | AliasDict | QueryCallback, column1: string, raw: Raw ): QueryBuilder<TRecord2, TResult2>; < TTable1 extends TableNames, TTable2 extends TableNames, TKey1 extends StrKey<ResolveTableType<TableType<TTable1>>> & StrKey<TRecord1>, TKey2 extends StrKey<ResolveTableType<TableType<TTable2>>>, TRecord1 = ResolveTableType<TRecord>, TRecord2 extends {} = TRecord1 & ResolveTableType<TableType<TTable2>>, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TTable2, column1: `${TTable1}.${TKey1}`, operator: string, column2: `${TTable2}.${TKey2}` ): QueryBuilder<TRecord2, TResult2>; < TTable1 extends TableNames, TTable2 extends TableNames, TKey1 extends StrKey<ResolveTableType<TableType<TTable1>>> & StrKey<TRecord1>, TKey2 extends StrKey<ResolveTableType<TableType<TTable2>>>, TRecord1 = ResolveTableType<TRecord>, TRecord2 extends {} = TRecord1 & ResolveTableType<TableType<TTable2>>, TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2> >( tableName: TTable2, column1: `${TTable2}.${TKey2}`, operator: string, column2: `${TTable1}.${TKey1}` ): QueryBuilder<TRecord2, TResult2>; < TJoinTargetRecord extends {} = any,