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
@@ -10,6 +10,9 @@ import { freeze } from '../util/object-utils.js';
10
10
  import { UpdateResult } from './update-result.js';
11
11
  import { isNoResultErrorConstructor, NoResultError, } from './no-result-error.js';
12
12
  import { parseReferentialBinaryOperation, parseValueBinaryOperationOrExpression, } from '../parser/binary-operation-parser.js';
13
+ import { parseValueExpression, } from '../parser/value-parser.js';
14
+ import { LimitNode } from '../operation-node/limit-node.js';
15
+ import { parseTop } from '../parser/top-parser.js';
13
16
  export class UpdateQueryBuilder {
14
17
  #props;
15
18
  constructor(props) {
@@ -33,6 +36,51 @@ export class UpdateQueryBuilder {
33
36
  queryNode: QueryNode.cloneWithoutWhere(this.#props.queryNode),
34
37
  });
35
38
  }
39
+ /**
40
+ * Changes an `update` query into a `update top` query.
41
+ *
42
+ * `top` clause is only supported by some dialects like MS SQL Server.
43
+ *
44
+ * ### Examples
45
+ *
46
+ * Update the first row:
47
+ *
48
+ * ```ts
49
+ * await db.updateTable('person')
50
+ * .top(1)
51
+ * .set({ first_name: 'Foo' })
52
+ * .where('age', '>', 18)
53
+ * .executeTakeFirstOrThrow()
54
+ * ```
55
+ *
56
+ * The generated SQL (MS SQL Server):
57
+ *
58
+ * ```sql
59
+ * update top(1) "person" set "first_name" = @1 where "age" > @2
60
+ * ```
61
+ *
62
+ * Update the 50% first rows:
63
+ *
64
+ * ```ts
65
+ * await db.updateTable('person')
66
+ * .top(50, 'percent')
67
+ * .set({ first_name: 'Foo' })
68
+ * .where('age', '>', 18)
69
+ * .executeTakeFirstOrThrow()
70
+ * ```
71
+ *
72
+ * The generated SQL (MS SQL Server):
73
+ *
74
+ * ```sql
75
+ * update top(50) percent "person" set "first_name" = @1 where "age" > @2
76
+ * ```
77
+ */
78
+ top(expression, modifiers) {
79
+ return new UpdateQueryBuilder({
80
+ ...this.#props,
81
+ queryNode: QueryNode.cloneWithTop(this.#props.queryNode, parseTop(expression, modifiers)),
82
+ });
83
+ }
36
84
  from(from) {
37
85
  return new UpdateQueryBuilder({
38
86
  ...this.#props,
@@ -63,6 +111,31 @@ export class UpdateQueryBuilder {
63
111
  queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin('FullJoin', args)),
64
112
  });
65
113
  }
114
+ /**
115
+ * Adds a limit clause to the update query for supported databases, such as MySQL.
116
+ *
117
+ * ### Examples
118
+ *
119
+ * Update the first 2 rows in the 'person' table:
120
+ *
121
+ * ```ts
122
+ * return await db
123
+ * .updateTable('person')
124
+ * .set({ first_name: 'Foo' })
125
+ * .limit(2);
126
+ * ```
127
+ *
128
+ * The generated SQL (MySQL):
129
+ * ```sql
130
+ * update `person` set `first_name` = 'Foo' limit 2
131
+ * ```
132
+ */
133
+ limit(limit) {
134
+ return new UpdateQueryBuilder({
135
+ ...this.#props,
136
+ queryNode: UpdateQueryNode.cloneWithLimit(this.#props.queryNode, LimitNode.create(parseValueExpression(limit))),
137
+ });
138
+ }
66
139
  set(...args) {
67
140
  return new UpdateQueryBuilder({
68
141
  ...this.#props,
@@ -75,10 +148,47 @@ export class UpdateQueryBuilder {
75
148
  queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectArg(selection)),
76
149
  });
77
150
  }
78
- returningAll() {
151
+ returningAll(table) {
152
+ return new UpdateQueryBuilder({
153
+ ...this.#props,
154
+ queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll(table)),
155
+ });
156
+ }
157
+ output(args) {
158
+ return new UpdateQueryBuilder({
159
+ ...this.#props,
160
+ queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
161
+ });
162
+ }
163
+ outputAll(table) {
164
+ return new UpdateQueryBuilder({
165
+ ...this.#props,
166
+ queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
167
+ });
168
+ }
169
+ /**
170
+ * Clears all `returning` clauses from the query.
171
+ *
172
+ * ### Examples
173
+ *
174
+ * ```ts
175
+ * db.updateTable('person')
176
+ * .returningAll()
177
+ * .set({ age: 39 })
178
+ * .where('first_name', '=', 'John')
179
+ * .clearReturning()
180
+ * ```
181
+ *
182
+ * The generated SQL(PostgreSQL):
183
+ *
184
+ * ```sql
185
+ * update "person" set "age" = 39 where "first_name" = "John"
186
+ * ```
187
+ */
188
+ clearReturning() {
79
189
  return new UpdateQueryBuilder({
80
190
  ...this.#props,
81
- queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll()),
191
+ queryNode: QueryNode.cloneWithoutReturning(this.#props.queryNode),
82
192
  });
83
193
  }
84
194
  /**
@@ -210,17 +320,17 @@ export class UpdateQueryBuilder {
210
320
  /**
211
321
  * Asserts that query's output row type equals the given type `T`.
212
322
  *
213
- * This method can be used to simplify excessively complex types to make typescript happy
323
+ * This method can be used to simplify excessively complex types to make TypeScript happy
214
324
  * and much faster.
215
325
  *
216
326
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
217
- * for typescript and you get errors like this:
327
+ * for TypeScript and you get errors like this:
218
328
  *
219
329
  * ```
220
330
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
221
331
  * ```
222
332
  *
223
- * In these case you can often use this method to help typescript a little bit. When you use this
333
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
224
334
  * method to assert the output type of a query, Kysely can drop the complex output type that
225
335
  * consists of multiple nested helper types and replace it with the simple asserted type.
226
336
  *
@@ -275,9 +385,11 @@ export class UpdateQueryBuilder {
275
385
  */
276
386
  async execute() {
277
387
  const compiledQuery = this.compile();
278
- const query = compiledQuery.query;
279
388
  const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
280
- if (this.#props.executor.adapter.supportsReturning && query.returning) {
389
+ const { adapter } = this.#props.executor;
390
+ const query = compiledQuery.query;
391
+ if ((query.returning && adapter.supportsReturning) ||
392
+ (query.output && adapter.supportsOutput)) {
281
393
  return result.rows;
282
394
  }
283
395
  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
  }
@@ -1,6 +1,15 @@
1
1
  /// <reference types="./update-result.d.ts" />
2
2
  export class UpdateResult {
3
+ /**
4
+ * The number of rows the update query updated (even if not changed).
5
+ */
3
6
  numUpdatedRows;
7
+ /**
8
+ * The number of rows the update query changed.
9
+ *
10
+ * This is **optional** and only supported in dialects such as MySQL.
11
+ * You would probably use {@link numUpdatedRows} in most cases.
12
+ */
4
13
  numChangedRows;
5
14
  constructor(numUpdatedRows, numChangedRows) {
6
15
  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;
@@ -8,6 +8,7 @@ import { QueryNode } from '../operation-node/query-node.js';
8
8
  import { freeze, isString, isNumber, isBoolean, isNull, isDate, isBigInt, } from '../util/object-utils.js';
9
9
  import { CreateViewNode } from '../operation-node/create-view-node.js';
10
10
  import { SetOperationNode } from '../operation-node/set-operation-node.js';
11
+ import { MergeQueryNode } from '../operation-node/merge-query-node.js';
11
12
  export class DefaultQueryCompiler extends OperationNodeVisitor {
12
13
  #sql = '';
13
14
  #parameters = [];
@@ -17,6 +18,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
17
18
  compileQuery(node) {
18
19
  this.#sql = '';
19
20
  this.#parameters = [];
21
+ this.nodeStack.splice(0, this.nodeStack.length);
20
22
  this.visitNode(node);
21
23
  return freeze({
22
24
  query: node,
@@ -54,6 +56,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
54
56
  this.append(' ');
55
57
  this.compileList(node.frontModifiers, ' ');
56
58
  }
59
+ if (node.top) {
60
+ this.append(' ');
61
+ this.visitNode(node.top);
62
+ }
57
63
  if (node.selections) {
58
64
  this.append(' ');
59
65
  this.compileList(node.selections);
@@ -94,6 +100,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
94
100
  this.append(' ');
95
101
  this.visitNode(node.offset);
96
102
  }
103
+ if (node.fetch) {
104
+ this.append(' ');
105
+ this.visitNode(node.fetch);
106
+ }
97
107
  if (node.endModifiers?.length) {
98
108
  this.append(' ');
99
109
  this.compileList(this.sortSelectModifiers([...node.endModifiers]), ' ');
@@ -135,12 +145,13 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
135
145
  this.visitNode(node.having);
136
146
  }
137
147
  visitInsertQuery(node) {
138
- const isSubQuery = this.nodeStack.find(QueryNode.is) !== node;
148
+ const rootQueryNode = this.nodeStack.find(QueryNode.is);
149
+ const isSubQuery = rootQueryNode !== node;
139
150
  if (!isSubQuery && node.explain) {
140
151
  this.visitNode(node.explain);
141
152
  this.append(' ');
142
153
  }
143
- if (isSubQuery) {
154
+ if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
144
155
  this.append('(');
145
156
  }
146
157
  if (node.with) {
@@ -151,13 +162,23 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
151
162
  if (node.ignore) {
152
163
  this.append(' ignore');
153
164
  }
154
- this.append(' into ');
155
- this.visitNode(node.into);
165
+ if (node.top) {
166
+ this.append(' ');
167
+ this.visitNode(node.top);
168
+ }
169
+ if (node.into) {
170
+ this.append(' into ');
171
+ this.visitNode(node.into);
172
+ }
156
173
  if (node.columns) {
157
174
  this.append(' (');
158
175
  this.compileList(node.columns);
159
176
  this.append(')');
160
177
  }
178
+ if (node.output) {
179
+ this.append(' ');
180
+ this.visitNode(node.output);
181
+ }
161
182
  if (node.values) {
162
183
  this.append(' ');
163
184
  this.visitNode(node.values);
@@ -178,7 +199,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
178
199
  this.append(' ');
179
200
  this.visitNode(node.returning);
180
201
  }
181
- if (isSubQuery) {
202
+ if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
182
203
  this.append(')');
183
204
  }
184
205
  }
@@ -200,7 +221,15 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
200
221
  this.append(' ');
201
222
  }
202
223
  this.append('delete ');
224
+ if (node.top) {
225
+ this.visitNode(node.top);
226
+ this.append(' ');
227
+ }
203
228
  this.visitNode(node.from);
229
+ if (node.output) {
230
+ this.append(' ');
231
+ this.visitNode(node.output);
232
+ }
204
233
  if (node.using) {
205
234
  this.append(' ');
206
235
  this.visitNode(node.using);
@@ -371,6 +400,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
371
400
  }
372
401
  }
373
402
  visitColumnDefinition(node) {
403
+ if (node.ifNotExists) {
404
+ this.append('if not exists ');
405
+ }
374
406
  this.visitNode(node.column);
375
407
  this.append(' ');
376
408
  this.visitNode(node.dataType);
@@ -385,6 +417,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
385
417
  this.append(' ');
386
418
  this.visitNode(node.generated);
387
419
  }
420
+ if (node.identity) {
421
+ this.append(' identity');
422
+ }
388
423
  if (node.defaultTo) {
389
424
  this.append(' ');
390
425
  this.visitNode(node.defaultTo);
@@ -468,12 +503,13 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
468
503
  this.visitNode(node.groupBy);
469
504
  }
470
505
  visitUpdateQuery(node) {
471
- const isSubQuery = this.nodeStack.find(QueryNode.is) !== node;
506
+ const rootQueryNode = this.nodeStack.find(QueryNode.is);
507
+ const isSubQuery = rootQueryNode !== node;
472
508
  if (!isSubQuery && node.explain) {
473
509
  this.visitNode(node.explain);
474
510
  this.append(' ');
475
511
  }
476
- if (isSubQuery) {
512
+ if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
477
513
  this.append('(');
478
514
  }
479
515
  if (node.with) {
@@ -481,11 +517,22 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
481
517
  this.append(' ');
482
518
  }
483
519
  this.append('update ');
484
- this.visitNode(node.table);
485
- this.append(' set ');
520
+ if (node.top) {
521
+ this.visitNode(node.top);
522
+ this.append(' ');
523
+ }
524
+ if (node.table) {
525
+ this.visitNode(node.table);
526
+ this.append(' ');
527
+ }
528
+ this.append('set ');
486
529
  if (node.updates) {
487
530
  this.compileList(node.updates);
488
531
  }
532
+ if (node.output) {
533
+ this.append(' ');
534
+ this.visitNode(node.output);
535
+ }
489
536
  if (node.from) {
490
537
  this.append(' ');
491
538
  this.visitNode(node.from);
@@ -498,11 +545,15 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
498
545
  this.append(' ');
499
546
  this.visitNode(node.where);
500
547
  }
548
+ if (node.limit) {
549
+ this.append(' ');
550
+ this.visitNode(node.limit);
551
+ }
501
552
  if (node.returning) {
502
553
  this.append(' ');
503
554
  this.visitNode(node.returning);
504
555
  }
505
- if (isSubQuery) {
556
+ if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
506
557
  this.append(')');
507
558
  }
508
559
  }
@@ -1038,6 +1089,40 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
1038
1089
  this.visitNode(node.values[i]);
1039
1090
  }
1040
1091
  }
1092
+ visitMergeQuery(node) {
1093
+ if (node.with) {
1094
+ this.visitNode(node.with);
1095
+ this.append(' ');
1096
+ }
1097
+ this.append('merge ');
1098
+ if (node.top) {
1099
+ this.visitNode(node.top);
1100
+ this.append(' ');
1101
+ }
1102
+ this.append('into ');
1103
+ this.visitNode(node.into);
1104
+ if (node.using) {
1105
+ this.append(' ');
1106
+ this.visitNode(node.using);
1107
+ }
1108
+ if (node.whens) {
1109
+ this.append(' ');
1110
+ this.compileList(node.whens, ' ');
1111
+ }
1112
+ if (node.output) {
1113
+ this.append(' ');
1114
+ this.visitNode(node.output);
1115
+ }
1116
+ }
1117
+ visitMatched(node) {
1118
+ if (node.not) {
1119
+ this.append('not ');
1120
+ }
1121
+ this.append('matched');
1122
+ if (node.bySource) {
1123
+ this.append(' by source');
1124
+ }
1125
+ }
1041
1126
  visitAddIndex(node) {
1042
1127
  this.append('add ');
1043
1128
  if (node.unique) {
@@ -1055,6 +1140,28 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
1055
1140
  this.visitNode(node.using);
1056
1141
  }
1057
1142
  }
1143
+ visitCast(node) {
1144
+ this.append('cast(');
1145
+ this.visitNode(node.expression);
1146
+ this.append(' as ');
1147
+ this.visitNode(node.dataType);
1148
+ this.append(')');
1149
+ }
1150
+ visitFetch(node) {
1151
+ this.append('fetch next ');
1152
+ this.visitNode(node.rowCount);
1153
+ this.append(` rows ${node.modifier}`);
1154
+ }
1155
+ visitOutput(node) {
1156
+ this.append('output ');
1157
+ this.compileList(node.selections);
1158
+ }
1159
+ visitTop(node) {
1160
+ this.append(`top(${node.expression})`);
1161
+ if (node.modifiers) {
1162
+ this.append(` ${node.modifiers}`);
1163
+ }
1164
+ }
1058
1165
  append(str) {
1059
1166
  this.#sql += str;
1060
1167
  }
@@ -1164,4 +1271,5 @@ const JOIN_TYPE_SQL = freeze({
1164
1271
  FullJoin: 'full join',
1165
1272
  LateralInnerJoin: 'inner join lateral',
1166
1273
  LateralLeftJoin: 'left join lateral',
1274
+ Using: 'using',
1167
1275
  });
@@ -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.