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
|
@@ -12,6 +12,9 @@ const object_utils_js_1 = require("../util/object-utils.js");
|
|
|
12
12
|
const update_result_js_1 = require("./update-result.js");
|
|
13
13
|
const no_result_error_js_1 = require("./no-result-error.js");
|
|
14
14
|
const binary_operation_parser_js_1 = require("../parser/binary-operation-parser.js");
|
|
15
|
+
const value_parser_js_1 = require("../parser/value-parser.js");
|
|
16
|
+
const limit_node_js_1 = require("../operation-node/limit-node.js");
|
|
17
|
+
const top_parser_js_1 = require("../parser/top-parser.js");
|
|
15
18
|
class UpdateQueryBuilder {
|
|
16
19
|
#props;
|
|
17
20
|
constructor(props) {
|
|
@@ -35,6 +38,51 @@ class UpdateQueryBuilder {
|
|
|
35
38
|
queryNode: query_node_js_1.QueryNode.cloneWithoutWhere(this.#props.queryNode),
|
|
36
39
|
});
|
|
37
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Changes an `update` query into a `update top` query.
|
|
43
|
+
*
|
|
44
|
+
* `top` clause is only supported by some dialects like MS SQL Server.
|
|
45
|
+
*
|
|
46
|
+
* ### Examples
|
|
47
|
+
*
|
|
48
|
+
* Update the first row:
|
|
49
|
+
*
|
|
50
|
+
* ```ts
|
|
51
|
+
* await db.updateTable('person')
|
|
52
|
+
* .top(1)
|
|
53
|
+
* .set({ first_name: 'Foo' })
|
|
54
|
+
* .where('age', '>', 18)
|
|
55
|
+
* .executeTakeFirstOrThrow()
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* The generated SQL (MS SQL Server):
|
|
59
|
+
*
|
|
60
|
+
* ```sql
|
|
61
|
+
* update top(1) "person" set "first_name" = @1 where "age" > @2
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* Update the 50% first rows:
|
|
65
|
+
*
|
|
66
|
+
* ```ts
|
|
67
|
+
* await db.updateTable('person')
|
|
68
|
+
* .top(50, 'percent')
|
|
69
|
+
* .set({ first_name: 'Foo' })
|
|
70
|
+
* .where('age', '>', 18)
|
|
71
|
+
* .executeTakeFirstOrThrow()
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
74
|
+
* The generated SQL (MS SQL Server):
|
|
75
|
+
*
|
|
76
|
+
* ```sql
|
|
77
|
+
* update top(50) percent "person" set "first_name" = @1 where "age" > @2
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
top(expression, modifiers) {
|
|
81
|
+
return new UpdateQueryBuilder({
|
|
82
|
+
...this.#props,
|
|
83
|
+
queryNode: query_node_js_1.QueryNode.cloneWithTop(this.#props.queryNode, (0, top_parser_js_1.parseTop)(expression, modifiers)),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
38
86
|
from(from) {
|
|
39
87
|
return new UpdateQueryBuilder({
|
|
40
88
|
...this.#props,
|
|
@@ -65,6 +113,31 @@ class UpdateQueryBuilder {
|
|
|
65
113
|
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('FullJoin', args)),
|
|
66
114
|
});
|
|
67
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Adds a limit clause to the update query for supported databases, such as MySQL.
|
|
118
|
+
*
|
|
119
|
+
* ### Examples
|
|
120
|
+
*
|
|
121
|
+
* Update the first 2 rows in the 'person' table:
|
|
122
|
+
*
|
|
123
|
+
* ```ts
|
|
124
|
+
* return await db
|
|
125
|
+
* .updateTable('person')
|
|
126
|
+
* .set({ first_name: 'Foo' })
|
|
127
|
+
* .limit(2);
|
|
128
|
+
* ```
|
|
129
|
+
*
|
|
130
|
+
* The generated SQL (MySQL):
|
|
131
|
+
* ```sql
|
|
132
|
+
* update `person` set `first_name` = 'Foo' limit 2
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
limit(limit) {
|
|
136
|
+
return new UpdateQueryBuilder({
|
|
137
|
+
...this.#props,
|
|
138
|
+
queryNode: update_query_node_js_1.UpdateQueryNode.cloneWithLimit(this.#props.queryNode, limit_node_js_1.LimitNode.create((0, value_parser_js_1.parseValueExpression)(limit))),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
68
141
|
set(...args) {
|
|
69
142
|
return new UpdateQueryBuilder({
|
|
70
143
|
...this.#props,
|
|
@@ -77,10 +150,47 @@ class UpdateQueryBuilder {
|
|
|
77
150
|
queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(selection)),
|
|
78
151
|
});
|
|
79
152
|
}
|
|
80
|
-
returningAll() {
|
|
153
|
+
returningAll(table) {
|
|
154
|
+
return new UpdateQueryBuilder({
|
|
155
|
+
...this.#props,
|
|
156
|
+
queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
output(args) {
|
|
160
|
+
return new UpdateQueryBuilder({
|
|
161
|
+
...this.#props,
|
|
162
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
outputAll(table) {
|
|
166
|
+
return new UpdateQueryBuilder({
|
|
167
|
+
...this.#props,
|
|
168
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Clears all `returning` clauses from the query.
|
|
173
|
+
*
|
|
174
|
+
* ### Examples
|
|
175
|
+
*
|
|
176
|
+
* ```ts
|
|
177
|
+
* db.updateTable('person')
|
|
178
|
+
* .returningAll()
|
|
179
|
+
* .set({ age: 39 })
|
|
180
|
+
* .where('first_name', '=', 'John')
|
|
181
|
+
* .clearReturning()
|
|
182
|
+
* ```
|
|
183
|
+
*
|
|
184
|
+
* The generated SQL(PostgreSQL):
|
|
185
|
+
*
|
|
186
|
+
* ```sql
|
|
187
|
+
* update "person" set "age" = 39 where "first_name" = "John"
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
clearReturning() {
|
|
81
191
|
return new UpdateQueryBuilder({
|
|
82
192
|
...this.#props,
|
|
83
|
-
queryNode: query_node_js_1.QueryNode.
|
|
193
|
+
queryNode: query_node_js_1.QueryNode.cloneWithoutReturning(this.#props.queryNode),
|
|
84
194
|
});
|
|
85
195
|
}
|
|
86
196
|
/**
|
|
@@ -212,17 +322,17 @@ class UpdateQueryBuilder {
|
|
|
212
322
|
/**
|
|
213
323
|
* Asserts that query's output row type equals the given type `T`.
|
|
214
324
|
*
|
|
215
|
-
* This method can be used to simplify excessively complex types to make
|
|
325
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
216
326
|
* and much faster.
|
|
217
327
|
*
|
|
218
328
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
219
|
-
* for
|
|
329
|
+
* for TypeScript and you get errors like this:
|
|
220
330
|
*
|
|
221
331
|
* ```
|
|
222
332
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
223
333
|
* ```
|
|
224
334
|
*
|
|
225
|
-
* In these case you can often use this method to help
|
|
335
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
226
336
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
227
337
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
228
338
|
*
|
|
@@ -277,9 +387,11 @@ class UpdateQueryBuilder {
|
|
|
277
387
|
*/
|
|
278
388
|
async execute() {
|
|
279
389
|
const compiledQuery = this.compile();
|
|
280
|
-
const query = compiledQuery.query;
|
|
281
390
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
282
|
-
|
|
391
|
+
const { adapter } = this.#props.executor;
|
|
392
|
+
const query = compiledQuery.query;
|
|
393
|
+
if ((query.returning && adapter.supportsReturning) ||
|
|
394
|
+
(query.output && adapter.supportsOutput)) {
|
|
283
395
|
return result.rows;
|
|
284
396
|
}
|
|
285
397
|
return [
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
export declare class UpdateResult {
|
|
2
|
+
/**
|
|
3
|
+
* The number of rows the update query updated (even if not changed).
|
|
4
|
+
*/
|
|
2
5
|
readonly numUpdatedRows: bigint;
|
|
6
|
+
/**
|
|
7
|
+
* The number of rows the update query changed.
|
|
8
|
+
*
|
|
9
|
+
* This is **optional** and only supported in dialects such as MySQL.
|
|
10
|
+
* You would probably use {@link numUpdatedRows} in most cases.
|
|
11
|
+
*/
|
|
3
12
|
readonly numChangedRows?: bigint;
|
|
4
13
|
constructor(numUpdatedRows: bigint, numChangedRows: bigint | undefined);
|
|
5
14
|
}
|
|
@@ -2,7 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UpdateResult = void 0;
|
|
4
4
|
class UpdateResult {
|
|
5
|
+
/**
|
|
6
|
+
* The number of rows the update query updated (even if not changed).
|
|
7
|
+
*/
|
|
5
8
|
numUpdatedRows;
|
|
9
|
+
/**
|
|
10
|
+
* The number of rows the update query changed.
|
|
11
|
+
*
|
|
12
|
+
* This is **optional** and only supported in dialects such as MySQL.
|
|
13
|
+
* You would probably use {@link numUpdatedRows} in most cases.
|
|
14
|
+
*/
|
|
6
15
|
numChangedRows;
|
|
7
16
|
constructor(numUpdatedRows, numChangedRows) {
|
|
8
17
|
this.numUpdatedRows = numUpdatedRows;
|
|
@@ -265,7 +265,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
265
265
|
* .selectFrom('person')
|
|
266
266
|
* .selectAll()
|
|
267
267
|
* .where(
|
|
268
|
-
* sql
|
|
268
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
269
269
|
* 'like',
|
|
270
270
|
* '%' + name + '%',
|
|
271
271
|
* )
|
|
@@ -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;
|
|
@@ -10,6 +10,7 @@ const query_node_js_1 = require("../operation-node/query-node.js");
|
|
|
10
10
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
11
11
|
const create_view_node_js_1 = require("../operation-node/create-view-node.js");
|
|
12
12
|
const set_operation_node_js_1 = require("../operation-node/set-operation-node.js");
|
|
13
|
+
const merge_query_node_js_1 = require("../operation-node/merge-query-node.js");
|
|
13
14
|
class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisitor {
|
|
14
15
|
#sql = '';
|
|
15
16
|
#parameters = [];
|
|
@@ -19,6 +20,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
19
20
|
compileQuery(node) {
|
|
20
21
|
this.#sql = '';
|
|
21
22
|
this.#parameters = [];
|
|
23
|
+
this.nodeStack.splice(0, this.nodeStack.length);
|
|
22
24
|
this.visitNode(node);
|
|
23
25
|
return (0, object_utils_js_1.freeze)({
|
|
24
26
|
query: node,
|
|
@@ -56,6 +58,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
56
58
|
this.append(' ');
|
|
57
59
|
this.compileList(node.frontModifiers, ' ');
|
|
58
60
|
}
|
|
61
|
+
if (node.top) {
|
|
62
|
+
this.append(' ');
|
|
63
|
+
this.visitNode(node.top);
|
|
64
|
+
}
|
|
59
65
|
if (node.selections) {
|
|
60
66
|
this.append(' ');
|
|
61
67
|
this.compileList(node.selections);
|
|
@@ -96,6 +102,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
96
102
|
this.append(' ');
|
|
97
103
|
this.visitNode(node.offset);
|
|
98
104
|
}
|
|
105
|
+
if (node.fetch) {
|
|
106
|
+
this.append(' ');
|
|
107
|
+
this.visitNode(node.fetch);
|
|
108
|
+
}
|
|
99
109
|
if (node.endModifiers?.length) {
|
|
100
110
|
this.append(' ');
|
|
101
111
|
this.compileList(this.sortSelectModifiers([...node.endModifiers]), ' ');
|
|
@@ -137,12 +147,13 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
137
147
|
this.visitNode(node.having);
|
|
138
148
|
}
|
|
139
149
|
visitInsertQuery(node) {
|
|
140
|
-
const
|
|
150
|
+
const rootQueryNode = this.nodeStack.find(query_node_js_1.QueryNode.is);
|
|
151
|
+
const isSubQuery = rootQueryNode !== node;
|
|
141
152
|
if (!isSubQuery && node.explain) {
|
|
142
153
|
this.visitNode(node.explain);
|
|
143
154
|
this.append(' ');
|
|
144
155
|
}
|
|
145
|
-
if (isSubQuery) {
|
|
156
|
+
if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
|
|
146
157
|
this.append('(');
|
|
147
158
|
}
|
|
148
159
|
if (node.with) {
|
|
@@ -153,13 +164,23 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
153
164
|
if (node.ignore) {
|
|
154
165
|
this.append(' ignore');
|
|
155
166
|
}
|
|
156
|
-
|
|
157
|
-
|
|
167
|
+
if (node.top) {
|
|
168
|
+
this.append(' ');
|
|
169
|
+
this.visitNode(node.top);
|
|
170
|
+
}
|
|
171
|
+
if (node.into) {
|
|
172
|
+
this.append(' into ');
|
|
173
|
+
this.visitNode(node.into);
|
|
174
|
+
}
|
|
158
175
|
if (node.columns) {
|
|
159
176
|
this.append(' (');
|
|
160
177
|
this.compileList(node.columns);
|
|
161
178
|
this.append(')');
|
|
162
179
|
}
|
|
180
|
+
if (node.output) {
|
|
181
|
+
this.append(' ');
|
|
182
|
+
this.visitNode(node.output);
|
|
183
|
+
}
|
|
163
184
|
if (node.values) {
|
|
164
185
|
this.append(' ');
|
|
165
186
|
this.visitNode(node.values);
|
|
@@ -180,7 +201,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
180
201
|
this.append(' ');
|
|
181
202
|
this.visitNode(node.returning);
|
|
182
203
|
}
|
|
183
|
-
if (isSubQuery) {
|
|
204
|
+
if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
|
|
184
205
|
this.append(')');
|
|
185
206
|
}
|
|
186
207
|
}
|
|
@@ -202,7 +223,15 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
202
223
|
this.append(' ');
|
|
203
224
|
}
|
|
204
225
|
this.append('delete ');
|
|
226
|
+
if (node.top) {
|
|
227
|
+
this.visitNode(node.top);
|
|
228
|
+
this.append(' ');
|
|
229
|
+
}
|
|
205
230
|
this.visitNode(node.from);
|
|
231
|
+
if (node.output) {
|
|
232
|
+
this.append(' ');
|
|
233
|
+
this.visitNode(node.output);
|
|
234
|
+
}
|
|
206
235
|
if (node.using) {
|
|
207
236
|
this.append(' ');
|
|
208
237
|
this.visitNode(node.using);
|
|
@@ -373,6 +402,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
373
402
|
}
|
|
374
403
|
}
|
|
375
404
|
visitColumnDefinition(node) {
|
|
405
|
+
if (node.ifNotExists) {
|
|
406
|
+
this.append('if not exists ');
|
|
407
|
+
}
|
|
376
408
|
this.visitNode(node.column);
|
|
377
409
|
this.append(' ');
|
|
378
410
|
this.visitNode(node.dataType);
|
|
@@ -387,6 +419,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
387
419
|
this.append(' ');
|
|
388
420
|
this.visitNode(node.generated);
|
|
389
421
|
}
|
|
422
|
+
if (node.identity) {
|
|
423
|
+
this.append(' identity');
|
|
424
|
+
}
|
|
390
425
|
if (node.defaultTo) {
|
|
391
426
|
this.append(' ');
|
|
392
427
|
this.visitNode(node.defaultTo);
|
|
@@ -470,12 +505,13 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
470
505
|
this.visitNode(node.groupBy);
|
|
471
506
|
}
|
|
472
507
|
visitUpdateQuery(node) {
|
|
473
|
-
const
|
|
508
|
+
const rootQueryNode = this.nodeStack.find(query_node_js_1.QueryNode.is);
|
|
509
|
+
const isSubQuery = rootQueryNode !== node;
|
|
474
510
|
if (!isSubQuery && node.explain) {
|
|
475
511
|
this.visitNode(node.explain);
|
|
476
512
|
this.append(' ');
|
|
477
513
|
}
|
|
478
|
-
if (isSubQuery) {
|
|
514
|
+
if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
|
|
479
515
|
this.append('(');
|
|
480
516
|
}
|
|
481
517
|
if (node.with) {
|
|
@@ -483,11 +519,22 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
483
519
|
this.append(' ');
|
|
484
520
|
}
|
|
485
521
|
this.append('update ');
|
|
486
|
-
|
|
487
|
-
|
|
522
|
+
if (node.top) {
|
|
523
|
+
this.visitNode(node.top);
|
|
524
|
+
this.append(' ');
|
|
525
|
+
}
|
|
526
|
+
if (node.table) {
|
|
527
|
+
this.visitNode(node.table);
|
|
528
|
+
this.append(' ');
|
|
529
|
+
}
|
|
530
|
+
this.append('set ');
|
|
488
531
|
if (node.updates) {
|
|
489
532
|
this.compileList(node.updates);
|
|
490
533
|
}
|
|
534
|
+
if (node.output) {
|
|
535
|
+
this.append(' ');
|
|
536
|
+
this.visitNode(node.output);
|
|
537
|
+
}
|
|
491
538
|
if (node.from) {
|
|
492
539
|
this.append(' ');
|
|
493
540
|
this.visitNode(node.from);
|
|
@@ -500,11 +547,15 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
500
547
|
this.append(' ');
|
|
501
548
|
this.visitNode(node.where);
|
|
502
549
|
}
|
|
550
|
+
if (node.limit) {
|
|
551
|
+
this.append(' ');
|
|
552
|
+
this.visitNode(node.limit);
|
|
553
|
+
}
|
|
503
554
|
if (node.returning) {
|
|
504
555
|
this.append(' ');
|
|
505
556
|
this.visitNode(node.returning);
|
|
506
557
|
}
|
|
507
|
-
if (isSubQuery) {
|
|
558
|
+
if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
|
|
508
559
|
this.append(')');
|
|
509
560
|
}
|
|
510
561
|
}
|
|
@@ -1040,6 +1091,40 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
1040
1091
|
this.visitNode(node.values[i]);
|
|
1041
1092
|
}
|
|
1042
1093
|
}
|
|
1094
|
+
visitMergeQuery(node) {
|
|
1095
|
+
if (node.with) {
|
|
1096
|
+
this.visitNode(node.with);
|
|
1097
|
+
this.append(' ');
|
|
1098
|
+
}
|
|
1099
|
+
this.append('merge ');
|
|
1100
|
+
if (node.top) {
|
|
1101
|
+
this.visitNode(node.top);
|
|
1102
|
+
this.append(' ');
|
|
1103
|
+
}
|
|
1104
|
+
this.append('into ');
|
|
1105
|
+
this.visitNode(node.into);
|
|
1106
|
+
if (node.using) {
|
|
1107
|
+
this.append(' ');
|
|
1108
|
+
this.visitNode(node.using);
|
|
1109
|
+
}
|
|
1110
|
+
if (node.whens) {
|
|
1111
|
+
this.append(' ');
|
|
1112
|
+
this.compileList(node.whens, ' ');
|
|
1113
|
+
}
|
|
1114
|
+
if (node.output) {
|
|
1115
|
+
this.append(' ');
|
|
1116
|
+
this.visitNode(node.output);
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
visitMatched(node) {
|
|
1120
|
+
if (node.not) {
|
|
1121
|
+
this.append('not ');
|
|
1122
|
+
}
|
|
1123
|
+
this.append('matched');
|
|
1124
|
+
if (node.bySource) {
|
|
1125
|
+
this.append(' by source');
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1043
1128
|
visitAddIndex(node) {
|
|
1044
1129
|
this.append('add ');
|
|
1045
1130
|
if (node.unique) {
|
|
@@ -1057,6 +1142,28 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
1057
1142
|
this.visitNode(node.using);
|
|
1058
1143
|
}
|
|
1059
1144
|
}
|
|
1145
|
+
visitCast(node) {
|
|
1146
|
+
this.append('cast(');
|
|
1147
|
+
this.visitNode(node.expression);
|
|
1148
|
+
this.append(' as ');
|
|
1149
|
+
this.visitNode(node.dataType);
|
|
1150
|
+
this.append(')');
|
|
1151
|
+
}
|
|
1152
|
+
visitFetch(node) {
|
|
1153
|
+
this.append('fetch next ');
|
|
1154
|
+
this.visitNode(node.rowCount);
|
|
1155
|
+
this.append(` rows ${node.modifier}`);
|
|
1156
|
+
}
|
|
1157
|
+
visitOutput(node) {
|
|
1158
|
+
this.append('output ');
|
|
1159
|
+
this.compileList(node.selections);
|
|
1160
|
+
}
|
|
1161
|
+
visitTop(node) {
|
|
1162
|
+
this.append(`top(${node.expression})`);
|
|
1163
|
+
if (node.modifiers) {
|
|
1164
|
+
this.append(` ${node.modifiers}`);
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1060
1167
|
append(str) {
|
|
1061
1168
|
this.#sql += str;
|
|
1062
1169
|
}
|
|
@@ -1167,4 +1274,5 @@ const JOIN_TYPE_SQL = (0, object_utils_js_1.freeze)({
|
|
|
1167
1274
|
FullJoin: 'full join',
|
|
1168
1275
|
LateralInnerJoin: 'inner join lateral',
|
|
1169
1276
|
LateralLeftJoin: 'left join lateral',
|
|
1277
|
+
Using: 'using',
|
|
1170
1278
|
});
|
|
@@ -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.
|