kysely 0.27.2 → 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 (157) 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/operation-node/add-index-node.js +1 -1
  16. package/dist/cjs/operation-node/cast-node.d.ts +13 -0
  17. package/dist/cjs/operation-node/cast-node.js +19 -0
  18. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
  19. package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
  20. package/dist/cjs/operation-node/data-type-node.js +55 -1
  21. package/dist/cjs/operation-node/delete-query-node.d.ts +4 -0
  22. package/dist/cjs/operation-node/delete-query-node.js +12 -0
  23. package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
  24. package/dist/cjs/operation-node/fetch-node.js +19 -0
  25. package/dist/cjs/operation-node/insert-query-node.d.ts +4 -1
  26. package/dist/cjs/operation-node/insert-query-node.js +5 -0
  27. package/dist/cjs/operation-node/join-node.d.ts +1 -1
  28. package/dist/cjs/operation-node/matched-node.d.ts +13 -0
  29. package/dist/cjs/operation-node/matched-node.js +19 -0
  30. package/dist/cjs/operation-node/merge-query-node.d.ts +25 -0
  31. package/dist/cjs/operation-node/merge-query-node.js +45 -0
  32. package/dist/cjs/operation-node/operation-node-transformer.d.ts +10 -0
  33. package/dist/cjs/operation-node/operation-node-transformer.js +50 -0
  34. package/dist/cjs/operation-node/operation-node-visitor.d.ts +10 -0
  35. package/dist/cjs/operation-node/operation-node-visitor.js +5 -0
  36. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  37. package/dist/cjs/operation-node/query-node.d.ts +10 -3
  38. package/dist/cjs/operation-node/query-node.js +15 -1
  39. package/dist/cjs/operation-node/select-query-node.d.ts +5 -0
  40. package/dist/cjs/operation-node/select-query-node.js +6 -0
  41. package/dist/cjs/operation-node/top-node.d.ts +14 -0
  42. package/dist/cjs/operation-node/top-node.js +19 -0
  43. package/dist/cjs/operation-node/update-query-node.d.ts +7 -1
  44. package/dist/cjs/operation-node/update-query-node.js +11 -0
  45. package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
  46. package/dist/cjs/parser/binary-operation-parser.js +2 -2
  47. package/dist/cjs/parser/data-type-parser.js +7 -3
  48. package/dist/cjs/parser/fetch-parser.d.ts +2 -0
  49. package/dist/cjs/parser/fetch-parser.js +18 -0
  50. package/dist/cjs/parser/insert-values-parser.d.ts +3 -3
  51. package/dist/cjs/parser/merge-parser.d.ts +9 -0
  52. package/dist/cjs/parser/merge-parser.js +32 -0
  53. package/dist/cjs/parser/table-parser.d.ts +4 -3
  54. package/dist/cjs/parser/top-parser.d.ts +2 -0
  55. package/dist/cjs/parser/top-parser.js +20 -0
  56. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
  57. package/dist/cjs/query-builder/delete-query-builder.d.ts +99 -0
  58. package/dist/cjs/query-builder/delete-query-builder.js +120 -0
  59. package/dist/cjs/query-builder/insert-query-builder.d.ts +71 -0
  60. package/dist/cjs/query-builder/insert-query-builder.js +82 -0
  61. package/dist/cjs/query-builder/merge-query-builder.d.ts +557 -0
  62. package/dist/cjs/query-builder/merge-query-builder.js +518 -0
  63. package/dist/cjs/query-builder/merge-result.d.ts +4 -0
  64. package/dist/cjs/query-builder/merge-result.js +10 -0
  65. package/dist/cjs/query-builder/select-query-builder.d.ts +102 -7
  66. package/dist/cjs/query-builder/select-query-builder.js +14 -0
  67. package/dist/cjs/query-builder/update-query-builder.d.ts +80 -0
  68. package/dist/cjs/query-builder/update-query-builder.js +98 -0
  69. package/dist/cjs/query-compiler/default-query-compiler.d.ts +10 -0
  70. package/dist/cjs/query-compiler/default-query-compiler.js +94 -10
  71. package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
  72. package/dist/cjs/query-creator.d.ts +40 -2
  73. package/dist/cjs/query-creator.js +9 -0
  74. package/dist/cjs/schema/alter-table-add-index-builder.js +6 -2
  75. package/dist/cjs/schema/column-definition-builder.d.ts +13 -1
  76. package/dist/cjs/schema/column-definition-builder.js +15 -1
  77. package/dist/cjs/util/infer-result.d.ts +2 -1
  78. package/dist/cjs/util/type-utils.d.ts +3 -2
  79. package/dist/esm/dialect/database-introspector.d.ts +1 -0
  80. package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
  81. package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  82. package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
  83. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
  84. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  85. package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
  86. package/dist/esm/dialect/postgres/postgres-introspector.js +2 -0
  87. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
  88. package/dist/esm/driver/database-connection.d.ts +1 -1
  89. package/dist/esm/expression/expression-builder.d.ts +30 -4
  90. package/dist/esm/expression/expression-builder.js +5 -0
  91. package/dist/esm/index.d.ts +7 -1
  92. package/dist/esm/index.js +6 -0
  93. package/dist/esm/operation-node/add-index-node.js +1 -1
  94. package/dist/esm/operation-node/cast-node.d.ts +13 -0
  95. package/dist/esm/operation-node/cast-node.js +17 -0
  96. package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
  97. package/dist/esm/operation-node/data-type-node.d.ts +5 -1
  98. package/dist/esm/operation-node/data-type-node.js +53 -0
  99. package/dist/esm/operation-node/delete-query-node.d.ts +4 -0
  100. package/dist/esm/operation-node/delete-query-node.js +12 -0
  101. package/dist/esm/operation-node/fetch-node.d.ts +15 -0
  102. package/dist/esm/operation-node/fetch-node.js +17 -0
  103. package/dist/esm/operation-node/insert-query-node.d.ts +4 -1
  104. package/dist/esm/operation-node/insert-query-node.js +5 -0
  105. package/dist/esm/operation-node/join-node.d.ts +1 -1
  106. package/dist/esm/operation-node/matched-node.d.ts +13 -0
  107. package/dist/esm/operation-node/matched-node.js +17 -0
  108. package/dist/esm/operation-node/merge-query-node.d.ts +25 -0
  109. package/dist/esm/operation-node/merge-query-node.js +43 -0
  110. package/dist/esm/operation-node/operation-node-transformer.d.ts +10 -0
  111. package/dist/esm/operation-node/operation-node-transformer.js +50 -0
  112. package/dist/esm/operation-node/operation-node-visitor.d.ts +10 -0
  113. package/dist/esm/operation-node/operation-node-visitor.js +5 -0
  114. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  115. package/dist/esm/operation-node/query-node.d.ts +10 -3
  116. package/dist/esm/operation-node/query-node.js +15 -1
  117. package/dist/esm/operation-node/select-query-node.d.ts +5 -0
  118. package/dist/esm/operation-node/select-query-node.js +6 -0
  119. package/dist/esm/operation-node/top-node.d.ts +14 -0
  120. package/dist/esm/operation-node/top-node.js +17 -0
  121. package/dist/esm/operation-node/update-query-node.d.ts +7 -1
  122. package/dist/esm/operation-node/update-query-node.js +11 -0
  123. package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
  124. package/dist/esm/parser/binary-operation-parser.js +2 -2
  125. package/dist/esm/parser/data-type-parser.js +8 -4
  126. package/dist/esm/parser/fetch-parser.d.ts +2 -0
  127. package/dist/esm/parser/fetch-parser.js +15 -0
  128. package/dist/esm/parser/insert-values-parser.d.ts +3 -3
  129. package/dist/esm/parser/merge-parser.d.ts +9 -0
  130. package/dist/esm/parser/merge-parser.js +28 -0
  131. package/dist/esm/parser/table-parser.d.ts +4 -3
  132. package/dist/esm/parser/top-parser.d.ts +2 -0
  133. package/dist/esm/parser/top-parser.js +17 -0
  134. package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
  135. package/dist/esm/query-builder/delete-query-builder.d.ts +99 -0
  136. package/dist/esm/query-builder/delete-query-builder.js +120 -0
  137. package/dist/esm/query-builder/insert-query-builder.d.ts +71 -0
  138. package/dist/esm/query-builder/insert-query-builder.js +82 -0
  139. package/dist/esm/query-builder/merge-query-builder.d.ts +557 -0
  140. package/dist/esm/query-builder/merge-query-builder.js +512 -0
  141. package/dist/esm/query-builder/merge-result.d.ts +4 -0
  142. package/dist/esm/query-builder/merge-result.js +7 -0
  143. package/dist/esm/query-builder/select-query-builder.d.ts +102 -7
  144. package/dist/esm/query-builder/select-query-builder.js +14 -0
  145. package/dist/esm/query-builder/update-query-builder.d.ts +80 -0
  146. package/dist/esm/query-builder/update-query-builder.js +98 -0
  147. package/dist/esm/query-compiler/default-query-compiler.d.ts +10 -0
  148. package/dist/esm/query-compiler/default-query-compiler.js +94 -10
  149. package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
  150. package/dist/esm/query-creator.d.ts +40 -2
  151. package/dist/esm/query-creator.js +10 -1
  152. package/dist/esm/schema/alter-table-add-index-builder.js +7 -3
  153. package/dist/esm/schema/column-definition-builder.d.ts +13 -1
  154. package/dist/esm/schema/column-definition-builder.js +15 -1
  155. package/dist/esm/util/infer-result.d.ts +2 -1
  156. package/dist/esm/util/type-utils.d.ts +3 -2
  157. package/package.json +22 -21
@@ -21,6 +21,8 @@ const set_operation_parser_js_1 = require("../parser/set-operation-parser.js");
21
21
  const binary_operation_parser_js_1 = require("../parser/binary-operation-parser.js");
22
22
  const expression_wrapper_js_1 = require("../expression/expression-wrapper.js");
23
23
  const value_parser_js_1 = require("../parser/value-parser.js");
24
+ const fetch_parser_js_1 = require("../parser/fetch-parser.js");
25
+ const top_parser_js_1 = require("../parser/top-parser.js");
24
26
  class SelectQueryBuilderImpl {
25
27
  #props;
26
28
  constructor(props) {
@@ -188,6 +190,18 @@ class SelectQueryBuilderImpl {
188
190
  queryNode: select_query_node_js_1.SelectQueryNode.cloneWithOffset(this.#props.queryNode, offset_node_js_1.OffsetNode.create((0, value_parser_js_1.parseValueExpression)(offset))),
189
191
  });
190
192
  }
193
+ fetch(rowCount, modifier = 'only') {
194
+ return new SelectQueryBuilderImpl({
195
+ ...this.#props,
196
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithFetch(this.#props.queryNode, (0, fetch_parser_js_1.parseFetch)(rowCount, modifier)),
197
+ });
198
+ }
199
+ top(expression, modifiers) {
200
+ return new SelectQueryBuilderImpl({
201
+ ...this.#props,
202
+ queryNode: query_node_js_1.QueryNode.cloneWithTop(this.#props.queryNode, (0, top_parser_js_1.parseTop)(expression, modifiers)),
203
+ });
204
+ }
191
205
  union(expression) {
192
206
  return new SelectQueryBuilderImpl({
193
207
  ...this.#props,
@@ -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
  *
@@ -764,6 +824,26 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
764
824
  * that support `returning` such as PostgreSQL.
765
825
  */
766
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>;
767
847
  /**
768
848
  * Simply calls the provided function passing `this` as the only argument. `$call` returns
769
849
  * what the provided function returns.
@@ -12,6 +12,9 @@ const object_utils_js_1 = require("../util/object-utils.js");
12
12
  const update_result_js_1 = require("./update-result.js");
13
13
  const no_result_error_js_1 = require("./no-result-error.js");
14
14
  const binary_operation_parser_js_1 = require("../parser/binary-operation-parser.js");
15
+ const value_parser_js_1 = require("../parser/value-parser.js");
16
+ const limit_node_js_1 = require("../operation-node/limit-node.js");
17
+ const top_parser_js_1 = require("../parser/top-parser.js");
15
18
  class UpdateQueryBuilder {
16
19
  #props;
17
20
  constructor(props) {
@@ -35,6 +38,51 @@ class UpdateQueryBuilder {
35
38
  queryNode: query_node_js_1.QueryNode.cloneWithoutWhere(this.#props.queryNode),
36
39
  });
37
40
  }
41
+ /**
42
+ * Changes an `update` query into a `update top` query.
43
+ *
44
+ * `top` clause is only supported by some dialects like MS SQL Server.
45
+ *
46
+ * ### Examples
47
+ *
48
+ * Update the first row:
49
+ *
50
+ * ```ts
51
+ * await db.updateTable('person')
52
+ * .top(1)
53
+ * .set({ first_name: 'Foo' })
54
+ * .where('age', '>', 18)
55
+ * .executeTakeFirstOrThrow()
56
+ * ```
57
+ *
58
+ * The generated SQL (MS SQL Server):
59
+ *
60
+ * ```sql
61
+ * update top(1) "person" set "first_name" = @1 where "age" > @2
62
+ * ```
63
+ *
64
+ * Update the 50% first rows:
65
+ *
66
+ * ```ts
67
+ * await db.updateTable('person')
68
+ * .top(50, 'percent')
69
+ * .set({ first_name: 'Foo' })
70
+ * .where('age', '>', 18)
71
+ * .executeTakeFirstOrThrow()
72
+ * ```
73
+ *
74
+ * The generated SQL (MS SQL Server):
75
+ *
76
+ * ```sql
77
+ * update top(50) percent "person" set "first_name" = @1 where "age" > @2
78
+ * ```
79
+ */
80
+ top(expression, modifiers) {
81
+ return new UpdateQueryBuilder({
82
+ ...this.#props,
83
+ queryNode: query_node_js_1.QueryNode.cloneWithTop(this.#props.queryNode, (0, top_parser_js_1.parseTop)(expression, modifiers)),
84
+ });
85
+ }
38
86
  from(from) {
39
87
  return new UpdateQueryBuilder({
40
88
  ...this.#props,
@@ -65,6 +113,31 @@ class UpdateQueryBuilder {
65
113
  queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('FullJoin', args)),
66
114
  });
67
115
  }
116
+ /**
117
+ * Adds a limit clause to the update query for supported databases, such as MySQL.
118
+ *
119
+ * ### Examples
120
+ *
121
+ * Update the first 2 rows in the 'person' table:
122
+ *
123
+ * ```ts
124
+ * return await db
125
+ * .updateTable('person')
126
+ * .set({ first_name: 'Foo' })
127
+ * .limit(2);
128
+ * ```
129
+ *
130
+ * The generated SQL (MySQL):
131
+ * ```sql
132
+ * update `person` set `first_name` = 'Foo' limit 2
133
+ * ```
134
+ */
135
+ limit(limit) {
136
+ return new UpdateQueryBuilder({
137
+ ...this.#props,
138
+ queryNode: update_query_node_js_1.UpdateQueryNode.cloneWithLimit(this.#props.queryNode, limit_node_js_1.LimitNode.create((0, value_parser_js_1.parseValueExpression)(limit))),
139
+ });
140
+ }
68
141
  set(...args) {
69
142
  return new UpdateQueryBuilder({
70
143
  ...this.#props,
@@ -83,6 +156,31 @@ class UpdateQueryBuilder {
83
156
  queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)()),
84
157
  });
85
158
  }
159
+ /**
160
+ * Clears all `returning` clauses from the query.
161
+ *
162
+ * ### Examples
163
+ *
164
+ * ```ts
165
+ * db.updateTable('person')
166
+ * .returningAll()
167
+ * .set({ age: 39 })
168
+ * .where('first_name', '=', 'John')
169
+ * .clearReturning()
170
+ * ```
171
+ *
172
+ * The generated SQL(PostgreSQL):
173
+ *
174
+ * ```sql
175
+ * update "person" set "age" = 39 where "first_name" = "John"
176
+ * ```
177
+ */
178
+ clearReturning() {
179
+ return new UpdateQueryBuilder({
180
+ ...this.#props,
181
+ queryNode: query_node_js_1.QueryNode.cloneWithoutReturning(this.#props.queryNode),
182
+ });
183
+ }
86
184
  /**
87
185
  * Simply calls the provided function passing `this` as the only argument. `$call` returns
88
186
  * 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;
@@ -10,6 +10,7 @@ const query_node_js_1 = require("../operation-node/query-node.js");
10
10
  const object_utils_js_1 = require("../util/object-utils.js");
11
11
  const create_view_node_js_1 = require("../operation-node/create-view-node.js");
12
12
  const set_operation_node_js_1 = require("../operation-node/set-operation-node.js");
13
+ const merge_query_node_js_1 = require("../operation-node/merge-query-node.js");
13
14
  class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisitor {
14
15
  #sql = '';
15
16
  #parameters = [];
@@ -56,6 +57,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
56
57
  this.append(' ');
57
58
  this.compileList(node.frontModifiers, ' ');
58
59
  }
60
+ if (node.top) {
61
+ this.append(' ');
62
+ this.visitNode(node.top);
63
+ }
59
64
  if (node.selections) {
60
65
  this.append(' ');
61
66
  this.compileList(node.selections);
@@ -96,6 +101,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
96
101
  this.append(' ');
97
102
  this.visitNode(node.offset);
98
103
  }
104
+ if (node.fetch) {
105
+ this.append(' ');
106
+ this.visitNode(node.fetch);
107
+ }
99
108
  if (node.endModifiers?.length) {
100
109
  this.append(' ');
101
110
  this.compileList(this.sortSelectModifiers([...node.endModifiers]), ' ');
@@ -137,12 +146,13 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
137
146
  this.visitNode(node.having);
138
147
  }
139
148
  visitInsertQuery(node) {
140
- const isSubQuery = this.nodeStack.find(query_node_js_1.QueryNode.is) !== node;
149
+ const rootQueryNode = this.nodeStack.find(query_node_js_1.QueryNode.is);
150
+ const isSubQuery = rootQueryNode !== node;
141
151
  if (!isSubQuery && node.explain) {
142
152
  this.visitNode(node.explain);
143
153
  this.append(' ');
144
154
  }
145
- if (isSubQuery) {
155
+ if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
146
156
  this.append('(');
147
157
  }
148
158
  if (node.with) {
@@ -153,8 +163,14 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
153
163
  if (node.ignore) {
154
164
  this.append(' ignore');
155
165
  }
156
- this.append(' into ');
157
- this.visitNode(node.into);
166
+ if (node.top) {
167
+ this.append(' ');
168
+ this.visitNode(node.top);
169
+ }
170
+ if (node.into) {
171
+ this.append(' into ');
172
+ this.visitNode(node.into);
173
+ }
158
174
  if (node.columns) {
159
175
  this.append(' (');
160
176
  this.compileList(node.columns);
@@ -180,7 +196,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
180
196
  this.append(' ');
181
197
  this.visitNode(node.returning);
182
198
  }
183
- if (isSubQuery) {
199
+ if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
184
200
  this.append(')');
185
201
  }
186
202
  }
@@ -202,6 +218,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
202
218
  this.append(' ');
203
219
  }
204
220
  this.append('delete ');
221
+ if (node.top) {
222
+ this.visitNode(node.top);
223
+ this.append(' ');
224
+ }
205
225
  this.visitNode(node.from);
206
226
  if (node.using) {
207
227
  this.append(' ');
@@ -387,6 +407,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
387
407
  this.append(' ');
388
408
  this.visitNode(node.generated);
389
409
  }
410
+ if (node.identity) {
411
+ this.append(' identity');
412
+ }
390
413
  if (node.defaultTo) {
391
414
  this.append(' ');
392
415
  this.visitNode(node.defaultTo);
@@ -470,12 +493,13 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
470
493
  this.visitNode(node.groupBy);
471
494
  }
472
495
  visitUpdateQuery(node) {
473
- const isSubQuery = this.nodeStack.find(query_node_js_1.QueryNode.is) !== node;
496
+ const rootQueryNode = this.nodeStack.find(query_node_js_1.QueryNode.is);
497
+ const isSubQuery = rootQueryNode !== node;
474
498
  if (!isSubQuery && node.explain) {
475
499
  this.visitNode(node.explain);
476
500
  this.append(' ');
477
501
  }
478
- if (isSubQuery) {
502
+ if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
479
503
  this.append('(');
480
504
  }
481
505
  if (node.with) {
@@ -483,8 +507,15 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
483
507
  this.append(' ');
484
508
  }
485
509
  this.append('update ');
486
- this.visitNode(node.table);
487
- this.append(' set ');
510
+ if (node.top) {
511
+ this.visitNode(node.top);
512
+ this.append(' ');
513
+ }
514
+ if (node.table) {
515
+ this.visitNode(node.table);
516
+ this.append(' ');
517
+ }
518
+ this.append('set ');
488
519
  if (node.updates) {
489
520
  this.compileList(node.updates);
490
521
  }
@@ -500,11 +531,15 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
500
531
  this.append(' ');
501
532
  this.visitNode(node.where);
502
533
  }
534
+ if (node.limit) {
535
+ this.append(' ');
536
+ this.visitNode(node.limit);
537
+ }
503
538
  if (node.returning) {
504
539
  this.append(' ');
505
540
  this.visitNode(node.returning);
506
541
  }
507
- if (isSubQuery) {
542
+ if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
508
543
  this.append(')');
509
544
  }
510
545
  }
@@ -1040,6 +1075,36 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
1040
1075
  this.visitNode(node.values[i]);
1041
1076
  }
1042
1077
  }
1078
+ visitMergeQuery(node) {
1079
+ if (node.with) {
1080
+ this.visitNode(node.with);
1081
+ this.append(' ');
1082
+ }
1083
+ this.append('merge ');
1084
+ if (node.top) {
1085
+ this.visitNode(node.top);
1086
+ this.append(' ');
1087
+ }
1088
+ this.append('into ');
1089
+ this.visitNode(node.into);
1090
+ if (node.using) {
1091
+ this.append(' ');
1092
+ this.visitNode(node.using);
1093
+ }
1094
+ if (node.whens) {
1095
+ this.append(' ');
1096
+ this.compileList(node.whens);
1097
+ }
1098
+ }
1099
+ visitMatched(node) {
1100
+ if (node.not) {
1101
+ this.append('not ');
1102
+ }
1103
+ this.append('matched');
1104
+ if (node.bySource) {
1105
+ this.append(' by source');
1106
+ }
1107
+ }
1043
1108
  visitAddIndex(node) {
1044
1109
  this.append('add ');
1045
1110
  if (node.unique) {
@@ -1057,6 +1122,24 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
1057
1122
  this.visitNode(node.using);
1058
1123
  }
1059
1124
  }
1125
+ visitCast(node) {
1126
+ this.append('cast(');
1127
+ this.visitNode(node.expression);
1128
+ this.append(' as ');
1129
+ this.visitNode(node.dataType);
1130
+ this.append(')');
1131
+ }
1132
+ visitFetch(node) {
1133
+ this.append('fetch next ');
1134
+ this.visitNode(node.rowCount);
1135
+ this.append(` rows ${node.modifier}`);
1136
+ }
1137
+ visitTop(node) {
1138
+ this.append(`top(${node.expression})`);
1139
+ if (node.modifiers) {
1140
+ this.append(` ${node.modifiers}`);
1141
+ }
1142
+ }
1060
1143
  append(str) {
1061
1144
  this.#sql += str;
1062
1145
  }
@@ -1167,4 +1250,5 @@ const JOIN_TYPE_SQL = (0, object_utils_js_1.freeze)({
1167
1250
  FullJoin: 'full join',
1168
1251
  LateralInnerJoin: 'inner join lateral',
1169
1252
  LateralLeftJoin: 'left join lateral',
1253
+ Using: 'using',
1170
1254
  });
@@ -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
  *
@@ -16,6 +16,8 @@ const query_id_js_1 = require("./util/query-id.js");
16
16
  const with_schema_plugin_js_1 = require("./plugin/with-schema/with-schema-plugin.js");
17
17
  const object_utils_js_1 = require("./util/object-utils.js");
18
18
  const select_parser_js_1 = require("./parser/select-parser.js");
19
+ const merge_query_builder_js_1 = require("./query-builder/merge-query-builder.js");
20
+ const merge_query_node_js_1 = require("./operation-node/merge-query-node.js");
19
21
  class QueryCreator {
20
22
  #props;
21
23
  constructor(props) {
@@ -127,6 +129,13 @@ class QueryCreator {
127
129
  queryNode: update_query_node_js_1.UpdateQueryNode.create((0, table_parser_js_1.parseTableExpression)(table), this.#props.withNode),
128
130
  });
129
131
  }
132
+ mergeInto(targetTable) {
133
+ return new merge_query_builder_js_1.MergeQueryBuilder({
134
+ queryId: (0, query_id_js_1.createQueryId)(),
135
+ executor: this.#props.executor,
136
+ queryNode: merge_query_node_js_1.MergeQueryNode.create((0, table_parser_js_1.parseAliasedTable)(targetTable), this.#props.withNode),
137
+ });
138
+ }
130
139
  /**
131
140
  * Creates a `with` query (Common Table Expression).
132
141
  *
@@ -52,7 +52,9 @@ class AlterTableAddIndexBuilder {
52
52
  return new AlterTableAddIndexBuilder({
53
53
  ...this.#props,
54
54
  node: alter_table_node_js_1.AlterTableNode.cloneWithTableProps(this.#props.node, {
55
- addIndex: add_index_node_js_1.AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [(0, reference_parser_js_1.parseOrderedColumnName)(column)]),
55
+ addIndex: add_index_node_js_1.AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [
56
+ (0, reference_parser_js_1.parseOrderedColumnName)(column),
57
+ ]),
56
58
  }),
57
59
  });
58
60
  }
@@ -111,7 +113,9 @@ class AlterTableAddIndexBuilder {
111
113
  return new AlterTableAddIndexBuilder({
112
114
  ...this.#props,
113
115
  node: alter_table_node_js_1.AlterTableNode.cloneWithTableProps(this.#props.node, {
114
- addIndex: add_index_node_js_1.AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [expression.toOperationNode()]),
116
+ addIndex: add_index_node_js_1.AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [
117
+ expression.toOperationNode(),
118
+ ]),
115
119
  }),
116
120
  });
117
121
  }
@@ -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
  /**
@@ -26,6 +26,16 @@ class ColumnDefinitionBuilder {
26
26
  autoIncrement() {
27
27
  return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, { autoIncrement: true }));
28
28
  }
29
+ /**
30
+ * Makes the column an identity column.
31
+ *
32
+ * This only works on some dialects like MS SQL Server (MSSQL).
33
+ *
34
+ * For PostgreSQL's `generated always as identity` use {@link generatedAlwaysAsIdentity}.
35
+ */
36
+ identity() {
37
+ return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, { identity: true }));
38
+ }
29
39
  /**
30
40
  * Makes the column the primary key.
31
41
  *
@@ -193,7 +203,11 @@ class ColumnDefinitionBuilder {
193
203
  }));
194
204
  }
195
205
  /**
196
- * Adds the `generated always as identity` specifier on supported dialects.
206
+ * Adds the `generated always as identity` specifier.
207
+ *
208
+ * This only works on some dialects like PostgreSQL.
209
+ *
210
+ * For MS SQL Server (MSSQL)'s identity column use {@link identity}.
197
211
  */
198
212
  generatedAlwaysAsIdentity() {
199
213
  return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, {