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
@@ -19,6 +19,8 @@ import { parseSetOperations, } from '../parser/set-operation-parser.js';
19
19
  import { parseValueBinaryOperationOrExpression, parseReferentialBinaryOperation, } from '../parser/binary-operation-parser.js';
20
20
  import { ExpressionWrapper } from '../expression/expression-wrapper.js';
21
21
  import { parseValueExpression, } from '../parser/value-parser.js';
22
+ import { parseFetch } from '../parser/fetch-parser.js';
23
+ import { parseTop } from '../parser/top-parser.js';
22
24
  class SelectQueryBuilderImpl {
23
25
  #props;
24
26
  constructor(props) {
@@ -186,6 +188,18 @@ class SelectQueryBuilderImpl {
186
188
  queryNode: SelectQueryNode.cloneWithOffset(this.#props.queryNode, OffsetNode.create(parseValueExpression(offset))),
187
189
  });
188
190
  }
191
+ fetch(rowCount, modifier = 'only') {
192
+ return new SelectQueryBuilderImpl({
193
+ ...this.#props,
194
+ queryNode: SelectQueryNode.cloneWithFetch(this.#props.queryNode, parseFetch(rowCount, modifier)),
195
+ });
196
+ }
197
+ top(expression, modifiers) {
198
+ return new SelectQueryBuilderImpl({
199
+ ...this.#props,
200
+ queryNode: QueryNode.cloneWithTop(this.#props.queryNode, parseTop(expression, modifiers)),
201
+ });
202
+ }
189
203
  union(expression) {
190
204
  return new SelectQueryBuilderImpl({
191
205
  ...this.#props,
@@ -8,7 +8,7 @@ import { ReferenceExpression } from '../parser/reference-parser.js';
8
8
  import { QueryNode } from '../operation-node/query-node.js';
9
9
  import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, SimplifyResult, SimplifySingleResult, SqlBool } from '../util/type-utils.js';
10
10
  import { UpdateQueryNode } from '../operation-node/update-query-node.js';
11
- import { UpdateObject, UpdateObjectFactory, ExtractUpdateTypeFromReferenceExpression } from '../parser/update-set-parser.js';
11
+ import { UpdateObjectExpression, ExtractUpdateTypeFromReferenceExpression } from '../parser/update-set-parser.js';
12
12
  import { Compilable } from '../util/compilable.js';
13
13
  import { QueryExecutor } from '../query-executor/query-executor.js';
14
14
  import { QueryId } from '../util/query-id.js';
@@ -400,6 +400,46 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
400
400
  * ```
401
401
  */
402
402
  clearWhere(): UpdateQueryBuilder<DB, UT, TB, O>;
403
+ /**
404
+ * Changes an `update` query into a `update top` query.
405
+ *
406
+ * `top` clause is only supported by some dialects like MS SQL Server.
407
+ *
408
+ * ### Examples
409
+ *
410
+ * Update the first row:
411
+ *
412
+ * ```ts
413
+ * await db.updateTable('person')
414
+ * .top(1)
415
+ * .set({ first_name: 'Foo' })
416
+ * .where('age', '>', 18)
417
+ * .executeTakeFirstOrThrow()
418
+ * ```
419
+ *
420
+ * The generated SQL (MS SQL Server):
421
+ *
422
+ * ```sql
423
+ * update top(1) "person" set "first_name" = @1 where "age" > @2
424
+ * ```
425
+ *
426
+ * Update the 50% first rows:
427
+ *
428
+ * ```ts
429
+ * await db.updateTable('person')
430
+ * .top(50, 'percent')
431
+ * .set({ first_name: 'Foo' })
432
+ * .where('age', '>', 18)
433
+ * .executeTakeFirstOrThrow()
434
+ * ```
435
+ *
436
+ * The generated SQL (MS SQL Server):
437
+ *
438
+ * ```sql
439
+ * update top(50) percent "person" set "first_name" = @1 where "age" > @2
440
+ * ```
441
+ */
442
+ top(expression: number | bigint, modifiers?: 'percent'): UpdateQueryBuilder<DB, UT, TB, O>;
403
443
  /**
404
444
  * Adds a from clause to the update query.
405
445
  *
@@ -555,6 +595,26 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
555
595
  */
556
596
  fullJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilderWithFullJoin<DB, UT, TB, O, TE>;
557
597
  fullJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilderWithFullJoin<DB, UT, TB, O, TE>;
598
+ /**
599
+ * Adds a limit clause to the update query for supported databases, such as MySQL.
600
+ *
601
+ * ### Examples
602
+ *
603
+ * Update the first 2 rows in the 'person' table:
604
+ *
605
+ * ```ts
606
+ * return await db
607
+ * .updateTable('person')
608
+ * .set({ first_name: 'Foo' })
609
+ * .limit(2);
610
+ * ```
611
+ *
612
+ * The generated SQL (MySQL):
613
+ * ```sql
614
+ * update `person` set `first_name` = 'Foo' limit 2
615
+ * ```
616
+ */
617
+ limit(limit: ValueExpression<DB, TB, number>): UpdateQueryBuilder<DB, UT, TB, O>;
558
618
  /**
559
619
  * Sets the values to update for an {@link Kysely.updateTable | update} query.
560
620
  *
@@ -695,8 +755,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
695
755
  * where "id" = $5
696
756
  * ```
697
757
  */
698
- set(update: UpdateObject<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
699
- set(update: UpdateObjectFactory<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
758
+ set(update: UpdateObjectExpression<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
700
759
  set<RE extends ReferenceExpression<DB, UT>>(key: RE, value: ValueExpression<DB, TB, ExtractUpdateTypeFromReferenceExpression<DB, UT, RE>>): UpdateQueryBuilder<DB, UT, TB, O>;
701
760
  /**
702
761
  * Allows you to return data from modified rows.
@@ -765,6 +824,26 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
765
824
  * that support `returning` such as PostgreSQL.
766
825
  */
767
826
  returningAll(): UpdateQueryBuilder<DB, UT, TB, Selectable<DB[TB]>>;
827
+ /**
828
+ * Clears all `returning` clauses from the query.
829
+ *
830
+ * ### Examples
831
+ *
832
+ * ```ts
833
+ * db.updateTable('person')
834
+ * .returningAll()
835
+ * .set({ age: 39 })
836
+ * .where('first_name', '=', 'John')
837
+ * .clearReturning()
838
+ * ```
839
+ *
840
+ * The generated SQL(PostgreSQL):
841
+ *
842
+ * ```sql
843
+ * update "person" set "age" = 39 where "first_name" = "John"
844
+ * ```
845
+ */
846
+ clearReturning(): UpdateQueryBuilder<DB, UT, TB, UpdateResult>;
768
847
  /**
769
848
  * Simply calls the provided function passing `this` as the only argument. `$call` returns
770
849
  * what the provided function returns.
@@ -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,
@@ -81,6 +154,31 @@ export class UpdateQueryBuilder {
81
154
  queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll()),
82
155
  });
83
156
  }
157
+ /**
158
+ * Clears all `returning` clauses from the query.
159
+ *
160
+ * ### Examples
161
+ *
162
+ * ```ts
163
+ * db.updateTable('person')
164
+ * .returningAll()
165
+ * .set({ age: 39 })
166
+ * .where('first_name', '=', 'John')
167
+ * .clearReturning()
168
+ * ```
169
+ *
170
+ * The generated SQL(PostgreSQL):
171
+ *
172
+ * ```sql
173
+ * update "person" set "age" = 39 where "first_name" = "John"
174
+ * ```
175
+ */
176
+ clearReturning() {
177
+ return new UpdateQueryBuilder({
178
+ ...this.#props,
179
+ queryNode: QueryNode.cloneWithoutReturning(this.#props.queryNode),
180
+ });
181
+ }
84
182
  /**
85
183
  * Simply calls the provided function passing `this` as the only argument. `$call` returns
86
184
  * what the provided function returns.
@@ -88,7 +88,12 @@ 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';
92
97
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
93
98
  #private;
94
99
  protected get numParameters(): number;
@@ -185,7 +190,12 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
185
190
  protected visitJSONPath(node: JSONPathNode): void;
186
191
  protected visitJSONPathLeg(node: JSONPathLegNode): void;
187
192
  protected visitJSONOperatorChain(node: JSONOperatorChainNode): void;
193
+ protected visitMergeQuery(node: MergeQueryNode): void;
194
+ protected visitMatched(node: MatchedNode): void;
188
195
  protected visitAddIndex(node: AddIndexNode): void;
196
+ protected visitCast(node: CastNode): void;
197
+ protected visitFetch(node: FetchNode): void;
198
+ protected visitTop(node: TopNode): void;
189
199
  protected append(str: string): void;
190
200
  protected appendValue(parameter: unknown): void;
191
201
  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 = [];
@@ -54,6 +55,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
54
55
  this.append(' ');
55
56
  this.compileList(node.frontModifiers, ' ');
56
57
  }
58
+ if (node.top) {
59
+ this.append(' ');
60
+ this.visitNode(node.top);
61
+ }
57
62
  if (node.selections) {
58
63
  this.append(' ');
59
64
  this.compileList(node.selections);
@@ -94,6 +99,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
94
99
  this.append(' ');
95
100
  this.visitNode(node.offset);
96
101
  }
102
+ if (node.fetch) {
103
+ this.append(' ');
104
+ this.visitNode(node.fetch);
105
+ }
97
106
  if (node.endModifiers?.length) {
98
107
  this.append(' ');
99
108
  this.compileList(this.sortSelectModifiers([...node.endModifiers]), ' ');
@@ -135,12 +144,13 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
135
144
  this.visitNode(node.having);
136
145
  }
137
146
  visitInsertQuery(node) {
138
- const isSubQuery = this.nodeStack.find(QueryNode.is) !== node;
147
+ const rootQueryNode = this.nodeStack.find(QueryNode.is);
148
+ const isSubQuery = rootQueryNode !== node;
139
149
  if (!isSubQuery && node.explain) {
140
150
  this.visitNode(node.explain);
141
151
  this.append(' ');
142
152
  }
143
- if (isSubQuery) {
153
+ if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
144
154
  this.append('(');
145
155
  }
146
156
  if (node.with) {
@@ -151,8 +161,14 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
151
161
  if (node.ignore) {
152
162
  this.append(' ignore');
153
163
  }
154
- this.append(' into ');
155
- this.visitNode(node.into);
164
+ if (node.top) {
165
+ this.append(' ');
166
+ this.visitNode(node.top);
167
+ }
168
+ if (node.into) {
169
+ this.append(' into ');
170
+ this.visitNode(node.into);
171
+ }
156
172
  if (node.columns) {
157
173
  this.append(' (');
158
174
  this.compileList(node.columns);
@@ -178,7 +194,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
178
194
  this.append(' ');
179
195
  this.visitNode(node.returning);
180
196
  }
181
- if (isSubQuery) {
197
+ if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
182
198
  this.append(')');
183
199
  }
184
200
  }
@@ -200,6 +216,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
200
216
  this.append(' ');
201
217
  }
202
218
  this.append('delete ');
219
+ if (node.top) {
220
+ this.visitNode(node.top);
221
+ this.append(' ');
222
+ }
203
223
  this.visitNode(node.from);
204
224
  if (node.using) {
205
225
  this.append(' ');
@@ -385,6 +405,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
385
405
  this.append(' ');
386
406
  this.visitNode(node.generated);
387
407
  }
408
+ if (node.identity) {
409
+ this.append(' identity');
410
+ }
388
411
  if (node.defaultTo) {
389
412
  this.append(' ');
390
413
  this.visitNode(node.defaultTo);
@@ -468,12 +491,13 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
468
491
  this.visitNode(node.groupBy);
469
492
  }
470
493
  visitUpdateQuery(node) {
471
- const isSubQuery = this.nodeStack.find(QueryNode.is) !== node;
494
+ const rootQueryNode = this.nodeStack.find(QueryNode.is);
495
+ const isSubQuery = rootQueryNode !== node;
472
496
  if (!isSubQuery && node.explain) {
473
497
  this.visitNode(node.explain);
474
498
  this.append(' ');
475
499
  }
476
- if (isSubQuery) {
500
+ if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
477
501
  this.append('(');
478
502
  }
479
503
  if (node.with) {
@@ -481,8 +505,15 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
481
505
  this.append(' ');
482
506
  }
483
507
  this.append('update ');
484
- this.visitNode(node.table);
485
- this.append(' set ');
508
+ if (node.top) {
509
+ this.visitNode(node.top);
510
+ this.append(' ');
511
+ }
512
+ if (node.table) {
513
+ this.visitNode(node.table);
514
+ this.append(' ');
515
+ }
516
+ this.append('set ');
486
517
  if (node.updates) {
487
518
  this.compileList(node.updates);
488
519
  }
@@ -498,11 +529,15 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
498
529
  this.append(' ');
499
530
  this.visitNode(node.where);
500
531
  }
532
+ if (node.limit) {
533
+ this.append(' ');
534
+ this.visitNode(node.limit);
535
+ }
501
536
  if (node.returning) {
502
537
  this.append(' ');
503
538
  this.visitNode(node.returning);
504
539
  }
505
- if (isSubQuery) {
540
+ if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
506
541
  this.append(')');
507
542
  }
508
543
  }
@@ -1038,6 +1073,36 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
1038
1073
  this.visitNode(node.values[i]);
1039
1074
  }
1040
1075
  }
1076
+ visitMergeQuery(node) {
1077
+ if (node.with) {
1078
+ this.visitNode(node.with);
1079
+ this.append(' ');
1080
+ }
1081
+ this.append('merge ');
1082
+ if (node.top) {
1083
+ this.visitNode(node.top);
1084
+ this.append(' ');
1085
+ }
1086
+ this.append('into ');
1087
+ this.visitNode(node.into);
1088
+ if (node.using) {
1089
+ this.append(' ');
1090
+ this.visitNode(node.using);
1091
+ }
1092
+ if (node.whens) {
1093
+ this.append(' ');
1094
+ this.compileList(node.whens);
1095
+ }
1096
+ }
1097
+ visitMatched(node) {
1098
+ if (node.not) {
1099
+ this.append('not ');
1100
+ }
1101
+ this.append('matched');
1102
+ if (node.bySource) {
1103
+ this.append(' by source');
1104
+ }
1105
+ }
1041
1106
  visitAddIndex(node) {
1042
1107
  this.append('add ');
1043
1108
  if (node.unique) {
@@ -1055,6 +1120,24 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
1055
1120
  this.visitNode(node.using);
1056
1121
  }
1057
1122
  }
1123
+ visitCast(node) {
1124
+ this.append('cast(');
1125
+ this.visitNode(node.expression);
1126
+ this.append(' as ');
1127
+ this.visitNode(node.dataType);
1128
+ this.append(')');
1129
+ }
1130
+ visitFetch(node) {
1131
+ this.append('fetch next ');
1132
+ this.visitNode(node.rowCount);
1133
+ this.append(` rows ${node.modifier}`);
1134
+ }
1135
+ visitTop(node) {
1136
+ this.append(`top(${node.expression})`);
1137
+ if (node.modifiers) {
1138
+ this.append(` ${node.modifiers}`);
1139
+ }
1140
+ }
1058
1141
  append(str) {
1059
1142
  this.#sql += str;
1060
1143
  }
@@ -1164,4 +1247,5 @@ const JOIN_TYPE_SQL = freeze({
1164
1247
  FullJoin: 'full join',
1165
1248
  LateralInnerJoin: 'inner join lateral',
1166
1249
  LateralLeftJoin: 'left join lateral',
1250
+ Using: 'using',
1167
1251
  });
@@ -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);
@@ -125,7 +127,7 @@ export declare class QueryCreator<DB> {
125
127
  selectFrom<TE extends keyof DB & string>(from: TE[]): SelectQueryBuilder<DB, ExtractTableAlias<DB, TE>, {}>;
126
128
  selectFrom<TE extends TableExpression<DB, keyof DB>>(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>, {}>;
130
+ selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, ExtractTableAlias<DB & PickTableWithAlias<DB, TE>, TE>, {}>;
129
131
  selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
130
132
  /**
131
133
  * Creates a `select` query builder without a `from` clause.
@@ -320,8 +322,44 @@ 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
  *
@@ -7,13 +7,15 @@ import { DeleteQueryNode } from './operation-node/delete-query-node.js';
7
7
  import { InsertQueryNode } from './operation-node/insert-query-node.js';
8
8
  import { SelectQueryNode } from './operation-node/select-query-node.js';
9
9
  import { UpdateQueryNode } from './operation-node/update-query-node.js';
10
- import { parseTable, parseTableExpression, parseTableExpressionOrList, } from './parser/table-parser.js';
10
+ import { parseTable, parseTableExpression, parseTableExpressionOrList, parseAliasedTable, } from './parser/table-parser.js';
11
11
  import { parseCommonTableExpression, } from './parser/with-parser.js';
12
12
  import { WithNode } from './operation-node/with-node.js';
13
13
  import { createQueryId } from './util/query-id.js';
14
14
  import { WithSchemaPlugin } from './plugin/with-schema/with-schema-plugin.js';
15
15
  import { freeze } from './util/object-utils.js';
16
16
  import { parseSelectArg, } from './parser/select-parser.js';
17
+ import { MergeQueryBuilder } from './query-builder/merge-query-builder.js';
18
+ import { MergeQueryNode } from './operation-node/merge-query-node.js';
17
19
  export class QueryCreator {
18
20
  #props;
19
21
  constructor(props) {
@@ -125,6 +127,13 @@ export class QueryCreator {
125
127
  queryNode: UpdateQueryNode.create(parseTableExpression(table), this.#props.withNode),
126
128
  });
127
129
  }
130
+ mergeInto(targetTable) {
131
+ return new MergeQueryBuilder({
132
+ queryId: createQueryId(),
133
+ executor: this.#props.executor,
134
+ queryNode: MergeQueryNode.create(parseAliasedTable(targetTable), this.#props.withNode),
135
+ });
136
+ }
128
137
  /**
129
138
  * Creates a `with` query (Common Table Expression).
130
139
  *
@@ -2,7 +2,7 @@
2
2
  import { AddIndexNode } from '../operation-node/add-index-node.js';
3
3
  import { AlterTableNode } from '../operation-node/alter-table-node.js';
4
4
  import { RawNode } from '../operation-node/raw-node.js';
5
- import { parseOrderedColumnName } from '../parser/reference-parser.js';
5
+ import { parseOrderedColumnName, } from '../parser/reference-parser.js';
6
6
  import { freeze } from '../util/object-utils.js';
7
7
  import { preventAwait } from '../util/prevent-await.js';
8
8
  export class AlterTableAddIndexBuilder {
@@ -50,7 +50,9 @@ export class AlterTableAddIndexBuilder {
50
50
  return new AlterTableAddIndexBuilder({
51
51
  ...this.#props,
52
52
  node: AlterTableNode.cloneWithTableProps(this.#props.node, {
53
- addIndex: AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [parseOrderedColumnName(column)]),
53
+ addIndex: AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [
54
+ parseOrderedColumnName(column),
55
+ ]),
54
56
  }),
55
57
  });
56
58
  }
@@ -109,7 +111,9 @@ export class AlterTableAddIndexBuilder {
109
111
  return new AlterTableAddIndexBuilder({
110
112
  ...this.#props,
111
113
  node: AlterTableNode.cloneWithTableProps(this.#props.node, {
112
- addIndex: AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [expression.toOperationNode()]),
114
+ addIndex: AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [
115
+ expression.toOperationNode(),
116
+ ]),
113
117
  }),
114
118
  });
115
119
  }
@@ -14,6 +14,14 @@ export declare class ColumnDefinitionBuilder implements OperationNodeSource {
14
14
  * you can use the `serial` or `bigserial` data type instead.
15
15
  */
16
16
  autoIncrement(): ColumnDefinitionBuilder;
17
+ /**
18
+ * Makes the column an identity column.
19
+ *
20
+ * This only works on some dialects like MS SQL Server (MSSQL).
21
+ *
22
+ * For PostgreSQL's `generated always as identity` use {@link generatedAlwaysAsIdentity}.
23
+ */
24
+ identity(): ColumnDefinitionBuilder;
17
25
  /**
18
26
  * Makes the column the primary key.
19
27
  *
@@ -137,7 +145,11 @@ export declare class ColumnDefinitionBuilder implements OperationNodeSource {
137
145
  */
138
146
  generatedAlwaysAs(expression: Expression<any>): ColumnDefinitionBuilder;
139
147
  /**
140
- * Adds the `generated always as identity` specifier on supported dialects.
148
+ * Adds the `generated always as identity` specifier.
149
+ *
150
+ * This only works on some dialects like PostgreSQL.
151
+ *
152
+ * For MS SQL Server (MSSQL)'s identity column use {@link identity}.
141
153
  */
142
154
  generatedAlwaysAsIdentity(): ColumnDefinitionBuilder;
143
155
  /**