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
|
@@ -6,6 +6,7 @@ import { UpdateQueryNode } from '../operation-node/update-query-node.js';
|
|
|
6
6
|
import { parseInsertExpression, } from '../parser/insert-values-parser.js';
|
|
7
7
|
import { parseJoin, } from '../parser/join-parser.js';
|
|
8
8
|
import { parseMergeThen, parseMergeWhen } from '../parser/merge-parser.js';
|
|
9
|
+
import { parseSelectAll, parseSelectArg } from '../parser/select-parser.js';
|
|
9
10
|
import { parseTop } from '../parser/top-parser.js';
|
|
10
11
|
import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
|
|
11
12
|
import { freeze } from '../util/object-utils.js';
|
|
@@ -18,6 +19,35 @@ export class MergeQueryBuilder {
|
|
|
18
19
|
constructor(props) {
|
|
19
20
|
this.#props = freeze(props);
|
|
20
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
24
|
+
*
|
|
25
|
+
* ### Examples
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { sql } from 'kysely'
|
|
29
|
+
*
|
|
30
|
+
* await db
|
|
31
|
+
* .mergeInto('person')
|
|
32
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
33
|
+
* .whenMatched()
|
|
34
|
+
* .thenDelete()
|
|
35
|
+
* .modifyEnd(sql.raw('-- this is a comment'))
|
|
36
|
+
* .execute()
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* The generated SQL (PostgreSQL):
|
|
40
|
+
*
|
|
41
|
+
* ```sql
|
|
42
|
+
* merge into "person" using "pet" on "pet"."owner_id" = "person"."id" when matched then delete -- this is a comment
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
modifyEnd(modifier) {
|
|
46
|
+
return new MergeQueryBuilder({
|
|
47
|
+
...this.#props,
|
|
48
|
+
queryNode: QueryNode.cloneWithEndModifier(this.#props.queryNode, modifier.toOperationNode()),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
21
51
|
/**
|
|
22
52
|
* Changes a `merge into` query to an `merge top into` query.
|
|
23
53
|
*
|
|
@@ -77,6 +107,18 @@ export class MergeQueryBuilder {
|
|
|
77
107
|
queryNode: MergeQueryNode.cloneWithUsing(this.#props.queryNode, parseJoin('Using', args)),
|
|
78
108
|
});
|
|
79
109
|
}
|
|
110
|
+
output(args) {
|
|
111
|
+
return new MergeQueryBuilder({
|
|
112
|
+
...this.#props,
|
|
113
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
outputAll(table) {
|
|
117
|
+
return new MergeQueryBuilder({
|
|
118
|
+
...this.#props,
|
|
119
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
80
122
|
}
|
|
81
123
|
preventAwait(MergeQueryBuilder, "don't await MergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
|
|
82
124
|
export class WheneableMergeQueryBuilder {
|
|
@@ -84,6 +126,35 @@ export class WheneableMergeQueryBuilder {
|
|
|
84
126
|
constructor(props) {
|
|
85
127
|
this.#props = freeze(props);
|
|
86
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
131
|
+
*
|
|
132
|
+
* ### Examples
|
|
133
|
+
*
|
|
134
|
+
* ```ts
|
|
135
|
+
* import { sql } from 'kysely'
|
|
136
|
+
*
|
|
137
|
+
* await db
|
|
138
|
+
* .mergeInto('person')
|
|
139
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
140
|
+
* .whenMatched()
|
|
141
|
+
* .thenDelete()
|
|
142
|
+
* .modifyEnd(sql.raw('-- this is a comment'))
|
|
143
|
+
* .execute()
|
|
144
|
+
* ```
|
|
145
|
+
*
|
|
146
|
+
* The generated SQL (PostgreSQL):
|
|
147
|
+
*
|
|
148
|
+
* ```sql
|
|
149
|
+
* merge into "person" using "pet" on "pet"."owner_id" = "person"."id" when matched then delete -- this is a comment
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
modifyEnd(modifier) {
|
|
153
|
+
return new WheneableMergeQueryBuilder({
|
|
154
|
+
...this.#props,
|
|
155
|
+
queryNode: QueryNode.cloneWithEndModifier(this.#props.queryNode, modifier.toOperationNode()),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
87
158
|
/**
|
|
88
159
|
* See {@link MergeQueryBuilder.top}.
|
|
89
160
|
*/
|
|
@@ -214,6 +285,18 @@ export class WheneableMergeQueryBuilder {
|
|
|
214
285
|
whenNotMatchedBySourceAndRef(lhs, op, rhs) {
|
|
215
286
|
return this.#whenNotMatched([lhs, op, rhs], true, true);
|
|
216
287
|
}
|
|
288
|
+
output(args) {
|
|
289
|
+
return new WheneableMergeQueryBuilder({
|
|
290
|
+
...this.#props,
|
|
291
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
outputAll(table) {
|
|
295
|
+
return new WheneableMergeQueryBuilder({
|
|
296
|
+
...this.#props,
|
|
297
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
298
|
+
});
|
|
299
|
+
}
|
|
217
300
|
#whenNotMatched(args, refRight = false, bySource = false) {
|
|
218
301
|
const props = {
|
|
219
302
|
...this.#props,
|
|
@@ -236,13 +319,15 @@ export class WheneableMergeQueryBuilder {
|
|
|
236
319
|
* The next example uses a helper function `log` to log a query:
|
|
237
320
|
*
|
|
238
321
|
* ```ts
|
|
322
|
+
* import type { Compilable } from 'kysely'
|
|
323
|
+
*
|
|
239
324
|
* function log<T extends Compilable>(qb: T): T {
|
|
240
325
|
* console.log(qb.compile())
|
|
241
326
|
* return qb
|
|
242
327
|
* }
|
|
243
328
|
*
|
|
244
|
-
* db.updateTable('person')
|
|
245
|
-
* .set(
|
|
329
|
+
* await db.updateTable('person')
|
|
330
|
+
* .set({ first_name: 'John' })
|
|
246
331
|
* .$call(log)
|
|
247
332
|
* .execute()
|
|
248
333
|
* ```
|
|
@@ -263,7 +348,9 @@ export class WheneableMergeQueryBuilder {
|
|
|
263
348
|
* ### Examples
|
|
264
349
|
*
|
|
265
350
|
* ```ts
|
|
266
|
-
*
|
|
351
|
+
* import type { PersonUpdate } from 'type-editor' // imaginary module
|
|
352
|
+
*
|
|
353
|
+
* async function updatePerson(id: number, updates: PersonUpdate, returnLastName: boolean) {
|
|
267
354
|
* return await db
|
|
268
355
|
* .updateTable('person')
|
|
269
356
|
* .set(updates)
|
|
@@ -279,11 +366,11 @@ export class WheneableMergeQueryBuilder {
|
|
|
279
366
|
* the code. In the example above the return type of the `updatePerson` function is:
|
|
280
367
|
*
|
|
281
368
|
* ```ts
|
|
282
|
-
* {
|
|
369
|
+
* Promise<{
|
|
283
370
|
* id: number
|
|
284
371
|
* first_name: string
|
|
285
372
|
* last_name?: string
|
|
286
|
-
* }
|
|
373
|
+
* }>
|
|
287
374
|
* ```
|
|
288
375
|
*/
|
|
289
376
|
$if(condition, func) {
|
|
@@ -298,7 +385,7 @@ export class WheneableMergeQueryBuilder {
|
|
|
298
385
|
return this.#props.executor.transformQuery(this.#props.queryNode, this.#props.queryId);
|
|
299
386
|
}
|
|
300
387
|
compile() {
|
|
301
|
-
return this.#props.executor.compileQuery(this
|
|
388
|
+
return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
|
|
302
389
|
}
|
|
303
390
|
/**
|
|
304
391
|
* Executes the query and returns an array of rows.
|
|
@@ -308,6 +395,10 @@ export class WheneableMergeQueryBuilder {
|
|
|
308
395
|
async execute() {
|
|
309
396
|
const compiledQuery = this.compile();
|
|
310
397
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
398
|
+
if (compiledQuery.query.output &&
|
|
399
|
+
this.#props.executor.adapter.supportsOutput) {
|
|
400
|
+
return result.rows;
|
|
401
|
+
}
|
|
311
402
|
return [new MergeResult(result.numAffectedRows)];
|
|
312
403
|
}
|
|
313
404
|
/**
|
|
@@ -430,7 +521,7 @@ export class MatchedThenableMergeQueryBuilder {
|
|
|
430
521
|
* .thenUpdate((ub) => ub
|
|
431
522
|
* .set(sql`metadata['has_pets']`, 'Y')
|
|
432
523
|
* .set({
|
|
433
|
-
* updated_at: Date.
|
|
524
|
+
* updated_at: new Date().toISOString(),
|
|
434
525
|
* })
|
|
435
526
|
* )
|
|
436
527
|
* .execute()
|
|
@@ -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()
|
|
@@ -99,21 +99,25 @@ export class OnConflictBuilder {
|
|
|
99
99
|
* ### Examples
|
|
100
100
|
*
|
|
101
101
|
* ```ts
|
|
102
|
+
* const id = 1
|
|
103
|
+
* const first_name = 'John'
|
|
104
|
+
*
|
|
102
105
|
* await db
|
|
103
106
|
* .insertInto('person')
|
|
104
|
-
* .values({ first_name,
|
|
107
|
+
* .values({ first_name, id })
|
|
105
108
|
* .onConflict((oc) => oc
|
|
106
|
-
* .column('
|
|
109
|
+
* .column('id')
|
|
107
110
|
* .doNothing()
|
|
108
111
|
* )
|
|
112
|
+
* .execute()
|
|
109
113
|
* ```
|
|
110
114
|
*
|
|
111
115
|
* The generated SQL (PostgreSQL):
|
|
112
116
|
*
|
|
113
117
|
* ```sql
|
|
114
|
-
* insert into "person" ("first_name", "
|
|
118
|
+
* insert into "person" ("first_name", "id")
|
|
115
119
|
* values ($1, $2)
|
|
116
|
-
* on conflict ("
|
|
120
|
+
* on conflict ("id") do nothing
|
|
117
121
|
* ```
|
|
118
122
|
*/
|
|
119
123
|
doNothing() {
|
|
@@ -130,21 +134,25 @@ export class OnConflictBuilder {
|
|
|
130
134
|
* ### Examples
|
|
131
135
|
*
|
|
132
136
|
* ```ts
|
|
137
|
+
* const id = 1
|
|
138
|
+
* const first_name = 'John'
|
|
139
|
+
*
|
|
133
140
|
* await db
|
|
134
141
|
* .insertInto('person')
|
|
135
|
-
* .values({ first_name,
|
|
142
|
+
* .values({ first_name, id })
|
|
136
143
|
* .onConflict((oc) => oc
|
|
137
|
-
* .column('
|
|
144
|
+
* .column('id')
|
|
138
145
|
* .doUpdateSet({ first_name })
|
|
139
146
|
* )
|
|
147
|
+
* .execute()
|
|
140
148
|
* ```
|
|
141
149
|
*
|
|
142
150
|
* The generated SQL (PostgreSQL):
|
|
143
151
|
*
|
|
144
152
|
* ```sql
|
|
145
|
-
* insert into "person" ("first_name", "
|
|
153
|
+
* insert into "person" ("first_name", "id")
|
|
146
154
|
* values ($1, $2)
|
|
147
|
-
* on conflict ("
|
|
155
|
+
* on conflict ("id")
|
|
148
156
|
* do update set "first_name" = $3
|
|
149
157
|
* ```
|
|
150
158
|
*
|
|
@@ -153,15 +161,32 @@ export class OnConflictBuilder {
|
|
|
153
161
|
* to create an upsert operation:
|
|
154
162
|
*
|
|
155
163
|
* ```ts
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
* .
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
+
* import type { NewPerson } from 'type-editor' // imaginary module
|
|
165
|
+
*
|
|
166
|
+
* async function upsertPerson(person: NewPerson): Promise<void> {
|
|
167
|
+
* await db.insertInto('person')
|
|
168
|
+
* .values(person)
|
|
169
|
+
* .onConflict((oc) => oc
|
|
170
|
+
* .column('id')
|
|
171
|
+
* .doUpdateSet((eb) => ({
|
|
172
|
+
* first_name: eb.ref('excluded.first_name'),
|
|
173
|
+
* last_name: eb.ref('excluded.last_name')
|
|
174
|
+
* })
|
|
175
|
+
* )
|
|
164
176
|
* )
|
|
177
|
+
* .execute()
|
|
178
|
+
* }
|
|
179
|
+
* ```
|
|
180
|
+
*
|
|
181
|
+
* The generated SQL (PostgreSQL):
|
|
182
|
+
*
|
|
183
|
+
* ```sql
|
|
184
|
+
* insert into "person" ("first_name", "last_name")
|
|
185
|
+
* values ($1, $2)
|
|
186
|
+
* on conflict ("id")
|
|
187
|
+
* do update set
|
|
188
|
+
* "first_name" = excluded."first_name",
|
|
189
|
+
* "last_name" = excluded."last_name"
|
|
165
190
|
* ```
|
|
166
191
|
*/
|
|
167
192
|
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
|
* }
|