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
@@ -12,6 +12,9 @@ const object_utils_js_1 = require("../util/object-utils.js");
12
12
  const update_result_js_1 = require("./update-result.js");
13
13
  const no_result_error_js_1 = require("./no-result-error.js");
14
14
  const binary_operation_parser_js_1 = require("../parser/binary-operation-parser.js");
15
+ const value_parser_js_1 = require("../parser/value-parser.js");
16
+ const limit_node_js_1 = require("../operation-node/limit-node.js");
17
+ const top_parser_js_1 = require("../parser/top-parser.js");
15
18
  class UpdateQueryBuilder {
16
19
  #props;
17
20
  constructor(props) {
@@ -35,6 +38,51 @@ class UpdateQueryBuilder {
35
38
  queryNode: query_node_js_1.QueryNode.cloneWithoutWhere(this.#props.queryNode),
36
39
  });
37
40
  }
41
+ /**
42
+ * Changes an `update` query into a `update top` query.
43
+ *
44
+ * `top` clause is only supported by some dialects like MS SQL Server.
45
+ *
46
+ * ### Examples
47
+ *
48
+ * Update the first row:
49
+ *
50
+ * ```ts
51
+ * await db.updateTable('person')
52
+ * .top(1)
53
+ * .set({ first_name: 'Foo' })
54
+ * .where('age', '>', 18)
55
+ * .executeTakeFirstOrThrow()
56
+ * ```
57
+ *
58
+ * The generated SQL (MS SQL Server):
59
+ *
60
+ * ```sql
61
+ * update top(1) "person" set "first_name" = @1 where "age" > @2
62
+ * ```
63
+ *
64
+ * Update the 50% first rows:
65
+ *
66
+ * ```ts
67
+ * await db.updateTable('person')
68
+ * .top(50, 'percent')
69
+ * .set({ first_name: 'Foo' })
70
+ * .where('age', '>', 18)
71
+ * .executeTakeFirstOrThrow()
72
+ * ```
73
+ *
74
+ * The generated SQL (MS SQL Server):
75
+ *
76
+ * ```sql
77
+ * update top(50) percent "person" set "first_name" = @1 where "age" > @2
78
+ * ```
79
+ */
80
+ top(expression, modifiers) {
81
+ return new UpdateQueryBuilder({
82
+ ...this.#props,
83
+ queryNode: query_node_js_1.QueryNode.cloneWithTop(this.#props.queryNode, (0, top_parser_js_1.parseTop)(expression, modifiers)),
84
+ });
85
+ }
38
86
  from(from) {
39
87
  return new UpdateQueryBuilder({
40
88
  ...this.#props,
@@ -65,6 +113,31 @@ class UpdateQueryBuilder {
65
113
  queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('FullJoin', args)),
66
114
  });
67
115
  }
116
+ /**
117
+ * Adds a limit clause to the update query for supported databases, such as MySQL.
118
+ *
119
+ * ### Examples
120
+ *
121
+ * Update the first 2 rows in the 'person' table:
122
+ *
123
+ * ```ts
124
+ * return await db
125
+ * .updateTable('person')
126
+ * .set({ first_name: 'Foo' })
127
+ * .limit(2);
128
+ * ```
129
+ *
130
+ * The generated SQL (MySQL):
131
+ * ```sql
132
+ * update `person` set `first_name` = 'Foo' limit 2
133
+ * ```
134
+ */
135
+ limit(limit) {
136
+ return new UpdateQueryBuilder({
137
+ ...this.#props,
138
+ queryNode: update_query_node_js_1.UpdateQueryNode.cloneWithLimit(this.#props.queryNode, limit_node_js_1.LimitNode.create((0, value_parser_js_1.parseValueExpression)(limit))),
139
+ });
140
+ }
68
141
  set(...args) {
69
142
  return new UpdateQueryBuilder({
70
143
  ...this.#props,
@@ -77,10 +150,47 @@ class UpdateQueryBuilder {
77
150
  queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(selection)),
78
151
  });
79
152
  }
80
- returningAll() {
153
+ returningAll(table) {
154
+ return new UpdateQueryBuilder({
155
+ ...this.#props,
156
+ queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
157
+ });
158
+ }
159
+ output(args) {
160
+ return new UpdateQueryBuilder({
161
+ ...this.#props,
162
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
163
+ });
164
+ }
165
+ outputAll(table) {
166
+ return new UpdateQueryBuilder({
167
+ ...this.#props,
168
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
169
+ });
170
+ }
171
+ /**
172
+ * Clears all `returning` clauses from the query.
173
+ *
174
+ * ### Examples
175
+ *
176
+ * ```ts
177
+ * db.updateTable('person')
178
+ * .returningAll()
179
+ * .set({ age: 39 })
180
+ * .where('first_name', '=', 'John')
181
+ * .clearReturning()
182
+ * ```
183
+ *
184
+ * The generated SQL(PostgreSQL):
185
+ *
186
+ * ```sql
187
+ * update "person" set "age" = 39 where "first_name" = "John"
188
+ * ```
189
+ */
190
+ clearReturning() {
81
191
  return new UpdateQueryBuilder({
82
192
  ...this.#props,
83
- queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)()),
193
+ queryNode: query_node_js_1.QueryNode.cloneWithoutReturning(this.#props.queryNode),
84
194
  });
85
195
  }
86
196
  /**
@@ -212,17 +322,17 @@ class UpdateQueryBuilder {
212
322
  /**
213
323
  * Asserts that query's output row type equals the given type `T`.
214
324
  *
215
- * This method can be used to simplify excessively complex types to make typescript happy
325
+ * This method can be used to simplify excessively complex types to make TypeScript happy
216
326
  * and much faster.
217
327
  *
218
328
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
219
- * for typescript and you get errors like this:
329
+ * for TypeScript and you get errors like this:
220
330
  *
221
331
  * ```
222
332
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
223
333
  * ```
224
334
  *
225
- * In these case you can often use this method to help typescript a little bit. When you use this
335
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
226
336
  * method to assert the output type of a query, Kysely can drop the complex output type that
227
337
  * consists of multiple nested helper types and replace it with the simple asserted type.
228
338
  *
@@ -277,9 +387,11 @@ class UpdateQueryBuilder {
277
387
  */
278
388
  async execute() {
279
389
  const compiledQuery = this.compile();
280
- const query = compiledQuery.query;
281
390
  const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
282
- if (this.#props.executor.adapter.supportsReturning && query.returning) {
391
+ const { adapter } = this.#props.executor;
392
+ const query = compiledQuery.query;
393
+ if ((query.returning && adapter.supportsReturning) ||
394
+ (query.output && adapter.supportsOutput)) {
283
395
  return result.rows;
284
396
  }
285
397
  return [
@@ -1,5 +1,14 @@
1
1
  export declare class UpdateResult {
2
+ /**
3
+ * The number of rows the update query updated (even if not changed).
4
+ */
2
5
  readonly numUpdatedRows: bigint;
6
+ /**
7
+ * The number of rows the update query changed.
8
+ *
9
+ * This is **optional** and only supported in dialects such as MySQL.
10
+ * You would probably use {@link numUpdatedRows} in most cases.
11
+ */
3
12
  readonly numChangedRows?: bigint;
4
13
  constructor(numUpdatedRows: bigint, numChangedRows: bigint | undefined);
5
14
  }
@@ -2,7 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UpdateResult = void 0;
4
4
  class UpdateResult {
5
+ /**
6
+ * The number of rows the update query updated (even if not changed).
7
+ */
5
8
  numUpdatedRows;
9
+ /**
10
+ * The number of rows the update query changed.
11
+ *
12
+ * This is **optional** and only supported in dialects such as MySQL.
13
+ * You would probably use {@link numUpdatedRows} in most cases.
14
+ */
6
15
  numChangedRows;
7
16
  constructor(numUpdatedRows, numChangedRows) {
8
17
  this.numUpdatedRows = numUpdatedRows;
@@ -265,7 +265,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
265
265
  * .selectFrom('person')
266
266
  * .selectAll()
267
267
  * .where(
268
- * sql`coalesce(first_name, last_name)`,
268
+ * sql<string>`coalesce(first_name, last_name)`,
269
269
  * 'like',
270
270
  * '%' + name + '%',
271
271
  * )
@@ -88,7 +88,13 @@ import { JSONPathNode } from '../operation-node/json-path-node.js';
88
88
  import { JSONPathLegNode } from '../operation-node/json-path-leg-node.js';
89
89
  import { JSONOperatorChainNode } from '../operation-node/json-operator-chain-node.js';
90
90
  import { TupleNode } from '../operation-node/tuple-node.js';
91
+ import { MergeQueryNode } from '../operation-node/merge-query-node.js';
92
+ import { MatchedNode } from '../operation-node/matched-node.js';
91
93
  import { AddIndexNode } from '../operation-node/add-index-node.js';
94
+ import { CastNode } from '../operation-node/cast-node.js';
95
+ import { FetchNode } from '../operation-node/fetch-node.js';
96
+ import { TopNode } from '../operation-node/top-node.js';
97
+ import { OutputNode } from '../operation-node/output-node.js';
92
98
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
93
99
  #private;
94
100
  protected get numParameters(): number;
@@ -185,7 +191,13 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
185
191
  protected visitJSONPath(node: JSONPathNode): void;
186
192
  protected visitJSONPathLeg(node: JSONPathLegNode): void;
187
193
  protected visitJSONOperatorChain(node: JSONOperatorChainNode): void;
194
+ protected visitMergeQuery(node: MergeQueryNode): void;
195
+ protected visitMatched(node: MatchedNode): void;
188
196
  protected visitAddIndex(node: AddIndexNode): void;
197
+ protected visitCast(node: CastNode): void;
198
+ protected visitFetch(node: FetchNode): void;
199
+ protected visitOutput(node: OutputNode): void;
200
+ protected visitTop(node: TopNode): void;
189
201
  protected append(str: string): void;
190
202
  protected appendValue(parameter: unknown): void;
191
203
  protected getLeftIdentifierWrapper(): string;
@@ -10,6 +10,7 @@ const query_node_js_1 = require("../operation-node/query-node.js");
10
10
  const object_utils_js_1 = require("../util/object-utils.js");
11
11
  const create_view_node_js_1 = require("../operation-node/create-view-node.js");
12
12
  const set_operation_node_js_1 = require("../operation-node/set-operation-node.js");
13
+ const merge_query_node_js_1 = require("../operation-node/merge-query-node.js");
13
14
  class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisitor {
14
15
  #sql = '';
15
16
  #parameters = [];
@@ -19,6 +20,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
19
20
  compileQuery(node) {
20
21
  this.#sql = '';
21
22
  this.#parameters = [];
23
+ this.nodeStack.splice(0, this.nodeStack.length);
22
24
  this.visitNode(node);
23
25
  return (0, object_utils_js_1.freeze)({
24
26
  query: node,
@@ -56,6 +58,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
56
58
  this.append(' ');
57
59
  this.compileList(node.frontModifiers, ' ');
58
60
  }
61
+ if (node.top) {
62
+ this.append(' ');
63
+ this.visitNode(node.top);
64
+ }
59
65
  if (node.selections) {
60
66
  this.append(' ');
61
67
  this.compileList(node.selections);
@@ -96,6 +102,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
96
102
  this.append(' ');
97
103
  this.visitNode(node.offset);
98
104
  }
105
+ if (node.fetch) {
106
+ this.append(' ');
107
+ this.visitNode(node.fetch);
108
+ }
99
109
  if (node.endModifiers?.length) {
100
110
  this.append(' ');
101
111
  this.compileList(this.sortSelectModifiers([...node.endModifiers]), ' ');
@@ -137,12 +147,13 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
137
147
  this.visitNode(node.having);
138
148
  }
139
149
  visitInsertQuery(node) {
140
- const isSubQuery = this.nodeStack.find(query_node_js_1.QueryNode.is) !== node;
150
+ const rootQueryNode = this.nodeStack.find(query_node_js_1.QueryNode.is);
151
+ const isSubQuery = rootQueryNode !== node;
141
152
  if (!isSubQuery && node.explain) {
142
153
  this.visitNode(node.explain);
143
154
  this.append(' ');
144
155
  }
145
- if (isSubQuery) {
156
+ if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
146
157
  this.append('(');
147
158
  }
148
159
  if (node.with) {
@@ -153,13 +164,23 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
153
164
  if (node.ignore) {
154
165
  this.append(' ignore');
155
166
  }
156
- this.append(' into ');
157
- this.visitNode(node.into);
167
+ if (node.top) {
168
+ this.append(' ');
169
+ this.visitNode(node.top);
170
+ }
171
+ if (node.into) {
172
+ this.append(' into ');
173
+ this.visitNode(node.into);
174
+ }
158
175
  if (node.columns) {
159
176
  this.append(' (');
160
177
  this.compileList(node.columns);
161
178
  this.append(')');
162
179
  }
180
+ if (node.output) {
181
+ this.append(' ');
182
+ this.visitNode(node.output);
183
+ }
163
184
  if (node.values) {
164
185
  this.append(' ');
165
186
  this.visitNode(node.values);
@@ -180,7 +201,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
180
201
  this.append(' ');
181
202
  this.visitNode(node.returning);
182
203
  }
183
- if (isSubQuery) {
204
+ if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
184
205
  this.append(')');
185
206
  }
186
207
  }
@@ -202,7 +223,15 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
202
223
  this.append(' ');
203
224
  }
204
225
  this.append('delete ');
226
+ if (node.top) {
227
+ this.visitNode(node.top);
228
+ this.append(' ');
229
+ }
205
230
  this.visitNode(node.from);
231
+ if (node.output) {
232
+ this.append(' ');
233
+ this.visitNode(node.output);
234
+ }
206
235
  if (node.using) {
207
236
  this.append(' ');
208
237
  this.visitNode(node.using);
@@ -373,6 +402,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
373
402
  }
374
403
  }
375
404
  visitColumnDefinition(node) {
405
+ if (node.ifNotExists) {
406
+ this.append('if not exists ');
407
+ }
376
408
  this.visitNode(node.column);
377
409
  this.append(' ');
378
410
  this.visitNode(node.dataType);
@@ -387,6 +419,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
387
419
  this.append(' ');
388
420
  this.visitNode(node.generated);
389
421
  }
422
+ if (node.identity) {
423
+ this.append(' identity');
424
+ }
390
425
  if (node.defaultTo) {
391
426
  this.append(' ');
392
427
  this.visitNode(node.defaultTo);
@@ -470,12 +505,13 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
470
505
  this.visitNode(node.groupBy);
471
506
  }
472
507
  visitUpdateQuery(node) {
473
- const isSubQuery = this.nodeStack.find(query_node_js_1.QueryNode.is) !== node;
508
+ const rootQueryNode = this.nodeStack.find(query_node_js_1.QueryNode.is);
509
+ const isSubQuery = rootQueryNode !== node;
474
510
  if (!isSubQuery && node.explain) {
475
511
  this.visitNode(node.explain);
476
512
  this.append(' ');
477
513
  }
478
- if (isSubQuery) {
514
+ if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
479
515
  this.append('(');
480
516
  }
481
517
  if (node.with) {
@@ -483,11 +519,22 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
483
519
  this.append(' ');
484
520
  }
485
521
  this.append('update ');
486
- this.visitNode(node.table);
487
- this.append(' set ');
522
+ if (node.top) {
523
+ this.visitNode(node.top);
524
+ this.append(' ');
525
+ }
526
+ if (node.table) {
527
+ this.visitNode(node.table);
528
+ this.append(' ');
529
+ }
530
+ this.append('set ');
488
531
  if (node.updates) {
489
532
  this.compileList(node.updates);
490
533
  }
534
+ if (node.output) {
535
+ this.append(' ');
536
+ this.visitNode(node.output);
537
+ }
491
538
  if (node.from) {
492
539
  this.append(' ');
493
540
  this.visitNode(node.from);
@@ -500,11 +547,15 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
500
547
  this.append(' ');
501
548
  this.visitNode(node.where);
502
549
  }
550
+ if (node.limit) {
551
+ this.append(' ');
552
+ this.visitNode(node.limit);
553
+ }
503
554
  if (node.returning) {
504
555
  this.append(' ');
505
556
  this.visitNode(node.returning);
506
557
  }
507
- if (isSubQuery) {
558
+ if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
508
559
  this.append(')');
509
560
  }
510
561
  }
@@ -1040,6 +1091,40 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
1040
1091
  this.visitNode(node.values[i]);
1041
1092
  }
1042
1093
  }
1094
+ visitMergeQuery(node) {
1095
+ if (node.with) {
1096
+ this.visitNode(node.with);
1097
+ this.append(' ');
1098
+ }
1099
+ this.append('merge ');
1100
+ if (node.top) {
1101
+ this.visitNode(node.top);
1102
+ this.append(' ');
1103
+ }
1104
+ this.append('into ');
1105
+ this.visitNode(node.into);
1106
+ if (node.using) {
1107
+ this.append(' ');
1108
+ this.visitNode(node.using);
1109
+ }
1110
+ if (node.whens) {
1111
+ this.append(' ');
1112
+ this.compileList(node.whens, ' ');
1113
+ }
1114
+ if (node.output) {
1115
+ this.append(' ');
1116
+ this.visitNode(node.output);
1117
+ }
1118
+ }
1119
+ visitMatched(node) {
1120
+ if (node.not) {
1121
+ this.append('not ');
1122
+ }
1123
+ this.append('matched');
1124
+ if (node.bySource) {
1125
+ this.append(' by source');
1126
+ }
1127
+ }
1043
1128
  visitAddIndex(node) {
1044
1129
  this.append('add ');
1045
1130
  if (node.unique) {
@@ -1057,6 +1142,28 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
1057
1142
  this.visitNode(node.using);
1058
1143
  }
1059
1144
  }
1145
+ visitCast(node) {
1146
+ this.append('cast(');
1147
+ this.visitNode(node.expression);
1148
+ this.append(' as ');
1149
+ this.visitNode(node.dataType);
1150
+ this.append(')');
1151
+ }
1152
+ visitFetch(node) {
1153
+ this.append('fetch next ');
1154
+ this.visitNode(node.rowCount);
1155
+ this.append(` rows ${node.modifier}`);
1156
+ }
1157
+ visitOutput(node) {
1158
+ this.append('output ');
1159
+ this.compileList(node.selections);
1160
+ }
1161
+ visitTop(node) {
1162
+ this.append(`top(${node.expression})`);
1163
+ if (node.modifiers) {
1164
+ this.append(` ${node.modifiers}`);
1165
+ }
1166
+ }
1060
1167
  append(str) {
1061
1168
  this.#sql += str;
1062
1169
  }
@@ -1167,4 +1274,5 @@ const JOIN_TYPE_SQL = (0, object_utils_js_1.freeze)({
1167
1274
  FullJoin: 'full join',
1168
1275
  LateralInnerJoin: 'inner join lateral',
1169
1276
  LateralLeftJoin: 'left join lateral',
1277
+ Using: 'using',
1170
1278
  });
@@ -9,10 +9,11 @@ import { DropSchemaNode } from '../operation-node/drop-schema-node.js';
9
9
  import { DropTableNode } from '../operation-node/drop-table-node.js';
10
10
  import { DropTypeNode } from '../operation-node/drop-type-node.js';
11
11
  import { DropViewNode } from '../operation-node/drop-view-node.js';
12
+ import { MergeQueryNode } from '../operation-node/merge-query-node.js';
12
13
  import { QueryNode } from '../operation-node/query-node.js';
13
14
  import { RawNode } from '../operation-node/raw-node.js';
14
15
  import { CompiledQuery } from './compiled-query.js';
15
- export type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode | CreateTypeNode | DropTypeNode;
16
+ export type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode | CreateTypeNode | DropTypeNode | MergeQueryNode;
16
17
  /**
17
18
  * a `QueryCompiler` compiles a query expressed as a tree of `OperationNodes` into SQL.
18
19
  */
@@ -12,6 +12,8 @@ import { UpdateResult } from './query-builder/update-result.js';
12
12
  import { KyselyPlugin } from './plugin/kysely-plugin.js';
13
13
  import { CTEBuilderCallback } from './query-builder/cte-builder.js';
14
14
  import { CallbackSelection, SelectCallback, SelectExpression, Selection } from './parser/select-parser.js';
15
+ import { MergeQueryBuilder } from './query-builder/merge-query-builder.js';
16
+ import { MergeResult } from './query-builder/merge-result.js';
15
17
  export declare class QueryCreator<DB> {
16
18
  #private;
17
19
  constructor(props: QueryCreatorProps);
@@ -123,10 +125,10 @@ export declare class QueryCreator<DB> {
123
125
  * ```
124
126
  */
125
127
  selectFrom<TE extends keyof DB & string>(from: TE[]): SelectQueryBuilder<DB, ExtractTableAlias<DB, TE>, {}>;
126
- selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
128
+ selectFrom<TE extends TableExpression<DB, never>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
127
129
  selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, ExtractTableAlias<DB, TE>, {}>;
128
- selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, ExtractTableAlias<DB, TE>, {}>;
129
- selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
130
+ selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, ExtractTableAlias<DB & PickTableWithAlias<DB, TE>, TE>, {}>;
131
+ selectFrom<TE extends TableExpression<DB, never>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
130
132
  /**
131
133
  * Creates a `select` query builder without a `from` clause.
132
134
  *
@@ -320,31 +322,120 @@ export declare class QueryCreator<DB> {
320
322
  * ```
321
323
  */
322
324
  updateTable<TR extends keyof DB & string>(table: TR): UpdateQueryBuilder<DB, ExtractTableAlias<DB, TR>, ExtractTableAlias<DB, TR>, UpdateResult>;
323
- updateTable<TR extends AnyAliasedTable<DB>>(table: TR): UpdateQueryBuilder<DB & PickTableWithAlias<DB, TR>, ExtractTableAlias<DB, TR>, ExtractTableAlias<DB, TR>, UpdateResult>;
325
+ updateTable<TR extends AnyAliasedTable<DB>>(table: TR): UpdateQueryBuilder<DB & PickTableWithAlias<DB, TR>, ExtractTableAlias<DB & PickTableWithAlias<DB, TR>, TR>, ExtractTableAlias<DB & PickTableWithAlias<DB, TR>, TR>, UpdateResult>;
324
326
  updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<From<DB, TR>, FromTables<DB, never, TR>, FromTables<DB, never, TR>, UpdateResult>;
327
+ /**
328
+ * Creates a merge query.
329
+ *
330
+ * The return value of the query is a {@link MergeResult}.
331
+ *
332
+ * See the {@link MergeQueryBuilder.using} method for examples on how to specify
333
+ * the other table.
334
+ *
335
+ * ### Examples
336
+ *
337
+ * ```ts
338
+ * const result = await db
339
+ * .mergeInto('person')
340
+ * .using('pet', 'pet.owner_id', 'person.id')
341
+ * .whenMatched((and) => and('has_pets', '!=', 'Y'))
342
+ * .thenUpdateSet({ has_pets: 'Y' })
343
+ * .whenNotMatched()
344
+ * .thenDoNothing()
345
+ * .executeTakeFirstOrThrow()
346
+ *
347
+ * console.log(result.numChangedRows)
348
+ * ```
349
+ *
350
+ * The generated SQL (PostgreSQL):
351
+ *
352
+ * ```sql
353
+ * merge into "person"
354
+ * using "pet" on "pet"."owner_id" = "person"."id"
355
+ * when matched and "has_pets" != $1 then
356
+ * update set "has_pets" = $2
357
+ * when not matched then
358
+ * do nothing
359
+ * ```
360
+ */
361
+ mergeInto<TR extends keyof DB & string>(targetTable: TR): MergeQueryBuilder<DB, TR, MergeResult>;
362
+ mergeInto<TR extends AnyAliasedTable<DB>>(targetTable: TR): MergeQueryBuilder<DB & PickTableWithAlias<DB, TR>, ExtractTableAlias<DB & PickTableWithAlias<DB, TR>, TR>, MergeResult>;
325
363
  /**
326
364
  * Creates a `with` query (Common Table Expression).
327
365
  *
328
366
  * ### Examples
329
367
  *
368
+ * <!-- siteExample("cte", "Simple selects", 10) -->
369
+ *
370
+ * Common table expressions (CTE) are a great way to modularize complex queries.
371
+ * Essentially they allow you to run multiple separate queries within a
372
+ * single roundtrip to the DB.
373
+ *
374
+ * Since CTEs are a part of the main query, query optimizers inside DB
375
+ * engines are able to optimize the overall query. For example, postgres
376
+ * is able to inline the CTEs inside the using queries if it decides it's
377
+ * faster.
378
+ *
330
379
  * ```ts
331
- * await db
380
+ * const result = await db
381
+ * // Create a CTE called `jennifers` that selects all
382
+ * // persons named 'Jennifer'.
332
383
  * .with('jennifers', (db) => db
333
384
  * .selectFrom('person')
334
385
  * .where('first_name', '=', 'Jennifer')
335
386
  * .select(['id', 'age'])
336
387
  * )
388
+ * // Select all rows from the `jennifers` CTE and
389
+ * // further filter it.
337
390
  * .with('adult_jennifers', (db) => db
338
391
  * .selectFrom('jennifers')
339
392
  * .where('age', '>', 18)
340
393
  * .select(['id', 'age'])
341
394
  * )
395
+ * // Finally select all adult jennifers that are
396
+ * // also younger than 60.
342
397
  * .selectFrom('adult_jennifers')
343
398
  * .where('age', '<', 60)
344
399
  * .selectAll()
345
400
  * .execute()
346
401
  * ```
347
402
  *
403
+ * <!-- siteExample("cte", "Inserts, updates and deletions", 20) -->
404
+ *
405
+ * Some databases like postgres also allow you to run other queries than selects
406
+ * in CTEs. On these databases CTEs are extremely powerful:
407
+ *
408
+ * ```ts
409
+ * const result = await db
410
+ * .with('new_person', (db) => db
411
+ * .insertInto('person')
412
+ * .values({
413
+ * first_name: 'Jennifer',
414
+ * age: 35,
415
+ * })
416
+ * .returning('id')
417
+ * )
418
+ * .with('new_pet', (db) => db
419
+ * .insertInto('pet')
420
+ * .values({
421
+ * name: 'Doggo',
422
+ * species: 'dog',
423
+ * is_favorite: true,
424
+ * // Use the id of the person we just inserted.
425
+ * owner_id: db
426
+ * .selectFrom('new_person')
427
+ * .select('id')
428
+ * })
429
+ * .returning('id')
430
+ * )
431
+ * .selectFrom(['new_person', 'new_pet'])
432
+ * .select([
433
+ * 'new_person.id as person_id',
434
+ * 'new_pet.id as pet_id'
435
+ * ])
436
+ * .execute()
437
+ * ```
438
+ *
348
439
  * The CTE name can optionally specify column names in addition to
349
440
  * a name. In that case Kysely requires the expression to retun
350
441
  * rows with the same columns.