knex
Version:
A batteries-included SQL query & schema builder for PostgresSQL, MySQL, CockroachDB, MSSQL and SQLite3
1,559 lines (1,429 loc) • 106 kB
TypeScript
// 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,