kysely 0.27.1 → 0.27.3

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 (161) hide show
  1. package/dist/cjs/dialect/database-introspector.d.ts +1 -0
  2. package/dist/cjs/dialect/mssql/mssql-introspector.js +13 -2
  3. package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  4. package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
  5. package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
  6. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  7. package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
  8. package/dist/cjs/dialect/postgres/postgres-introspector.js +2 -0
  9. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
  10. package/dist/cjs/driver/database-connection.d.ts +1 -1
  11. package/dist/cjs/expression/expression-builder.d.ts +30 -4
  12. package/dist/cjs/expression/expression-builder.js +5 -0
  13. package/dist/cjs/index.d.ts +7 -1
  14. package/dist/cjs/index.js +6 -0
  15. package/dist/cjs/migration/migrator.d.ts +19 -2
  16. package/dist/cjs/migration/migrator.js +77 -43
  17. package/dist/cjs/operation-node/add-index-node.js +1 -1
  18. package/dist/cjs/operation-node/cast-node.d.ts +13 -0
  19. package/dist/cjs/operation-node/cast-node.js +19 -0
  20. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
  21. package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
  22. package/dist/cjs/operation-node/data-type-node.js +55 -1
  23. package/dist/cjs/operation-node/delete-query-node.d.ts +4 -0
  24. package/dist/cjs/operation-node/delete-query-node.js +12 -0
  25. package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
  26. package/dist/cjs/operation-node/fetch-node.js +19 -0
  27. package/dist/cjs/operation-node/insert-query-node.d.ts +4 -1
  28. package/dist/cjs/operation-node/insert-query-node.js +5 -0
  29. package/dist/cjs/operation-node/join-node.d.ts +1 -1
  30. package/dist/cjs/operation-node/matched-node.d.ts +13 -0
  31. package/dist/cjs/operation-node/matched-node.js +19 -0
  32. package/dist/cjs/operation-node/merge-query-node.d.ts +25 -0
  33. package/dist/cjs/operation-node/merge-query-node.js +45 -0
  34. package/dist/cjs/operation-node/operation-node-transformer.d.ts +10 -0
  35. package/dist/cjs/operation-node/operation-node-transformer.js +50 -0
  36. package/dist/cjs/operation-node/operation-node-visitor.d.ts +10 -0
  37. package/dist/cjs/operation-node/operation-node-visitor.js +5 -0
  38. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  39. package/dist/cjs/operation-node/query-node.d.ts +10 -3
  40. package/dist/cjs/operation-node/query-node.js +15 -1
  41. package/dist/cjs/operation-node/select-query-node.d.ts +5 -0
  42. package/dist/cjs/operation-node/select-query-node.js +6 -0
  43. package/dist/cjs/operation-node/top-node.d.ts +14 -0
  44. package/dist/cjs/operation-node/top-node.js +19 -0
  45. package/dist/cjs/operation-node/update-query-node.d.ts +7 -1
  46. package/dist/cjs/operation-node/update-query-node.js +11 -0
  47. package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
  48. package/dist/cjs/parser/binary-operation-parser.js +2 -2
  49. package/dist/cjs/parser/data-type-parser.js +7 -3
  50. package/dist/cjs/parser/fetch-parser.d.ts +2 -0
  51. package/dist/cjs/parser/fetch-parser.js +18 -0
  52. package/dist/cjs/parser/insert-values-parser.d.ts +3 -3
  53. package/dist/cjs/parser/merge-parser.d.ts +9 -0
  54. package/dist/cjs/parser/merge-parser.js +32 -0
  55. package/dist/cjs/parser/table-parser.d.ts +4 -3
  56. package/dist/cjs/parser/top-parser.d.ts +2 -0
  57. package/dist/cjs/parser/top-parser.js +20 -0
  58. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
  59. package/dist/cjs/query-builder/delete-query-builder.d.ts +99 -0
  60. package/dist/cjs/query-builder/delete-query-builder.js +120 -0
  61. package/dist/cjs/query-builder/insert-query-builder.d.ts +73 -3
  62. package/dist/cjs/query-builder/insert-query-builder.js +242 -0
  63. package/dist/cjs/query-builder/merge-query-builder.d.ts +557 -0
  64. package/dist/cjs/query-builder/merge-query-builder.js +518 -0
  65. package/dist/cjs/query-builder/merge-result.d.ts +4 -0
  66. package/dist/cjs/query-builder/merge-result.js +10 -0
  67. package/dist/cjs/query-builder/select-query-builder.d.ts +102 -7
  68. package/dist/cjs/query-builder/select-query-builder.js +14 -0
  69. package/dist/cjs/query-builder/update-query-builder.d.ts +82 -3
  70. package/dist/cjs/query-builder/update-query-builder.js +98 -0
  71. package/dist/cjs/query-compiler/default-query-compiler.d.ts +10 -0
  72. package/dist/cjs/query-compiler/default-query-compiler.js +94 -10
  73. package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
  74. package/dist/cjs/query-creator.d.ts +40 -2
  75. package/dist/cjs/query-creator.js +9 -0
  76. package/dist/cjs/schema/alter-table-add-index-builder.js +6 -2
  77. package/dist/cjs/schema/column-definition-builder.d.ts +13 -1
  78. package/dist/cjs/schema/column-definition-builder.js +15 -1
  79. package/dist/cjs/util/infer-result.d.ts +2 -1
  80. package/dist/cjs/util/type-utils.d.ts +3 -2
  81. package/dist/esm/dialect/database-introspector.d.ts +1 -0
  82. package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
  83. package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  84. package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
  85. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
  86. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  87. package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
  88. package/dist/esm/dialect/postgres/postgres-introspector.js +2 -0
  89. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
  90. package/dist/esm/driver/database-connection.d.ts +1 -1
  91. package/dist/esm/expression/expression-builder.d.ts +30 -4
  92. package/dist/esm/expression/expression-builder.js +5 -0
  93. package/dist/esm/index.d.ts +7 -1
  94. package/dist/esm/index.js +6 -0
  95. package/dist/esm/migration/migrator.d.ts +19 -2
  96. package/dist/esm/migration/migrator.js +76 -42
  97. package/dist/esm/operation-node/add-index-node.js +1 -1
  98. package/dist/esm/operation-node/cast-node.d.ts +13 -0
  99. package/dist/esm/operation-node/cast-node.js +17 -0
  100. package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
  101. package/dist/esm/operation-node/data-type-node.d.ts +5 -1
  102. package/dist/esm/operation-node/data-type-node.js +53 -0
  103. package/dist/esm/operation-node/delete-query-node.d.ts +4 -0
  104. package/dist/esm/operation-node/delete-query-node.js +12 -0
  105. package/dist/esm/operation-node/fetch-node.d.ts +15 -0
  106. package/dist/esm/operation-node/fetch-node.js +17 -0
  107. package/dist/esm/operation-node/insert-query-node.d.ts +4 -1
  108. package/dist/esm/operation-node/insert-query-node.js +5 -0
  109. package/dist/esm/operation-node/join-node.d.ts +1 -1
  110. package/dist/esm/operation-node/matched-node.d.ts +13 -0
  111. package/dist/esm/operation-node/matched-node.js +17 -0
  112. package/dist/esm/operation-node/merge-query-node.d.ts +25 -0
  113. package/dist/esm/operation-node/merge-query-node.js +43 -0
  114. package/dist/esm/operation-node/operation-node-transformer.d.ts +10 -0
  115. package/dist/esm/operation-node/operation-node-transformer.js +50 -0
  116. package/dist/esm/operation-node/operation-node-visitor.d.ts +10 -0
  117. package/dist/esm/operation-node/operation-node-visitor.js +5 -0
  118. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  119. package/dist/esm/operation-node/query-node.d.ts +10 -3
  120. package/dist/esm/operation-node/query-node.js +15 -1
  121. package/dist/esm/operation-node/select-query-node.d.ts +5 -0
  122. package/dist/esm/operation-node/select-query-node.js +6 -0
  123. package/dist/esm/operation-node/top-node.d.ts +14 -0
  124. package/dist/esm/operation-node/top-node.js +17 -0
  125. package/dist/esm/operation-node/update-query-node.d.ts +7 -1
  126. package/dist/esm/operation-node/update-query-node.js +11 -0
  127. package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
  128. package/dist/esm/parser/binary-operation-parser.js +2 -2
  129. package/dist/esm/parser/data-type-parser.js +8 -4
  130. package/dist/esm/parser/fetch-parser.d.ts +2 -0
  131. package/dist/esm/parser/fetch-parser.js +15 -0
  132. package/dist/esm/parser/insert-values-parser.d.ts +3 -3
  133. package/dist/esm/parser/merge-parser.d.ts +9 -0
  134. package/dist/esm/parser/merge-parser.js +28 -0
  135. package/dist/esm/parser/table-parser.d.ts +4 -3
  136. package/dist/esm/parser/top-parser.d.ts +2 -0
  137. package/dist/esm/parser/top-parser.js +17 -0
  138. package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
  139. package/dist/esm/query-builder/delete-query-builder.d.ts +99 -0
  140. package/dist/esm/query-builder/delete-query-builder.js +120 -0
  141. package/dist/esm/query-builder/insert-query-builder.d.ts +73 -3
  142. package/dist/esm/query-builder/insert-query-builder.js +242 -0
  143. package/dist/esm/query-builder/merge-query-builder.d.ts +557 -0
  144. package/dist/esm/query-builder/merge-query-builder.js +512 -0
  145. package/dist/esm/query-builder/merge-result.d.ts +4 -0
  146. package/dist/esm/query-builder/merge-result.js +7 -0
  147. package/dist/esm/query-builder/select-query-builder.d.ts +102 -7
  148. package/dist/esm/query-builder/select-query-builder.js +14 -0
  149. package/dist/esm/query-builder/update-query-builder.d.ts +82 -3
  150. package/dist/esm/query-builder/update-query-builder.js +98 -0
  151. package/dist/esm/query-compiler/default-query-compiler.d.ts +10 -0
  152. package/dist/esm/query-compiler/default-query-compiler.js +94 -10
  153. package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
  154. package/dist/esm/query-creator.d.ts +40 -2
  155. package/dist/esm/query-creator.js +10 -1
  156. package/dist/esm/schema/alter-table-add-index-builder.js +7 -3
  157. package/dist/esm/schema/column-definition-builder.d.ts +13 -1
  158. package/dist/esm/schema/column-definition-builder.js +15 -1
  159. package/dist/esm/util/infer-result.d.ts +2 -1
  160. package/dist/esm/util/type-utils.d.ts +3 -2
  161. package/package.json +22 -21
@@ -0,0 +1,518 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotMatchedThenableMergeQueryBuilder = exports.MatchedThenableMergeQueryBuilder = exports.WheneableMergeQueryBuilder = exports.MergeQueryBuilder = void 0;
4
+ const insert_query_node_js_1 = require("../operation-node/insert-query-node.js");
5
+ const merge_query_node_js_1 = require("../operation-node/merge-query-node.js");
6
+ const query_node_js_1 = require("../operation-node/query-node.js");
7
+ const update_query_node_js_1 = require("../operation-node/update-query-node.js");
8
+ const insert_values_parser_js_1 = require("../parser/insert-values-parser.js");
9
+ const join_parser_js_1 = require("../parser/join-parser.js");
10
+ const merge_parser_js_1 = require("../parser/merge-parser.js");
11
+ const top_parser_js_1 = require("../parser/top-parser.js");
12
+ const noop_query_executor_js_1 = require("../query-executor/noop-query-executor.js");
13
+ const object_utils_js_1 = require("../util/object-utils.js");
14
+ const prevent_await_js_1 = require("../util/prevent-await.js");
15
+ const merge_result_js_1 = require("./merge-result.js");
16
+ const no_result_error_js_1 = require("./no-result-error.js");
17
+ const update_query_builder_js_1 = require("./update-query-builder.js");
18
+ class MergeQueryBuilder {
19
+ #props;
20
+ constructor(props) {
21
+ this.#props = (0, object_utils_js_1.freeze)(props);
22
+ }
23
+ /**
24
+ * Changes a `merge into` query to an `merge top into` query.
25
+ *
26
+ * `top` clause is only supported by some dialects like MS SQL Server.
27
+ *
28
+ * ### Examples
29
+ *
30
+ * Affect 5 matched rows at most:
31
+ *
32
+ * ```ts
33
+ * await db.mergeInto('person')
34
+ * .top(5)
35
+ * .using('pet', 'person.id', 'pet.owner_id')
36
+ * .whenMatched()
37
+ * .thenDelete()
38
+ * .execute()
39
+ * ```
40
+ *
41
+ * The generated SQL (MS SQL Server):
42
+ *
43
+ * ```sql
44
+ * merge top(5) into "person"
45
+ * using "pet" on "person"."id" = "pet"."owner_id"
46
+ * when matched then
47
+ * delete
48
+ * ```
49
+ *
50
+ * Affect 50% of matched rows:
51
+ *
52
+ * ```ts
53
+ * await db.mergeInto('person')
54
+ * .top(50, 'percent')
55
+ * .using('pet', 'person.id', 'pet.owner_id')
56
+ * .whenMatched()
57
+ * .thenDelete()
58
+ * .execute()
59
+ * ```
60
+ *
61
+ * The generated SQL (MS SQL Server):
62
+ *
63
+ * ```sql
64
+ * merge top(50) percent into "person"
65
+ * using "pet" on "person"."id" = "pet"."owner_id"
66
+ * when matched then
67
+ * delete
68
+ * ```
69
+ */
70
+ top(expression, modifiers) {
71
+ return new MergeQueryBuilder({
72
+ ...this.#props,
73
+ queryNode: query_node_js_1.QueryNode.cloneWithTop(this.#props.queryNode, (0, top_parser_js_1.parseTop)(expression, modifiers)),
74
+ });
75
+ }
76
+ using(...args) {
77
+ return new WheneableMergeQueryBuilder({
78
+ ...this.#props,
79
+ queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithUsing(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('Using', args)),
80
+ });
81
+ }
82
+ }
83
+ exports.MergeQueryBuilder = MergeQueryBuilder;
84
+ (0, prevent_await_js_1.preventAwait)(MergeQueryBuilder, "don't await MergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
85
+ class WheneableMergeQueryBuilder {
86
+ #props;
87
+ constructor(props) {
88
+ this.#props = (0, object_utils_js_1.freeze)(props);
89
+ }
90
+ /**
91
+ * See {@link MergeQueryBuilder.top}.
92
+ */
93
+ top(expression, modifiers) {
94
+ return new WheneableMergeQueryBuilder({
95
+ ...this.#props,
96
+ queryNode: query_node_js_1.QueryNode.cloneWithTop(this.#props.queryNode, (0, top_parser_js_1.parseTop)(expression, modifiers)),
97
+ });
98
+ }
99
+ /**
100
+ * Adds a simple `when matched` clause to the query.
101
+ *
102
+ * For a `when matched` clause with an `and` condition, see {@link whenMatchedAnd}.
103
+ *
104
+ * For a simple `when not matched` clause, see {@link whenNotMatched}.
105
+ *
106
+ * For a `when not matched` clause with an `and` condition, see {@link whenNotMatchedAnd}.
107
+ *
108
+ * ### Examples
109
+ *
110
+ * ```ts
111
+ * const result = await db.mergeInto('person')
112
+ * .using('pet', 'person.id', 'pet.owner_id')
113
+ * .whenMatched()
114
+ * .thenDelete()
115
+ * .execute()
116
+ * ```
117
+ *
118
+ * The generated SQL (PostgreSQL):
119
+ *
120
+ * ```sql
121
+ * merge into "person"
122
+ * using "pet" on "person"."id" = "pet"."owner_id"
123
+ * when matched then
124
+ * delete
125
+ * ```
126
+ */
127
+ whenMatched() {
128
+ return this.#whenMatched([]);
129
+ }
130
+ whenMatchedAnd(...args) {
131
+ return this.#whenMatched(args);
132
+ }
133
+ /**
134
+ * Adds the `when matched` clause to the query with an `and` condition. But unlike
135
+ * {@link whenMatchedAnd}, this method accepts a column reference as the 3rd argument.
136
+ *
137
+ * This method is similar to {@link SelectQueryBuilder.whereRef}, so see the documentation
138
+ * for that method for more examples.
139
+ */
140
+ whenMatchedAndRef(lhs, op, rhs) {
141
+ return this.#whenMatched([lhs, op, rhs], true);
142
+ }
143
+ #whenMatched(args, refRight) {
144
+ return new MatchedThenableMergeQueryBuilder({
145
+ ...this.#props,
146
+ queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithWhen(this.#props.queryNode, (0, merge_parser_js_1.parseMergeWhen)({ isMatched: true }, args, refRight)),
147
+ });
148
+ }
149
+ /**
150
+ * Adds a simple `when not matched` clause to the query.
151
+ *
152
+ * For a `when not matched` clause with an `and` condition, see {@link whenNotMatchedAnd}.
153
+ *
154
+ * For a simple `when matched` clause, see {@link whenMatched}.
155
+ *
156
+ * For a `when matched` clause with an `and` condition, see {@link whenMatchedAnd}.
157
+ *
158
+ * ### Examples
159
+ *
160
+ * ```ts
161
+ * const result = await db.mergeInto('person')
162
+ * .using('pet', 'person.id', 'pet.owner_id')
163
+ * .whenNotMatched()
164
+ * .thenInsertValues({
165
+ * first_name: 'John',
166
+ * last_name: 'Doe',
167
+ * })
168
+ * .execute()
169
+ * ```
170
+ *
171
+ * The generated SQL (PostgreSQL):
172
+ *
173
+ * ```sql
174
+ * merge into "person"
175
+ * using "pet" on "person"."id" = "pet"."owner_id"
176
+ * when not matched then
177
+ * insert ("first_name", "last_name") values ($1, $2)
178
+ * ```
179
+ */
180
+ whenNotMatched() {
181
+ return this.#whenNotMatched([]);
182
+ }
183
+ whenNotMatchedAnd(...args) {
184
+ return this.#whenNotMatched(args);
185
+ }
186
+ /**
187
+ * Adds the `when not matched` clause to the query with an `and` condition. But unlike
188
+ * {@link whenNotMatchedAnd}, this method accepts a column reference as the 3rd argument.
189
+ *
190
+ * Unlike {@link whenMatchedAndRef}, you cannot reference columns from the target table.
191
+ *
192
+ * This method is similar to {@link SelectQueryBuilder.whereRef}, so see the documentation
193
+ * for that method for more examples.
194
+ */
195
+ whenNotMatchedAndRef(lhs, op, rhs) {
196
+ return this.#whenNotMatched([lhs, op, rhs], true);
197
+ }
198
+ /**
199
+ * Adds a simple `when not matched by source` clause to the query.
200
+ *
201
+ * Supported in MS SQL Server.
202
+ *
203
+ * Similar to {@link whenNotMatched}, but returns a {@link MatchedThenableMergeQueryBuilder}.
204
+ */
205
+ whenNotMatchedBySource() {
206
+ return this.#whenNotMatched([], false, true);
207
+ }
208
+ whenNotMatchedBySourceAnd(...args) {
209
+ return this.#whenNotMatched(args, false, true);
210
+ }
211
+ /**
212
+ * Adds the `when not matched by source` clause to the query with an `and` condition.
213
+ *
214
+ * Similar to {@link whenNotMatchedAndRef}, but you can reference columns from
215
+ * the target table, and not from source table and returns a {@link MatchedThenableMergeQueryBuilder}.
216
+ */
217
+ whenNotMatchedBySourceAndRef(lhs, op, rhs) {
218
+ return this.#whenNotMatched([lhs, op, rhs], true, true);
219
+ }
220
+ #whenNotMatched(args, refRight = false, bySource = false) {
221
+ const props = {
222
+ ...this.#props,
223
+ queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithWhen(this.#props.queryNode, (0, merge_parser_js_1.parseMergeWhen)({ isMatched: false, bySource }, args, refRight)),
224
+ };
225
+ const Builder = bySource
226
+ ? MatchedThenableMergeQueryBuilder
227
+ : NotMatchedThenableMergeQueryBuilder;
228
+ return new Builder(props);
229
+ }
230
+ /**
231
+ * Simply calls the provided function passing `this` as the only argument. `$call` returns
232
+ * what the provided function returns.
233
+ *
234
+ * If you want to conditionally call a method on `this`, see
235
+ * the {@link $if} method.
236
+ *
237
+ * ### Examples
238
+ *
239
+ * The next example uses a helper function `log` to log a query:
240
+ *
241
+ * ```ts
242
+ * function log<T extends Compilable>(qb: T): T {
243
+ * console.log(qb.compile())
244
+ * return qb
245
+ * }
246
+ *
247
+ * db.updateTable('person')
248
+ * .set(values)
249
+ * .$call(log)
250
+ * .execute()
251
+ * ```
252
+ */
253
+ $call(func) {
254
+ return func(this);
255
+ }
256
+ /**
257
+ * Call `func(this)` if `condition` is true.
258
+ *
259
+ * This method is especially handy with optional selects. Any `returning` or `returningAll`
260
+ * method calls add columns as optional fields to the output type when called inside
261
+ * the `func` callback. This is because we can't know if those selections were actually
262
+ * made before running the code.
263
+ *
264
+ * You can also call any other methods inside the callback.
265
+ *
266
+ * ### Examples
267
+ *
268
+ * ```ts
269
+ * async function updatePerson(id: number, updates: UpdateablePerson, returnLastName: boolean) {
270
+ * return await db
271
+ * .updateTable('person')
272
+ * .set(updates)
273
+ * .where('id', '=', id)
274
+ * .returning(['id', 'first_name'])
275
+ * .$if(returnLastName, (qb) => qb.returning('last_name'))
276
+ * .executeTakeFirstOrThrow()
277
+ * }
278
+ * ```
279
+ *
280
+ * Any selections added inside the `if` callback will be added as optional fields to the
281
+ * output type since we can't know if the selections were actually made before running
282
+ * the code. In the example above the return type of the `updatePerson` function is:
283
+ *
284
+ * ```ts
285
+ * {
286
+ * id: number
287
+ * first_name: string
288
+ * last_name?: string
289
+ * }
290
+ * ```
291
+ */
292
+ $if(condition, func) {
293
+ if (condition) {
294
+ return func(this);
295
+ }
296
+ return new WheneableMergeQueryBuilder({
297
+ ...this.#props,
298
+ });
299
+ }
300
+ toOperationNode() {
301
+ return this.#props.executor.transformQuery(this.#props.queryNode, this.#props.queryId);
302
+ }
303
+ compile() {
304
+ return this.#props.executor.compileQuery(this.#props.queryNode, this.#props.queryId);
305
+ }
306
+ /**
307
+ * Executes the query and returns an array of rows.
308
+ *
309
+ * Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods.
310
+ */
311
+ async execute() {
312
+ const compiledQuery = this.compile();
313
+ const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
314
+ return [new merge_result_js_1.MergeResult(result.numAffectedRows)];
315
+ }
316
+ /**
317
+ * Executes the query and returns the first result or undefined if
318
+ * the query returned no result.
319
+ */
320
+ async executeTakeFirst() {
321
+ const [result] = await this.execute();
322
+ return result;
323
+ }
324
+ /**
325
+ * Executes the query and returns the first result or throws if
326
+ * the query returned no result.
327
+ *
328
+ * By default an instance of {@link NoResultError} is thrown, but you can
329
+ * provide a custom error class, or callback as the only argument to throw a different
330
+ * error.
331
+ */
332
+ async executeTakeFirstOrThrow(errorConstructor = no_result_error_js_1.NoResultError) {
333
+ const result = await this.executeTakeFirst();
334
+ if (result === undefined) {
335
+ const error = (0, no_result_error_js_1.isNoResultErrorConstructor)(errorConstructor)
336
+ ? new errorConstructor(this.toOperationNode())
337
+ : errorConstructor(this.toOperationNode());
338
+ throw error;
339
+ }
340
+ return result;
341
+ }
342
+ }
343
+ exports.WheneableMergeQueryBuilder = WheneableMergeQueryBuilder;
344
+ (0, prevent_await_js_1.preventAwait)(WheneableMergeQueryBuilder, "don't await WheneableMergeQueryBuilder instances directly. To execute the query you need to call `execute`.");
345
+ class MatchedThenableMergeQueryBuilder {
346
+ #props;
347
+ constructor(props) {
348
+ this.#props = (0, object_utils_js_1.freeze)(props);
349
+ }
350
+ /**
351
+ * Performs the `delete` action.
352
+ *
353
+ * To perform the `do nothing` action, see {@link thenDoNothing}.
354
+ *
355
+ * To perform the `update` action, see {@link thenUpdate} or {@link thenUpdateSet}.
356
+ *
357
+ * ### Examples
358
+ *
359
+ * ```ts
360
+ * const result = await db.mergeInto('person')
361
+ * .using('pet', 'person.id', 'pet.owner_id')
362
+ * .whenMatched()
363
+ * .thenDelete()
364
+ * .execute()
365
+ * ```
366
+ *
367
+ * The generated SQL (PostgreSQL):
368
+ *
369
+ * ```sql
370
+ * merge into "person"
371
+ * using "pet" on "person"."id" = "pet"."owner_id"
372
+ * when matched then
373
+ * delete
374
+ * ```
375
+ */
376
+ thenDelete() {
377
+ return new WheneableMergeQueryBuilder({
378
+ ...this.#props,
379
+ queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithThen(this.#props.queryNode, (0, merge_parser_js_1.parseMergeThen)('delete')),
380
+ });
381
+ }
382
+ /**
383
+ * Performs the `do nothing` action.
384
+ *
385
+ * This is supported in PostgreSQL.
386
+ *
387
+ * To perform the `delete` action, see {@link thenDelete}.
388
+ *
389
+ * To perform the `update` action, see {@link thenUpdate} or {@link thenUpdateSet}.
390
+ *
391
+ * ### Examples
392
+ *
393
+ * ```ts
394
+ * const result = await db.mergeInto('person')
395
+ * .using('pet', 'person.id', 'pet.owner_id')
396
+ * .whenMatched()
397
+ * .thenDoNothing()
398
+ * .execute()
399
+ * ```
400
+ *
401
+ * The generated SQL (PostgreSQL):
402
+ *
403
+ * ```sql
404
+ * merge into "person"
405
+ * using "pet" on "person"."id" = "pet"."owner_id"
406
+ * when matched then
407
+ * do nothing
408
+ * ```
409
+ */
410
+ thenDoNothing() {
411
+ return new WheneableMergeQueryBuilder({
412
+ ...this.#props,
413
+ queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithThen(this.#props.queryNode, (0, merge_parser_js_1.parseMergeThen)('do nothing')),
414
+ });
415
+ }
416
+ /**
417
+ * Perform an `update` operation with a full-fledged {@link UpdateQueryBuilder}.
418
+ * This is handy when multiple `set` invocations are needed.
419
+ *
420
+ * For a shorthand version of this method, see {@link thenUpdateSet}.
421
+ *
422
+ * To perform the `delete` action, see {@link thenDelete}.
423
+ *
424
+ * To perform the `do nothing` action, see {@link thenDoNothing}.
425
+ *
426
+ * ### Examples
427
+ *
428
+ * ```ts
429
+ * import { sql } from 'kysely'
430
+ *
431
+ * const result = await db.mergeInto('person')
432
+ * .using('pet', 'person.id', 'pet.owner_id')
433
+ * .whenMatched()
434
+ * .thenUpdate((ub) => ub
435
+ * .set(sql`metadata['has_pets']`, 'Y')
436
+ * .set({
437
+ * updated_at: Date.now(),
438
+ * })
439
+ * )
440
+ * .execute()
441
+ * ```
442
+ *
443
+ * The generated SQL (PostgreSQL):
444
+ *
445
+ * ```sql
446
+ * merge into "person"
447
+ * using "pet" on "person"."id" = "pet"."owner_id"
448
+ * when matched then
449
+ * update set metadata['has_pets'] = $1, "updated_at" = $2
450
+ * ```
451
+ */
452
+ thenUpdate(set) {
453
+ return new WheneableMergeQueryBuilder({
454
+ ...this.#props,
455
+ queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithThen(this.#props.queryNode, (0, merge_parser_js_1.parseMergeThen)(set(new update_query_builder_js_1.UpdateQueryBuilder({
456
+ queryId: this.#props.queryId,
457
+ executor: noop_query_executor_js_1.NOOP_QUERY_EXECUTOR,
458
+ queryNode: update_query_node_js_1.UpdateQueryNode.createWithoutTable(),
459
+ })))),
460
+ });
461
+ }
462
+ thenUpdateSet(...args) {
463
+ // @ts-ignore not sure how to type this so it won't complain about set(...args).
464
+ return this.thenUpdate((ub) => ub.set(...args));
465
+ }
466
+ }
467
+ exports.MatchedThenableMergeQueryBuilder = MatchedThenableMergeQueryBuilder;
468
+ (0, prevent_await_js_1.preventAwait)(MatchedThenableMergeQueryBuilder, "don't await MatchedThenableMergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
469
+ class NotMatchedThenableMergeQueryBuilder {
470
+ #props;
471
+ constructor(props) {
472
+ this.#props = (0, object_utils_js_1.freeze)(props);
473
+ }
474
+ /**
475
+ * Performs the `do nothing` action.
476
+ *
477
+ * This is supported in PostgreSQL.
478
+ *
479
+ * To perform the `insert` action, see {@link thenInsertValues}.
480
+ *
481
+ * ### Examples
482
+ *
483
+ * ```ts
484
+ * const result = await db.mergeInto('person')
485
+ * .using('pet', 'person.id', 'pet.owner_id')
486
+ * .whenNotMatched()
487
+ * .thenDoNothing()
488
+ * .execute()
489
+ * ```
490
+ *
491
+ * The generated SQL (PostgreSQL):
492
+ *
493
+ * ```sql
494
+ * merge into "person"
495
+ * using "pet" on "person"."id" = "pet"."owner_id"
496
+ * when not matched then
497
+ * do nothing
498
+ * ```
499
+ */
500
+ thenDoNothing() {
501
+ return new WheneableMergeQueryBuilder({
502
+ ...this.#props,
503
+ queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithThen(this.#props.queryNode, (0, merge_parser_js_1.parseMergeThen)('do nothing')),
504
+ });
505
+ }
506
+ thenInsertValues(insert) {
507
+ const [columns, values] = (0, insert_values_parser_js_1.parseInsertExpression)(insert);
508
+ return new WheneableMergeQueryBuilder({
509
+ ...this.#props,
510
+ queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithThen(this.#props.queryNode, (0, merge_parser_js_1.parseMergeThen)(insert_query_node_js_1.InsertQueryNode.cloneWith(insert_query_node_js_1.InsertQueryNode.createWithoutInto(), {
511
+ columns,
512
+ values,
513
+ }))),
514
+ });
515
+ }
516
+ }
517
+ exports.NotMatchedThenableMergeQueryBuilder = NotMatchedThenableMergeQueryBuilder;
518
+ (0, prevent_await_js_1.preventAwait)(NotMatchedThenableMergeQueryBuilder, "don't await NotMatchedThenableMergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
@@ -0,0 +1,4 @@
1
+ export declare class MergeResult {
2
+ readonly numChangedRows: bigint | undefined;
3
+ constructor(numChangedRows: bigint | undefined);
4
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MergeResult = void 0;
4
+ class MergeResult {
5
+ numChangedRows;
6
+ constructor(numChangedRows) {
7
+ this.numChangedRows = numChangedRows;
8
+ }
9
+ }
10
+ exports.MergeResult = MergeResult;
@@ -26,6 +26,8 @@ import { ExpressionOrFactory } from '../parser/expression-parser.js';
26
26
  import { ExpressionWrapper } from '../expression/expression-wrapper.js';
27
27
  import { SelectQueryBuilderExpression } from './select-query-builder-expression.js';
28
28
  import { ValueExpression } from '../parser/value-parser.js';
29
+ import { FetchModifier } from '../operation-node/fetch-node.js';
30
+ import { TopModifier } from '../operation-node/top-node.js';
29
31
  export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInterface<DB, TB>, HavingInterface<DB, TB>, SelectQueryBuilderExpression<O>, Compilable<O>, Explainable, Streamable<O> {
30
32
  /**
31
33
  * Adds a `where` expression to the query.
@@ -809,8 +811,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
809
811
  * builder for creating more complex joins. The join builder has a
810
812
  * bunch of `on*` methods for building the `on` clause of the join.
811
813
  * There's basically an equivalent for every `where` method
812
- * (`on`, `onRef` etc.). You can do all the same things with the
813
- * `on` method that you can with the corresponding `where` method.
814
+ * (`on`, `onRef` etc.).
815
+ *
816
+ * You can do all the same things with the
817
+ * `on` method that you can with the corresponding `where` method (like [OR expressions for example](https://kysely.dev/docs/examples/WHERE/or-where)).
814
818
  * See the `where` method documentation for more examples.
815
819
  *
816
820
  * ```ts
@@ -820,6 +824,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
820
824
  * (join) => join
821
825
  * .onRef('pet.owner_id', '=', 'person.id')
822
826
  * .on('pet.name', '=', 'Doggo')
827
+ * .on((eb) => eb.or([eb("person.age", ">", 18), eb("person.age", "<", 100)]))
823
828
  * )
824
829
  * .selectAll()
825
830
  * .execute()
@@ -1150,6 +1155,13 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1150
1155
  * .selectFrom('person')
1151
1156
  * .select('first_name')
1152
1157
  * .limit(10)
1158
+ * .execute()
1159
+ * ```
1160
+ *
1161
+ * The generated SQL (PostgreSQL):
1162
+ *
1163
+ * ```sql
1164
+ * select "first_name" from "person" limit $1
1153
1165
  * ```
1154
1166
  *
1155
1167
  * Select rows from index 10 to index 19 of the result:
@@ -1158,13 +1170,20 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1158
1170
  * return await db
1159
1171
  * .selectFrom('person')
1160
1172
  * .select('first_name')
1161
- * .offset(10)
1162
1173
  * .limit(10)
1174
+ * .offset(10)
1175
+ * .execute()
1176
+ * ```
1177
+ *
1178
+ * The generated SQL (PostgreSQL):
1179
+ *
1180
+ * ```sql
1181
+ * select "first_name" from "person" limit $1 offset $2
1163
1182
  * ```
1164
1183
  */
1165
- limit(limit: ValueExpression<DB, TB, number>): SelectQueryBuilder<DB, TB, O>;
1184
+ limit(limit: ValueExpression<DB, TB, number | bigint>): SelectQueryBuilder<DB, TB, O>;
1166
1185
  /**
1167
- * Adds an offset clause to the query.
1186
+ * Adds an `offset` clause to the query.
1168
1187
  *
1169
1188
  * ### Examples
1170
1189
  *
@@ -1174,11 +1193,87 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1174
1193
  * return await db
1175
1194
  * .selectFrom('person')
1176
1195
  * .select('first_name')
1177
- * .offset(10)
1178
1196
  * .limit(10)
1197
+ * .offset(10)
1198
+ * .execute()
1199
+ * ```
1200
+ *
1201
+ * The generated SQL (PostgreSQL):
1202
+ *
1203
+ * ```sql
1204
+ * select "first_name" from "person" limit $1 offset $2
1205
+ * ```
1206
+ */
1207
+ offset(offset: ValueExpression<DB, TB, number | bigint>): SelectQueryBuilder<DB, TB, O>;
1208
+ /**
1209
+ * Adds a `fetch` clause to the query.
1210
+ *
1211
+ * This clause is only supported by some dialects like PostgreSQL or MS SQL Server.
1212
+ *
1213
+ * ### Examples
1214
+ *
1215
+ * ```ts
1216
+ * return await db
1217
+ * .selectFrom('person')
1218
+ * .select('first_name')
1219
+ * .orderBy('first_name')
1220
+ * .offset(0)
1221
+ * .fetch(10)
1222
+ * .execute()
1223
+ * ```
1224
+ *
1225
+ * The generated SQL (MS SQL Server):
1226
+ *
1227
+ * ```sql
1228
+ * select "first_name"
1229
+ * from "person"
1230
+ * order by "first_name"
1231
+ * offset 0 rows
1232
+ * fetch next 10 rows only
1233
+ * ```
1234
+ */
1235
+ fetch(rowCount: number | bigint, modifier?: FetchModifier): SelectQueryBuilder<DB, TB, O>;
1236
+ /**
1237
+ * Adds a `top` clause to the query.
1238
+ *
1239
+ * This clause is only supported by some dialects like MS SQL Server.
1240
+ *
1241
+ * ### Examples
1242
+ *
1243
+ * Select 10 biggest ages:
1244
+ *
1245
+ * ```ts
1246
+ * return await db
1247
+ * .selectFrom('person')
1248
+ * .select('age')
1249
+ * .top(10)
1250
+ * .orderBy('age desc')
1251
+ * .execute()
1252
+ * ```
1253
+ *
1254
+ * The generated SQL (MS SQL Server):
1255
+ *
1256
+ * ```sql
1257
+ * select top(10) "age" from "person" order by "age" desc
1258
+ * ```
1259
+ *
1260
+ * Select 10% first rows:
1261
+ *
1262
+ * ```ts
1263
+ * return await db
1264
+ * .selectFrom('person')
1265
+ * .selectAll()
1266
+ * .top(10, 'percent')
1267
+ * .execute()
1268
+ * ```
1269
+ *
1270
+ * The generated SQL (MS SQL Server):
1271
+ *
1272
+ * ```sql
1273
+ * select top(10) percent * from "person"
1179
1274
  * ```
1180
1275
  */
1181
- offset(offset: ValueExpression<DB, TB, number>): SelectQueryBuilder<DB, TB, O>;
1276
+ top(expression: number | bigint, modifiers?: TopModifier): SelectQueryBuilder<DB, TB, O>;
1182
1277
  /**
1183
1278
  * Combines another select query or raw expression to this query using `union`.
1184
1279
  *