kysely 0.11.2 → 0.12.1

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 (246) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/dialect/dialect-adapter-base.d.ts +36 -0
  3. package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +36 -0
  4. package/dist/cjs/dialect/mysql/mysql-dialect.d.ts +16 -0
  5. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +29 -0
  6. package/dist/cjs/dialect/mysql/mysql-introspector.d.ts +3 -0
  7. package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +0 -2
  8. package/dist/cjs/dialect/mysql/mysql-query-compiler.js +0 -6
  9. package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +36 -0
  10. package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +16 -0
  11. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +29 -0
  12. package/dist/cjs/dialect/postgres/postgres-introspector.d.ts +3 -0
  13. package/dist/cjs/dialect/postgres/postgres-query-compiler.d.ts +3 -0
  14. package/dist/cjs/dialect/postgres/postgres-query-compiler.js +9 -1
  15. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +36 -0
  16. package/dist/cjs/dialect/sqlite/sqlite-adapter.js +6 -2
  17. package/dist/cjs/dialect/sqlite/sqlite-dialect.d.ts +16 -0
  18. package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +29 -0
  19. package/dist/cjs/dialect/sqlite/sqlite-introspector.d.ts +3 -0
  20. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +2 -2
  21. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +6 -6
  22. package/dist/cjs/driver/default-connection-provider.d.ts +4 -0
  23. package/dist/cjs/driver/runtime-driver.d.ts +29 -0
  24. package/dist/cjs/driver/runtime-driver.js +1 -1
  25. package/dist/cjs/driver/single-connection-provider.d.ts +4 -0
  26. package/dist/cjs/dynamic/dynamic-reference-builder.d.ts +1 -0
  27. package/dist/cjs/dynamic/dynamic-reference-builder.js +9 -1
  28. package/dist/cjs/dynamic/dynamic.d.ts +6 -7
  29. package/dist/cjs/dynamic/dynamic.js +6 -7
  30. package/dist/cjs/index.d.ts +14 -3
  31. package/dist/cjs/index.js +12 -1
  32. package/dist/cjs/kysely.d.ts +39 -15
  33. package/dist/cjs/kysely.js +32 -9
  34. package/dist/cjs/migration/migration.d.ts +2 -2
  35. package/dist/cjs/operation-node/create-table-node.d.ts +6 -2
  36. package/dist/cjs/operation-node/create-table-node.js +6 -6
  37. package/dist/cjs/operation-node/create-view-node.d.ts +1 -0
  38. package/dist/cjs/operation-node/insert-query-node.d.ts +4 -4
  39. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  40. package/dist/cjs/operation-node/operation-node-transformer.js +11 -1
  41. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  42. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  43. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  44. package/dist/cjs/operation-node/query-node.d.ts +0 -2
  45. package/dist/cjs/operation-node/query-node.js +0 -10
  46. package/dist/cjs/operation-node/values-node.d.ts +15 -0
  47. package/dist/cjs/operation-node/values-node.js +18 -0
  48. package/dist/cjs/package.json +1 -3
  49. package/dist/cjs/parser/complex-expression-parser.d.ts +9 -0
  50. package/dist/cjs/parser/complex-expression-parser.js +25 -0
  51. package/dist/cjs/parser/filter-parser.d.ts +13 -4
  52. package/dist/cjs/parser/filter-parser.js +21 -24
  53. package/dist/cjs/parser/insert-values-parser.d.ts +7 -10
  54. package/dist/cjs/parser/insert-values-parser.js +31 -39
  55. package/dist/cjs/parser/order-by-parser.d.ts +1 -1
  56. package/dist/cjs/parser/parse-context.d.ts +22 -8
  57. package/dist/cjs/parser/parse-context.js +10 -10
  58. package/dist/cjs/parser/reference-parser.d.ts +8 -7
  59. package/dist/cjs/parser/reference-parser.js +8 -17
  60. package/dist/cjs/parser/returning-parser.d.ts +1 -5
  61. package/dist/cjs/parser/select-parser.d.ts +12 -14
  62. package/dist/cjs/parser/select-parser.js +5 -9
  63. package/dist/cjs/parser/table-parser.d.ts +9 -11
  64. package/dist/cjs/parser/table-parser.js +2 -8
  65. package/dist/cjs/parser/union-parser.d.ts +2 -2
  66. package/dist/cjs/parser/union-parser.js +1 -6
  67. package/dist/cjs/parser/update-set-parser.d.ts +2 -8
  68. package/dist/cjs/parser/update-set-parser.js +6 -26
  69. package/dist/cjs/parser/value-parser.d.ts +9 -6
  70. package/dist/cjs/parser/value-parser.js +7 -30
  71. package/dist/cjs/parser/with-parser.d.ts +6 -3
  72. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +34 -0
  73. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.d.ts +34 -0
  74. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
  75. package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +34 -0
  76. package/dist/cjs/query-builder/delete-query-builder.d.ts +647 -0
  77. package/dist/cjs/query-builder/delete-query-builder.js +185 -0
  78. package/dist/cjs/query-builder/expression-builder.d.ts +8 -6
  79. package/dist/cjs/query-builder/expression-builder.js +3 -3
  80. package/dist/cjs/query-builder/function-builder.d.ts +2 -1
  81. package/dist/cjs/query-builder/function-builder.js +2 -1
  82. package/dist/cjs/query-builder/having-interface.d.ts +49 -0
  83. package/dist/cjs/query-builder/having-interface.js +2 -0
  84. package/dist/cjs/query-builder/insert-query-builder.d.ts +504 -0
  85. package/dist/cjs/query-builder/insert-query-builder.js +256 -0
  86. package/dist/cjs/query-builder/insert-result.d.ts +3 -2
  87. package/dist/cjs/query-builder/insert-result.js +3 -2
  88. package/dist/cjs/query-builder/join-builder.d.ts +19 -20
  89. package/dist/cjs/query-builder/join-builder.js +12 -12
  90. package/dist/cjs/query-builder/join-interface.d.ts +130 -0
  91. package/dist/cjs/query-builder/join-interface.js +2 -0
  92. package/dist/cjs/query-builder/no-result-error.d.ts +9 -0
  93. package/dist/cjs/query-builder/no-result-error.js +14 -0
  94. package/dist/cjs/query-builder/returning-interface.d.ts +73 -0
  95. package/dist/cjs/query-builder/returning-interface.js +2 -0
  96. package/dist/cjs/query-builder/{query-builder.d.ts → select-query-builder.d.ts} +145 -634
  97. package/dist/cjs/query-builder/select-query-builder.js +571 -0
  98. package/dist/cjs/query-builder/update-query-builder.d.ts +735 -0
  99. package/dist/cjs/query-builder/update-query-builder.js +279 -0
  100. package/dist/cjs/query-builder/where-interface.d.ts +378 -0
  101. package/dist/cjs/query-builder/where-interface.js +2 -0
  102. package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
  103. package/dist/cjs/query-compiler/default-query-compiler.js +22 -5
  104. package/dist/cjs/query-creator.d.ts +42 -40
  105. package/dist/cjs/query-creator.js +33 -28
  106. package/dist/cjs/query-executor/query-executor.d.ts +1 -1
  107. package/dist/cjs/query-executor/query-executor.js +1 -1
  108. package/dist/cjs/raw-builder/raw-builder.d.ts +2 -0
  109. package/dist/cjs/raw-builder/raw-builder.js +6 -0
  110. package/dist/cjs/schema/alter-table-builder.d.ts +218 -2
  111. package/dist/cjs/schema/column-definition-builder.d.ts +135 -20
  112. package/dist/cjs/schema/create-index-builder.d.ts +2 -1
  113. package/dist/cjs/schema/create-index-builder.js +2 -1
  114. package/dist/cjs/schema/create-table-builder.d.ts +26 -9
  115. package/dist/cjs/schema/create-table-builder.js +42 -9
  116. package/dist/cjs/schema/create-view-builder.d.ts +17 -3
  117. package/dist/cjs/schema/create-view-builder.js +25 -16
  118. package/dist/cjs/schema/schema.d.ts +18 -11
  119. package/dist/cjs/schema/schema.js +18 -11
  120. package/dist/cjs/util/log.d.ts +11 -8
  121. package/dist/cjs/util/log.js +25 -12
  122. package/dist/cjs/util/type-utils.d.ts +7 -7
  123. package/dist/esm/dialect/dialect-adapter-base.d.ts +36 -0
  124. package/dist/esm/dialect/mysql/mysql-adapter.d.ts +36 -0
  125. package/dist/esm/dialect/mysql/mysql-dialect.d.ts +16 -0
  126. package/dist/esm/dialect/mysql/mysql-driver.d.ts +29 -0
  127. package/dist/esm/dialect/mysql/mysql-introspector.d.ts +3 -0
  128. package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +0 -2
  129. package/dist/esm/dialect/mysql/mysql-query-compiler.js +0 -6
  130. package/dist/esm/dialect/postgres/postgres-adapter.d.ts +36 -0
  131. package/dist/esm/dialect/postgres/postgres-dialect.d.ts +16 -0
  132. package/dist/esm/dialect/postgres/postgres-driver.d.ts +29 -0
  133. package/dist/esm/dialect/postgres/postgres-introspector.d.ts +3 -0
  134. package/dist/esm/dialect/postgres/postgres-query-compiler.d.ts +3 -0
  135. package/dist/esm/dialect/postgres/postgres-query-compiler.js +9 -1
  136. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +36 -0
  137. package/dist/esm/dialect/sqlite/sqlite-adapter.js +6 -2
  138. package/dist/esm/dialect/sqlite/sqlite-dialect.d.ts +16 -0
  139. package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +29 -0
  140. package/dist/esm/dialect/sqlite/sqlite-introspector.d.ts +3 -0
  141. package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +2 -2
  142. package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +6 -6
  143. package/dist/esm/driver/default-connection-provider.d.ts +4 -0
  144. package/dist/esm/driver/runtime-driver.d.ts +29 -0
  145. package/dist/esm/driver/runtime-driver.js +1 -1
  146. package/dist/esm/driver/single-connection-provider.d.ts +4 -0
  147. package/dist/esm/dynamic/dynamic-reference-builder.d.ts +1 -0
  148. package/dist/esm/dynamic/dynamic-reference-builder.js +7 -0
  149. package/dist/esm/dynamic/dynamic.d.ts +6 -7
  150. package/dist/esm/dynamic/dynamic.js +6 -7
  151. package/dist/esm/index.d.ts +14 -3
  152. package/dist/esm/index.js +12 -1
  153. package/dist/esm/kysely.d.ts +39 -15
  154. package/dist/esm/kysely.js +32 -9
  155. package/dist/esm/migration/migration.d.ts +2 -2
  156. package/dist/esm/operation-node/create-table-node.d.ts +6 -2
  157. package/dist/esm/operation-node/create-table-node.js +6 -6
  158. package/dist/esm/operation-node/create-view-node.d.ts +1 -0
  159. package/dist/esm/operation-node/insert-query-node.d.ts +4 -4
  160. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  161. package/dist/esm/operation-node/operation-node-transformer.js +11 -1
  162. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  163. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  164. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  165. package/dist/esm/operation-node/query-node.d.ts +0 -2
  166. package/dist/esm/operation-node/query-node.js +0 -10
  167. package/dist/esm/operation-node/values-node.d.ts +15 -0
  168. package/dist/esm/operation-node/values-node.js +15 -0
  169. package/dist/esm/package.json +1 -3
  170. package/dist/esm/parser/complex-expression-parser.d.ts +9 -0
  171. package/dist/esm/parser/complex-expression-parser.js +20 -0
  172. package/dist/esm/parser/filter-parser.d.ts +13 -4
  173. package/dist/esm/parser/filter-parser.js +21 -24
  174. package/dist/esm/parser/insert-values-parser.d.ts +7 -10
  175. package/dist/esm/parser/insert-values-parser.js +31 -38
  176. package/dist/esm/parser/order-by-parser.d.ts +1 -1
  177. package/dist/esm/parser/parse-context.d.ts +22 -8
  178. package/dist/esm/parser/parse-context.js +10 -10
  179. package/dist/esm/parser/reference-parser.d.ts +8 -7
  180. package/dist/esm/parser/reference-parser.js +9 -18
  181. package/dist/esm/parser/returning-parser.d.ts +1 -5
  182. package/dist/esm/parser/select-parser.d.ts +12 -14
  183. package/dist/esm/parser/select-parser.js +6 -10
  184. package/dist/esm/parser/table-parser.d.ts +9 -11
  185. package/dist/esm/parser/table-parser.js +3 -9
  186. package/dist/esm/parser/union-parser.d.ts +2 -2
  187. package/dist/esm/parser/union-parser.js +1 -6
  188. package/dist/esm/parser/update-set-parser.d.ts +2 -8
  189. package/dist/esm/parser/update-set-parser.js +5 -24
  190. package/dist/esm/parser/value-parser.d.ts +9 -6
  191. package/dist/esm/parser/value-parser.js +8 -31
  192. package/dist/esm/parser/with-parser.d.ts +6 -3
  193. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +34 -0
  194. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.d.ts +34 -0
  195. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
  196. package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +34 -0
  197. package/dist/esm/query-builder/delete-query-builder.d.ts +647 -0
  198. package/dist/esm/query-builder/delete-query-builder.js +181 -0
  199. package/dist/esm/query-builder/expression-builder.d.ts +8 -6
  200. package/dist/esm/query-builder/expression-builder.js +3 -3
  201. package/dist/esm/query-builder/function-builder.d.ts +2 -1
  202. package/dist/esm/query-builder/function-builder.js +2 -1
  203. package/dist/esm/query-builder/having-interface.d.ts +49 -0
  204. package/dist/esm/query-builder/having-interface.js +1 -0
  205. package/dist/esm/query-builder/insert-query-builder.d.ts +504 -0
  206. package/dist/esm/query-builder/insert-query-builder.js +252 -0
  207. package/dist/esm/query-builder/insert-result.d.ts +3 -2
  208. package/dist/esm/query-builder/insert-result.js +3 -2
  209. package/dist/esm/query-builder/join-builder.d.ts +19 -20
  210. package/dist/esm/query-builder/join-builder.js +12 -12
  211. package/dist/esm/query-builder/join-interface.d.ts +130 -0
  212. package/dist/esm/query-builder/join-interface.js +1 -0
  213. package/dist/esm/query-builder/no-result-error.d.ts +9 -0
  214. package/dist/esm/query-builder/no-result-error.js +10 -0
  215. package/dist/esm/query-builder/returning-interface.d.ts +73 -0
  216. package/dist/esm/query-builder/returning-interface.js +1 -0
  217. package/dist/esm/query-builder/{query-builder.d.ts → select-query-builder.d.ts} +145 -634
  218. package/dist/esm/query-builder/select-query-builder.js +566 -0
  219. package/dist/esm/query-builder/update-query-builder.d.ts +735 -0
  220. package/dist/esm/query-builder/update-query-builder.js +275 -0
  221. package/dist/esm/query-builder/where-interface.d.ts +378 -0
  222. package/dist/esm/query-builder/where-interface.js +1 -0
  223. package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
  224. package/dist/esm/query-compiler/default-query-compiler.js +22 -5
  225. package/dist/esm/query-creator.d.ts +42 -40
  226. package/dist/esm/query-creator.js +33 -28
  227. package/dist/esm/query-executor/query-executor.d.ts +1 -1
  228. package/dist/esm/query-executor/query-executor.js +1 -1
  229. package/dist/esm/raw-builder/raw-builder.d.ts +2 -0
  230. package/dist/esm/raw-builder/raw-builder.js +6 -0
  231. package/dist/esm/schema/alter-table-builder.d.ts +218 -2
  232. package/dist/esm/schema/column-definition-builder.d.ts +135 -20
  233. package/dist/esm/schema/create-index-builder.d.ts +2 -1
  234. package/dist/esm/schema/create-index-builder.js +2 -1
  235. package/dist/esm/schema/create-table-builder.d.ts +26 -9
  236. package/dist/esm/schema/create-table-builder.js +43 -10
  237. package/dist/esm/schema/create-view-builder.d.ts +17 -3
  238. package/dist/esm/schema/create-view-builder.js +25 -16
  239. package/dist/esm/schema/schema.d.ts +18 -11
  240. package/dist/esm/schema/schema.js +18 -11
  241. package/dist/esm/util/log.d.ts +11 -8
  242. package/dist/esm/util/log.js +25 -12
  243. package/dist/esm/util/type-utils.d.ts +7 -7
  244. package/package.json +9 -7
  245. package/dist/cjs/query-builder/query-builder.js +0 -1067
  246. package/dist/esm/query-builder/query-builder.js +0 -1061
@@ -1,1061 +0,0 @@
1
- import { AliasNode } from '../operation-node/alias-node.js';
2
- import { parseJoin, } from '../parser/join-parser.js';
3
- import { parseSelectExpressionOrList, parseSelectAll, } from '../parser/select-parser.js';
4
- import { parseExistFilter, parseReferenceFilter, parseWhereFilter, parseHavingFilter, parseNotExistFilter, } from '../parser/filter-parser.js';
5
- import { parseInsertObjectOrList, } from '../parser/insert-values-parser.js';
6
- import { SelectQueryNode } from '../operation-node/select-query-node.js';
7
- import { InsertQueryNode } from '../operation-node/insert-query-node.js';
8
- import { QueryNode, } from '../operation-node/query-node.js';
9
- import { parseOrderBy, } from '../parser/order-by-parser.js';
10
- import { UpdateQueryNode } from '../operation-node/update-query-node.js';
11
- import { parseUpdateObject, } from '../parser/update-set-parser.js';
12
- import { preventAwait } from '../util/prevent-await.js';
13
- import { LimitNode } from '../operation-node/limit-node.js';
14
- import { OffsetNode } from '../operation-node/offset-node.js';
15
- import { parseOnConflictDoNothing, parseOnConflictUpdate, } from '../parser/on-conflict-parser.js';
16
- import { freeze } from '../util/object-utils.js';
17
- import { DeleteQueryNode } from '../operation-node/delete-query-node.js';
18
- import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
19
- import { parseGroupBy } from '../parser/group-by-parser.js';
20
- import { parseUnion } from '../parser/union-parser.js';
21
- import { InsertResult } from './insert-result.js';
22
- import { UpdateResult } from './update-result.js';
23
- import { DeleteResult } from './delete-result.js';
24
- /**
25
- * The main query builder class.
26
- *
27
- * @typeParam DB - A type whose keys are table names/aliases and values are interfaces that
28
- * define the table's columns and their types. This type defines the tables, subqueries
29
- * etc. that are available to the query. This type contains all tables, even the ones
30
- * that have not actually been joined to the query. the `TB` parameter defines the
31
- * table names/aliases that have been joined to the query.
32
- *
33
- * @typeParam TB - The names/aliases of the tables that have been joined to the query
34
- * using `from`, `with` any join method and so on. This type is a union of `DB`
35
- * type's keys. For example `'person' | 'pet'`.
36
- *
37
- * @typePAram O - The query output row type.
38
- */
39
- export class QueryBuilder {
40
- #props;
41
- constructor(props) {
42
- this.#props = freeze(props);
43
- }
44
- where(...args) {
45
- assertCanHaveWhereClause(this.#props.queryNode);
46
- return new QueryBuilder({
47
- ...this.#props,
48
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
49
- });
50
- }
51
- /**
52
- * Adds a `where` clause where both sides of the operator are references
53
- * to columns.
54
- *
55
- * The normal `where` method treats the right hand side argument as a
56
- * value by default. `whereRef` treats it as a column reference. This method is
57
- * expecially useful with joins and correclated subqueries.
58
- *
59
- * @example
60
- * Usage with a join:
61
- *
62
- * ```ts
63
- * db.selectFrom(['person', 'pet'])
64
- * .selectAll()
65
- * .whereRef('person.first_name', '=', 'pet.name')
66
- * ```
67
- *
68
- * The generated SQL (PostgreSQL):
69
- *
70
- * ```sql
71
- * select * from "person", "pet" where "person"."first_name" = "pet"."name"
72
- * ```
73
- *
74
- * @example
75
- * Usage in a subquery:
76
- *
77
- * ```ts
78
- * const persons = await db
79
- * .selectFrom('person')
80
- * .selectAll('person')
81
- * .select((qb) => qb
82
- * .subQuery('pet')
83
- * .select('name')
84
- * .whereRef('pet.owner_id', '=', 'person.id')
85
- * .limit(1)
86
- * .as('pet_name')
87
- * )
88
- * .execute()
89
- * ```
90
- *
91
- * The generated SQL (PostgreSQL):
92
- *
93
- * ```sql
94
- * select "person".*, (
95
- * select "name"
96
- * from "pet"
97
- * where "pet"."owner_id" = "person"."id"
98
- * limit $1
99
- * ) as "pet_name"
100
- * from "person"
101
- */
102
- whereRef(lhs, op, rhs) {
103
- assertCanHaveWhereClause(this.#props.queryNode);
104
- return new QueryBuilder({
105
- ...this.#props,
106
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
107
- });
108
- }
109
- orWhere(...args) {
110
- assertCanHaveWhereClause(this.#props.queryNode);
111
- return new QueryBuilder({
112
- ...this.#props,
113
- queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
114
- });
115
- }
116
- /**
117
- * Adds an `or where` clause to the query. Otherwise works just like
118
- * {@link QueryBuilder.whereRef | whereRef}.
119
- *
120
- * Also see {@link QueryBuilder.orWhere | orWhere} and {@link QueryBuilder.where | where}.
121
- */
122
- orWhereRef(lhs, op, rhs) {
123
- assertCanHaveWhereClause(this.#props.queryNode);
124
- return new QueryBuilder({
125
- ...this.#props,
126
- queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
127
- });
128
- }
129
- /**
130
- * Adds a `where exists` clause to the query.
131
- *
132
- * You can either use a subquery or a raw instance.
133
- *
134
- * @example
135
- * The query below selets all persons that own a pet named Catto:
136
- *
137
- * ```ts
138
- * const persons = await db
139
- * .selectFrom('person')
140
- * .selectAll()
141
- * .whereExists((qb) => qb
142
- * .subQuery('pet')
143
- * .select('pet.id')
144
- * .whereRef('person.id', '=', 'pet.owner_id')
145
- * .where('pet.name', '=', 'Catto')
146
- * )
147
- * .execute()
148
- * ```
149
- *
150
- * The generated SQL (PostgreSQL):
151
- *
152
- * ```sql
153
- * select * from "person"
154
- * where exists (
155
- * select "pet"."id"
156
- * from "pet"
157
- * where "person"."id" = "pet"."owner_id"
158
- * and "pet"."name" = $1
159
- * )
160
- * ```
161
- *
162
- * @example
163
- * The same query as in the previous example but with using raw:
164
- *
165
- * ```ts
166
- * db.selectFrom('person')
167
- * .selectAll()
168
- * .whereExists(
169
- * db.raw(
170
- * '(select pet.id from pet where person.id = pet.owner_id and pet.name = ?)',
171
- * ['Catto']
172
- * )
173
- * )
174
- * ```
175
- *
176
- * The generated SQL (PostgreSQL):
177
- *
178
- * ```sql
179
- * select * from "person"
180
- * where exists (
181
- * select pet.id
182
- * from pet
183
- * where person.id = pet.owner_id
184
- * and pet.name = $1
185
- * )
186
- * ```
187
- */
188
- whereExists(arg) {
189
- assertCanHaveWhereClause(this.#props.queryNode);
190
- return new QueryBuilder({
191
- ...this.#props,
192
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
193
- });
194
- }
195
- /**
196
- * Just like {@link QueryBuilder.whereExists | whereExists} but creates a `not exists` clause.
197
- */
198
- whereNotExists(arg) {
199
- assertCanHaveWhereClause(this.#props.queryNode);
200
- return new QueryBuilder({
201
- ...this.#props,
202
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
203
- });
204
- }
205
- /**
206
- * Just like {@link QueryBuilder.whereExists | whereExists} but creates a `or exists` clause.
207
- */
208
- orWhereExists(arg) {
209
- assertCanHaveWhereClause(this.#props.queryNode);
210
- return new QueryBuilder({
211
- ...this.#props,
212
- queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
213
- });
214
- }
215
- /**
216
- * Just like {@link QueryBuilder.whereExists | whereExists} but creates a `or not exists` clause.
217
- */
218
- orWhereNotExists(arg) {
219
- assertCanHaveWhereClause(this.#props.queryNode);
220
- return new QueryBuilder({
221
- ...this.#props,
222
- queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
223
- });
224
- }
225
- having(...args) {
226
- assertCanHaveHavingClause(this.#props.queryNode);
227
- return new QueryBuilder({
228
- ...this.#props,
229
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
230
- });
231
- }
232
- /**
233
- * Just like {@link QueryBuilder.whereRef | whereRef} but adds a `having` statement
234
- * instead of a `where` statement.
235
- */
236
- havingRef(lhs, op, rhs) {
237
- assertCanHaveHavingClause(this.#props.queryNode);
238
- return new QueryBuilder({
239
- ...this.#props,
240
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
241
- });
242
- }
243
- orHaving(...args) {
244
- assertCanHaveHavingClause(this.#props.queryNode);
245
- return new QueryBuilder({
246
- ...this.#props,
247
- queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
248
- });
249
- }
250
- /**
251
- * Just like {@link QueryBuilder.orWhereRef | orWhereRef} but adds a `having` statement
252
- * instead of a `where` statement.
253
- */
254
- orHavingRef(lhs, op, rhs) {
255
- assertCanHaveHavingClause(this.#props.queryNode);
256
- return new QueryBuilder({
257
- ...this.#props,
258
- queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
259
- });
260
- }
261
- /**
262
- * Just like {@link QueryBuilder.whereExists | whereExists} but adds a `having` statement
263
- * instead of a `where` statement.
264
- */
265
- havingExists(arg) {
266
- assertCanHaveHavingClause(this.#props.queryNode);
267
- return new QueryBuilder({
268
- ...this.#props,
269
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
270
- });
271
- }
272
- /**
273
- * Just like {@link QueryBuilder.whereNotExists | whereNotExists} but adds a `having` statement
274
- * instead of a `where` statement.
275
- */
276
- havingNotExist(arg) {
277
- assertCanHaveHavingClause(this.#props.queryNode);
278
- return new QueryBuilder({
279
- ...this.#props,
280
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
281
- });
282
- }
283
- /**
284
- * Just like {@link QueryBuilder.orWhereExists | orWhereExists} but adds a `having` statement
285
- * instead of a `where` statement.
286
- */
287
- orHavingExists(arg) {
288
- assertCanHaveHavingClause(this.#props.queryNode);
289
- return new QueryBuilder({
290
- ...this.#props,
291
- queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
292
- });
293
- }
294
- /**
295
- * Just like {@link QueryBuilder.orWhereNotExists | orWhereNotExists} but adds a `having` statement
296
- * instead of a `where` statement.
297
- */
298
- orHavingNotExists(arg) {
299
- assertCanHaveHavingClause(this.#props.queryNode);
300
- return new QueryBuilder({
301
- ...this.#props,
302
- queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
303
- });
304
- }
305
- select(selection) {
306
- assertCanHaveSelectClause(this.#props.queryNode);
307
- return new QueryBuilder({
308
- ...this.#props,
309
- queryNode: SelectQueryNode.cloneWithSelections(this.#props.queryNode, parseSelectExpressionOrList(this.#props.parseContext, selection)),
310
- });
311
- }
312
- distinctOn(selection) {
313
- assertCanHaveSelectClause(this.#props.queryNode);
314
- return new QueryBuilder({
315
- ...this.#props,
316
- queryNode: SelectQueryNode.cloneWithDistinctOnSelections(this.#props.queryNode, parseSelectExpressionOrList(this.#props.parseContext, selection)),
317
- });
318
- }
319
- /**
320
- * Makes the selection distinct.
321
- *
322
- * @example
323
- * ```ts
324
- * await db.selectFrom('person')
325
- * .select('first_name')
326
- * .distinct()
327
- * .execute()
328
- * ```
329
- *
330
- * The generated SQL (PostgreSQL):
331
- *
332
- * ```sql
333
- * select distinct "first_name" from "person"
334
- * ```
335
- */
336
- distinct() {
337
- assertCanHaveSelectClause(this.#props.queryNode);
338
- return new QueryBuilder({
339
- ...this.#props,
340
- queryNode: SelectQueryNode.cloneWithDistinct(this.#props.queryNode),
341
- });
342
- }
343
- /**
344
- * Adds the `for update` option to a select query on supported databases.
345
- */
346
- forUpdate() {
347
- assertCanHaveSelectClause(this.#props.queryNode);
348
- return new QueryBuilder({
349
- ...this.#props,
350
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForUpdate'),
351
- });
352
- }
353
- /**
354
- * Adds the `for share` option to a select query on supported databases.
355
- */
356
- forShare() {
357
- assertCanHaveSelectClause(this.#props.queryNode);
358
- return new QueryBuilder({
359
- ...this.#props,
360
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForShare'),
361
- });
362
- }
363
- /**
364
- * Adds the `for key share` option to a select query on supported databases.
365
- */
366
- forKeyShare() {
367
- assertCanHaveSelectClause(this.#props.queryNode);
368
- return new QueryBuilder({
369
- ...this.#props,
370
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForKeyShare'),
371
- });
372
- }
373
- /**
374
- * Adds the `for no key update` option to a select query on supported databases.
375
- */
376
- forNoKeyUpdate() {
377
- assertCanHaveSelectClause(this.#props.queryNode);
378
- return new QueryBuilder({
379
- ...this.#props,
380
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForNoKeyUpdate'),
381
- });
382
- }
383
- /**
384
- * Adds the `skip locked` option to a select query on supported databases.
385
- */
386
- skipLocked() {
387
- assertCanHaveSelectClause(this.#props.queryNode);
388
- return new QueryBuilder({
389
- ...this.#props,
390
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'SkipLocked'),
391
- });
392
- }
393
- /**
394
- * Adds the `nowait` option to a select query on supported databases.
395
- */
396
- noWait() {
397
- assertCanHaveSelectClause(this.#props.queryNode);
398
- return new QueryBuilder({
399
- ...this.#props,
400
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'NoWait'),
401
- });
402
- }
403
- selectAll(table) {
404
- assertCanHaveSelectClause(this.#props.queryNode);
405
- return new QueryBuilder({
406
- ...this.#props,
407
- queryNode: SelectQueryNode.cloneWithSelections(this.#props.queryNode, parseSelectAll(table)),
408
- });
409
- }
410
- innerJoin(...args) {
411
- assertCanHaveJoins(this.#props.queryNode);
412
- return new QueryBuilder({
413
- ...this.#props,
414
- queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin(this.#props.parseContext, 'InnerJoin', args)),
415
- });
416
- }
417
- leftJoin(...args) {
418
- assertCanHaveJoins(this.#props.queryNode);
419
- return new QueryBuilder({
420
- ...this.#props,
421
- queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin(this.#props.parseContext, 'LeftJoin', args)),
422
- });
423
- }
424
- rightJoin(...args) {
425
- assertCanHaveJoins(this.#props.queryNode);
426
- return new QueryBuilder({
427
- ...this.#props,
428
- queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin(this.#props.parseContext, 'RightJoin', args)),
429
- });
430
- }
431
- fullJoin(...args) {
432
- assertCanHaveJoins(this.#props.queryNode);
433
- return new QueryBuilder({
434
- ...this.#props,
435
- queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin(this.#props.parseContext, 'FullJoin', args)),
436
- });
437
- }
438
- values(args) {
439
- assertCanHaveInsertValues(this.#props.queryNode);
440
- const [columns, values] = parseInsertObjectOrList(args);
441
- return new QueryBuilder({
442
- ...this.#props,
443
- queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
444
- columns,
445
- values,
446
- }),
447
- });
448
- }
449
- onConflictDoNothing(target) {
450
- assertCanHaveOnConflict(this.#props.queryNode);
451
- return new QueryBuilder({
452
- ...this.#props,
453
- queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
454
- onConflict: parseOnConflictDoNothing(target),
455
- }),
456
- });
457
- }
458
- /**
459
- * Changes an `insert into` query to an `insert ignore into` query.
460
- *
461
- * If you use the ignore modifier, ignorable errors that occur while executing the
462
- * insert statement are ignored. For example, without ignore, a row that duplicates
463
- * an existing unique index or primary key value in the table causes a duplicate-key
464
- * error and the statement is aborted. With ignore, the row is discarded and no error
465
- * occurs.
466
- *
467
- * This is only supported on some dialects like MySQL. On most dialects you should
468
- * use the {@link onConflictDoNothing} method.
469
- *
470
- * @example
471
- * ```ts
472
- * await db.insertInto('person')
473
- * .ignore()
474
- * .values(values)
475
- * .execute()
476
- * ```
477
- */
478
- ignore() {
479
- assertCanHaveInsertIgnore(this.#props.queryNode);
480
- return new QueryBuilder({
481
- ...this.#props,
482
- queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
483
- ignore: true,
484
- }),
485
- });
486
- }
487
- onConflictUpdate(target, updates) {
488
- assertCanHaveOnConflict(this.#props.queryNode);
489
- return new QueryBuilder({
490
- ...this.#props,
491
- queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
492
- onConflict: parseOnConflictUpdate(this.#props.parseContext, target, updates),
493
- }),
494
- });
495
- }
496
- /**
497
- * Adds `on duplicate key update` to an insert query.
498
- *
499
- * If you specify `on duplicate key update`, and a row is inserted that would cause
500
- * a duplicate value in a unique index or primary key, an update of the old row occurs.
501
- *
502
- * This is only implemented by some dialects like MySQL. On most dialects you should
503
- * use {@link onConflictUpdate} instead.
504
- *
505
- * @example
506
- * ```ts
507
- * await db
508
- * .insertInto('person')
509
- * .values(values)
510
- * .onDuplicateKeyUpdate({ species: 'hamster' })
511
- * ```
512
- */
513
- onDuplicateKeyUpdate(updates) {
514
- assertCanHaveOnDuplicateKey(this.#props.queryNode);
515
- return new QueryBuilder({
516
- ...this.#props,
517
- queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
518
- onDuplicateKey: OnDuplicateKeyNode.create(parseUpdateObject(this.#props.parseContext, updates)),
519
- }),
520
- });
521
- }
522
- /**
523
- * Sets the values to update for an {@link Kysely.updateTable | update} query.
524
- *
525
- * This method takes an object whose keys are column names and values are
526
- * values to update. In addition to the column's type, the values can be `raw`
527
- * instances or select queries.
528
- *
529
- * The return value of an update query is an instance of {@link UpdateResult}.
530
- * You can use the {@link QueryBuilder.returning | returning} method on
531
- * supported databases to get out the updated rows.
532
- *
533
- * @example
534
- * Update a row in `person` table:
535
- *
536
- * ```ts
537
- * const result = await db
538
- * .updateTable('person')
539
- * .set({
540
- * first_name: 'Jennifer',
541
- * last_name: 'Aniston'
542
- * })
543
- * .where('id', '=', 1)
544
- * .executeTakeFirst()
545
- *
546
- * console.log(result.numUpdatedRows)
547
- * ```
548
- *
549
- * The generated SQL (PostgreSQL):
550
- *
551
- * ```sql
552
- * update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3
553
- * ```
554
- *
555
- * @example
556
- * On postgresql you ca chain `returning` to the query to get
557
- * the updated rows' columns (or any other expression) as the
558
- * return value:
559
- *
560
- * ```ts
561
- * const row = await db
562
- * .updateTable('person')
563
- * .set({
564
- * first_name: 'Jennifer',
565
- * last_name: 'Aniston'
566
- * })
567
- * .where('id', '=', 1)
568
- * .returning('id')
569
- * .executeTakeFirstOrThrow()
570
- *
571
- * row.id
572
- * ```
573
- *
574
- * The generated SQL (PostgreSQL):
575
- *
576
- * ```sql
577
- * update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3 returning "id"
578
- * ```
579
- *
580
- * @example
581
- * In addition to primitives, the values can also be `raw` expressions or
582
- * select queries:
583
- *
584
- * ```ts
585
- * const result = await db
586
- * .updateTable('person')
587
- * .set({
588
- * first_name: 'Jennifer',
589
- * last_name: db.raw('? || ?', ['Ani', 'ston']),
590
- * age: db.selectFrom('person').select(raw('avg(age)')),
591
- * })
592
- * .where('id', '=', 1)
593
- * .executeTakeFirst()
594
- *
595
- * console.log(result.numUpdatedRows)
596
- * ```
597
- *
598
- * The generated SQL (PostgreSQL):
599
- *
600
- * ```sql
601
- * update "person" set
602
- * "first_name" = $1,
603
- * "last_name" = $2 || $3,
604
- * "age" = (select avg(age) from "person")
605
- * where "id" = $4
606
- * ```
607
- */
608
- set(row) {
609
- assertCanHaveUpdates(this.#props.queryNode);
610
- return new QueryBuilder({
611
- ...this.#props,
612
- queryNode: UpdateQueryNode.cloneWithUpdates(this.#props.queryNode, parseUpdateObject(this.#props.parseContext, row)),
613
- });
614
- }
615
- returning(selection) {
616
- assertCanHaveReturningClause(this.#props.queryNode);
617
- return new QueryBuilder({
618
- ...this.#props,
619
- queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectExpressionOrList(this.#props.parseContext, selection)),
620
- });
621
- }
622
- /**
623
- * Adds a `returning *` to an insert/update/delete query on databases
624
- * that support `returning` such as PostgreSQL.
625
- */
626
- returningAll() {
627
- assertCanHaveReturningClause(this.#props.queryNode);
628
- return new QueryBuilder({
629
- ...this.#props,
630
- queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll()),
631
- });
632
- }
633
- /**
634
- * Adds an `order by` clause to the query.
635
- *
636
- * `orderBy` calls are additive. To order by multiple columns, call `orderBy`
637
- * multiple times.
638
- *
639
- * The first argument is the expression to order by and the second is the
640
- * order (`asc` or `desc`).
641
- *
642
- * @example
643
- * ```ts
644
- * await db
645
- * .selectFrom('person')
646
- * .select('person.first_name as fn')
647
- * .orderBy('id')
648
- * .orderBy('fn', 'desc')
649
- * .execute()
650
- * ```
651
- *
652
- * The generated SQL (PostgreSQL):
653
- *
654
- * ```sql
655
- * select "person"."first_name" as "fn"
656
- * from "person"
657
- * order by "id" asc, "fn" desc
658
- * ```
659
- *
660
- * @example
661
- * The order by expression can also be a `raw` expression or a subquery
662
- * in addition to column references:
663
- *
664
- * ```ts
665
- * await db
666
- * .selectFrom('person')
667
- * .selectAll()
668
- * .orderBy((qb) => qb.subQuery('pet')
669
- * .select('pet.name')
670
- * .whereRef('pet.owner_id', '=', 'person.id')
671
- * .limit(1)
672
- * )
673
- * .orderBy(
674
- * db.raw('concat(first_name, last_name)')
675
- * )
676
- * .execute()
677
- * ```
678
- *
679
- * The generated SQL (PostgreSQL):
680
- *
681
- * ```sql
682
- * select *
683
- * from "person"
684
- * order by
685
- * ( select "pet"."name"
686
- * from "pet"
687
- * where "pet"."owner_id" = "person"."id"
688
- * limit 1
689
- * ) asc,
690
- * concat(first_name, last_name) asc
691
- * ```
692
- *
693
- * @example
694
- * `dynamic.ref` can be used to refer to columns not known at
695
- * compile time:
696
- *
697
- * ```ts
698
- * async function someQuery(orderBy: string) {
699
- * const { ref } = db.dynamic
700
- *
701
- * return await db
702
- * .selectFrom('person')
703
- * .select('person.first_name as fn')
704
- * .orderBy(ref(orderBy))
705
- * .execute()
706
- * }
707
- *
708
- * someQuery('fn')
709
- * ```
710
- *
711
- * The generated SQL (PostgreSQL):
712
- *
713
- * ```sql
714
- * select "person"."first_name" as "fn"
715
- * from "person"
716
- * order by "fn" asc
717
- * ```
718
- */
719
- orderBy(orderBy, direction) {
720
- assertCanHaveOrderByClause(this.#props.queryNode);
721
- return new QueryBuilder({
722
- ...this.#props,
723
- queryNode: SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode, parseOrderBy(this.#props.parseContext, orderBy, direction)),
724
- });
725
- }
726
- groupBy(orderBy) {
727
- assertCanHaveGroupByClause(this.#props.queryNode);
728
- return new QueryBuilder({
729
- ...this.#props,
730
- queryNode: SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode, parseGroupBy(this.#props.parseContext, orderBy)),
731
- });
732
- }
733
- /**
734
- * Adds a limit clause to the query.
735
- *
736
- * @example
737
- * Select the first 10 rows of the result:
738
- *
739
- * ```ts
740
- * return await db
741
- * .selectFrom('person')
742
- * .select('first_name')
743
- * .limit(10)
744
- * ```
745
- *
746
- * @example
747
- * Select rows from index 10 to index 19 of the result:
748
- *
749
- * ```ts
750
- * return await db
751
- * .selectFrom('person')
752
- * .select('first_name')
753
- * .offset(10)
754
- * .limit(10)
755
- * ```
756
- */
757
- limit(limit) {
758
- assertCanHaveLimit(this.#props.queryNode);
759
- return new QueryBuilder({
760
- ...this.#props,
761
- queryNode: SelectQueryNode.cloneWithLimit(this.#props.queryNode, LimitNode.create(limit)),
762
- });
763
- }
764
- /**
765
- * Adds an offset clause to the query.
766
- *
767
- * @example
768
- * Select rows from index 10 to index 19 of the result:
769
- *
770
- * ```ts
771
- * return await db
772
- * .selectFrom('person')
773
- * .select('first_name')
774
- * .offset(10)
775
- * .limit(10)
776
- * ```
777
- */
778
- offset(offset) {
779
- assertCanHaveOffset(this.#props.queryNode);
780
- return new QueryBuilder({
781
- ...this.#props,
782
- queryNode: SelectQueryNode.cloneWithOffset(this.#props.queryNode, OffsetNode.create(offset)),
783
- });
784
- }
785
- /**
786
- * Combines another select query or raw expression to this query using `union`.
787
- *
788
- * The output row type of the combined query must match `this` query.
789
- *
790
- * @xample
791
- * ```ts
792
- * db.selectFrom('person')
793
- * .select(['id', 'first_name as name'])
794
- * .union(db.selectFrom('pet').select(['id', 'name']))
795
- * .orderBy('name')
796
- * ```
797
- */
798
- union(expression) {
799
- assertCanHaveUnion(this.#props.queryNode);
800
- return new QueryBuilder({
801
- ...this.#props,
802
- queryNode: SelectQueryNode.cloneWithUnion(this.#props.queryNode, parseUnion(expression, false)),
803
- });
804
- }
805
- /**
806
- * Combines another select query or raw expression to this query using `union all`.
807
- *
808
- * The output row type of the combined query must match `this` query.
809
- *
810
- * @xample
811
- * ```ts
812
- * db.selectFrom('person')
813
- * .select(['id', 'first_name as name'])
814
- * .unionAll(db.selectFrom('pet').select(['id', 'name']))
815
- * .orderBy('name')
816
- * ```
817
- */
818
- unionAll(expression) {
819
- assertCanHaveUnion(this.#props.queryNode);
820
- return new QueryBuilder({
821
- ...this.#props,
822
- queryNode: SelectQueryNode.cloneWithUnion(this.#props.queryNode, parseUnion(expression, true)),
823
- });
824
- }
825
- /**
826
- * Simply calls the given function passing `this` as the only argument.
827
- *
828
- * This method can be useful when adding optional method calls:
829
- *
830
- * @example
831
- * ```ts
832
- * db.selectFrom('person')
833
- * .selectAll()
834
- * .call((qb) => {
835
- * if (something) {
836
- * return qb.where('something', '=', something)
837
- * } else {
838
- * return qb.where('somethingElse', '=', somethingElse)
839
- * }
840
- * })
841
- * .execute()
842
- * ```
843
- *
844
- * The next example uses a helper funtion `log` to log a query:
845
- *
846
- * @example
847
- * ```ts
848
- * function log<T extends AnyQueryBuilder>(qb: T): T {
849
- * console.log(qb.compile())
850
- * return qb
851
- * }
852
- *
853
- * db.selectFrom('person')
854
- * .selectAll()
855
- * .call(log)
856
- * .execute()
857
- * ```
858
- */
859
- call(func) {
860
- return func(this);
861
- }
862
- /**
863
- * Gives an alias for the query. This method is only useful for sub queries.
864
- *
865
- * @example
866
- * ```ts
867
- * await db.selectFrom('pet')
868
- * .selectAll('pet')
869
- * .select(
870
- * (qb) => qb.subQuery('person')
871
- * .select('first_name')
872
- * .whereRef('pet.owner_id', '=', 'person.id')
873
- * .as('owner_first_name')
874
- * )
875
- * .execute()
876
- * ```
877
- */
878
- as(alias) {
879
- return new AliasedQueryBuilder(this, alias);
880
- }
881
- /**
882
- * Change the output type of the query.
883
- *
884
- * You should only use this method as the last resort if the types
885
- * don't support your use case.
886
- */
887
- castTo() {
888
- return new QueryBuilder(this.#props);
889
- }
890
- toOperationNode() {
891
- return this.#props.executor.transformQuery(this.#props.queryNode, this.#props.queryId);
892
- }
893
- compile() {
894
- return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
895
- }
896
- /**
897
- * Executes the query and returns an array of rows.
898
- *
899
- * Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods.
900
- */
901
- async execute() {
902
- const compildQuery = this.compile();
903
- const query = compildQuery.query;
904
- const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
905
- if (this.#props.parseContext.adapter.supportsReturning &&
906
- QueryNode.isMutating(query) &&
907
- query.returning) {
908
- return result.rows;
909
- }
910
- else if (InsertQueryNode.is(query)) {
911
- return [new InsertResult(result.insertId)];
912
- }
913
- else if (UpdateQueryNode.is(query)) {
914
- return [new UpdateResult(result.numUpdatedOrDeletedRows)];
915
- }
916
- else if (DeleteQueryNode.is(query)) {
917
- return [new DeleteResult(result.numUpdatedOrDeletedRows)];
918
- }
919
- else {
920
- return result.rows;
921
- }
922
- }
923
- /**
924
- * Executes the query and returns the first result or undefined if
925
- * the query returned no result.
926
- */
927
- async executeTakeFirst() {
928
- const [result] = await this.execute();
929
- return result;
930
- }
931
- /**
932
- * Executes the query and returns the first result or throws if
933
- * the query returned no result.
934
- *
935
- * By default an instance of {@link NoResultError} is thrown, but you can
936
- * provide a custom error class as the only argument to throw a different
937
- * error.
938
- */
939
- async executeTakeFirstOrThrow(errorConstructor = NoResultError) {
940
- const result = await this.executeTakeFirst();
941
- if (result === undefined) {
942
- throw new errorConstructor(this.toOperationNode());
943
- }
944
- return result;
945
- }
946
- }
947
- preventAwait(QueryBuilder, "don't await QueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
948
- /**
949
- * {@link QueryBuilder} with an alias. The result of calling {@link QueryBuilder.as}.
950
- */
951
- export class AliasedQueryBuilder {
952
- #queryBuilder;
953
- #alias;
954
- constructor(queryBuilder, alias) {
955
- this.#queryBuilder = queryBuilder;
956
- this.#alias = alias;
957
- }
958
- /**
959
- * @private
960
- *
961
- * This needs to be here just so that the typings work. Without this
962
- * the generated .d.ts file contains no reference to the type param A
963
- * which causes this type to be equal to AliasedQueryBuilder with any A
964
- * as long as D, TB and O are the same.
965
- */
966
- get alias() {
967
- return this.#alias;
968
- }
969
- toOperationNode() {
970
- const node = this.#queryBuilder.toOperationNode();
971
- if (SelectQueryNode.is(node)) {
972
- return AliasNode.create(node, this.#alias);
973
- }
974
- throw new Error('only select queries can be aliased');
975
- }
976
- }
977
- export class NoResultError extends Error {
978
- /**
979
- * The operation node tree of the query that was executed.
980
- */
981
- node;
982
- constructor(node) {
983
- super('no result');
984
- this.node = node;
985
- }
986
- }
987
- function assertCanHaveWhereClause(node) {
988
- if (!QueryNode.isFilterable(node)) {
989
- throw new Error('only select, delete and update queries can have a where clause');
990
- }
991
- }
992
- function assertCanHaveHavingClause(node) {
993
- if (!SelectQueryNode.is(node)) {
994
- throw new Error('only select queries can have a having clause');
995
- }
996
- }
997
- function assertCanHaveSelectClause(node) {
998
- if (!SelectQueryNode.is(node)) {
999
- throw new Error('only a select query can have selections');
1000
- }
1001
- }
1002
- function assertCanHaveJoins(node) {
1003
- if (!QueryNode.isFilterable(node)) {
1004
- throw new Error('only select, delete and update queries can have joins');
1005
- }
1006
- }
1007
- function assertCanHaveInsertValues(node) {
1008
- if (!InsertQueryNode.is(node)) {
1009
- throw new Error('only an insert query can have insert values');
1010
- }
1011
- }
1012
- function assertCanHaveInsertIgnore(node) {
1013
- if (!InsertQueryNode.is(node)) {
1014
- throw new Error('only an insert query can have the ignore clause');
1015
- }
1016
- }
1017
- function assertCanHaveOnConflict(node) {
1018
- if (!InsertQueryNode.is(node)) {
1019
- throw new Error('only an insert query can have an on conflict clause');
1020
- }
1021
- }
1022
- function assertCanHaveOnDuplicateKey(node) {
1023
- if (!InsertQueryNode.is(node)) {
1024
- throw new Error('only an insert query can have an on duplicate key clause');
1025
- }
1026
- }
1027
- function assertCanHaveUpdates(node) {
1028
- if (!UpdateQueryNode.is(node)) {
1029
- throw new Error('only an update query can set values');
1030
- }
1031
- }
1032
- function assertCanHaveReturningClause(node) {
1033
- if (!QueryNode.isMutating(node)) {
1034
- throw new Error('only insert, delete and update queries can have a returning clause');
1035
- }
1036
- }
1037
- function assertCanHaveOrderByClause(node) {
1038
- if (!SelectQueryNode.is(node)) {
1039
- throw new Error('only a select query can have an order by clause');
1040
- }
1041
- }
1042
- function assertCanHaveGroupByClause(node) {
1043
- if (!SelectQueryNode.is(node)) {
1044
- throw new Error('only a select query can have a group by clause');
1045
- }
1046
- }
1047
- function assertCanHaveLimit(node) {
1048
- if (!SelectQueryNode.is(node)) {
1049
- throw new Error('only a select query can have a limit');
1050
- }
1051
- }
1052
- function assertCanHaveOffset(node) {
1053
- if (!SelectQueryNode.is(node)) {
1054
- throw new Error('only a select query can have an offset');
1055
- }
1056
- }
1057
- function assertCanHaveUnion(node) {
1058
- if (!SelectQueryNode.is(node)) {
1059
- throw new Error('only a select query can have an union');
1060
- }
1061
- }