kysely 0.27.2 → 0.27.4
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/CONTRIBUTING.md +1 -1
- package/README.md +7 -7
- package/dist/cjs/dialect/database-introspector.d.ts +1 -0
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +2 -1
- package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
- package/dist/cjs/dialect/dialect-adapter.d.ts +5 -0
- package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +1 -5
- package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +46 -26
- package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/cjs/dialect/mssql/mssql-driver.js +95 -36
- package/dist/cjs/dialect/mssql/mssql-introspector.js +13 -2
- package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +3 -1
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/cjs/driver/database-connection.d.ts +4 -2
- package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
- package/dist/cjs/dynamic/dynamic.d.ts +1 -1
- package/dist/cjs/dynamic/dynamic.js +1 -1
- package/dist/cjs/expression/expression-builder.d.ts +31 -5
- package/dist/cjs/expression/expression-builder.js +7 -3
- package/dist/cjs/expression/expression.js +2 -3
- package/dist/cjs/helpers/mssql.js +3 -4
- package/dist/cjs/helpers/mysql.d.ts +3 -3
- package/dist/cjs/helpers/mysql.js +6 -7
- package/dist/cjs/helpers/postgres.d.ts +4 -4
- package/dist/cjs/helpers/postgres.js +7 -8
- package/dist/cjs/helpers/sqlite.js +3 -4
- package/dist/cjs/index.d.ts +31 -18
- package/dist/cjs/index.js +30 -17
- package/dist/cjs/kysely.d.ts +1 -1
- package/dist/cjs/kysely.js +3 -3
- package/dist/cjs/operation-node/add-index-node.js +1 -1
- package/dist/cjs/operation-node/alter-column-node.d.ts +1 -1
- package/dist/cjs/operation-node/case-node.d.ts +1 -1
- package/dist/cjs/operation-node/cast-node.d.ts +13 -0
- package/dist/cjs/operation-node/cast-node.js +19 -0
- package/dist/cjs/operation-node/column-definition-node.d.ts +2 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
- package/dist/cjs/operation-node/data-type-node.js +56 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +6 -0
- package/dist/cjs/operation-node/delete-query-node.js +12 -0
- package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
- package/dist/cjs/operation-node/fetch-node.js +19 -0
- package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -4
- package/dist/cjs/operation-node/having-node.d.ts +1 -1
- package/dist/cjs/operation-node/insert-query-node.d.ts +6 -1
- package/dist/cjs/operation-node/insert-query-node.js +5 -0
- package/dist/cjs/operation-node/join-node.d.ts +1 -1
- package/dist/cjs/operation-node/matched-node.d.ts +13 -0
- package/dist/cjs/operation-node/matched-node.js +19 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +27 -0
- package/dist/cjs/operation-node/merge-query-node.js +45 -0
- package/dist/cjs/operation-node/on-node.d.ts +1 -1
- package/dist/cjs/operation-node/operation-node-source.js +1 -2
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +12 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +62 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +12 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +6 -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 +8 -6
- package/dist/cjs/operation-node/output-node.d.ts +13 -0
- package/dist/cjs/operation-node/output-node.js +26 -0
- package/dist/cjs/operation-node/query-node.d.ts +17 -5
- package/dist/cjs/operation-node/query-node.js +24 -1
- package/dist/cjs/operation-node/select-query-node.d.ts +6 -0
- package/dist/cjs/operation-node/select-query-node.js +12 -0
- package/dist/cjs/operation-node/top-node.d.ts +14 -0
- package/dist/cjs/operation-node/top-node.js +19 -0
- package/dist/cjs/operation-node/update-query-node.d.ts +9 -1
- package/dist/cjs/operation-node/update-query-node.js +11 -0
- package/dist/cjs/operation-node/where-node.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.js +7 -8
- package/dist/cjs/parser/data-type-parser.js +8 -5
- package/dist/cjs/parser/default-value-parser.js +1 -2
- package/dist/cjs/parser/expression-parser.js +3 -4
- package/dist/cjs/parser/fetch-parser.d.ts +2 -0
- package/dist/cjs/parser/fetch-parser.js +17 -0
- package/dist/cjs/parser/group-by-parser.js +1 -2
- package/dist/cjs/parser/identifier-parser.js +1 -2
- package/dist/cjs/parser/insert-values-parser.d.ts +3 -3
- package/dist/cjs/parser/insert-values-parser.js +1 -2
- package/dist/cjs/parser/join-parser.js +1 -2
- package/dist/cjs/parser/merge-parser.d.ts +9 -0
- package/dist/cjs/parser/merge-parser.js +31 -0
- package/dist/cjs/parser/on-commit-action-parse.js +1 -2
- package/dist/cjs/parser/on-modify-action-parser.js +1 -2
- package/dist/cjs/parser/order-by-parser.js +3 -4
- package/dist/cjs/parser/parse-utils.js +4 -5
- package/dist/cjs/parser/partition-by-parser.js +1 -2
- package/dist/cjs/parser/reference-parser.js +8 -9
- package/dist/cjs/parser/returning-parser.d.ts +4 -3
- package/dist/cjs/parser/select-parser.js +2 -3
- package/dist/cjs/parser/set-operation-parser.js +1 -2
- package/dist/cjs/parser/table-parser.d.ts +4 -3
- package/dist/cjs/parser/table-parser.js +4 -5
- package/dist/cjs/parser/top-parser.d.ts +2 -0
- package/dist/cjs/parser/top-parser.js +19 -0
- package/dist/cjs/parser/unary-operation-parser.js +3 -4
- package/dist/cjs/parser/update-set-parser.js +2 -3
- package/dist/cjs/parser/value-parser.js +4 -5
- package/dist/cjs/parser/with-parser.js +1 -2
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +2 -2
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +2 -2
- package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +188 -5
- package/dist/cjs/query-builder/delete-query-builder.js +139 -5
- package/dist/cjs/query-builder/function-module.d.ts +5 -5
- package/dist/cjs/query-builder/function-module.js +1 -2
- package/dist/cjs/query-builder/insert-query-builder.d.ts +166 -10
- package/dist/cjs/query-builder/insert-query-builder.js +107 -10
- package/dist/cjs/query-builder/merge-query-builder.d.ts +721 -0
- package/dist/cjs/query-builder/merge-query-builder.js +547 -0
- package/dist/cjs/query-builder/merge-result.d.ts +4 -0
- package/dist/cjs/query-builder/merge-result.js +10 -0
- package/dist/cjs/query-builder/no-result-error.js +2 -2
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +2 -2
- package/dist/cjs/query-builder/output-interface.d.ts +95 -0
- package/dist/cjs/query-builder/output-interface.js +2 -0
- package/dist/cjs/query-builder/returning-interface.d.ts +2 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +177 -17
- package/dist/cjs/query-builder/select-query-builder.js +21 -2
- package/dist/cjs/query-builder/update-query-builder.d.ts +175 -10
- package/dist/cjs/query-builder/update-query-builder.js +119 -7
- package/dist/cjs/query-builder/update-result.d.ts +9 -0
- package/dist/cjs/query-builder/update-result.js +9 -0
- package/dist/cjs/query-builder/where-interface.d.ts +1 -1
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +12 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +118 -10
- package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
- package/dist/cjs/query-creator.d.ts +96 -5
- package/dist/cjs/query-creator.js +63 -1
- package/dist/cjs/raw-builder/raw-builder.js +1 -2
- package/dist/cjs/raw-builder/sql.d.ts +5 -5
- package/dist/cjs/schema/alter-column-builder.js +3 -0
- package/dist/cjs/schema/alter-table-add-index-builder.d.ts +1 -1
- package/dist/cjs/schema/alter-table-add-index-builder.js +7 -3
- package/dist/cjs/schema/alter-table-builder.js +1 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +18 -1
- package/dist/cjs/schema/column-definition-builder.js +22 -1
- package/dist/cjs/util/assert.js +2 -3
- package/dist/cjs/util/compilable.js +1 -2
- package/dist/cjs/util/infer-result.d.ts +2 -1
- package/dist/cjs/util/json-object-args.js +1 -2
- package/dist/cjs/util/log-once.js +1 -2
- package/dist/cjs/util/object-utils.js +38 -26
- package/dist/cjs/util/performance-now.js +1 -2
- package/dist/cjs/util/prevent-await.js +1 -2
- package/dist/cjs/util/query-id.js +1 -2
- package/dist/cjs/util/random-string.js +1 -2
- package/dist/cjs/util/require-all-props.js +1 -2
- package/dist/cjs/util/stack-trace-utils.js +1 -2
- package/dist/cjs/util/type-utils.d.ts +3 -2
- package/dist/esm/dialect/database-introspector.d.ts +1 -0
- package/dist/esm/dialect/dialect-adapter-base.d.ts +2 -1
- package/dist/esm/dialect/dialect-adapter-base.js +4 -1
- package/dist/esm/dialect/dialect-adapter.d.ts +5 -0
- package/dist/esm/dialect/mssql/mssql-adapter.d.ts +1 -5
- package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +46 -26
- package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/esm/dialect/mssql/mssql-driver.js +95 -36
- package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
- package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +3 -1
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/esm/driver/database-connection.d.ts +4 -2
- package/dist/esm/dynamic/dynamic.d.ts +1 -1
- package/dist/esm/dynamic/dynamic.js +1 -1
- package/dist/esm/expression/expression-builder.d.ts +31 -5
- package/dist/esm/expression/expression-builder.js +5 -0
- package/dist/esm/helpers/mysql.d.ts +3 -3
- package/dist/esm/helpers/mysql.js +3 -3
- package/dist/esm/helpers/postgres.d.ts +4 -4
- package/dist/esm/helpers/postgres.js +4 -4
- package/dist/esm/index.d.ts +31 -18
- package/dist/esm/index.js +30 -17
- package/dist/esm/kysely.d.ts +1 -1
- package/dist/esm/kysely.js +1 -1
- package/dist/esm/operation-node/add-index-node.js +1 -1
- package/dist/esm/operation-node/alter-column-node.d.ts +1 -1
- package/dist/esm/operation-node/case-node.d.ts +1 -1
- package/dist/esm/operation-node/cast-node.d.ts +13 -0
- package/dist/esm/operation-node/cast-node.js +17 -0
- package/dist/esm/operation-node/column-definition-node.d.ts +2 -0
- package/dist/esm/operation-node/data-type-node.d.ts +5 -1
- package/dist/esm/operation-node/data-type-node.js +55 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +6 -0
- package/dist/esm/operation-node/delete-query-node.js +12 -0
- package/dist/esm/operation-node/fetch-node.d.ts +15 -0
- package/dist/esm/operation-node/fetch-node.js +17 -0
- package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -4
- package/dist/esm/operation-node/having-node.d.ts +1 -1
- package/dist/esm/operation-node/insert-query-node.d.ts +6 -1
- package/dist/esm/operation-node/insert-query-node.js +5 -0
- package/dist/esm/operation-node/join-node.d.ts +1 -1
- package/dist/esm/operation-node/matched-node.d.ts +13 -0
- package/dist/esm/operation-node/matched-node.js +17 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +27 -0
- package/dist/esm/operation-node/merge-query-node.js +43 -0
- package/dist/esm/operation-node/on-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +12 -0
- package/dist/esm/operation-node/operation-node-transformer.js +62 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +12 -0
- package/dist/esm/operation-node/operation-node-visitor.js +6 -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/output-node.d.ts +13 -0
- package/dist/esm/operation-node/output-node.js +24 -0
- package/dist/esm/operation-node/query-node.d.ts +17 -5
- package/dist/esm/operation-node/query-node.js +24 -1
- package/dist/esm/operation-node/select-query-node.d.ts +6 -0
- package/dist/esm/operation-node/select-query-node.js +12 -0
- package/dist/esm/operation-node/top-node.d.ts +14 -0
- package/dist/esm/operation-node/top-node.js +17 -0
- package/dist/esm/operation-node/update-query-node.d.ts +9 -1
- package/dist/esm/operation-node/update-query-node.js +11 -0
- package/dist/esm/operation-node/where-node.d.ts +1 -1
- package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
- package/dist/esm/parser/binary-operation-parser.js +2 -2
- package/dist/esm/parser/data-type-parser.js +8 -4
- package/dist/esm/parser/fetch-parser.d.ts +2 -0
- package/dist/esm/parser/fetch-parser.js +15 -0
- package/dist/esm/parser/insert-values-parser.d.ts +3 -3
- package/dist/esm/parser/merge-parser.d.ts +9 -0
- package/dist/esm/parser/merge-parser.js +28 -0
- package/dist/esm/parser/returning-parser.d.ts +4 -3
- package/dist/esm/parser/table-parser.d.ts +4 -3
- package/dist/esm/parser/top-parser.d.ts +2 -0
- package/dist/esm/parser/top-parser.js +17 -0
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +2 -2
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +2 -2
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +188 -5
- package/dist/esm/query-builder/delete-query-builder.js +139 -5
- package/dist/esm/query-builder/function-module.d.ts +5 -5
- package/dist/esm/query-builder/insert-query-builder.d.ts +166 -10
- package/dist/esm/query-builder/insert-query-builder.js +107 -10
- package/dist/esm/query-builder/merge-query-builder.d.ts +721 -0
- package/dist/esm/query-builder/merge-query-builder.js +541 -0
- package/dist/esm/query-builder/merge-result.d.ts +4 -0
- package/dist/esm/query-builder/merge-result.js +7 -0
- package/dist/esm/query-builder/on-conflict-builder.d.ts +2 -2
- package/dist/esm/query-builder/output-interface.d.ts +95 -0
- package/dist/esm/query-builder/output-interface.js +2 -0
- package/dist/esm/query-builder/returning-interface.d.ts +2 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +177 -17
- package/dist/esm/query-builder/select-query-builder.js +20 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +175 -10
- package/dist/esm/query-builder/update-query-builder.js +119 -7
- package/dist/esm/query-builder/update-result.d.ts +9 -0
- package/dist/esm/query-builder/update-result.js +9 -0
- package/dist/esm/query-builder/where-interface.d.ts +1 -1
- package/dist/esm/query-compiler/default-query-compiler.d.ts +12 -0
- package/dist/esm/query-compiler/default-query-compiler.js +118 -10
- package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
- package/dist/esm/query-creator.d.ts +96 -5
- package/dist/esm/query-creator.js +64 -2
- package/dist/esm/raw-builder/sql.d.ts +5 -5
- package/dist/esm/schema/alter-column-builder.js +3 -0
- package/dist/esm/schema/alter-table-add-index-builder.d.ts +1 -1
- package/dist/esm/schema/alter-table-add-index-builder.js +8 -4
- package/dist/esm/schema/alter-table-builder.js +1 -2
- package/dist/esm/schema/column-definition-builder.d.ts +18 -1
- package/dist/esm/schema/column-definition-builder.js +22 -1
- package/dist/esm/util/infer-result.d.ts +2 -1
- package/dist/esm/util/object-utils.js +18 -5
- package/dist/esm/util/type-utils.d.ts +3 -2
- package/package.json +26 -24
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
/// <reference types="./merge-query-builder.d.ts" />
|
|
2
|
+
import { InsertQueryNode } from '../operation-node/insert-query-node.js';
|
|
3
|
+
import { MergeQueryNode } from '../operation-node/merge-query-node.js';
|
|
4
|
+
import { QueryNode } from '../operation-node/query-node.js';
|
|
5
|
+
import { UpdateQueryNode } from '../operation-node/update-query-node.js';
|
|
6
|
+
import { parseInsertExpression, } from '../parser/insert-values-parser.js';
|
|
7
|
+
import { parseJoin, } from '../parser/join-parser.js';
|
|
8
|
+
import { parseMergeThen, parseMergeWhen } from '../parser/merge-parser.js';
|
|
9
|
+
import { parseSelectAll, parseSelectArg } from '../parser/select-parser.js';
|
|
10
|
+
import { parseTop } from '../parser/top-parser.js';
|
|
11
|
+
import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
|
|
12
|
+
import { freeze } from '../util/object-utils.js';
|
|
13
|
+
import { preventAwait } from '../util/prevent-await.js';
|
|
14
|
+
import { MergeResult } from './merge-result.js';
|
|
15
|
+
import { NoResultError, isNoResultErrorConstructor, } from './no-result-error.js';
|
|
16
|
+
import { UpdateQueryBuilder } from './update-query-builder.js';
|
|
17
|
+
export class MergeQueryBuilder {
|
|
18
|
+
#props;
|
|
19
|
+
constructor(props) {
|
|
20
|
+
this.#props = freeze(props);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Changes a `merge into` query to an `merge top into` query.
|
|
24
|
+
*
|
|
25
|
+
* `top` clause is only supported by some dialects like MS SQL Server.
|
|
26
|
+
*
|
|
27
|
+
* ### Examples
|
|
28
|
+
*
|
|
29
|
+
* Affect 5 matched rows at most:
|
|
30
|
+
*
|
|
31
|
+
* ```ts
|
|
32
|
+
* await db.mergeInto('person')
|
|
33
|
+
* .top(5)
|
|
34
|
+
* .using('pet', 'person.id', 'pet.owner_id')
|
|
35
|
+
* .whenMatched()
|
|
36
|
+
* .thenDelete()
|
|
37
|
+
* .execute()
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* The generated SQL (MS SQL Server):
|
|
41
|
+
*
|
|
42
|
+
* ```sql
|
|
43
|
+
* merge top(5) into "person"
|
|
44
|
+
* using "pet" on "person"."id" = "pet"."owner_id"
|
|
45
|
+
* when matched then
|
|
46
|
+
* delete
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* Affect 50% of matched rows:
|
|
50
|
+
*
|
|
51
|
+
* ```ts
|
|
52
|
+
* await db.mergeInto('person')
|
|
53
|
+
* .top(50, 'percent')
|
|
54
|
+
* .using('pet', 'person.id', 'pet.owner_id')
|
|
55
|
+
* .whenMatched()
|
|
56
|
+
* .thenDelete()
|
|
57
|
+
* .execute()
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* The generated SQL (MS SQL Server):
|
|
61
|
+
*
|
|
62
|
+
* ```sql
|
|
63
|
+
* merge top(50) percent into "person"
|
|
64
|
+
* using "pet" on "person"."id" = "pet"."owner_id"
|
|
65
|
+
* when matched then
|
|
66
|
+
* delete
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
top(expression, modifiers) {
|
|
70
|
+
return new MergeQueryBuilder({
|
|
71
|
+
...this.#props,
|
|
72
|
+
queryNode: QueryNode.cloneWithTop(this.#props.queryNode, parseTop(expression, modifiers)),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
using(...args) {
|
|
76
|
+
return new WheneableMergeQueryBuilder({
|
|
77
|
+
...this.#props,
|
|
78
|
+
queryNode: MergeQueryNode.cloneWithUsing(this.#props.queryNode, parseJoin('Using', args)),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
output(args) {
|
|
82
|
+
return new MergeQueryBuilder({
|
|
83
|
+
...this.#props,
|
|
84
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
outputAll(table) {
|
|
88
|
+
return new MergeQueryBuilder({
|
|
89
|
+
...this.#props,
|
|
90
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
preventAwait(MergeQueryBuilder, "don't await MergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
|
|
95
|
+
export class WheneableMergeQueryBuilder {
|
|
96
|
+
#props;
|
|
97
|
+
constructor(props) {
|
|
98
|
+
this.#props = freeze(props);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* See {@link MergeQueryBuilder.top}.
|
|
102
|
+
*/
|
|
103
|
+
top(expression, modifiers) {
|
|
104
|
+
return new WheneableMergeQueryBuilder({
|
|
105
|
+
...this.#props,
|
|
106
|
+
queryNode: QueryNode.cloneWithTop(this.#props.queryNode, parseTop(expression, modifiers)),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Adds a simple `when matched` clause to the query.
|
|
111
|
+
*
|
|
112
|
+
* For a `when matched` clause with an `and` condition, see {@link whenMatchedAnd}.
|
|
113
|
+
*
|
|
114
|
+
* For a simple `when not matched` clause, see {@link whenNotMatched}.
|
|
115
|
+
*
|
|
116
|
+
* For a `when not matched` clause with an `and` condition, see {@link whenNotMatchedAnd}.
|
|
117
|
+
*
|
|
118
|
+
* ### Examples
|
|
119
|
+
*
|
|
120
|
+
* ```ts
|
|
121
|
+
* const result = await db.mergeInto('person')
|
|
122
|
+
* .using('pet', 'person.id', 'pet.owner_id')
|
|
123
|
+
* .whenMatched()
|
|
124
|
+
* .thenDelete()
|
|
125
|
+
* .execute()
|
|
126
|
+
* ```
|
|
127
|
+
*
|
|
128
|
+
* The generated SQL (PostgreSQL):
|
|
129
|
+
*
|
|
130
|
+
* ```sql
|
|
131
|
+
* merge into "person"
|
|
132
|
+
* using "pet" on "person"."id" = "pet"."owner_id"
|
|
133
|
+
* when matched then
|
|
134
|
+
* delete
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
whenMatched() {
|
|
138
|
+
return this.#whenMatched([]);
|
|
139
|
+
}
|
|
140
|
+
whenMatchedAnd(...args) {
|
|
141
|
+
return this.#whenMatched(args);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Adds the `when matched` clause to the query with an `and` condition. But unlike
|
|
145
|
+
* {@link whenMatchedAnd}, this method accepts a column reference as the 3rd argument.
|
|
146
|
+
*
|
|
147
|
+
* This method is similar to {@link SelectQueryBuilder.whereRef}, so see the documentation
|
|
148
|
+
* for that method for more examples.
|
|
149
|
+
*/
|
|
150
|
+
whenMatchedAndRef(lhs, op, rhs) {
|
|
151
|
+
return this.#whenMatched([lhs, op, rhs], true);
|
|
152
|
+
}
|
|
153
|
+
#whenMatched(args, refRight) {
|
|
154
|
+
return new MatchedThenableMergeQueryBuilder({
|
|
155
|
+
...this.#props,
|
|
156
|
+
queryNode: MergeQueryNode.cloneWithWhen(this.#props.queryNode, parseMergeWhen({ isMatched: true }, args, refRight)),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Adds a simple `when not matched` clause to the query.
|
|
161
|
+
*
|
|
162
|
+
* For a `when not matched` clause with an `and` condition, see {@link whenNotMatchedAnd}.
|
|
163
|
+
*
|
|
164
|
+
* For a simple `when matched` clause, see {@link whenMatched}.
|
|
165
|
+
*
|
|
166
|
+
* For a `when matched` clause with an `and` condition, see {@link whenMatchedAnd}.
|
|
167
|
+
*
|
|
168
|
+
* ### Examples
|
|
169
|
+
*
|
|
170
|
+
* ```ts
|
|
171
|
+
* const result = await db.mergeInto('person')
|
|
172
|
+
* .using('pet', 'person.id', 'pet.owner_id')
|
|
173
|
+
* .whenNotMatched()
|
|
174
|
+
* .thenInsertValues({
|
|
175
|
+
* first_name: 'John',
|
|
176
|
+
* last_name: 'Doe',
|
|
177
|
+
* })
|
|
178
|
+
* .execute()
|
|
179
|
+
* ```
|
|
180
|
+
*
|
|
181
|
+
* The generated SQL (PostgreSQL):
|
|
182
|
+
*
|
|
183
|
+
* ```sql
|
|
184
|
+
* merge into "person"
|
|
185
|
+
* using "pet" on "person"."id" = "pet"."owner_id"
|
|
186
|
+
* when not matched then
|
|
187
|
+
* insert ("first_name", "last_name") values ($1, $2)
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
whenNotMatched() {
|
|
191
|
+
return this.#whenNotMatched([]);
|
|
192
|
+
}
|
|
193
|
+
whenNotMatchedAnd(...args) {
|
|
194
|
+
return this.#whenNotMatched(args);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Adds the `when not matched` clause to the query with an `and` condition. But unlike
|
|
198
|
+
* {@link whenNotMatchedAnd}, this method accepts a column reference as the 3rd argument.
|
|
199
|
+
*
|
|
200
|
+
* Unlike {@link whenMatchedAndRef}, you cannot reference columns from the target table.
|
|
201
|
+
*
|
|
202
|
+
* This method is similar to {@link SelectQueryBuilder.whereRef}, so see the documentation
|
|
203
|
+
* for that method for more examples.
|
|
204
|
+
*/
|
|
205
|
+
whenNotMatchedAndRef(lhs, op, rhs) {
|
|
206
|
+
return this.#whenNotMatched([lhs, op, rhs], true);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Adds a simple `when not matched by source` clause to the query.
|
|
210
|
+
*
|
|
211
|
+
* Supported in MS SQL Server.
|
|
212
|
+
*
|
|
213
|
+
* Similar to {@link whenNotMatched}, but returns a {@link MatchedThenableMergeQueryBuilder}.
|
|
214
|
+
*/
|
|
215
|
+
whenNotMatchedBySource() {
|
|
216
|
+
return this.#whenNotMatched([], false, true);
|
|
217
|
+
}
|
|
218
|
+
whenNotMatchedBySourceAnd(...args) {
|
|
219
|
+
return this.#whenNotMatched(args, false, true);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Adds the `when not matched by source` clause to the query with an `and` condition.
|
|
223
|
+
*
|
|
224
|
+
* Similar to {@link whenNotMatchedAndRef}, but you can reference columns from
|
|
225
|
+
* the target table, and not from source table and returns a {@link MatchedThenableMergeQueryBuilder}.
|
|
226
|
+
*/
|
|
227
|
+
whenNotMatchedBySourceAndRef(lhs, op, rhs) {
|
|
228
|
+
return this.#whenNotMatched([lhs, op, rhs], true, true);
|
|
229
|
+
}
|
|
230
|
+
output(args) {
|
|
231
|
+
return new WheneableMergeQueryBuilder({
|
|
232
|
+
...this.#props,
|
|
233
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
outputAll(table) {
|
|
237
|
+
return new WheneableMergeQueryBuilder({
|
|
238
|
+
...this.#props,
|
|
239
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
#whenNotMatched(args, refRight = false, bySource = false) {
|
|
243
|
+
const props = {
|
|
244
|
+
...this.#props,
|
|
245
|
+
queryNode: MergeQueryNode.cloneWithWhen(this.#props.queryNode, parseMergeWhen({ isMatched: false, bySource }, args, refRight)),
|
|
246
|
+
};
|
|
247
|
+
const Builder = bySource
|
|
248
|
+
? MatchedThenableMergeQueryBuilder
|
|
249
|
+
: NotMatchedThenableMergeQueryBuilder;
|
|
250
|
+
return new Builder(props);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Simply calls the provided function passing `this` as the only argument. `$call` returns
|
|
254
|
+
* what the provided function returns.
|
|
255
|
+
*
|
|
256
|
+
* If you want to conditionally call a method on `this`, see
|
|
257
|
+
* the {@link $if} method.
|
|
258
|
+
*
|
|
259
|
+
* ### Examples
|
|
260
|
+
*
|
|
261
|
+
* The next example uses a helper function `log` to log a query:
|
|
262
|
+
*
|
|
263
|
+
* ```ts
|
|
264
|
+
* function log<T extends Compilable>(qb: T): T {
|
|
265
|
+
* console.log(qb.compile())
|
|
266
|
+
* return qb
|
|
267
|
+
* }
|
|
268
|
+
*
|
|
269
|
+
* db.updateTable('person')
|
|
270
|
+
* .set(values)
|
|
271
|
+
* .$call(log)
|
|
272
|
+
* .execute()
|
|
273
|
+
* ```
|
|
274
|
+
*/
|
|
275
|
+
$call(func) {
|
|
276
|
+
return func(this);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Call `func(this)` if `condition` is true.
|
|
280
|
+
*
|
|
281
|
+
* This method is especially handy with optional selects. Any `returning` or `returningAll`
|
|
282
|
+
* method calls add columns as optional fields to the output type when called inside
|
|
283
|
+
* the `func` callback. This is because we can't know if those selections were actually
|
|
284
|
+
* made before running the code.
|
|
285
|
+
*
|
|
286
|
+
* You can also call any other methods inside the callback.
|
|
287
|
+
*
|
|
288
|
+
* ### Examples
|
|
289
|
+
*
|
|
290
|
+
* ```ts
|
|
291
|
+
* async function updatePerson(id: number, updates: UpdateablePerson, returnLastName: boolean) {
|
|
292
|
+
* return await db
|
|
293
|
+
* .updateTable('person')
|
|
294
|
+
* .set(updates)
|
|
295
|
+
* .where('id', '=', id)
|
|
296
|
+
* .returning(['id', 'first_name'])
|
|
297
|
+
* .$if(returnLastName, (qb) => qb.returning('last_name'))
|
|
298
|
+
* .executeTakeFirstOrThrow()
|
|
299
|
+
* }
|
|
300
|
+
* ```
|
|
301
|
+
*
|
|
302
|
+
* Any selections added inside the `if` callback will be added as optional fields to the
|
|
303
|
+
* output type since we can't know if the selections were actually made before running
|
|
304
|
+
* the code. In the example above the return type of the `updatePerson` function is:
|
|
305
|
+
*
|
|
306
|
+
* ```ts
|
|
307
|
+
* {
|
|
308
|
+
* id: number
|
|
309
|
+
* first_name: string
|
|
310
|
+
* last_name?: string
|
|
311
|
+
* }
|
|
312
|
+
* ```
|
|
313
|
+
*/
|
|
314
|
+
$if(condition, func) {
|
|
315
|
+
if (condition) {
|
|
316
|
+
return func(this);
|
|
317
|
+
}
|
|
318
|
+
return new WheneableMergeQueryBuilder({
|
|
319
|
+
...this.#props,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
toOperationNode() {
|
|
323
|
+
return this.#props.executor.transformQuery(this.#props.queryNode, this.#props.queryId);
|
|
324
|
+
}
|
|
325
|
+
compile() {
|
|
326
|
+
return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Executes the query and returns an array of rows.
|
|
330
|
+
*
|
|
331
|
+
* Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods.
|
|
332
|
+
*/
|
|
333
|
+
async execute() {
|
|
334
|
+
const compiledQuery = this.compile();
|
|
335
|
+
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
336
|
+
if (compiledQuery.query.output &&
|
|
337
|
+
this.#props.executor.adapter.supportsOutput) {
|
|
338
|
+
return result.rows;
|
|
339
|
+
}
|
|
340
|
+
return [new MergeResult(result.numAffectedRows)];
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Executes the query and returns the first result or undefined if
|
|
344
|
+
* the query returned no result.
|
|
345
|
+
*/
|
|
346
|
+
async executeTakeFirst() {
|
|
347
|
+
const [result] = await this.execute();
|
|
348
|
+
return result;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Executes the query and returns the first result or throws if
|
|
352
|
+
* the query returned no result.
|
|
353
|
+
*
|
|
354
|
+
* By default an instance of {@link NoResultError} is thrown, but you can
|
|
355
|
+
* provide a custom error class, or callback as the only argument to throw a different
|
|
356
|
+
* error.
|
|
357
|
+
*/
|
|
358
|
+
async executeTakeFirstOrThrow(errorConstructor = NoResultError) {
|
|
359
|
+
const result = await this.executeTakeFirst();
|
|
360
|
+
if (result === undefined) {
|
|
361
|
+
const error = isNoResultErrorConstructor(errorConstructor)
|
|
362
|
+
? new errorConstructor(this.toOperationNode())
|
|
363
|
+
: errorConstructor(this.toOperationNode());
|
|
364
|
+
throw error;
|
|
365
|
+
}
|
|
366
|
+
return result;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
preventAwait(WheneableMergeQueryBuilder, "don't await WheneableMergeQueryBuilder instances directly. To execute the query you need to call `execute`.");
|
|
370
|
+
export class MatchedThenableMergeQueryBuilder {
|
|
371
|
+
#props;
|
|
372
|
+
constructor(props) {
|
|
373
|
+
this.#props = freeze(props);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Performs the `delete` action.
|
|
377
|
+
*
|
|
378
|
+
* To perform the `do nothing` action, see {@link thenDoNothing}.
|
|
379
|
+
*
|
|
380
|
+
* To perform the `update` action, see {@link thenUpdate} or {@link thenUpdateSet}.
|
|
381
|
+
*
|
|
382
|
+
* ### Examples
|
|
383
|
+
*
|
|
384
|
+
* ```ts
|
|
385
|
+
* const result = await db.mergeInto('person')
|
|
386
|
+
* .using('pet', 'person.id', 'pet.owner_id')
|
|
387
|
+
* .whenMatched()
|
|
388
|
+
* .thenDelete()
|
|
389
|
+
* .execute()
|
|
390
|
+
* ```
|
|
391
|
+
*
|
|
392
|
+
* The generated SQL (PostgreSQL):
|
|
393
|
+
*
|
|
394
|
+
* ```sql
|
|
395
|
+
* merge into "person"
|
|
396
|
+
* using "pet" on "person"."id" = "pet"."owner_id"
|
|
397
|
+
* when matched then
|
|
398
|
+
* delete
|
|
399
|
+
* ```
|
|
400
|
+
*/
|
|
401
|
+
thenDelete() {
|
|
402
|
+
return new WheneableMergeQueryBuilder({
|
|
403
|
+
...this.#props,
|
|
404
|
+
queryNode: MergeQueryNode.cloneWithThen(this.#props.queryNode, parseMergeThen('delete')),
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Performs the `do nothing` action.
|
|
409
|
+
*
|
|
410
|
+
* This is supported in PostgreSQL.
|
|
411
|
+
*
|
|
412
|
+
* To perform the `delete` action, see {@link thenDelete}.
|
|
413
|
+
*
|
|
414
|
+
* To perform the `update` action, see {@link thenUpdate} or {@link thenUpdateSet}.
|
|
415
|
+
*
|
|
416
|
+
* ### Examples
|
|
417
|
+
*
|
|
418
|
+
* ```ts
|
|
419
|
+
* const result = await db.mergeInto('person')
|
|
420
|
+
* .using('pet', 'person.id', 'pet.owner_id')
|
|
421
|
+
* .whenMatched()
|
|
422
|
+
* .thenDoNothing()
|
|
423
|
+
* .execute()
|
|
424
|
+
* ```
|
|
425
|
+
*
|
|
426
|
+
* The generated SQL (PostgreSQL):
|
|
427
|
+
*
|
|
428
|
+
* ```sql
|
|
429
|
+
* merge into "person"
|
|
430
|
+
* using "pet" on "person"."id" = "pet"."owner_id"
|
|
431
|
+
* when matched then
|
|
432
|
+
* do nothing
|
|
433
|
+
* ```
|
|
434
|
+
*/
|
|
435
|
+
thenDoNothing() {
|
|
436
|
+
return new WheneableMergeQueryBuilder({
|
|
437
|
+
...this.#props,
|
|
438
|
+
queryNode: MergeQueryNode.cloneWithThen(this.#props.queryNode, parseMergeThen('do nothing')),
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Perform an `update` operation with a full-fledged {@link UpdateQueryBuilder}.
|
|
443
|
+
* This is handy when multiple `set` invocations are needed.
|
|
444
|
+
*
|
|
445
|
+
* For a shorthand version of this method, see {@link thenUpdateSet}.
|
|
446
|
+
*
|
|
447
|
+
* To perform the `delete` action, see {@link thenDelete}.
|
|
448
|
+
*
|
|
449
|
+
* To perform the `do nothing` action, see {@link thenDoNothing}.
|
|
450
|
+
*
|
|
451
|
+
* ### Examples
|
|
452
|
+
*
|
|
453
|
+
* ```ts
|
|
454
|
+
* import { sql } from 'kysely'
|
|
455
|
+
*
|
|
456
|
+
* const result = await db.mergeInto('person')
|
|
457
|
+
* .using('pet', 'person.id', 'pet.owner_id')
|
|
458
|
+
* .whenMatched()
|
|
459
|
+
* .thenUpdate((ub) => ub
|
|
460
|
+
* .set(sql`metadata['has_pets']`, 'Y')
|
|
461
|
+
* .set({
|
|
462
|
+
* updated_at: Date.now(),
|
|
463
|
+
* })
|
|
464
|
+
* )
|
|
465
|
+
* .execute()
|
|
466
|
+
* ```
|
|
467
|
+
*
|
|
468
|
+
* The generated SQL (PostgreSQL):
|
|
469
|
+
*
|
|
470
|
+
* ```sql
|
|
471
|
+
* merge into "person"
|
|
472
|
+
* using "pet" on "person"."id" = "pet"."owner_id"
|
|
473
|
+
* when matched then
|
|
474
|
+
* update set metadata['has_pets'] = $1, "updated_at" = $2
|
|
475
|
+
* ```
|
|
476
|
+
*/
|
|
477
|
+
thenUpdate(set) {
|
|
478
|
+
return new WheneableMergeQueryBuilder({
|
|
479
|
+
...this.#props,
|
|
480
|
+
queryNode: MergeQueryNode.cloneWithThen(this.#props.queryNode, parseMergeThen(set(new UpdateQueryBuilder({
|
|
481
|
+
queryId: this.#props.queryId,
|
|
482
|
+
executor: NOOP_QUERY_EXECUTOR,
|
|
483
|
+
queryNode: UpdateQueryNode.createWithoutTable(),
|
|
484
|
+
})))),
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
thenUpdateSet(...args) {
|
|
488
|
+
// @ts-ignore not sure how to type this so it won't complain about set(...args).
|
|
489
|
+
return this.thenUpdate((ub) => ub.set(...args));
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
preventAwait(MatchedThenableMergeQueryBuilder, "don't await MatchedThenableMergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
|
|
493
|
+
export class NotMatchedThenableMergeQueryBuilder {
|
|
494
|
+
#props;
|
|
495
|
+
constructor(props) {
|
|
496
|
+
this.#props = freeze(props);
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Performs the `do nothing` action.
|
|
500
|
+
*
|
|
501
|
+
* This is supported in PostgreSQL.
|
|
502
|
+
*
|
|
503
|
+
* To perform the `insert` action, see {@link thenInsertValues}.
|
|
504
|
+
*
|
|
505
|
+
* ### Examples
|
|
506
|
+
*
|
|
507
|
+
* ```ts
|
|
508
|
+
* const result = await db.mergeInto('person')
|
|
509
|
+
* .using('pet', 'person.id', 'pet.owner_id')
|
|
510
|
+
* .whenNotMatched()
|
|
511
|
+
* .thenDoNothing()
|
|
512
|
+
* .execute()
|
|
513
|
+
* ```
|
|
514
|
+
*
|
|
515
|
+
* The generated SQL (PostgreSQL):
|
|
516
|
+
*
|
|
517
|
+
* ```sql
|
|
518
|
+
* merge into "person"
|
|
519
|
+
* using "pet" on "person"."id" = "pet"."owner_id"
|
|
520
|
+
* when not matched then
|
|
521
|
+
* do nothing
|
|
522
|
+
* ```
|
|
523
|
+
*/
|
|
524
|
+
thenDoNothing() {
|
|
525
|
+
return new WheneableMergeQueryBuilder({
|
|
526
|
+
...this.#props,
|
|
527
|
+
queryNode: MergeQueryNode.cloneWithThen(this.#props.queryNode, parseMergeThen('do nothing')),
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
thenInsertValues(insert) {
|
|
531
|
+
const [columns, values] = parseInsertExpression(insert);
|
|
532
|
+
return new WheneableMergeQueryBuilder({
|
|
533
|
+
...this.#props,
|
|
534
|
+
queryNode: MergeQueryNode.cloneWithThen(this.#props.queryNode, parseMergeThen(InsertQueryNode.cloneWith(InsertQueryNode.createWithoutInto(), {
|
|
535
|
+
columns,
|
|
536
|
+
values,
|
|
537
|
+
}))),
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
preventAwait(NotMatchedThenableMergeQueryBuilder, "don't await NotMatchedThenableMergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
|
|
@@ -303,7 +303,7 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
|
|
|
303
303
|
* .selectFrom('person')
|
|
304
304
|
* .selectAll()
|
|
305
305
|
* .where(
|
|
306
|
-
* sql
|
|
306
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
307
307
|
* 'like',
|
|
308
308
|
* '%' + name + '%',
|
|
309
309
|
* )
|
|
@@ -767,7 +767,7 @@ export declare class OnConflictUpdateBuilder<DB, TB extends keyof DB> implements
|
|
|
767
767
|
* .selectFrom('person')
|
|
768
768
|
* .selectAll()
|
|
769
769
|
* .where(
|
|
770
|
-
* sql
|
|
770
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
771
771
|
* 'like',
|
|
772
772
|
* '%' + name + '%',
|
|
773
773
|
* )
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { ExpressionBuilder } from '../expression/expression-builder.js';
|
|
2
|
+
import { AliasedExpressionOrFactory } from '../parser/expression-parser.js';
|
|
3
|
+
import { ReturningAllRow, ReturningRow } from '../parser/returning-parser.js';
|
|
4
|
+
import { AnyAliasedColumnWithTable, AnyColumnWithTable } from '../util/type-utils.js';
|
|
5
|
+
export interface OutputInterface<DB, TB extends keyof DB, O, OP extends OutputPrefix = OutputPrefix> {
|
|
6
|
+
/**
|
|
7
|
+
* Allows you to return data from modified rows.
|
|
8
|
+
*
|
|
9
|
+
* On supported databases like MS SQL Server (MSSQL), this method can be chained
|
|
10
|
+
* to `insert`, `update`, `delete` and `merge` queries to return data.
|
|
11
|
+
*
|
|
12
|
+
* Also see the {@link outputAll} method.
|
|
13
|
+
*
|
|
14
|
+
* ### Examples
|
|
15
|
+
*
|
|
16
|
+
* Return one column:
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* const { id } = await db
|
|
20
|
+
* .insertInto('person')
|
|
21
|
+
* .output('inserted.id')
|
|
22
|
+
* .values({
|
|
23
|
+
* first_name: 'Jennifer',
|
|
24
|
+
* last_name: 'Aniston'
|
|
25
|
+
* })
|
|
26
|
+
* .executeTakeFirst()
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* Return multiple columns:
|
|
30
|
+
*
|
|
31
|
+
* ```ts
|
|
32
|
+
* const { id, first_name } = await db
|
|
33
|
+
* .updateTable('person')
|
|
34
|
+
* .set({ first_name: 'John', last_name: 'Doe' })
|
|
35
|
+
* .output([
|
|
36
|
+
* 'deleted.first_name as old_first_name',
|
|
37
|
+
* 'deleted.last_name as old_last_name',
|
|
38
|
+
* 'inserted.first_name as new_first_name',
|
|
39
|
+
* 'inserted.last_name as new_last_name',
|
|
40
|
+
* ])
|
|
41
|
+
* .where('created_at', '<', new Date())
|
|
42
|
+
* .executeTakeFirst()
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* Return arbitrary expressions:
|
|
46
|
+
*
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { sql } from 'kysely'
|
|
49
|
+
*
|
|
50
|
+
* const { id, full_name } = await db
|
|
51
|
+
* .deleteFrom('person')
|
|
52
|
+
* .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
|
|
53
|
+
* .where('created_at', '<', new Date())
|
|
54
|
+
* .executeTakeFirst()
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* Return the action performed on the row:
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* await db
|
|
61
|
+
* .mergeInto('person')
|
|
62
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
63
|
+
* .whenMatched()
|
|
64
|
+
* .thenDelete()
|
|
65
|
+
* .whenNotMatched()
|
|
66
|
+
* .thenInsertValues({
|
|
67
|
+
* first_name: 'John',
|
|
68
|
+
* last_name: 'Doe',
|
|
69
|
+
* gender: 'male'
|
|
70
|
+
* })
|
|
71
|
+
* .output([
|
|
72
|
+
* 'inserted.id as inserted_id',
|
|
73
|
+
* 'deleted.id as deleted_id',
|
|
74
|
+
* ])
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
output<OE extends OutputExpression<DB, TB, OP>>(selections: ReadonlyArray<OE>): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>, OP>;
|
|
78
|
+
output<CB extends OutputCallback<DB, TB, OP>>(callback: CB): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>, OP>;
|
|
79
|
+
output<OE extends OutputExpression<DB, TB, OP>>(selection: OE): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>, OP>;
|
|
80
|
+
/**
|
|
81
|
+
* Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
|
|
82
|
+
* that support `output` such as MS SQL Server (MSSQL).
|
|
83
|
+
*
|
|
84
|
+
* Also see the {@link output} method.
|
|
85
|
+
*/
|
|
86
|
+
outputAll(table: OP): OutputInterface<DB, TB, ReturningAllRow<DB, TB, O>, OP>;
|
|
87
|
+
}
|
|
88
|
+
export type OutputPrefix = 'deleted' | 'inserted';
|
|
89
|
+
export type OutputDatabase<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix> = {
|
|
90
|
+
[K in OP]: DB[TB];
|
|
91
|
+
};
|
|
92
|
+
export type OutputExpression<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix, ODB = OutputDatabase<DB, TB, OP>, OTB extends keyof ODB = keyof ODB> = AnyAliasedColumnWithTable<ODB, OTB> | AnyColumnWithTable<ODB, OTB> | AliasedExpressionOrFactory<ODB, OTB>;
|
|
93
|
+
export type OutputCallback<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix> = (eb: ExpressionBuilder<OutputDatabase<DB, TB, OP>, OP>) => ReadonlyArray<OutputExpression<DB, TB, OP>>;
|
|
94
|
+
export type SelectExpressionFromOutputExpression<OE> = OE extends `${OutputPrefix}.${infer C}` ? C : OE;
|
|
95
|
+
export type SelectExpressionFromOutputCallback<CB> = CB extends (eb: ExpressionBuilder<any, any>) => ReadonlyArray<infer OE> ? SelectExpressionFromOutputExpression<OE> : never;
|
|
@@ -67,6 +67,8 @@ export interface ReturningInterface<DB, TB extends keyof DB, O> {
|
|
|
67
67
|
/**
|
|
68
68
|
* Adds a `returning *` to an insert/update/delete query on databases
|
|
69
69
|
* that support `returning` such as PostgreSQL.
|
|
70
|
+
*
|
|
71
|
+
* Also see the {@link returning} method.
|
|
70
72
|
*/
|
|
71
73
|
returningAll(): ReturningInterface<DB, TB, Selectable<DB[TB]>>;
|
|
72
74
|
}
|