kysely 0.27.3 → 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/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/postgres/postgres-introspector.js +1 -1
- package/dist/cjs/driver/database-connection.d.ts +3 -1
- 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 +2 -2
- package/dist/cjs/expression/expression-builder.js +2 -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 +28 -21
- package/dist/cjs/index.js +28 -21
- package/dist/cjs/kysely.d.ts +1 -1
- package/dist/cjs/kysely.js +3 -3
- 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 +5 -3
- package/dist/cjs/operation-node/delete-query-node.d.ts +2 -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 +2 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +2 -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 +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +12 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/operator-node.d.ts +3 -3
- package/dist/cjs/operation-node/operator-node.js +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 +11 -6
- package/dist/cjs/operation-node/query-node.js +9 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +1 -0
- package/dist/cjs/operation-node/select-query-node.js +6 -0
- package/dist/cjs/operation-node/update-query-node.d.ts +2 -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 +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/query-builder/delete-query-builder.d.ts +89 -5
- package/dist/cjs/query-builder/delete-query-builder.js +19 -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 +95 -10
- package/dist/cjs/query-builder/insert-query-builder.js +25 -10
- package/dist/cjs/query-builder/merge-query-builder.d.ts +167 -3
- package/dist/cjs/query-builder/merge-query-builder.js +30 -1
- 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 +76 -11
- package/dist/cjs/query-builder/select-query-builder.js +7 -2
- package/dist/cjs/query-builder/update-query-builder.d.ts +95 -10
- package/dist/cjs/query-builder/update-query-builder.js +21 -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 +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +25 -1
- package/dist/cjs/query-creator.d.ts +56 -3
- package/dist/cjs/query-creator.js +54 -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 +1 -1
- package/dist/cjs/schema/alter-table-builder.js +1 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +5 -0
- package/dist/cjs/schema/column-definition-builder.js +7 -0
- package/dist/cjs/util/assert.js +2 -3
- 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.js +1 -2
- package/dist/cjs/util/stack-trace-utils.js +1 -2
- 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/postgres/postgres-introspector.js +1 -1
- package/dist/esm/driver/database-connection.d.ts +3 -1
- 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 +2 -2
- 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 +28 -21
- package/dist/esm/index.js +28 -21
- package/dist/esm/kysely.d.ts +1 -1
- package/dist/esm/kysely.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/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 +3 -1
- package/dist/esm/operation-node/delete-query-node.d.ts +2 -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 +2 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +2 -0
- package/dist/esm/operation-node/on-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +12 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/operator-node.d.ts +3 -3
- package/dist/esm/operation-node/operator-node.js +2 -0
- package/dist/esm/operation-node/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 +11 -6
- package/dist/esm/operation-node/query-node.js +9 -0
- package/dist/esm/operation-node/select-query-node.d.ts +1 -0
- package/dist/esm/operation-node/select-query-node.js +6 -0
- package/dist/esm/operation-node/update-query-node.d.ts +2 -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 +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/query-builder/delete-query-builder.d.ts +89 -5
- package/dist/esm/query-builder/delete-query-builder.js +19 -5
- package/dist/esm/query-builder/function-module.d.ts +5 -5
- package/dist/esm/query-builder/insert-query-builder.d.ts +95 -10
- package/dist/esm/query-builder/insert-query-builder.js +25 -10
- package/dist/esm/query-builder/merge-query-builder.d.ts +167 -3
- package/dist/esm/query-builder/merge-query-builder.js +30 -1
- 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 +76 -11
- package/dist/esm/query-builder/select-query-builder.js +6 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +95 -10
- package/dist/esm/query-builder/update-query-builder.js +21 -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 +2 -0
- package/dist/esm/query-compiler/default-query-compiler.js +25 -1
- package/dist/esm/query-creator.d.ts +56 -3
- package/dist/esm/query-creator.js +54 -1
- 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 +1 -1
- package/dist/esm/schema/alter-table-builder.js +1 -2
- package/dist/esm/schema/column-definition-builder.d.ts +5 -0
- package/dist/esm/schema/column-definition-builder.js +7 -0
- package/dist/esm/util/object-utils.js +18 -5
- package/package.json +7 -6
|
@@ -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
|
}
|
|
@@ -291,7 +291,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
291
291
|
* .selectFrom('person')
|
|
292
292
|
* .selectAll()
|
|
293
293
|
* .where(
|
|
294
|
-
* sql
|
|
294
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
295
295
|
* 'like',
|
|
296
296
|
* '%' + name + '%',
|
|
297
297
|
* )
|
|
@@ -542,6 +542,45 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
542
542
|
* In case you use the {@link sql} tag you need to specify the type of the expression
|
|
543
543
|
* (in this example `string`).
|
|
544
544
|
*
|
|
545
|
+
* <!-- siteExample("select", "Not null", 51) -->
|
|
546
|
+
*
|
|
547
|
+
* Sometimes you can be sure something's not null, but Kysely isn't able to infer
|
|
548
|
+
* it. For example calling `where('last_name', 'is not', null)` doesn't make
|
|
549
|
+
* `last_name` not null in the result type, but unless you have other where statements
|
|
550
|
+
* you can be sure it's never null.
|
|
551
|
+
*
|
|
552
|
+
* Kysely has a couple of helpers for dealing with these cases: `$notNull()` and `$narrowType`.
|
|
553
|
+
* Both are used in the following example:
|
|
554
|
+
*
|
|
555
|
+
* ```ts
|
|
556
|
+
* import { NotNull } from 'kysely'
|
|
557
|
+
* import { jsonObjectFrom } from 'kysely/helpers/postgres'
|
|
558
|
+
*
|
|
559
|
+
* const persons = db
|
|
560
|
+
* .selectFrom('person')
|
|
561
|
+
* .select((eb) => [
|
|
562
|
+
* 'last_name',
|
|
563
|
+
* // Let's assume we know the person has at least one
|
|
564
|
+
* // pet. We can use the `.$notNull()` method to make
|
|
565
|
+
* // the expression not null. You could just as well
|
|
566
|
+
* // add `pet` to the `$narrowType` call below.
|
|
567
|
+
* jsonObjectFrom(
|
|
568
|
+
* eb.selectFrom('pet')
|
|
569
|
+
* .selectAll()
|
|
570
|
+
* .limit(1)
|
|
571
|
+
* .whereRef('person.id', '=', 'pet.owner_id')
|
|
572
|
+
* ).$notNull().as('pet')
|
|
573
|
+
* ])
|
|
574
|
+
* .where('last_name', 'is not', null)
|
|
575
|
+
* // $narrowType can be used to narrow the output type.
|
|
576
|
+
* // The special `NotNull` type can be used to make a
|
|
577
|
+
* // selection not null. You could add `pet: NotNull`
|
|
578
|
+
* // here and omit the `$notNull()` call on it.
|
|
579
|
+
* // Use whichever way you prefer.
|
|
580
|
+
* .$narrowType<{ last_name: NotNull }>()
|
|
581
|
+
* .execute()
|
|
582
|
+
* ```
|
|
583
|
+
*
|
|
545
584
|
* All the examples above assume you know the column names at compile time.
|
|
546
585
|
* While it's better to build your code like that (that way you also know
|
|
547
586
|
* the types) sometimes it's not possible or you just prefer to write more
|
|
@@ -824,7 +863,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
824
863
|
* (join) => join
|
|
825
864
|
* .onRef('pet.owner_id', '=', 'person.id')
|
|
826
865
|
* .on('pet.name', '=', 'Doggo')
|
|
827
|
-
* .on((eb) => eb.or([
|
|
866
|
+
* .on((eb) => eb.or([
|
|
867
|
+
* eb('person.age', '>', 18),
|
|
868
|
+
* eb('person.age', '<', 100)
|
|
869
|
+
* ]))
|
|
828
870
|
* )
|
|
829
871
|
* .selectAll()
|
|
830
872
|
* .execute()
|
|
@@ -838,6 +880,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
838
880
|
* inner join "pet"
|
|
839
881
|
* on "pet"."owner_id" = "person"."id"
|
|
840
882
|
* and "pet"."name" = $1
|
|
883
|
+
* and (
|
|
884
|
+
* "person"."age" > $2
|
|
885
|
+
* OR "person"."age" < $3
|
|
886
|
+
* )
|
|
841
887
|
* ```
|
|
842
888
|
*
|
|
843
889
|
* <!-- siteExample("join", "Subquery join", 40) -->
|
|
@@ -997,7 +1043,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
997
1043
|
* .limit(1)
|
|
998
1044
|
* )
|
|
999
1045
|
* .orderBy(
|
|
1000
|
-
* sql
|
|
1046
|
+
* sql<string>`concat(first_name, last_name)`
|
|
1001
1047
|
* )
|
|
1002
1048
|
* .execute()
|
|
1003
1049
|
* ```
|
|
@@ -1056,7 +1102,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1056
1102
|
* .selectFrom('person')
|
|
1057
1103
|
* .select([
|
|
1058
1104
|
* 'first_name',
|
|
1059
|
-
* sql
|
|
1105
|
+
* sql<string>`max(id)`.as('max_id')
|
|
1060
1106
|
* ])
|
|
1061
1107
|
* .groupBy('first_name')
|
|
1062
1108
|
* .execute()
|
|
@@ -1080,7 +1126,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1080
1126
|
* .select([
|
|
1081
1127
|
* 'first_name',
|
|
1082
1128
|
* 'last_name',
|
|
1083
|
-
* sql
|
|
1129
|
+
* sql<string>`max(id)`.as('max_id')
|
|
1084
1130
|
* ])
|
|
1085
1131
|
* .groupBy([
|
|
1086
1132
|
* 'first_name',
|
|
@@ -1108,10 +1154,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1108
1154
|
* .select([
|
|
1109
1155
|
* 'first_name',
|
|
1110
1156
|
* 'last_name',
|
|
1111
|
-
* sql
|
|
1157
|
+
* sql<string>`max(id)`.as('max_id')
|
|
1112
1158
|
* ])
|
|
1113
1159
|
* .groupBy([
|
|
1114
|
-
* sql
|
|
1160
|
+
* sql<string>`concat(first_name, last_name)`,
|
|
1115
1161
|
* (qb) => qb.selectFrom('pet').select('id').limit(1)
|
|
1116
1162
|
* ])
|
|
1117
1163
|
* .execute()
|
|
@@ -1552,6 +1598,25 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1552
1598
|
* ```
|
|
1553
1599
|
*/
|
|
1554
1600
|
clearOrderBy(): SelectQueryBuilder<DB, TB, O>;
|
|
1601
|
+
/**
|
|
1602
|
+
* Clears `group by` clause from the query.
|
|
1603
|
+
*
|
|
1604
|
+
* ### Examples
|
|
1605
|
+
*
|
|
1606
|
+
* ```ts
|
|
1607
|
+
* db.selectFrom('person')
|
|
1608
|
+
* .selectAll()
|
|
1609
|
+
* .groupBy('id')
|
|
1610
|
+
* .clearGroupBy()
|
|
1611
|
+
* ```
|
|
1612
|
+
*
|
|
1613
|
+
* The generated SQL(PostgreSQL):
|
|
1614
|
+
*
|
|
1615
|
+
* ```sql
|
|
1616
|
+
* select * from "person"
|
|
1617
|
+
* ```
|
|
1618
|
+
*/
|
|
1619
|
+
clearGroupBy(): SelectQueryBuilder<DB, TB, O>;
|
|
1555
1620
|
/**
|
|
1556
1621
|
* Simply calls the provided function passing `this` as the only argument. `$call` returns
|
|
1557
1622
|
* what the provided function returns.
|
|
@@ -1579,7 +1644,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1579
1644
|
/**
|
|
1580
1645
|
* Call `func(this)` if `condition` is true.
|
|
1581
1646
|
*
|
|
1582
|
-
* NOTE: This method has an impact on
|
|
1647
|
+
* NOTE: This method has an impact on TypeScript performance and it should only be used
|
|
1583
1648
|
* when necessary. Remember that you can call most methods like `where` conditionally
|
|
1584
1649
|
* like this:
|
|
1585
1650
|
*
|
|
@@ -1757,17 +1822,17 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1757
1822
|
/**
|
|
1758
1823
|
* Asserts that query's output row type equals the given type `T`.
|
|
1759
1824
|
*
|
|
1760
|
-
* This method can be used to simplify excessively complex types to make
|
|
1825
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
1761
1826
|
* and much faster.
|
|
1762
1827
|
*
|
|
1763
1828
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
1764
|
-
* for
|
|
1829
|
+
* for TypeScript and you get errors like this:
|
|
1765
1830
|
*
|
|
1766
1831
|
* ```
|
|
1767
1832
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
1768
1833
|
* ```
|
|
1769
1834
|
*
|
|
1770
|
-
* In these case you can often use this method to help
|
|
1835
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
1771
1836
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
1772
1837
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
1773
1838
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createSelectQueryBuilder =
|
|
3
|
+
exports.createSelectQueryBuilder = createSelectQueryBuilder;
|
|
4
4
|
const alias_node_js_1 = require("../operation-node/alias-node.js");
|
|
5
5
|
const select_modifier_node_js_1 = require("../operation-node/select-modifier-node.js");
|
|
6
6
|
const join_parser_js_1 = require("../parser/join-parser.js");
|
|
@@ -271,6 +271,12 @@ class SelectQueryBuilderImpl {
|
|
|
271
271
|
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithoutOrderBy(this.#props.queryNode),
|
|
272
272
|
});
|
|
273
273
|
}
|
|
274
|
+
clearGroupBy() {
|
|
275
|
+
return new SelectQueryBuilderImpl({
|
|
276
|
+
...this.#props,
|
|
277
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithoutGroupBy(this.#props.queryNode),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
274
280
|
$call(func) {
|
|
275
281
|
return func(this);
|
|
276
282
|
}
|
|
@@ -344,7 +350,6 @@ class SelectQueryBuilderImpl {
|
|
|
344
350
|
function createSelectQueryBuilder(props) {
|
|
345
351
|
return new SelectQueryBuilderImpl(props);
|
|
346
352
|
}
|
|
347
|
-
exports.createSelectQueryBuilder = createSelectQueryBuilder;
|
|
348
353
|
/**
|
|
349
354
|
* {@link SelectQueryBuilder} with an alias. The result of calling {@link SelectQueryBuilder.as}.
|
|
350
355
|
*/
|
|
@@ -3,7 +3,7 @@ import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
|
3
3
|
import { JoinCallbackExpression, JoinReferenceExpression } from '../parser/join-parser.js';
|
|
4
4
|
import { TableExpression, From, FromTables } from '../parser/table-parser.js';
|
|
5
5
|
import { SelectExpression, SelectCallback } from '../parser/select-parser.js';
|
|
6
|
-
import { ReturningCallbackRow, ReturningRow } from '../parser/returning-parser.js';
|
|
6
|
+
import { ReturningAllRow, ReturningCallbackRow, ReturningRow } from '../parser/returning-parser.js';
|
|
7
7
|
import { ReferenceExpression } from '../parser/reference-parser.js';
|
|
8
8
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
9
9
|
import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, SimplifyResult, SimplifySingleResult, SqlBool } from '../util/type-utils.js';
|
|
@@ -17,7 +17,6 @@ import { KyselyPlugin } from '../plugin/kysely-plugin.js';
|
|
|
17
17
|
import { WhereInterface } from './where-interface.js';
|
|
18
18
|
import { ReturningInterface } from './returning-interface.js';
|
|
19
19
|
import { NoResultErrorConstructor } from './no-result-error.js';
|
|
20
|
-
import { Selectable } from '../util/column-type.js';
|
|
21
20
|
import { Explainable, ExplainFormat } from '../util/explainable.js';
|
|
22
21
|
import { AliasedExpression, Expression } from '../expression/expression.js';
|
|
23
22
|
import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
|
|
@@ -25,7 +24,8 @@ import { KyselyTypeError } from '../util/type-error.js';
|
|
|
25
24
|
import { Streamable } from '../util/streamable.js';
|
|
26
25
|
import { ExpressionOrFactory } from '../parser/expression-parser.js';
|
|
27
26
|
import { ValueExpression } from '../parser/value-parser.js';
|
|
28
|
-
|
|
27
|
+
import { OutputCallback, OutputExpression, OutputInterface, OutputPrefix, SelectExpressionFromOutputCallback, SelectExpressionFromOutputExpression } from './output-interface.js';
|
|
28
|
+
export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OutputInterface<DB, TB, O>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
|
|
29
29
|
#private;
|
|
30
30
|
constructor(props: UpdateQueryBuilderProps);
|
|
31
31
|
/**
|
|
@@ -290,7 +290,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
290
290
|
* .selectFrom('person')
|
|
291
291
|
* .selectAll()
|
|
292
292
|
* .where(
|
|
293
|
-
* sql
|
|
293
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
294
294
|
* 'like',
|
|
295
295
|
* '%' + name + '%',
|
|
296
296
|
* )
|
|
@@ -695,7 +695,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
695
695
|
* .set('first_name', 'Foo')
|
|
696
696
|
* // As always, both arguments can be arbitrary expressions or
|
|
697
697
|
* // callbacks that give you access to an expression builder:
|
|
698
|
-
* .set(sql
|
|
698
|
+
* .set(sql<string>`address['postalCode']`, (eb) => eb.val('61710))
|
|
699
699
|
* .where('id', '=', '1')
|
|
700
700
|
* .executeTakeFirst()
|
|
701
701
|
* ```
|
|
@@ -736,7 +736,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
736
736
|
* first_name: selectFrom('person').select('first_name').limit(1),
|
|
737
737
|
* middle_name: ref('first_name'),
|
|
738
738
|
* age: eb('age', '+', 1),
|
|
739
|
-
* last_name: sql
|
|
739
|
+
* last_name: sql<string>`${'Ani'} || ${'ston'}`,
|
|
740
740
|
* }))
|
|
741
741
|
* .where('id', '=', 1)
|
|
742
742
|
* .executeTakeFirst()
|
|
@@ -822,8 +822,93 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
822
822
|
/**
|
|
823
823
|
* Adds a `returning *` to an insert/update/delete query on databases
|
|
824
824
|
* that support `returning` such as PostgreSQL.
|
|
825
|
+
*
|
|
826
|
+
* Also see the {@link returning} method.
|
|
827
|
+
*/
|
|
828
|
+
returningAll<T extends TB>(tables: ReadonlyArray<T>): UpdateQueryBuilder<DB, UT, TB, ReturningAllRow<DB, T, O>>;
|
|
829
|
+
returningAll<T extends TB>(table: T): UpdateQueryBuilder<DB, UT, TB, ReturningAllRow<DB, T, O>>;
|
|
830
|
+
returningAll(): UpdateQueryBuilder<DB, UT, TB, ReturningAllRow<DB, TB, O>>;
|
|
831
|
+
/**
|
|
832
|
+
* Allows you to return data from modified rows.
|
|
833
|
+
*
|
|
834
|
+
* On supported databases like MS SQL Server (MSSQL), this method can be chained
|
|
835
|
+
* to `insert`, `update`, `delete` and `merge` queries to return data.
|
|
836
|
+
*
|
|
837
|
+
* Also see the {@link outputAll} method.
|
|
838
|
+
*
|
|
839
|
+
* ### Examples
|
|
840
|
+
*
|
|
841
|
+
* Return one column:
|
|
842
|
+
*
|
|
843
|
+
* ```ts
|
|
844
|
+
* const { id } = await db
|
|
845
|
+
* .insertInto('person')
|
|
846
|
+
* .output('inserted.id')
|
|
847
|
+
* .values({
|
|
848
|
+
* first_name: 'Jennifer',
|
|
849
|
+
* last_name: 'Aniston'
|
|
850
|
+
* })
|
|
851
|
+
* .executeTakeFirst()
|
|
852
|
+
* ```
|
|
853
|
+
*
|
|
854
|
+
* Return multiple columns:
|
|
855
|
+
*
|
|
856
|
+
* ```ts
|
|
857
|
+
* const { id, first_name } = await db
|
|
858
|
+
* .updateTable('person')
|
|
859
|
+
* .set({ first_name: 'John', last_name: 'Doe' })
|
|
860
|
+
* .output([
|
|
861
|
+
* 'deleted.first_name as old_first_name',
|
|
862
|
+
* 'deleted.last_name as old_last_name',
|
|
863
|
+
* 'inserted.first_name as new_first_name',
|
|
864
|
+
* 'inserted.last_name as new_last_name',
|
|
865
|
+
* ])
|
|
866
|
+
* .where('created_at', '<', new Date())
|
|
867
|
+
* .executeTakeFirst()
|
|
868
|
+
* ```
|
|
869
|
+
*
|
|
870
|
+
* Return arbitrary expressions:
|
|
871
|
+
*
|
|
872
|
+
* ```ts
|
|
873
|
+
* import { sql } from 'kysely'
|
|
874
|
+
*
|
|
875
|
+
* const { id, full_name } = await db
|
|
876
|
+
* .deleteFrom('person')
|
|
877
|
+
* .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
|
|
878
|
+
* .where('created_at', '<', new Date())
|
|
879
|
+
* .executeTakeFirst()
|
|
880
|
+
* ```
|
|
881
|
+
*
|
|
882
|
+
* Return the action performed on the row:
|
|
883
|
+
*
|
|
884
|
+
* ```ts
|
|
885
|
+
* await db
|
|
886
|
+
* .mergeInto('person')
|
|
887
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
888
|
+
* .whenMatched()
|
|
889
|
+
* .thenDelete()
|
|
890
|
+
* .whenNotMatched()
|
|
891
|
+
* .thenInsertValues({
|
|
892
|
+
* first_name: 'John',
|
|
893
|
+
* last_name: 'Doe',
|
|
894
|
+
* gender: 'male'
|
|
895
|
+
* })
|
|
896
|
+
* .output([
|
|
897
|
+
* 'inserted.id as inserted_id',
|
|
898
|
+
* 'deleted.id as deleted_id',
|
|
899
|
+
* ])
|
|
900
|
+
* ```
|
|
901
|
+
*/
|
|
902
|
+
output<OE extends OutputExpression<DB, UT>>(selections: readonly OE[]): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
903
|
+
output<CB extends OutputCallback<DB, TB>>(callback: CB): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>>;
|
|
904
|
+
output<OE extends OutputExpression<DB, TB>>(selection: OE): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
905
|
+
/**
|
|
906
|
+
* Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
|
|
907
|
+
* that support `output` such as MS SQL Server (MSSQL).
|
|
908
|
+
*
|
|
909
|
+
* Also see the {@link output} method.
|
|
825
910
|
*/
|
|
826
|
-
|
|
911
|
+
outputAll(table: OutputPrefix): UpdateQueryBuilder<DB, UT, TB, ReturningAllRow<DB, TB, O>>;
|
|
827
912
|
/**
|
|
828
913
|
* Clears all `returning` clauses from the query.
|
|
829
914
|
*
|
|
@@ -960,17 +1045,17 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
960
1045
|
/**
|
|
961
1046
|
* Asserts that query's output row type equals the given type `T`.
|
|
962
1047
|
*
|
|
963
|
-
* This method can be used to simplify excessively complex types to make
|
|
1048
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
964
1049
|
* and much faster.
|
|
965
1050
|
*
|
|
966
1051
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
967
|
-
* for
|
|
1052
|
+
* for TypeScript and you get errors like this:
|
|
968
1053
|
*
|
|
969
1054
|
* ```
|
|
970
1055
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
971
1056
|
* ```
|
|
972
1057
|
*
|
|
973
|
-
* In these case you can often use this method to help
|
|
1058
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
974
1059
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
975
1060
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
976
1061
|
*
|
|
@@ -150,10 +150,22 @@ class UpdateQueryBuilder {
|
|
|
150
150
|
queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(selection)),
|
|
151
151
|
});
|
|
152
152
|
}
|
|
153
|
-
returningAll() {
|
|
153
|
+
returningAll(table) {
|
|
154
154
|
return new UpdateQueryBuilder({
|
|
155
155
|
...this.#props,
|
|
156
|
-
queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)()),
|
|
156
|
+
queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
output(args) {
|
|
160
|
+
return new UpdateQueryBuilder({
|
|
161
|
+
...this.#props,
|
|
162
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
outputAll(table) {
|
|
166
|
+
return new UpdateQueryBuilder({
|
|
167
|
+
...this.#props,
|
|
168
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
|
|
157
169
|
});
|
|
158
170
|
}
|
|
159
171
|
/**
|
|
@@ -310,17 +322,17 @@ class UpdateQueryBuilder {
|
|
|
310
322
|
/**
|
|
311
323
|
* Asserts that query's output row type equals the given type `T`.
|
|
312
324
|
*
|
|
313
|
-
* This method can be used to simplify excessively complex types to make
|
|
325
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
314
326
|
* and much faster.
|
|
315
327
|
*
|
|
316
328
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
317
|
-
* for
|
|
329
|
+
* for TypeScript and you get errors like this:
|
|
318
330
|
*
|
|
319
331
|
* ```
|
|
320
332
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
321
333
|
* ```
|
|
322
334
|
*
|
|
323
|
-
* In these case you can often use this method to help
|
|
335
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
324
336
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
325
337
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
326
338
|
*
|
|
@@ -375,9 +387,11 @@ class UpdateQueryBuilder {
|
|
|
375
387
|
*/
|
|
376
388
|
async execute() {
|
|
377
389
|
const compiledQuery = this.compile();
|
|
378
|
-
const query = compiledQuery.query;
|
|
379
390
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
380
|
-
|
|
391
|
+
const { adapter } = this.#props.executor;
|
|
392
|
+
const query = compiledQuery.query;
|
|
393
|
+
if ((query.returning && adapter.supportsReturning) ||
|
|
394
|
+
(query.output && adapter.supportsOutput)) {
|
|
381
395
|
return result.rows;
|
|
382
396
|
}
|
|
383
397
|
return [
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
export declare class UpdateResult {
|
|
2
|
+
/**
|
|
3
|
+
* The number of rows the update query updated (even if not changed).
|
|
4
|
+
*/
|
|
2
5
|
readonly numUpdatedRows: bigint;
|
|
6
|
+
/**
|
|
7
|
+
* The number of rows the update query changed.
|
|
8
|
+
*
|
|
9
|
+
* This is **optional** and only supported in dialects such as MySQL.
|
|
10
|
+
* You would probably use {@link numUpdatedRows} in most cases.
|
|
11
|
+
*/
|
|
3
12
|
readonly numChangedRows?: bigint;
|
|
4
13
|
constructor(numUpdatedRows: bigint, numChangedRows: bigint | undefined);
|
|
5
14
|
}
|
|
@@ -2,7 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UpdateResult = void 0;
|
|
4
4
|
class UpdateResult {
|
|
5
|
+
/**
|
|
6
|
+
* The number of rows the update query updated (even if not changed).
|
|
7
|
+
*/
|
|
5
8
|
numUpdatedRows;
|
|
9
|
+
/**
|
|
10
|
+
* The number of rows the update query changed.
|
|
11
|
+
*
|
|
12
|
+
* This is **optional** and only supported in dialects such as MySQL.
|
|
13
|
+
* You would probably use {@link numUpdatedRows} in most cases.
|
|
14
|
+
*/
|
|
6
15
|
numChangedRows;
|
|
7
16
|
constructor(numUpdatedRows, numChangedRows) {
|
|
8
17
|
this.numUpdatedRows = numUpdatedRows;
|
|
@@ -265,7 +265,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
265
265
|
* .selectFrom('person')
|
|
266
266
|
* .selectAll()
|
|
267
267
|
* .where(
|
|
268
|
-
* sql
|
|
268
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
269
269
|
* 'like',
|
|
270
270
|
* '%' + name + '%',
|
|
271
271
|
* )
|
|
@@ -94,6 +94,7 @@ import { AddIndexNode } from '../operation-node/add-index-node.js';
|
|
|
94
94
|
import { CastNode } from '../operation-node/cast-node.js';
|
|
95
95
|
import { FetchNode } from '../operation-node/fetch-node.js';
|
|
96
96
|
import { TopNode } from '../operation-node/top-node.js';
|
|
97
|
+
import { OutputNode } from '../operation-node/output-node.js';
|
|
97
98
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
98
99
|
#private;
|
|
99
100
|
protected get numParameters(): number;
|
|
@@ -195,6 +196,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
195
196
|
protected visitAddIndex(node: AddIndexNode): void;
|
|
196
197
|
protected visitCast(node: CastNode): void;
|
|
197
198
|
protected visitFetch(node: FetchNode): void;
|
|
199
|
+
protected visitOutput(node: OutputNode): void;
|
|
198
200
|
protected visitTop(node: TopNode): void;
|
|
199
201
|
protected append(str: string): void;
|
|
200
202
|
protected appendValue(parameter: unknown): void;
|
|
@@ -20,6 +20,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
20
20
|
compileQuery(node) {
|
|
21
21
|
this.#sql = '';
|
|
22
22
|
this.#parameters = [];
|
|
23
|
+
this.nodeStack.splice(0, this.nodeStack.length);
|
|
23
24
|
this.visitNode(node);
|
|
24
25
|
return (0, object_utils_js_1.freeze)({
|
|
25
26
|
query: node,
|
|
@@ -176,6 +177,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
176
177
|
this.compileList(node.columns);
|
|
177
178
|
this.append(')');
|
|
178
179
|
}
|
|
180
|
+
if (node.output) {
|
|
181
|
+
this.append(' ');
|
|
182
|
+
this.visitNode(node.output);
|
|
183
|
+
}
|
|
179
184
|
if (node.values) {
|
|
180
185
|
this.append(' ');
|
|
181
186
|
this.visitNode(node.values);
|
|
@@ -223,6 +228,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
223
228
|
this.append(' ');
|
|
224
229
|
}
|
|
225
230
|
this.visitNode(node.from);
|
|
231
|
+
if (node.output) {
|
|
232
|
+
this.append(' ');
|
|
233
|
+
this.visitNode(node.output);
|
|
234
|
+
}
|
|
226
235
|
if (node.using) {
|
|
227
236
|
this.append(' ');
|
|
228
237
|
this.visitNode(node.using);
|
|
@@ -393,6 +402,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
393
402
|
}
|
|
394
403
|
}
|
|
395
404
|
visitColumnDefinition(node) {
|
|
405
|
+
if (node.ifNotExists) {
|
|
406
|
+
this.append('if not exists ');
|
|
407
|
+
}
|
|
396
408
|
this.visitNode(node.column);
|
|
397
409
|
this.append(' ');
|
|
398
410
|
this.visitNode(node.dataType);
|
|
@@ -519,6 +531,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
519
531
|
if (node.updates) {
|
|
520
532
|
this.compileList(node.updates);
|
|
521
533
|
}
|
|
534
|
+
if (node.output) {
|
|
535
|
+
this.append(' ');
|
|
536
|
+
this.visitNode(node.output);
|
|
537
|
+
}
|
|
522
538
|
if (node.from) {
|
|
523
539
|
this.append(' ');
|
|
524
540
|
this.visitNode(node.from);
|
|
@@ -1093,7 +1109,11 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
1093
1109
|
}
|
|
1094
1110
|
if (node.whens) {
|
|
1095
1111
|
this.append(' ');
|
|
1096
|
-
this.compileList(node.whens);
|
|
1112
|
+
this.compileList(node.whens, ' ');
|
|
1113
|
+
}
|
|
1114
|
+
if (node.output) {
|
|
1115
|
+
this.append(' ');
|
|
1116
|
+
this.visitNode(node.output);
|
|
1097
1117
|
}
|
|
1098
1118
|
}
|
|
1099
1119
|
visitMatched(node) {
|
|
@@ -1134,6 +1154,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
1134
1154
|
this.visitNode(node.rowCount);
|
|
1135
1155
|
this.append(` rows ${node.modifier}`);
|
|
1136
1156
|
}
|
|
1157
|
+
visitOutput(node) {
|
|
1158
|
+
this.append('output ');
|
|
1159
|
+
this.compileList(node.selections);
|
|
1160
|
+
}
|
|
1137
1161
|
visitTop(node) {
|
|
1138
1162
|
this.append(`top(${node.expression})`);
|
|
1139
1163
|
if (node.modifiers) {
|