kysely 0.27.2 → 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/database-introspector.d.ts +1 -0
- 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/mssql/mssql-introspector.js +13 -2
- package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +3 -1
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/cjs/driver/database-connection.d.ts +4 -2
- 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 +31 -5
- package/dist/cjs/expression/expression-builder.js +7 -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 +31 -18
- package/dist/cjs/index.js +30 -17
- package/dist/cjs/kysely.d.ts +1 -1
- package/dist/cjs/kysely.js +3 -3
- package/dist/cjs/operation-node/add-index-node.js +1 -1
- 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/cast-node.d.ts +13 -0
- package/dist/cjs/operation-node/cast-node.js +19 -0
- package/dist/cjs/operation-node/column-definition-node.d.ts +2 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
- package/dist/cjs/operation-node/data-type-node.js +56 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +6 -0
- package/dist/cjs/operation-node/delete-query-node.js +12 -0
- package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
- package/dist/cjs/operation-node/fetch-node.js +19 -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 +6 -1
- package/dist/cjs/operation-node/insert-query-node.js +5 -0
- package/dist/cjs/operation-node/join-node.d.ts +1 -1
- package/dist/cjs/operation-node/matched-node.d.ts +13 -0
- package/dist/cjs/operation-node/matched-node.js +19 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +27 -0
- package/dist/cjs/operation-node/merge-query-node.js +45 -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 +12 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +62 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +12 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +6 -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 +17 -5
- package/dist/cjs/operation-node/query-node.js +24 -1
- package/dist/cjs/operation-node/select-query-node.d.ts +6 -0
- package/dist/cjs/operation-node/select-query-node.js +12 -0
- package/dist/cjs/operation-node/top-node.d.ts +14 -0
- package/dist/cjs/operation-node/top-node.js +19 -0
- package/dist/cjs/operation-node/update-query-node.d.ts +9 -1
- package/dist/cjs/operation-node/update-query-node.js +11 -0
- package/dist/cjs/operation-node/where-node.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.js +7 -8
- package/dist/cjs/parser/data-type-parser.js +8 -5
- 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.d.ts +2 -0
- package/dist/cjs/parser/fetch-parser.js +17 -0
- 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.d.ts +3 -3
- 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.d.ts +9 -0
- package/dist/cjs/parser/merge-parser.js +31 -0
- 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.d.ts +4 -3
- package/dist/cjs/parser/table-parser.js +4 -5
- package/dist/cjs/parser/top-parser.d.ts +2 -0
- package/dist/cjs/parser/top-parser.js +19 -0
- 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/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +188 -5
- package/dist/cjs/query-builder/delete-query-builder.js +139 -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 +166 -10
- package/dist/cjs/query-builder/insert-query-builder.js +107 -10
- package/dist/cjs/query-builder/merge-query-builder.d.ts +721 -0
- package/dist/cjs/query-builder/merge-query-builder.js +547 -0
- package/dist/cjs/query-builder/merge-result.d.ts +4 -0
- package/dist/cjs/query-builder/merge-result.js +10 -0
- 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 +177 -17
- package/dist/cjs/query-builder/select-query-builder.js +21 -2
- package/dist/cjs/query-builder/update-query-builder.d.ts +175 -10
- package/dist/cjs/query-builder/update-query-builder.js +119 -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 +12 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +118 -10
- package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
- package/dist/cjs/query-creator.d.ts +96 -5
- package/dist/cjs/query-creator.js +63 -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 +7 -3
- package/dist/cjs/schema/alter-table-builder.js +1 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +18 -1
- package/dist/cjs/schema/column-definition-builder.js +22 -1
- package/dist/cjs/util/assert.js +2 -3
- package/dist/cjs/util/compilable.js +1 -2
- package/dist/cjs/util/infer-result.d.ts +2 -1
- 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/cjs/util/type-utils.d.ts +3 -2
- package/dist/esm/dialect/database-introspector.d.ts +1 -0
- 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/mssql/mssql-introspector.js +13 -2
- package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +3 -1
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/esm/driver/database-connection.d.ts +4 -2
- 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 +31 -5
- package/dist/esm/expression/expression-builder.js +5 -0
- 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 +31 -18
- package/dist/esm/index.js +30 -17
- package/dist/esm/kysely.d.ts +1 -1
- package/dist/esm/kysely.js +1 -1
- package/dist/esm/operation-node/add-index-node.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/cast-node.d.ts +13 -0
- package/dist/esm/operation-node/cast-node.js +17 -0
- package/dist/esm/operation-node/column-definition-node.d.ts +2 -0
- package/dist/esm/operation-node/data-type-node.d.ts +5 -1
- package/dist/esm/operation-node/data-type-node.js +55 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +6 -0
- package/dist/esm/operation-node/delete-query-node.js +12 -0
- package/dist/esm/operation-node/fetch-node.d.ts +15 -0
- package/dist/esm/operation-node/fetch-node.js +17 -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 +6 -1
- package/dist/esm/operation-node/insert-query-node.js +5 -0
- package/dist/esm/operation-node/join-node.d.ts +1 -1
- package/dist/esm/operation-node/matched-node.d.ts +13 -0
- package/dist/esm/operation-node/matched-node.js +17 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +27 -0
- package/dist/esm/operation-node/merge-query-node.js +43 -0
- package/dist/esm/operation-node/on-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +12 -0
- package/dist/esm/operation-node/operation-node-transformer.js +62 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +12 -0
- package/dist/esm/operation-node/operation-node-visitor.js +6 -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 +17 -5
- package/dist/esm/operation-node/query-node.js +24 -1
- package/dist/esm/operation-node/select-query-node.d.ts +6 -0
- package/dist/esm/operation-node/select-query-node.js +12 -0
- package/dist/esm/operation-node/top-node.d.ts +14 -0
- package/dist/esm/operation-node/top-node.js +17 -0
- package/dist/esm/operation-node/update-query-node.d.ts +9 -1
- package/dist/esm/operation-node/update-query-node.js +11 -0
- package/dist/esm/operation-node/where-node.d.ts +1 -1
- package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
- package/dist/esm/parser/binary-operation-parser.js +2 -2
- package/dist/esm/parser/data-type-parser.js +8 -4
- package/dist/esm/parser/fetch-parser.d.ts +2 -0
- package/dist/esm/parser/fetch-parser.js +15 -0
- package/dist/esm/parser/insert-values-parser.d.ts +3 -3
- package/dist/esm/parser/merge-parser.d.ts +9 -0
- package/dist/esm/parser/merge-parser.js +28 -0
- package/dist/esm/parser/returning-parser.d.ts +4 -3
- package/dist/esm/parser/table-parser.d.ts +4 -3
- package/dist/esm/parser/top-parser.d.ts +2 -0
- package/dist/esm/parser/top-parser.js +17 -0
- 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/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +188 -5
- package/dist/esm/query-builder/delete-query-builder.js +139 -5
- package/dist/esm/query-builder/function-module.d.ts +5 -5
- package/dist/esm/query-builder/insert-query-builder.d.ts +166 -10
- package/dist/esm/query-builder/insert-query-builder.js +107 -10
- package/dist/esm/query-builder/merge-query-builder.d.ts +721 -0
- package/dist/esm/query-builder/merge-query-builder.js +541 -0
- package/dist/esm/query-builder/merge-result.d.ts +4 -0
- package/dist/esm/query-builder/merge-result.js +7 -0
- 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 +177 -17
- package/dist/esm/query-builder/select-query-builder.js +20 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +175 -10
- package/dist/esm/query-builder/update-query-builder.js +119 -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 +12 -0
- package/dist/esm/query-compiler/default-query-compiler.js +118 -10
- package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
- package/dist/esm/query-creator.d.ts +96 -5
- package/dist/esm/query-creator.js +64 -2
- 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 +8 -4
- package/dist/esm/schema/alter-table-builder.js +1 -2
- package/dist/esm/schema/column-definition-builder.d.ts +18 -1
- package/dist/esm/schema/column-definition-builder.js +22 -1
- package/dist/esm/util/infer-result.d.ts +2 -1
- package/dist/esm/util/object-utils.js +18 -5
- package/dist/esm/util/type-utils.d.ts +3 -2
- package/package.json +26 -24
|
@@ -10,6 +10,9 @@ import { freeze } from '../util/object-utils.js';
|
|
|
10
10
|
import { UpdateResult } from './update-result.js';
|
|
11
11
|
import { isNoResultErrorConstructor, NoResultError, } from './no-result-error.js';
|
|
12
12
|
import { parseReferentialBinaryOperation, parseValueBinaryOperationOrExpression, } from '../parser/binary-operation-parser.js';
|
|
13
|
+
import { parseValueExpression, } from '../parser/value-parser.js';
|
|
14
|
+
import { LimitNode } from '../operation-node/limit-node.js';
|
|
15
|
+
import { parseTop } from '../parser/top-parser.js';
|
|
13
16
|
export class UpdateQueryBuilder {
|
|
14
17
|
#props;
|
|
15
18
|
constructor(props) {
|
|
@@ -33,6 +36,51 @@ export class UpdateQueryBuilder {
|
|
|
33
36
|
queryNode: QueryNode.cloneWithoutWhere(this.#props.queryNode),
|
|
34
37
|
});
|
|
35
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Changes an `update` query into a `update top` query.
|
|
41
|
+
*
|
|
42
|
+
* `top` clause is only supported by some dialects like MS SQL Server.
|
|
43
|
+
*
|
|
44
|
+
* ### Examples
|
|
45
|
+
*
|
|
46
|
+
* Update the first row:
|
|
47
|
+
*
|
|
48
|
+
* ```ts
|
|
49
|
+
* await db.updateTable('person')
|
|
50
|
+
* .top(1)
|
|
51
|
+
* .set({ first_name: 'Foo' })
|
|
52
|
+
* .where('age', '>', 18)
|
|
53
|
+
* .executeTakeFirstOrThrow()
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* The generated SQL (MS SQL Server):
|
|
57
|
+
*
|
|
58
|
+
* ```sql
|
|
59
|
+
* update top(1) "person" set "first_name" = @1 where "age" > @2
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* Update the 50% first rows:
|
|
63
|
+
*
|
|
64
|
+
* ```ts
|
|
65
|
+
* await db.updateTable('person')
|
|
66
|
+
* .top(50, 'percent')
|
|
67
|
+
* .set({ first_name: 'Foo' })
|
|
68
|
+
* .where('age', '>', 18)
|
|
69
|
+
* .executeTakeFirstOrThrow()
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* The generated SQL (MS SQL Server):
|
|
73
|
+
*
|
|
74
|
+
* ```sql
|
|
75
|
+
* update top(50) percent "person" set "first_name" = @1 where "age" > @2
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
top(expression, modifiers) {
|
|
79
|
+
return new UpdateQueryBuilder({
|
|
80
|
+
...this.#props,
|
|
81
|
+
queryNode: QueryNode.cloneWithTop(this.#props.queryNode, parseTop(expression, modifiers)),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
36
84
|
from(from) {
|
|
37
85
|
return new UpdateQueryBuilder({
|
|
38
86
|
...this.#props,
|
|
@@ -63,6 +111,31 @@ export class UpdateQueryBuilder {
|
|
|
63
111
|
queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin('FullJoin', args)),
|
|
64
112
|
});
|
|
65
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Adds a limit clause to the update query for supported databases, such as MySQL.
|
|
116
|
+
*
|
|
117
|
+
* ### Examples
|
|
118
|
+
*
|
|
119
|
+
* Update the first 2 rows in the 'person' table:
|
|
120
|
+
*
|
|
121
|
+
* ```ts
|
|
122
|
+
* return await db
|
|
123
|
+
* .updateTable('person')
|
|
124
|
+
* .set({ first_name: 'Foo' })
|
|
125
|
+
* .limit(2);
|
|
126
|
+
* ```
|
|
127
|
+
*
|
|
128
|
+
* The generated SQL (MySQL):
|
|
129
|
+
* ```sql
|
|
130
|
+
* update `person` set `first_name` = 'Foo' limit 2
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
limit(limit) {
|
|
134
|
+
return new UpdateQueryBuilder({
|
|
135
|
+
...this.#props,
|
|
136
|
+
queryNode: UpdateQueryNode.cloneWithLimit(this.#props.queryNode, LimitNode.create(parseValueExpression(limit))),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
66
139
|
set(...args) {
|
|
67
140
|
return new UpdateQueryBuilder({
|
|
68
141
|
...this.#props,
|
|
@@ -75,10 +148,47 @@ export class UpdateQueryBuilder {
|
|
|
75
148
|
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectArg(selection)),
|
|
76
149
|
});
|
|
77
150
|
}
|
|
78
|
-
returningAll() {
|
|
151
|
+
returningAll(table) {
|
|
152
|
+
return new UpdateQueryBuilder({
|
|
153
|
+
...this.#props,
|
|
154
|
+
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll(table)),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
output(args) {
|
|
158
|
+
return new UpdateQueryBuilder({
|
|
159
|
+
...this.#props,
|
|
160
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
outputAll(table) {
|
|
164
|
+
return new UpdateQueryBuilder({
|
|
165
|
+
...this.#props,
|
|
166
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Clears all `returning` clauses from the query.
|
|
171
|
+
*
|
|
172
|
+
* ### Examples
|
|
173
|
+
*
|
|
174
|
+
* ```ts
|
|
175
|
+
* db.updateTable('person')
|
|
176
|
+
* .returningAll()
|
|
177
|
+
* .set({ age: 39 })
|
|
178
|
+
* .where('first_name', '=', 'John')
|
|
179
|
+
* .clearReturning()
|
|
180
|
+
* ```
|
|
181
|
+
*
|
|
182
|
+
* The generated SQL(PostgreSQL):
|
|
183
|
+
*
|
|
184
|
+
* ```sql
|
|
185
|
+
* update "person" set "age" = 39 where "first_name" = "John"
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
clearReturning() {
|
|
79
189
|
return new UpdateQueryBuilder({
|
|
80
190
|
...this.#props,
|
|
81
|
-
queryNode: QueryNode.
|
|
191
|
+
queryNode: QueryNode.cloneWithoutReturning(this.#props.queryNode),
|
|
82
192
|
});
|
|
83
193
|
}
|
|
84
194
|
/**
|
|
@@ -210,17 +320,17 @@ export class UpdateQueryBuilder {
|
|
|
210
320
|
/**
|
|
211
321
|
* Asserts that query's output row type equals the given type `T`.
|
|
212
322
|
*
|
|
213
|
-
* This method can be used to simplify excessively complex types to make
|
|
323
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
214
324
|
* and much faster.
|
|
215
325
|
*
|
|
216
326
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
217
|
-
* for
|
|
327
|
+
* for TypeScript and you get errors like this:
|
|
218
328
|
*
|
|
219
329
|
* ```
|
|
220
330
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
221
331
|
* ```
|
|
222
332
|
*
|
|
223
|
-
* In these case you can often use this method to help
|
|
333
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
224
334
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
225
335
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
226
336
|
*
|
|
@@ -275,9 +385,11 @@ export class UpdateQueryBuilder {
|
|
|
275
385
|
*/
|
|
276
386
|
async execute() {
|
|
277
387
|
const compiledQuery = this.compile();
|
|
278
|
-
const query = compiledQuery.query;
|
|
279
388
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
280
|
-
|
|
389
|
+
const { adapter } = this.#props.executor;
|
|
390
|
+
const query = compiledQuery.query;
|
|
391
|
+
if ((query.returning && adapter.supportsReturning) ||
|
|
392
|
+
(query.output && adapter.supportsOutput)) {
|
|
281
393
|
return result.rows;
|
|
282
394
|
}
|
|
283
395
|
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
|
}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/// <reference types="./update-result.d.ts" />
|
|
2
2
|
export class UpdateResult {
|
|
3
|
+
/**
|
|
4
|
+
* The number of rows the update query updated (even if not changed).
|
|
5
|
+
*/
|
|
3
6
|
numUpdatedRows;
|
|
7
|
+
/**
|
|
8
|
+
* The number of rows the update query changed.
|
|
9
|
+
*
|
|
10
|
+
* This is **optional** and only supported in dialects such as MySQL.
|
|
11
|
+
* You would probably use {@link numUpdatedRows} in most cases.
|
|
12
|
+
*/
|
|
4
13
|
numChangedRows;
|
|
5
14
|
constructor(numUpdatedRows, numChangedRows) {
|
|
6
15
|
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
|
* )
|
|
@@ -88,7 +88,13 @@ import { JSONPathNode } from '../operation-node/json-path-node.js';
|
|
|
88
88
|
import { JSONPathLegNode } from '../operation-node/json-path-leg-node.js';
|
|
89
89
|
import { JSONOperatorChainNode } from '../operation-node/json-operator-chain-node.js';
|
|
90
90
|
import { TupleNode } from '../operation-node/tuple-node.js';
|
|
91
|
+
import { MergeQueryNode } from '../operation-node/merge-query-node.js';
|
|
92
|
+
import { MatchedNode } from '../operation-node/matched-node.js';
|
|
91
93
|
import { AddIndexNode } from '../operation-node/add-index-node.js';
|
|
94
|
+
import { CastNode } from '../operation-node/cast-node.js';
|
|
95
|
+
import { FetchNode } from '../operation-node/fetch-node.js';
|
|
96
|
+
import { TopNode } from '../operation-node/top-node.js';
|
|
97
|
+
import { OutputNode } from '../operation-node/output-node.js';
|
|
92
98
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
93
99
|
#private;
|
|
94
100
|
protected get numParameters(): number;
|
|
@@ -185,7 +191,13 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
185
191
|
protected visitJSONPath(node: JSONPathNode): void;
|
|
186
192
|
protected visitJSONPathLeg(node: JSONPathLegNode): void;
|
|
187
193
|
protected visitJSONOperatorChain(node: JSONOperatorChainNode): void;
|
|
194
|
+
protected visitMergeQuery(node: MergeQueryNode): void;
|
|
195
|
+
protected visitMatched(node: MatchedNode): void;
|
|
188
196
|
protected visitAddIndex(node: AddIndexNode): void;
|
|
197
|
+
protected visitCast(node: CastNode): void;
|
|
198
|
+
protected visitFetch(node: FetchNode): void;
|
|
199
|
+
protected visitOutput(node: OutputNode): void;
|
|
200
|
+
protected visitTop(node: TopNode): void;
|
|
189
201
|
protected append(str: string): void;
|
|
190
202
|
protected appendValue(parameter: unknown): void;
|
|
191
203
|
protected getLeftIdentifierWrapper(): string;
|
|
@@ -8,6 +8,7 @@ import { QueryNode } from '../operation-node/query-node.js';
|
|
|
8
8
|
import { freeze, isString, isNumber, isBoolean, isNull, isDate, isBigInt, } from '../util/object-utils.js';
|
|
9
9
|
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
10
10
|
import { SetOperationNode } from '../operation-node/set-operation-node.js';
|
|
11
|
+
import { MergeQueryNode } from '../operation-node/merge-query-node.js';
|
|
11
12
|
export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
12
13
|
#sql = '';
|
|
13
14
|
#parameters = [];
|
|
@@ -17,6 +18,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
17
18
|
compileQuery(node) {
|
|
18
19
|
this.#sql = '';
|
|
19
20
|
this.#parameters = [];
|
|
21
|
+
this.nodeStack.splice(0, this.nodeStack.length);
|
|
20
22
|
this.visitNode(node);
|
|
21
23
|
return freeze({
|
|
22
24
|
query: node,
|
|
@@ -54,6 +56,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
54
56
|
this.append(' ');
|
|
55
57
|
this.compileList(node.frontModifiers, ' ');
|
|
56
58
|
}
|
|
59
|
+
if (node.top) {
|
|
60
|
+
this.append(' ');
|
|
61
|
+
this.visitNode(node.top);
|
|
62
|
+
}
|
|
57
63
|
if (node.selections) {
|
|
58
64
|
this.append(' ');
|
|
59
65
|
this.compileList(node.selections);
|
|
@@ -94,6 +100,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
94
100
|
this.append(' ');
|
|
95
101
|
this.visitNode(node.offset);
|
|
96
102
|
}
|
|
103
|
+
if (node.fetch) {
|
|
104
|
+
this.append(' ');
|
|
105
|
+
this.visitNode(node.fetch);
|
|
106
|
+
}
|
|
97
107
|
if (node.endModifiers?.length) {
|
|
98
108
|
this.append(' ');
|
|
99
109
|
this.compileList(this.sortSelectModifiers([...node.endModifiers]), ' ');
|
|
@@ -135,12 +145,13 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
135
145
|
this.visitNode(node.having);
|
|
136
146
|
}
|
|
137
147
|
visitInsertQuery(node) {
|
|
138
|
-
const
|
|
148
|
+
const rootQueryNode = this.nodeStack.find(QueryNode.is);
|
|
149
|
+
const isSubQuery = rootQueryNode !== node;
|
|
139
150
|
if (!isSubQuery && node.explain) {
|
|
140
151
|
this.visitNode(node.explain);
|
|
141
152
|
this.append(' ');
|
|
142
153
|
}
|
|
143
|
-
if (isSubQuery) {
|
|
154
|
+
if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
|
|
144
155
|
this.append('(');
|
|
145
156
|
}
|
|
146
157
|
if (node.with) {
|
|
@@ -151,13 +162,23 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
151
162
|
if (node.ignore) {
|
|
152
163
|
this.append(' ignore');
|
|
153
164
|
}
|
|
154
|
-
|
|
155
|
-
|
|
165
|
+
if (node.top) {
|
|
166
|
+
this.append(' ');
|
|
167
|
+
this.visitNode(node.top);
|
|
168
|
+
}
|
|
169
|
+
if (node.into) {
|
|
170
|
+
this.append(' into ');
|
|
171
|
+
this.visitNode(node.into);
|
|
172
|
+
}
|
|
156
173
|
if (node.columns) {
|
|
157
174
|
this.append(' (');
|
|
158
175
|
this.compileList(node.columns);
|
|
159
176
|
this.append(')');
|
|
160
177
|
}
|
|
178
|
+
if (node.output) {
|
|
179
|
+
this.append(' ');
|
|
180
|
+
this.visitNode(node.output);
|
|
181
|
+
}
|
|
161
182
|
if (node.values) {
|
|
162
183
|
this.append(' ');
|
|
163
184
|
this.visitNode(node.values);
|
|
@@ -178,7 +199,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
178
199
|
this.append(' ');
|
|
179
200
|
this.visitNode(node.returning);
|
|
180
201
|
}
|
|
181
|
-
if (isSubQuery) {
|
|
202
|
+
if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
|
|
182
203
|
this.append(')');
|
|
183
204
|
}
|
|
184
205
|
}
|
|
@@ -200,7 +221,15 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
200
221
|
this.append(' ');
|
|
201
222
|
}
|
|
202
223
|
this.append('delete ');
|
|
224
|
+
if (node.top) {
|
|
225
|
+
this.visitNode(node.top);
|
|
226
|
+
this.append(' ');
|
|
227
|
+
}
|
|
203
228
|
this.visitNode(node.from);
|
|
229
|
+
if (node.output) {
|
|
230
|
+
this.append(' ');
|
|
231
|
+
this.visitNode(node.output);
|
|
232
|
+
}
|
|
204
233
|
if (node.using) {
|
|
205
234
|
this.append(' ');
|
|
206
235
|
this.visitNode(node.using);
|
|
@@ -371,6 +400,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
371
400
|
}
|
|
372
401
|
}
|
|
373
402
|
visitColumnDefinition(node) {
|
|
403
|
+
if (node.ifNotExists) {
|
|
404
|
+
this.append('if not exists ');
|
|
405
|
+
}
|
|
374
406
|
this.visitNode(node.column);
|
|
375
407
|
this.append(' ');
|
|
376
408
|
this.visitNode(node.dataType);
|
|
@@ -385,6 +417,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
385
417
|
this.append(' ');
|
|
386
418
|
this.visitNode(node.generated);
|
|
387
419
|
}
|
|
420
|
+
if (node.identity) {
|
|
421
|
+
this.append(' identity');
|
|
422
|
+
}
|
|
388
423
|
if (node.defaultTo) {
|
|
389
424
|
this.append(' ');
|
|
390
425
|
this.visitNode(node.defaultTo);
|
|
@@ -468,12 +503,13 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
468
503
|
this.visitNode(node.groupBy);
|
|
469
504
|
}
|
|
470
505
|
visitUpdateQuery(node) {
|
|
471
|
-
const
|
|
506
|
+
const rootQueryNode = this.nodeStack.find(QueryNode.is);
|
|
507
|
+
const isSubQuery = rootQueryNode !== node;
|
|
472
508
|
if (!isSubQuery && node.explain) {
|
|
473
509
|
this.visitNode(node.explain);
|
|
474
510
|
this.append(' ');
|
|
475
511
|
}
|
|
476
|
-
if (isSubQuery) {
|
|
512
|
+
if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
|
|
477
513
|
this.append('(');
|
|
478
514
|
}
|
|
479
515
|
if (node.with) {
|
|
@@ -481,11 +517,22 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
481
517
|
this.append(' ');
|
|
482
518
|
}
|
|
483
519
|
this.append('update ');
|
|
484
|
-
|
|
485
|
-
|
|
520
|
+
if (node.top) {
|
|
521
|
+
this.visitNode(node.top);
|
|
522
|
+
this.append(' ');
|
|
523
|
+
}
|
|
524
|
+
if (node.table) {
|
|
525
|
+
this.visitNode(node.table);
|
|
526
|
+
this.append(' ');
|
|
527
|
+
}
|
|
528
|
+
this.append('set ');
|
|
486
529
|
if (node.updates) {
|
|
487
530
|
this.compileList(node.updates);
|
|
488
531
|
}
|
|
532
|
+
if (node.output) {
|
|
533
|
+
this.append(' ');
|
|
534
|
+
this.visitNode(node.output);
|
|
535
|
+
}
|
|
489
536
|
if (node.from) {
|
|
490
537
|
this.append(' ');
|
|
491
538
|
this.visitNode(node.from);
|
|
@@ -498,11 +545,15 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
498
545
|
this.append(' ');
|
|
499
546
|
this.visitNode(node.where);
|
|
500
547
|
}
|
|
548
|
+
if (node.limit) {
|
|
549
|
+
this.append(' ');
|
|
550
|
+
this.visitNode(node.limit);
|
|
551
|
+
}
|
|
501
552
|
if (node.returning) {
|
|
502
553
|
this.append(' ');
|
|
503
554
|
this.visitNode(node.returning);
|
|
504
555
|
}
|
|
505
|
-
if (isSubQuery) {
|
|
556
|
+
if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
|
|
506
557
|
this.append(')');
|
|
507
558
|
}
|
|
508
559
|
}
|
|
@@ -1038,6 +1089,40 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
1038
1089
|
this.visitNode(node.values[i]);
|
|
1039
1090
|
}
|
|
1040
1091
|
}
|
|
1092
|
+
visitMergeQuery(node) {
|
|
1093
|
+
if (node.with) {
|
|
1094
|
+
this.visitNode(node.with);
|
|
1095
|
+
this.append(' ');
|
|
1096
|
+
}
|
|
1097
|
+
this.append('merge ');
|
|
1098
|
+
if (node.top) {
|
|
1099
|
+
this.visitNode(node.top);
|
|
1100
|
+
this.append(' ');
|
|
1101
|
+
}
|
|
1102
|
+
this.append('into ');
|
|
1103
|
+
this.visitNode(node.into);
|
|
1104
|
+
if (node.using) {
|
|
1105
|
+
this.append(' ');
|
|
1106
|
+
this.visitNode(node.using);
|
|
1107
|
+
}
|
|
1108
|
+
if (node.whens) {
|
|
1109
|
+
this.append(' ');
|
|
1110
|
+
this.compileList(node.whens, ' ');
|
|
1111
|
+
}
|
|
1112
|
+
if (node.output) {
|
|
1113
|
+
this.append(' ');
|
|
1114
|
+
this.visitNode(node.output);
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
visitMatched(node) {
|
|
1118
|
+
if (node.not) {
|
|
1119
|
+
this.append('not ');
|
|
1120
|
+
}
|
|
1121
|
+
this.append('matched');
|
|
1122
|
+
if (node.bySource) {
|
|
1123
|
+
this.append(' by source');
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1041
1126
|
visitAddIndex(node) {
|
|
1042
1127
|
this.append('add ');
|
|
1043
1128
|
if (node.unique) {
|
|
@@ -1055,6 +1140,28 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
1055
1140
|
this.visitNode(node.using);
|
|
1056
1141
|
}
|
|
1057
1142
|
}
|
|
1143
|
+
visitCast(node) {
|
|
1144
|
+
this.append('cast(');
|
|
1145
|
+
this.visitNode(node.expression);
|
|
1146
|
+
this.append(' as ');
|
|
1147
|
+
this.visitNode(node.dataType);
|
|
1148
|
+
this.append(')');
|
|
1149
|
+
}
|
|
1150
|
+
visitFetch(node) {
|
|
1151
|
+
this.append('fetch next ');
|
|
1152
|
+
this.visitNode(node.rowCount);
|
|
1153
|
+
this.append(` rows ${node.modifier}`);
|
|
1154
|
+
}
|
|
1155
|
+
visitOutput(node) {
|
|
1156
|
+
this.append('output ');
|
|
1157
|
+
this.compileList(node.selections);
|
|
1158
|
+
}
|
|
1159
|
+
visitTop(node) {
|
|
1160
|
+
this.append(`top(${node.expression})`);
|
|
1161
|
+
if (node.modifiers) {
|
|
1162
|
+
this.append(` ${node.modifiers}`);
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1058
1165
|
append(str) {
|
|
1059
1166
|
this.#sql += str;
|
|
1060
1167
|
}
|
|
@@ -1164,4 +1271,5 @@ const JOIN_TYPE_SQL = freeze({
|
|
|
1164
1271
|
FullJoin: 'full join',
|
|
1165
1272
|
LateralInnerJoin: 'inner join lateral',
|
|
1166
1273
|
LateralLeftJoin: 'left join lateral',
|
|
1274
|
+
Using: 'using',
|
|
1167
1275
|
});
|
|
@@ -9,10 +9,11 @@ import { DropSchemaNode } from '../operation-node/drop-schema-node.js';
|
|
|
9
9
|
import { DropTableNode } from '../operation-node/drop-table-node.js';
|
|
10
10
|
import { DropTypeNode } from '../operation-node/drop-type-node.js';
|
|
11
11
|
import { DropViewNode } from '../operation-node/drop-view-node.js';
|
|
12
|
+
import { MergeQueryNode } from '../operation-node/merge-query-node.js';
|
|
12
13
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
13
14
|
import { RawNode } from '../operation-node/raw-node.js';
|
|
14
15
|
import { CompiledQuery } from './compiled-query.js';
|
|
15
|
-
export type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode | CreateTypeNode | DropTypeNode;
|
|
16
|
+
export type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode | CreateTypeNode | DropTypeNode | MergeQueryNode;
|
|
16
17
|
/**
|
|
17
18
|
* a `QueryCompiler` compiles a query expressed as a tree of `OperationNodes` into SQL.
|
|
18
19
|
*/
|
|
@@ -12,6 +12,8 @@ import { UpdateResult } from './query-builder/update-result.js';
|
|
|
12
12
|
import { KyselyPlugin } from './plugin/kysely-plugin.js';
|
|
13
13
|
import { CTEBuilderCallback } from './query-builder/cte-builder.js';
|
|
14
14
|
import { CallbackSelection, SelectCallback, SelectExpression, Selection } from './parser/select-parser.js';
|
|
15
|
+
import { MergeQueryBuilder } from './query-builder/merge-query-builder.js';
|
|
16
|
+
import { MergeResult } from './query-builder/merge-result.js';
|
|
15
17
|
export declare class QueryCreator<DB> {
|
|
16
18
|
#private;
|
|
17
19
|
constructor(props: QueryCreatorProps);
|
|
@@ -123,10 +125,10 @@ export declare class QueryCreator<DB> {
|
|
|
123
125
|
* ```
|
|
124
126
|
*/
|
|
125
127
|
selectFrom<TE extends keyof DB & string>(from: TE[]): SelectQueryBuilder<DB, ExtractTableAlias<DB, TE>, {}>;
|
|
126
|
-
selectFrom<TE extends TableExpression<DB,
|
|
128
|
+
selectFrom<TE extends TableExpression<DB, never>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
|
|
127
129
|
selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, ExtractTableAlias<DB, TE>, {}>;
|
|
128
|
-
selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, ExtractTableAlias<DB, TE>, {}>;
|
|
129
|
-
selectFrom<TE extends TableExpression<DB,
|
|
130
|
+
selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, ExtractTableAlias<DB & PickTableWithAlias<DB, TE>, TE>, {}>;
|
|
131
|
+
selectFrom<TE extends TableExpression<DB, never>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
|
|
130
132
|
/**
|
|
131
133
|
* Creates a `select` query builder without a `from` clause.
|
|
132
134
|
*
|
|
@@ -320,31 +322,120 @@ export declare class QueryCreator<DB> {
|
|
|
320
322
|
* ```
|
|
321
323
|
*/
|
|
322
324
|
updateTable<TR extends keyof DB & string>(table: TR): UpdateQueryBuilder<DB, ExtractTableAlias<DB, TR>, ExtractTableAlias<DB, TR>, UpdateResult>;
|
|
323
|
-
updateTable<TR extends AnyAliasedTable<DB>>(table: TR): UpdateQueryBuilder<DB & PickTableWithAlias<DB, TR>, ExtractTableAlias<DB, TR>, ExtractTableAlias<DB, TR>, UpdateResult>;
|
|
325
|
+
updateTable<TR extends AnyAliasedTable<DB>>(table: TR): UpdateQueryBuilder<DB & PickTableWithAlias<DB, TR>, ExtractTableAlias<DB & PickTableWithAlias<DB, TR>, TR>, ExtractTableAlias<DB & PickTableWithAlias<DB, TR>, TR>, UpdateResult>;
|
|
324
326
|
updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<From<DB, TR>, FromTables<DB, never, TR>, FromTables<DB, never, TR>, UpdateResult>;
|
|
327
|
+
/**
|
|
328
|
+
* Creates a merge query.
|
|
329
|
+
*
|
|
330
|
+
* The return value of the query is a {@link MergeResult}.
|
|
331
|
+
*
|
|
332
|
+
* See the {@link MergeQueryBuilder.using} method for examples on how to specify
|
|
333
|
+
* the other table.
|
|
334
|
+
*
|
|
335
|
+
* ### Examples
|
|
336
|
+
*
|
|
337
|
+
* ```ts
|
|
338
|
+
* const result = await db
|
|
339
|
+
* .mergeInto('person')
|
|
340
|
+
* .using('pet', 'pet.owner_id', 'person.id')
|
|
341
|
+
* .whenMatched((and) => and('has_pets', '!=', 'Y'))
|
|
342
|
+
* .thenUpdateSet({ has_pets: 'Y' })
|
|
343
|
+
* .whenNotMatched()
|
|
344
|
+
* .thenDoNothing()
|
|
345
|
+
* .executeTakeFirstOrThrow()
|
|
346
|
+
*
|
|
347
|
+
* console.log(result.numChangedRows)
|
|
348
|
+
* ```
|
|
349
|
+
*
|
|
350
|
+
* The generated SQL (PostgreSQL):
|
|
351
|
+
*
|
|
352
|
+
* ```sql
|
|
353
|
+
* merge into "person"
|
|
354
|
+
* using "pet" on "pet"."owner_id" = "person"."id"
|
|
355
|
+
* when matched and "has_pets" != $1 then
|
|
356
|
+
* update set "has_pets" = $2
|
|
357
|
+
* when not matched then
|
|
358
|
+
* do nothing
|
|
359
|
+
* ```
|
|
360
|
+
*/
|
|
361
|
+
mergeInto<TR extends keyof DB & string>(targetTable: TR): MergeQueryBuilder<DB, TR, MergeResult>;
|
|
362
|
+
mergeInto<TR extends AnyAliasedTable<DB>>(targetTable: TR): MergeQueryBuilder<DB & PickTableWithAlias<DB, TR>, ExtractTableAlias<DB & PickTableWithAlias<DB, TR>, TR>, MergeResult>;
|
|
325
363
|
/**
|
|
326
364
|
* Creates a `with` query (Common Table Expression).
|
|
327
365
|
*
|
|
328
366
|
* ### Examples
|
|
329
367
|
*
|
|
368
|
+
* <!-- siteExample("cte", "Simple selects", 10) -->
|
|
369
|
+
*
|
|
370
|
+
* Common table expressions (CTE) are a great way to modularize complex queries.
|
|
371
|
+
* Essentially they allow you to run multiple separate queries within a
|
|
372
|
+
* single roundtrip to the DB.
|
|
373
|
+
*
|
|
374
|
+
* Since CTEs are a part of the main query, query optimizers inside DB
|
|
375
|
+
* engines are able to optimize the overall query. For example, postgres
|
|
376
|
+
* is able to inline the CTEs inside the using queries if it decides it's
|
|
377
|
+
* faster.
|
|
378
|
+
*
|
|
330
379
|
* ```ts
|
|
331
|
-
* await db
|
|
380
|
+
* const result = await db
|
|
381
|
+
* // Create a CTE called `jennifers` that selects all
|
|
382
|
+
* // persons named 'Jennifer'.
|
|
332
383
|
* .with('jennifers', (db) => db
|
|
333
384
|
* .selectFrom('person')
|
|
334
385
|
* .where('first_name', '=', 'Jennifer')
|
|
335
386
|
* .select(['id', 'age'])
|
|
336
387
|
* )
|
|
388
|
+
* // Select all rows from the `jennifers` CTE and
|
|
389
|
+
* // further filter it.
|
|
337
390
|
* .with('adult_jennifers', (db) => db
|
|
338
391
|
* .selectFrom('jennifers')
|
|
339
392
|
* .where('age', '>', 18)
|
|
340
393
|
* .select(['id', 'age'])
|
|
341
394
|
* )
|
|
395
|
+
* // Finally select all adult jennifers that are
|
|
396
|
+
* // also younger than 60.
|
|
342
397
|
* .selectFrom('adult_jennifers')
|
|
343
398
|
* .where('age', '<', 60)
|
|
344
399
|
* .selectAll()
|
|
345
400
|
* .execute()
|
|
346
401
|
* ```
|
|
347
402
|
*
|
|
403
|
+
* <!-- siteExample("cte", "Inserts, updates and deletions", 20) -->
|
|
404
|
+
*
|
|
405
|
+
* Some databases like postgres also allow you to run other queries than selects
|
|
406
|
+
* in CTEs. On these databases CTEs are extremely powerful:
|
|
407
|
+
*
|
|
408
|
+
* ```ts
|
|
409
|
+
* const result = await db
|
|
410
|
+
* .with('new_person', (db) => db
|
|
411
|
+
* .insertInto('person')
|
|
412
|
+
* .values({
|
|
413
|
+
* first_name: 'Jennifer',
|
|
414
|
+
* age: 35,
|
|
415
|
+
* })
|
|
416
|
+
* .returning('id')
|
|
417
|
+
* )
|
|
418
|
+
* .with('new_pet', (db) => db
|
|
419
|
+
* .insertInto('pet')
|
|
420
|
+
* .values({
|
|
421
|
+
* name: 'Doggo',
|
|
422
|
+
* species: 'dog',
|
|
423
|
+
* is_favorite: true,
|
|
424
|
+
* // Use the id of the person we just inserted.
|
|
425
|
+
* owner_id: db
|
|
426
|
+
* .selectFrom('new_person')
|
|
427
|
+
* .select('id')
|
|
428
|
+
* })
|
|
429
|
+
* .returning('id')
|
|
430
|
+
* )
|
|
431
|
+
* .selectFrom(['new_person', 'new_pet'])
|
|
432
|
+
* .select([
|
|
433
|
+
* 'new_person.id as person_id',
|
|
434
|
+
* 'new_pet.id as pet_id'
|
|
435
|
+
* ])
|
|
436
|
+
* .execute()
|
|
437
|
+
* ```
|
|
438
|
+
*
|
|
348
439
|
* The CTE name can optionally specify column names in addition to
|
|
349
440
|
* a name. In that case Kysely requires the expression to retun
|
|
350
441
|
* rows with the same columns.
|