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
package/CONTRIBUTING.md
CHANGED
|
@@ -15,7 +15,7 @@ There are quite a few guidelines to keep in mind:
|
|
|
15
15
|
|
|
16
16
|
* Kysely should have zero dependencies.
|
|
17
17
|
|
|
18
|
-
* Kysely should work in all
|
|
18
|
+
* Kysely should work in all JavaScript environments (node.js, deno & modern browsers),
|
|
19
19
|
even though the main focus is node.js.
|
|
20
20
|
|
|
21
21
|
* Everything is immutable.
|
package/README.md
CHANGED
|
@@ -5,16 +5,16 @@
|
|
|
5
5
|
[](https://github.com/kysely-org/kysely/blob/master/LICENSE)
|
|
6
6
|
[](https://github.com/kysely-org/kysely/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)
|
|
7
7
|
[](https://github.com/kysely-org/kysely/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc)
|
|
8
|
-
[](https://snyk.io/advisor/npm-package/kysely)
|
|
9
8
|
[](https://www.npmjs.com/package/kysely)
|
|
10
9
|
[](https://bundlephobia.com/package/kysely)
|
|
11
10
|
[](https://twitter.com/kysely_)
|
|
12
11
|
|
|
13
12
|
# [Kysely](https://kysely.dev)
|
|
14
13
|
|
|
15
|
-
Kysely (pronounce “Key-Seh-Lee”) is a type-safe and autocompletion-friendly
|
|
16
|
-
Inspired by [
|
|
17
|
-
runs on all other
|
|
14
|
+
Kysely (pronounce “Key-Seh-Lee”) is a type-safe and autocompletion-friendly [TypeScript](https://www.typescriptlang.org/) [SQL](https://en.wikipedia.org/wiki/SQL) query builder.
|
|
15
|
+
Inspired by [Knex.js](http://knexjs.org/). Mainly developed for [Node.js](https://nodejs.org/en/) but also
|
|
16
|
+
runs on all other [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript) environments like [Deno](https://deno.com/), [Bun](https://bun.sh/), [Cloudflare Workers](https://workers.cloudflare.com/)
|
|
17
|
+
and web browsers.
|
|
18
18
|
|
|
19
19
|

|
|
20
20
|
|
|
@@ -22,7 +22,7 @@ Kysely makes sure you only refer to tables and columns that are visible to the p
|
|
|
22
22
|
you're writing. The result type only has the selected columns with correct types and aliases. As an
|
|
23
23
|
added bonus you get autocompletion for all that stuff.
|
|
24
24
|
|
|
25
|
-
As shown in the gif above, through the pure magic of modern
|
|
25
|
+
As shown in the gif above, through the pure magic of modern TypeScript, Kysely is even able to parse
|
|
26
26
|
the alias given to `pet.name` and add the `pet_name` column to the result row type. Kysely is able to infer
|
|
27
27
|
column names, aliases and types from selected subqueries, joined subqueries, `with` statements and pretty
|
|
28
28
|
much anything you can think of.
|
|
@@ -35,12 +35,12 @@ All API documentation is written in the typing files and you can simply hover ov
|
|
|
35
35
|
or method you're using to see it in your IDE. The same documentation is also hosted [here](https://kysely-org.github.io/kysely-apidoc/).
|
|
36
36
|
|
|
37
37
|
If you start using Kysely and can't find something you'd want to use, please open an issue or join our
|
|
38
|
-
[
|
|
38
|
+
[Discord server](https://discord.gg/xyBJ3GwvAm).
|
|
39
39
|
|
|
40
40
|
# Getting started
|
|
41
41
|
|
|
42
42
|
Please visit our documentation site [kysely.dev](https://kysely.dev) to get started. We also have a comprehensive
|
|
43
|
-
API documentation hosted [here](https://kysely-org.github.io/kysely-apidoc/) but you can access the same
|
|
43
|
+
API documentation hosted [here](https://kysely-org.github.io/kysely-apidoc/), but you can access the same
|
|
44
44
|
documentation in your IDE by hovering over a class/method/property/whatever.
|
|
45
45
|
|
|
46
46
|
# Contributors
|
|
@@ -2,7 +2,7 @@ import { Kysely } from '../kysely.js';
|
|
|
2
2
|
import { DialectAdapter, MigrationLockOptions } from './dialect-adapter.js';
|
|
3
3
|
/**
|
|
4
4
|
* A basic implementation of `DialectAdapter` with sensible default values.
|
|
5
|
-
*
|
|
5
|
+
* Third-party dialects can extend this instead of implementing the `DialectAdapter`
|
|
6
6
|
* interface from scratch. That way all new settings will get default values when
|
|
7
7
|
* they are added and there will be less breaking changes.
|
|
8
8
|
*/
|
|
@@ -26,6 +26,7 @@ export declare abstract class DialectAdapterBase implements DialectAdapter {
|
|
|
26
26
|
* updates and deletes.
|
|
27
27
|
*/
|
|
28
28
|
get supportsReturning(): boolean;
|
|
29
|
+
get supportsOutput(): boolean;
|
|
29
30
|
/**
|
|
30
31
|
* This method is used to acquire a lock for the migrations so that
|
|
31
32
|
* it's not possible for two migration operations to run in parallel.
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DialectAdapterBase = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* A basic implementation of `DialectAdapter` with sensible default values.
|
|
6
|
-
*
|
|
6
|
+
* Third-party dialects can extend this instead of implementing the `DialectAdapter`
|
|
7
7
|
* interface from scratch. That way all new settings will get default values when
|
|
8
8
|
* they are added and there will be less breaking changes.
|
|
9
9
|
*/
|
|
@@ -17,5 +17,8 @@ class DialectAdapterBase {
|
|
|
17
17
|
get supportsReturning() {
|
|
18
18
|
return false;
|
|
19
19
|
}
|
|
20
|
+
get supportsOutput() {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
20
23
|
}
|
|
21
24
|
exports.DialectAdapterBase = DialectAdapterBase;
|
|
@@ -27,6 +27,11 @@ export interface DialectAdapter {
|
|
|
27
27
|
* updates and deletes.
|
|
28
28
|
*/
|
|
29
29
|
readonly supportsReturning: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Whether or not this dialect supports the `output` clause in inserts
|
|
32
|
+
* updates and deletes.
|
|
33
|
+
*/
|
|
34
|
+
readonly supportsOutput?: boolean;
|
|
30
35
|
/**
|
|
31
36
|
* This method is used to acquire a lock for the migrations so that
|
|
32
37
|
* it's not possible for two migration operations to run in parallel.
|
|
@@ -15,11 +15,7 @@ export declare class MssqlAdapter extends DialectAdapterBase {
|
|
|
15
15
|
* If this is true, migrations are executed inside a transaction.
|
|
16
16
|
*/
|
|
17
17
|
get supportsTransactionalDdl(): boolean;
|
|
18
|
-
|
|
19
|
-
* Whether or not this dialect supports the `returning` in inserts
|
|
20
|
-
* updates and deletes.
|
|
21
|
-
*/
|
|
22
|
-
get supportsReturning(): boolean;
|
|
18
|
+
get supportsOutput(): boolean;
|
|
23
19
|
/**
|
|
24
20
|
* This method is used to acquire a lock for the migrations so that
|
|
25
21
|
* it's not possible for two migration operations to run in parallel.
|
|
@@ -11,10 +11,8 @@ class MssqlAdapter extends dialect_adapter_base_js_1.DialectAdapterBase {
|
|
|
11
11
|
get supportsTransactionalDdl() {
|
|
12
12
|
return true;
|
|
13
13
|
}
|
|
14
|
-
get
|
|
15
|
-
|
|
16
|
-
// we need to figure this out when we'll introduce support for it.
|
|
17
|
-
return false;
|
|
14
|
+
get supportsOutput() {
|
|
15
|
+
return true;
|
|
18
16
|
}
|
|
19
17
|
async acquireMigrationLock(db) {
|
|
20
18
|
// Acquire a transaction-level exclusive lock on the migrations table.
|
|
@@ -50,39 +50,59 @@ export interface MssqlDialectConfig {
|
|
|
50
50
|
export interface Tedious {
|
|
51
51
|
connectionFactory: () => TediousConnection | Promise<TediousConnection>;
|
|
52
52
|
ISOLATION_LEVEL: TediousIsolationLevel;
|
|
53
|
-
Request:
|
|
53
|
+
Request: TediousRequestClass;
|
|
54
54
|
TYPES: TediousTypes;
|
|
55
55
|
}
|
|
56
|
-
export type TediousIsolationLevel = Record<'NO_CHANGE' | 'READ_UNCOMMITTED' | 'READ_COMMITTED' | 'REPEATABLE_READ' | 'SERIALIZABLE' | 'SNAPSHOT', number>;
|
|
57
|
-
export type TediousTypes = Record<'BigInt' | 'Binary' | 'Bit' | 'Char' | 'Date' | 'DateTime' | 'DateTime2' | 'DateTimeOffset' | 'Decimal' | 'Float' | 'Image' | 'Int' | 'Money' | 'NChar' | 'NText' | 'Null' | 'Numeric' | 'NVarChar' | 'Real' | 'SmallDateTime' | 'SmallInt' | 'SmallMoney' | 'Text' | 'Time' | 'TinyInt' | 'TVP' | 'UDT' | 'UniqueIdentifier' | 'VarBinary' | 'VarChar' | 'Xml', {
|
|
58
|
-
name: string;
|
|
59
|
-
type: string;
|
|
60
|
-
}>;
|
|
61
|
-
export interface TediousType {
|
|
62
|
-
name: string;
|
|
63
|
-
type: string;
|
|
64
|
-
}
|
|
65
56
|
export interface TediousConnection {
|
|
66
|
-
beginTransaction(callback: (error?: Error) => void,
|
|
67
|
-
cancel():
|
|
57
|
+
beginTransaction(callback: (error?: Error | null, transactionDescriptor?: any) => void, name?: string, isolationLevel?: number): void;
|
|
58
|
+
cancel(): boolean;
|
|
68
59
|
close(): void;
|
|
69
|
-
commitTransaction(callback: (error?: Error) => void): void;
|
|
70
|
-
connect(callback
|
|
60
|
+
commitTransaction(callback: (error?: Error | null) => void, name?: string): void;
|
|
61
|
+
connect(callback?: (error?: Error) => void): void;
|
|
71
62
|
execSql(request: TediousRequest): void;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
63
|
+
off(event: 'error', listener: (error: unknown) => void): this;
|
|
64
|
+
off(event: string, listener: (...args: any[]) => void): this;
|
|
65
|
+
on(event: 'error', listener: (error: unknown) => void): this;
|
|
66
|
+
on(event: string, listener: (...args: any[]) => void): this;
|
|
67
|
+
once(event: 'end', listener: () => void): this;
|
|
68
|
+
once(event: string, listener: (...args: any[]) => void): this;
|
|
69
|
+
reset(callback: (error?: Error | null) => void): void;
|
|
70
|
+
rollbackTransaction(callback: (error?: Error | null) => void, name?: string): void;
|
|
71
|
+
saveTransaction(callback: (error?: Error | null) => void, name: string): void;
|
|
72
|
+
}
|
|
73
|
+
export type TediousIsolationLevel = Record<string, number>;
|
|
74
|
+
export interface TediousRequestClass {
|
|
75
|
+
new (sqlTextOrProcedure: string | undefined, callback: (error?: Error | null, rowCount?: number, rows?: any) => void, options?: {
|
|
76
|
+
statementColumnEncryptionSetting?: any;
|
|
77
|
+
}): TediousRequest;
|
|
75
78
|
}
|
|
76
79
|
export declare class TediousRequest {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
length?: number
|
|
80
|
-
precision?: number
|
|
81
|
-
scale?: number
|
|
82
|
-
}): void;
|
|
83
|
-
off(event: 'row', listener: (
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
addParameter(name: string, dataType: TediousDataType, value?: unknown, options?: Readonly<{
|
|
81
|
+
output?: boolean;
|
|
82
|
+
length?: number;
|
|
83
|
+
precision?: number;
|
|
84
|
+
scale?: number;
|
|
85
|
+
}> | null): void;
|
|
86
|
+
off(event: 'row', listener: (columns: any) => void): this;
|
|
87
|
+
off(event: string, listener: (...args: any[]) => void): this;
|
|
88
|
+
on(event: 'row', listener: (columns: any) => void): this;
|
|
89
|
+
on(event: string, listener: (...args: any[]) => void): this;
|
|
90
|
+
once(event: 'requestCompleted', listener: () => void): this;
|
|
91
|
+
once(event: string, listener: (...args: any[]) => void): this;
|
|
92
|
+
pause(): void;
|
|
93
|
+
resume(): void;
|
|
94
|
+
}
|
|
95
|
+
export interface TediousTypes {
|
|
96
|
+
NVarChar: TediousDataType;
|
|
97
|
+
BigInt: TediousDataType;
|
|
98
|
+
Int: TediousDataType;
|
|
99
|
+
Float: TediousDataType;
|
|
100
|
+
Bit: TediousDataType;
|
|
101
|
+
DateTime: TediousDataType;
|
|
102
|
+
VarBinary: TediousDataType;
|
|
103
|
+
[x: string]: TediousDataType;
|
|
104
|
+
}
|
|
105
|
+
export interface TediousDataType {
|
|
86
106
|
}
|
|
87
107
|
export interface TediousColumnValue {
|
|
88
108
|
metadata: {
|
|
@@ -44,6 +44,7 @@ declare class MssqlConnection implements DatabaseConnection {
|
|
|
44
44
|
constructor(connection: TediousConnection, tedious: Tedious);
|
|
45
45
|
beginTransaction(settings: TransactionSettings): Promise<void>;
|
|
46
46
|
commitTransaction(): Promise<void>;
|
|
47
|
+
connect(): Promise<this>;
|
|
47
48
|
executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>>;
|
|
48
49
|
rollbackTransaction(): Promise<void>;
|
|
49
50
|
streamQuery<O>(compiledQuery: CompiledQuery, chunkSize: number): AsyncIterableIterator<QueryResult<O>>;
|
|
@@ -17,13 +17,7 @@ class MssqlDriver {
|
|
|
17
17
|
...this.#config.tarn.options,
|
|
18
18
|
create: async () => {
|
|
19
19
|
const connection = await this.#config.tedious.connectionFactory();
|
|
20
|
-
await new
|
|
21
|
-
if (error)
|
|
22
|
-
reject(error);
|
|
23
|
-
else
|
|
24
|
-
resolve(undefined);
|
|
25
|
-
}));
|
|
26
|
-
return new MssqlConnection(connection, this.#config.tedious);
|
|
20
|
+
return await new MssqlConnection(connection, this.#config.tedious).connect();
|
|
27
21
|
},
|
|
28
22
|
destroy: async (connection) => {
|
|
29
23
|
await connection[PRIVATE_DESTROY_METHOD]();
|
|
@@ -63,6 +57,10 @@ class MssqlConnection {
|
|
|
63
57
|
constructor(connection, tedious) {
|
|
64
58
|
this.#connection = connection;
|
|
65
59
|
this.#tedious = tedious;
|
|
60
|
+
this.#connection.on('error', console.error);
|
|
61
|
+
this.#connection.once('end', () => {
|
|
62
|
+
this.#connection.off('error', console.error);
|
|
63
|
+
});
|
|
66
64
|
}
|
|
67
65
|
async beginTransaction(settings) {
|
|
68
66
|
const { isolationLevel } = settings;
|
|
@@ -83,10 +81,28 @@ class MssqlConnection {
|
|
|
83
81
|
resolve(undefined);
|
|
84
82
|
}));
|
|
85
83
|
}
|
|
84
|
+
async connect() {
|
|
85
|
+
await new Promise((resolve, reject) => {
|
|
86
|
+
this.#connection.connect((error) => {
|
|
87
|
+
if (error) {
|
|
88
|
+
console.error(error);
|
|
89
|
+
reject(error);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
resolve(undefined);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
86
98
|
async executeQuery(compiledQuery) {
|
|
87
99
|
try {
|
|
88
100
|
const deferred = new deferred_js_1.Deferred();
|
|
89
|
-
const request = new MssqlRequest(
|
|
101
|
+
const request = new MssqlRequest({
|
|
102
|
+
compiledQuery,
|
|
103
|
+
tedious: this.#tedious,
|
|
104
|
+
onDone: deferred,
|
|
105
|
+
});
|
|
90
106
|
this.#connection.execSql(request.request);
|
|
91
107
|
const { rowCount, rows } = await deferred.promise;
|
|
92
108
|
return {
|
|
@@ -110,11 +126,15 @@ class MssqlConnection {
|
|
|
110
126
|
if (!Number.isInteger(chunkSize) || chunkSize <= 0) {
|
|
111
127
|
throw new Error('chunkSize must be a positive integer');
|
|
112
128
|
}
|
|
113
|
-
const request = new MssqlRequest(
|
|
129
|
+
const request = new MssqlRequest({
|
|
130
|
+
compiledQuery,
|
|
131
|
+
streamChunkSize: chunkSize,
|
|
132
|
+
tedious: this.#tedious,
|
|
133
|
+
});
|
|
114
134
|
this.#connection.execSql(request.request);
|
|
115
135
|
try {
|
|
116
136
|
while (true) {
|
|
117
|
-
const rows = await request.readChunk(
|
|
137
|
+
const rows = await request.readChunk();
|
|
118
138
|
if (rows.length === 0) {
|
|
119
139
|
break;
|
|
120
140
|
}
|
|
@@ -125,13 +145,17 @@ class MssqlConnection {
|
|
|
125
145
|
}
|
|
126
146
|
}
|
|
127
147
|
finally {
|
|
128
|
-
this.#
|
|
148
|
+
await this.#cancelRequest(request);
|
|
129
149
|
}
|
|
130
150
|
}
|
|
131
151
|
async validate() {
|
|
132
152
|
try {
|
|
133
153
|
const deferred = new deferred_js_1.Deferred();
|
|
134
|
-
const request = new MssqlRequest(
|
|
154
|
+
const request = new MssqlRequest({
|
|
155
|
+
compiledQuery: compiled_query_js_1.CompiledQuery.raw('select 1'),
|
|
156
|
+
onDone: deferred,
|
|
157
|
+
tedious: this.#tedious,
|
|
158
|
+
});
|
|
135
159
|
this.#connection.execSql(request.request);
|
|
136
160
|
await deferred.promise;
|
|
137
161
|
return true;
|
|
@@ -155,6 +179,16 @@ class MssqlConnection {
|
|
|
155
179
|
}
|
|
156
180
|
return tediousIsolationLevel;
|
|
157
181
|
}
|
|
182
|
+
#cancelRequest(request) {
|
|
183
|
+
return new Promise((resolve) => {
|
|
184
|
+
request.request.once('requestCompleted', resolve);
|
|
185
|
+
const wasCanceled = this.#connection.cancel();
|
|
186
|
+
if (!wasCanceled) {
|
|
187
|
+
request.request.off('requestCompleted', resolve);
|
|
188
|
+
resolve(undefined);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
158
192
|
[PRIVATE_RELEASE_METHOD]() {
|
|
159
193
|
return new Promise((resolve, reject) => {
|
|
160
194
|
this.#connection.reset((error) => {
|
|
@@ -177,42 +211,62 @@ class MssqlConnection {
|
|
|
177
211
|
class MssqlRequest {
|
|
178
212
|
#request;
|
|
179
213
|
#rows;
|
|
214
|
+
#streamChunkSize;
|
|
215
|
+
#subscribers;
|
|
180
216
|
#tedious;
|
|
181
|
-
#completed;
|
|
182
217
|
#error;
|
|
183
218
|
#rowCount;
|
|
184
|
-
constructor(
|
|
185
|
-
|
|
219
|
+
constructor(props) {
|
|
220
|
+
const { compiledQuery, onDone, streamChunkSize, tedious } = props;
|
|
186
221
|
this.#rows = [];
|
|
222
|
+
this.#streamChunkSize = streamChunkSize;
|
|
223
|
+
this.#subscribers = {};
|
|
187
224
|
this.#tedious = tedious;
|
|
188
|
-
|
|
189
|
-
|
|
225
|
+
if (onDone) {
|
|
226
|
+
const subscriptionKey = 'onDone';
|
|
227
|
+
this.#subscribers[subscriptionKey] = (event, error) => {
|
|
228
|
+
if (event === 'chunkReady') {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
delete this.#subscribers[subscriptionKey];
|
|
232
|
+
if (event === 'error') {
|
|
233
|
+
onDone.reject(error);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
onDone.resolve({
|
|
237
|
+
rowCount: this.#rowCount,
|
|
238
|
+
rows: this.#rows,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
this.#request = new this.#tedious.Request(compiledQuery.sql, (err, rowCount) => {
|
|
190
244
|
if (err) {
|
|
191
|
-
this.#error
|
|
192
|
-
onDone?.reject(this.#error);
|
|
245
|
+
Object.values(this.#subscribers).forEach((subscriber) => subscriber('error', err instanceof AggregateError ? err.errors : err));
|
|
193
246
|
}
|
|
194
247
|
else {
|
|
195
248
|
this.#rowCount = rowCount;
|
|
196
249
|
}
|
|
197
250
|
});
|
|
198
|
-
this.#addParametersToRequest(parameters);
|
|
199
|
-
this.#attachListeners(
|
|
251
|
+
this.#addParametersToRequest(compiledQuery.parameters);
|
|
252
|
+
this.#attachListeners();
|
|
200
253
|
}
|
|
201
254
|
get request() {
|
|
202
255
|
return this.#request;
|
|
203
256
|
}
|
|
204
|
-
readChunk(
|
|
257
|
+
readChunk() {
|
|
258
|
+
const subscriptionKey = this.readChunk.name;
|
|
205
259
|
return new Promise((resolve, reject) => {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
reject(
|
|
260
|
+
this.#subscribers[subscriptionKey] = (event, error) => {
|
|
261
|
+
delete this.#subscribers[subscriptionKey];
|
|
262
|
+
if (event === 'error') {
|
|
263
|
+
reject(error);
|
|
210
264
|
}
|
|
211
|
-
else
|
|
212
|
-
|
|
213
|
-
resolve(this.#rows.splice(0, chunkSize));
|
|
265
|
+
else {
|
|
266
|
+
resolve(this.#rows.splice(0, this.#streamChunkSize));
|
|
214
267
|
}
|
|
215
|
-
}
|
|
268
|
+
};
|
|
269
|
+
this.#request.resume();
|
|
216
270
|
});
|
|
217
271
|
}
|
|
218
272
|
#addParametersToRequest(parameters) {
|
|
@@ -221,22 +275,27 @@ class MssqlRequest {
|
|
|
221
275
|
this.#request.addParameter(String(i + 1), this.#getTediousDataType(parameter), parameter);
|
|
222
276
|
}
|
|
223
277
|
}
|
|
224
|
-
#attachListeners(
|
|
278
|
+
#attachListeners() {
|
|
279
|
+
const pauseAndEmitChunkReady = this.#streamChunkSize
|
|
280
|
+
? () => {
|
|
281
|
+
if (this.#streamChunkSize <= this.#rows.length) {
|
|
282
|
+
this.#request.pause();
|
|
283
|
+
Object.values(this.#subscribers).forEach((subscriber) => subscriber('chunkReady'));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
: () => { };
|
|
225
287
|
const rowListener = (columns) => {
|
|
226
288
|
const row = {};
|
|
227
289
|
for (const column of columns) {
|
|
228
290
|
row[column.metadata.colName] = column.value;
|
|
229
291
|
}
|
|
230
292
|
this.#rows.push(row);
|
|
293
|
+
pauseAndEmitChunkReady();
|
|
231
294
|
};
|
|
232
295
|
this.#request.on('row', rowListener);
|
|
233
296
|
this.#request.once('requestCompleted', () => {
|
|
234
|
-
this.#
|
|
297
|
+
Object.values(this.#subscribers).forEach((subscriber) => subscriber('completed'));
|
|
235
298
|
this.#request.off('row', rowListener);
|
|
236
|
-
onDone?.resolve({
|
|
237
|
-
rowCount: this.#rowCount,
|
|
238
|
-
rows: this.#rows,
|
|
239
|
-
});
|
|
240
299
|
});
|
|
241
300
|
}
|
|
242
301
|
#getTediousDataType(value) {
|
|
@@ -16,8 +16,12 @@ class MssqlIntrospector {
|
|
|
16
16
|
.selectFrom('sys.tables as tables')
|
|
17
17
|
.leftJoin('sys.schemas as table_schemas', 'table_schemas.schema_id', 'tables.schema_id')
|
|
18
18
|
.innerJoin('sys.columns as columns', 'columns.object_id', 'tables.object_id')
|
|
19
|
-
.innerJoin('sys.types as types', 'types.
|
|
19
|
+
.innerJoin('sys.types as types', 'types.user_type_id', 'columns.user_type_id')
|
|
20
20
|
.leftJoin('sys.schemas as type_schemas', 'type_schemas.schema_id', 'types.schema_id')
|
|
21
|
+
.leftJoin('sys.extended_properties as comments', (join) => join
|
|
22
|
+
.onRef('comments.major_id', '=', 'tables.object_id')
|
|
23
|
+
.onRef('comments.minor_id', '=', 'columns.column_id')
|
|
24
|
+
.on('comments.name', '=', 'MS_Description'))
|
|
21
25
|
.$if(!options.withInternalKyselyTables, (qb) => qb
|
|
22
26
|
.where('tables.name', '!=', migrator_js_1.DEFAULT_MIGRATION_TABLE)
|
|
23
27
|
.where('tables.name', '!=', migrator_js_1.DEFAULT_MIGRATION_LOCK_TABLE))
|
|
@@ -38,13 +42,18 @@ class MssqlIntrospector {
|
|
|
38
42
|
'types.is_nullable as type_is_nullable',
|
|
39
43
|
'types.name as type_name',
|
|
40
44
|
'type_schemas.name as type_schema_name',
|
|
45
|
+
'comments.value as column_comment',
|
|
41
46
|
])
|
|
42
47
|
.unionAll(this.#db
|
|
43
48
|
.selectFrom('sys.views as views')
|
|
44
49
|
.leftJoin('sys.schemas as view_schemas', 'view_schemas.schema_id', 'views.schema_id')
|
|
45
50
|
.innerJoin('sys.columns as columns', 'columns.object_id', 'views.object_id')
|
|
46
|
-
.innerJoin('sys.types as types', 'types.
|
|
51
|
+
.innerJoin('sys.types as types', 'types.user_type_id', 'columns.user_type_id')
|
|
47
52
|
.leftJoin('sys.schemas as type_schemas', 'type_schemas.schema_id', 'types.schema_id')
|
|
53
|
+
.leftJoin('sys.extended_properties as comments', (join) => join
|
|
54
|
+
.onRef('comments.major_id', '=', 'views.object_id')
|
|
55
|
+
.onRef('comments.minor_id', '=', 'columns.column_id')
|
|
56
|
+
.on('comments.name', '=', 'MS_Description'))
|
|
48
57
|
.select([
|
|
49
58
|
'views.name as table_name',
|
|
50
59
|
'views.type as table_type',
|
|
@@ -59,6 +68,7 @@ class MssqlIntrospector {
|
|
|
59
68
|
'types.is_nullable as type_is_nullable',
|
|
60
69
|
'types.name as type_name',
|
|
61
70
|
'type_schemas.name as type_schema_name',
|
|
71
|
+
'comments.value as column_comment',
|
|
62
72
|
]))
|
|
63
73
|
.orderBy('table_schema_name')
|
|
64
74
|
.orderBy('table_name')
|
|
@@ -86,6 +96,7 @@ class MssqlIntrospector {
|
|
|
86
96
|
isAutoIncrementing: rawColumn.column_is_identity,
|
|
87
97
|
isNullable: rawColumn.column_is_nullable && rawColumn.type_is_nullable,
|
|
88
98
|
name: rawColumn.column_name,
|
|
99
|
+
comment: rawColumn.column_comment ?? undefined,
|
|
89
100
|
}));
|
|
90
101
|
}
|
|
91
102
|
return Object.values(tableDictionary);
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { AddColumnNode } from '../../operation-node/add-column-node.js';
|
|
2
2
|
import { AlterTableColumnAlterationNode } from '../../operation-node/alter-table-node.js';
|
|
3
3
|
import { DropColumnNode } from '../../operation-node/drop-column-node.js';
|
|
4
|
+
import { OffsetNode } from '../../operation-node/offset-node.js';
|
|
5
|
+
import { MergeQueryNode } from '../../operation-node/merge-query-node.js';
|
|
4
6
|
import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
|
|
5
7
|
export declare class MssqlQueryCompiler extends DefaultQueryCompiler {
|
|
6
8
|
protected getCurrentParameterPlaceholder(): string;
|
|
9
|
+
protected visitOffset(node: OffsetNode): void;
|
|
7
10
|
protected compileColumnAlterations(columnAlterations: readonly AlterTableColumnAlterationNode[]): void;
|
|
8
11
|
protected visitAddColumn(node: AddColumnNode): void;
|
|
9
12
|
protected visitDropColumn(node: DropColumnNode): void;
|
|
13
|
+
protected visitMergeQuery(node: MergeQueryNode): void;
|
|
10
14
|
protected announcesNewColumnDataType(): boolean;
|
|
11
15
|
}
|
|
@@ -6,6 +6,10 @@ class MssqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompile
|
|
|
6
6
|
getCurrentParameterPlaceholder() {
|
|
7
7
|
return `@${this.numParameters}`;
|
|
8
8
|
}
|
|
9
|
+
visitOffset(node) {
|
|
10
|
+
super.visitOffset(node);
|
|
11
|
+
this.append(' rows');
|
|
12
|
+
}
|
|
9
13
|
// mssql allows multi-column alterations in a single statement,
|
|
10
14
|
// but you can only use the command keyword/s once.
|
|
11
15
|
// it also doesn't support multiple kinds of commands in the same
|
|
@@ -57,6 +61,10 @@ class MssqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompile
|
|
|
57
61
|
visitDropColumn(node) {
|
|
58
62
|
this.visitNode(node.column);
|
|
59
63
|
}
|
|
64
|
+
visitMergeQuery(node) {
|
|
65
|
+
super.visitMergeQuery(node);
|
|
66
|
+
this.append(';');
|
|
67
|
+
}
|
|
60
68
|
announcesNewColumnDataType() {
|
|
61
69
|
return false;
|
|
62
70
|
}
|
|
@@ -33,6 +33,7 @@ class MysqlIntrospector {
|
|
|
33
33
|
'columns.IS_NULLABLE',
|
|
34
34
|
'columns.DATA_TYPE',
|
|
35
35
|
'columns.EXTRA',
|
|
36
|
+
'columns.COLUMN_COMMENT',
|
|
36
37
|
])
|
|
37
38
|
.where('columns.TABLE_SCHEMA', '=', (0, sql_js_1.sql) `database()`)
|
|
38
39
|
.orderBy('columns.TABLE_NAME')
|
|
@@ -69,6 +70,7 @@ class MysqlIntrospector {
|
|
|
69
70
|
isNullable: it.IS_NULLABLE === 'YES',
|
|
70
71
|
isAutoIncrementing: it.EXTRA.toLowerCase().includes('auto_increment'),
|
|
71
72
|
hasDefaultValue: it.COLUMN_DEFAULT !== null,
|
|
73
|
+
comment: it.COLUMN_COMMENT === '' ? undefined : it.COLUMN_COMMENT,
|
|
72
74
|
}));
|
|
73
75
|
return tables;
|
|
74
76
|
}, []);
|
|
@@ -52,7 +52,7 @@ export interface PostgresCursor<T> {
|
|
|
52
52
|
}
|
|
53
53
|
export type PostgresCursorConstructor = new <T>(sql: string, parameters: unknown[]) => PostgresCursor<T>;
|
|
54
54
|
export interface PostgresQueryResult<R> {
|
|
55
|
-
command: 'UPDATE' | 'DELETE' | 'INSERT' | 'SELECT';
|
|
55
|
+
command: 'UPDATE' | 'DELETE' | 'INSERT' | 'SELECT' | 'MERGE';
|
|
56
56
|
rowCount: number;
|
|
57
57
|
rows: R[];
|
|
58
58
|
}
|
|
@@ -74,7 +74,8 @@ class PostgresConnection {
|
|
|
74
74
|
]);
|
|
75
75
|
if (result.command === 'INSERT' ||
|
|
76
76
|
result.command === 'UPDATE' ||
|
|
77
|
-
result.command === 'DELETE'
|
|
77
|
+
result.command === 'DELETE' ||
|
|
78
|
+
result.command === 'MERGE') {
|
|
78
79
|
const numAffectedRows = BigInt(result.rowCount);
|
|
79
80
|
return {
|
|
80
81
|
// TODO: remove.
|
|
@@ -38,6 +38,7 @@ class PostgresIntrospector {
|
|
|
38
38
|
'ns.nspname as schema',
|
|
39
39
|
'typ.typname as type',
|
|
40
40
|
'dtns.nspname as type_schema',
|
|
41
|
+
(0, sql_js_1.sql) `col_description(a.attrelid, a.attnum)`.as('column_description'),
|
|
41
42
|
// Detect if the column is auto incrementing by finding the sequence
|
|
42
43
|
// that is created for `serial` and `bigserial` columns.
|
|
43
44
|
this.#db
|
|
@@ -50,7 +51,7 @@ class PostgresIntrospector {
|
|
|
50
51
|
.as('auto_incrementing'),
|
|
51
52
|
])
|
|
52
53
|
// r == normal table
|
|
53
|
-
.where((eb) => eb.or([eb('c.relkind', '=', 'r'), eb('c.relkind', '=', 'v')]))
|
|
54
|
+
.where((eb) => eb.or([eb('c.relkind', '=', 'r'), eb('c.relkind', '=', 'v'), eb('c.relkind', '=', 'p')]))
|
|
54
55
|
.where('ns.nspname', '!~', '^pg_')
|
|
55
56
|
.where('ns.nspname', '!=', 'information_schema')
|
|
56
57
|
// No system columns
|
|
@@ -92,6 +93,7 @@ class PostgresIntrospector {
|
|
|
92
93
|
isNullable: !it.not_null,
|
|
93
94
|
isAutoIncrementing: !!it.auto_incrementing,
|
|
94
95
|
hasDefaultValue: it.has_default,
|
|
96
|
+
comment: it.column_description ?? undefined,
|
|
95
97
|
}));
|
|
96
98
|
return tables;
|
|
97
99
|
}, []);
|
|
@@ -14,14 +14,16 @@ export interface QueryResult<O> {
|
|
|
14
14
|
*/
|
|
15
15
|
readonly numUpdatedOrDeletedRows?: bigint;
|
|
16
16
|
/**
|
|
17
|
-
* This is defined for insert, update and
|
|
17
|
+
* This is defined for insert, update, delete and merge queries and contains
|
|
18
18
|
* the number of rows the query inserted/updated/deleted.
|
|
19
19
|
*/
|
|
20
20
|
readonly numAffectedRows?: bigint;
|
|
21
21
|
/**
|
|
22
22
|
* This is defined for update queries and contains the number of rows
|
|
23
23
|
* the query changed.
|
|
24
|
-
*
|
|
24
|
+
*
|
|
25
|
+
* This is **optional** and only provided in dialects such as MySQL.
|
|
26
|
+
* You would probably use {@link numAffectedRows} in most cases.
|
|
25
27
|
*/
|
|
26
28
|
readonly numChangedRows?: bigint;
|
|
27
29
|
/**
|