kysely 0.27.5 → 0.28.0
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/CODE_OF_CONDUCT.md +183 -0
- package/FUNDING.md +25 -0
- package/README.md +182 -3
- package/deno.check.d.ts +7 -0
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +26 -16
- package/dist/cjs/dialect/mssql/mssql-driver.d.ts +6 -3
- package/dist/cjs/dialect/mssql/mssql-driver.js +33 -19
- package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +2 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.js +11 -0
- package/dist/cjs/dialect/mysql/mysql-driver.d.ts +4 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +27 -12
- package/dist/cjs/dialect/postgres/postgres-driver.d.ts +4 -0
- package/dist/cjs/dialect/postgres/postgres-driver.js +28 -18
- package/dist/cjs/dialect/postgres/postgres-introspector.js +7 -17
- package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +4 -0
- package/dist/cjs/dialect/sqlite/sqlite-driver.js +19 -13
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +66 -44
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +4 -0
- package/dist/cjs/driver/database-connection.d.ts +0 -4
- package/dist/cjs/driver/driver.d.ts +17 -0
- package/dist/cjs/driver/driver.js +13 -1
- package/dist/cjs/driver/dummy-driver.d.ts +3 -0
- package/dist/cjs/driver/dummy-driver.js +9 -0
- package/dist/cjs/driver/runtime-driver.d.ts +4 -0
- package/dist/cjs/driver/runtime-driver.js +43 -3
- package/dist/cjs/expression/expression-builder.d.ts +9 -10
- package/dist/cjs/helpers/postgres.d.ts +48 -0
- package/dist/cjs/helpers/postgres.js +50 -0
- package/dist/cjs/index.d.ts +13 -2
- package/dist/cjs/index.js +13 -2
- package/dist/cjs/kysely.d.ts +339 -2
- package/dist/cjs/kysely.js +465 -11
- package/dist/cjs/migration/migrator.d.ts +16 -1
- package/dist/cjs/migration/migrator.js +14 -4
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +2 -1
- package/dist/cjs/operation-node/aggregate-function-node.js +4 -3
- package/dist/cjs/operation-node/alter-table-node.d.ts +3 -1
- package/dist/cjs/operation-node/collate-node.d.ts +13 -0
- package/dist/cjs/operation-node/collate-node.js +19 -0
- package/dist/cjs/operation-node/constraint-node.d.ts +1 -1
- package/dist/cjs/operation-node/create-type-node.d.ts +1 -1
- package/dist/cjs/operation-node/create-type-node.js +1 -1
- package/dist/cjs/operation-node/delete-query-node.d.ts +8 -2
- package/dist/cjs/operation-node/delete-query-node.js +11 -15
- package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/join-node.d.ts +1 -1
- package/dist/cjs/operation-node/merge-query-node.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +106 -97
- package/dist/cjs/operation-node/operation-node-transformer.js +352 -312
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +9 -1
- package/dist/cjs/operation-node/operation-node-visitor.js +4 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/or-action-node.d.ts +12 -0
- package/dist/cjs/operation-node/or-action-node.js +18 -0
- package/dist/cjs/operation-node/order-by-item-node.d.ts +5 -0
- package/dist/cjs/operation-node/order-by-item-node.js +6 -0
- package/dist/cjs/operation-node/primary-key-constraint-node.d.ts +29 -0
- package/dist/cjs/operation-node/{primary-constraint-node.js → primary-key-constraint-node.js} +11 -2
- package/dist/cjs/operation-node/query-node.d.ts +7 -0
- package/dist/cjs/operation-node/query-node.js +15 -0
- package/dist/cjs/operation-node/refresh-materialized-view-node.d.ts +17 -0
- package/dist/cjs/operation-node/refresh-materialized-view-node.js +25 -0
- package/dist/cjs/operation-node/rename-constraint-node.d.ts +14 -0
- package/dist/cjs/operation-node/rename-constraint-node.js +20 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +8 -2
- package/dist/cjs/operation-node/select-query-node.js +11 -15
- package/dist/cjs/operation-node/unique-constraint-node.d.ts +2 -0
- package/dist/cjs/operation-node/update-query-node.d.ts +3 -4
- package/dist/cjs/operation-node/update-query-node.js +5 -2
- package/dist/cjs/parser/collate-parser.d.ts +1 -0
- package/dist/cjs/parser/collate-parser.js +2 -0
- package/dist/cjs/parser/delete-from-parser.d.ts +5 -0
- package/dist/cjs/parser/delete-from-parser.js +2 -0
- package/dist/cjs/parser/insert-values-parser.js +3 -1
- package/dist/cjs/parser/join-parser.d.ts +1 -1
- package/dist/cjs/parser/join-parser.js +7 -1
- package/dist/cjs/parser/merge-into-parser.d.ts +5 -0
- package/dist/cjs/parser/merge-into-parser.js +2 -0
- package/dist/cjs/parser/order-by-parser.d.ts +18 -5
- package/dist/cjs/parser/order-by-parser.js +24 -14
- package/dist/cjs/parser/savepoint-parser.d.ts +4 -0
- package/dist/cjs/parser/savepoint-parser.js +11 -0
- package/dist/cjs/parser/select-from-parser.d.ts +4 -0
- package/dist/cjs/parser/select-from-parser.js +2 -0
- package/dist/cjs/parser/table-parser.d.ts +2 -5
- package/dist/cjs/parser/update-parser.d.ts +5 -0
- package/dist/cjs/parser/update-parser.js +2 -0
- package/dist/cjs/parser/update-set-parser.d.ts +7 -4
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +1 -1
- package/dist/cjs/plugin/camel-case/camel-case-transformer.d.ts +2 -1
- package/dist/cjs/plugin/camel-case/camel-case-transformer.js +2 -2
- package/dist/cjs/plugin/camel-case/camel-case.js +4 -1
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +4 -3
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +6 -6
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.d.ts +211 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.js +162 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.d.ts +8 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.js +29 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists.d.ts +44 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists.js +66 -0
- package/dist/cjs/plugin/immediate-value/immediate-value-plugin.js +1 -1
- package/dist/cjs/plugin/immediate-value/immediate-value-transformer.d.ts +2 -0
- package/dist/cjs/plugin/immediate-value/immediate-value-transformer.js +6 -4
- package/dist/cjs/plugin/with-schema/with-schema-plugin.js +1 -1
- package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +8 -3
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +45 -14
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +83 -5
- package/dist/cjs/query-builder/aggregate-function-builder.js +15 -27
- package/dist/cjs/query-builder/cte-builder.js +0 -2
- package/dist/cjs/query-builder/delete-query-builder.d.ts +36 -47
- package/dist/cjs/query-builder/delete-query-builder.js +12 -78
- package/dist/cjs/query-builder/function-module.d.ts +31 -4
- package/dist/cjs/query-builder/insert-query-builder.d.ts +161 -6
- package/dist/cjs/query-builder/insert-query-builder.js +197 -10
- package/dist/cjs/query-builder/join-builder.js +0 -2
- package/dist/cjs/query-builder/merge-query-builder.d.ts +145 -3
- package/dist/cjs/query-builder/merge-query-builder.js +28 -7
- package/dist/cjs/query-builder/on-conflict-builder.js +0 -4
- package/dist/cjs/query-builder/order-by-interface.d.ts +176 -0
- package/dist/cjs/query-builder/order-by-interface.js +2 -0
- package/dist/cjs/query-builder/order-by-item-builder.d.ts +43 -0
- package/dist/cjs/query-builder/order-by-item-builder.js +75 -0
- package/dist/cjs/query-builder/over-builder.d.ts +43 -6
- package/dist/cjs/query-builder/over-builder.js +8 -25
- package/dist/cjs/query-builder/returning-interface.d.ts +20 -3
- package/dist/cjs/query-builder/select-query-builder.d.ts +279 -98
- package/dist/cjs/query-builder/select-query-builder.js +26 -26
- package/dist/cjs/query-builder/update-query-builder.d.ts +88 -9
- package/dist/cjs/query-builder/update-query-builder.js +17 -15
- package/dist/cjs/query-compiler/compiled-query.d.ts +2 -0
- package/dist/cjs/query-compiler/compiled-query.js +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +17 -2
- package/dist/cjs/query-compiler/default-query-compiler.js +97 -2
- package/dist/cjs/query-compiler/query-compiler.d.ts +4 -2
- package/dist/cjs/query-creator.d.ts +23 -25
- package/dist/cjs/query-creator.js +280 -8
- package/dist/cjs/query-executor/default-query-executor.d.ts +2 -1
- package/dist/cjs/query-executor/default-query-executor.js +2 -2
- package/dist/cjs/query-executor/query-executor-base.js +7 -25
- package/dist/cjs/raw-builder/raw-builder.js +0 -3
- package/dist/cjs/raw-builder/sql.d.ts +4 -4
- package/dist/cjs/raw-builder/sql.js +1 -1
- package/dist/cjs/schema/alter-column-builder.js +0 -3
- package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.d.ts +4 -0
- package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.js +24 -2
- package/dist/cjs/schema/alter-table-add-index-builder.js +0 -2
- package/dist/cjs/schema/alter-table-builder.d.ts +7 -3
- package/dist/cjs/schema/alter-table-builder.js +21 -10
- package/dist/cjs/schema/alter-table-drop-constraint-builder.js +0 -2
- package/dist/cjs/schema/alter-table-executor.js +0 -2
- package/dist/cjs/schema/check-constraint-builder.d.ts +13 -0
- package/dist/cjs/schema/check-constraint-builder.js +20 -0
- package/dist/cjs/schema/column-definition-builder.js +0 -2
- package/dist/cjs/schema/create-index-builder.js +1 -3
- package/dist/cjs/schema/create-schema-builder.js +0 -2
- package/dist/cjs/schema/create-table-builder.d.ts +5 -4
- package/dist/cjs/schema/create-table-builder.js +9 -7
- package/dist/cjs/schema/create-type-builder.d.ts +1 -1
- package/dist/cjs/schema/create-type-builder.js +0 -2
- package/dist/cjs/schema/create-view-builder.js +0 -2
- package/dist/cjs/schema/drop-index-builder.js +0 -2
- package/dist/cjs/schema/drop-schema-builder.js +0 -2
- package/dist/cjs/schema/drop-table-builder.js +0 -2
- package/dist/cjs/schema/drop-type-builder.js +0 -2
- package/dist/cjs/schema/drop-view-builder.js +0 -2
- package/dist/cjs/schema/foreign-key-constraint-builder.d.ts +9 -0
- package/dist/cjs/schema/foreign-key-constraint-builder.js +16 -2
- package/dist/cjs/schema/primary-key-constraint-builder.d.ts +17 -0
- package/dist/cjs/schema/primary-key-constraint-builder.js +37 -0
- package/dist/cjs/schema/refresh-materialized-view-builder.d.ts +47 -0
- package/dist/cjs/schema/refresh-materialized-view-builder.js +75 -0
- package/dist/cjs/schema/schema.d.ts +14 -0
- package/dist/cjs/schema/schema.js +21 -0
- package/dist/cjs/schema/unique-constraint-builder.d.ts +10 -1
- package/dist/cjs/schema/unique-constraint-builder.js +26 -5
- package/dist/cjs/util/infer-result.d.ts +1 -1
- package/dist/cjs/util/log.d.ts +1 -0
- package/dist/cjs/util/log.js +3 -2
- package/dist/cjs/util/provide-controlled-connection.d.ts +7 -0
- package/dist/cjs/util/provide-controlled-connection.js +24 -0
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +26 -16
- package/dist/esm/dialect/mssql/mssql-driver.d.ts +6 -3
- package/dist/esm/dialect/mssql/mssql-driver.js +33 -19
- package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +2 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.js +11 -0
- package/dist/esm/dialect/mysql/mysql-driver.d.ts +4 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +27 -12
- package/dist/esm/dialect/postgres/postgres-driver.d.ts +4 -0
- package/dist/esm/dialect/postgres/postgres-driver.js +28 -18
- package/dist/esm/dialect/postgres/postgres-introspector.js +7 -17
- package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +4 -0
- package/dist/esm/dialect/sqlite/sqlite-driver.js +19 -13
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +66 -44
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +4 -0
- package/dist/esm/driver/database-connection.d.ts +0 -4
- package/dist/esm/driver/driver.d.ts +17 -0
- package/dist/esm/driver/driver.js +11 -0
- package/dist/esm/driver/dummy-driver.d.ts +3 -0
- package/dist/esm/driver/dummy-driver.js +9 -0
- package/dist/esm/driver/runtime-driver.d.ts +4 -0
- package/dist/esm/driver/runtime-driver.js +43 -3
- package/dist/esm/expression/expression-builder.d.ts +9 -10
- package/dist/esm/helpers/postgres.d.ts +48 -0
- package/dist/esm/helpers/postgres.js +49 -0
- package/dist/esm/index.d.ts +13 -2
- package/dist/esm/index.js +11 -1
- package/dist/esm/kysely.d.ts +339 -2
- package/dist/esm/kysely.js +461 -10
- package/dist/esm/migration/migrator.d.ts +16 -1
- package/dist/esm/migration/migrator.js +14 -4
- package/dist/esm/operation-node/aggregate-function-node.d.ts +2 -1
- package/dist/esm/operation-node/aggregate-function-node.js +4 -3
- package/dist/esm/operation-node/alter-table-node.d.ts +3 -1
- package/dist/esm/operation-node/collate-node.d.ts +13 -0
- package/dist/esm/operation-node/collate-node.js +17 -0
- package/dist/esm/operation-node/constraint-node.d.ts +1 -1
- package/dist/esm/operation-node/create-type-node.d.ts +1 -1
- package/dist/esm/operation-node/create-type-node.js +1 -1
- package/dist/esm/operation-node/delete-query-node.d.ts +8 -2
- package/dist/esm/operation-node/delete-query-node.js +11 -15
- package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +3 -0
- package/dist/esm/operation-node/join-node.d.ts +1 -1
- package/dist/esm/operation-node/merge-query-node.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +106 -97
- package/dist/esm/operation-node/operation-node-transformer.js +352 -312
- package/dist/esm/operation-node/operation-node-visitor.d.ts +9 -1
- package/dist/esm/operation-node/operation-node-visitor.js +4 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/or-action-node.d.ts +12 -0
- package/dist/esm/operation-node/or-action-node.js +16 -0
- package/dist/esm/operation-node/order-by-item-node.d.ts +5 -0
- package/dist/esm/operation-node/order-by-item-node.js +6 -0
- package/dist/esm/operation-node/primary-key-constraint-node.d.ts +29 -0
- package/dist/esm/operation-node/{primary-constraint-node.js → primary-key-constraint-node.js} +11 -2
- package/dist/esm/operation-node/query-node.d.ts +7 -0
- package/dist/esm/operation-node/query-node.js +15 -0
- package/dist/esm/operation-node/refresh-materialized-view-node.d.ts +17 -0
- package/dist/esm/operation-node/refresh-materialized-view-node.js +23 -0
- package/dist/esm/operation-node/rename-constraint-node.d.ts +14 -0
- package/dist/esm/operation-node/rename-constraint-node.js +18 -0
- package/dist/esm/operation-node/select-query-node.d.ts +8 -2
- package/dist/esm/operation-node/select-query-node.js +11 -15
- package/dist/esm/operation-node/unique-constraint-node.d.ts +2 -0
- package/dist/esm/operation-node/update-query-node.d.ts +3 -4
- package/dist/esm/operation-node/update-query-node.js +5 -2
- package/dist/esm/parser/collate-parser.d.ts +1 -0
- package/dist/esm/parser/collate-parser.js +2 -0
- package/dist/esm/parser/delete-from-parser.d.ts +5 -0
- package/dist/esm/parser/delete-from-parser.js +2 -0
- package/dist/esm/parser/insert-values-parser.js +3 -1
- package/dist/esm/parser/join-parser.d.ts +1 -1
- package/dist/esm/parser/join-parser.js +7 -1
- package/dist/esm/parser/merge-into-parser.d.ts +5 -0
- package/dist/esm/parser/merge-into-parser.js +2 -0
- package/dist/esm/parser/order-by-parser.d.ts +18 -5
- package/dist/esm/parser/order-by-parser.js +27 -17
- package/dist/esm/parser/savepoint-parser.d.ts +4 -0
- package/dist/esm/parser/savepoint-parser.js +9 -0
- package/dist/esm/parser/select-from-parser.d.ts +4 -0
- package/dist/esm/parser/select-from-parser.js +2 -0
- package/dist/esm/parser/table-parser.d.ts +2 -5
- package/dist/esm/parser/update-parser.d.ts +5 -0
- package/dist/esm/parser/update-parser.js +2 -0
- package/dist/esm/parser/update-set-parser.d.ts +7 -4
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +1 -1
- package/dist/esm/plugin/camel-case/camel-case-transformer.d.ts +2 -1
- package/dist/esm/plugin/camel-case/camel-case-transformer.js +2 -2
- package/dist/esm/plugin/camel-case/camel-case.js +4 -1
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +4 -3
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +6 -6
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.d.ts +211 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.js +159 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.d.ts +8 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.js +26 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists.d.ts +44 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists.js +63 -0
- package/dist/esm/plugin/immediate-value/immediate-value-plugin.js +1 -1
- package/dist/esm/plugin/immediate-value/immediate-value-transformer.d.ts +2 -0
- package/dist/esm/plugin/immediate-value/immediate-value-transformer.js +6 -4
- package/dist/esm/plugin/with-schema/with-schema-plugin.js +1 -1
- package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +8 -3
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +45 -14
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +83 -5
- package/dist/esm/query-builder/aggregate-function-builder.js +15 -27
- package/dist/esm/query-builder/cte-builder.js +0 -2
- package/dist/esm/query-builder/delete-query-builder.d.ts +36 -47
- package/dist/esm/query-builder/delete-query-builder.js +12 -78
- package/dist/esm/query-builder/function-module.d.ts +31 -4
- package/dist/esm/query-builder/insert-query-builder.d.ts +161 -6
- package/dist/esm/query-builder/insert-query-builder.js +197 -10
- package/dist/esm/query-builder/join-builder.js +0 -2
- package/dist/esm/query-builder/merge-query-builder.d.ts +145 -3
- package/dist/esm/query-builder/merge-query-builder.js +29 -8
- package/dist/esm/query-builder/on-conflict-builder.js +0 -4
- package/dist/esm/query-builder/order-by-interface.d.ts +176 -0
- package/dist/esm/query-builder/order-by-interface.js +2 -0
- package/dist/esm/query-builder/order-by-item-builder.d.ts +43 -0
- package/dist/esm/query-builder/order-by-item-builder.js +72 -0
- package/dist/esm/query-builder/over-builder.d.ts +43 -6
- package/dist/esm/query-builder/over-builder.js +8 -25
- package/dist/esm/query-builder/returning-interface.d.ts +20 -3
- package/dist/esm/query-builder/select-query-builder.d.ts +279 -98
- package/dist/esm/query-builder/select-query-builder.js +26 -26
- package/dist/esm/query-builder/update-query-builder.d.ts +88 -9
- package/dist/esm/query-builder/update-query-builder.js +17 -15
- package/dist/esm/query-compiler/compiled-query.d.ts +2 -0
- package/dist/esm/query-compiler/compiled-query.js +2 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +17 -2
- package/dist/esm/query-compiler/default-query-compiler.js +97 -2
- package/dist/esm/query-compiler/query-compiler.d.ts +4 -2
- package/dist/esm/query-creator.d.ts +23 -25
- package/dist/esm/query-creator.js +281 -9
- package/dist/esm/query-executor/default-query-executor.d.ts +2 -1
- package/dist/esm/query-executor/default-query-executor.js +2 -2
- package/dist/esm/query-executor/query-executor-base.js +7 -25
- package/dist/esm/raw-builder/raw-builder.js +0 -3
- package/dist/esm/raw-builder/sql.d.ts +4 -4
- package/dist/esm/raw-builder/sql.js +1 -1
- package/dist/esm/schema/alter-column-builder.js +0 -3
- package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.d.ts +4 -0
- package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.js +24 -2
- package/dist/esm/schema/alter-table-add-index-builder.js +0 -2
- package/dist/esm/schema/alter-table-builder.d.ts +7 -3
- package/dist/esm/schema/alter-table-builder.js +22 -11
- package/dist/esm/schema/alter-table-drop-constraint-builder.js +0 -2
- package/dist/esm/schema/alter-table-executor.js +0 -2
- package/dist/esm/schema/check-constraint-builder.d.ts +13 -0
- package/dist/esm/schema/check-constraint-builder.js +17 -0
- package/dist/esm/schema/column-definition-builder.js +0 -2
- package/dist/esm/schema/create-index-builder.js +1 -3
- package/dist/esm/schema/create-schema-builder.js +0 -2
- package/dist/esm/schema/create-table-builder.d.ts +5 -4
- package/dist/esm/schema/create-table-builder.js +10 -8
- package/dist/esm/schema/create-type-builder.d.ts +1 -1
- package/dist/esm/schema/create-type-builder.js +0 -2
- package/dist/esm/schema/create-view-builder.js +0 -2
- package/dist/esm/schema/drop-index-builder.js +0 -2
- package/dist/esm/schema/drop-schema-builder.js +0 -2
- package/dist/esm/schema/drop-table-builder.js +0 -2
- package/dist/esm/schema/drop-type-builder.js +0 -2
- package/dist/esm/schema/drop-view-builder.js +0 -2
- package/dist/esm/schema/foreign-key-constraint-builder.d.ts +9 -0
- package/dist/esm/schema/foreign-key-constraint-builder.js +16 -2
- package/dist/esm/schema/primary-key-constraint-builder.d.ts +17 -0
- package/dist/esm/schema/primary-key-constraint-builder.js +34 -0
- package/dist/esm/schema/refresh-materialized-view-builder.d.ts +47 -0
- package/dist/esm/schema/refresh-materialized-view-builder.js +72 -0
- package/dist/esm/schema/schema.d.ts +14 -0
- package/dist/esm/schema/schema.js +21 -0
- package/dist/esm/schema/unique-constraint-builder.d.ts +10 -1
- package/dist/esm/schema/unique-constraint-builder.js +26 -5
- package/dist/esm/util/infer-result.d.ts +1 -1
- package/dist/esm/util/log.d.ts +1 -0
- package/dist/esm/util/log.js +3 -2
- package/dist/esm/util/provide-controlled-connection.d.ts +7 -0
- package/dist/esm/util/provide-controlled-connection.js +22 -0
- package/outdated-typescript.d.ts +5 -0
- package/package.json +16 -2
- package/CONTRIBUTING.md +0 -70
- package/dist/cjs/operation-node/primary-constraint-node.d.ts +0 -15
- package/dist/cjs/util/prevent-await.d.ts +0 -1
- package/dist/cjs/util/prevent-await.js +0 -13
- package/dist/esm/operation-node/primary-constraint-node.d.ts +0 -15
- package/dist/esm/util/prevent-await.d.ts +0 -1
- package/dist/esm/util/prevent-await.js +0 -11
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/// <reference types="./postgres-driver.d.ts" />
|
|
2
|
+
import { parseSavepointCommand } from '../../parser/savepoint-parser.js';
|
|
2
3
|
import { CompiledQuery } from '../../query-compiler/compiled-query.js';
|
|
3
4
|
import { isFunction, freeze } from '../../util/object-utils.js';
|
|
5
|
+
import { createQueryId } from '../../util/query-id.js';
|
|
4
6
|
import { extendStackTrace } from '../../util/stack-trace-utils.js';
|
|
5
7
|
const PRIVATE_RELEASE_METHOD = Symbol();
|
|
6
8
|
export class PostgresDriver {
|
|
@@ -36,8 +38,15 @@ export class PostgresDriver {
|
|
|
36
38
|
return connection;
|
|
37
39
|
}
|
|
38
40
|
async beginTransaction(connection, settings) {
|
|
39
|
-
if (settings.isolationLevel) {
|
|
40
|
-
|
|
41
|
+
if (settings.isolationLevel || settings.accessMode) {
|
|
42
|
+
let sql = 'start transaction';
|
|
43
|
+
if (settings.isolationLevel) {
|
|
44
|
+
sql += ` isolation level ${settings.isolationLevel}`;
|
|
45
|
+
}
|
|
46
|
+
if (settings.accessMode) {
|
|
47
|
+
sql += ` ${settings.accessMode}`;
|
|
48
|
+
}
|
|
49
|
+
await connection.executeQuery(CompiledQuery.raw(sql));
|
|
41
50
|
}
|
|
42
51
|
else {
|
|
43
52
|
await connection.executeQuery(CompiledQuery.raw('begin'));
|
|
@@ -49,6 +58,15 @@ export class PostgresDriver {
|
|
|
49
58
|
async rollbackTransaction(connection) {
|
|
50
59
|
await connection.executeQuery(CompiledQuery.raw('rollback'));
|
|
51
60
|
}
|
|
61
|
+
async savepoint(connection, savepointName, compileQuery) {
|
|
62
|
+
await connection.executeQuery(compileQuery(parseSavepointCommand('savepoint', savepointName), createQueryId()));
|
|
63
|
+
}
|
|
64
|
+
async rollbackToSavepoint(connection, savepointName, compileQuery) {
|
|
65
|
+
await connection.executeQuery(compileQuery(parseSavepointCommand('rollback to', savepointName), createQueryId()));
|
|
66
|
+
}
|
|
67
|
+
async releaseSavepoint(connection, savepointName, compileQuery) {
|
|
68
|
+
await connection.executeQuery(compileQuery(parseSavepointCommand('release', savepointName), createQueryId()));
|
|
69
|
+
}
|
|
52
70
|
async releaseConnection(connection) {
|
|
53
71
|
connection[PRIVATE_RELEASE_METHOD]();
|
|
54
72
|
}
|
|
@@ -69,23 +87,15 @@ class PostgresConnection {
|
|
|
69
87
|
}
|
|
70
88
|
async executeQuery(compiledQuery) {
|
|
71
89
|
try {
|
|
72
|
-
const
|
|
73
|
-
...compiledQuery.parameters,
|
|
74
|
-
]);
|
|
75
|
-
if (result.command === 'INSERT' ||
|
|
76
|
-
result.command === 'UPDATE' ||
|
|
77
|
-
result.command === 'DELETE' ||
|
|
78
|
-
result.command === 'MERGE') {
|
|
79
|
-
const numAffectedRows = BigInt(result.rowCount);
|
|
80
|
-
return {
|
|
81
|
-
// TODO: remove.
|
|
82
|
-
numUpdatedOrDeletedRows: numAffectedRows,
|
|
83
|
-
numAffectedRows,
|
|
84
|
-
rows: result.rows ?? [],
|
|
85
|
-
};
|
|
86
|
-
}
|
|
90
|
+
const { command, rowCount, rows } = await this.#client.query(compiledQuery.sql, [...compiledQuery.parameters]);
|
|
87
91
|
return {
|
|
88
|
-
|
|
92
|
+
numAffectedRows: command === 'INSERT' ||
|
|
93
|
+
command === 'UPDATE' ||
|
|
94
|
+
command === 'DELETE' ||
|
|
95
|
+
command === 'MERGE'
|
|
96
|
+
? BigInt(rowCount)
|
|
97
|
+
: undefined,
|
|
98
|
+
rows: rows ?? [],
|
|
89
99
|
};
|
|
90
100
|
}
|
|
91
101
|
catch (err) {
|
|
@@ -37,23 +37,13 @@ export class PostgresIntrospector {
|
|
|
37
37
|
'typ.typname as type',
|
|
38
38
|
'dtns.nspname as type_schema',
|
|
39
39
|
sql `col_description(a.attrelid, a.attnum)`.as('column_description'),
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
.whereRef('relnamespace', '=', 'c.relnamespace')
|
|
47
|
-
.where('relkind', '=', 'S')
|
|
48
|
-
.where('relname', '=', sql `c.relname || '_' || a.attname || '_seq'`)
|
|
49
|
-
.as('auto_incrementing'),
|
|
40
|
+
sql `pg_get_serial_sequence(ns.nspname || '.' || c.relname, a.attname)`.as('auto_incrementing'),
|
|
41
|
+
])
|
|
42
|
+
.where('c.relkind', 'in', [
|
|
43
|
+
'r' /*regular table*/,
|
|
44
|
+
'v' /*view*/,
|
|
45
|
+
'p' /*partitioned table*/,
|
|
50
46
|
])
|
|
51
|
-
// r == normal table
|
|
52
|
-
.where((eb) => eb.or([
|
|
53
|
-
eb('c.relkind', '=', 'r'),
|
|
54
|
-
eb('c.relkind', '=', 'v'),
|
|
55
|
-
eb('c.relkind', '=', 'p'),
|
|
56
|
-
]))
|
|
57
47
|
.where('ns.nspname', '!~', '^pg_')
|
|
58
48
|
.where('ns.nspname', '!=', 'information_schema')
|
|
59
49
|
// No system columns
|
|
@@ -93,7 +83,7 @@ export class PostgresIntrospector {
|
|
|
93
83
|
dataType: it.type,
|
|
94
84
|
dataTypeSchema: it.type_schema,
|
|
95
85
|
isNullable: !it.not_null,
|
|
96
|
-
isAutoIncrementing:
|
|
86
|
+
isAutoIncrementing: it.auto_incrementing !== null,
|
|
97
87
|
hasDefaultValue: it.has_default,
|
|
98
88
|
comment: it.column_description ?? undefined,
|
|
99
89
|
}));
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DatabaseConnection } from '../../driver/database-connection.js';
|
|
2
2
|
import { Driver } from '../../driver/driver.js';
|
|
3
|
+
import { QueryCompiler } from '../../query-compiler/query-compiler.js';
|
|
3
4
|
import { SqliteDialectConfig } from './sqlite-dialect-config.js';
|
|
4
5
|
export declare class SqliteDriver implements Driver {
|
|
5
6
|
#private;
|
|
@@ -27,6 +28,9 @@ export declare class SqliteDriver implements Driver {
|
|
|
27
28
|
* Rolls back a transaction.
|
|
28
29
|
*/
|
|
29
30
|
rollbackTransaction(connection: DatabaseConnection): Promise<void>;
|
|
31
|
+
savepoint(connection: DatabaseConnection, savepointName: string, compileQuery: QueryCompiler['compileQuery']): Promise<void>;
|
|
32
|
+
rollbackToSavepoint(connection: DatabaseConnection, savepointName: string, compileQuery: QueryCompiler['compileQuery']): Promise<void>;
|
|
33
|
+
releaseSavepoint(connection: DatabaseConnection, savepointName: string, compileQuery: QueryCompiler['compileQuery']): Promise<void>;
|
|
30
34
|
/**
|
|
31
35
|
* Releases a connection back to the pool.
|
|
32
36
|
*/
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/// <reference types="./sqlite-driver.d.ts" />
|
|
2
2
|
import { SelectQueryNode } from '../../operation-node/select-query-node.js';
|
|
3
|
+
import { parseSavepointCommand } from '../../parser/savepoint-parser.js';
|
|
3
4
|
import { CompiledQuery } from '../../query-compiler/compiled-query.js';
|
|
4
5
|
import { freeze, isFunction } from '../../util/object-utils.js';
|
|
6
|
+
import { createQueryId } from '../../util/query-id.js';
|
|
5
7
|
export class SqliteDriver {
|
|
6
8
|
#config;
|
|
7
9
|
#connectionMutex = new ConnectionMutex();
|
|
@@ -34,6 +36,15 @@ export class SqliteDriver {
|
|
|
34
36
|
async rollbackTransaction(connection) {
|
|
35
37
|
await connection.executeQuery(CompiledQuery.raw('rollback'));
|
|
36
38
|
}
|
|
39
|
+
async savepoint(connection, savepointName, compileQuery) {
|
|
40
|
+
await connection.executeQuery(compileQuery(parseSavepointCommand('savepoint', savepointName), createQueryId()));
|
|
41
|
+
}
|
|
42
|
+
async rollbackToSavepoint(connection, savepointName, compileQuery) {
|
|
43
|
+
await connection.executeQuery(compileQuery(parseSavepointCommand('rollback to', savepointName), createQueryId()));
|
|
44
|
+
}
|
|
45
|
+
async releaseSavepoint(connection, savepointName, compileQuery) {
|
|
46
|
+
await connection.executeQuery(compileQuery(parseSavepointCommand('release', savepointName), createQueryId()));
|
|
47
|
+
}
|
|
37
48
|
async releaseConnection() {
|
|
38
49
|
this.#connectionMutex.unlock();
|
|
39
50
|
}
|
|
@@ -54,19 +65,14 @@ class SqliteConnection {
|
|
|
54
65
|
rows: stmt.all(parameters),
|
|
55
66
|
});
|
|
56
67
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
? BigInt(lastInsertRowid)
|
|
66
|
-
: undefined,
|
|
67
|
-
rows: [],
|
|
68
|
-
});
|
|
69
|
-
}
|
|
68
|
+
const { changes, lastInsertRowid } = stmt.run(parameters);
|
|
69
|
+
return Promise.resolve({
|
|
70
|
+
numAffectedRows: changes !== undefined && changes !== null ? BigInt(changes) : undefined,
|
|
71
|
+
insertId: lastInsertRowid !== undefined && lastInsertRowid !== null
|
|
72
|
+
? BigInt(lastInsertRowid)
|
|
73
|
+
: undefined,
|
|
74
|
+
rows: [],
|
|
75
|
+
});
|
|
70
76
|
}
|
|
71
77
|
async *streamQuery(compiledQuery, _chunkSize) {
|
|
72
78
|
const { sql, parameters, query } = compiledQuery;
|
|
@@ -11,58 +11,80 @@ export class SqliteIntrospector {
|
|
|
11
11
|
return [];
|
|
12
12
|
}
|
|
13
13
|
async getTables(options = { withInternalKyselyTables: false }) {
|
|
14
|
-
|
|
14
|
+
return await this.#getTableMetadata(options);
|
|
15
|
+
}
|
|
16
|
+
async getMetadata(options) {
|
|
17
|
+
return {
|
|
18
|
+
tables: await this.getTables(options),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
#tablesQuery(qb, options) {
|
|
22
|
+
let tablesQuery = qb
|
|
15
23
|
.selectFrom('sqlite_master')
|
|
16
24
|
.where('type', 'in', ['table', 'view'])
|
|
17
25
|
.where('name', 'not like', 'sqlite_%')
|
|
18
|
-
.select('name')
|
|
19
|
-
.orderBy('name')
|
|
20
|
-
.$castTo();
|
|
26
|
+
.select(['name', 'sql', 'type'])
|
|
27
|
+
.orderBy('name');
|
|
21
28
|
if (!options.withInternalKyselyTables) {
|
|
22
|
-
|
|
29
|
+
tablesQuery = tablesQuery
|
|
23
30
|
.where('name', '!=', DEFAULT_MIGRATION_TABLE)
|
|
24
31
|
.where('name', '!=', DEFAULT_MIGRATION_LOCK_TABLE);
|
|
25
32
|
}
|
|
26
|
-
|
|
27
|
-
return Promise.all(tables.map(({ name }) => this.#getTableMetadata(name)));
|
|
33
|
+
return tablesQuery;
|
|
28
34
|
}
|
|
29
|
-
async
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
.
|
|
39
|
-
.
|
|
40
|
-
.
|
|
41
|
-
|
|
42
|
-
.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
?.trimStart()
|
|
48
|
-
?.split(/\s+/)?.[0]
|
|
49
|
-
?.replace(/["`]/g, '');
|
|
50
|
-
const columns = await db
|
|
51
|
-
.selectFrom(sql `pragma_table_info(${table})`.as('table_info'))
|
|
52
|
-
.select(['name', 'type', 'notnull', 'dflt_value'])
|
|
53
|
-
.orderBy('cid')
|
|
35
|
+
async #getTableMetadata(options) {
|
|
36
|
+
const tablesResult = await this.#tablesQuery(this.#db, options).execute();
|
|
37
|
+
const tableMetadata = await this.#db
|
|
38
|
+
.with('table_list', (qb) => this.#tablesQuery(qb, options))
|
|
39
|
+
.selectFrom([
|
|
40
|
+
'table_list as tl',
|
|
41
|
+
sql `pragma_table_info(tl.name)`.as('p'),
|
|
42
|
+
])
|
|
43
|
+
.select([
|
|
44
|
+
'tl.name as table',
|
|
45
|
+
'p.cid',
|
|
46
|
+
'p.name',
|
|
47
|
+
'p.type',
|
|
48
|
+
'p.notnull',
|
|
49
|
+
'p.dflt_value',
|
|
50
|
+
'p.pk',
|
|
51
|
+
])
|
|
52
|
+
.orderBy(['tl.name', 'p.cid'])
|
|
54
53
|
.execute();
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
54
|
+
const columnsByTable = {};
|
|
55
|
+
for (const row of tableMetadata) {
|
|
56
|
+
columnsByTable[row.table] ??= [];
|
|
57
|
+
columnsByTable[row.table].push(row);
|
|
58
|
+
}
|
|
59
|
+
return tablesResult.map(({ name, sql, type }) => {
|
|
60
|
+
// // Try to find the name of the column that has `autoincrement` 🤦
|
|
61
|
+
let autoIncrementCol = sql
|
|
62
|
+
?.split(/[\(\),]/)
|
|
63
|
+
?.find((it) => it.toLowerCase().includes('autoincrement'))
|
|
64
|
+
?.trimStart()
|
|
65
|
+
?.split(/\s+/)?.[0]
|
|
66
|
+
?.replace(/["`]/g, '');
|
|
67
|
+
const columns = columnsByTable[name] ?? [];
|
|
68
|
+
// Otherwise, check for an INTEGER PRIMARY KEY
|
|
69
|
+
// https://www.sqlite.org/autoinc.html
|
|
70
|
+
if (!autoIncrementCol) {
|
|
71
|
+
const pkCols = columns.filter((r) => r.pk > 0);
|
|
72
|
+
if (pkCols.length === 1 && pkCols[0].type.toLowerCase() === 'integer') {
|
|
73
|
+
autoIncrementCol = pkCols[0].name;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
name: name,
|
|
78
|
+
isView: type === 'view',
|
|
79
|
+
columns: columns.map((col) => ({
|
|
80
|
+
name: col.name,
|
|
81
|
+
dataType: col.type,
|
|
82
|
+
isNullable: !col.notnull,
|
|
83
|
+
isAutoIncrementing: col.name === autoIncrementCol,
|
|
84
|
+
hasDefaultValue: col.dflt_value != null,
|
|
85
|
+
comment: undefined,
|
|
86
|
+
})),
|
|
87
|
+
};
|
|
88
|
+
});
|
|
67
89
|
}
|
|
68
90
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DefaultInsertValueNode } from '../../operation-node/default-insert-value-node.js';
|
|
2
|
+
import { OrActionNode } from '../../operation-node/or-action-node.js';
|
|
2
3
|
import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
|
|
3
4
|
export declare class SqliteQueryCompiler extends DefaultQueryCompiler {
|
|
5
|
+
protected visitOrAction(node: OrActionNode): void;
|
|
4
6
|
protected getCurrentParameterPlaceholder(): string;
|
|
5
7
|
protected getLeftExplainOptionsWrapper(): string;
|
|
6
8
|
protected getRightExplainOptionsWrapper(): string;
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
|
|
3
3
|
const ID_WRAP_REGEX = /"/g;
|
|
4
4
|
export class SqliteQueryCompiler extends DefaultQueryCompiler {
|
|
5
|
+
visitOrAction(node) {
|
|
6
|
+
this.append('or ');
|
|
7
|
+
this.append(node.action);
|
|
8
|
+
}
|
|
5
9
|
getCurrentParameterPlaceholder() {
|
|
6
10
|
return '?';
|
|
7
11
|
}
|
|
@@ -9,10 +9,6 @@ export interface DatabaseConnection {
|
|
|
9
9
|
streamQuery<R>(compiledQuery: CompiledQuery, chunkSize?: number): AsyncIterableIterator<QueryResult<R>>;
|
|
10
10
|
}
|
|
11
11
|
export interface QueryResult<O> {
|
|
12
|
-
/**
|
|
13
|
-
* @deprecated use {@link QueryResult.numAffectedRows} instead.
|
|
14
|
-
*/
|
|
15
|
-
readonly numUpdatedOrDeletedRows?: bigint;
|
|
16
12
|
/**
|
|
17
13
|
* This is defined for insert, update, delete and merge queries and contains
|
|
18
14
|
* the number of rows the query inserted/updated/deleted.
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { QueryCompiler } from '../query-compiler/query-compiler.js';
|
|
1
2
|
import { ArrayItemType } from '../util/type-utils.js';
|
|
2
3
|
import { DatabaseConnection } from './database-connection.js';
|
|
3
4
|
/**
|
|
@@ -28,6 +29,18 @@ export interface Driver {
|
|
|
28
29
|
* Rolls back a transaction.
|
|
29
30
|
*/
|
|
30
31
|
rollbackTransaction(connection: DatabaseConnection): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Establishses a new savepoint within a transaction.
|
|
34
|
+
*/
|
|
35
|
+
savepoint?(connection: DatabaseConnection, savepointName: string, compileQuery: QueryCompiler['compileQuery']): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Rolls back to a savepoint within a transaction.
|
|
38
|
+
*/
|
|
39
|
+
rollbackToSavepoint?(connection: DatabaseConnection, savepointName: string, compileQuery: QueryCompiler['compileQuery']): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Releases a savepoint within a transaction.
|
|
42
|
+
*/
|
|
43
|
+
releaseSavepoint?(connection: DatabaseConnection, savepointName: string, compileQuery: QueryCompiler['compileQuery']): Promise<void>;
|
|
31
44
|
/**
|
|
32
45
|
* Releases a connection back to the pool.
|
|
33
46
|
*/
|
|
@@ -38,7 +51,11 @@ export interface Driver {
|
|
|
38
51
|
destroy(): Promise<void>;
|
|
39
52
|
}
|
|
40
53
|
export interface TransactionSettings {
|
|
54
|
+
readonly accessMode?: AccessMode;
|
|
41
55
|
readonly isolationLevel?: IsolationLevel;
|
|
42
56
|
}
|
|
57
|
+
export declare const TRANSACTION_ACCESS_MODES: readonly ["read only", "read write"];
|
|
58
|
+
export type AccessMode = ArrayItemType<typeof TRANSACTION_ACCESS_MODES>;
|
|
43
59
|
export declare const TRANSACTION_ISOLATION_LEVELS: readonly ["read uncommitted", "read committed", "repeatable read", "serializable", "snapshot"];
|
|
44
60
|
export type IsolationLevel = ArrayItemType<typeof TRANSACTION_ISOLATION_LEVELS>;
|
|
61
|
+
export declare function validateTransactionSettings(settings: TransactionSettings): void;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="./driver.d.ts" />
|
|
2
|
+
export const TRANSACTION_ACCESS_MODES = ['read only', 'read write'];
|
|
2
3
|
export const TRANSACTION_ISOLATION_LEVELS = [
|
|
3
4
|
'read uncommitted',
|
|
4
5
|
'read committed',
|
|
@@ -6,3 +7,13 @@ export const TRANSACTION_ISOLATION_LEVELS = [
|
|
|
6
7
|
'serializable',
|
|
7
8
|
'snapshot',
|
|
8
9
|
];
|
|
10
|
+
export function validateTransactionSettings(settings) {
|
|
11
|
+
if (settings.accessMode &&
|
|
12
|
+
!TRANSACTION_ACCESS_MODES.includes(settings.accessMode)) {
|
|
13
|
+
throw new Error(`invalid transaction access mode ${settings.accessMode}`);
|
|
14
|
+
}
|
|
15
|
+
if (settings.isolationLevel &&
|
|
16
|
+
!TRANSACTION_ISOLATION_LEVELS.includes(settings.isolationLevel)) {
|
|
17
|
+
throw new Error(`invalid transaction isolation level ${settings.isolationLevel}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -58,6 +58,15 @@ export class DummyDriver {
|
|
|
58
58
|
async destroy() {
|
|
59
59
|
// Nothing to do here.
|
|
60
60
|
}
|
|
61
|
+
async releaseSavepoint() {
|
|
62
|
+
// Nothing to do here.
|
|
63
|
+
}
|
|
64
|
+
async rollbackToSavepoint() {
|
|
65
|
+
// Nothing to do here.
|
|
66
|
+
}
|
|
67
|
+
async savepoint() {
|
|
68
|
+
// Nothing to do here.
|
|
69
|
+
}
|
|
61
70
|
}
|
|
62
71
|
class DummyConnection {
|
|
63
72
|
async executeQuery() {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { QueryCompiler } from '../query-compiler/query-compiler.js';
|
|
1
2
|
import { Log } from '../util/log.js';
|
|
2
3
|
import { DatabaseConnection } from './database-connection.js';
|
|
3
4
|
import { Driver, TransactionSettings } from './driver.js';
|
|
@@ -36,6 +37,9 @@ export declare class RuntimeDriver implements Driver {
|
|
|
36
37
|
* Rolls back a transaction.
|
|
37
38
|
*/
|
|
38
39
|
rollbackTransaction(connection: DatabaseConnection): Promise<void>;
|
|
40
|
+
savepoint(connection: DatabaseConnection, savepointName: string, compileQuery: QueryCompiler['compileQuery']): Promise<void>;
|
|
41
|
+
rollbackToSavepoint(connection: DatabaseConnection, savepointName: string, compileQuery: QueryCompiler['compileQuery']): Promise<void>;
|
|
42
|
+
releaseSavepoint(connection: DatabaseConnection, savepointName: string, compileQuery: QueryCompiler['compileQuery']): Promise<void>;
|
|
39
43
|
/**
|
|
40
44
|
* Destroys the driver and releases all resources.
|
|
41
45
|
*/
|
|
@@ -62,6 +62,24 @@ export class RuntimeDriver {
|
|
|
62
62
|
rollbackTransaction(connection) {
|
|
63
63
|
return this.#driver.rollbackTransaction(connection);
|
|
64
64
|
}
|
|
65
|
+
savepoint(connection, savepointName, compileQuery) {
|
|
66
|
+
if (this.#driver.savepoint) {
|
|
67
|
+
return this.#driver.savepoint(connection, savepointName, compileQuery);
|
|
68
|
+
}
|
|
69
|
+
throw new Error('The `savepoint` method is not supported by this driver');
|
|
70
|
+
}
|
|
71
|
+
rollbackToSavepoint(connection, savepointName, compileQuery) {
|
|
72
|
+
if (this.#driver.rollbackToSavepoint) {
|
|
73
|
+
return this.#driver.rollbackToSavepoint(connection, savepointName, compileQuery);
|
|
74
|
+
}
|
|
75
|
+
throw new Error('The `rollbackToSavepoint` method is not supported by this driver');
|
|
76
|
+
}
|
|
77
|
+
releaseSavepoint(connection, savepointName, compileQuery) {
|
|
78
|
+
if (this.#driver.releaseSavepoint) {
|
|
79
|
+
return this.#driver.releaseSavepoint(connection, savepointName, compileQuery);
|
|
80
|
+
}
|
|
81
|
+
throw new Error('The `releaseSavepoint` method is not supported by this driver');
|
|
82
|
+
}
|
|
65
83
|
async destroy() {
|
|
66
84
|
if (!this.#initPromise) {
|
|
67
85
|
return;
|
|
@@ -83,6 +101,8 @@ export class RuntimeDriver {
|
|
|
83
101
|
// the best option in this case.
|
|
84
102
|
#addLogging(connection) {
|
|
85
103
|
const executeQuery = connection.executeQuery;
|
|
104
|
+
const streamQuery = connection.streamQuery;
|
|
105
|
+
const dis = this;
|
|
86
106
|
connection.executeQuery = async (compiledQuery) => {
|
|
87
107
|
let caughtError;
|
|
88
108
|
const startTime = performanceNow();
|
|
@@ -91,12 +111,31 @@ export class RuntimeDriver {
|
|
|
91
111
|
}
|
|
92
112
|
catch (error) {
|
|
93
113
|
caughtError = error;
|
|
94
|
-
await
|
|
114
|
+
await dis.#logError(error, compiledQuery, startTime);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
if (!caughtError) {
|
|
119
|
+
await dis.#logQuery(compiledQuery, startTime);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
connection.streamQuery = async function* (compiledQuery, chunkSize) {
|
|
124
|
+
let caughtError;
|
|
125
|
+
const startTime = performanceNow();
|
|
126
|
+
try {
|
|
127
|
+
for await (const result of streamQuery.call(connection, compiledQuery, chunkSize)) {
|
|
128
|
+
yield result;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
caughtError = error;
|
|
133
|
+
await dis.#logError(error, compiledQuery, startTime);
|
|
95
134
|
throw error;
|
|
96
135
|
}
|
|
97
136
|
finally {
|
|
98
137
|
if (!caughtError) {
|
|
99
|
-
await
|
|
138
|
+
await dis.#logQuery(compiledQuery, startTime, true);
|
|
100
139
|
}
|
|
101
140
|
}
|
|
102
141
|
};
|
|
@@ -109,9 +148,10 @@ export class RuntimeDriver {
|
|
|
109
148
|
queryDurationMillis: this.#calculateDurationMillis(startTime),
|
|
110
149
|
}));
|
|
111
150
|
}
|
|
112
|
-
async #logQuery(compiledQuery, startTime) {
|
|
151
|
+
async #logQuery(compiledQuery, startTime, isStream = false) {
|
|
113
152
|
await this.#log.query(() => ({
|
|
114
153
|
level: 'query',
|
|
154
|
+
isStream,
|
|
115
155
|
query: compiledQuery,
|
|
116
156
|
queryDurationMillis: this.#calculateDurationMillis(startTime),
|
|
117
157
|
}));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
2
|
-
import {
|
|
2
|
+
import { TableExpressionOrList } from '../parser/table-parser.js';
|
|
3
3
|
import { FunctionModule } from '../query-builder/function-module.js';
|
|
4
4
|
import { ExtractTypeFromReferenceExpression, ReferenceExpression, SimpleReferenceExpression, StringReference } from '../parser/reference-parser.js';
|
|
5
5
|
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
@@ -16,6 +16,7 @@ import { RefTuple2, RefTuple3, RefTuple4, RefTuple5, ValTuple2, ValTuple3, ValTu
|
|
|
16
16
|
import { Selectable } from '../util/column-type.js';
|
|
17
17
|
import { KyselyTypeError } from '../util/type-error.js';
|
|
18
18
|
import { DataTypeExpression } from '../parser/data-type-parser.js';
|
|
19
|
+
import { SelectFrom } from '../parser/select-from-parser.js';
|
|
19
20
|
export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
20
21
|
/**
|
|
21
22
|
* Creates a binary expression.
|
|
@@ -116,9 +117,9 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
116
117
|
* ```ts
|
|
117
118
|
* const result = await db.selectFrom('person')
|
|
118
119
|
* .where(({ eb, exists, selectFrom }) =>
|
|
119
|
-
* eb('first_name', '=', 'Jennifer').and(
|
|
120
|
-
*
|
|
121
|
-
* )
|
|
120
|
+
* eb('first_name', '=', 'Jennifer').and(exists(
|
|
121
|
+
* selectFrom('pet').whereRef('owner_id', '=', 'person.id').select('pet.id')
|
|
122
|
+
* ))
|
|
122
123
|
* )
|
|
123
124
|
* .selectAll()
|
|
124
125
|
* .execute()
|
|
@@ -209,11 +210,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
209
210
|
* that case Kysely typings wouldn't allow you to reference `pet.owner_id`
|
|
210
211
|
* because `pet` is not joined to that query.
|
|
211
212
|
*/
|
|
212
|
-
selectFrom<TE extends
|
|
213
|
-
selectFrom<TE extends TableExpression<DB, TB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
214
|
-
selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
|
|
215
|
-
selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB & PickTableWithAlias<DB, TE>, TE>, {}>;
|
|
216
|
-
selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
213
|
+
selectFrom<TE extends TableExpressionOrList<DB, TB>>(from: TE): SelectFrom<DB, TB, TE>;
|
|
217
214
|
/**
|
|
218
215
|
* Creates a `case` statement/operator.
|
|
219
216
|
*
|
|
@@ -444,6 +441,8 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
444
441
|
* inner join "pet" on "pet"."owner_id" = "person"."id"
|
|
445
442
|
* group by "person"."id"
|
|
446
443
|
* ```
|
|
444
|
+
*
|
|
445
|
+
* If you need a column reference, use {@link ref}.
|
|
447
446
|
*/
|
|
448
447
|
table<T extends TB & string>(table: T): ExpressionWrapper<DB, TB, Selectable<DB[T]>>;
|
|
449
448
|
/**
|
|
@@ -918,4 +917,4 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
918
917
|
}
|
|
919
918
|
export declare function createExpressionBuilder<DB, TB extends keyof DB>(executor?: QueryExecutor): ExpressionBuilder<DB, TB>;
|
|
920
919
|
export declare function expressionBuilder<DB, TB extends keyof DB>(_: SelectQueryBuilder<DB, TB, any>): ExpressionBuilder<DB, TB>;
|
|
921
|
-
export declare function expressionBuilder<DB, TB extends keyof DB>(): ExpressionBuilder<DB, TB>;
|
|
920
|
+
export declare function expressionBuilder<DB, TB extends keyof DB = never>(): ExpressionBuilder<DB, TB>;
|
|
@@ -149,3 +149,51 @@ export declare function jsonObjectFrom<O>(expr: Expression<O>): RawBuilder<Simpl
|
|
|
149
149
|
export declare function jsonBuildObject<O extends Record<string, Expression<unknown>>>(obj: O): RawBuilder<Simplify<{
|
|
150
150
|
[K in keyof O]: O[K] extends Expression<infer V> ? V : never;
|
|
151
151
|
}>>;
|
|
152
|
+
export type MergeAction = 'INSERT' | 'UPDATE' | 'DELETE';
|
|
153
|
+
/**
|
|
154
|
+
* The PostgreSQL `merge_action` function.
|
|
155
|
+
*
|
|
156
|
+
* This function can be used in a `returning` clause to get the action that was
|
|
157
|
+
* performed in a `mergeInto` query. The function returns one of the following
|
|
158
|
+
* strings: `'INSERT'`, `'UPDATE'`, or `'DELETE'`.
|
|
159
|
+
*
|
|
160
|
+
* ### Examples
|
|
161
|
+
*
|
|
162
|
+
* ```ts
|
|
163
|
+
* import { mergeAction } from 'kysely/helpers/postgres'
|
|
164
|
+
*
|
|
165
|
+
* const result = await db
|
|
166
|
+
* .mergeInto('person as p')
|
|
167
|
+
* .using('person_backup as pb', 'p.id', 'pb.id')
|
|
168
|
+
* .whenMatched()
|
|
169
|
+
* .thenUpdateSet(({ ref }) => ({
|
|
170
|
+
* first_name: ref('pb.first_name'),
|
|
171
|
+
* updated_at: ref('pb.updated_at').$castTo<string | null>(),
|
|
172
|
+
* }))
|
|
173
|
+
* .whenNotMatched()
|
|
174
|
+
* .thenInsertValues(({ ref}) => ({
|
|
175
|
+
* id: ref('pb.id'),
|
|
176
|
+
* first_name: ref('pb.first_name'),
|
|
177
|
+
* created_at: ref('pb.updated_at'),
|
|
178
|
+
* updated_at: ref('pb.updated_at').$castTo<string | null>(),
|
|
179
|
+
* }))
|
|
180
|
+
* .returning([mergeAction().as('action'), 'p.id', 'p.updated_at'])
|
|
181
|
+
* .execute()
|
|
182
|
+
*
|
|
183
|
+
* result[0].action
|
|
184
|
+
* ```
|
|
185
|
+
*
|
|
186
|
+
* The generated SQL (PostgreSQL):
|
|
187
|
+
*
|
|
188
|
+
* ```sql
|
|
189
|
+
* merge into "person" as "p"
|
|
190
|
+
* using "person_backup" as "pb" on "p"."id" = "pb"."id"
|
|
191
|
+
* when matched then update set
|
|
192
|
+
* "first_name" = "pb"."first_name",
|
|
193
|
+
* "updated_at" = "pb"."updated_at"::text
|
|
194
|
+
* when not matched then insert values ("id", "first_name", "created_at", "updated_at")
|
|
195
|
+
* values ("pb"."id", "pb"."first_name", "pb"."updated_at", "pb"."updated_at")
|
|
196
|
+
* returning merge_action() as "action", "p"."id", "p"."updated_at"
|
|
197
|
+
* ```
|
|
198
|
+
*/
|
|
199
|
+
export declare function mergeAction(): RawBuilder<MergeAction>;
|