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
|
@@ -7,6 +7,7 @@ import { ExpressionOrFactory } from '../parser/expression-parser.js';
|
|
|
7
7
|
import { InsertObjectOrList, InsertObjectOrListFactory } from '../parser/insert-values-parser.js';
|
|
8
8
|
import { JoinCallbackExpression, JoinReferenceExpression } from '../parser/join-parser.js';
|
|
9
9
|
import { ReferenceExpression } from '../parser/reference-parser.js';
|
|
10
|
+
import { ReturningAllRow, ReturningRow } from '../parser/returning-parser.js';
|
|
10
11
|
import { TableExpression } from '../parser/table-parser.js';
|
|
11
12
|
import { ExtractUpdateTypeFromReferenceExpression, UpdateObject, UpdateObjectFactory } from '../parser/update-set-parser.js';
|
|
12
13
|
import { ValueExpression } from '../parser/value-parser.js';
|
|
@@ -17,8 +18,9 @@ import { QueryId } from '../util/query-id.js';
|
|
|
17
18
|
import { ShallowRecord, SimplifyResult, SimplifySingleResult, SqlBool } from '../util/type-utils.js';
|
|
18
19
|
import { MergeResult } from './merge-result.js';
|
|
19
20
|
import { NoResultErrorConstructor } from './no-result-error.js';
|
|
21
|
+
import { OutputCallback, OutputExpression, OutputInterface, OutputPrefix, SelectExpressionFromOutputCallback, SelectExpressionFromOutputExpression } from './output-interface.js';
|
|
20
22
|
import { UpdateQueryBuilder } from './update-query-builder.js';
|
|
21
|
-
export declare class MergeQueryBuilder<DB, TT extends keyof DB, O> {
|
|
23
|
+
export declare class MergeQueryBuilder<DB, TT extends keyof DB, O> implements OutputInterface<DB, TT, O> {
|
|
22
24
|
#private;
|
|
23
25
|
constructor(props: MergeQueryBuilderProps);
|
|
24
26
|
/**
|
|
@@ -96,13 +98,94 @@ export declare class MergeQueryBuilder<DB, TT extends keyof DB, O> {
|
|
|
96
98
|
*/
|
|
97
99
|
using<TE extends TableExpression<DB, TT>, K1 extends JoinReferenceExpression<DB, TT, TE>, K2 extends JoinReferenceExpression<DB, TT, TE>>(sourceTable: TE, k1: K1, k2: K2): ExtractWheneableMergeQueryBuilder<DB, TT, TE, O>;
|
|
98
100
|
using<TE extends TableExpression<DB, TT>, FN extends JoinCallbackExpression<DB, TT, TE>>(sourceTable: TE, callback: FN): ExtractWheneableMergeQueryBuilder<DB, TT, TE, O>;
|
|
101
|
+
/**
|
|
102
|
+
* Allows you to return data from modified rows.
|
|
103
|
+
*
|
|
104
|
+
* On supported databases like MS SQL Server (MSSQL), this method can be chained
|
|
105
|
+
* to `insert`, `update`, `delete` and `merge` queries to return data.
|
|
106
|
+
*
|
|
107
|
+
* Also see the {@link outputAll} method.
|
|
108
|
+
*
|
|
109
|
+
* ### Examples
|
|
110
|
+
*
|
|
111
|
+
* Return one column:
|
|
112
|
+
*
|
|
113
|
+
* ```ts
|
|
114
|
+
* const { id } = await db
|
|
115
|
+
* .insertInto('person')
|
|
116
|
+
* .output('inserted.id')
|
|
117
|
+
* .values({
|
|
118
|
+
* first_name: 'Jennifer',
|
|
119
|
+
* last_name: 'Aniston'
|
|
120
|
+
* })
|
|
121
|
+
* .executeTakeFirst()
|
|
122
|
+
* ```
|
|
123
|
+
*
|
|
124
|
+
* Return multiple columns:
|
|
125
|
+
*
|
|
126
|
+
* ```ts
|
|
127
|
+
* const { id, first_name } = await db
|
|
128
|
+
* .updateTable('person')
|
|
129
|
+
* .set({ first_name: 'John', last_name: 'Doe' })
|
|
130
|
+
* .output([
|
|
131
|
+
* 'deleted.first_name as old_first_name',
|
|
132
|
+
* 'deleted.last_name as old_last_name',
|
|
133
|
+
* 'inserted.first_name as new_first_name',
|
|
134
|
+
* 'inserted.last_name as new_last_name',
|
|
135
|
+
* ])
|
|
136
|
+
* .where('created_at', '<', new Date())
|
|
137
|
+
* .executeTakeFirst()
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* Return arbitrary expressions:
|
|
141
|
+
*
|
|
142
|
+
* ```ts
|
|
143
|
+
* import { sql } from 'kysely'
|
|
144
|
+
*
|
|
145
|
+
* const { id, full_name } = await db
|
|
146
|
+
* .deleteFrom('person')
|
|
147
|
+
* .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
|
|
148
|
+
* .where('created_at', '<', new Date())
|
|
149
|
+
* .executeTakeFirst()
|
|
150
|
+
* ```
|
|
151
|
+
*
|
|
152
|
+
* Return the action performed on the row:
|
|
153
|
+
*
|
|
154
|
+
* ```ts
|
|
155
|
+
* await db
|
|
156
|
+
* .mergeInto('person')
|
|
157
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
158
|
+
* .whenMatched()
|
|
159
|
+
* .thenDelete()
|
|
160
|
+
* .whenNotMatched()
|
|
161
|
+
* .thenInsertValues({
|
|
162
|
+
* first_name: 'John',
|
|
163
|
+
* last_name: 'Doe',
|
|
164
|
+
* gender: 'male'
|
|
165
|
+
* })
|
|
166
|
+
* .output([
|
|
167
|
+
* 'inserted.id as inserted_id',
|
|
168
|
+
* 'deleted.id as deleted_id',
|
|
169
|
+
* ])
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
output<OE extends OutputExpression<DB, TT>>(selections: readonly OE[]): MergeQueryBuilder<DB, TT, ReturningRow<DB, TT, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
173
|
+
output<CB extends OutputCallback<DB, TT>>(callback: CB): MergeQueryBuilder<DB, TT, ReturningRow<DB, TT, O, SelectExpressionFromOutputCallback<CB>>>;
|
|
174
|
+
output<OE extends OutputExpression<DB, TT>>(selection: OE): MergeQueryBuilder<DB, TT, ReturningRow<DB, TT, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
175
|
+
/**
|
|
176
|
+
* Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
|
|
177
|
+
* that support `output` such as MS SQL Server (MSSQL).
|
|
178
|
+
*
|
|
179
|
+
* Also see the {@link output} method.
|
|
180
|
+
*/
|
|
181
|
+
outputAll(table: OutputPrefix): MergeQueryBuilder<DB, TT, ReturningAllRow<DB, TT, O>>;
|
|
99
182
|
}
|
|
100
183
|
export interface MergeQueryBuilderProps {
|
|
101
184
|
readonly queryId: QueryId;
|
|
102
185
|
readonly queryNode: MergeQueryNode;
|
|
103
186
|
readonly executor: QueryExecutor;
|
|
104
187
|
}
|
|
105
|
-
export declare class WheneableMergeQueryBuilder<DB, TT extends keyof DB, ST extends keyof DB, O> implements Compilable<O>, OperationNodeSource {
|
|
188
|
+
export declare class WheneableMergeQueryBuilder<DB, TT extends keyof DB, ST extends keyof DB, O> implements Compilable<O>, OutputInterface<DB, TT, O>, OperationNodeSource {
|
|
106
189
|
#private;
|
|
107
190
|
constructor(props: MergeQueryBuilderProps);
|
|
108
191
|
/**
|
|
@@ -275,6 +358,87 @@ export declare class WheneableMergeQueryBuilder<DB, TT extends keyof DB, ST exte
|
|
|
275
358
|
* the target table, and not from source table and returns a {@link MatchedThenableMergeQueryBuilder}.
|
|
276
359
|
*/
|
|
277
360
|
whenNotMatchedBySourceAndRef<LRE extends ReferenceExpression<DB, TT>, RRE extends ReferenceExpression<DB, TT>>(lhs: LRE, op: ComparisonOperatorExpression, rhs: RRE): MatchedThenableMergeQueryBuilder<DB, TT, ST, TT, O>;
|
|
361
|
+
/**
|
|
362
|
+
* Allows you to return data from modified rows.
|
|
363
|
+
*
|
|
364
|
+
* On supported databases like MS SQL Server (MSSQL), this method can be chained
|
|
365
|
+
* to `insert`, `update`, `delete` and `merge` queries to return data.
|
|
366
|
+
*
|
|
367
|
+
* Also see the {@link outputAll} method.
|
|
368
|
+
*
|
|
369
|
+
* ### Examples
|
|
370
|
+
*
|
|
371
|
+
* Return one column:
|
|
372
|
+
*
|
|
373
|
+
* ```ts
|
|
374
|
+
* const { id } = await db
|
|
375
|
+
* .insertInto('person')
|
|
376
|
+
* .output('inserted.id')
|
|
377
|
+
* .values({
|
|
378
|
+
* first_name: 'Jennifer',
|
|
379
|
+
* last_name: 'Aniston'
|
|
380
|
+
* })
|
|
381
|
+
* .executeTakeFirst()
|
|
382
|
+
* ```
|
|
383
|
+
*
|
|
384
|
+
* Return multiple columns:
|
|
385
|
+
*
|
|
386
|
+
* ```ts
|
|
387
|
+
* const { id, first_name } = await db
|
|
388
|
+
* .updateTable('person')
|
|
389
|
+
* .set({ first_name: 'John', last_name: 'Doe' })
|
|
390
|
+
* .output([
|
|
391
|
+
* 'deleted.first_name as old_first_name',
|
|
392
|
+
* 'deleted.last_name as old_last_name',
|
|
393
|
+
* 'inserted.first_name as new_first_name',
|
|
394
|
+
* 'inserted.last_name as new_last_name',
|
|
395
|
+
* ])
|
|
396
|
+
* .where('created_at', '<', new Date())
|
|
397
|
+
* .executeTakeFirst()
|
|
398
|
+
* ```
|
|
399
|
+
*
|
|
400
|
+
* Return arbitrary expressions:
|
|
401
|
+
*
|
|
402
|
+
* ```ts
|
|
403
|
+
* import { sql } from 'kysely'
|
|
404
|
+
*
|
|
405
|
+
* const { id, full_name } = await db
|
|
406
|
+
* .deleteFrom('person')
|
|
407
|
+
* .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
|
|
408
|
+
* .where('created_at', '<', new Date())
|
|
409
|
+
* .executeTakeFirst()
|
|
410
|
+
* ```
|
|
411
|
+
*
|
|
412
|
+
* Return the action performed on the row:
|
|
413
|
+
*
|
|
414
|
+
* ```ts
|
|
415
|
+
* await db
|
|
416
|
+
* .mergeInto('person')
|
|
417
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
418
|
+
* .whenMatched()
|
|
419
|
+
* .thenDelete()
|
|
420
|
+
* .whenNotMatched()
|
|
421
|
+
* .thenInsertValues({
|
|
422
|
+
* first_name: 'John',
|
|
423
|
+
* last_name: 'Doe',
|
|
424
|
+
* gender: 'male'
|
|
425
|
+
* })
|
|
426
|
+
* .output([
|
|
427
|
+
* 'inserted.id as inserted_id',
|
|
428
|
+
* 'deleted.id as deleted_id',
|
|
429
|
+
* ])
|
|
430
|
+
* ```
|
|
431
|
+
*/
|
|
432
|
+
output<OE extends OutputExpression<DB, TT>>(selections: readonly OE[]): WheneableMergeQueryBuilder<DB, TT, ST, ReturningRow<DB, TT, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
433
|
+
output<CB extends OutputCallback<DB, TT>>(callback: CB): WheneableMergeQueryBuilder<DB, TT, ST, ReturningRow<DB, TT, O, SelectExpressionFromOutputCallback<CB>>>;
|
|
434
|
+
output<OE extends OutputExpression<DB, TT>>(selection: OE): WheneableMergeQueryBuilder<DB, TT, ST, ReturningRow<DB, TT, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
435
|
+
/**
|
|
436
|
+
* Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
|
|
437
|
+
* that support `output` such as MS SQL Server (MSSQL).
|
|
438
|
+
*
|
|
439
|
+
* Also see the {@link output} method.
|
|
440
|
+
*/
|
|
441
|
+
outputAll(table: OutputPrefix): WheneableMergeQueryBuilder<DB, TT, ST, ReturningAllRow<DB, TT, O>>;
|
|
278
442
|
/**
|
|
279
443
|
* Simply calls the provided function passing `this` as the only argument. `$call` returns
|
|
280
444
|
* what the provided function returns.
|
|
@@ -337,7 +501,7 @@ export declare class WheneableMergeQueryBuilder<DB, TT extends keyof DB, ST exte
|
|
|
337
501
|
*/
|
|
338
502
|
$if<O2>(condition: boolean, func: (qb: this) => WheneableMergeQueryBuilder<any, any, any, O2>): O2 extends MergeResult ? WheneableMergeQueryBuilder<DB, TT, ST, MergeResult> : O2 extends O & infer E ? WheneableMergeQueryBuilder<DB, TT, ST, O & Partial<E>> : WheneableMergeQueryBuilder<DB, TT, ST, Partial<O2>>;
|
|
339
503
|
toOperationNode(): MergeQueryNode;
|
|
340
|
-
compile(): CompiledQuery<
|
|
504
|
+
compile(): CompiledQuery<O>;
|
|
341
505
|
/**
|
|
342
506
|
* Executes the query and returns an array of rows.
|
|
343
507
|
*
|
|
@@ -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';
|
|
@@ -77,6 +78,18 @@ export class MergeQueryBuilder {
|
|
|
77
78
|
queryNode: MergeQueryNode.cloneWithUsing(this.#props.queryNode, parseJoin('Using', args)),
|
|
78
79
|
});
|
|
79
80
|
}
|
|
81
|
+
output(args) {
|
|
82
|
+
return new MergeQueryBuilder({
|
|
83
|
+
...this.#props,
|
|
84
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
outputAll(table) {
|
|
88
|
+
return new MergeQueryBuilder({
|
|
89
|
+
...this.#props,
|
|
90
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
80
93
|
}
|
|
81
94
|
preventAwait(MergeQueryBuilder, "don't await MergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
|
|
82
95
|
export class WheneableMergeQueryBuilder {
|
|
@@ -214,6 +227,18 @@ export class WheneableMergeQueryBuilder {
|
|
|
214
227
|
whenNotMatchedBySourceAndRef(lhs, op, rhs) {
|
|
215
228
|
return this.#whenNotMatched([lhs, op, rhs], true, true);
|
|
216
229
|
}
|
|
230
|
+
output(args) {
|
|
231
|
+
return new WheneableMergeQueryBuilder({
|
|
232
|
+
...this.#props,
|
|
233
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
outputAll(table) {
|
|
237
|
+
return new WheneableMergeQueryBuilder({
|
|
238
|
+
...this.#props,
|
|
239
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
240
|
+
});
|
|
241
|
+
}
|
|
217
242
|
#whenNotMatched(args, refRight = false, bySource = false) {
|
|
218
243
|
const props = {
|
|
219
244
|
...this.#props,
|
|
@@ -298,7 +323,7 @@ export class WheneableMergeQueryBuilder {
|
|
|
298
323
|
return this.#props.executor.transformQuery(this.#props.queryNode, this.#props.queryId);
|
|
299
324
|
}
|
|
300
325
|
compile() {
|
|
301
|
-
return this.#props.executor.compileQuery(this
|
|
326
|
+
return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
|
|
302
327
|
}
|
|
303
328
|
/**
|
|
304
329
|
* Executes the query and returns an array of rows.
|
|
@@ -308,6 +333,10 @@ export class WheneableMergeQueryBuilder {
|
|
|
308
333
|
async execute() {
|
|
309
334
|
const compiledQuery = this.compile();
|
|
310
335
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
336
|
+
if (compiledQuery.query.output &&
|
|
337
|
+
this.#props.executor.adapter.supportsOutput) {
|
|
338
|
+
return result.rows;
|
|
339
|
+
}
|
|
311
340
|
return [new MergeResult(result.numAffectedRows)];
|
|
312
341
|
}
|
|
313
342
|
/**
|
|
@@ -303,7 +303,7 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
|
|
|
303
303
|
* .selectFrom('person')
|
|
304
304
|
* .selectAll()
|
|
305
305
|
* .where(
|
|
306
|
-
* sql
|
|
306
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
307
307
|
* 'like',
|
|
308
308
|
* '%' + name + '%',
|
|
309
309
|
* )
|
|
@@ -767,7 +767,7 @@ export declare class OnConflictUpdateBuilder<DB, TB extends keyof DB> implements
|
|
|
767
767
|
* .selectFrom('person')
|
|
768
768
|
* .selectAll()
|
|
769
769
|
* .where(
|
|
770
|
-
* sql
|
|
770
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
771
771
|
* 'like',
|
|
772
772
|
* '%' + name + '%',
|
|
773
773
|
* )
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { ExpressionBuilder } from '../expression/expression-builder.js';
|
|
2
|
+
import { AliasedExpressionOrFactory } from '../parser/expression-parser.js';
|
|
3
|
+
import { ReturningAllRow, ReturningRow } from '../parser/returning-parser.js';
|
|
4
|
+
import { AnyAliasedColumnWithTable, AnyColumnWithTable } from '../util/type-utils.js';
|
|
5
|
+
export interface OutputInterface<DB, TB extends keyof DB, O, OP extends OutputPrefix = OutputPrefix> {
|
|
6
|
+
/**
|
|
7
|
+
* Allows you to return data from modified rows.
|
|
8
|
+
*
|
|
9
|
+
* On supported databases like MS SQL Server (MSSQL), this method can be chained
|
|
10
|
+
* to `insert`, `update`, `delete` and `merge` queries to return data.
|
|
11
|
+
*
|
|
12
|
+
* Also see the {@link outputAll} method.
|
|
13
|
+
*
|
|
14
|
+
* ### Examples
|
|
15
|
+
*
|
|
16
|
+
* Return one column:
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* const { id } = await db
|
|
20
|
+
* .insertInto('person')
|
|
21
|
+
* .output('inserted.id')
|
|
22
|
+
* .values({
|
|
23
|
+
* first_name: 'Jennifer',
|
|
24
|
+
* last_name: 'Aniston'
|
|
25
|
+
* })
|
|
26
|
+
* .executeTakeFirst()
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* Return multiple columns:
|
|
30
|
+
*
|
|
31
|
+
* ```ts
|
|
32
|
+
* const { id, first_name } = await db
|
|
33
|
+
* .updateTable('person')
|
|
34
|
+
* .set({ first_name: 'John', last_name: 'Doe' })
|
|
35
|
+
* .output([
|
|
36
|
+
* 'deleted.first_name as old_first_name',
|
|
37
|
+
* 'deleted.last_name as old_last_name',
|
|
38
|
+
* 'inserted.first_name as new_first_name',
|
|
39
|
+
* 'inserted.last_name as new_last_name',
|
|
40
|
+
* ])
|
|
41
|
+
* .where('created_at', '<', new Date())
|
|
42
|
+
* .executeTakeFirst()
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* Return arbitrary expressions:
|
|
46
|
+
*
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { sql } from 'kysely'
|
|
49
|
+
*
|
|
50
|
+
* const { id, full_name } = await db
|
|
51
|
+
* .deleteFrom('person')
|
|
52
|
+
* .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
|
|
53
|
+
* .where('created_at', '<', new Date())
|
|
54
|
+
* .executeTakeFirst()
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* Return the action performed on the row:
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* await db
|
|
61
|
+
* .mergeInto('person')
|
|
62
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
63
|
+
* .whenMatched()
|
|
64
|
+
* .thenDelete()
|
|
65
|
+
* .whenNotMatched()
|
|
66
|
+
* .thenInsertValues({
|
|
67
|
+
* first_name: 'John',
|
|
68
|
+
* last_name: 'Doe',
|
|
69
|
+
* gender: 'male'
|
|
70
|
+
* })
|
|
71
|
+
* .output([
|
|
72
|
+
* 'inserted.id as inserted_id',
|
|
73
|
+
* 'deleted.id as deleted_id',
|
|
74
|
+
* ])
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
output<OE extends OutputExpression<DB, TB, OP>>(selections: ReadonlyArray<OE>): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>, OP>;
|
|
78
|
+
output<CB extends OutputCallback<DB, TB, OP>>(callback: CB): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>, OP>;
|
|
79
|
+
output<OE extends OutputExpression<DB, TB, OP>>(selection: OE): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>, OP>;
|
|
80
|
+
/**
|
|
81
|
+
* Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
|
|
82
|
+
* that support `output` such as MS SQL Server (MSSQL).
|
|
83
|
+
*
|
|
84
|
+
* Also see the {@link output} method.
|
|
85
|
+
*/
|
|
86
|
+
outputAll(table: OP): OutputInterface<DB, TB, ReturningAllRow<DB, TB, O>, OP>;
|
|
87
|
+
}
|
|
88
|
+
export type OutputPrefix = 'deleted' | 'inserted';
|
|
89
|
+
export type OutputDatabase<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix> = {
|
|
90
|
+
[K in OP]: DB[TB];
|
|
91
|
+
};
|
|
92
|
+
export type OutputExpression<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix, ODB = OutputDatabase<DB, TB, OP>, OTB extends keyof ODB = keyof ODB> = AnyAliasedColumnWithTable<ODB, OTB> | AnyColumnWithTable<ODB, OTB> | AliasedExpressionOrFactory<ODB, OTB>;
|
|
93
|
+
export type OutputCallback<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix> = (eb: ExpressionBuilder<OutputDatabase<DB, TB, OP>, OP>) => ReadonlyArray<OutputExpression<DB, TB, OP>>;
|
|
94
|
+
export type SelectExpressionFromOutputExpression<OE> = OE extends `${OutputPrefix}.${infer C}` ? C : OE;
|
|
95
|
+
export type SelectExpressionFromOutputCallback<CB> = CB extends (eb: ExpressionBuilder<any, any>) => ReadonlyArray<infer OE> ? SelectExpressionFromOutputExpression<OE> : never;
|
|
@@ -67,6 +67,8 @@ export interface ReturningInterface<DB, TB extends keyof DB, O> {
|
|
|
67
67
|
/**
|
|
68
68
|
* Adds a `returning *` to an insert/update/delete query on databases
|
|
69
69
|
* that support `returning` such as PostgreSQL.
|
|
70
|
+
*
|
|
71
|
+
* Also see the {@link returning} method.
|
|
70
72
|
*/
|
|
71
73
|
returningAll(): ReturningInterface<DB, TB, Selectable<DB[TB]>>;
|
|
72
74
|
}
|
|
@@ -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
|
*
|
|
@@ -269,6 +269,12 @@ class SelectQueryBuilderImpl {
|
|
|
269
269
|
queryNode: SelectQueryNode.cloneWithoutOrderBy(this.#props.queryNode),
|
|
270
270
|
});
|
|
271
271
|
}
|
|
272
|
+
clearGroupBy() {
|
|
273
|
+
return new SelectQueryBuilderImpl({
|
|
274
|
+
...this.#props,
|
|
275
|
+
queryNode: SelectQueryNode.cloneWithoutGroupBy(this.#props.queryNode),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
272
278
|
$call(func) {
|
|
273
279
|
return func(this);
|
|
274
280
|
}
|