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.
Files changed (285) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +7 -7
  3. package/dist/cjs/dialect/database-introspector.d.ts +1 -0
  4. package/dist/cjs/dialect/dialect-adapter-base.d.ts +2 -1
  5. package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
  6. package/dist/cjs/dialect/dialect-adapter.d.ts +5 -0
  7. package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +1 -5
  8. package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
  9. package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +46 -26
  10. package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
  11. package/dist/cjs/dialect/mssql/mssql-driver.js +95 -36
  12. package/dist/cjs/dialect/mssql/mssql-introspector.js +13 -2
  13. package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  14. package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
  15. package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
  16. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  17. package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
  18. package/dist/cjs/dialect/postgres/postgres-introspector.js +3 -1
  19. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
  20. package/dist/cjs/driver/database-connection.d.ts +4 -2
  21. package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
  22. package/dist/cjs/dynamic/dynamic.d.ts +1 -1
  23. package/dist/cjs/dynamic/dynamic.js +1 -1
  24. package/dist/cjs/expression/expression-builder.d.ts +31 -5
  25. package/dist/cjs/expression/expression-builder.js +7 -3
  26. package/dist/cjs/expression/expression.js +2 -3
  27. package/dist/cjs/helpers/mssql.js +3 -4
  28. package/dist/cjs/helpers/mysql.d.ts +3 -3
  29. package/dist/cjs/helpers/mysql.js +6 -7
  30. package/dist/cjs/helpers/postgres.d.ts +4 -4
  31. package/dist/cjs/helpers/postgres.js +7 -8
  32. package/dist/cjs/helpers/sqlite.js +3 -4
  33. package/dist/cjs/index.d.ts +31 -18
  34. package/dist/cjs/index.js +30 -17
  35. package/dist/cjs/kysely.d.ts +1 -1
  36. package/dist/cjs/kysely.js +3 -3
  37. package/dist/cjs/operation-node/add-index-node.js +1 -1
  38. package/dist/cjs/operation-node/alter-column-node.d.ts +1 -1
  39. package/dist/cjs/operation-node/case-node.d.ts +1 -1
  40. package/dist/cjs/operation-node/cast-node.d.ts +13 -0
  41. package/dist/cjs/operation-node/cast-node.js +19 -0
  42. package/dist/cjs/operation-node/column-definition-node.d.ts +2 -0
  43. package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
  44. package/dist/cjs/operation-node/data-type-node.js +56 -0
  45. package/dist/cjs/operation-node/delete-query-node.d.ts +6 -0
  46. package/dist/cjs/operation-node/delete-query-node.js +12 -0
  47. package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
  48. package/dist/cjs/operation-node/fetch-node.js +19 -0
  49. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -4
  50. package/dist/cjs/operation-node/having-node.d.ts +1 -1
  51. package/dist/cjs/operation-node/insert-query-node.d.ts +6 -1
  52. package/dist/cjs/operation-node/insert-query-node.js +5 -0
  53. package/dist/cjs/operation-node/join-node.d.ts +1 -1
  54. package/dist/cjs/operation-node/matched-node.d.ts +13 -0
  55. package/dist/cjs/operation-node/matched-node.js +19 -0
  56. package/dist/cjs/operation-node/merge-query-node.d.ts +27 -0
  57. package/dist/cjs/operation-node/merge-query-node.js +45 -0
  58. package/dist/cjs/operation-node/on-node.d.ts +1 -1
  59. package/dist/cjs/operation-node/operation-node-source.js +1 -2
  60. package/dist/cjs/operation-node/operation-node-transformer.d.ts +12 -0
  61. package/dist/cjs/operation-node/operation-node-transformer.js +62 -0
  62. package/dist/cjs/operation-node/operation-node-visitor.d.ts +12 -0
  63. package/dist/cjs/operation-node/operation-node-visitor.js +6 -0
  64. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  65. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  66. package/dist/cjs/operation-node/operator-node.js +8 -6
  67. package/dist/cjs/operation-node/output-node.d.ts +13 -0
  68. package/dist/cjs/operation-node/output-node.js +26 -0
  69. package/dist/cjs/operation-node/query-node.d.ts +17 -5
  70. package/dist/cjs/operation-node/query-node.js +24 -1
  71. package/dist/cjs/operation-node/select-query-node.d.ts +6 -0
  72. package/dist/cjs/operation-node/select-query-node.js +12 -0
  73. package/dist/cjs/operation-node/top-node.d.ts +14 -0
  74. package/dist/cjs/operation-node/top-node.js +19 -0
  75. package/dist/cjs/operation-node/update-query-node.d.ts +9 -1
  76. package/dist/cjs/operation-node/update-query-node.js +11 -0
  77. package/dist/cjs/operation-node/where-node.d.ts +1 -1
  78. package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
  79. package/dist/cjs/parser/binary-operation-parser.js +7 -8
  80. package/dist/cjs/parser/data-type-parser.js +8 -5
  81. package/dist/cjs/parser/default-value-parser.js +1 -2
  82. package/dist/cjs/parser/expression-parser.js +3 -4
  83. package/dist/cjs/parser/fetch-parser.d.ts +2 -0
  84. package/dist/cjs/parser/fetch-parser.js +17 -0
  85. package/dist/cjs/parser/group-by-parser.js +1 -2
  86. package/dist/cjs/parser/identifier-parser.js +1 -2
  87. package/dist/cjs/parser/insert-values-parser.d.ts +3 -3
  88. package/dist/cjs/parser/insert-values-parser.js +1 -2
  89. package/dist/cjs/parser/join-parser.js +1 -2
  90. package/dist/cjs/parser/merge-parser.d.ts +9 -0
  91. package/dist/cjs/parser/merge-parser.js +31 -0
  92. package/dist/cjs/parser/on-commit-action-parse.js +1 -2
  93. package/dist/cjs/parser/on-modify-action-parser.js +1 -2
  94. package/dist/cjs/parser/order-by-parser.js +3 -4
  95. package/dist/cjs/parser/parse-utils.js +4 -5
  96. package/dist/cjs/parser/partition-by-parser.js +1 -2
  97. package/dist/cjs/parser/reference-parser.js +8 -9
  98. package/dist/cjs/parser/returning-parser.d.ts +4 -3
  99. package/dist/cjs/parser/select-parser.js +2 -3
  100. package/dist/cjs/parser/set-operation-parser.js +1 -2
  101. package/dist/cjs/parser/table-parser.d.ts +4 -3
  102. package/dist/cjs/parser/table-parser.js +4 -5
  103. package/dist/cjs/parser/top-parser.d.ts +2 -0
  104. package/dist/cjs/parser/top-parser.js +19 -0
  105. package/dist/cjs/parser/unary-operation-parser.js +3 -4
  106. package/dist/cjs/parser/update-set-parser.js +2 -3
  107. package/dist/cjs/parser/value-parser.js +4 -5
  108. package/dist/cjs/parser/with-parser.js +1 -2
  109. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +2 -2
  110. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +2 -2
  111. package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
  112. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
  113. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
  114. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
  115. package/dist/cjs/query-builder/delete-query-builder.d.ts +188 -5
  116. package/dist/cjs/query-builder/delete-query-builder.js +139 -5
  117. package/dist/cjs/query-builder/function-module.d.ts +5 -5
  118. package/dist/cjs/query-builder/function-module.js +1 -2
  119. package/dist/cjs/query-builder/insert-query-builder.d.ts +166 -10
  120. package/dist/cjs/query-builder/insert-query-builder.js +107 -10
  121. package/dist/cjs/query-builder/merge-query-builder.d.ts +721 -0
  122. package/dist/cjs/query-builder/merge-query-builder.js +547 -0
  123. package/dist/cjs/query-builder/merge-result.d.ts +4 -0
  124. package/dist/cjs/query-builder/merge-result.js +10 -0
  125. package/dist/cjs/query-builder/no-result-error.js +2 -2
  126. package/dist/cjs/query-builder/on-conflict-builder.d.ts +2 -2
  127. package/dist/cjs/query-builder/output-interface.d.ts +95 -0
  128. package/dist/cjs/query-builder/output-interface.js +2 -0
  129. package/dist/cjs/query-builder/returning-interface.d.ts +2 -0
  130. package/dist/cjs/query-builder/select-query-builder.d.ts +177 -17
  131. package/dist/cjs/query-builder/select-query-builder.js +21 -2
  132. package/dist/cjs/query-builder/update-query-builder.d.ts +175 -10
  133. package/dist/cjs/query-builder/update-query-builder.js +119 -7
  134. package/dist/cjs/query-builder/update-result.d.ts +9 -0
  135. package/dist/cjs/query-builder/update-result.js +9 -0
  136. package/dist/cjs/query-builder/where-interface.d.ts +1 -1
  137. package/dist/cjs/query-compiler/default-query-compiler.d.ts +12 -0
  138. package/dist/cjs/query-compiler/default-query-compiler.js +118 -10
  139. package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
  140. package/dist/cjs/query-creator.d.ts +96 -5
  141. package/dist/cjs/query-creator.js +63 -1
  142. package/dist/cjs/raw-builder/raw-builder.js +1 -2
  143. package/dist/cjs/raw-builder/sql.d.ts +5 -5
  144. package/dist/cjs/schema/alter-column-builder.js +3 -0
  145. package/dist/cjs/schema/alter-table-add-index-builder.d.ts +1 -1
  146. package/dist/cjs/schema/alter-table-add-index-builder.js +7 -3
  147. package/dist/cjs/schema/alter-table-builder.js +1 -2
  148. package/dist/cjs/schema/column-definition-builder.d.ts +18 -1
  149. package/dist/cjs/schema/column-definition-builder.js +22 -1
  150. package/dist/cjs/util/assert.js +2 -3
  151. package/dist/cjs/util/compilable.js +1 -2
  152. package/dist/cjs/util/infer-result.d.ts +2 -1
  153. package/dist/cjs/util/json-object-args.js +1 -2
  154. package/dist/cjs/util/log-once.js +1 -2
  155. package/dist/cjs/util/object-utils.js +38 -26
  156. package/dist/cjs/util/performance-now.js +1 -2
  157. package/dist/cjs/util/prevent-await.js +1 -2
  158. package/dist/cjs/util/query-id.js +1 -2
  159. package/dist/cjs/util/random-string.js +1 -2
  160. package/dist/cjs/util/require-all-props.js +1 -2
  161. package/dist/cjs/util/stack-trace-utils.js +1 -2
  162. package/dist/cjs/util/type-utils.d.ts +3 -2
  163. package/dist/esm/dialect/database-introspector.d.ts +1 -0
  164. package/dist/esm/dialect/dialect-adapter-base.d.ts +2 -1
  165. package/dist/esm/dialect/dialect-adapter-base.js +4 -1
  166. package/dist/esm/dialect/dialect-adapter.d.ts +5 -0
  167. package/dist/esm/dialect/mssql/mssql-adapter.d.ts +1 -5
  168. package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
  169. package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +46 -26
  170. package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
  171. package/dist/esm/dialect/mssql/mssql-driver.js +95 -36
  172. package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
  173. package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  174. package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
  175. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
  176. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  177. package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
  178. package/dist/esm/dialect/postgres/postgres-introspector.js +3 -1
  179. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
  180. package/dist/esm/driver/database-connection.d.ts +4 -2
  181. package/dist/esm/dynamic/dynamic.d.ts +1 -1
  182. package/dist/esm/dynamic/dynamic.js +1 -1
  183. package/dist/esm/expression/expression-builder.d.ts +31 -5
  184. package/dist/esm/expression/expression-builder.js +5 -0
  185. package/dist/esm/helpers/mysql.d.ts +3 -3
  186. package/dist/esm/helpers/mysql.js +3 -3
  187. package/dist/esm/helpers/postgres.d.ts +4 -4
  188. package/dist/esm/helpers/postgres.js +4 -4
  189. package/dist/esm/index.d.ts +31 -18
  190. package/dist/esm/index.js +30 -17
  191. package/dist/esm/kysely.d.ts +1 -1
  192. package/dist/esm/kysely.js +1 -1
  193. package/dist/esm/operation-node/add-index-node.js +1 -1
  194. package/dist/esm/operation-node/alter-column-node.d.ts +1 -1
  195. package/dist/esm/operation-node/case-node.d.ts +1 -1
  196. package/dist/esm/operation-node/cast-node.d.ts +13 -0
  197. package/dist/esm/operation-node/cast-node.js +17 -0
  198. package/dist/esm/operation-node/column-definition-node.d.ts +2 -0
  199. package/dist/esm/operation-node/data-type-node.d.ts +5 -1
  200. package/dist/esm/operation-node/data-type-node.js +55 -0
  201. package/dist/esm/operation-node/delete-query-node.d.ts +6 -0
  202. package/dist/esm/operation-node/delete-query-node.js +12 -0
  203. package/dist/esm/operation-node/fetch-node.d.ts +15 -0
  204. package/dist/esm/operation-node/fetch-node.js +17 -0
  205. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -4
  206. package/dist/esm/operation-node/having-node.d.ts +1 -1
  207. package/dist/esm/operation-node/insert-query-node.d.ts +6 -1
  208. package/dist/esm/operation-node/insert-query-node.js +5 -0
  209. package/dist/esm/operation-node/join-node.d.ts +1 -1
  210. package/dist/esm/operation-node/matched-node.d.ts +13 -0
  211. package/dist/esm/operation-node/matched-node.js +17 -0
  212. package/dist/esm/operation-node/merge-query-node.d.ts +27 -0
  213. package/dist/esm/operation-node/merge-query-node.js +43 -0
  214. package/dist/esm/operation-node/on-node.d.ts +1 -1
  215. package/dist/esm/operation-node/operation-node-transformer.d.ts +12 -0
  216. package/dist/esm/operation-node/operation-node-transformer.js +62 -0
  217. package/dist/esm/operation-node/operation-node-visitor.d.ts +12 -0
  218. package/dist/esm/operation-node/operation-node-visitor.js +6 -0
  219. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  220. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  221. package/dist/esm/operation-node/operator-node.js +2 -0
  222. package/dist/esm/operation-node/output-node.d.ts +13 -0
  223. package/dist/esm/operation-node/output-node.js +24 -0
  224. package/dist/esm/operation-node/query-node.d.ts +17 -5
  225. package/dist/esm/operation-node/query-node.js +24 -1
  226. package/dist/esm/operation-node/select-query-node.d.ts +6 -0
  227. package/dist/esm/operation-node/select-query-node.js +12 -0
  228. package/dist/esm/operation-node/top-node.d.ts +14 -0
  229. package/dist/esm/operation-node/top-node.js +17 -0
  230. package/dist/esm/operation-node/update-query-node.d.ts +9 -1
  231. package/dist/esm/operation-node/update-query-node.js +11 -0
  232. package/dist/esm/operation-node/where-node.d.ts +1 -1
  233. package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
  234. package/dist/esm/parser/binary-operation-parser.js +2 -2
  235. package/dist/esm/parser/data-type-parser.js +8 -4
  236. package/dist/esm/parser/fetch-parser.d.ts +2 -0
  237. package/dist/esm/parser/fetch-parser.js +15 -0
  238. package/dist/esm/parser/insert-values-parser.d.ts +3 -3
  239. package/dist/esm/parser/merge-parser.d.ts +9 -0
  240. package/dist/esm/parser/merge-parser.js +28 -0
  241. package/dist/esm/parser/returning-parser.d.ts +4 -3
  242. package/dist/esm/parser/table-parser.d.ts +4 -3
  243. package/dist/esm/parser/top-parser.d.ts +2 -0
  244. package/dist/esm/parser/top-parser.js +17 -0
  245. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +2 -2
  246. package/dist/esm/plugin/camel-case/camel-case-plugin.js +2 -2
  247. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
  248. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
  249. package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
  250. package/dist/esm/query-builder/delete-query-builder.d.ts +188 -5
  251. package/dist/esm/query-builder/delete-query-builder.js +139 -5
  252. package/dist/esm/query-builder/function-module.d.ts +5 -5
  253. package/dist/esm/query-builder/insert-query-builder.d.ts +166 -10
  254. package/dist/esm/query-builder/insert-query-builder.js +107 -10
  255. package/dist/esm/query-builder/merge-query-builder.d.ts +721 -0
  256. package/dist/esm/query-builder/merge-query-builder.js +541 -0
  257. package/dist/esm/query-builder/merge-result.d.ts +4 -0
  258. package/dist/esm/query-builder/merge-result.js +7 -0
  259. package/dist/esm/query-builder/on-conflict-builder.d.ts +2 -2
  260. package/dist/esm/query-builder/output-interface.d.ts +95 -0
  261. package/dist/esm/query-builder/output-interface.js +2 -0
  262. package/dist/esm/query-builder/returning-interface.d.ts +2 -0
  263. package/dist/esm/query-builder/select-query-builder.d.ts +177 -17
  264. package/dist/esm/query-builder/select-query-builder.js +20 -0
  265. package/dist/esm/query-builder/update-query-builder.d.ts +175 -10
  266. package/dist/esm/query-builder/update-query-builder.js +119 -7
  267. package/dist/esm/query-builder/update-result.d.ts +9 -0
  268. package/dist/esm/query-builder/update-result.js +9 -0
  269. package/dist/esm/query-builder/where-interface.d.ts +1 -1
  270. package/dist/esm/query-compiler/default-query-compiler.d.ts +12 -0
  271. package/dist/esm/query-compiler/default-query-compiler.js +118 -10
  272. package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
  273. package/dist/esm/query-creator.d.ts +96 -5
  274. package/dist/esm/query-creator.js +64 -2
  275. package/dist/esm/raw-builder/sql.d.ts +5 -5
  276. package/dist/esm/schema/alter-column-builder.js +3 -0
  277. package/dist/esm/schema/alter-table-add-index-builder.d.ts +1 -1
  278. package/dist/esm/schema/alter-table-add-index-builder.js +8 -4
  279. package/dist/esm/schema/alter-table-builder.js +1 -2
  280. package/dist/esm/schema/column-definition-builder.d.ts +18 -1
  281. package/dist/esm/schema/column-definition-builder.js +22 -1
  282. package/dist/esm/util/infer-result.d.ts +2 -1
  283. package/dist/esm/util/object-utils.js +18 -5
  284. package/dist/esm/util/type-utils.d.ts +3 -2
  285. 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 javascript environments (node.js, deno & modern browsers),
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
  [![License](https://img.shields.io/github/license/kysely-org/kysely?style=flat)](https://github.com/kysely-org/kysely/blob/master/LICENSE)
6
6
  [![Issues](https://img.shields.io/github/issues-closed/kysely-org/kysely?logo=github)](https://github.com/kysely-org/kysely/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)
7
7
  [![Pull Requests](https://img.shields.io/github/issues-pr-closed/kysely-org/kysely?label=PRs&logo=github&style=flat)](https://github.com/kysely-org/kysely/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc)
8
- [![Vulnerabilities](https://img.shields.io/snyk/vulnerabilities/github/kysely-org/kysely?style=flat&logo=snyk)](https://snyk.io/advisor/npm-package/kysely)
9
8
  [![Downloads](https://img.shields.io/npm/dw/kysely?logo=npm)](https://www.npmjs.com/package/kysely)
10
9
  [![Bundle Size](https://img.shields.io/bundlephobia/minzip/kysely?label=size&logo=npm)](https://bundlephobia.com/package/kysely)
11
10
  [![Social](https://img.shields.io/twitter/follow/kysely_?style=social)](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 typescript SQL query builder.
16
- Inspired by [knex](http://knexjs.org/). Mainly developed for [node.js](https://nodejs.org/en/) but also
17
- runs on all other javascript environments like [deno](https://deno.land/).
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
  ![](https://github.com/kysely-org/kysely/blob/master/assets/demo.gif)
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 typescript, Kysely is even able to parse
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
- [discord server](https://discord.gg/xyBJ3GwvAm).
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
@@ -58,4 +58,5 @@ export interface ColumnMetadata {
58
58
  readonly isAutoIncrementing: boolean;
59
59
  readonly isNullable: boolean;
60
60
  readonly hasDefaultValue: boolean;
61
+ readonly comment?: string;
61
62
  }
@@ -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
- * 3rd party dialects can extend this instead of implementing the `DialectAdapter`
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
- * 3rd party dialects can extend this instead of implementing the `DialectAdapter`
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 supportsReturning() {
15
- // mssql should support returning with the `output` clause.
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: typeof TediousRequest;
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, transactionId?: string | undefined, isolationLevel?: number | undefined): void;
67
- cancel(): void;
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: (error?: Error) => void): void;
60
+ commitTransaction(callback: (error?: Error | null) => void, name?: string): void;
61
+ connect(callback?: (error?: Error) => void): void;
71
62
  execSql(request: TediousRequest): void;
72
- reset(callback: (error?: Error) => void): void;
73
- rollbackTransaction(callback: (error?: Error) => void): void;
74
- once(event: 'end', listener: () => void): void;
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
- constructor(sql: string, callback: (error: Error, rowCount: number, rows: any[]) => void);
78
- addParameter(name: string, type: TediousType, value: any, options?: {
79
- length?: number | 'max' | undefined;
80
- precision?: number | undefined;
81
- scale?: number | undefined;
82
- }): void;
83
- off(event: 'row', listener: (...args: any[]) => void): void;
84
- on(event: 'row', listener: (columns: TediousColumnValue[]) => void): void;
85
- once(event: 'requestCompleted', listener: (...args: any[]) => void): void;
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 Promise((resolve, reject) => connection.connect((error) => {
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(this.#tedious, compiledQuery, deferred);
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(this.#tedious, compiledQuery);
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(chunkSize);
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.#connection.cancel();
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(this.#tedious, compiled_query_js_1.CompiledQuery.raw('select 1'), deferred);
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(tedious, compiledQuery, onDone) {
185
- this.#completed = false;
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
- const { parameters, sql } = compiledQuery;
189
- this.#request = new this.#tedious.Request(sql, (err, rowCount) => {
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 = err instanceof AggregateError ? err.errors : err;
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(onDone);
251
+ this.#addParametersToRequest(compiledQuery.parameters);
252
+ this.#attachListeners();
200
253
  }
201
254
  get request() {
202
255
  return this.#request;
203
256
  }
204
- readChunk(chunkSize) {
257
+ readChunk() {
258
+ const subscriptionKey = this.readChunk.name;
205
259
  return new Promise((resolve, reject) => {
206
- const interval = setInterval(() => {
207
- if (this.#error) {
208
- clearInterval(interval);
209
- reject(this.#error);
260
+ this.#subscribers[subscriptionKey] = (event, error) => {
261
+ delete this.#subscribers[subscriptionKey];
262
+ if (event === 'error') {
263
+ reject(error);
210
264
  }
211
- else if (this.#completed || this.#rows.length >= chunkSize) {
212
- clearInterval(interval);
213
- resolve(this.#rows.splice(0, chunkSize));
265
+ else {
266
+ resolve(this.#rows.splice(0, this.#streamChunkSize));
214
267
  }
215
- }, 0);
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(onDone) {
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.#completed = true;
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.system_type_id', 'columns.system_type_id')
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.system_type_id', 'columns.system_type_id')
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
  }, []);
@@ -63,6 +63,7 @@ class SqliteIntrospector {
63
63
  isNullable: !col.notnull,
64
64
  isAutoIncrementing: col.name === autoIncrementCol,
65
65
  hasDefaultValue: col.dflt_value != null,
66
+ comment: undefined,
66
67
  })),
67
68
  };
68
69
  }
@@ -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 delete queries and contains
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
- * This is optional and only provided by some drivers like node-mysql2.
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
  /**