kysely 0.27.3 → 0.27.5
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/.renovaterc.json +3 -0
- package/CONTRIBUTING.md +2 -2
- package/README.md +7 -7
- package/deno.check.d.ts +86 -0
- package/deno.check.json +21 -0
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +13 -3
- package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
- package/dist/cjs/dialect/dialect-adapter.d.ts +16 -2
- package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +12 -7
- package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +83 -55
- package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/cjs/dialect/mssql/mssql-driver.js +114 -48
- package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +11 -2
- package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +4 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +3 -0
- package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +11 -2
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +10 -3
- package/dist/cjs/dialect/postgres/postgres-driver.js +3 -0
- package/dist/cjs/dialect/postgres/postgres-introspector.js +5 -1
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +11 -2
- package/dist/cjs/driver/database-connection.d.ts +3 -1
- package/dist/cjs/driver/dummy-driver.d.ts +13 -12
- package/dist/cjs/driver/dummy-driver.js +13 -12
- package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
- package/dist/cjs/dynamic/dynamic.d.ts +7 -7
- package/dist/cjs/dynamic/dynamic.js +7 -7
- package/dist/cjs/expression/expression-builder.d.ts +153 -62
- package/dist/cjs/expression/expression-builder.js +2 -3
- package/dist/cjs/expression/expression-wrapper.d.ts +92 -23
- package/dist/cjs/expression/expression.d.ts +40 -5
- package/dist/cjs/expression/expression.js +2 -3
- package/dist/cjs/helpers/mssql.d.ts +74 -14
- package/dist/cjs/helpers/mssql.js +77 -18
- package/dist/cjs/helpers/mysql.d.ts +17 -13
- package/dist/cjs/helpers/mysql.js +20 -17
- package/dist/cjs/helpers/postgres.d.ts +11 -8
- package/dist/cjs/helpers/postgres.js +14 -12
- package/dist/cjs/helpers/sqlite.d.ts +41 -16
- package/dist/cjs/helpers/sqlite.js +44 -20
- package/dist/cjs/index.d.ts +28 -21
- package/dist/cjs/index.js +28 -21
- package/dist/cjs/kysely.d.ts +100 -42
- package/dist/cjs/kysely.js +63 -39
- package/dist/cjs/migration/file-migration-provider.d.ts +2 -2
- package/dist/cjs/migration/file-migration-provider.js +2 -2
- package/dist/cjs/migration/migrator.d.ts +82 -14
- package/dist/cjs/migration/migrator.js +82 -14
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +4 -0
- package/dist/cjs/operation-node/aggregate-function-node.js +9 -0
- 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/column-definition-node.d.ts +1 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +2 -2
- package/dist/cjs/operation-node/data-type-node.js +17 -3
- package/dist/cjs/operation-node/delete-query-node.d.ts +3 -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 +3 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +3 -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 +11 -3
- package/dist/cjs/operation-node/operation-node-transformer.js +26 -3
- 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 +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 +15 -6
- package/dist/cjs/operation-node/query-node.js +17 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +1 -1
- package/dist/cjs/operation-node/select-query-node.js +6 -8
- package/dist/cjs/operation-node/update-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/where-node.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.js +5 -6
- package/dist/cjs/parser/data-type-parser.js +1 -2
- 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.js +1 -2
- 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.js +1 -2
- package/dist/cjs/parser/join-parser.js +1 -2
- package/dist/cjs/parser/merge-parser.js +2 -3
- 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.js +4 -5
- package/dist/cjs/parser/top-parser.js +1 -2
- 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 +54 -27
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +26 -21
- package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
- package/dist/cjs/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
- package/dist/cjs/plugin/kysely-plugin.d.ts +28 -6
- package/dist/cjs/plugin/noop-plugin.d.ts +28 -6
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +80 -9
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +53 -14
- package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +28 -6
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +43 -1
- package/dist/cjs/query-builder/aggregate-function-builder.js +30 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +219 -43
- package/dist/cjs/query-builder/delete-query-builder.js +95 -31
- package/dist/cjs/query-builder/function-module.d.ts +40 -93
- package/dist/cjs/query-builder/function-module.js +1 -2
- package/dist/cjs/query-builder/insert-query-builder.d.ts +326 -67
- package/dist/cjs/query-builder/insert-query-builder.js +212 -61
- package/dist/cjs/query-builder/insert-result.d.ts +10 -5
- package/dist/cjs/query-builder/insert-result.js +10 -5
- package/dist/cjs/query-builder/json-path-builder.d.ts +33 -9
- package/dist/cjs/query-builder/json-path-builder.js +8 -5
- package/dist/cjs/query-builder/merge-query-builder.d.ts +312 -10
- package/dist/cjs/query-builder/merge-query-builder.js +98 -7
- package/dist/cjs/query-builder/no-result-error.js +2 -2
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +53 -20
- package/dist/cjs/query-builder/on-conflict-builder.js +41 -16
- package/dist/cjs/query-builder/output-interface.d.ts +138 -0
- package/dist/cjs/query-builder/output-interface.js +2 -0
- package/dist/cjs/query-builder/returning-interface.d.ts +7 -5
- package/dist/cjs/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +370 -73
- package/dist/cjs/query-builder/select-query-builder.js +14 -9
- package/dist/cjs/query-builder/update-query-builder.d.ts +225 -31
- package/dist/cjs/query-builder/update-query-builder.js +96 -17
- 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 +6 -2
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +45 -1
- package/dist/cjs/query-creator.d.ts +122 -21
- package/dist/cjs/query-creator.js +56 -3
- package/dist/cjs/raw-builder/raw-builder.d.ts +29 -7
- package/dist/cjs/raw-builder/raw-builder.js +1 -2
- package/dist/cjs/raw-builder/sql.d.ts +31 -12
- package/dist/cjs/schema/alter-column-builder.d.ts +17 -3
- package/dist/cjs/schema/alter-column-builder.js +20 -3
- package/dist/cjs/schema/alter-table-add-index-builder.d.ts +44 -10
- package/dist/cjs/schema/alter-table-add-index-builder.js +27 -10
- package/dist/cjs/schema/alter-table-builder.js +1 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +286 -24
- package/dist/cjs/schema/column-definition-builder.js +288 -24
- package/dist/cjs/schema/create-table-builder.d.ts +86 -33
- package/dist/cjs/schema/create-table-builder.js +86 -33
- package/dist/cjs/util/assert.js +2 -3
- package/dist/cjs/util/column-type.d.ts +5 -9
- package/dist/cjs/util/compilable.js +1 -2
- 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.d.ts +4 -2
- package/dist/cjs/util/require-all-props.js +5 -4
- package/dist/cjs/util/stack-trace-utils.js +1 -2
- package/dist/cjs/util/streamable.d.ts +1 -1
- package/dist/cjs/util/type-utils.d.ts +4 -2
- package/dist/esm/dialect/dialect-adapter-base.d.ts +13 -3
- package/dist/esm/dialect/dialect-adapter-base.js +4 -1
- package/dist/esm/dialect/dialect-adapter.d.ts +16 -2
- package/dist/esm/dialect/mssql/mssql-adapter.d.ts +12 -7
- package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +83 -55
- package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/esm/dialect/mssql/mssql-driver.js +114 -48
- package/dist/esm/dialect/mysql/mysql-adapter.d.ts +11 -2
- package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +4 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +3 -0
- package/dist/esm/dialect/postgres/postgres-adapter.d.ts +11 -2
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +10 -3
- package/dist/esm/dialect/postgres/postgres-driver.js +3 -0
- package/dist/esm/dialect/postgres/postgres-introspector.js +5 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +11 -2
- package/dist/esm/driver/database-connection.d.ts +3 -1
- package/dist/esm/driver/dummy-driver.d.ts +13 -12
- package/dist/esm/driver/dummy-driver.js +13 -12
- package/dist/esm/dynamic/dynamic.d.ts +7 -7
- package/dist/esm/dynamic/dynamic.js +7 -7
- package/dist/esm/expression/expression-builder.d.ts +153 -62
- package/dist/esm/expression/expression-wrapper.d.ts +92 -23
- package/dist/esm/expression/expression.d.ts +40 -5
- package/dist/esm/helpers/mssql.d.ts +74 -14
- package/dist/esm/helpers/mssql.js +74 -14
- package/dist/esm/helpers/mysql.d.ts +17 -13
- package/dist/esm/helpers/mysql.js +17 -13
- package/dist/esm/helpers/postgres.d.ts +11 -8
- package/dist/esm/helpers/postgres.js +11 -8
- package/dist/esm/helpers/sqlite.d.ts +41 -16
- package/dist/esm/helpers/sqlite.js +41 -16
- package/dist/esm/index.d.ts +28 -21
- package/dist/esm/index.js +28 -21
- package/dist/esm/kysely.d.ts +100 -42
- package/dist/esm/kysely.js +61 -37
- package/dist/esm/migration/file-migration-provider.d.ts +2 -2
- package/dist/esm/migration/file-migration-provider.js +2 -2
- package/dist/esm/migration/migrator.d.ts +82 -14
- package/dist/esm/migration/migrator.js +82 -14
- package/dist/esm/operation-node/aggregate-function-node.d.ts +4 -0
- package/dist/esm/operation-node/aggregate-function-node.js +9 -0
- 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/column-definition-node.d.ts +1 -0
- package/dist/esm/operation-node/data-type-node.d.ts +2 -2
- package/dist/esm/operation-node/data-type-node.js +15 -1
- package/dist/esm/operation-node/delete-query-node.d.ts +3 -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 +3 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +3 -0
- package/dist/esm/operation-node/on-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +11 -3
- package/dist/esm/operation-node/operation-node-transformer.js +26 -3
- 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/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 +15 -6
- package/dist/esm/operation-node/query-node.js +17 -0
- package/dist/esm/operation-node/select-query-node.d.ts +1 -1
- package/dist/esm/operation-node/select-query-node.js +6 -8
- package/dist/esm/operation-node/update-query-node.d.ts +3 -0
- package/dist/esm/operation-node/where-node.d.ts +1 -1
- package/dist/esm/parser/returning-parser.d.ts +4 -3
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +54 -27
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +26 -21
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
- package/dist/esm/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
- package/dist/esm/plugin/kysely-plugin.d.ts +28 -6
- package/dist/esm/plugin/noop-plugin.d.ts +28 -6
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +80 -9
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +53 -14
- package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +28 -6
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +43 -1
- package/dist/esm/query-builder/aggregate-function-builder.js +30 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +219 -43
- package/dist/esm/query-builder/delete-query-builder.js +95 -31
- package/dist/esm/query-builder/function-module.d.ts +40 -93
- package/dist/esm/query-builder/insert-query-builder.d.ts +326 -67
- package/dist/esm/query-builder/insert-query-builder.js +212 -61
- package/dist/esm/query-builder/insert-result.d.ts +10 -5
- package/dist/esm/query-builder/insert-result.js +10 -5
- package/dist/esm/query-builder/json-path-builder.d.ts +33 -9
- package/dist/esm/query-builder/json-path-builder.js +8 -5
- package/dist/esm/query-builder/merge-query-builder.d.ts +312 -10
- package/dist/esm/query-builder/merge-query-builder.js +98 -7
- package/dist/esm/query-builder/on-conflict-builder.d.ts +53 -20
- package/dist/esm/query-builder/on-conflict-builder.js +41 -16
- package/dist/esm/query-builder/output-interface.d.ts +138 -0
- package/dist/esm/query-builder/output-interface.js +2 -0
- package/dist/esm/query-builder/returning-interface.d.ts +7 -5
- package/dist/esm/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +370 -73
- package/dist/esm/query-builder/select-query-builder.js +13 -7
- package/dist/esm/query-builder/update-query-builder.d.ts +225 -31
- package/dist/esm/query-builder/update-query-builder.js +96 -17
- 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 +6 -2
- package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/esm/query-compiler/default-query-compiler.js +45 -1
- package/dist/esm/query-creator.d.ts +122 -21
- package/dist/esm/query-creator.js +56 -3
- package/dist/esm/raw-builder/raw-builder.d.ts +29 -7
- package/dist/esm/raw-builder/sql.d.ts +31 -12
- package/dist/esm/schema/alter-column-builder.d.ts +17 -3
- package/dist/esm/schema/alter-column-builder.js +20 -3
- package/dist/esm/schema/alter-table-add-index-builder.d.ts +44 -10
- package/dist/esm/schema/alter-table-add-index-builder.js +27 -10
- package/dist/esm/schema/alter-table-builder.js +1 -2
- package/dist/esm/schema/column-definition-builder.d.ts +286 -24
- package/dist/esm/schema/column-definition-builder.js +288 -24
- package/dist/esm/schema/create-table-builder.d.ts +86 -33
- package/dist/esm/schema/create-table-builder.js +86 -33
- package/dist/esm/util/column-type.d.ts +5 -9
- package/dist/esm/util/object-utils.js +18 -5
- package/dist/esm/util/require-all-props.d.ts +4 -2
- package/dist/esm/util/require-all-props.js +4 -2
- package/dist/esm/util/streamable.d.ts +1 -1
- package/dist/esm/util/type-utils.d.ts +4 -2
- package/package.json +30 -24
|
@@ -8,6 +8,7 @@ const update_query_node_js_1 = require("../operation-node/update-query-node.js")
|
|
|
8
8
|
const insert_values_parser_js_1 = require("../parser/insert-values-parser.js");
|
|
9
9
|
const join_parser_js_1 = require("../parser/join-parser.js");
|
|
10
10
|
const merge_parser_js_1 = require("../parser/merge-parser.js");
|
|
11
|
+
const select_parser_js_1 = require("../parser/select-parser.js");
|
|
11
12
|
const top_parser_js_1 = require("../parser/top-parser.js");
|
|
12
13
|
const noop_query_executor_js_1 = require("../query-executor/noop-query-executor.js");
|
|
13
14
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
@@ -20,6 +21,35 @@ class MergeQueryBuilder {
|
|
|
20
21
|
constructor(props) {
|
|
21
22
|
this.#props = (0, object_utils_js_1.freeze)(props);
|
|
22
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
26
|
+
*
|
|
27
|
+
* ### Examples
|
|
28
|
+
*
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { sql } from 'kysely'
|
|
31
|
+
*
|
|
32
|
+
* await db
|
|
33
|
+
* .mergeInto('person')
|
|
34
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
35
|
+
* .whenMatched()
|
|
36
|
+
* .thenDelete()
|
|
37
|
+
* .modifyEnd(sql.raw('-- this is a comment'))
|
|
38
|
+
* .execute()
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* The generated SQL (PostgreSQL):
|
|
42
|
+
*
|
|
43
|
+
* ```sql
|
|
44
|
+
* merge into "person" using "pet" on "pet"."owner_id" = "person"."id" when matched then delete -- this is a comment
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
modifyEnd(modifier) {
|
|
48
|
+
return new MergeQueryBuilder({
|
|
49
|
+
...this.#props,
|
|
50
|
+
queryNode: query_node_js_1.QueryNode.cloneWithEndModifier(this.#props.queryNode, modifier.toOperationNode()),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
23
53
|
/**
|
|
24
54
|
* Changes a `merge into` query to an `merge top into` query.
|
|
25
55
|
*
|
|
@@ -79,6 +109,18 @@ class MergeQueryBuilder {
|
|
|
79
109
|
queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithUsing(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('Using', args)),
|
|
80
110
|
});
|
|
81
111
|
}
|
|
112
|
+
output(args) {
|
|
113
|
+
return new MergeQueryBuilder({
|
|
114
|
+
...this.#props,
|
|
115
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
outputAll(table) {
|
|
119
|
+
return new MergeQueryBuilder({
|
|
120
|
+
...this.#props,
|
|
121
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
82
124
|
}
|
|
83
125
|
exports.MergeQueryBuilder = MergeQueryBuilder;
|
|
84
126
|
(0, prevent_await_js_1.preventAwait)(MergeQueryBuilder, "don't await MergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
|
|
@@ -87,6 +129,35 @@ class WheneableMergeQueryBuilder {
|
|
|
87
129
|
constructor(props) {
|
|
88
130
|
this.#props = (0, object_utils_js_1.freeze)(props);
|
|
89
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
134
|
+
*
|
|
135
|
+
* ### Examples
|
|
136
|
+
*
|
|
137
|
+
* ```ts
|
|
138
|
+
* import { sql } from 'kysely'
|
|
139
|
+
*
|
|
140
|
+
* await db
|
|
141
|
+
* .mergeInto('person')
|
|
142
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
143
|
+
* .whenMatched()
|
|
144
|
+
* .thenDelete()
|
|
145
|
+
* .modifyEnd(sql.raw('-- this is a comment'))
|
|
146
|
+
* .execute()
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* The generated SQL (PostgreSQL):
|
|
150
|
+
*
|
|
151
|
+
* ```sql
|
|
152
|
+
* merge into "person" using "pet" on "pet"."owner_id" = "person"."id" when matched then delete -- this is a comment
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
modifyEnd(modifier) {
|
|
156
|
+
return new WheneableMergeQueryBuilder({
|
|
157
|
+
...this.#props,
|
|
158
|
+
queryNode: query_node_js_1.QueryNode.cloneWithEndModifier(this.#props.queryNode, modifier.toOperationNode()),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
90
161
|
/**
|
|
91
162
|
* See {@link MergeQueryBuilder.top}.
|
|
92
163
|
*/
|
|
@@ -217,6 +288,18 @@ class WheneableMergeQueryBuilder {
|
|
|
217
288
|
whenNotMatchedBySourceAndRef(lhs, op, rhs) {
|
|
218
289
|
return this.#whenNotMatched([lhs, op, rhs], true, true);
|
|
219
290
|
}
|
|
291
|
+
output(args) {
|
|
292
|
+
return new WheneableMergeQueryBuilder({
|
|
293
|
+
...this.#props,
|
|
294
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
outputAll(table) {
|
|
298
|
+
return new WheneableMergeQueryBuilder({
|
|
299
|
+
...this.#props,
|
|
300
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
|
|
301
|
+
});
|
|
302
|
+
}
|
|
220
303
|
#whenNotMatched(args, refRight = false, bySource = false) {
|
|
221
304
|
const props = {
|
|
222
305
|
...this.#props,
|
|
@@ -239,13 +322,15 @@ class WheneableMergeQueryBuilder {
|
|
|
239
322
|
* The next example uses a helper function `log` to log a query:
|
|
240
323
|
*
|
|
241
324
|
* ```ts
|
|
325
|
+
* import type { Compilable } from 'kysely'
|
|
326
|
+
*
|
|
242
327
|
* function log<T extends Compilable>(qb: T): T {
|
|
243
328
|
* console.log(qb.compile())
|
|
244
329
|
* return qb
|
|
245
330
|
* }
|
|
246
331
|
*
|
|
247
|
-
* db.updateTable('person')
|
|
248
|
-
* .set(
|
|
332
|
+
* await db.updateTable('person')
|
|
333
|
+
* .set({ first_name: 'John' })
|
|
249
334
|
* .$call(log)
|
|
250
335
|
* .execute()
|
|
251
336
|
* ```
|
|
@@ -266,7 +351,9 @@ class WheneableMergeQueryBuilder {
|
|
|
266
351
|
* ### Examples
|
|
267
352
|
*
|
|
268
353
|
* ```ts
|
|
269
|
-
*
|
|
354
|
+
* import type { PersonUpdate } from 'type-editor' // imaginary module
|
|
355
|
+
*
|
|
356
|
+
* async function updatePerson(id: number, updates: PersonUpdate, returnLastName: boolean) {
|
|
270
357
|
* return await db
|
|
271
358
|
* .updateTable('person')
|
|
272
359
|
* .set(updates)
|
|
@@ -282,11 +369,11 @@ class WheneableMergeQueryBuilder {
|
|
|
282
369
|
* the code. In the example above the return type of the `updatePerson` function is:
|
|
283
370
|
*
|
|
284
371
|
* ```ts
|
|
285
|
-
* {
|
|
372
|
+
* Promise<{
|
|
286
373
|
* id: number
|
|
287
374
|
* first_name: string
|
|
288
375
|
* last_name?: string
|
|
289
|
-
* }
|
|
376
|
+
* }>
|
|
290
377
|
* ```
|
|
291
378
|
*/
|
|
292
379
|
$if(condition, func) {
|
|
@@ -301,7 +388,7 @@ class WheneableMergeQueryBuilder {
|
|
|
301
388
|
return this.#props.executor.transformQuery(this.#props.queryNode, this.#props.queryId);
|
|
302
389
|
}
|
|
303
390
|
compile() {
|
|
304
|
-
return this.#props.executor.compileQuery(this
|
|
391
|
+
return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
|
|
305
392
|
}
|
|
306
393
|
/**
|
|
307
394
|
* Executes the query and returns an array of rows.
|
|
@@ -311,6 +398,10 @@ class WheneableMergeQueryBuilder {
|
|
|
311
398
|
async execute() {
|
|
312
399
|
const compiledQuery = this.compile();
|
|
313
400
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
401
|
+
if (compiledQuery.query.output &&
|
|
402
|
+
this.#props.executor.adapter.supportsOutput) {
|
|
403
|
+
return result.rows;
|
|
404
|
+
}
|
|
314
405
|
return [new merge_result_js_1.MergeResult(result.numAffectedRows)];
|
|
315
406
|
}
|
|
316
407
|
/**
|
|
@@ -434,7 +525,7 @@ class MatchedThenableMergeQueryBuilder {
|
|
|
434
525
|
* .thenUpdate((ub) => ub
|
|
435
526
|
* .set(sql`metadata['has_pets']`, 'Y')
|
|
436
527
|
* .set({
|
|
437
|
-
* updated_at: Date.
|
|
528
|
+
* updated_at: new Date().toISOString(),
|
|
438
529
|
* })
|
|
439
530
|
* )
|
|
440
531
|
* .execute()
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.NoResultError = void 0;
|
|
4
|
+
exports.isNoResultErrorConstructor = isNoResultErrorConstructor;
|
|
4
5
|
class NoResultError extends Error {
|
|
5
6
|
/**
|
|
6
7
|
* The operation node tree of the query that was executed.
|
|
@@ -15,4 +16,3 @@ exports.NoResultError = NoResultError;
|
|
|
15
16
|
function isNoResultErrorConstructor(fn) {
|
|
16
17
|
return Object.prototype.hasOwnProperty.call(fn, 'prototype');
|
|
17
18
|
}
|
|
18
|
-
exports.isNoResultErrorConstructor = isNoResultErrorConstructor;
|
|
@@ -73,6 +73,8 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
|
|
|
73
73
|
* you can always use:
|
|
74
74
|
*
|
|
75
75
|
* ```ts
|
|
76
|
+
* import { sql } from 'kysely'
|
|
77
|
+
*
|
|
76
78
|
* sql`your operator`
|
|
77
79
|
* ```
|
|
78
80
|
*
|
|
@@ -84,7 +86,7 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
|
|
|
84
86
|
* const persons = await db
|
|
85
87
|
* .selectFrom('person')
|
|
86
88
|
* .selectAll()
|
|
87
|
-
* .where('id', 'in', [
|
|
89
|
+
* .where('id', 'in', [1, 2, 3])
|
|
88
90
|
* .execute()
|
|
89
91
|
* ```
|
|
90
92
|
*
|
|
@@ -303,7 +305,7 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
|
|
|
303
305
|
* .selectFrom('person')
|
|
304
306
|
* .selectAll()
|
|
305
307
|
* .where(
|
|
306
|
-
* sql
|
|
308
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
307
309
|
* 'like',
|
|
308
310
|
* '%' + name + '%',
|
|
309
311
|
* )
|
|
@@ -332,6 +334,8 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
|
|
|
332
334
|
* import { sql } from 'kysely'
|
|
333
335
|
* const { ref } = db.dynamic
|
|
334
336
|
*
|
|
337
|
+
* const columnFromUserInput: string = 'id'
|
|
338
|
+
*
|
|
335
339
|
* const persons = await db
|
|
336
340
|
* .selectFrom('person')
|
|
337
341
|
* .selectAll()
|
|
@@ -419,21 +423,25 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
|
|
|
419
423
|
* ### Examples
|
|
420
424
|
*
|
|
421
425
|
* ```ts
|
|
426
|
+
* const id = 1
|
|
427
|
+
* const first_name = 'John'
|
|
428
|
+
*
|
|
422
429
|
* await db
|
|
423
430
|
* .insertInto('person')
|
|
424
|
-
* .values({ first_name,
|
|
431
|
+
* .values({ first_name, id })
|
|
425
432
|
* .onConflict((oc) => oc
|
|
426
|
-
* .column('
|
|
433
|
+
* .column('id')
|
|
427
434
|
* .doNothing()
|
|
428
435
|
* )
|
|
436
|
+
* .execute()
|
|
429
437
|
* ```
|
|
430
438
|
*
|
|
431
439
|
* The generated SQL (PostgreSQL):
|
|
432
440
|
*
|
|
433
441
|
* ```sql
|
|
434
|
-
* insert into "person" ("first_name", "
|
|
442
|
+
* insert into "person" ("first_name", "id")
|
|
435
443
|
* values ($1, $2)
|
|
436
|
-
* on conflict ("
|
|
444
|
+
* on conflict ("id") do nothing
|
|
437
445
|
* ```
|
|
438
446
|
*/
|
|
439
447
|
doNothing(): OnConflictDoNothingBuilder<DB, TB>;
|
|
@@ -443,21 +451,25 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
|
|
|
443
451
|
* ### Examples
|
|
444
452
|
*
|
|
445
453
|
* ```ts
|
|
454
|
+
* const id = 1
|
|
455
|
+
* const first_name = 'John'
|
|
456
|
+
*
|
|
446
457
|
* await db
|
|
447
458
|
* .insertInto('person')
|
|
448
|
-
* .values({ first_name,
|
|
459
|
+
* .values({ first_name, id })
|
|
449
460
|
* .onConflict((oc) => oc
|
|
450
|
-
* .column('
|
|
461
|
+
* .column('id')
|
|
451
462
|
* .doUpdateSet({ first_name })
|
|
452
463
|
* )
|
|
464
|
+
* .execute()
|
|
453
465
|
* ```
|
|
454
466
|
*
|
|
455
467
|
* The generated SQL (PostgreSQL):
|
|
456
468
|
*
|
|
457
469
|
* ```sql
|
|
458
|
-
* insert into "person" ("first_name", "
|
|
470
|
+
* insert into "person" ("first_name", "id")
|
|
459
471
|
* values ($1, $2)
|
|
460
|
-
* on conflict ("
|
|
472
|
+
* on conflict ("id")
|
|
461
473
|
* do update set "first_name" = $3
|
|
462
474
|
* ```
|
|
463
475
|
*
|
|
@@ -466,15 +478,32 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
|
|
|
466
478
|
* to create an upsert operation:
|
|
467
479
|
*
|
|
468
480
|
* ```ts
|
|
469
|
-
*
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
* .
|
|
474
|
-
*
|
|
475
|
-
*
|
|
476
|
-
*
|
|
481
|
+
* import type { NewPerson } from 'type-editor' // imaginary module
|
|
482
|
+
*
|
|
483
|
+
* async function upsertPerson(person: NewPerson): Promise<void> {
|
|
484
|
+
* await db.insertInto('person')
|
|
485
|
+
* .values(person)
|
|
486
|
+
* .onConflict((oc) => oc
|
|
487
|
+
* .column('id')
|
|
488
|
+
* .doUpdateSet((eb) => ({
|
|
489
|
+
* first_name: eb.ref('excluded.first_name'),
|
|
490
|
+
* last_name: eb.ref('excluded.last_name')
|
|
491
|
+
* })
|
|
492
|
+
* )
|
|
477
493
|
* )
|
|
494
|
+
* .execute()
|
|
495
|
+
* }
|
|
496
|
+
* ```
|
|
497
|
+
*
|
|
498
|
+
* The generated SQL (PostgreSQL):
|
|
499
|
+
*
|
|
500
|
+
* ```sql
|
|
501
|
+
* insert into "person" ("first_name", "last_name")
|
|
502
|
+
* values ($1, $2)
|
|
503
|
+
* on conflict ("id")
|
|
504
|
+
* do update set
|
|
505
|
+
* "first_name" = excluded."first_name",
|
|
506
|
+
* "last_name" = excluded."last_name"
|
|
478
507
|
* ```
|
|
479
508
|
*/
|
|
480
509
|
doUpdateSet(update: UpdateObjectExpression<OnConflictDatabase<DB, TB>, OnConflictTables<TB>, OnConflictTables<TB>>): OnConflictUpdateBuilder<OnConflictDatabase<DB, TB>, OnConflictTables<TB>>;
|
|
@@ -537,6 +566,8 @@ export declare class OnConflictUpdateBuilder<DB, TB extends keyof DB> implements
|
|
|
537
566
|
* you can always use:
|
|
538
567
|
*
|
|
539
568
|
* ```ts
|
|
569
|
+
* import { sql } from 'kysely'
|
|
570
|
+
*
|
|
540
571
|
* sql`your operator`
|
|
541
572
|
* ```
|
|
542
573
|
*
|
|
@@ -548,7 +579,7 @@ export declare class OnConflictUpdateBuilder<DB, TB extends keyof DB> implements
|
|
|
548
579
|
* const persons = await db
|
|
549
580
|
* .selectFrom('person')
|
|
550
581
|
* .selectAll()
|
|
551
|
-
* .where('id', 'in', [
|
|
582
|
+
* .where('id', 'in', [1, 2, 3])
|
|
552
583
|
* .execute()
|
|
553
584
|
* ```
|
|
554
585
|
*
|
|
@@ -767,7 +798,7 @@ export declare class OnConflictUpdateBuilder<DB, TB extends keyof DB> implements
|
|
|
767
798
|
* .selectFrom('person')
|
|
768
799
|
* .selectAll()
|
|
769
800
|
* .where(
|
|
770
|
-
* sql
|
|
801
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
771
802
|
* 'like',
|
|
772
803
|
* '%' + name + '%',
|
|
773
804
|
* )
|
|
@@ -796,6 +827,8 @@ export declare class OnConflictUpdateBuilder<DB, TB extends keyof DB> implements
|
|
|
796
827
|
* import { sql } from 'kysely'
|
|
797
828
|
* const { ref } = db.dynamic
|
|
798
829
|
*
|
|
830
|
+
* const columnFromUserInput: string = 'id'
|
|
831
|
+
*
|
|
799
832
|
* const persons = await db
|
|
800
833
|
* .selectFrom('person')
|
|
801
834
|
* .selectAll()
|
|
@@ -101,21 +101,25 @@ class OnConflictBuilder {
|
|
|
101
101
|
* ### Examples
|
|
102
102
|
*
|
|
103
103
|
* ```ts
|
|
104
|
+
* const id = 1
|
|
105
|
+
* const first_name = 'John'
|
|
106
|
+
*
|
|
104
107
|
* await db
|
|
105
108
|
* .insertInto('person')
|
|
106
|
-
* .values({ first_name,
|
|
109
|
+
* .values({ first_name, id })
|
|
107
110
|
* .onConflict((oc) => oc
|
|
108
|
-
* .column('
|
|
111
|
+
* .column('id')
|
|
109
112
|
* .doNothing()
|
|
110
113
|
* )
|
|
114
|
+
* .execute()
|
|
111
115
|
* ```
|
|
112
116
|
*
|
|
113
117
|
* The generated SQL (PostgreSQL):
|
|
114
118
|
*
|
|
115
119
|
* ```sql
|
|
116
|
-
* insert into "person" ("first_name", "
|
|
120
|
+
* insert into "person" ("first_name", "id")
|
|
117
121
|
* values ($1, $2)
|
|
118
|
-
* on conflict ("
|
|
122
|
+
* on conflict ("id") do nothing
|
|
119
123
|
* ```
|
|
120
124
|
*/
|
|
121
125
|
doNothing() {
|
|
@@ -132,21 +136,25 @@ class OnConflictBuilder {
|
|
|
132
136
|
* ### Examples
|
|
133
137
|
*
|
|
134
138
|
* ```ts
|
|
139
|
+
* const id = 1
|
|
140
|
+
* const first_name = 'John'
|
|
141
|
+
*
|
|
135
142
|
* await db
|
|
136
143
|
* .insertInto('person')
|
|
137
|
-
* .values({ first_name,
|
|
144
|
+
* .values({ first_name, id })
|
|
138
145
|
* .onConflict((oc) => oc
|
|
139
|
-
* .column('
|
|
146
|
+
* .column('id')
|
|
140
147
|
* .doUpdateSet({ first_name })
|
|
141
148
|
* )
|
|
149
|
+
* .execute()
|
|
142
150
|
* ```
|
|
143
151
|
*
|
|
144
152
|
* The generated SQL (PostgreSQL):
|
|
145
153
|
*
|
|
146
154
|
* ```sql
|
|
147
|
-
* insert into "person" ("first_name", "
|
|
155
|
+
* insert into "person" ("first_name", "id")
|
|
148
156
|
* values ($1, $2)
|
|
149
|
-
* on conflict ("
|
|
157
|
+
* on conflict ("id")
|
|
150
158
|
* do update set "first_name" = $3
|
|
151
159
|
* ```
|
|
152
160
|
*
|
|
@@ -155,15 +163,32 @@ class OnConflictBuilder {
|
|
|
155
163
|
* to create an upsert operation:
|
|
156
164
|
*
|
|
157
165
|
* ```ts
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
* .
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
+
* import type { NewPerson } from 'type-editor' // imaginary module
|
|
167
|
+
*
|
|
168
|
+
* async function upsertPerson(person: NewPerson): Promise<void> {
|
|
169
|
+
* await db.insertInto('person')
|
|
170
|
+
* .values(person)
|
|
171
|
+
* .onConflict((oc) => oc
|
|
172
|
+
* .column('id')
|
|
173
|
+
* .doUpdateSet((eb) => ({
|
|
174
|
+
* first_name: eb.ref('excluded.first_name'),
|
|
175
|
+
* last_name: eb.ref('excluded.last_name')
|
|
176
|
+
* })
|
|
177
|
+
* )
|
|
166
178
|
* )
|
|
179
|
+
* .execute()
|
|
180
|
+
* }
|
|
181
|
+
* ```
|
|
182
|
+
*
|
|
183
|
+
* The generated SQL (PostgreSQL):
|
|
184
|
+
*
|
|
185
|
+
* ```sql
|
|
186
|
+
* insert into "person" ("first_name", "last_name")
|
|
187
|
+
* values ($1, $2)
|
|
188
|
+
* on conflict ("id")
|
|
189
|
+
* do update set
|
|
190
|
+
* "first_name" = excluded."first_name",
|
|
191
|
+
* "last_name" = excluded."last_name"
|
|
167
192
|
* ```
|
|
168
193
|
*/
|
|
169
194
|
doUpdateSet(update) {
|
|
@@ -0,0 +1,138 @@
|
|
|
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
|
+
* gender: 'female',
|
|
26
|
+
* })
|
|
27
|
+
* .executeTakeFirstOrThrow()
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* The generated SQL (MSSQL):
|
|
31
|
+
*
|
|
32
|
+
* ```sql
|
|
33
|
+
* insert into "person" ("first_name", "last_name", "gender")
|
|
34
|
+
* output "inserted"."id"
|
|
35
|
+
* values (@1, @2, @3)
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* Return multiple columns:
|
|
39
|
+
*
|
|
40
|
+
* ```ts
|
|
41
|
+
* const { old_first_name, old_last_name, new_first_name, new_last_name } = await db
|
|
42
|
+
* .updateTable('person')
|
|
43
|
+
* .set({ first_name: 'John', last_name: 'Doe' })
|
|
44
|
+
* .output([
|
|
45
|
+
* 'deleted.first_name as old_first_name',
|
|
46
|
+
* 'deleted.last_name as old_last_name',
|
|
47
|
+
* 'inserted.first_name as new_first_name',
|
|
48
|
+
* 'inserted.last_name as new_last_name',
|
|
49
|
+
* ])
|
|
50
|
+
* .where('created_at', '<', new Date())
|
|
51
|
+
* .executeTakeFirstOrThrow()
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* The generated SQL (MSSQL):
|
|
55
|
+
*
|
|
56
|
+
* ```sql
|
|
57
|
+
* update "person"
|
|
58
|
+
* set "first_name" = @1, "last_name" = @2
|
|
59
|
+
* output "deleted"."first_name" as "old_first_name",
|
|
60
|
+
* "deleted"."last_name" as "old_last_name",
|
|
61
|
+
* "inserted"."first_name" as "new_first_name",
|
|
62
|
+
* "inserted"."last_name" as "new_last_name"
|
|
63
|
+
* where "created_at" < @3
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* Return arbitrary expressions:
|
|
67
|
+
*
|
|
68
|
+
* ```ts
|
|
69
|
+
* import { sql } from 'kysely'
|
|
70
|
+
*
|
|
71
|
+
* const { full_name } = await db
|
|
72
|
+
* .deleteFrom('person')
|
|
73
|
+
* .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name'))
|
|
74
|
+
* .where('created_at', '<', new Date())
|
|
75
|
+
* .executeTakeFirstOrThrow()
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
78
|
+
* The generated SQL (MSSQL):
|
|
79
|
+
*
|
|
80
|
+
* ```sql
|
|
81
|
+
* delete from "person"
|
|
82
|
+
* output concat("deleted"."first_name", ' ', "deleted"."last_name") as "full_name"
|
|
83
|
+
* where "created_at" < @1
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* Return the action performed on the row:
|
|
87
|
+
*
|
|
88
|
+
* ```ts
|
|
89
|
+
* await db
|
|
90
|
+
* .mergeInto('person')
|
|
91
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
92
|
+
* .whenMatched()
|
|
93
|
+
* .thenDelete()
|
|
94
|
+
* .whenNotMatched()
|
|
95
|
+
* .thenInsertValues({
|
|
96
|
+
* first_name: 'John',
|
|
97
|
+
* last_name: 'Doe',
|
|
98
|
+
* gender: 'male'
|
|
99
|
+
* })
|
|
100
|
+
* .output([
|
|
101
|
+
* 'inserted.id as inserted_id',
|
|
102
|
+
* 'deleted.id as deleted_id',
|
|
103
|
+
* ])
|
|
104
|
+
* .execute()
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* The generated SQL (MSSQL):
|
|
108
|
+
*
|
|
109
|
+
* ```sql
|
|
110
|
+
* merge into "person"
|
|
111
|
+
* using "pet" on "pet"."owner_id" = "person"."id"
|
|
112
|
+
* when matched then delete
|
|
113
|
+
* when not matched then
|
|
114
|
+
* insert ("first_name", "last_name", "gender")
|
|
115
|
+
* values (@1, @2, @3)
|
|
116
|
+
* output "inserted"."id" as "inserted_id", "deleted"."id" as "deleted_id"
|
|
117
|
+
* ```
|
|
118
|
+
*
|
|
119
|
+
*/
|
|
120
|
+
output<OE extends OutputExpression<DB, TB, OP>>(selections: ReadonlyArray<OE>): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>, OP>;
|
|
121
|
+
output<CB extends OutputCallback<DB, TB, OP>>(callback: CB): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>, OP>;
|
|
122
|
+
output<OE extends OutputExpression<DB, TB, OP>>(selection: OE): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>, OP>;
|
|
123
|
+
/**
|
|
124
|
+
* Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
|
|
125
|
+
* that support `output` such as MS SQL Server (MSSQL).
|
|
126
|
+
*
|
|
127
|
+
* Also see the {@link output} method.
|
|
128
|
+
*/
|
|
129
|
+
outputAll(table: OP): OutputInterface<DB, TB, ReturningAllRow<DB, TB, O>, OP>;
|
|
130
|
+
}
|
|
131
|
+
export type OutputPrefix = 'deleted' | 'inserted';
|
|
132
|
+
export type OutputDatabase<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix> = {
|
|
133
|
+
[K in OP]: DB[TB];
|
|
134
|
+
};
|
|
135
|
+
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>;
|
|
136
|
+
export type OutputCallback<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix> = (eb: ExpressionBuilder<OutputDatabase<DB, TB, OP>, OP>) => ReadonlyArray<OutputExpression<DB, TB, OP>>;
|
|
137
|
+
export type SelectExpressionFromOutputExpression<OE> = OE extends `${OutputPrefix}.${infer C}` ? C : OE;
|
|
138
|
+
export type SelectExpressionFromOutputCallback<CB> = CB extends (eb: ExpressionBuilder<any, any>) => ReadonlyArray<infer OE> ? SelectExpressionFromOutputExpression<OE> : never;
|
|
@@ -26,20 +26,20 @@ export interface ReturningInterface<DB, TB extends keyof DB, O> {
|
|
|
26
26
|
* last_name: 'Aniston'
|
|
27
27
|
* })
|
|
28
28
|
* .returning('id')
|
|
29
|
-
* .
|
|
29
|
+
* .executeTakeFirstOrThrow()
|
|
30
30
|
* ```
|
|
31
31
|
*
|
|
32
32
|
* Return multiple columns:
|
|
33
33
|
*
|
|
34
34
|
* ```ts
|
|
35
|
-
* const { id,
|
|
35
|
+
* const { id, last_name } = await db
|
|
36
36
|
* .insertInto('person')
|
|
37
37
|
* .values({
|
|
38
38
|
* first_name: 'Jennifer',
|
|
39
39
|
* last_name: 'Aniston'
|
|
40
40
|
* })
|
|
41
41
|
* .returning(['id', 'last_name'])
|
|
42
|
-
* .
|
|
42
|
+
* .executeTakeFirstOrThrow()
|
|
43
43
|
* ```
|
|
44
44
|
*
|
|
45
45
|
* Return arbitrary expressions:
|
|
@@ -56,9 +56,9 @@ export interface ReturningInterface<DB, TB extends keyof DB, O> {
|
|
|
56
56
|
* .returning((eb) => [
|
|
57
57
|
* 'id as id',
|
|
58
58
|
* sql<string>`concat(first_name, ' ', last_name)`.as('full_name'),
|
|
59
|
-
* eb.selectFrom('
|
|
59
|
+
* eb.selectFrom('pet').select('pet.id').limit(1).as('first_pet_id')
|
|
60
60
|
* ])
|
|
61
|
-
* .
|
|
61
|
+
* .executeTakeFirstOrThrow()
|
|
62
62
|
* ```
|
|
63
63
|
*/
|
|
64
64
|
returning<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): ReturningInterface<DB, TB, ReturningRow<DB, TB, O, SE>>;
|
|
@@ -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
|
}
|
|
@@ -5,11 +5,19 @@ export interface SelectQueryBuilderExpression<O> extends AliasableExpression<O>
|
|
|
5
5
|
/**
|
|
6
6
|
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
7
7
|
*
|
|
8
|
+
* ### Examples
|
|
9
|
+
*
|
|
8
10
|
* If you are creating a custom expression, it's often easiest to use the {@link sql}
|
|
9
11
|
* template tag to build the node:
|
|
10
12
|
*
|
|
11
13
|
* ```ts
|
|
14
|
+
* import { type Expression, type OperationNode, sql } from 'kysely'
|
|
15
|
+
*
|
|
12
16
|
* class SomeExpression<T> implements Expression<T> {
|
|
17
|
+
* get expressionType(): T | undefined {
|
|
18
|
+
* return undefined
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
13
21
|
* toOperationNode(): OperationNode {
|
|
14
22
|
* return sql`some sql here`.toOperationNode()
|
|
15
23
|
* }
|