kysely 0.22.0 → 0.23.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.
Files changed (326) hide show
  1. package/CONTRIBUTING.md +70 -0
  2. package/README.md +25 -2
  3. package/dist/cjs/dialect/database-introspector.d.ts +4 -0
  4. package/dist/cjs/dialect/mysql/mysql-driver.js +6 -3
  5. package/dist/cjs/dialect/postgres/postgres-adapter.js +1 -1
  6. package/dist/cjs/dialect/postgres/postgres-driver.js +7 -2
  7. package/dist/cjs/dialect/postgres/postgres-introspector.js +8 -0
  8. package/dist/cjs/dialect/sqlite/sqlite-driver.js +4 -3
  9. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
  10. package/dist/cjs/driver/database-connection.d.ts +6 -2
  11. package/dist/cjs/dynamic/dynamic-reference-builder.d.ts +2 -3
  12. package/dist/cjs/dynamic/dynamic-reference-builder.js +1 -1
  13. package/dist/cjs/expression/expression.d.ts +100 -0
  14. package/dist/cjs/expression/expression.js +16 -0
  15. package/dist/cjs/index.d.ts +10 -6
  16. package/dist/cjs/index.js +8 -2
  17. package/dist/cjs/migration/file-migration-provider.js +5 -3
  18. package/dist/cjs/operation-node/aggregate-function-node.d.ts +7 -4
  19. package/dist/cjs/operation-node/aggregate-function-node.js +17 -0
  20. package/dist/cjs/operation-node/alias-node.d.ts +3 -11
  21. package/dist/cjs/operation-node/alter-column-node.d.ts +1 -2
  22. package/dist/cjs/operation-node/alter-table-node.d.ts +5 -7
  23. package/dist/cjs/operation-node/alter-table-node.js +9 -1
  24. package/dist/cjs/operation-node/and-node.d.ts +3 -4
  25. package/dist/cjs/operation-node/binary-operation-node.d.ts +14 -0
  26. package/dist/cjs/operation-node/binary-operation-node.js +20 -0
  27. package/dist/cjs/operation-node/check-constraint-node.d.ts +2 -3
  28. package/dist/cjs/operation-node/column-definition-node.d.ts +6 -5
  29. package/dist/cjs/operation-node/column-definition-node.js +16 -0
  30. package/dist/cjs/operation-node/column-update-node.d.ts +2 -3
  31. package/dist/cjs/operation-node/common-table-expression-node.d.ts +2 -4
  32. package/dist/cjs/operation-node/create-index-node.d.ts +1 -3
  33. package/dist/cjs/operation-node/create-table-node.d.ts +4 -5
  34. package/dist/cjs/operation-node/create-type-node.d.ts +1 -1
  35. package/dist/cjs/operation-node/create-type-node.js +1 -2
  36. package/dist/cjs/operation-node/default-value-node.d.ts +2 -4
  37. package/dist/cjs/operation-node/delete-query-node.d.ts +1 -2
  38. package/dist/cjs/operation-node/drop-type-node.d.ts +1 -1
  39. package/dist/cjs/operation-node/drop-type-node.js +1 -2
  40. package/dist/cjs/operation-node/explain-node.d.ts +2 -4
  41. package/dist/cjs/operation-node/explain-node.js +1 -1
  42. package/dist/cjs/operation-node/from-node.d.ts +3 -4
  43. package/dist/cjs/operation-node/generated-node.d.ts +2 -3
  44. package/dist/cjs/operation-node/group-by-item-node.d.ts +2 -3
  45. package/dist/cjs/operation-node/having-node.d.ts +3 -4
  46. package/dist/cjs/operation-node/having-node.js +4 -4
  47. package/dist/cjs/operation-node/insert-query-node.d.ts +1 -5
  48. package/dist/cjs/operation-node/join-node.d.ts +5 -9
  49. package/dist/cjs/operation-node/join-node.js +6 -6
  50. package/dist/cjs/operation-node/on-conflict-node.d.ts +5 -7
  51. package/dist/cjs/operation-node/on-conflict-node.js +12 -12
  52. package/dist/cjs/operation-node/on-node.d.ts +3 -4
  53. package/dist/cjs/operation-node/on-node.js +4 -4
  54. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -2
  55. package/dist/cjs/operation-node/operation-node-transformer.js +22 -15
  56. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -2
  57. package/dist/cjs/operation-node/operation-node-visitor.js +2 -1
  58. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  59. package/dist/cjs/operation-node/operator-node.d.ts +5 -3
  60. package/dist/cjs/operation-node/operator-node.js +3 -5
  61. package/dist/cjs/operation-node/or-node.d.ts +3 -4
  62. package/dist/cjs/operation-node/order-by-item-node.d.ts +3 -5
  63. package/dist/cjs/operation-node/parens-node.d.ts +2 -3
  64. package/dist/cjs/operation-node/partition-by-item-node.d.ts +3 -4
  65. package/dist/cjs/operation-node/query-node.d.ts +2 -3
  66. package/dist/cjs/operation-node/query-node.js +6 -6
  67. package/dist/cjs/operation-node/select-modifier-node.d.ts +2 -3
  68. package/dist/cjs/operation-node/select-modifier-node.js +1 -1
  69. package/dist/cjs/operation-node/select-query-node.d.ts +5 -6
  70. package/dist/cjs/operation-node/select-query-node.js +10 -10
  71. package/dist/cjs/operation-node/selection-node.d.ts +2 -3
  72. package/dist/cjs/operation-node/set-operation-node.d.ts +2 -5
  73. package/dist/cjs/operation-node/simple-reference-expression-node.d.ts +3 -0
  74. package/dist/cjs/operation-node/{operation-node-utils.js → simple-reference-expression-node.js} +0 -0
  75. package/dist/cjs/operation-node/unary-operation-node.d.ts +13 -0
  76. package/dist/cjs/operation-node/unary-operation-node.js +19 -0
  77. package/dist/cjs/operation-node/update-query-node.d.ts +3 -4
  78. package/dist/cjs/operation-node/value-list-node.d.ts +2 -9
  79. package/dist/cjs/operation-node/where-node.d.ts +3 -4
  80. package/dist/cjs/operation-node/where-node.js +4 -4
  81. package/dist/cjs/parser/binary-operation-parser.d.ts +20 -0
  82. package/dist/cjs/parser/binary-operation-parser.js +99 -0
  83. package/dist/cjs/parser/coalesce-parser.d.ts +4 -0
  84. package/dist/cjs/parser/coalesce-parser.js +11 -0
  85. package/dist/cjs/parser/data-type-parser.d.ts +5 -5
  86. package/dist/cjs/parser/default-value-parser.d.ts +4 -5
  87. package/dist/cjs/parser/default-value-parser.js +2 -2
  88. package/dist/cjs/parser/expression-parser.d.ts +10 -0
  89. package/dist/cjs/parser/{complex-expression-parser.js → expression-parser.js} +9 -8
  90. package/dist/cjs/parser/identifier-parser.d.ts +2 -0
  91. package/dist/cjs/parser/identifier-parser.js +23 -0
  92. package/dist/cjs/parser/insert-values-parser.d.ts +1 -1
  93. package/dist/cjs/parser/insert-values-parser.js +2 -2
  94. package/dist/cjs/parser/join-parser.js +2 -2
  95. package/dist/cjs/parser/order-by-parser.d.ts +2 -2
  96. package/dist/cjs/parser/reference-parser.d.ts +14 -14
  97. package/dist/cjs/parser/reference-parser.js +12 -9
  98. package/dist/cjs/parser/select-parser.d.ts +6 -7
  99. package/dist/cjs/parser/select-parser.js +2 -2
  100. package/dist/cjs/parser/set-operation-parser.d.ts +2 -4
  101. package/dist/cjs/parser/table-parser.d.ts +11 -12
  102. package/dist/cjs/parser/table-parser.js +2 -2
  103. package/dist/cjs/parser/unary-operation-parser.d.ts +5 -0
  104. package/dist/cjs/parser/unary-operation-parser.js +17 -0
  105. package/dist/cjs/parser/update-set-parser.d.ts +1 -1
  106. package/dist/cjs/parser/value-parser.d.ts +5 -9
  107. package/dist/cjs/parser/value-parser.js +4 -4
  108. package/dist/cjs/parser/with-parser.d.ts +3 -4
  109. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +1 -1
  110. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +245 -14
  111. package/dist/cjs/query-builder/aggregate-function-builder.js +164 -12
  112. package/dist/cjs/query-builder/delete-query-builder.d.ts +20 -20
  113. package/dist/cjs/query-builder/delete-query-builder.js +19 -16
  114. package/dist/cjs/query-builder/function-module.d.ts +123 -22
  115. package/dist/cjs/query-builder/function-module.js +91 -48
  116. package/dist/cjs/query-builder/having-interface.d.ts +9 -8
  117. package/dist/cjs/query-builder/insert-query-builder.d.ts +7 -6
  118. package/dist/cjs/query-builder/insert-query-builder.js +11 -9
  119. package/dist/cjs/query-builder/insert-result.d.ts +8 -1
  120. package/dist/cjs/query-builder/insert-result.js +12 -1
  121. package/dist/cjs/query-builder/join-builder.d.ts +9 -8
  122. package/dist/cjs/query-builder/join-builder.js +10 -9
  123. package/dist/cjs/query-builder/on-conflict-builder.d.ts +25 -24
  124. package/dist/cjs/query-builder/on-conflict-builder.js +18 -17
  125. package/dist/cjs/query-builder/select-query-builder.d.ts +82 -51
  126. package/dist/cjs/query-builder/select-query-builder.js +39 -37
  127. package/dist/cjs/query-builder/update-query-builder.d.ts +20 -20
  128. package/dist/cjs/query-builder/update-query-builder.js +19 -16
  129. package/dist/cjs/query-builder/where-interface.d.ts +12 -11
  130. package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
  131. package/dist/cjs/query-compiler/default-query-compiler.d.ts +5 -3
  132. package/dist/cjs/query-compiler/default-query-compiler.js +37 -33
  133. package/dist/cjs/query-executor/query-executor-base.js +16 -1
  134. package/dist/cjs/raw-builder/raw-builder.d.ts +49 -13
  135. package/dist/cjs/raw-builder/raw-builder.js +24 -14
  136. package/dist/cjs/raw-builder/sql.d.ts +4 -4
  137. package/dist/cjs/schema/alter-column-builder.d.ts +28 -0
  138. package/dist/cjs/schema/alter-column-builder.js +55 -0
  139. package/dist/cjs/schema/alter-table-builder.d.ts +39 -341
  140. package/dist/cjs/schema/alter-table-builder.js +65 -280
  141. package/dist/cjs/schema/column-definition-builder.d.ts +43 -155
  142. package/dist/cjs/schema/column-definition-builder.js +189 -0
  143. package/dist/cjs/schema/create-index-builder.d.ts +2 -2
  144. package/dist/cjs/schema/create-table-builder.d.ts +38 -5
  145. package/dist/cjs/schema/create-table-builder.js +36 -1
  146. package/dist/cjs/schema/create-view-builder.d.ts +3 -2
  147. package/dist/cjs/schema/schema.d.ts +2 -2
  148. package/dist/cjs/schema/schema.js +6 -5
  149. package/dist/cjs/util/compilable.d.ts +2 -2
  150. package/dist/cjs/util/explainable.d.ts +2 -2
  151. package/dist/cjs/util/infer-result.d.ts +46 -0
  152. package/dist/cjs/util/infer-result.js +2 -0
  153. package/dist/cjs/util/log-once.d.ts +5 -0
  154. package/dist/cjs/util/log-once.js +16 -0
  155. package/dist/cjs/util/object-utils.d.ts +1 -0
  156. package/dist/cjs/util/object-utils.js +5 -1
  157. package/dist/cjs/util/type-utils.d.ts +3 -17
  158. package/dist/esm/dialect/database-introspector.d.ts +4 -0
  159. package/dist/esm/dialect/mysql/mysql-driver.js +6 -3
  160. package/dist/esm/dialect/postgres/postgres-adapter.js +1 -1
  161. package/dist/esm/dialect/postgres/postgres-driver.js +7 -2
  162. package/dist/esm/dialect/postgres/postgres-introspector.js +8 -0
  163. package/dist/esm/dialect/sqlite/sqlite-driver.js +4 -3
  164. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
  165. package/dist/esm/driver/database-connection.d.ts +6 -2
  166. package/dist/esm/dynamic/dynamic-reference-builder.d.ts +2 -3
  167. package/dist/esm/dynamic/dynamic-reference-builder.js +2 -2
  168. package/dist/esm/expression/expression.d.ts +100 -0
  169. package/dist/esm/expression/expression.js +12 -0
  170. package/dist/esm/index.d.ts +10 -6
  171. package/dist/esm/index.js +6 -2
  172. package/dist/esm/migration/file-migration-provider.js +5 -3
  173. package/dist/esm/operation-node/aggregate-function-node.d.ts +7 -4
  174. package/dist/esm/operation-node/aggregate-function-node.js +17 -0
  175. package/dist/esm/operation-node/alias-node.d.ts +3 -11
  176. package/dist/esm/operation-node/alter-column-node.d.ts +1 -2
  177. package/dist/esm/operation-node/alter-table-node.d.ts +5 -7
  178. package/dist/esm/operation-node/alter-table-node.js +9 -1
  179. package/dist/esm/operation-node/and-node.d.ts +3 -4
  180. package/dist/esm/operation-node/binary-operation-node.d.ts +14 -0
  181. package/dist/esm/operation-node/binary-operation-node.js +18 -0
  182. package/dist/esm/operation-node/check-constraint-node.d.ts +2 -3
  183. package/dist/esm/operation-node/column-definition-node.d.ts +6 -5
  184. package/dist/esm/operation-node/column-definition-node.js +16 -0
  185. package/dist/esm/operation-node/column-update-node.d.ts +2 -3
  186. package/dist/esm/operation-node/common-table-expression-node.d.ts +2 -4
  187. package/dist/esm/operation-node/create-index-node.d.ts +1 -3
  188. package/dist/esm/operation-node/create-table-node.d.ts +4 -5
  189. package/dist/esm/operation-node/create-type-node.d.ts +1 -1
  190. package/dist/esm/operation-node/create-type-node.js +1 -2
  191. package/dist/esm/operation-node/default-value-node.d.ts +2 -4
  192. package/dist/esm/operation-node/delete-query-node.d.ts +1 -2
  193. package/dist/esm/operation-node/drop-type-node.d.ts +1 -1
  194. package/dist/esm/operation-node/drop-type-node.js +1 -2
  195. package/dist/esm/operation-node/explain-node.d.ts +2 -4
  196. package/dist/esm/operation-node/explain-node.js +1 -1
  197. package/dist/esm/operation-node/from-node.d.ts +3 -4
  198. package/dist/esm/operation-node/generated-node.d.ts +2 -3
  199. package/dist/esm/operation-node/group-by-item-node.d.ts +2 -3
  200. package/dist/esm/operation-node/having-node.d.ts +3 -4
  201. package/dist/esm/operation-node/having-node.js +4 -4
  202. package/dist/esm/operation-node/insert-query-node.d.ts +1 -5
  203. package/dist/esm/operation-node/join-node.d.ts +5 -9
  204. package/dist/esm/operation-node/join-node.js +6 -6
  205. package/dist/esm/operation-node/on-conflict-node.d.ts +5 -7
  206. package/dist/esm/operation-node/on-conflict-node.js +12 -12
  207. package/dist/esm/operation-node/on-node.d.ts +3 -4
  208. package/dist/esm/operation-node/on-node.js +4 -4
  209. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -2
  210. package/dist/esm/operation-node/operation-node-transformer.js +22 -15
  211. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -2
  212. package/dist/esm/operation-node/operation-node-visitor.js +2 -1
  213. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  214. package/dist/esm/operation-node/operator-node.d.ts +5 -3
  215. package/dist/esm/operation-node/operator-node.js +2 -4
  216. package/dist/esm/operation-node/or-node.d.ts +3 -4
  217. package/dist/esm/operation-node/order-by-item-node.d.ts +3 -5
  218. package/dist/esm/operation-node/parens-node.d.ts +2 -3
  219. package/dist/esm/operation-node/partition-by-item-node.d.ts +3 -4
  220. package/dist/esm/operation-node/query-node.d.ts +2 -3
  221. package/dist/esm/operation-node/query-node.js +6 -6
  222. package/dist/esm/operation-node/select-modifier-node.d.ts +2 -3
  223. package/dist/esm/operation-node/select-modifier-node.js +1 -1
  224. package/dist/esm/operation-node/select-query-node.d.ts +5 -6
  225. package/dist/esm/operation-node/select-query-node.js +10 -10
  226. package/dist/esm/operation-node/selection-node.d.ts +2 -3
  227. package/dist/esm/operation-node/set-operation-node.d.ts +2 -5
  228. package/dist/esm/operation-node/simple-reference-expression-node.d.ts +3 -0
  229. package/dist/esm/operation-node/simple-reference-expression-node.js +2 -0
  230. package/dist/esm/operation-node/unary-operation-node.d.ts +13 -0
  231. package/dist/esm/operation-node/unary-operation-node.js +17 -0
  232. package/dist/esm/operation-node/update-query-node.d.ts +3 -4
  233. package/dist/esm/operation-node/value-list-node.d.ts +2 -9
  234. package/dist/esm/operation-node/where-node.d.ts +3 -4
  235. package/dist/esm/operation-node/where-node.js +4 -4
  236. package/dist/esm/parser/binary-operation-parser.d.ts +20 -0
  237. package/dist/esm/parser/binary-operation-parser.js +92 -0
  238. package/dist/esm/parser/coalesce-parser.d.ts +4 -0
  239. package/dist/esm/parser/coalesce-parser.js +8 -0
  240. package/dist/esm/parser/data-type-parser.d.ts +5 -5
  241. package/dist/esm/parser/default-value-parser.d.ts +4 -5
  242. package/dist/esm/parser/default-value-parser.js +2 -2
  243. package/dist/esm/parser/expression-parser.d.ts +10 -0
  244. package/dist/esm/parser/{complex-expression-parser.js → expression-parser.js} +6 -5
  245. package/dist/esm/parser/identifier-parser.d.ts +2 -0
  246. package/dist/esm/parser/identifier-parser.js +20 -0
  247. package/dist/esm/parser/insert-values-parser.d.ts +1 -1
  248. package/dist/esm/parser/insert-values-parser.js +2 -2
  249. package/dist/esm/parser/join-parser.js +2 -2
  250. package/dist/esm/parser/order-by-parser.d.ts +2 -2
  251. package/dist/esm/parser/reference-parser.d.ts +14 -14
  252. package/dist/esm/parser/reference-parser.js +10 -8
  253. package/dist/esm/parser/select-parser.d.ts +6 -7
  254. package/dist/esm/parser/select-parser.js +2 -2
  255. package/dist/esm/parser/set-operation-parser.d.ts +2 -4
  256. package/dist/esm/parser/table-parser.d.ts +11 -12
  257. package/dist/esm/parser/table-parser.js +2 -2
  258. package/dist/esm/parser/unary-operation-parser.d.ts +5 -0
  259. package/dist/esm/parser/unary-operation-parser.js +13 -0
  260. package/dist/esm/parser/update-set-parser.d.ts +1 -1
  261. package/dist/esm/parser/value-parser.d.ts +5 -9
  262. package/dist/esm/parser/value-parser.js +4 -4
  263. package/dist/esm/parser/with-parser.d.ts +3 -4
  264. package/dist/esm/plugin/camel-case/camel-case-plugin.js +2 -2
  265. package/dist/esm/query-builder/aggregate-function-builder.d.ts +245 -14
  266. package/dist/esm/query-builder/aggregate-function-builder.js +164 -12
  267. package/dist/esm/query-builder/delete-query-builder.d.ts +20 -20
  268. package/dist/esm/query-builder/delete-query-builder.js +19 -16
  269. package/dist/esm/query-builder/function-module.d.ts +123 -22
  270. package/dist/esm/query-builder/function-module.js +92 -49
  271. package/dist/esm/query-builder/having-interface.d.ts +9 -8
  272. package/dist/esm/query-builder/insert-query-builder.d.ts +7 -6
  273. package/dist/esm/query-builder/insert-query-builder.js +11 -9
  274. package/dist/esm/query-builder/insert-result.d.ts +8 -1
  275. package/dist/esm/query-builder/insert-result.js +12 -1
  276. package/dist/esm/query-builder/join-builder.d.ts +9 -8
  277. package/dist/esm/query-builder/join-builder.js +10 -9
  278. package/dist/esm/query-builder/on-conflict-builder.d.ts +25 -24
  279. package/dist/esm/query-builder/on-conflict-builder.js +18 -17
  280. package/dist/esm/query-builder/select-query-builder.d.ts +82 -51
  281. package/dist/esm/query-builder/select-query-builder.js +38 -36
  282. package/dist/esm/query-builder/update-query-builder.d.ts +20 -20
  283. package/dist/esm/query-builder/update-query-builder.js +19 -16
  284. package/dist/esm/query-builder/where-interface.d.ts +12 -11
  285. package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
  286. package/dist/esm/query-compiler/default-query-compiler.d.ts +5 -3
  287. package/dist/esm/query-compiler/default-query-compiler.js +38 -34
  288. package/dist/esm/query-executor/query-executor-base.js +16 -1
  289. package/dist/esm/raw-builder/raw-builder.d.ts +49 -13
  290. package/dist/esm/raw-builder/raw-builder.js +23 -14
  291. package/dist/esm/raw-builder/sql.d.ts +4 -4
  292. package/dist/esm/schema/alter-column-builder.d.ts +28 -0
  293. package/dist/esm/schema/alter-column-builder.js +51 -0
  294. package/dist/esm/schema/alter-table-builder.d.ts +39 -341
  295. package/dist/esm/schema/alter-table-builder.js +61 -274
  296. package/dist/esm/schema/column-definition-builder.d.ts +43 -155
  297. package/dist/esm/schema/column-definition-builder.js +189 -0
  298. package/dist/esm/schema/create-index-builder.d.ts +2 -2
  299. package/dist/esm/schema/create-table-builder.d.ts +38 -5
  300. package/dist/esm/schema/create-table-builder.js +36 -1
  301. package/dist/esm/schema/create-view-builder.d.ts +3 -2
  302. package/dist/esm/schema/schema.d.ts +2 -2
  303. package/dist/esm/schema/schema.js +6 -5
  304. package/dist/esm/util/compilable.d.ts +2 -2
  305. package/dist/esm/util/explainable.d.ts +2 -2
  306. package/dist/esm/util/infer-result.d.ts +46 -0
  307. package/dist/esm/util/infer-result.js +2 -0
  308. package/dist/esm/util/log-once.d.ts +5 -0
  309. package/dist/esm/util/log-once.js +13 -0
  310. package/dist/esm/util/object-utils.d.ts +1 -0
  311. package/dist/esm/util/object-utils.js +3 -0
  312. package/dist/esm/util/type-utils.d.ts +3 -17
  313. package/package.json +1 -1
  314. package/dist/cjs/operation-node/filter-node.d.ts +0 -18
  315. package/dist/cjs/operation-node/filter-node.js +0 -20
  316. package/dist/cjs/operation-node/operation-node-utils.d.ts +0 -18
  317. package/dist/cjs/parser/complex-expression-parser.d.ts +0 -12
  318. package/dist/cjs/parser/filter-parser.d.ts +0 -24
  319. package/dist/cjs/parser/filter-parser.js +0 -109
  320. package/dist/esm/operation-node/filter-node.d.ts +0 -18
  321. package/dist/esm/operation-node/filter-node.js +0 -18
  322. package/dist/esm/operation-node/operation-node-utils.d.ts +0 -18
  323. package/dist/esm/operation-node/operation-node-utils.js +0 -2
  324. package/dist/esm/parser/complex-expression-parser.d.ts +0 -12
  325. package/dist/esm/parser/filter-parser.d.ts +0 -24
  326. package/dist/esm/parser/filter-parser.js +0 -100
@@ -1,4 +1,8 @@
1
- import { StringReference, ExtractTypeFromReferenceExpression } from '../parser/reference-parser.js';
1
+ import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
2
+ import { CoalesceReferenceExpressionList } from '../parser/coalesce-parser.js';
3
+ import { ExtractTypeFromReferenceExpression, SimpleReferenceExpression, ReferenceExpression, StringReference } from '../parser/reference-parser.js';
4
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
5
+ import { Equals, IsNever } from '../util/type-utils.js';
2
6
  import { AggregateFunctionBuilder } from './aggregate-function-builder.js';
3
7
  /**
4
8
  * Helpers for type safe SQL function calls.
@@ -39,13 +43,13 @@ export declare class FunctionModule<DB, TB extends keyof DB> {
39
43
  *
40
44
  * If this is used in a `select` statement the type of the selected expression
41
45
  * will be `number | string` by default. This is because Kysely can't know the
42
- * type the db driver outputs. Sometimes the output can be larger than the
43
- * largest javascript number and a string is returned instead. Most drivers
44
- * allow you to configure the output type of large numbers and Kysely can't
45
- * know if you've done so.
46
+ * type the db driver outputs. Sometimes the output can be larger than the largest
47
+ * javascript number and a string is returned instead. Most drivers allow you
48
+ * to configure the output type of large numbers and Kysely can't know if you've
49
+ * done so.
46
50
  *
47
- * You can specify the output type of the expression by providing
48
- * the type as the first type argument:
51
+ * You can specify the output type of the expression by providing the type as
52
+ * the first type argument:
49
53
  *
50
54
  * ```ts
51
55
  * const { avg } = db.fn
@@ -54,17 +58,65 @@ export declare class FunctionModule<DB, TB extends keyof DB> {
54
58
  * .select(avg<number>('price').as('avg_price'))
55
59
  * .execute()
56
60
  * ```
61
+ *
62
+ * Sometimes a null is returned, e.g. when row count is 0, and no `group by`
63
+ * was used. It is highly recommended to include null in the output type union
64
+ * and handle null values in post-execute code, or wrap the function with a `coalesce`
65
+ * function.
66
+ *
67
+ * ```ts
68
+ * const { avg } = db.fn
69
+ *
70
+ * db.selectFrom('toy')
71
+ * .select(avg<number | null>('price').as('avg_price'))
72
+ * .execute()
73
+ * ```
74
+ */
75
+ avg<O extends number | string | null = number | string, C extends SimpleReferenceExpression<DB, TB> = SimpleReferenceExpression<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, O>;
76
+ /**
77
+ * Calls the `coalesce` function for given arguments.
78
+ *
79
+ * This function returns the first non-null value from left to right, commonly
80
+ * used to provide a default scalar for nullable columns or functions.
81
+ *
82
+ * ```ts
83
+ * const { coalesce, max } = db.fn
84
+ *
85
+ * db.selectFrom('person')
86
+ * .select(coalesce(max('age'), sql<number>`0`).as('max_age'))
87
+ * .where('first_name', '=', 'Jennifer')
88
+ * .execute()
89
+ * ```
90
+ *
91
+ * The generated SQL (postgres):
92
+ *
93
+ * ```sql
94
+ * select coalesce(max("age"), 0) as "max_age" from "person" where "first_name" = $1
95
+ * ```
96
+ *
97
+ * If this is used in a `select` statement the type of the selected expression
98
+ * is inferred in the same manner that the function computes. A union of arguments'
99
+ * types - if a non-nullable argument exists, it stops there (ignoring any further
100
+ * arguments' types) and exludes null from the final union type.
101
+ *
102
+ * Examples:
103
+ *
104
+ * `(string | null, number | null)` is inferred as `string | number | null`.
105
+ *
106
+ * `(string | null, number, Date | null)` is inferred as `string | number`.
107
+ *
108
+ * `(number, string | null)` is inferred as `number`.
57
109
  */
58
- avg<O extends number | string, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, O>;
110
+ coalesce<V extends ReferenceExpression<DB, TB>, OV extends ReferenceExpression<DB, TB>[]>(value: V, ...otherValues: OV): RawBuilder<CoalesceReferenceExpressionList<DB, TB, [V, ...OV]>>;
59
111
  /**
60
112
  * Calls the `count` function for the column given as the argument.
61
113
  *
62
114
  * If this is used in a `select` statement the type of the selected expression
63
- * will be `number | string | bigint` by default. This is because Kysely can't
64
- * know the type the db driver outputs. Sometimes the output can be larger than
65
- * the largest javascript number and a string is returned instead. Most drivers
66
- * allow you to configure the output type of large numbers and Kysely can't
67
- * know if you've done so.
115
+ * will be `number | string | bigint` by default. This is because Kysely
116
+ * can't know the type the db driver outputs. Sometimes the output can be larger
117
+ * than the largest javascript number and a string is returned instead. Most
118
+ * drivers allow you to configure the output type of large numbers and Kysely
119
+ * can't know if you've done so.
68
120
  *
69
121
  * You can specify the output type of the expression by providing
70
122
  * the type as the first type argument:
@@ -85,10 +137,13 @@ export declare class FunctionModule<DB, TB extends keyof DB> {
85
137
  * .execute()
86
138
  * ```
87
139
  */
88
- count<O extends number | string | bigint, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, O>;
140
+ count<O extends number | string | bigint, C extends SimpleReferenceExpression<DB, TB> = SimpleReferenceExpression<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, O>;
89
141
  /**
90
142
  * Calls the `max` function for the column given as the argument.
91
143
  *
144
+ * If this is used in a `select` statement the type of the selected expression
145
+ * will be the referenced column's type.
146
+ *
92
147
  * ### Examples
93
148
  *
94
149
  * ```ts
@@ -98,11 +153,28 @@ export declare class FunctionModule<DB, TB extends keyof DB> {
98
153
  * .select(max('price').as('max_price'))
99
154
  * .execute()
100
155
  * ```
156
+ *
157
+ * Sometimes a null is returned, e.g. when row count is 0, and no `group by`
158
+ * was used. It is highly recommended to include null in the output type union
159
+ * and handle null values in post-execute code, or wrap the function with a `coalesce`
160
+ * function.
161
+ *
162
+ * ```ts
163
+ * const { max } = db.fn
164
+ *
165
+ * db.selectFrom('toy')
166
+ * .select(max<number | null, 'price'>('price').as('max_price'))
167
+ * .execute()
168
+ * ```
101
169
  */
102
- max<C extends StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, C>>;
170
+ max<O extends number | string | bigint | null = never, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: OutputBoundStringReference<DB, TB, C, O>): StringReferenceBoundAggregateFunctionBuilder<DB, TB, C, O>;
171
+ max<O extends number | string | bigint | null = number | string | bigint>(column: DynamicReferenceBuilder): AggregateFunctionBuilder<DB, TB, O>;
103
172
  /**
104
173
  * Calls the `min` function for the column given as the argument.
105
174
  *
175
+ * If this is used in a `select` statement the type of the selected expression
176
+ * will be the referenced column's type.
177
+ *
106
178
  * ### Examples
107
179
  *
108
180
  * ```ts
@@ -113,17 +185,30 @@ export declare class FunctionModule<DB, TB extends keyof DB> {
113
185
  * .execute()
114
186
  * ```
115
187
  *
188
+ * Sometimes a null is returned, e.g. when row count is 0, and no `group by`
189
+ * was used. It is highly recommended to include null in the output type union
190
+ * and handle null values in post-execute code, or wrap the function with a `coalesce`
191
+ * function.
192
+ *
193
+ * ```ts
194
+ * const { min } = db.fn
195
+ *
196
+ * db.selectFrom('toy')
197
+ * .select(min<number | null, 'price'>('price').as('min_price'))
198
+ * .execute()
199
+ * ```
116
200
  */
117
- min<C extends StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, C>>;
201
+ min<O extends number | string | bigint | null = never, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: OutputBoundStringReference<DB, TB, C, O>): StringReferenceBoundAggregateFunctionBuilder<DB, TB, C, O>;
202
+ min<O extends number | string | bigint | null = number | string | bigint>(column: DynamicReferenceBuilder): AggregateFunctionBuilder<DB, TB, O>;
118
203
  /**
119
204
  * Calls the `sum` function for the column given as the argument.
120
205
  *
121
206
  * If this is used in a `select` statement the type of the selected expression
122
- * will be `number | string | bigint` by default. This is because Kysely can't
123
- * know the type the db driver outputs. Sometimes the output can be larger than
124
- * the largest javascript number and a string is returned instead. Most drivers
125
- * allow you to configure the output type of large numbers and Kysely can't
126
- * know if you've done so.
207
+ * will be `number | string | bigint` by default. This is because Kysely
208
+ * can't know the type the db driver outputs. Sometimes the output can be larger
209
+ * than the largest javascript number and a string is returned instead. Most
210
+ * drivers allow you to configure the output type of large numbers and Kysely
211
+ * can't know if you've done so.
127
212
  *
128
213
  * You can specify the output type of the expression by providing
129
214
  * the type as the first type argument:
@@ -135,6 +220,22 @@ export declare class FunctionModule<DB, TB extends keyof DB> {
135
220
  * .select(sum<number>('price').as('total_price'))
136
221
  * .execute()
137
222
  * ```
223
+ *
224
+ * Sometimes a null is returned, e.g. when row count is 0, and no `group by`
225
+ * was used. It is highly recommended to include null in the output type union
226
+ * and handle null values in post-execute code, or wrap the function with a `coalesce`
227
+ * function.
228
+ *
229
+ * ```ts
230
+ * const { sum } = db.fn
231
+ *
232
+ * db.selectFrom('toy')
233
+ * .select(sum<number | null>('price').as('total_price'))
234
+ * .execute()
235
+ * ```
138
236
  */
139
- sum<O extends number | string | bigint, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, O>;
237
+ sum<O extends number | string | bigint | null = number | string | bigint, C extends SimpleReferenceExpression<DB, TB> = SimpleReferenceExpression<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, O>;
140
238
  }
239
+ declare type OutputBoundStringReference<DB, TB extends keyof DB, C extends StringReference<DB, TB>, O> = IsNever<O> extends true ? C : Equals<ExtractTypeFromReferenceExpression<DB, TB, C> | null, O | null> extends true ? C : never;
240
+ declare type StringReferenceBoundAggregateFunctionBuilder<DB, TB extends keyof DB, C extends StringReference<DB, TB>, O> = AggregateFunctionBuilder<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, C> | (null extends O ? null : never)>;
241
+ export {};
@@ -1,6 +1,9 @@
1
1
  /// <reference types="./function-module.d.ts" />
2
2
  import { AggregateFunctionNode } from '../operation-node/aggregate-function-node.js';
3
- import { parseStringReference, } from '../parser/reference-parser.js';
3
+ import { parseCoalesce, } from '../parser/coalesce-parser.js';
4
+ import { parseSimpleReferenceExpression, } from '../parser/reference-parser.js';
5
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
6
+ import { createQueryId } from '../util/query-id.js';
4
7
  import { AggregateFunctionBuilder } from './aggregate-function-builder.js';
5
8
  /**
6
9
  * Helpers for type safe SQL function calls.
@@ -37,6 +40,7 @@ import { AggregateFunctionBuilder } from './aggregate-function-builder.js';
37
40
  export class FunctionModule {
38
41
  constructor() {
39
42
  this.avg = this.avg.bind(this);
43
+ this.coalesce = this.coalesce.bind(this);
40
44
  this.count = this.count.bind(this);
41
45
  this.max = this.max.bind(this);
42
46
  this.min = this.min.bind(this);
@@ -47,13 +51,13 @@ export class FunctionModule {
47
51
  *
48
52
  * If this is used in a `select` statement the type of the selected expression
49
53
  * will be `number | string` by default. This is because Kysely can't know the
50
- * type the db driver outputs. Sometimes the output can be larger than the
51
- * largest javascript number and a string is returned instead. Most drivers
52
- * allow you to configure the output type of large numbers and Kysely can't
53
- * know if you've done so.
54
+ * type the db driver outputs. Sometimes the output can be larger than the largest
55
+ * javascript number and a string is returned instead. Most drivers allow you
56
+ * to configure the output type of large numbers and Kysely can't know if you've
57
+ * done so.
54
58
  *
55
- * You can specify the output type of the expression by providing
56
- * the type as the first type argument:
59
+ * You can specify the output type of the expression by providing the type as
60
+ * the first type argument:
57
61
  *
58
62
  * ```ts
59
63
  * const { avg } = db.fn
@@ -62,21 +66,74 @@ export class FunctionModule {
62
66
  * .select(avg<number>('price').as('avg_price'))
63
67
  * .execute()
64
68
  * ```
69
+ *
70
+ * Sometimes a null is returned, e.g. when row count is 0, and no `group by`
71
+ * was used. It is highly recommended to include null in the output type union
72
+ * and handle null values in post-execute code, or wrap the function with a `coalesce`
73
+ * function.
74
+ *
75
+ * ```ts
76
+ * const { avg } = db.fn
77
+ *
78
+ * db.selectFrom('toy')
79
+ * .select(avg<number | null>('price').as('avg_price'))
80
+ * .execute()
81
+ * ```
65
82
  */
66
83
  avg(column) {
67
84
  return new AggregateFunctionBuilder({
68
- aggregateFunctionNode: AggregateFunctionNode.create('avg', parseStringReference(column)),
85
+ aggregateFunctionNode: AggregateFunctionNode.create('avg', parseSimpleReferenceExpression(column)),
86
+ });
87
+ }
88
+ /**
89
+ * Calls the `coalesce` function for given arguments.
90
+ *
91
+ * This function returns the first non-null value from left to right, commonly
92
+ * used to provide a default scalar for nullable columns or functions.
93
+ *
94
+ * ```ts
95
+ * const { coalesce, max } = db.fn
96
+ *
97
+ * db.selectFrom('person')
98
+ * .select(coalesce(max('age'), sql<number>`0`).as('max_age'))
99
+ * .where('first_name', '=', 'Jennifer')
100
+ * .execute()
101
+ * ```
102
+ *
103
+ * The generated SQL (postgres):
104
+ *
105
+ * ```sql
106
+ * select coalesce(max("age"), 0) as "max_age" from "person" where "first_name" = $1
107
+ * ```
108
+ *
109
+ * If this is used in a `select` statement the type of the selected expression
110
+ * is inferred in the same manner that the function computes. A union of arguments'
111
+ * types - if a non-nullable argument exists, it stops there (ignoring any further
112
+ * arguments' types) and exludes null from the final union type.
113
+ *
114
+ * Examples:
115
+ *
116
+ * `(string | null, number | null)` is inferred as `string | number | null`.
117
+ *
118
+ * `(string | null, number, Date | null)` is inferred as `string | number`.
119
+ *
120
+ * `(number, string | null)` is inferred as `number`.
121
+ */
122
+ coalesce(value, ...otherValues) {
123
+ return new RawBuilder({
124
+ queryId: createQueryId(),
125
+ rawNode: parseCoalesce([value, ...otherValues]),
69
126
  });
70
127
  }
71
128
  /**
72
129
  * Calls the `count` function for the column given as the argument.
73
130
  *
74
131
  * If this is used in a `select` statement the type of the selected expression
75
- * will be `number | string | bigint` by default. This is because Kysely can't
76
- * know the type the db driver outputs. Sometimes the output can be larger than
77
- * the largest javascript number and a string is returned instead. Most drivers
78
- * allow you to configure the output type of large numbers and Kysely can't
79
- * know if you've done so.
132
+ * will be `number | string | bigint` by default. This is because Kysely
133
+ * can't know the type the db driver outputs. Sometimes the output can be larger
134
+ * than the largest javascript number and a string is returned instead. Most
135
+ * drivers allow you to configure the output type of large numbers and Kysely
136
+ * can't know if you've done so.
80
137
  *
81
138
  * You can specify the output type of the expression by providing
82
139
  * the type as the first type argument:
@@ -99,55 +156,28 @@ export class FunctionModule {
99
156
  */
100
157
  count(column) {
101
158
  return new AggregateFunctionBuilder({
102
- aggregateFunctionNode: AggregateFunctionNode.create('count', parseStringReference(column)),
159
+ aggregateFunctionNode: AggregateFunctionNode.create('count', parseSimpleReferenceExpression(column)),
103
160
  });
104
161
  }
105
- /**
106
- * Calls the `max` function for the column given as the argument.
107
- *
108
- * ### Examples
109
- *
110
- * ```ts
111
- * const { max } = db.fn
112
- *
113
- * db.selectFrom('toy')
114
- * .select(max('price').as('max_price'))
115
- * .execute()
116
- * ```
117
- */
118
162
  max(column) {
119
163
  return new AggregateFunctionBuilder({
120
- aggregateFunctionNode: AggregateFunctionNode.create('max', parseStringReference(column)),
164
+ aggregateFunctionNode: AggregateFunctionNode.create('max', parseSimpleReferenceExpression(column)),
121
165
  });
122
166
  }
123
- /**
124
- * Calls the `min` function for the column given as the argument.
125
- *
126
- * ### Examples
127
- *
128
- * ```ts
129
- * const { min } = db.fn
130
- *
131
- * db.selectFrom('toy')
132
- * .select(min('price').as('min_price'))
133
- * .execute()
134
- * ```
135
- *
136
- */
137
167
  min(column) {
138
168
  return new AggregateFunctionBuilder({
139
- aggregateFunctionNode: AggregateFunctionNode.create('min', parseStringReference(column)),
169
+ aggregateFunctionNode: AggregateFunctionNode.create('min', parseSimpleReferenceExpression(column)),
140
170
  });
141
171
  }
142
172
  /**
143
173
  * Calls the `sum` function for the column given as the argument.
144
174
  *
145
175
  * If this is used in a `select` statement the type of the selected expression
146
- * will be `number | string | bigint` by default. This is because Kysely can't
147
- * know the type the db driver outputs. Sometimes the output can be larger than
148
- * the largest javascript number and a string is returned instead. Most drivers
149
- * allow you to configure the output type of large numbers and Kysely can't
150
- * know if you've done so.
176
+ * will be `number | string | bigint` by default. This is because Kysely
177
+ * can't know the type the db driver outputs. Sometimes the output can be larger
178
+ * than the largest javascript number and a string is returned instead. Most
179
+ * drivers allow you to configure the output type of large numbers and Kysely
180
+ * can't know if you've done so.
151
181
  *
152
182
  * You can specify the output type of the expression by providing
153
183
  * the type as the first type argument:
@@ -159,10 +189,23 @@ export class FunctionModule {
159
189
  * .select(sum<number>('price').as('total_price'))
160
190
  * .execute()
161
191
  * ```
192
+ *
193
+ * Sometimes a null is returned, e.g. when row count is 0, and no `group by`
194
+ * was used. It is highly recommended to include null in the output type union
195
+ * and handle null values in post-execute code, or wrap the function with a `coalesce`
196
+ * function.
197
+ *
198
+ * ```ts
199
+ * const { sum } = db.fn
200
+ *
201
+ * db.selectFrom('toy')
202
+ * .select(sum<number | null>('price').as('total_price'))
203
+ * .execute()
204
+ * ```
162
205
  */
163
206
  sum(column) {
164
207
  return new AggregateFunctionBuilder({
165
- aggregateFunctionNode: AggregateFunctionNode.create('sum', parseStringReference(column)),
208
+ aggregateFunctionNode: AggregateFunctionNode.create('sum', parseSimpleReferenceExpression(column)),
166
209
  });
167
210
  }
168
211
  }
@@ -1,31 +1,32 @@
1
- import { ExistsExpression, FilterOperator, FilterValueExpressionOrList, HavingGrouper } from '../parser/filter-parser.js';
1
+ import { Expression } from '../expression/expression.js';
2
+ import { ComparisonOperatorExpression, HavingGrouper, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
2
3
  import { ReferenceExpression } from '../parser/reference-parser.js';
3
- import { AnyRawBuilder } from '../util/type-utils.js';
4
+ import { ExistsExpression } from '../parser/unary-operation-parser.js';
4
5
  export interface HavingInterface<DB, TB extends keyof DB> {
5
6
  /**
6
7
  * Just like {@link WhereInterface.where | where} but adds a `having` statement
7
8
  * instead of a `where` statement.
8
9
  */
9
- having<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): HavingInterface<DB, TB>;
10
+ having<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): HavingInterface<DB, TB>;
10
11
  having(grouper: HavingGrouper<DB, TB>): HavingInterface<DB, TB>;
11
- having(raw: AnyRawBuilder): HavingInterface<DB, TB>;
12
+ having(expression: Expression<any>): HavingInterface<DB, TB>;
12
13
  /**
13
14
  * Just like {@link WhereInterface.whereRef | whereRef} but adds a `having` statement
14
15
  * instead of a `where` statement.
15
16
  */
16
- havingRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): HavingInterface<DB, TB>;
17
+ havingRef(lhs: ReferenceExpression<DB, TB>, op: ComparisonOperatorExpression, rhs: ReferenceExpression<DB, TB>): HavingInterface<DB, TB>;
17
18
  /**
18
19
  * Just like {@link WhereInterface.orWhere | orWhere} but adds a `having` statement
19
20
  * instead of a `where` statement.
20
21
  */
21
- orHaving<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): HavingInterface<DB, TB>;
22
+ orHaving<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): HavingInterface<DB, TB>;
22
23
  orHaving(grouper: HavingGrouper<DB, TB>): HavingInterface<DB, TB>;
23
- orHaving(raw: AnyRawBuilder): HavingInterface<DB, TB>;
24
+ orHaving(expression: Expression<any>): HavingInterface<DB, TB>;
24
25
  /**
25
26
  * Just like {@link WhereInterface.orWhereRef | orWhereRef} but adds a `having` statement
26
27
  * instead of a `where` statement.
27
28
  */
28
- orHavingRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): HavingInterface<DB, TB>;
29
+ orHavingRef(lhs: ReferenceExpression<DB, TB>, op: ComparisonOperatorExpression, rhs: ReferenceExpression<DB, TB>): HavingInterface<DB, TB>;
29
30
  /**
30
31
  * Just like {@link WhereInterface.whereExists | whereExists} but adds a `having` statement
31
32
  * instead of a `where` statement.
@@ -3,7 +3,7 @@ import { CompiledQuery } from '../query-compiler/compiled-query.js';
3
3
  import { SelectExpression } from '../parser/select-parser.js';
4
4
  import { InsertObject } from '../parser/insert-values-parser.js';
5
5
  import { InsertQueryNode } from '../operation-node/insert-query-node.js';
6
- import { AnyRawBuilder, MergePartial, SingleResultType } from '../util/type-utils.js';
6
+ import { MergePartial, SingleResultType } from '../util/type-utils.js';
7
7
  import { MutationObject } from '../parser/update-set-parser.js';
8
8
  import { Compilable } from '../util/compilable.js';
9
9
  import { QueryExecutor } from '../query-executor/query-executor.js';
@@ -12,12 +12,13 @@ import { InsertResult } from './insert-result.js';
12
12
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
13
13
  import { ReturningRow } from '../parser/returning-parser.js';
14
14
  import { NoResultErrorConstructor } from './no-result-error.js';
15
- import { ComplexExpression } from '../parser/complex-expression-parser.js';
15
+ import { ExpressionOrFactory } from '../parser/expression-parser.js';
16
16
  import { ReturningInterface } from './returning-interface.js';
17
17
  import { OnConflictBuilder, OnConflictDoNothingBuilder, OnConflictUpdateBuilder } from './on-conflict-builder.js';
18
18
  import { Selectable } from '../util/column-type.js';
19
19
  import { Explainable, ExplainFormat } from '../util/explainable.js';
20
- export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable, Explainable {
20
+ import { Expression } from '../expression/expression.js';
21
+ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable<O>, Explainable {
21
22
  #private;
22
23
  constructor(props: InsertQueryBuilderProps);
23
24
  /**
@@ -189,7 +190,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
189
190
  * select "pet"."name" from "pet"
190
191
  * ```
191
192
  */
192
- expression(expression: ComplexExpression<DB, TB>): InsertQueryBuilder<DB, TB, O>;
193
+ expression(expression: ExpressionOrFactory<DB, TB, any>): InsertQueryBuilder<DB, TB, O>;
193
194
  /**
194
195
  * Changes an `insert into` query to an `insert ignore into` query.
195
196
  *
@@ -521,7 +522,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
521
522
  */
522
523
  withPlugin(plugin: KyselyPlugin): InsertQueryBuilder<DB, TB, O>;
523
524
  toOperationNode(): InsertQueryNode;
524
- compile(): CompiledQuery;
525
+ compile(): CompiledQuery<O>;
525
526
  /**
526
527
  * Executes the query and returns an array of rows.
527
528
  *
@@ -558,7 +559,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
558
559
  * explain format=json insert into `person` (`id`, `first_name`, `last_name`) values (?, ?, ?) (?, ?, ?)
559
560
  * ```
560
561
  */
561
- explain<ER extends Record<string, any> = Record<string, any>>(format?: ExplainFormat, options?: AnyRawBuilder): Promise<ER[]>;
562
+ explain<ER extends Record<string, any> = Record<string, any>>(format?: ExplainFormat, options?: Expression<any>): Promise<ER[]>;
562
563
  }
563
564
  export interface InsertQueryBuilderProps {
564
565
  readonly queryId: QueryId;
@@ -9,7 +9,7 @@ import { freeze } from '../util/object-utils.js';
9
9
  import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
10
10
  import { InsertResult } from './insert-result.js';
11
11
  import { NoResultError } from './no-result-error.js';
12
- import { parseComplexExpression, } from '../parser/complex-expression-parser.js';
12
+ import { parseExpression, } from '../parser/expression-parser.js';
13
13
  import { ColumnNode } from '../operation-node/column-node.js';
14
14
  import { OnConflictBuilder, } from './on-conflict-builder.js';
15
15
  import { OnConflictNode } from '../operation-node/on-conflict-node.js';
@@ -81,7 +81,7 @@ export class InsertQueryBuilder {
81
81
  return new InsertQueryBuilder({
82
82
  ...this.#props,
83
83
  queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
84
- values: parseComplexExpression(expression),
84
+ values: parseExpression(expression),
85
85
  }),
86
86
  });
87
87
  }
@@ -412,15 +412,17 @@ export class InsertQueryBuilder {
412
412
  * Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods.
413
413
  */
414
414
  async execute() {
415
- const compildQuery = this.compile();
416
- const query = compildQuery.query;
417
- const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
415
+ const compiledQuery = this.compile();
416
+ const query = compiledQuery.query;
417
+ const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
418
418
  if (this.#props.executor.adapter.supportsReturning && query.returning) {
419
419
  return result.rows;
420
420
  }
421
- else {
422
- return [new InsertResult(result.insertId)];
423
- }
421
+ return [
422
+ new InsertResult(result.insertId,
423
+ // TODO: remove numUpdatedOrDeletedRows.
424
+ result.numAffectedRows ?? result.numUpdatedOrDeletedRows),
425
+ ];
424
426
  }
425
427
  /**
426
428
  * Executes the query and returns the first result or undefined if
@@ -465,7 +467,7 @@ export class InsertQueryBuilder {
465
467
  const builder = new InsertQueryBuilder({
466
468
  ...this.#props,
467
469
  queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
468
- explain: ExplainNode.create(format, options),
470
+ explain: ExplainNode.create(format, options?.toOperationNode()),
469
471
  }),
470
472
  });
471
473
  return await builder.execute();
@@ -7,6 +7,9 @@
7
7
  * need to use {@link ReturningInterface.returning} or {@link ReturningInterface.returningAll}
8
8
  * to get out the inserted id.
9
9
  *
10
+ * {@link numInsertedOrUpdatedRows} holds the number of (actually) inserted rows.
11
+ * On MySQL, updated rows are counted twice when using `on duplicate key update`.
12
+ *
10
13
  * ### Examples
11
14
  *
12
15
  * ```ts
@@ -20,9 +23,13 @@
20
23
  */
21
24
  export declare class InsertResult {
22
25
  #private;
23
- constructor(insertId: bigint | undefined);
26
+ constructor(insertId: bigint | undefined, numInsertedOrUpdatedRows: bigint | undefined);
24
27
  /**
25
28
  * The auto incrementing primary key
26
29
  */
27
30
  get insertId(): bigint | undefined;
31
+ /**
32
+ * Affected rows count.
33
+ */
34
+ get numInsertedOrUpdatedRows(): bigint | undefined;
28
35
  }
@@ -8,6 +8,9 @@
8
8
  * need to use {@link ReturningInterface.returning} or {@link ReturningInterface.returningAll}
9
9
  * to get out the inserted id.
10
10
  *
11
+ * {@link numInsertedOrUpdatedRows} holds the number of (actually) inserted rows.
12
+ * On MySQL, updated rows are counted twice when using `on duplicate key update`.
13
+ *
11
14
  * ### Examples
12
15
  *
13
16
  * ```ts
@@ -21,8 +24,10 @@
21
24
  */
22
25
  export class InsertResult {
23
26
  #insertId;
24
- constructor(insertId) {
27
+ #numInsertedOrUpdatedRows;
28
+ constructor(insertId, numInsertedOrUpdatedRows) {
25
29
  this.#insertId = insertId;
30
+ this.#numInsertedOrUpdatedRows = numInsertedOrUpdatedRows;
26
31
  }
27
32
  /**
28
33
  * The auto incrementing primary key
@@ -30,4 +35,10 @@ export class InsertResult {
30
35
  get insertId() {
31
36
  return this.#insertId;
32
37
  }
38
+ /**
39
+ * Affected rows count.
40
+ */
41
+ get numInsertedOrUpdatedRows() {
42
+ return this.#numInsertedOrUpdatedRows;
43
+ }
33
44
  }