import type { SelectedFields as SelectedFieldsBase, SelectedFieldsFlat as SelectedFieldsFlatBase, SelectedFieldsOrdered as SelectedFieldsOrderedBase } from "../../operations.cjs"; import type { PgColumn } from "../columns/index.cjs"; import type { PgTable, PgTableWithColumns } from "../table.cjs"; import type { PgViewBase } from "../view-base.cjs"; import type { PgViewWithSelection } from "../view.cjs"; import type { TypedQueryBuilder } from "../../query-builders/query-builder.cjs"; import type { AppendToNullabilityMap, AppendToResult, BuildSubquerySelection, GetSelectTableName, JoinNullability, JoinType, MapColumnsToTableAlias, SelectMode, SelectResult, SetOperator } from "../../query-builders/select.types.cjs"; import type { ColumnsSelection, Placeholder, SQL, SQLWrapper, View } from "../../sql/sql.cjs"; import type { Subquery } from "../../subquery.cjs"; import type { Table, UpdateTableConfig } from "../../table.cjs"; import type { Assume, DrizzleTypeError, Equal, ValidateShape, ValueOrArray } from "../../utils.cjs"; import type { PgPreparedQuery, PreparedQueryConfig } from "../session.cjs"; import type { PgSelectBase, PgSelectQueryBuilderBase } from "./select.cjs"; export interface PgSelectJoinConfig { on: SQL | undefined; table: PgTable | Subquery | PgViewBase | SQL; alias: string | undefined; joinType: JoinType; lateral?: boolean; } export type BuildAliasTable = TTable extends Table ? PgTableWithColumns; }>> : TTable extends View ? PgViewWithSelection> : never; export interface PgSelectConfig { withList?: Subquery[]; fields: Record; fieldsFlat?: SelectedFieldsOrdered; where?: SQL; having?: SQL; table: PgTable | Subquery | PgViewBase | SQL; limit?: number | Placeholder; offset?: number | Placeholder; joins?: PgSelectJoinConfig[]; orderBy?: (PgColumn | SQL | SQL.Aliased)[]; groupBy?: (PgColumn | SQL | SQL.Aliased)[]; lockingClause?: { strength: LockStrength; config: LockConfig; }; distinct?: boolean | { on: (PgColumn | SQLWrapper)[]; }; setOperators: { rightSelect: TypedQueryBuilder; type: SetOperator; isAll: boolean; orderBy?: (PgColumn | SQL | SQL.Aliased)[]; limit?: number | Placeholder; offset?: number | Placeholder; }[]; } export type TableLikeHasEmptySelection = T extends Subquery ? Equal extends true ? true : false : false; export type PgSelectJoin = GetSelectTableName> = T extends any ? PgSelectWithout : never, T['_']['selectMode']>, T['_']['selectMode'] extends 'partial' ? T['_']['selectMode'] : 'multiple', AppendToNullabilityMap, T['_']['dynamic'], T['_']['excludedMethods']>, TDynamic, T['_']['excludedMethods']> : never; export type PgSelectJoinFn = = GetSelectTableName>(table: TableLikeHasEmptySelection extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : TJoinedTable, on: ((aliases: T['_']['selection']) => SQL | undefined) | SQL | undefined) => PgSelectJoin; export type PgSelectCrossJoinFn = = GetSelectTableName>(table: TableLikeHasEmptySelection extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : TJoinedTable) => PgSelectJoin; export type SelectedFieldsFlat = SelectedFieldsFlatBase; export type SelectedFields = SelectedFieldsBase; export type SelectedFieldsOrdered = SelectedFieldsOrderedBase; export type LockStrength = 'update' | 'no key update' | 'share' | 'key share'; export type LockConfig = { of?: ValueOrArray; } & ({ noWait: true; skipLocked?: undefined; } | { noWait?: undefined; skipLocked: true; } | { noWait?: undefined; skipLocked?: undefined; }); export interface PgSelectHKTBase { tableName: string | undefined; selection: unknown; selectMode: SelectMode; nullabilityMap: unknown; dynamic: boolean; excludedMethods: string; result: unknown; selectedFields: unknown; _type: unknown; } export type PgSelectKind, TDynamic extends boolean, TExcludedMethods extends string, TResult = SelectResult[], TSelectedFields = BuildSubquerySelection> = (T & { tableName: TTableName; selection: TSelection; selectMode: TSelectMode; nullabilityMap: TNullabilityMap; dynamic: TDynamic; excludedMethods: TExcludedMethods; result: TResult; selectedFields: TSelectedFields; })['_type']; export interface PgSelectQueryBuilderHKT extends PgSelectHKTBase { _type: PgSelectQueryBuilderBase, this['selectMode'], Assume>, this['dynamic'], this['excludedMethods'], Assume, Assume>; } export interface PgSelectHKT extends PgSelectHKTBase { _type: PgSelectBase, this['selectMode'], Assume>, this['dynamic'], this['excludedMethods'], Assume, Assume>; } export type CreatePgSelectFromBuilderMode = TBuilderMode extends 'db' ? PgSelectBase : PgSelectQueryBuilderBase; export type PgSetOperatorExcludedMethods = 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin' | 'where' | 'having' | 'groupBy' | 'for'; export type PgSelectWithout = TDynamic extends true ? T : Omit, TResetExcluded extends true ? K : T['_']['excludedMethods'] | K>; export type PgSelectPrepare = PgPreparedQuery; export type PgSelectDynamic = PgSelectKind; export type PgSelectQueryBuilder = Record, TResult extends any[] = unknown[], TSelectedFields extends ColumnsSelection = ColumnsSelection> = PgSelectQueryBuilderBase; export type AnyPgSelectQueryBuilder = PgSelectQueryBuilderBase; export type AnyPgSetOperatorInterface = PgSetOperatorInterface; export interface PgSetOperatorInterface = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection> { _: { readonly hkt: PgSelectHKT; readonly tableName: TTableName; readonly selection: TSelection; readonly selectMode: TSelectMode; readonly nullabilityMap: TNullabilityMap; readonly dynamic: TDynamic; readonly excludedMethods: TExcludedMethods; readonly result: TResult; readonly selectedFields: TSelectedFields; }; } export type PgSetOperatorWithResult = PgSetOperatorInterface; export type PgSelect, TSelectMode extends SelectMode = SelectMode, TNullabilityMap extends Record = Record> = PgSelectBase; export type AnyPgSelect = PgSelectBase; export type PgSetOperator, TSelectMode extends SelectMode = SelectMode, TNullabilityMap extends Record = Record> = PgSelectBase; export type SetOperatorRightSelect, TResult extends any[]> = TValue extends PgSetOperatorInterface ? ValidateShape> : TValue; export type SetOperatorRestSelect[], TResult extends any[]> = TValue extends [infer First, ...infer Rest] ? First extends PgSetOperatorInterface ? Rest extends AnyPgSetOperatorInterface[] ? [ ValidateShape>, ...SetOperatorRestSelect ] : ValidateShape[]> : never : TValue; export type PgCreateSetOperatorFn = , TRest extends PgSetOperatorWithResult[], TNullabilityMap extends Record = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection>(leftSelect: PgSetOperatorInterface, rightSelect: SetOperatorRightSelect, ...restSelects: SetOperatorRestSelect) => PgSelectWithout, false, PgSetOperatorExcludedMethods, true>; export type GetPgSetOperators = { union: PgCreateSetOperatorFn; intersect: PgCreateSetOperatorFn; except: PgCreateSetOperatorFn; unionAll: PgCreateSetOperatorFn; intersectAll: PgCreateSetOperatorFn; exceptAll: PgCreateSetOperatorFn; };