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
|
@@ -4,7 +4,7 @@ import { SnakeCaseTransformer } from './camel-case-transformer.js';
|
|
|
4
4
|
import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
|
|
5
5
|
/**
|
|
6
6
|
* A plugin that converts snake_case identifiers in the database into
|
|
7
|
-
* camelCase in the
|
|
7
|
+
* camelCase in the JavaScript side.
|
|
8
8
|
*
|
|
9
9
|
* For example let's assume we have a table called `person_table`
|
|
10
10
|
* with columns `first_name` and `last_name` in the database. When
|
|
@@ -44,7 +44,7 @@ import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
|
|
|
44
44
|
* ```
|
|
45
45
|
*
|
|
46
46
|
* As you can see from the example, __everything__ needs to be defined
|
|
47
|
-
* in camelCase in the
|
|
47
|
+
* in camelCase in the TypeScript code: table names, columns, schemas,
|
|
48
48
|
* __everything__. When using the `CamelCasePlugin` Kysely works as if
|
|
49
49
|
* the database was defined in camelCase.
|
|
50
50
|
*
|
|
@@ -2,6 +2,20 @@ import { QueryResult } from '../../driver/database-connection.js';
|
|
|
2
2
|
import { RootOperationNode } from '../../query-compiler/query-compiler.js';
|
|
3
3
|
import { UnknownRow } from '../../util/type-utils.js';
|
|
4
4
|
import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
|
|
5
|
+
export interface ParseJSONResultsPluginOptions {
|
|
6
|
+
/**
|
|
7
|
+
* When `'in-place'`, arrays' and objects' values are parsed in-place. This is
|
|
8
|
+
* the most time and space efficient option.
|
|
9
|
+
*
|
|
10
|
+
* This can result in runtime errors if some objects/arrays are readonly.
|
|
11
|
+
*
|
|
12
|
+
* When `'create'`, new arrays and objects are created to avoid such errors.
|
|
13
|
+
*
|
|
14
|
+
* Defaults to `'in-place'`.
|
|
15
|
+
*/
|
|
16
|
+
objectStrategy?: ObjectStrategy;
|
|
17
|
+
}
|
|
18
|
+
type ObjectStrategy = 'in-place' | 'create';
|
|
5
19
|
/**
|
|
6
20
|
* Parses JSON strings in query results into JSON objects.
|
|
7
21
|
*
|
|
@@ -16,6 +30,9 @@ import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } fro
|
|
|
16
30
|
* ```
|
|
17
31
|
*/
|
|
18
32
|
export declare class ParseJSONResultsPlugin implements KyselyPlugin {
|
|
33
|
+
#private;
|
|
34
|
+
readonly opt: ParseJSONResultsPluginOptions;
|
|
35
|
+
constructor(opt?: ParseJSONResultsPluginOptions);
|
|
19
36
|
/**
|
|
20
37
|
* This is called for each query before it is executed. You can modify the query by
|
|
21
38
|
* transforming its {@link OperationNode} tree provided in {@link PluginTransformQueryArgs.node | args.node}
|
|
@@ -53,3 +70,4 @@ export declare class ParseJSONResultsPlugin implements KyselyPlugin {
|
|
|
53
70
|
*/
|
|
54
71
|
transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
|
|
55
72
|
}
|
|
73
|
+
export {};
|
|
@@ -14,6 +14,12 @@ import { isPlainObject, isString } from '../../util/object-utils.js';
|
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
16
|
export class ParseJSONResultsPlugin {
|
|
17
|
+
opt;
|
|
18
|
+
#objectStrategy;
|
|
19
|
+
constructor(opt = {}) {
|
|
20
|
+
this.opt = opt;
|
|
21
|
+
this.#objectStrategy = opt.objectStrategy || 'in-place';
|
|
22
|
+
}
|
|
17
23
|
// noop
|
|
18
24
|
transformQuery(args) {
|
|
19
25
|
return args.node;
|
|
@@ -21,32 +27,33 @@ export class ParseJSONResultsPlugin {
|
|
|
21
27
|
async transformResult(args) {
|
|
22
28
|
return {
|
|
23
29
|
...args.result,
|
|
24
|
-
rows: parseArray(args.result.rows),
|
|
30
|
+
rows: parseArray(args.result.rows, this.#objectStrategy),
|
|
25
31
|
};
|
|
26
32
|
}
|
|
27
33
|
}
|
|
28
|
-
function parseArray(arr) {
|
|
34
|
+
function parseArray(arr, objectStrategy) {
|
|
35
|
+
const target = objectStrategy === 'create' ? new Array(arr.length) : arr;
|
|
29
36
|
for (let i = 0; i < arr.length; ++i) {
|
|
30
|
-
|
|
37
|
+
target[i] = parse(arr[i], objectStrategy);
|
|
31
38
|
}
|
|
32
|
-
return
|
|
39
|
+
return target;
|
|
33
40
|
}
|
|
34
|
-
function parse(obj) {
|
|
41
|
+
function parse(obj, objectStrategy) {
|
|
35
42
|
if (isString(obj)) {
|
|
36
43
|
return parseString(obj);
|
|
37
44
|
}
|
|
38
45
|
if (Array.isArray(obj)) {
|
|
39
|
-
return parseArray(obj);
|
|
46
|
+
return parseArray(obj, objectStrategy);
|
|
40
47
|
}
|
|
41
48
|
if (isPlainObject(obj)) {
|
|
42
|
-
return parseObject(obj);
|
|
49
|
+
return parseObject(obj, objectStrategy);
|
|
43
50
|
}
|
|
44
51
|
return obj;
|
|
45
52
|
}
|
|
46
53
|
function parseString(str) {
|
|
47
54
|
if (maybeJson(str)) {
|
|
48
55
|
try {
|
|
49
|
-
return parse(JSON.parse(str));
|
|
56
|
+
return parse(JSON.parse(str), 'in-place');
|
|
50
57
|
}
|
|
51
58
|
catch (err) {
|
|
52
59
|
// this catch block is intentionally empty.
|
|
@@ -57,9 +64,10 @@ function parseString(str) {
|
|
|
57
64
|
function maybeJson(value) {
|
|
58
65
|
return value.match(/^[\[\{]/) != null;
|
|
59
66
|
}
|
|
60
|
-
function parseObject(obj) {
|
|
67
|
+
function parseObject(obj, objectStrategy) {
|
|
68
|
+
const target = objectStrategy === 'create' ? {} : obj;
|
|
61
69
|
for (const key in obj) {
|
|
62
|
-
|
|
70
|
+
target[key] = parse(obj[key], objectStrategy);
|
|
63
71
|
}
|
|
64
|
-
return
|
|
72
|
+
return target;
|
|
65
73
|
}
|
|
@@ -24,7 +24,8 @@ import { KyselyTypeError } from '../util/type-error.js';
|
|
|
24
24
|
import { Streamable } from '../util/streamable.js';
|
|
25
25
|
import { ExpressionOrFactory } from '../parser/expression-parser.js';
|
|
26
26
|
import { ValueExpression } from '../parser/value-parser.js';
|
|
27
|
-
|
|
27
|
+
import { OutputCallback, OutputExpression, OutputInterface, SelectExpressionFromOutputCallback, SelectExpressionFromOutputExpression } from './output-interface.js';
|
|
28
|
+
export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OutputInterface<DB, TB, O, 'deleted'>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
|
|
28
29
|
#private;
|
|
29
30
|
constructor(props: DeleteQueryBuilderProps);
|
|
30
31
|
/**
|
|
@@ -289,7 +290,7 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
289
290
|
* .selectFrom('person')
|
|
290
291
|
* .selectAll()
|
|
291
292
|
* .where(
|
|
292
|
-
* sql
|
|
293
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
293
294
|
* 'like',
|
|
294
295
|
* '%' + name + '%',
|
|
295
296
|
* )
|
|
@@ -799,9 +800,92 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
799
800
|
/**
|
|
800
801
|
* Adds a `returning *` to an insert/update/delete query on databases
|
|
801
802
|
* that support `returning` such as PostgreSQL.
|
|
803
|
+
*
|
|
804
|
+
* Also see the {@link returning} method.
|
|
802
805
|
*/
|
|
803
806
|
returningAll<T extends TB>(table: T): DeleteQueryBuilder<DB, TB, ReturningAllRow<DB, T, O>>;
|
|
804
807
|
returningAll(): DeleteQueryBuilder<DB, TB, ReturningAllRow<DB, TB, O>>;
|
|
808
|
+
/**
|
|
809
|
+
* Allows you to return data from modified rows.
|
|
810
|
+
*
|
|
811
|
+
* On supported databases like MS SQL Server (MSSQL), this method can be chained
|
|
812
|
+
* to `insert`, `update`, `delete` and `merge` queries to return data.
|
|
813
|
+
*
|
|
814
|
+
* Also see the {@link outputAll} method.
|
|
815
|
+
*
|
|
816
|
+
* ### Examples
|
|
817
|
+
*
|
|
818
|
+
* Return one column:
|
|
819
|
+
*
|
|
820
|
+
* ```ts
|
|
821
|
+
* const { id } = await db
|
|
822
|
+
* .insertInto('person')
|
|
823
|
+
* .output('inserted.id')
|
|
824
|
+
* .values({
|
|
825
|
+
* first_name: 'Jennifer',
|
|
826
|
+
* last_name: 'Aniston'
|
|
827
|
+
* })
|
|
828
|
+
* .executeTakeFirst()
|
|
829
|
+
* ```
|
|
830
|
+
*
|
|
831
|
+
* Return multiple columns:
|
|
832
|
+
*
|
|
833
|
+
* ```ts
|
|
834
|
+
* const { id, first_name } = await db
|
|
835
|
+
* .updateTable('person')
|
|
836
|
+
* .set({ first_name: 'John', last_name: 'Doe' })
|
|
837
|
+
* .output([
|
|
838
|
+
* 'deleted.first_name as old_first_name',
|
|
839
|
+
* 'deleted.last_name as old_last_name',
|
|
840
|
+
* 'inserted.first_name as new_first_name',
|
|
841
|
+
* 'inserted.last_name as new_last_name',
|
|
842
|
+
* ])
|
|
843
|
+
* .where('created_at', '<', new Date())
|
|
844
|
+
* .executeTakeFirst()
|
|
845
|
+
* ```
|
|
846
|
+
*
|
|
847
|
+
* Return arbitrary expressions:
|
|
848
|
+
*
|
|
849
|
+
* ```ts
|
|
850
|
+
* import { sql } from 'kysely'
|
|
851
|
+
*
|
|
852
|
+
* const { id, full_name } = await db
|
|
853
|
+
* .deleteFrom('person')
|
|
854
|
+
* .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
|
|
855
|
+
* .where('created_at', '<', new Date())
|
|
856
|
+
* .executeTakeFirst()
|
|
857
|
+
* ```
|
|
858
|
+
*
|
|
859
|
+
* Return the action performed on the row:
|
|
860
|
+
*
|
|
861
|
+
* ```ts
|
|
862
|
+
* await db
|
|
863
|
+
* .mergeInto('person')
|
|
864
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
865
|
+
* .whenMatched()
|
|
866
|
+
* .thenDelete()
|
|
867
|
+
* .whenNotMatched()
|
|
868
|
+
* .thenInsertValues({
|
|
869
|
+
* first_name: 'John',
|
|
870
|
+
* last_name: 'Doe',
|
|
871
|
+
* gender: 'male'
|
|
872
|
+
* })
|
|
873
|
+
* .output([
|
|
874
|
+
* 'inserted.id as inserted_id',
|
|
875
|
+
* 'deleted.id as deleted_id',
|
|
876
|
+
* ])
|
|
877
|
+
* ```
|
|
878
|
+
*/
|
|
879
|
+
output<OE extends OutputExpression<DB, TB, 'deleted'>>(selections: readonly OE[]): DeleteQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
880
|
+
output<CB extends OutputCallback<DB, TB, 'deleted'>>(callback: CB): DeleteQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>>;
|
|
881
|
+
output<OE extends OutputExpression<DB, TB, 'deleted'>>(selection: OE): DeleteQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
882
|
+
/**
|
|
883
|
+
* Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
|
|
884
|
+
* that support `output` such as MS SQL Server (MSSQL).
|
|
885
|
+
*
|
|
886
|
+
* Also see the {@link output} method.
|
|
887
|
+
*/
|
|
888
|
+
outputAll(table: 'deleted'): DeleteQueryBuilder<DB, TB, ReturningAllRow<DB, TB, O>>;
|
|
805
889
|
/**
|
|
806
890
|
* Clears all `returning` clauses from the query.
|
|
807
891
|
*
|
|
@@ -1026,17 +1110,17 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
1026
1110
|
/**
|
|
1027
1111
|
* Asserts that query's output row type equals the given type `T`.
|
|
1028
1112
|
*
|
|
1029
|
-
* This method can be used to simplify excessively complex types to make
|
|
1113
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
1030
1114
|
* and much faster.
|
|
1031
1115
|
*
|
|
1032
1116
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
1033
|
-
* for
|
|
1117
|
+
* for TypeScript and you get errors like this:
|
|
1034
1118
|
*
|
|
1035
1119
|
* ```
|
|
1036
1120
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
1037
1121
|
* ```
|
|
1038
1122
|
*
|
|
1039
|
-
* In these case you can often use this method to help
|
|
1123
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
1040
1124
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
1041
1125
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
1042
1126
|
*
|
|
@@ -123,6 +123,18 @@ export class DeleteQueryBuilder {
|
|
|
123
123
|
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll(table)),
|
|
124
124
|
});
|
|
125
125
|
}
|
|
126
|
+
output(args) {
|
|
127
|
+
return new DeleteQueryBuilder({
|
|
128
|
+
...this.#props,
|
|
129
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
outputAll(table) {
|
|
133
|
+
return new DeleteQueryBuilder({
|
|
134
|
+
...this.#props,
|
|
135
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
126
138
|
/**
|
|
127
139
|
* Clears all `returning` clauses from the query.
|
|
128
140
|
*
|
|
@@ -385,17 +397,17 @@ export class DeleteQueryBuilder {
|
|
|
385
397
|
/**
|
|
386
398
|
* Asserts that query's output row type equals the given type `T`.
|
|
387
399
|
*
|
|
388
|
-
* This method can be used to simplify excessively complex types to make
|
|
400
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
389
401
|
* and much faster.
|
|
390
402
|
*
|
|
391
403
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
392
|
-
* for
|
|
404
|
+
* for TypeScript and you get errors like this:
|
|
393
405
|
*
|
|
394
406
|
* ```
|
|
395
407
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
396
408
|
* ```
|
|
397
409
|
*
|
|
398
|
-
* In these case you can often use this method to help
|
|
410
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
399
411
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
400
412
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
401
413
|
*
|
|
@@ -448,9 +460,11 @@ export class DeleteQueryBuilder {
|
|
|
448
460
|
*/
|
|
449
461
|
async execute() {
|
|
450
462
|
const compiledQuery = this.compile();
|
|
451
|
-
const query = compiledQuery.query;
|
|
452
463
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
453
|
-
|
|
464
|
+
const { adapter } = this.#props.executor;
|
|
465
|
+
const query = compiledQuery.query;
|
|
466
|
+
if ((query.returning && adapter.supportsReturning) ||
|
|
467
|
+
(query.output && adapter.supportsOutput)) {
|
|
454
468
|
return result.rows;
|
|
455
469
|
}
|
|
456
470
|
return [
|
|
@@ -106,7 +106,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
106
106
|
* ```ts
|
|
107
107
|
* db.selectFrom('person')
|
|
108
108
|
* .selectAll('person')
|
|
109
|
-
* .where(sql
|
|
109
|
+
* .where(sql<string>`upper(first_name)`, '=', 'JENNIFER')
|
|
110
110
|
* ```
|
|
111
111
|
*/
|
|
112
112
|
<O, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(name: string, args?: ReadonlyArray<RE>): ExpressionWrapper<DB, TB, O>;
|
|
@@ -173,7 +173,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
173
173
|
* If this function is used in a `select` statement, the type of the selected
|
|
174
174
|
* expression will be `number | string` by default. This is because Kysely can't know the
|
|
175
175
|
* type the db driver outputs. Sometimes the output can be larger than the largest
|
|
176
|
-
*
|
|
176
|
+
* JavaScript number and a string is returned instead. Most drivers allow you
|
|
177
177
|
* to configure the output type of large numbers and Kysely can't know if you've
|
|
178
178
|
* done so.
|
|
179
179
|
*
|
|
@@ -292,7 +292,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
292
292
|
* If this function is used in a `select` statement, the type of the selected
|
|
293
293
|
* expression will be `number | string | bigint` by default. This is because
|
|
294
294
|
* Kysely can't know the type the db driver outputs. Sometimes the output can
|
|
295
|
-
* be larger than the largest
|
|
295
|
+
* be larger than the largest JavaScript number and a string is returned instead.
|
|
296
296
|
* Most drivers allow you to configure the output type of large numbers and Kysely
|
|
297
297
|
* can't know if you've done so.
|
|
298
298
|
*
|
|
@@ -344,7 +344,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
344
344
|
* If this is used in a `select` statement, the type of the selected expression
|
|
345
345
|
* will be `number | string | bigint` by default. This is because Kysely
|
|
346
346
|
* can't know the type the db driver outputs. Sometimes the output can be larger
|
|
347
|
-
* than the largest
|
|
347
|
+
* than the largest JavaScript number and a string is returned instead. Most
|
|
348
348
|
* drivers allow you to configure the output type of large numbers and Kysely
|
|
349
349
|
* can't know if you've done so.
|
|
350
350
|
*
|
|
@@ -513,7 +513,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
|
|
|
513
513
|
* If this function is used in a `select` statement, the type of the selected
|
|
514
514
|
* expression will be `number | string` by default. This is because Kysely can't know the
|
|
515
515
|
* type the db driver outputs. Sometimes the output can be larger than the largest
|
|
516
|
-
*
|
|
516
|
+
* JavaScript number and a string is returned instead. Most drivers allow you
|
|
517
517
|
* to configure the output type of large numbers and Kysely can't know if you've
|
|
518
518
|
* done so.
|
|
519
519
|
*
|
|
@@ -11,7 +11,7 @@ import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
|
11
11
|
import { QueryId } from '../util/query-id.js';
|
|
12
12
|
import { InsertResult } from './insert-result.js';
|
|
13
13
|
import { KyselyPlugin } from '../plugin/kysely-plugin.js';
|
|
14
|
-
import { ReturningCallbackRow, ReturningRow } from '../parser/returning-parser.js';
|
|
14
|
+
import { ReturningAllRow, ReturningCallbackRow, ReturningRow } from '../parser/returning-parser.js';
|
|
15
15
|
import { NoResultErrorConstructor } from './no-result-error.js';
|
|
16
16
|
import { ExpressionOrFactory } from '../parser/expression-parser.js';
|
|
17
17
|
import { ReturningInterface } from './returning-interface.js';
|
|
@@ -21,7 +21,8 @@ import { Explainable, ExplainFormat } from '../util/explainable.js';
|
|
|
21
21
|
import { Expression } from '../expression/expression.js';
|
|
22
22
|
import { KyselyTypeError } from '../util/type-error.js';
|
|
23
23
|
import { Streamable } from '../util/streamable.js';
|
|
24
|
-
|
|
24
|
+
import { OutputCallback, OutputExpression, OutputInterface, SelectExpressionFromOutputCallback, SelectExpressionFromOutputExpression } from './output-interface.js';
|
|
25
|
+
export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements ReturningInterface<DB, TB, O>, OutputInterface<DB, TB, O, 'inserted'>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
|
|
25
26
|
#private;
|
|
26
27
|
constructor(props: InsertQueryBuilderProps);
|
|
27
28
|
/**
|
|
@@ -143,11 +144,10 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
143
144
|
* .insertInto('person')
|
|
144
145
|
* .values(({ ref, selectFrom, fn }) => ({
|
|
145
146
|
* first_name: 'Jennifer',
|
|
146
|
-
* last_name: sql
|
|
147
|
+
* last_name: sql<string>`>concat(${ani}, ${ston})`,
|
|
147
148
|
* middle_name: ref('first_name'),
|
|
148
149
|
* age: selectFrom('person')
|
|
149
|
-
* .select(fn.avg<number>('age')
|
|
150
|
-
* .as('avg_age')),
|
|
150
|
+
* .select(fn.avg<number>('age').as('avg_age')),
|
|
151
151
|
* }))
|
|
152
152
|
* .executeTakeFirst()
|
|
153
153
|
* ```
|
|
@@ -215,7 +215,9 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
215
215
|
*
|
|
216
216
|
* <!-- siteExample("insert", "Insert subquery", 50) -->
|
|
217
217
|
*
|
|
218
|
-
* You can create an `INSERT INTO SELECT FROM` query using the `expression` method
|
|
218
|
+
* You can create an `INSERT INTO SELECT FROM` query using the `expression` method.
|
|
219
|
+
* This API doesn't follow our WYSIWYG principles and might be a bit difficult to
|
|
220
|
+
* remember. The reasons for this design stem from implementation difficulties.
|
|
219
221
|
*
|
|
220
222
|
* ```ts
|
|
221
223
|
* const result = await db.insertInto('person')
|
|
@@ -386,7 +388,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
386
388
|
* species: 'cat',
|
|
387
389
|
* })
|
|
388
390
|
* .onConflict((oc) => oc
|
|
389
|
-
* .expression(sql
|
|
391
|
+
* .expression(sql<string>`lower(name)`)
|
|
390
392
|
* .doUpdateSet({ species: 'hamster' })
|
|
391
393
|
* )
|
|
392
394
|
* .execute()
|
|
@@ -553,8 +555,91 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
553
555
|
/**
|
|
554
556
|
* Adds a `returning *` to an insert/update/delete query on databases
|
|
555
557
|
* that support `returning` such as PostgreSQL.
|
|
558
|
+
*
|
|
559
|
+
* Also see the {@link returning} method.
|
|
556
560
|
*/
|
|
557
561
|
returningAll(): InsertQueryBuilder<DB, TB, Selectable<DB[TB]>>;
|
|
562
|
+
/**
|
|
563
|
+
* Allows you to return data from modified rows.
|
|
564
|
+
*
|
|
565
|
+
* On supported databases like MS SQL Server (MSSQL), this method can be chained
|
|
566
|
+
* to `insert`, `update`, `delete` and `merge` queries to return data.
|
|
567
|
+
*
|
|
568
|
+
* Also see the {@link outputAll} method.
|
|
569
|
+
*
|
|
570
|
+
* ### Examples
|
|
571
|
+
*
|
|
572
|
+
* Return one column:
|
|
573
|
+
*
|
|
574
|
+
* ```ts
|
|
575
|
+
* const { id } = await db
|
|
576
|
+
* .insertInto('person')
|
|
577
|
+
* .output('inserted.id')
|
|
578
|
+
* .values({
|
|
579
|
+
* first_name: 'Jennifer',
|
|
580
|
+
* last_name: 'Aniston'
|
|
581
|
+
* })
|
|
582
|
+
* .executeTakeFirst()
|
|
583
|
+
* ```
|
|
584
|
+
*
|
|
585
|
+
* Return multiple columns:
|
|
586
|
+
*
|
|
587
|
+
* ```ts
|
|
588
|
+
* const { id, first_name } = await db
|
|
589
|
+
* .updateTable('person')
|
|
590
|
+
* .set({ first_name: 'John', last_name: 'Doe' })
|
|
591
|
+
* .output([
|
|
592
|
+
* 'deleted.first_name as old_first_name',
|
|
593
|
+
* 'deleted.last_name as old_last_name',
|
|
594
|
+
* 'inserted.first_name as new_first_name',
|
|
595
|
+
* 'inserted.last_name as new_last_name',
|
|
596
|
+
* ])
|
|
597
|
+
* .where('created_at', '<', new Date())
|
|
598
|
+
* .executeTakeFirst()
|
|
599
|
+
* ```
|
|
600
|
+
*
|
|
601
|
+
* Return arbitrary expressions:
|
|
602
|
+
*
|
|
603
|
+
* ```ts
|
|
604
|
+
* import { sql } from 'kysely'
|
|
605
|
+
*
|
|
606
|
+
* const { id, full_name } = await db
|
|
607
|
+
* .deleteFrom('person')
|
|
608
|
+
* .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
|
|
609
|
+
* .where('created_at', '<', new Date())
|
|
610
|
+
* .executeTakeFirst()
|
|
611
|
+
* ```
|
|
612
|
+
*
|
|
613
|
+
* Return the action performed on the row:
|
|
614
|
+
*
|
|
615
|
+
* ```ts
|
|
616
|
+
* await db
|
|
617
|
+
* .mergeInto('person')
|
|
618
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
619
|
+
* .whenMatched()
|
|
620
|
+
* .thenDelete()
|
|
621
|
+
* .whenNotMatched()
|
|
622
|
+
* .thenInsertValues({
|
|
623
|
+
* first_name: 'John',
|
|
624
|
+
* last_name: 'Doe',
|
|
625
|
+
* gender: 'male'
|
|
626
|
+
* })
|
|
627
|
+
* .output([
|
|
628
|
+
* 'inserted.id as inserted_id',
|
|
629
|
+
* 'deleted.id as deleted_id',
|
|
630
|
+
* ])
|
|
631
|
+
* ```
|
|
632
|
+
*/
|
|
633
|
+
output<OE extends OutputExpression<DB, TB, 'inserted'>>(selections: readonly OE[]): InsertQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
634
|
+
output<CB extends OutputCallback<DB, TB, 'inserted'>>(callback: CB): InsertQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>>;
|
|
635
|
+
output<OE extends OutputExpression<DB, TB, 'inserted'>>(selection: OE): InsertQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
|
|
636
|
+
/**
|
|
637
|
+
* Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
|
|
638
|
+
* that support `output` such as MS SQL Server (MSSQL).
|
|
639
|
+
*
|
|
640
|
+
* Also see the {@link output} method.
|
|
641
|
+
*/
|
|
642
|
+
outputAll(table: 'inserted'): InsertQueryBuilder<DB, TB, ReturningAllRow<DB, TB, O>>;
|
|
558
643
|
/**
|
|
559
644
|
* Clears all `returning` clauses from the query.
|
|
560
645
|
*
|
|
@@ -685,17 +770,17 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
685
770
|
/**
|
|
686
771
|
* Asserts that query's output row type equals the given type `T`.
|
|
687
772
|
*
|
|
688
|
-
* This method can be used to simplify excessively complex types to make
|
|
773
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
689
774
|
* and much faster.
|
|
690
775
|
*
|
|
691
776
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
692
|
-
* for
|
|
777
|
+
* for TypeScript and you get errors like this:
|
|
693
778
|
*
|
|
694
779
|
* ```
|
|
695
780
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
696
781
|
* ```
|
|
697
782
|
*
|
|
698
|
-
* In these case you can often use this method to help
|
|
783
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
699
784
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
700
785
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
701
786
|
*
|
|
@@ -138,11 +138,10 @@ export class InsertQueryBuilder {
|
|
|
138
138
|
* .insertInto('person')
|
|
139
139
|
* .values(({ ref, selectFrom, fn }) => ({
|
|
140
140
|
* first_name: 'Jennifer',
|
|
141
|
-
* last_name: sql
|
|
141
|
+
* last_name: sql<string>`>concat(${ani}, ${ston})`,
|
|
142
142
|
* middle_name: ref('first_name'),
|
|
143
143
|
* age: selectFrom('person')
|
|
144
|
-
* .select(fn.avg<number>('age')
|
|
145
|
-
* .as('avg_age')),
|
|
144
|
+
* .select(fn.avg<number>('age').as('avg_age')),
|
|
146
145
|
* }))
|
|
147
146
|
* .executeTakeFirst()
|
|
148
147
|
* ```
|
|
@@ -226,7 +225,9 @@ export class InsertQueryBuilder {
|
|
|
226
225
|
*
|
|
227
226
|
* <!-- siteExample("insert", "Insert subquery", 50) -->
|
|
228
227
|
*
|
|
229
|
-
* You can create an `INSERT INTO SELECT FROM` query using the `expression` method
|
|
228
|
+
* You can create an `INSERT INTO SELECT FROM` query using the `expression` method.
|
|
229
|
+
* This API doesn't follow our WYSIWYG principles and might be a bit difficult to
|
|
230
|
+
* remember. The reasons for this design stem from implementation difficulties.
|
|
230
231
|
*
|
|
231
232
|
* ```ts
|
|
232
233
|
* const result = await db.insertInto('person')
|
|
@@ -423,7 +424,7 @@ export class InsertQueryBuilder {
|
|
|
423
424
|
* species: 'cat',
|
|
424
425
|
* })
|
|
425
426
|
* .onConflict((oc) => oc
|
|
426
|
-
* .expression(sql
|
|
427
|
+
* .expression(sql<string>`lower(name)`)
|
|
427
428
|
* .doUpdateSet({ species: 'hamster' })
|
|
428
429
|
* )
|
|
429
430
|
* .execute()
|
|
@@ -553,6 +554,18 @@ export class InsertQueryBuilder {
|
|
|
553
554
|
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll()),
|
|
554
555
|
});
|
|
555
556
|
}
|
|
557
|
+
output(args) {
|
|
558
|
+
return new InsertQueryBuilder({
|
|
559
|
+
...this.#props,
|
|
560
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
outputAll(table) {
|
|
564
|
+
return new InsertQueryBuilder({
|
|
565
|
+
...this.#props,
|
|
566
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
567
|
+
});
|
|
568
|
+
}
|
|
556
569
|
/**
|
|
557
570
|
* Clears all `returning` clauses from the query.
|
|
558
571
|
*
|
|
@@ -701,17 +714,17 @@ export class InsertQueryBuilder {
|
|
|
701
714
|
/**
|
|
702
715
|
* Asserts that query's output row type equals the given type `T`.
|
|
703
716
|
*
|
|
704
|
-
* This method can be used to simplify excessively complex types to make
|
|
717
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
705
718
|
* and much faster.
|
|
706
719
|
*
|
|
707
720
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
708
|
-
* for
|
|
721
|
+
* for TypeScript and you get errors like this:
|
|
709
722
|
*
|
|
710
723
|
* ```
|
|
711
724
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
712
725
|
* ```
|
|
713
726
|
*
|
|
714
|
-
* In these case you can often use this method to help
|
|
727
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
715
728
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
716
729
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
717
730
|
*
|
|
@@ -764,9 +777,11 @@ export class InsertQueryBuilder {
|
|
|
764
777
|
*/
|
|
765
778
|
async execute() {
|
|
766
779
|
const compiledQuery = this.compile();
|
|
767
|
-
const query = compiledQuery.query;
|
|
768
780
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
769
|
-
|
|
781
|
+
const { adapter } = this.#props.executor;
|
|
782
|
+
const query = compiledQuery.query;
|
|
783
|
+
if ((query.returning && adapter.supportsReturning) ||
|
|
784
|
+
(query.output && adapter.supportsOutput)) {
|
|
770
785
|
return result.rows;
|
|
771
786
|
}
|
|
772
787
|
return [
|