kysely 0.26.3 → 0.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +8 -0
- package/dist/cjs/dialect/dialect-adapter-base.js +3 -0
- package/dist/cjs/dialect/dialect-adapter.d.ts +8 -0
- package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +78 -0
- package/dist/cjs/dialect/mssql/mssql-adapter.js +30 -0
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +143 -0
- package/dist/cjs/dialect/mssql/mssql-dialect-config.js +2 -0
- package/dist/cjs/dialect/mssql/mssql-dialect.d.ts +70 -0
- package/dist/cjs/dialect/mssql/mssql-dialect.js +65 -0
- package/dist/cjs/dialect/mssql/mssql-driver.d.ts +54 -0
- package/dist/cjs/dialect/mssql/mssql-driver.js +268 -0
- package/dist/cjs/dialect/mssql/mssql-introspector.d.ts +20 -0
- package/dist/cjs/dialect/mssql/mssql-introspector.js +99 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +11 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.js +64 -0
- package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +2 -0
- package/dist/cjs/dialect/mysql/mysql-query-compiler.js +28 -0
- package/dist/cjs/dialect/postgres/postgres-driver.js +1 -1
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +1 -1
- package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -1
- package/dist/cjs/dialect/sqlite/sqlite-dialect-config.d.ts +1 -0
- package/dist/cjs/dialect/sqlite/sqlite-driver.js +15 -2
- package/dist/cjs/driver/driver.d.ts +1 -1
- package/dist/cjs/driver/driver.js +1 -0
- package/dist/cjs/driver/runtime-driver.js +5 -1
- package/dist/cjs/driver/single-connection-provider.js +7 -8
- package/dist/cjs/expression/expression-builder.d.ts +66 -75
- package/dist/cjs/expression/expression-builder.js +8 -17
- package/dist/cjs/expression/expression-wrapper.d.ts +21 -11
- package/dist/cjs/expression/expression-wrapper.js +12 -0
- package/dist/cjs/helpers/mssql.d.ts +152 -0
- package/dist/cjs/helpers/mssql.js +160 -0
- package/dist/cjs/index.d.ts +7 -1
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/migration/migrator.js +12 -16
- package/dist/cjs/operation-node/add-index-node.d.ts +21 -0
- package/dist/cjs/operation-node/add-index-node.js +31 -0
- package/dist/cjs/operation-node/alter-table-node.d.ts +5 -1
- package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
- package/dist/cjs/operation-node/column-update-node.d.ts +2 -3
- package/dist/cjs/operation-node/create-index-node.d.ts +1 -0
- package/dist/cjs/operation-node/create-table-node.d.ts +1 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +1 -0
- package/dist/cjs/operation-node/limit-node.d.ts +2 -3
- package/dist/cjs/operation-node/limit-node.js +1 -2
- package/dist/cjs/operation-node/offset-node.d.ts +2 -3
- package/dist/cjs/operation-node/offset-node.js +1 -2
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +19 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/operator-node.d.ts +3 -3
- package/dist/cjs/operation-node/operator-node.js +2 -0
- package/dist/cjs/operation-node/select-modifier-node.d.ts +2 -1
- package/dist/cjs/operation-node/select-modifier-node.js +2 -1
- package/dist/cjs/operation-node/unique-constraint-node.d.ts +4 -1
- package/dist/cjs/operation-node/unique-constraint-node.js +8 -1
- package/dist/cjs/parser/binary-operation-parser.js +1 -1
- package/dist/cjs/parser/coalesce-parser.d.ts +12 -2
- package/dist/cjs/parser/reference-parser.d.ts +2 -1
- package/dist/cjs/parser/update-set-parser.d.ts +5 -2
- package/dist/cjs/parser/update-set-parser.js +13 -3
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +21 -4
- package/dist/cjs/query-builder/aggregate-function-builder.js +21 -0
- package/dist/cjs/query-builder/case-builder.d.ts +6 -5
- package/dist/cjs/query-builder/delete-query-builder.d.ts +8 -7
- package/dist/cjs/query-builder/delete-query-builder.js +4 -3
- package/dist/cjs/query-builder/function-module.d.ts +96 -25
- package/dist/cjs/query-builder/function-module.js +17 -3
- package/dist/cjs/query-builder/having-interface.d.ts +3 -5
- package/dist/cjs/query-builder/insert-query-builder.d.ts +34 -12
- package/dist/cjs/query-builder/insert-query-builder.js +16 -5
- package/dist/cjs/query-builder/insert-result.d.ts +8 -1
- package/dist/cjs/query-builder/insert-result.js +8 -1
- package/dist/cjs/query-builder/json-path-builder.d.ts +5 -3
- package/dist/cjs/query-builder/json-path-builder.js +9 -3
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +58 -16
- package/dist/cjs/query-builder/on-conflict-builder.js +1 -6
- package/dist/cjs/query-builder/over-builder.d.ts +2 -2
- package/dist/cjs/query-builder/select-query-builder.d.ts +49 -31
- package/dist/cjs/query-builder/select-query-builder.js +12 -10
- package/dist/cjs/query-builder/update-query-builder.d.ts +23 -7
- package/dist/cjs/query-builder/update-query-builder.js +4 -4
- package/dist/cjs/query-builder/where-interface.d.ts +3 -3
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +9 -1
- package/dist/cjs/query-compiler/default-query-compiler.js +73 -12
- package/dist/cjs/raw-builder/raw-builder.d.ts +11 -1
- package/dist/cjs/raw-builder/raw-builder.js +3 -0
- package/dist/cjs/raw-builder/sql.js +9 -2
- package/dist/cjs/schema/alter-table-add-index-builder.d.ts +104 -0
- package/dist/cjs/schema/alter-table-add-index-builder.js +146 -0
- package/dist/cjs/schema/alter-table-builder.d.ts +41 -1
- package/dist/cjs/schema/alter-table-builder.js +59 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +25 -0
- package/dist/cjs/schema/column-definition-builder.js +27 -0
- package/dist/cjs/schema/create-index-builder.d.ts +23 -0
- package/dist/cjs/schema/create-index-builder.js +30 -0
- package/dist/cjs/schema/create-table-builder.d.ts +28 -2
- package/dist/cjs/schema/create-table-builder.js +38 -3
- package/dist/cjs/schema/unique-constraint-builder.d.ts +14 -0
- package/dist/cjs/schema/unique-constraint-builder.js +24 -0
- package/dist/cjs/util/log.js +5 -1
- package/dist/cjs/util/object-utils.d.ts +2 -2
- package/dist/cjs/util/object-utils.js +1 -1
- package/dist/cjs/util/type-utils.d.ts +27 -19
- package/dist/esm/dialect/dialect-adapter-base.d.ts +8 -0
- package/dist/esm/dialect/dialect-adapter-base.js +3 -0
- package/dist/esm/dialect/dialect-adapter.d.ts +8 -0
- package/dist/esm/dialect/mssql/mssql-adapter.d.ts +78 -0
- package/dist/esm/dialect/mssql/mssql-adapter.js +27 -0
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +143 -0
- package/dist/esm/dialect/mssql/mssql-dialect-config.js +2 -0
- package/dist/esm/dialect/mssql/mssql-dialect.d.ts +70 -0
- package/dist/esm/dialect/mssql/mssql-dialect.js +62 -0
- package/dist/esm/dialect/mssql/mssql-driver.d.ts +54 -0
- package/dist/esm/dialect/mssql/mssql-driver.js +265 -0
- package/dist/esm/dialect/mssql/mssql-introspector.d.ts +20 -0
- package/dist/esm/dialect/mssql/mssql-introspector.js +96 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +11 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.js +61 -0
- package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +2 -0
- package/dist/esm/dialect/mysql/mysql-query-compiler.js +28 -0
- package/dist/esm/dialect/postgres/postgres-driver.js +1 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +1 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -1
- package/dist/esm/dialect/sqlite/sqlite-dialect-config.d.ts +1 -0
- package/dist/esm/dialect/sqlite/sqlite-driver.js +15 -2
- package/dist/esm/driver/driver.d.ts +1 -1
- package/dist/esm/driver/driver.js +1 -0
- package/dist/esm/driver/runtime-driver.js +5 -1
- package/dist/esm/driver/single-connection-provider.js +7 -8
- package/dist/esm/expression/expression-builder.d.ts +66 -75
- package/dist/esm/expression/expression-builder.js +10 -19
- package/dist/esm/expression/expression-wrapper.d.ts +21 -11
- package/dist/esm/expression/expression-wrapper.js +12 -0
- package/dist/esm/helpers/mssql.d.ts +152 -0
- package/dist/esm/helpers/mssql.js +155 -0
- package/dist/esm/index.d.ts +7 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/migration/migrator.js +12 -16
- package/dist/esm/operation-node/add-index-node.d.ts +21 -0
- package/dist/esm/operation-node/add-index-node.js +29 -0
- package/dist/esm/operation-node/alter-table-node.d.ts +5 -1
- package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
- package/dist/esm/operation-node/column-update-node.d.ts +2 -3
- package/dist/esm/operation-node/create-index-node.d.ts +1 -0
- package/dist/esm/operation-node/create-table-node.d.ts +1 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +1 -0
- package/dist/esm/operation-node/limit-node.d.ts +2 -3
- package/dist/esm/operation-node/limit-node.js +1 -2
- package/dist/esm/operation-node/offset-node.d.ts +2 -3
- package/dist/esm/operation-node/offset-node.js +1 -2
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +19 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/operator-node.d.ts +3 -3
- package/dist/esm/operation-node/operator-node.js +2 -0
- package/dist/esm/operation-node/select-modifier-node.d.ts +2 -1
- package/dist/esm/operation-node/select-modifier-node.js +2 -1
- package/dist/esm/operation-node/unique-constraint-node.d.ts +4 -1
- package/dist/esm/operation-node/unique-constraint-node.js +8 -1
- package/dist/esm/parser/binary-operation-parser.js +1 -1
- package/dist/esm/parser/coalesce-parser.d.ts +12 -2
- package/dist/esm/parser/reference-parser.d.ts +2 -1
- package/dist/esm/parser/update-set-parser.d.ts +5 -2
- package/dist/esm/parser/update-set-parser.js +10 -1
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +21 -4
- package/dist/esm/query-builder/aggregate-function-builder.js +21 -0
- package/dist/esm/query-builder/case-builder.d.ts +6 -5
- package/dist/esm/query-builder/delete-query-builder.d.ts +8 -7
- package/dist/esm/query-builder/delete-query-builder.js +4 -3
- package/dist/esm/query-builder/function-module.d.ts +96 -25
- package/dist/esm/query-builder/function-module.js +17 -3
- package/dist/esm/query-builder/having-interface.d.ts +3 -5
- package/dist/esm/query-builder/insert-query-builder.d.ts +34 -12
- package/dist/esm/query-builder/insert-query-builder.js +17 -6
- package/dist/esm/query-builder/insert-result.d.ts +8 -1
- package/dist/esm/query-builder/insert-result.js +8 -1
- package/dist/esm/query-builder/json-path-builder.d.ts +5 -3
- package/dist/esm/query-builder/json-path-builder.js +9 -3
- package/dist/esm/query-builder/on-conflict-builder.d.ts +58 -16
- package/dist/esm/query-builder/on-conflict-builder.js +2 -7
- package/dist/esm/query-builder/over-builder.d.ts +2 -2
- package/dist/esm/query-builder/select-query-builder.d.ts +49 -31
- package/dist/esm/query-builder/select-query-builder.js +13 -11
- package/dist/esm/query-builder/update-query-builder.d.ts +23 -7
- package/dist/esm/query-builder/update-query-builder.js +5 -5
- package/dist/esm/query-builder/where-interface.d.ts +3 -3
- package/dist/esm/query-compiler/default-query-compiler.d.ts +9 -1
- package/dist/esm/query-compiler/default-query-compiler.js +73 -12
- package/dist/esm/raw-builder/raw-builder.d.ts +11 -1
- package/dist/esm/raw-builder/raw-builder.js +3 -0
- package/dist/esm/raw-builder/sql.js +9 -2
- package/dist/esm/schema/alter-table-add-index-builder.d.ts +104 -0
- package/dist/esm/schema/alter-table-add-index-builder.js +143 -0
- package/dist/esm/schema/alter-table-builder.d.ts +41 -1
- package/dist/esm/schema/alter-table-builder.js +59 -2
- package/dist/esm/schema/column-definition-builder.d.ts +25 -0
- package/dist/esm/schema/column-definition-builder.js +27 -0
- package/dist/esm/schema/create-index-builder.d.ts +23 -0
- package/dist/esm/schema/create-index-builder.js +30 -0
- package/dist/esm/schema/create-table-builder.d.ts +28 -2
- package/dist/esm/schema/create-table-builder.js +38 -3
- package/dist/esm/schema/unique-constraint-builder.d.ts +14 -0
- package/dist/esm/schema/unique-constraint-builder.js +21 -0
- package/dist/esm/util/log.js +5 -1
- package/dist/esm/util/object-utils.d.ts +2 -2
- package/dist/esm/util/object-utils.js +1 -1
- package/dist/esm/util/type-utils.d.ts +27 -19
- package/helpers/mssql.d.ts +1 -0
- package/helpers/mssql.js +1 -0
- package/package.json +15 -10
|
@@ -5,11 +5,14 @@ export interface UniqueConstraintNode extends OperationNode {
|
|
|
5
5
|
readonly kind: 'UniqueConstraintNode';
|
|
6
6
|
readonly columns: ReadonlyArray<ColumnNode>;
|
|
7
7
|
readonly name?: IdentifierNode;
|
|
8
|
+
readonly nullsNotDistinct?: boolean;
|
|
8
9
|
}
|
|
10
|
+
export type UniqueConstraintNodeProps = Omit<Partial<UniqueConstraintNode>, 'kind'>;
|
|
9
11
|
/**
|
|
10
12
|
* @internal
|
|
11
13
|
*/
|
|
12
14
|
export declare const UniqueConstraintNode: Readonly<{
|
|
13
15
|
is(node: OperationNode): node is UniqueConstraintNode;
|
|
14
|
-
create(columns: string[], constraintName?: string): UniqueConstraintNode;
|
|
16
|
+
create(columns: string[], constraintName?: string, nullsNotDistinct?: boolean): UniqueConstraintNode;
|
|
17
|
+
cloneWith(node: UniqueConstraintNode, props: UniqueConstraintNodeProps): UniqueConstraintNode;
|
|
15
18
|
}>;
|
|
@@ -9,11 +9,18 @@ export const UniqueConstraintNode = freeze({
|
|
|
9
9
|
is(node) {
|
|
10
10
|
return node.kind === 'UniqueConstraintNode';
|
|
11
11
|
},
|
|
12
|
-
create(columns, constraintName) {
|
|
12
|
+
create(columns, constraintName, nullsNotDistinct) {
|
|
13
13
|
return freeze({
|
|
14
14
|
kind: 'UniqueConstraintNode',
|
|
15
15
|
columns: freeze(columns.map(ColumnNode.create)),
|
|
16
16
|
name: constraintName ? IdentifierNode.create(constraintName) : undefined,
|
|
17
|
+
nullsNotDistinct,
|
|
18
|
+
});
|
|
19
|
+
},
|
|
20
|
+
cloneWith(node, props) {
|
|
21
|
+
return freeze({
|
|
22
|
+
...node,
|
|
23
|
+
...props,
|
|
17
24
|
});
|
|
18
25
|
},
|
|
19
26
|
});
|
|
@@ -35,7 +35,7 @@ export function parseFilterObject(obj, combinator) {
|
|
|
35
35
|
export function parseFilterList(list, combinator) {
|
|
36
36
|
const combine = combinator === 'and' ? AndNode.create : OrNode.create;
|
|
37
37
|
if (list.length === 0) {
|
|
38
|
-
return ValueNode.createImmediate(combinator === 'and');
|
|
38
|
+
return BinaryOperationNode.create(ValueNode.createImmediate(1), OperatorNode.create('='), ValueNode.createImmediate(combinator === 'and' ? 1 : 0));
|
|
39
39
|
}
|
|
40
40
|
let node = toOperationNode(list[0]);
|
|
41
41
|
for (let i = 1; i < list.length; ++i) {
|
|
@@ -1,2 +1,12 @@
|
|
|
1
|
-
import { ExtractTypeFromReferenceExpression
|
|
2
|
-
export type
|
|
1
|
+
import { ExtractTypeFromReferenceExpression } from './reference-parser.js';
|
|
2
|
+
export type ExtractTypeFromCoalesce1<DB, TB extends keyof DB, R1> = ExtractTypeFromReferenceExpression<DB, TB, R1>;
|
|
3
|
+
export type ExtractTypeFromCoalesce2<DB, TB extends keyof DB, R1, R2> = ExtractTypeFromCoalesceValues2<ExtractTypeFromReferenceExpression<DB, TB, R1>, ExtractTypeFromReferenceExpression<DB, TB, R2>>;
|
|
4
|
+
type ExtractTypeFromCoalesceValues2<V1, V2> = null extends V1 ? null extends V2 ? V1 | V2 : NotNull<V1 | V2> : NotNull<V1>;
|
|
5
|
+
export type ExtractTypeFromCoalesce3<DB, TB extends keyof DB, R1, R2, R3> = ExtractTypeFromCoalesceValues3<ExtractTypeFromReferenceExpression<DB, TB, R1>, ExtractTypeFromReferenceExpression<DB, TB, R2>, ExtractTypeFromReferenceExpression<DB, TB, R3>>;
|
|
6
|
+
type ExtractTypeFromCoalesceValues3<V1, V2, V3> = null extends V1 ? null extends V2 ? null extends V3 ? V1 | V2 | V3 : NotNull<V1 | V2 | V3> : NotNull<V1 | V2> : NotNull<V1>;
|
|
7
|
+
export type ExtractTypeFromCoalesce4<DB, TB extends keyof DB, R1, R2, R3, R4> = ExtractTypeFromCoalesceValues4<ExtractTypeFromReferenceExpression<DB, TB, R1>, ExtractTypeFromReferenceExpression<DB, TB, R2>, ExtractTypeFromReferenceExpression<DB, TB, R3>, ExtractTypeFromReferenceExpression<DB, TB, R4>>;
|
|
8
|
+
type ExtractTypeFromCoalesceValues4<V1, V2, V3, V4> = null extends V1 ? null extends V2 ? null extends V3 ? null extends V4 ? V1 | V2 | V3 | V4 : NotNull<V1 | V2 | V3 | V4> : NotNull<V1 | V2 | V3> : NotNull<V1 | V2> : NotNull<V1>;
|
|
9
|
+
export type ExtractTypeFromCoalesce5<DB, TB extends keyof DB, R1, R2, R3, R4, R5> = ExtractTypeFromCoalesceValues5<ExtractTypeFromReferenceExpression<DB, TB, R1>, ExtractTypeFromReferenceExpression<DB, TB, R2>, ExtractTypeFromReferenceExpression<DB, TB, R3>, ExtractTypeFromReferenceExpression<DB, TB, R4>, ExtractTypeFromReferenceExpression<DB, TB, R5>>;
|
|
10
|
+
type ExtractTypeFromCoalesceValues5<V1, V2, V3, V4, V5> = null extends V1 ? null extends V2 ? null extends V3 ? null extends V4 ? null extends V5 ? V1 | V2 | V3 | V4 | V5 : NotNull<V1 | V2 | V3 | V4 | V5> : NotNull<V1 | V2 | V3 | V4> : NotNull<V1 | V2 | V3> : NotNull<V1 | V2> : NotNull<V1>;
|
|
11
|
+
type NotNull<T> = Exclude<T, null>;
|
|
12
|
+
export {};
|
|
@@ -16,7 +16,8 @@ export type StringReference<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyCo
|
|
|
16
16
|
export type SimpleReferenceExpression<DB, TB extends keyof DB> = StringReference<DB, TB> | DynamicReferenceBuilder<any>;
|
|
17
17
|
export type ReferenceExpression<DB, TB extends keyof DB> = SimpleReferenceExpression<DB, TB> | ExpressionOrFactory<DB, TB, any>;
|
|
18
18
|
export type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReadonlyArray<ReferenceExpression<DB, TB>>;
|
|
19
|
-
export type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE, DV = unknown> =
|
|
19
|
+
export type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE, DV = unknown> = SelectType<ExtractRawTypeFromReferenceExpression<DB, TB, RE, DV>>;
|
|
20
|
+
export type ExtractRawTypeFromReferenceExpression<DB, TB extends keyof DB, RE, DV = unknown> = RE extends string ? ExtractTypeFromStringReference<DB, TB, RE> : RE extends SelectQueryBuilderExpression<infer O> ? O[keyof O] | null : RE extends (qb: any) => SelectQueryBuilderExpression<infer O> ? O[keyof O] | null : RE extends Expression<infer O> ? O : RE extends (qb: any) => Expression<infer O> ? O : DV;
|
|
20
21
|
export type ExtractTypeFromStringReference<DB, TB extends keyof DB, RE extends string, DV = unknown> = RE extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : RE extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : RE extends AnyColumn<DB, TB> ? ExtractColumnType<DB, TB, RE> : DV;
|
|
21
22
|
export type OrderedColumnName<C extends string> = C extends `${string} ${infer O}` ? O extends OrderByDirection ? C : never : C;
|
|
22
23
|
export type ExtractColumnNameFromOrderedColumnName<C extends string> = C extends `${infer CL} ${infer O}` ? O extends OrderByDirection ? CL : never : C;
|
|
@@ -2,9 +2,12 @@ import { ColumnUpdateNode } from '../operation-node/column-update-node.js';
|
|
|
2
2
|
import { ExpressionBuilder } from '../expression/expression-builder.js';
|
|
3
3
|
import { UpdateKeys, UpdateType } from '../util/column-type.js';
|
|
4
4
|
import { ValueExpression } from './value-parser.js';
|
|
5
|
+
import { ExtractRawTypeFromReferenceExpression, ReferenceExpression } from './reference-parser.js';
|
|
5
6
|
export type UpdateObject<DB, TB extends keyof DB, UT extends keyof DB = TB> = {
|
|
6
7
|
[C in UpdateKeys<DB[UT]>]?: ValueExpression<DB, TB, UpdateType<DB[UT][C]>> | undefined;
|
|
7
8
|
};
|
|
8
9
|
export type UpdateObjectFactory<DB, TB extends keyof DB, UT extends keyof DB> = (eb: ExpressionBuilder<DB, TB>) => UpdateObject<DB, TB, UT>;
|
|
9
|
-
export type
|
|
10
|
-
export
|
|
10
|
+
export type UpdateObjectExpression<DB, TB extends keyof DB, UT extends keyof DB = TB> = UpdateObject<DB, TB, UT> | UpdateObjectFactory<DB, TB, UT>;
|
|
11
|
+
export type ExtractUpdateTypeFromReferenceExpression<DB, TB extends keyof DB, RE, DV = unknown> = UpdateType<ExtractRawTypeFromReferenceExpression<DB, TB, RE, DV>>;
|
|
12
|
+
export declare function parseUpdate(...args: [UpdateObjectExpression<any, any, any>] | [ReferenceExpression<any, any>, ValueExpression<any, any, any>]): ReadonlyArray<ColumnUpdateNode>;
|
|
13
|
+
export declare function parseUpdateObjectExpression(update: UpdateObjectExpression<any, any, any>): ReadonlyArray<ColumnUpdateNode>;
|
|
@@ -4,7 +4,16 @@ import { ColumnUpdateNode } from '../operation-node/column-update-node.js';
|
|
|
4
4
|
import { expressionBuilder, } from '../expression/expression-builder.js';
|
|
5
5
|
import { isFunction } from '../util/object-utils.js';
|
|
6
6
|
import { parseValueExpression } from './value-parser.js';
|
|
7
|
-
|
|
7
|
+
import { parseReferenceExpression, } from './reference-parser.js';
|
|
8
|
+
export function parseUpdate(...args) {
|
|
9
|
+
if (args.length === 2) {
|
|
10
|
+
return [
|
|
11
|
+
ColumnUpdateNode.create(parseReferenceExpression(args[0]), parseValueExpression(args[1])),
|
|
12
|
+
];
|
|
13
|
+
}
|
|
14
|
+
return parseUpdateObjectExpression(args[0]);
|
|
15
|
+
}
|
|
16
|
+
export function parseUpdateObjectExpression(update) {
|
|
8
17
|
const updateObj = isFunction(update) ? update(expressionBuilder()) : update;
|
|
9
18
|
return Object.entries(updateObj)
|
|
10
19
|
.filter(([_, value]) => value !== undefined)
|
|
@@ -116,8 +116,8 @@ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unkno
|
|
|
116
116
|
* from "person"
|
|
117
117
|
* ```
|
|
118
118
|
*/
|
|
119
|
-
filterWhere<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs:
|
|
120
|
-
filterWhere
|
|
119
|
+
filterWhere<RE extends ReferenceExpression<DB, TB>, VE extends OperandValueExpressionOrList<DB, TB, RE>>(lhs: RE, op: ComparisonOperatorExpression, rhs: VE): AggregateFunctionBuilder<DB, TB, O>;
|
|
120
|
+
filterWhere<E extends ExpressionOrFactory<DB, TB, SqlBool>>(expression: E): AggregateFunctionBuilder<DB, TB, O>;
|
|
121
121
|
/**
|
|
122
122
|
* Adds a `filter` clause with a nested `where` clause after the function, where
|
|
123
123
|
* both sides of the operator are references to columns.
|
|
@@ -150,7 +150,7 @@ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unkno
|
|
|
150
150
|
* from "person"
|
|
151
151
|
* ```
|
|
152
152
|
*/
|
|
153
|
-
filterWhereRef
|
|
153
|
+
filterWhereRef<LRE extends ReferenceExpression<DB, TB>, RRE extends ReferenceExpression<DB, TB>>(lhs: LRE, op: ComparisonOperatorExpression, rhs: RRE): AggregateFunctionBuilder<DB, TB, O>;
|
|
154
154
|
/**
|
|
155
155
|
* Adds an `over` clause (window functions) after the function.
|
|
156
156
|
*
|
|
@@ -199,6 +199,23 @@ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unkno
|
|
|
199
199
|
* what the provided function returns.
|
|
200
200
|
*/
|
|
201
201
|
$call<T>(func: (qb: this) => T): T;
|
|
202
|
+
/**
|
|
203
|
+
* Casts the expression to the given type.
|
|
204
|
+
*
|
|
205
|
+
* This method call doesn't change the SQL in any way. This methods simply
|
|
206
|
+
* returns a copy of this `AggregateFunctionBuilder` with a new output type.
|
|
207
|
+
*/
|
|
208
|
+
$castTo<C>(): AggregateFunctionBuilder<DB, TB, C>;
|
|
209
|
+
/**
|
|
210
|
+
* Omit null from the expression's type.
|
|
211
|
+
*
|
|
212
|
+
* This function can be useful in cases where you know an expression can't be
|
|
213
|
+
* null, but Kysely is unable to infer it.
|
|
214
|
+
*
|
|
215
|
+
* This method call doesn't change the SQL in any way. This methods simply
|
|
216
|
+
* returns a copy of `this` with a new output type.
|
|
217
|
+
*/
|
|
218
|
+
$notNull(): AggregateFunctionBuilder<DB, TB, Exclude<O, null>>;
|
|
202
219
|
/**
|
|
203
220
|
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
204
221
|
*
|
|
@@ -239,4 +256,4 @@ export declare class AliasedAggregateFunctionBuilder<DB, TB extends keyof DB, O
|
|
|
239
256
|
export interface AggregateFunctionBuilderProps {
|
|
240
257
|
aggregateFunctionNode: AggregateFunctionNode;
|
|
241
258
|
}
|
|
242
|
-
export type OverBuilderCallback<DB, TB extends keyof DB> = (builder: OverBuilder<DB, TB>) => OverBuilder<
|
|
259
|
+
export type OverBuilderCallback<DB, TB extends keyof DB> = (builder: OverBuilder<DB, TB>) => OverBuilder<any, any>;
|
|
@@ -170,6 +170,27 @@ export class AggregateFunctionBuilder {
|
|
|
170
170
|
$call(func) {
|
|
171
171
|
return func(this);
|
|
172
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Casts the expression to the given type.
|
|
175
|
+
*
|
|
176
|
+
* This method call doesn't change the SQL in any way. This methods simply
|
|
177
|
+
* returns a copy of this `AggregateFunctionBuilder` with a new output type.
|
|
178
|
+
*/
|
|
179
|
+
$castTo() {
|
|
180
|
+
return new AggregateFunctionBuilder(this.#props);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Omit null from the expression's type.
|
|
184
|
+
*
|
|
185
|
+
* This function can be useful in cases where you know an expression can't be
|
|
186
|
+
* null, but Kysely is unable to infer it.
|
|
187
|
+
*
|
|
188
|
+
* This method call doesn't change the SQL in any way. This methods simply
|
|
189
|
+
* returns a copy of `this` with a new output type.
|
|
190
|
+
*/
|
|
191
|
+
$notNull() {
|
|
192
|
+
return new AggregateFunctionBuilder(this.#props);
|
|
193
|
+
}
|
|
173
194
|
toOperationNode() {
|
|
174
195
|
return this.#props.aggregateFunctionNode;
|
|
175
196
|
}
|
|
@@ -3,6 +3,7 @@ import { ExpressionWrapper } from '../expression/expression-wrapper.js';
|
|
|
3
3
|
import { ReferenceExpression } from '../parser/reference-parser.js';
|
|
4
4
|
import { CaseNode } from '../operation-node/case-node.js';
|
|
5
5
|
import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
|
|
6
|
+
import { ExtractTypeFromValueExpression } from '../parser/value-parser.js';
|
|
6
7
|
import { KyselyTypeError } from '../util/type-error.js';
|
|
7
8
|
export declare class CaseBuilder<DB, TB extends keyof DB, W = unknown, O = never> implements Whenable<DB, TB, W, O> {
|
|
8
9
|
#private;
|
|
@@ -12,7 +13,7 @@ export declare class CaseBuilder<DB, TB extends keyof DB, W = unknown, O = never
|
|
|
12
13
|
*
|
|
13
14
|
* A `when` call must be followed by a {@link CaseThenBuilder.then} call.
|
|
14
15
|
*/
|
|
15
|
-
when<RE extends ReferenceExpression<DB, TB>>(lhs: unknown extends W ? RE : KyselyTypeError<'when(lhs, op, rhs) is not supported when using case(value)'>, op: ComparisonOperatorExpression, rhs:
|
|
16
|
+
when<RE extends ReferenceExpression<DB, TB>, VE extends OperandValueExpressionOrList<DB, TB, RE>>(lhs: unknown extends W ? RE : KyselyTypeError<'when(lhs, op, rhs) is not supported when using case(value)'>, op: ComparisonOperatorExpression, rhs: VE): CaseThenBuilder<DB, TB, W, O>;
|
|
16
17
|
when(expression: Expression<W>): CaseThenBuilder<DB, TB, W, O>;
|
|
17
18
|
when(value: unknown extends W ? KyselyTypeError<'when(value) is only supported when using case(value)'> : W): CaseThenBuilder<DB, TB, W, O>;
|
|
18
19
|
}
|
|
@@ -28,7 +29,7 @@ export declare class CaseThenBuilder<DB, TB extends keyof DB, W, O> {
|
|
|
28
29
|
* A `then` call can be followed by {@link Whenable.when}, {@link CaseWhenBuilder.else},
|
|
29
30
|
* {@link CaseWhenBuilder.end} or {@link CaseWhenBuilder.endCase} call.
|
|
30
31
|
*/
|
|
31
|
-
then<
|
|
32
|
+
then<E extends Expression<unknown>>(expression: E): CaseWhenBuilder<DB, TB, W, O | ExtractTypeFromValueExpression<E>>;
|
|
32
33
|
then<V>(value: V): CaseWhenBuilder<DB, TB, W, O | V>;
|
|
33
34
|
}
|
|
34
35
|
export declare class CaseWhenBuilder<DB, TB extends keyof DB, W, O> implements Whenable<DB, TB, W, O>, Endable<DB, TB, O | null> {
|
|
@@ -39,7 +40,7 @@ export declare class CaseWhenBuilder<DB, TB extends keyof DB, W, O> implements W
|
|
|
39
40
|
*
|
|
40
41
|
* A `when` call must be followed by a {@link CaseThenBuilder.then} call.
|
|
41
42
|
*/
|
|
42
|
-
when<RE extends ReferenceExpression<DB, TB>>(lhs: unknown extends W ? RE : KyselyTypeError<'when(lhs, op, rhs) is not supported when using case(value)'>, op: ComparisonOperatorExpression, rhs:
|
|
43
|
+
when<RE extends ReferenceExpression<DB, TB>, VE extends OperandValueExpressionOrList<DB, TB, RE>>(lhs: unknown extends W ? RE : KyselyTypeError<'when(lhs, op, rhs) is not supported when using case(value)'>, op: ComparisonOperatorExpression, rhs: VE): CaseThenBuilder<DB, TB, W, O>;
|
|
43
44
|
when(expression: Expression<W>): CaseThenBuilder<DB, TB, W, O>;
|
|
44
45
|
when(value: unknown extends W ? KyselyTypeError<'when(value) is only supported when using case(value)'> : W): CaseThenBuilder<DB, TB, W, O>;
|
|
45
46
|
/**
|
|
@@ -47,7 +48,7 @@ export declare class CaseWhenBuilder<DB, TB extends keyof DB, W, O> implements W
|
|
|
47
48
|
*
|
|
48
49
|
* An `else` call must be followed by an {@link Endable.end} or {@link Endable.endCase} call.
|
|
49
50
|
*/
|
|
50
|
-
else<
|
|
51
|
+
else<E extends Expression<unknown>>(expression: E): CaseEndBuilder<DB, TB, O | ExtractTypeFromValueExpression<E>>;
|
|
51
52
|
else<V>(value: V): CaseEndBuilder<DB, TB, O | V>;
|
|
52
53
|
/**
|
|
53
54
|
* Adds an `end` keyword to the case operator.
|
|
@@ -88,7 +89,7 @@ interface Whenable<DB, TB extends keyof DB, W, O> {
|
|
|
88
89
|
*
|
|
89
90
|
* A `when` call must be followed by a {@link CaseThenBuilder.then} call.
|
|
90
91
|
*/
|
|
91
|
-
when<RE extends ReferenceExpression<DB, TB>>(lhs: unknown extends W ? RE : KyselyTypeError<'when(lhs, op, rhs) is not supported when using case(value)'>, op: ComparisonOperatorExpression, rhs:
|
|
92
|
+
when<RE extends ReferenceExpression<DB, TB>, VE extends OperandValueExpressionOrList<DB, TB, RE>>(lhs: unknown extends W ? RE : KyselyTypeError<'when(lhs, op, rhs) is not supported when using case(value)'>, op: ComparisonOperatorExpression, rhs: VE): CaseThenBuilder<DB, TB, W, O>;
|
|
92
93
|
when(expression: Expression<W>): CaseThenBuilder<DB, TB, W, O>;
|
|
93
94
|
when(value: unknown extends W ? KyselyTypeError<'when(value) is only supported when using case(value)'> : W): CaseThenBuilder<DB, TB, W, O>;
|
|
94
95
|
}
|
|
@@ -23,6 +23,7 @@ import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../p
|
|
|
23
23
|
import { KyselyTypeError } from '../util/type-error.js';
|
|
24
24
|
import { Streamable } from '../util/streamable.js';
|
|
25
25
|
import { ExpressionOrFactory } from '../parser/expression-parser.js';
|
|
26
|
+
import { ValueExpression } from '../parser/value-parser.js';
|
|
26
27
|
export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
|
|
27
28
|
#private;
|
|
28
29
|
constructor(props: DeleteQueryBuilderProps);
|
|
@@ -325,8 +326,8 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
325
326
|
* .execute()
|
|
326
327
|
* ```
|
|
327
328
|
*/
|
|
328
|
-
where<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs:
|
|
329
|
-
where
|
|
329
|
+
where<RE extends ReferenceExpression<DB, TB>, VE extends OperandValueExpressionOrList<DB, TB, RE>>(lhs: RE, op: ComparisonOperatorExpression, rhs: VE): DeleteQueryBuilder<DB, TB, O>;
|
|
330
|
+
where<E extends ExpressionOrFactory<DB, TB, SqlBool>>(expression: E): DeleteQueryBuilder<DB, TB, O>;
|
|
330
331
|
/**
|
|
331
332
|
* Adds a `where` clause where both sides of the operator are references
|
|
332
333
|
* to columns.
|
|
@@ -378,7 +379,7 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
378
379
|
* ) as "pet_name"
|
|
379
380
|
* from "person"
|
|
380
381
|
*/
|
|
381
|
-
whereRef
|
|
382
|
+
whereRef<LRE extends ReferenceExpression<DB, TB>, RRE extends ReferenceExpression<DB, TB>>(lhs: LRE, op: ComparisonOperatorExpression, rhs: RRE): DeleteQueryBuilder<DB, TB, O>;
|
|
382
383
|
/**
|
|
383
384
|
* Clears all where expressions from the query.
|
|
384
385
|
*
|
|
@@ -814,7 +815,7 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
814
815
|
* .execute()
|
|
815
816
|
* ```
|
|
816
817
|
*/
|
|
817
|
-
limit(limit: number): DeleteQueryBuilder<DB, TB, O>;
|
|
818
|
+
limit(limit: ValueExpression<DB, TB, number>): DeleteQueryBuilder<DB, TB, O>;
|
|
818
819
|
/**
|
|
819
820
|
* Simply calls the provided function passing `this` as the only argument. `$call` returns
|
|
820
821
|
* what the provided function returns.
|
|
@@ -877,10 +878,10 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
877
878
|
/**
|
|
878
879
|
* Change the output type of the query.
|
|
879
880
|
*
|
|
880
|
-
*
|
|
881
|
-
*
|
|
881
|
+
* This method call doesn't change the SQL in any way. This methods simply
|
|
882
|
+
* returns a copy of this `DeleteQueryBuilder` with a new output type.
|
|
882
883
|
*/
|
|
883
|
-
$castTo<
|
|
884
|
+
$castTo<C>(): DeleteQueryBuilder<DB, TB, C>;
|
|
884
885
|
/**
|
|
885
886
|
* Narrows (parts of) the output type of the query.
|
|
886
887
|
*
|
|
@@ -11,6 +11,7 @@ import { DeleteQueryNode } from '../operation-node/delete-query-node.js';
|
|
|
11
11
|
import { LimitNode } from '../operation-node/limit-node.js';
|
|
12
12
|
import { parseOrderBy, } from '../parser/order-by-parser.js';
|
|
13
13
|
import { parseValueBinaryOperationOrExpression, parseReferentialBinaryOperation, } from '../parser/binary-operation-parser.js';
|
|
14
|
+
import { parseValueExpression, } from '../parser/value-parser.js';
|
|
14
15
|
export class DeleteQueryBuilder {
|
|
15
16
|
#props;
|
|
16
17
|
constructor(props) {
|
|
@@ -137,7 +138,7 @@ export class DeleteQueryBuilder {
|
|
|
137
138
|
limit(limit) {
|
|
138
139
|
return new DeleteQueryBuilder({
|
|
139
140
|
...this.#props,
|
|
140
|
-
queryNode: DeleteQueryNode.cloneWithLimit(this.#props.queryNode, LimitNode.create(limit)),
|
|
141
|
+
queryNode: DeleteQueryNode.cloneWithLimit(this.#props.queryNode, LimitNode.create(parseValueExpression(limit))),
|
|
141
142
|
});
|
|
142
143
|
}
|
|
143
144
|
/**
|
|
@@ -211,8 +212,8 @@ export class DeleteQueryBuilder {
|
|
|
211
212
|
/**
|
|
212
213
|
* Change the output type of the query.
|
|
213
214
|
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
215
|
+
* This method call doesn't change the SQL in any way. This methods simply
|
|
216
|
+
* returns a copy of this `DeleteQueryBuilder` with a new output type.
|
|
216
217
|
*/
|
|
217
218
|
$castTo() {
|
|
218
219
|
return new DeleteQueryBuilder(this.#props);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
|
|
2
1
|
import { ExpressionWrapper } from '../expression/expression-wrapper.js';
|
|
3
2
|
import { Expression } from '../expression/expression.js';
|
|
4
|
-
import {
|
|
3
|
+
import { ExtractTypeFromCoalesce1, ExtractTypeFromCoalesce3, ExtractTypeFromCoalesce2, ExtractTypeFromCoalesce4, ExtractTypeFromCoalesce5 } from '../parser/coalesce-parser.js';
|
|
5
4
|
import { ExtractTypeFromReferenceExpression, ReferenceExpression, StringReference, ExtractTypeFromStringReference } from '../parser/reference-parser.js';
|
|
6
5
|
import { KyselyTypeError } from '../util/type-error.js';
|
|
7
|
-
import {
|
|
6
|
+
import { IsNever } from '../util/type-utils.js';
|
|
8
7
|
import { AggregateFunctionBuilder } from './aggregate-function-builder.js';
|
|
9
8
|
import { SelectQueryBuilderExpression } from '../query-builder/select-query-builder-expression.js';
|
|
9
|
+
import { Selectable } from '../util/column-type.js';
|
|
10
10
|
/**
|
|
11
11
|
* Helpers for type safe SQL function calls.
|
|
12
12
|
*
|
|
@@ -17,21 +17,47 @@ import { SelectQueryBuilderExpression } from '../query-builder/select-query-buil
|
|
|
17
17
|
*
|
|
18
18
|
* <!-- siteExample("select", "Function calls", 60) -->
|
|
19
19
|
*
|
|
20
|
-
* This example
|
|
20
|
+
* This example shows how to create function calls. These examples also work in any
|
|
21
|
+
* other place (`where` calls, updates, inserts etc.). The only difference is that you
|
|
22
|
+
* leave out the alias (the `as` call) if you use these in any other place than `select`.
|
|
21
23
|
*
|
|
22
24
|
* ```ts
|
|
25
|
+
* import { sql } from 'kysely'
|
|
26
|
+
*
|
|
23
27
|
* const result = await db.selectFrom('person')
|
|
24
28
|
* .innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
25
|
-
* .select(({ fn }) => [
|
|
29
|
+
* .select(({ fn, val, ref }) => [
|
|
26
30
|
* 'person.id',
|
|
27
31
|
*
|
|
28
32
|
* // The `fn` module contains the most common
|
|
29
33
|
* // functions.
|
|
30
34
|
* fn.count<number>('pet.id').as('pet_count'),
|
|
31
35
|
*
|
|
32
|
-
* // You can call any function
|
|
33
|
-
* //
|
|
34
|
-
*
|
|
36
|
+
* // You can call any function by calling `fn`
|
|
37
|
+
* // directly. The arguments are treated as column
|
|
38
|
+
* // references by default. If you want to pass in
|
|
39
|
+
* // values, use the `val` function.
|
|
40
|
+
* fn<string>('concat', [
|
|
41
|
+
* val('Ms. '),
|
|
42
|
+
* 'first_name',
|
|
43
|
+
* val(' '),
|
|
44
|
+
* 'last_name'
|
|
45
|
+
* ]).as('full_name_with_title'),
|
|
46
|
+
*
|
|
47
|
+
* // You can call any aggregate function using the
|
|
48
|
+
* // `fn.agg` function.
|
|
49
|
+
* fn.agg<string[]>('array_agg', ['pet.name']).as('pet_names'),
|
|
50
|
+
*
|
|
51
|
+
* // And once again, you can use the `sql`
|
|
52
|
+
* // template tag. The template tag substitutions
|
|
53
|
+
* // are treated as values by default. If you want
|
|
54
|
+
* // to reference columns, you can use the `ref`
|
|
55
|
+
* // function.
|
|
56
|
+
* sql<string>`concat(
|
|
57
|
+
* ${ref('first_name')},
|
|
58
|
+
* ' ',
|
|
59
|
+
* ${ref('last_name')}
|
|
60
|
+
* )`.as('full_name')
|
|
35
61
|
* ])
|
|
36
62
|
* .groupBy('person.id')
|
|
37
63
|
* .having((eb) => eb.fn.count('pet.id'), '>', 10)
|
|
@@ -44,11 +70,13 @@ import { SelectQueryBuilderExpression } from '../query-builder/select-query-buil
|
|
|
44
70
|
* select
|
|
45
71
|
* "person"."id",
|
|
46
72
|
* count("pet"."id") as "pet_count",
|
|
47
|
-
*
|
|
73
|
+
* concat($1, "first_name", $2, "last_name") as "full_name_with_title",
|
|
74
|
+
* array_agg("pet"."name") as "pet_names",
|
|
75
|
+
* concat("first_name", ' ', "last_name") as "full_name"
|
|
48
76
|
* from "person"
|
|
49
77
|
* inner join "pet" on "pet"."owner_id" = "person"."id"
|
|
50
78
|
* group by "person"."id"
|
|
51
|
-
* having count("pet"."id") > $
|
|
79
|
+
* having count("pet"."id") > $3
|
|
52
80
|
* ```
|
|
53
81
|
*/
|
|
54
82
|
export interface FunctionModule<DB, TB extends keyof DB> {
|
|
@@ -81,7 +109,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
81
109
|
* .where(sql`upper(first_name)`, '=', 'JENNIFER')
|
|
82
110
|
* ```
|
|
83
111
|
*/
|
|
84
|
-
<
|
|
112
|
+
<O, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(name: string, args?: ReadonlyArray<RE>): ExpressionWrapper<DB, TB, O>;
|
|
85
113
|
/**
|
|
86
114
|
* Creates an aggregate function call.
|
|
87
115
|
*
|
|
@@ -110,7 +138,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
110
138
|
* from "person"
|
|
111
139
|
* ```
|
|
112
140
|
*/
|
|
113
|
-
agg<O>(name: string, args?: ReadonlyArray<
|
|
141
|
+
agg<O, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(name: string, args?: ReadonlyArray<RE>): AggregateFunctionBuilder<DB, TB, O>;
|
|
114
142
|
/**
|
|
115
143
|
* Calls the `avg` function for the column or expression given as the argument.
|
|
116
144
|
*
|
|
@@ -169,7 +197,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
169
197
|
* .execute()
|
|
170
198
|
* ```
|
|
171
199
|
*/
|
|
172
|
-
avg<O extends number | string | null = number | string,
|
|
200
|
+
avg<O extends number | string | null = number | string, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(expr: RE): AggregateFunctionBuilder<DB, TB, O>;
|
|
173
201
|
/**
|
|
174
202
|
* Calls the `coalesce` function for given arguments.
|
|
175
203
|
*
|
|
@@ -230,7 +258,11 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
230
258
|
* select coalesce(avg("age"), 0) as "avg_age" from "person" where "first_name" = $1
|
|
231
259
|
* ```
|
|
232
260
|
*/
|
|
233
|
-
coalesce<
|
|
261
|
+
coalesce<V1 extends ReferenceExpression<DB, TB>>(v1: V1): ExpressionWrapper<DB, TB, ExtractTypeFromCoalesce1<DB, TB, V1>>;
|
|
262
|
+
coalesce<V1 extends ReferenceExpression<DB, TB>, V2 extends ReferenceExpression<DB, TB>>(v1: V1, v2: V2): ExpressionWrapper<DB, TB, ExtractTypeFromCoalesce2<DB, TB, V1, V2>>;
|
|
263
|
+
coalesce<V1 extends ReferenceExpression<DB, TB>, V2 extends ReferenceExpression<DB, TB>, V3 extends ReferenceExpression<DB, TB>>(v1: V1, v2: V2, v3: V3): ExpressionWrapper<DB, TB, ExtractTypeFromCoalesce3<DB, TB, V1, V2, V3>>;
|
|
264
|
+
coalesce<V1 extends ReferenceExpression<DB, TB>, V2 extends ReferenceExpression<DB, TB>, V3 extends ReferenceExpression<DB, TB>, V4 extends ReferenceExpression<DB, TB>>(v1: V1, v2: V2, v3: V3, v4: V4): ExpressionWrapper<DB, TB, ExtractTypeFromCoalesce4<DB, TB, V1, V2, V3, V4>>;
|
|
265
|
+
coalesce<V1 extends ReferenceExpression<DB, TB>, V2 extends ReferenceExpression<DB, TB>, V3 extends ReferenceExpression<DB, TB>, V4 extends ReferenceExpression<DB, TB>, V5 extends ReferenceExpression<DB, TB>>(v1: V1, v2: V2, v3: V3, v4: V4, v5: V5): ExpressionWrapper<DB, TB, ExtractTypeFromCoalesce5<DB, TB, V1, V2, V3, V4, V5>>;
|
|
234
266
|
/**
|
|
235
267
|
* Calls the `count` function for the column or expression given as the argument.
|
|
236
268
|
*
|
|
@@ -281,7 +313,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
281
313
|
* .execute()
|
|
282
314
|
* ```
|
|
283
315
|
*/
|
|
284
|
-
count<O extends number | string | bigint,
|
|
316
|
+
count<O extends number | string | bigint, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(expr: RE): AggregateFunctionBuilder<DB, TB, O>;
|
|
285
317
|
/**
|
|
286
318
|
* Calls the `count` function with `*` or `table.*` as argument.
|
|
287
319
|
*
|
|
@@ -395,12 +427,11 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
395
427
|
*
|
|
396
428
|
* ```ts
|
|
397
429
|
* db.selectFrom('toy')
|
|
398
|
-
* .select((eb) => eb.fn.max<number | null
|
|
430
|
+
* .select((eb) => eb.fn.max<number | null>('price').as('max_price'))
|
|
399
431
|
* .execute()
|
|
400
432
|
* ```
|
|
401
433
|
*/
|
|
402
|
-
max<O extends number | string | bigint | null =
|
|
403
|
-
max<O extends number | string | bigint | null = number | string | bigint>(column: DynamicReferenceBuilder): AggregateFunctionBuilder<DB, TB, O>;
|
|
434
|
+
max<O extends number | string | bigint | null = never, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(expr: RE): AggregateFunctionBuilder<DB, TB, IsNever<O> extends true ? ExtractTypeFromReferenceExpression<DB, TB, RE, number | string | bigint> : O>;
|
|
404
435
|
/**
|
|
405
436
|
* Calls the `min` function for the column or expression given as the argument.
|
|
406
437
|
*
|
|
@@ -443,12 +474,11 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
443
474
|
*
|
|
444
475
|
* ```ts
|
|
445
476
|
* db.selectFrom('toy')
|
|
446
|
-
* .select((eb) => eb.fn.min<number | null
|
|
477
|
+
* .select((eb) => eb.fn.min<number | null>('price').as('min_price'))
|
|
447
478
|
* .execute()
|
|
448
479
|
* ```
|
|
449
480
|
*/
|
|
450
|
-
min<O extends number | string | bigint | null =
|
|
451
|
-
min<O extends number | string | bigint | null = number | string | bigint>(column: DynamicReferenceBuilder): AggregateFunctionBuilder<DB, TB, O>;
|
|
481
|
+
min<O extends number | string | bigint | null = never, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(expr: RE): AggregateFunctionBuilder<DB, TB, IsNever<O> extends true ? ExtractTypeFromReferenceExpression<DB, TB, RE, number | string | bigint> : O>;
|
|
452
482
|
/**
|
|
453
483
|
* Calls the `sum` function for the column or expression given as the argument.
|
|
454
484
|
*
|
|
@@ -507,7 +537,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
507
537
|
* .execute()
|
|
508
538
|
* ```
|
|
509
539
|
*/
|
|
510
|
-
sum<O extends number | string | bigint | null = number | string | bigint,
|
|
540
|
+
sum<O extends number | string | bigint | null = number | string | bigint, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(expr: RE): AggregateFunctionBuilder<DB, TB, O>;
|
|
511
541
|
/**
|
|
512
542
|
* Calls the `any` function for the column or expression given as the argument.
|
|
513
543
|
*
|
|
@@ -540,8 +570,49 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
540
570
|
any<RE extends StringReference<DB, TB>>(expr: RE): Exclude<ExtractTypeFromStringReference<DB, TB, RE>, null> extends ReadonlyArray<infer I> ? ExpressionWrapper<DB, TB, I> : KyselyTypeError<'any(expr) call failed: expr must be an array'>;
|
|
541
571
|
any<T>(subquery: SelectQueryBuilderExpression<Record<string, T>>): ExpressionWrapper<DB, TB, T>;
|
|
542
572
|
any<T>(expr: Expression<ReadonlyArray<T>>): ExpressionWrapper<DB, TB, T>;
|
|
573
|
+
/**
|
|
574
|
+
* Creates a json_agg function call.
|
|
575
|
+
*
|
|
576
|
+
* This function is only available on PostgreSQL.
|
|
577
|
+
*
|
|
578
|
+
* ```ts
|
|
579
|
+
* db.selectFrom('person')
|
|
580
|
+
* .innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
581
|
+
* .select((eb) => ['first_name', eb.fn.jsonAgg('pet').as('pets')])
|
|
582
|
+
* .groupBy('person.first_name')
|
|
583
|
+
* .execute()
|
|
584
|
+
* ```
|
|
585
|
+
*
|
|
586
|
+
* The generated SQL (PostgreSQL):
|
|
587
|
+
*
|
|
588
|
+
* ```sql
|
|
589
|
+
* select "first_name", json_agg("pet") as "pets"
|
|
590
|
+
* from "person"
|
|
591
|
+
* inner join "pet" on "pet"."owner_id" = "person"."id"
|
|
592
|
+
* group by "person"."first_name"
|
|
593
|
+
* ```
|
|
594
|
+
*/
|
|
595
|
+
jsonAgg<T extends (TB & string) | Expression<unknown>>(table: T): AggregateFunctionBuilder<DB, TB, T extends TB ? Selectable<DB[T]>[] : T extends Expression<infer O> ? O[] : never>;
|
|
596
|
+
/**
|
|
597
|
+
* Creates a to_json function call.
|
|
598
|
+
*
|
|
599
|
+
* This function is only available on PostgreSQL.
|
|
600
|
+
*
|
|
601
|
+
* ```ts
|
|
602
|
+
* db.selectFrom('person')
|
|
603
|
+
* .innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
604
|
+
* .select((eb) => ['first_name', eb.fn.toJson('pet').as('pet')])
|
|
605
|
+
* .execute()
|
|
606
|
+
* ```
|
|
607
|
+
*
|
|
608
|
+
* The generated SQL (PostgreSQL):
|
|
609
|
+
*
|
|
610
|
+
* ```sql
|
|
611
|
+
* select "first_name", to_json("pet") as "pet"
|
|
612
|
+
* from "person"
|
|
613
|
+
* inner join "pet" on "pet"."owner_id" = "person"."id"
|
|
614
|
+
* ```
|
|
615
|
+
*/
|
|
616
|
+
toJson<T extends (TB & string) | Expression<unknown>>(table: T): ExpressionWrapper<DB, TB, T extends TB ? Selectable<DB[T]> : T extends Expression<infer O> ? O : never>;
|
|
543
617
|
}
|
|
544
618
|
export declare function createFunctionModule<DB, TB extends keyof DB>(): FunctionModule<DB, TB>;
|
|
545
|
-
type OutputBoundStringReference<DB, TB extends keyof DB, C extends StringReference<DB, TB>, O> = IsAny<O> extends true ? C : Equals<ExtractTypeFromReferenceExpression<DB, TB, C> | null, O | null> extends true ? C : never;
|
|
546
|
-
type StringReferenceBoundAggregateFunctionBuilder<DB, TB extends keyof DB, C extends StringReference<DB, TB>, O> = AggregateFunctionBuilder<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, C> | (IsAny<O> extends true ? never : null extends O ? null : never)>;
|
|
547
|
-
export {};
|
|
@@ -5,9 +5,11 @@ import { FunctionNode } from '../operation-node/function-node.js';
|
|
|
5
5
|
import { parseReferenceExpressionOrList, } from '../parser/reference-parser.js';
|
|
6
6
|
import { parseSelectAll } from '../parser/select-parser.js';
|
|
7
7
|
import { AggregateFunctionBuilder } from './aggregate-function-builder.js';
|
|
8
|
+
import { isString } from '../util/object-utils.js';
|
|
9
|
+
import { parseTable } from '../parser/table-parser.js';
|
|
8
10
|
export function createFunctionModule() {
|
|
9
11
|
const fn = (name, args) => {
|
|
10
|
-
return new ExpressionWrapper(FunctionNode.create(name, parseReferenceExpressionOrList(args)));
|
|
12
|
+
return new ExpressionWrapper(FunctionNode.create(name, parseReferenceExpressionOrList(args ?? [])));
|
|
11
13
|
};
|
|
12
14
|
const agg = (name, args) => {
|
|
13
15
|
return new AggregateFunctionBuilder({
|
|
@@ -19,8 +21,8 @@ export function createFunctionModule() {
|
|
|
19
21
|
avg(column) {
|
|
20
22
|
return agg('avg', [column]);
|
|
21
23
|
},
|
|
22
|
-
coalesce(
|
|
23
|
-
return fn('coalesce',
|
|
24
|
+
coalesce(...values) {
|
|
25
|
+
return fn('coalesce', values);
|
|
24
26
|
},
|
|
25
27
|
count(column) {
|
|
26
28
|
return agg('count', [column]);
|
|
@@ -42,5 +44,17 @@ export function createFunctionModule() {
|
|
|
42
44
|
any(column) {
|
|
43
45
|
return fn('any', [column]);
|
|
44
46
|
},
|
|
47
|
+
jsonAgg(table) {
|
|
48
|
+
return new AggregateFunctionBuilder({
|
|
49
|
+
aggregateFunctionNode: AggregateFunctionNode.create('json_agg', [
|
|
50
|
+
isString(table) ? parseTable(table) : table.toOperationNode(),
|
|
51
|
+
]),
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
toJson(table) {
|
|
55
|
+
return new ExpressionWrapper(FunctionNode.create('to_json', [
|
|
56
|
+
isString(table) ? parseTable(table) : table.toOperationNode(),
|
|
57
|
+
]));
|
|
58
|
+
},
|
|
45
59
|
});
|
|
46
60
|
}
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
|
|
2
|
-
import { ExpressionOrFactory } from '../parser/expression-parser.js';
|
|
3
2
|
import { ReferenceExpression } from '../parser/reference-parser.js';
|
|
4
|
-
import { SqlBool } from '../util/type-utils.js';
|
|
5
3
|
export interface HavingInterface<DB, TB extends keyof DB> {
|
|
6
4
|
/**
|
|
7
5
|
* Just like {@link WhereInterface.where | where} but adds a `having` statement
|
|
8
6
|
* instead of a `where` statement.
|
|
9
7
|
*/
|
|
10
|
-
having<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs:
|
|
11
|
-
having(expression:
|
|
8
|
+
having<RE extends ReferenceExpression<DB, TB>, VE extends OperandValueExpressionOrList<DB, TB, RE>>(lhs: RE, op: ComparisonOperatorExpression, rhs: VE): HavingInterface<DB, TB>;
|
|
9
|
+
having<E>(expression: E): HavingInterface<DB, TB>;
|
|
12
10
|
/**
|
|
13
11
|
* Just like {@link WhereInterface.whereRef | whereRef} but adds a `having` statement
|
|
14
12
|
* instead of a `where` statement.
|
|
15
13
|
*/
|
|
16
|
-
havingRef
|
|
14
|
+
havingRef<LRE extends ReferenceExpression<DB, TB>, RRE extends ReferenceExpression<DB, TB>>(lhs: LRE, op: ComparisonOperatorExpression, rhs: RRE): HavingInterface<DB, TB>;
|
|
17
15
|
}
|