kysely 0.27.3 → 0.27.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +7 -7
  3. package/dist/cjs/dialect/dialect-adapter-base.d.ts +2 -1
  4. package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
  5. package/dist/cjs/dialect/dialect-adapter.d.ts +5 -0
  6. package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +1 -5
  7. package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
  8. package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +46 -26
  9. package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
  10. package/dist/cjs/dialect/mssql/mssql-driver.js +95 -36
  11. package/dist/cjs/dialect/postgres/postgres-introspector.js +1 -1
  12. package/dist/cjs/driver/database-connection.d.ts +3 -1
  13. package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
  14. package/dist/cjs/dynamic/dynamic.d.ts +1 -1
  15. package/dist/cjs/dynamic/dynamic.js +1 -1
  16. package/dist/cjs/expression/expression-builder.d.ts +2 -2
  17. package/dist/cjs/expression/expression-builder.js +2 -3
  18. package/dist/cjs/expression/expression.js +2 -3
  19. package/dist/cjs/helpers/mssql.js +3 -4
  20. package/dist/cjs/helpers/mysql.d.ts +3 -3
  21. package/dist/cjs/helpers/mysql.js +6 -7
  22. package/dist/cjs/helpers/postgres.d.ts +4 -4
  23. package/dist/cjs/helpers/postgres.js +7 -8
  24. package/dist/cjs/helpers/sqlite.js +3 -4
  25. package/dist/cjs/index.d.ts +28 -21
  26. package/dist/cjs/index.js +28 -21
  27. package/dist/cjs/kysely.d.ts +1 -1
  28. package/dist/cjs/kysely.js +3 -3
  29. package/dist/cjs/operation-node/alter-column-node.d.ts +1 -1
  30. package/dist/cjs/operation-node/case-node.d.ts +1 -1
  31. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
  32. package/dist/cjs/operation-node/data-type-node.d.ts +2 -2
  33. package/dist/cjs/operation-node/data-type-node.js +5 -3
  34. package/dist/cjs/operation-node/delete-query-node.d.ts +2 -0
  35. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -4
  36. package/dist/cjs/operation-node/having-node.d.ts +1 -1
  37. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -0
  38. package/dist/cjs/operation-node/merge-query-node.d.ts +2 -0
  39. package/dist/cjs/operation-node/on-node.d.ts +1 -1
  40. package/dist/cjs/operation-node/operation-node-source.js +1 -2
  41. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  42. package/dist/cjs/operation-node/operation-node-transformer.js +12 -0
  43. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  44. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  45. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  46. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  47. package/dist/cjs/operation-node/operator-node.js +8 -6
  48. package/dist/cjs/operation-node/output-node.d.ts +13 -0
  49. package/dist/cjs/operation-node/output-node.js +26 -0
  50. package/dist/cjs/operation-node/query-node.d.ts +11 -6
  51. package/dist/cjs/operation-node/query-node.js +9 -0
  52. package/dist/cjs/operation-node/select-query-node.d.ts +1 -0
  53. package/dist/cjs/operation-node/select-query-node.js +6 -0
  54. package/dist/cjs/operation-node/update-query-node.d.ts +2 -0
  55. package/dist/cjs/operation-node/where-node.d.ts +1 -1
  56. package/dist/cjs/parser/binary-operation-parser.js +5 -6
  57. package/dist/cjs/parser/data-type-parser.js +1 -2
  58. package/dist/cjs/parser/default-value-parser.js +1 -2
  59. package/dist/cjs/parser/expression-parser.js +3 -4
  60. package/dist/cjs/parser/fetch-parser.js +1 -2
  61. package/dist/cjs/parser/group-by-parser.js +1 -2
  62. package/dist/cjs/parser/identifier-parser.js +1 -2
  63. package/dist/cjs/parser/insert-values-parser.js +1 -2
  64. package/dist/cjs/parser/join-parser.js +1 -2
  65. package/dist/cjs/parser/merge-parser.js +2 -3
  66. package/dist/cjs/parser/on-commit-action-parse.js +1 -2
  67. package/dist/cjs/parser/on-modify-action-parser.js +1 -2
  68. package/dist/cjs/parser/order-by-parser.js +3 -4
  69. package/dist/cjs/parser/parse-utils.js +4 -5
  70. package/dist/cjs/parser/partition-by-parser.js +1 -2
  71. package/dist/cjs/parser/reference-parser.js +8 -9
  72. package/dist/cjs/parser/returning-parser.d.ts +4 -3
  73. package/dist/cjs/parser/select-parser.js +2 -3
  74. package/dist/cjs/parser/set-operation-parser.js +1 -2
  75. package/dist/cjs/parser/table-parser.js +4 -5
  76. package/dist/cjs/parser/top-parser.js +1 -2
  77. package/dist/cjs/parser/unary-operation-parser.js +3 -4
  78. package/dist/cjs/parser/update-set-parser.js +2 -3
  79. package/dist/cjs/parser/value-parser.js +4 -5
  80. package/dist/cjs/parser/with-parser.js +1 -2
  81. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +2 -2
  82. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +2 -2
  83. package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
  84. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
  85. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
  86. package/dist/cjs/query-builder/delete-query-builder.d.ts +89 -5
  87. package/dist/cjs/query-builder/delete-query-builder.js +19 -5
  88. package/dist/cjs/query-builder/function-module.d.ts +5 -5
  89. package/dist/cjs/query-builder/function-module.js +1 -2
  90. package/dist/cjs/query-builder/insert-query-builder.d.ts +95 -10
  91. package/dist/cjs/query-builder/insert-query-builder.js +25 -10
  92. package/dist/cjs/query-builder/merge-query-builder.d.ts +167 -3
  93. package/dist/cjs/query-builder/merge-query-builder.js +30 -1
  94. package/dist/cjs/query-builder/no-result-error.js +2 -2
  95. package/dist/cjs/query-builder/on-conflict-builder.d.ts +2 -2
  96. package/dist/cjs/query-builder/output-interface.d.ts +95 -0
  97. package/dist/cjs/query-builder/output-interface.js +2 -0
  98. package/dist/cjs/query-builder/returning-interface.d.ts +2 -0
  99. package/dist/cjs/query-builder/select-query-builder.d.ts +76 -11
  100. package/dist/cjs/query-builder/select-query-builder.js +7 -2
  101. package/dist/cjs/query-builder/update-query-builder.d.ts +95 -10
  102. package/dist/cjs/query-builder/update-query-builder.js +21 -7
  103. package/dist/cjs/query-builder/update-result.d.ts +9 -0
  104. package/dist/cjs/query-builder/update-result.js +9 -0
  105. package/dist/cjs/query-builder/where-interface.d.ts +1 -1
  106. package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
  107. package/dist/cjs/query-compiler/default-query-compiler.js +25 -1
  108. package/dist/cjs/query-creator.d.ts +56 -3
  109. package/dist/cjs/query-creator.js +54 -1
  110. package/dist/cjs/raw-builder/raw-builder.js +1 -2
  111. package/dist/cjs/raw-builder/sql.d.ts +5 -5
  112. package/dist/cjs/schema/alter-column-builder.js +3 -0
  113. package/dist/cjs/schema/alter-table-add-index-builder.d.ts +1 -1
  114. package/dist/cjs/schema/alter-table-add-index-builder.js +1 -1
  115. package/dist/cjs/schema/alter-table-builder.js +1 -2
  116. package/dist/cjs/schema/column-definition-builder.d.ts +5 -0
  117. package/dist/cjs/schema/column-definition-builder.js +7 -0
  118. package/dist/cjs/util/assert.js +2 -3
  119. package/dist/cjs/util/compilable.js +1 -2
  120. package/dist/cjs/util/json-object-args.js +1 -2
  121. package/dist/cjs/util/log-once.js +1 -2
  122. package/dist/cjs/util/object-utils.js +38 -26
  123. package/dist/cjs/util/performance-now.js +1 -2
  124. package/dist/cjs/util/prevent-await.js +1 -2
  125. package/dist/cjs/util/query-id.js +1 -2
  126. package/dist/cjs/util/random-string.js +1 -2
  127. package/dist/cjs/util/require-all-props.js +1 -2
  128. package/dist/cjs/util/stack-trace-utils.js +1 -2
  129. package/dist/esm/dialect/dialect-adapter-base.d.ts +2 -1
  130. package/dist/esm/dialect/dialect-adapter-base.js +4 -1
  131. package/dist/esm/dialect/dialect-adapter.d.ts +5 -0
  132. package/dist/esm/dialect/mssql/mssql-adapter.d.ts +1 -5
  133. package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
  134. package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +46 -26
  135. package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
  136. package/dist/esm/dialect/mssql/mssql-driver.js +95 -36
  137. package/dist/esm/dialect/postgres/postgres-introspector.js +1 -1
  138. package/dist/esm/driver/database-connection.d.ts +3 -1
  139. package/dist/esm/dynamic/dynamic.d.ts +1 -1
  140. package/dist/esm/dynamic/dynamic.js +1 -1
  141. package/dist/esm/expression/expression-builder.d.ts +2 -2
  142. package/dist/esm/helpers/mysql.d.ts +3 -3
  143. package/dist/esm/helpers/mysql.js +3 -3
  144. package/dist/esm/helpers/postgres.d.ts +4 -4
  145. package/dist/esm/helpers/postgres.js +4 -4
  146. package/dist/esm/index.d.ts +28 -21
  147. package/dist/esm/index.js +28 -21
  148. package/dist/esm/kysely.d.ts +1 -1
  149. package/dist/esm/kysely.js +1 -1
  150. package/dist/esm/operation-node/alter-column-node.d.ts +1 -1
  151. package/dist/esm/operation-node/case-node.d.ts +1 -1
  152. package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
  153. package/dist/esm/operation-node/data-type-node.d.ts +2 -2
  154. package/dist/esm/operation-node/data-type-node.js +3 -1
  155. package/dist/esm/operation-node/delete-query-node.d.ts +2 -0
  156. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -4
  157. package/dist/esm/operation-node/having-node.d.ts +1 -1
  158. package/dist/esm/operation-node/insert-query-node.d.ts +2 -0
  159. package/dist/esm/operation-node/merge-query-node.d.ts +2 -0
  160. package/dist/esm/operation-node/on-node.d.ts +1 -1
  161. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  162. package/dist/esm/operation-node/operation-node-transformer.js +12 -0
  163. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  164. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  165. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  166. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  167. package/dist/esm/operation-node/operator-node.js +2 -0
  168. package/dist/esm/operation-node/output-node.d.ts +13 -0
  169. package/dist/esm/operation-node/output-node.js +24 -0
  170. package/dist/esm/operation-node/query-node.d.ts +11 -6
  171. package/dist/esm/operation-node/query-node.js +9 -0
  172. package/dist/esm/operation-node/select-query-node.d.ts +1 -0
  173. package/dist/esm/operation-node/select-query-node.js +6 -0
  174. package/dist/esm/operation-node/update-query-node.d.ts +2 -0
  175. package/dist/esm/operation-node/where-node.d.ts +1 -1
  176. package/dist/esm/parser/returning-parser.d.ts +4 -3
  177. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +2 -2
  178. package/dist/esm/plugin/camel-case/camel-case-plugin.js +2 -2
  179. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
  180. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
  181. package/dist/esm/query-builder/delete-query-builder.d.ts +89 -5
  182. package/dist/esm/query-builder/delete-query-builder.js +19 -5
  183. package/dist/esm/query-builder/function-module.d.ts +5 -5
  184. package/dist/esm/query-builder/insert-query-builder.d.ts +95 -10
  185. package/dist/esm/query-builder/insert-query-builder.js +25 -10
  186. package/dist/esm/query-builder/merge-query-builder.d.ts +167 -3
  187. package/dist/esm/query-builder/merge-query-builder.js +30 -1
  188. package/dist/esm/query-builder/on-conflict-builder.d.ts +2 -2
  189. package/dist/esm/query-builder/output-interface.d.ts +95 -0
  190. package/dist/esm/query-builder/output-interface.js +2 -0
  191. package/dist/esm/query-builder/returning-interface.d.ts +2 -0
  192. package/dist/esm/query-builder/select-query-builder.d.ts +76 -11
  193. package/dist/esm/query-builder/select-query-builder.js +6 -0
  194. package/dist/esm/query-builder/update-query-builder.d.ts +95 -10
  195. package/dist/esm/query-builder/update-query-builder.js +21 -7
  196. package/dist/esm/query-builder/update-result.d.ts +9 -0
  197. package/dist/esm/query-builder/update-result.js +9 -0
  198. package/dist/esm/query-builder/where-interface.d.ts +1 -1
  199. package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
  200. package/dist/esm/query-compiler/default-query-compiler.js +25 -1
  201. package/dist/esm/query-creator.d.ts +56 -3
  202. package/dist/esm/query-creator.js +54 -1
  203. package/dist/esm/raw-builder/sql.d.ts +5 -5
  204. package/dist/esm/schema/alter-column-builder.js +3 -0
  205. package/dist/esm/schema/alter-table-add-index-builder.d.ts +1 -1
  206. package/dist/esm/schema/alter-table-add-index-builder.js +1 -1
  207. package/dist/esm/schema/alter-table-builder.js +1 -2
  208. package/dist/esm/schema/column-definition-builder.d.ts +5 -0
  209. package/dist/esm/schema/column-definition-builder.js +7 -0
  210. package/dist/esm/util/object-utils.js +18 -5
  211. package/package.json +7 -6
@@ -0,0 +1,95 @@
1
+ import { ExpressionBuilder } from '../expression/expression-builder.js';
2
+ import { AliasedExpressionOrFactory } from '../parser/expression-parser.js';
3
+ import { ReturningAllRow, ReturningRow } from '../parser/returning-parser.js';
4
+ import { AnyAliasedColumnWithTable, AnyColumnWithTable } from '../util/type-utils.js';
5
+ export interface OutputInterface<DB, TB extends keyof DB, O, OP extends OutputPrefix = OutputPrefix> {
6
+ /**
7
+ * Allows you to return data from modified rows.
8
+ *
9
+ * On supported databases like MS SQL Server (MSSQL), this method can be chained
10
+ * to `insert`, `update`, `delete` and `merge` queries to return data.
11
+ *
12
+ * Also see the {@link outputAll} method.
13
+ *
14
+ * ### Examples
15
+ *
16
+ * Return one column:
17
+ *
18
+ * ```ts
19
+ * const { id } = await db
20
+ * .insertInto('person')
21
+ * .output('inserted.id')
22
+ * .values({
23
+ * first_name: 'Jennifer',
24
+ * last_name: 'Aniston'
25
+ * })
26
+ * .executeTakeFirst()
27
+ * ```
28
+ *
29
+ * Return multiple columns:
30
+ *
31
+ * ```ts
32
+ * const { id, first_name } = await db
33
+ * .updateTable('person')
34
+ * .set({ first_name: 'John', last_name: 'Doe' })
35
+ * .output([
36
+ * 'deleted.first_name as old_first_name',
37
+ * 'deleted.last_name as old_last_name',
38
+ * 'inserted.first_name as new_first_name',
39
+ * 'inserted.last_name as new_last_name',
40
+ * ])
41
+ * .where('created_at', '<', new Date())
42
+ * .executeTakeFirst()
43
+ * ```
44
+ *
45
+ * Return arbitrary expressions:
46
+ *
47
+ * ```ts
48
+ * import { sql } from 'kysely'
49
+ *
50
+ * const { id, full_name } = await db
51
+ * .deleteFrom('person')
52
+ * .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
53
+ * .where('created_at', '<', new Date())
54
+ * .executeTakeFirst()
55
+ * ```
56
+ *
57
+ * Return the action performed on the row:
58
+ *
59
+ * ```ts
60
+ * await db
61
+ * .mergeInto('person')
62
+ * .using('pet', 'pet.owner_id', 'person.id')
63
+ * .whenMatched()
64
+ * .thenDelete()
65
+ * .whenNotMatched()
66
+ * .thenInsertValues({
67
+ * first_name: 'John',
68
+ * last_name: 'Doe',
69
+ * gender: 'male'
70
+ * })
71
+ * .output([
72
+ * 'inserted.id as inserted_id',
73
+ * 'deleted.id as deleted_id',
74
+ * ])
75
+ * ```
76
+ */
77
+ output<OE extends OutputExpression<DB, TB, OP>>(selections: ReadonlyArray<OE>): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>, OP>;
78
+ output<CB extends OutputCallback<DB, TB, OP>>(callback: CB): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>, OP>;
79
+ output<OE extends OutputExpression<DB, TB, OP>>(selection: OE): OutputInterface<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>, OP>;
80
+ /**
81
+ * Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
82
+ * that support `output` such as MS SQL Server (MSSQL).
83
+ *
84
+ * Also see the {@link output} method.
85
+ */
86
+ outputAll(table: OP): OutputInterface<DB, TB, ReturningAllRow<DB, TB, O>, OP>;
87
+ }
88
+ export type OutputPrefix = 'deleted' | 'inserted';
89
+ export type OutputDatabase<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix> = {
90
+ [K in OP]: DB[TB];
91
+ };
92
+ export type OutputExpression<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix, ODB = OutputDatabase<DB, TB, OP>, OTB extends keyof ODB = keyof ODB> = AnyAliasedColumnWithTable<ODB, OTB> | AnyColumnWithTable<ODB, OTB> | AliasedExpressionOrFactory<ODB, OTB>;
93
+ export type OutputCallback<DB, TB extends keyof DB, OP extends OutputPrefix = OutputPrefix> = (eb: ExpressionBuilder<OutputDatabase<DB, TB, OP>, OP>) => ReadonlyArray<OutputExpression<DB, TB, OP>>;
94
+ export type SelectExpressionFromOutputExpression<OE> = OE extends `${OutputPrefix}.${infer C}` ? C : OE;
95
+ export type SelectExpressionFromOutputCallback<CB> = CB extends (eb: ExpressionBuilder<any, any>) => ReadonlyArray<infer OE> ? SelectExpressionFromOutputExpression<OE> : never;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -67,6 +67,8 @@ export interface ReturningInterface<DB, TB extends keyof DB, O> {
67
67
  /**
68
68
  * Adds a `returning *` to an insert/update/delete query on databases
69
69
  * that support `returning` such as PostgreSQL.
70
+ *
71
+ * Also see the {@link returning} method.
70
72
  */
71
73
  returningAll(): ReturningInterface<DB, TB, Selectable<DB[TB]>>;
72
74
  }
@@ -291,7 +291,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
291
291
  * .selectFrom('person')
292
292
  * .selectAll()
293
293
  * .where(
294
- * sql`coalesce(first_name, last_name)`,
294
+ * sql<string>`coalesce(first_name, last_name)`,
295
295
  * 'like',
296
296
  * '%' + name + '%',
297
297
  * )
@@ -542,6 +542,45 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
542
542
  * In case you use the {@link sql} tag you need to specify the type of the expression
543
543
  * (in this example `string`).
544
544
  *
545
+ * <!-- siteExample("select", "Not null", 51) -->
546
+ *
547
+ * Sometimes you can be sure something's not null, but Kysely isn't able to infer
548
+ * it. For example calling `where('last_name', 'is not', null)` doesn't make
549
+ * `last_name` not null in the result type, but unless you have other where statements
550
+ * you can be sure it's never null.
551
+ *
552
+ * Kysely has a couple of helpers for dealing with these cases: `$notNull()` and `$narrowType`.
553
+ * Both are used in the following example:
554
+ *
555
+ * ```ts
556
+ * import { NotNull } from 'kysely'
557
+ * import { jsonObjectFrom } from 'kysely/helpers/postgres'
558
+ *
559
+ * const persons = db
560
+ * .selectFrom('person')
561
+ * .select((eb) => [
562
+ * 'last_name',
563
+ * // Let's assume we know the person has at least one
564
+ * // pet. We can use the `.$notNull()` method to make
565
+ * // the expression not null. You could just as well
566
+ * // add `pet` to the `$narrowType` call below.
567
+ * jsonObjectFrom(
568
+ * eb.selectFrom('pet')
569
+ * .selectAll()
570
+ * .limit(1)
571
+ * .whereRef('person.id', '=', 'pet.owner_id')
572
+ * ).$notNull().as('pet')
573
+ * ])
574
+ * .where('last_name', 'is not', null)
575
+ * // $narrowType can be used to narrow the output type.
576
+ * // The special `NotNull` type can be used to make a
577
+ * // selection not null. You could add `pet: NotNull`
578
+ * // here and omit the `$notNull()` call on it.
579
+ * // Use whichever way you prefer.
580
+ * .$narrowType<{ last_name: NotNull }>()
581
+ * .execute()
582
+ * ```
583
+ *
545
584
  * All the examples above assume you know the column names at compile time.
546
585
  * While it's better to build your code like that (that way you also know
547
586
  * the types) sometimes it's not possible or you just prefer to write more
@@ -824,7 +863,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
824
863
  * (join) => join
825
864
  * .onRef('pet.owner_id', '=', 'person.id')
826
865
  * .on('pet.name', '=', 'Doggo')
827
- * .on((eb) => eb.or([eb("person.age", ">", 18), eb("person.age", "<", 100)]))
866
+ * .on((eb) => eb.or([
867
+ * eb('person.age', '>', 18),
868
+ * eb('person.age', '<', 100)
869
+ * ]))
828
870
  * )
829
871
  * .selectAll()
830
872
  * .execute()
@@ -838,6 +880,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
838
880
  * inner join "pet"
839
881
  * on "pet"."owner_id" = "person"."id"
840
882
  * and "pet"."name" = $1
883
+ * and (
884
+ * "person"."age" > $2
885
+ * OR "person"."age" < $3
886
+ * )
841
887
  * ```
842
888
  *
843
889
  * <!-- siteExample("join", "Subquery join", 40) -->
@@ -997,7 +1043,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
997
1043
  * .limit(1)
998
1044
  * )
999
1045
  * .orderBy(
1000
- * sql`concat(first_name, last_name)`
1046
+ * sql<string>`concat(first_name, last_name)`
1001
1047
  * )
1002
1048
  * .execute()
1003
1049
  * ```
@@ -1056,7 +1102,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1056
1102
  * .selectFrom('person')
1057
1103
  * .select([
1058
1104
  * 'first_name',
1059
- * sql`max(id)`.as('max_id')
1105
+ * sql<string>`max(id)`.as('max_id')
1060
1106
  * ])
1061
1107
  * .groupBy('first_name')
1062
1108
  * .execute()
@@ -1080,7 +1126,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1080
1126
  * .select([
1081
1127
  * 'first_name',
1082
1128
  * 'last_name',
1083
- * sql`max(id)`.as('max_id')
1129
+ * sql<string>`max(id)`.as('max_id')
1084
1130
  * ])
1085
1131
  * .groupBy([
1086
1132
  * 'first_name',
@@ -1108,10 +1154,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1108
1154
  * .select([
1109
1155
  * 'first_name',
1110
1156
  * 'last_name',
1111
- * sql`max(id)`.as('max_id')
1157
+ * sql<string>`max(id)`.as('max_id')
1112
1158
  * ])
1113
1159
  * .groupBy([
1114
- * sql`concat(first_name, last_name)`,
1160
+ * sql<string>`concat(first_name, last_name)`,
1115
1161
  * (qb) => qb.selectFrom('pet').select('id').limit(1)
1116
1162
  * ])
1117
1163
  * .execute()
@@ -1552,6 +1598,25 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1552
1598
  * ```
1553
1599
  */
1554
1600
  clearOrderBy(): SelectQueryBuilder<DB, TB, O>;
1601
+ /**
1602
+ * Clears `group by` clause from the query.
1603
+ *
1604
+ * ### Examples
1605
+ *
1606
+ * ```ts
1607
+ * db.selectFrom('person')
1608
+ * .selectAll()
1609
+ * .groupBy('id')
1610
+ * .clearGroupBy()
1611
+ * ```
1612
+ *
1613
+ * The generated SQL(PostgreSQL):
1614
+ *
1615
+ * ```sql
1616
+ * select * from "person"
1617
+ * ```
1618
+ */
1619
+ clearGroupBy(): SelectQueryBuilder<DB, TB, O>;
1555
1620
  /**
1556
1621
  * Simply calls the provided function passing `this` as the only argument. `$call` returns
1557
1622
  * what the provided function returns.
@@ -1579,7 +1644,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1579
1644
  /**
1580
1645
  * Call `func(this)` if `condition` is true.
1581
1646
  *
1582
- * NOTE: This method has an impact on typescript performance and it should only be used
1647
+ * NOTE: This method has an impact on TypeScript performance and it should only be used
1583
1648
  * when necessary. Remember that you can call most methods like `where` conditionally
1584
1649
  * like this:
1585
1650
  *
@@ -1757,17 +1822,17 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1757
1822
  /**
1758
1823
  * Asserts that query's output row type equals the given type `T`.
1759
1824
  *
1760
- * This method can be used to simplify excessively complex types to make typescript happy
1825
+ * This method can be used to simplify excessively complex types to make TypeScript happy
1761
1826
  * and much faster.
1762
1827
  *
1763
1828
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
1764
- * for typescript and you get errors like this:
1829
+ * for TypeScript and you get errors like this:
1765
1830
  *
1766
1831
  * ```
1767
1832
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
1768
1833
  * ```
1769
1834
  *
1770
- * In these case you can often use this method to help typescript a little bit. When you use this
1835
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
1771
1836
  * method to assert the output type of a query, Kysely can drop the complex output type that
1772
1837
  * consists of multiple nested helper types and replace it with the simple asserted type.
1773
1838
  *
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSelectQueryBuilder = void 0;
3
+ exports.createSelectQueryBuilder = createSelectQueryBuilder;
4
4
  const alias_node_js_1 = require("../operation-node/alias-node.js");
5
5
  const select_modifier_node_js_1 = require("../operation-node/select-modifier-node.js");
6
6
  const join_parser_js_1 = require("../parser/join-parser.js");
@@ -271,6 +271,12 @@ class SelectQueryBuilderImpl {
271
271
  queryNode: select_query_node_js_1.SelectQueryNode.cloneWithoutOrderBy(this.#props.queryNode),
272
272
  });
273
273
  }
274
+ clearGroupBy() {
275
+ return new SelectQueryBuilderImpl({
276
+ ...this.#props,
277
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithoutGroupBy(this.#props.queryNode),
278
+ });
279
+ }
274
280
  $call(func) {
275
281
  return func(this);
276
282
  }
@@ -344,7 +350,6 @@ class SelectQueryBuilderImpl {
344
350
  function createSelectQueryBuilder(props) {
345
351
  return new SelectQueryBuilderImpl(props);
346
352
  }
347
- exports.createSelectQueryBuilder = createSelectQueryBuilder;
348
353
  /**
349
354
  * {@link SelectQueryBuilder} with an alias. The result of calling {@link SelectQueryBuilder.as}.
350
355
  */
@@ -3,7 +3,7 @@ import { CompiledQuery } from '../query-compiler/compiled-query.js';
3
3
  import { JoinCallbackExpression, JoinReferenceExpression } from '../parser/join-parser.js';
4
4
  import { TableExpression, From, FromTables } from '../parser/table-parser.js';
5
5
  import { SelectExpression, SelectCallback } from '../parser/select-parser.js';
6
- import { ReturningCallbackRow, ReturningRow } from '../parser/returning-parser.js';
6
+ import { ReturningAllRow, ReturningCallbackRow, ReturningRow } from '../parser/returning-parser.js';
7
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';
@@ -17,7 +17,6 @@ import { KyselyPlugin } from '../plugin/kysely-plugin.js';
17
17
  import { WhereInterface } from './where-interface.js';
18
18
  import { ReturningInterface } from './returning-interface.js';
19
19
  import { NoResultErrorConstructor } from './no-result-error.js';
20
- import { Selectable } from '../util/column-type.js';
21
20
  import { Explainable, ExplainFormat } from '../util/explainable.js';
22
21
  import { AliasedExpression, Expression } from '../expression/expression.js';
23
22
  import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
@@ -25,7 +24,8 @@ import { KyselyTypeError } from '../util/type-error.js';
25
24
  import { Streamable } from '../util/streamable.js';
26
25
  import { ExpressionOrFactory } from '../parser/expression-parser.js';
27
26
  import { ValueExpression } from '../parser/value-parser.js';
28
- export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
27
+ import { OutputCallback, OutputExpression, OutputInterface, OutputPrefix, SelectExpressionFromOutputCallback, SelectExpressionFromOutputExpression } from './output-interface.js';
28
+ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OutputInterface<DB, TB, O>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
29
29
  #private;
30
30
  constructor(props: UpdateQueryBuilderProps);
31
31
  /**
@@ -290,7 +290,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
290
290
  * .selectFrom('person')
291
291
  * .selectAll()
292
292
  * .where(
293
- * sql`coalesce(first_name, last_name)`,
293
+ * sql<string>`coalesce(first_name, last_name)`,
294
294
  * 'like',
295
295
  * '%' + name + '%',
296
296
  * )
@@ -695,7 +695,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
695
695
  * .set('first_name', 'Foo')
696
696
  * // As always, both arguments can be arbitrary expressions or
697
697
  * // callbacks that give you access to an expression builder:
698
- * .set(sql`address['postalCode']`, (eb) => eb.val('61710))
698
+ * .set(sql<string>`address['postalCode']`, (eb) => eb.val('61710))
699
699
  * .where('id', '=', '1')
700
700
  * .executeTakeFirst()
701
701
  * ```
@@ -736,7 +736,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
736
736
  * first_name: selectFrom('person').select('first_name').limit(1),
737
737
  * middle_name: ref('first_name'),
738
738
  * age: eb('age', '+', 1),
739
- * last_name: sql`${'Ani'} || ${'ston'}`,
739
+ * last_name: sql<string>`${'Ani'} || ${'ston'}`,
740
740
  * }))
741
741
  * .where('id', '=', 1)
742
742
  * .executeTakeFirst()
@@ -822,8 +822,93 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
822
822
  /**
823
823
  * Adds a `returning *` to an insert/update/delete query on databases
824
824
  * that support `returning` such as PostgreSQL.
825
+ *
826
+ * Also see the {@link returning} method.
827
+ */
828
+ returningAll<T extends TB>(tables: ReadonlyArray<T>): UpdateQueryBuilder<DB, UT, TB, ReturningAllRow<DB, T, O>>;
829
+ returningAll<T extends TB>(table: T): UpdateQueryBuilder<DB, UT, TB, ReturningAllRow<DB, T, O>>;
830
+ returningAll(): UpdateQueryBuilder<DB, UT, TB, ReturningAllRow<DB, TB, O>>;
831
+ /**
832
+ * Allows you to return data from modified rows.
833
+ *
834
+ * On supported databases like MS SQL Server (MSSQL), this method can be chained
835
+ * to `insert`, `update`, `delete` and `merge` queries to return data.
836
+ *
837
+ * Also see the {@link outputAll} method.
838
+ *
839
+ * ### Examples
840
+ *
841
+ * Return one column:
842
+ *
843
+ * ```ts
844
+ * const { id } = await db
845
+ * .insertInto('person')
846
+ * .output('inserted.id')
847
+ * .values({
848
+ * first_name: 'Jennifer',
849
+ * last_name: 'Aniston'
850
+ * })
851
+ * .executeTakeFirst()
852
+ * ```
853
+ *
854
+ * Return multiple columns:
855
+ *
856
+ * ```ts
857
+ * const { id, first_name } = await db
858
+ * .updateTable('person')
859
+ * .set({ first_name: 'John', last_name: 'Doe' })
860
+ * .output([
861
+ * 'deleted.first_name as old_first_name',
862
+ * 'deleted.last_name as old_last_name',
863
+ * 'inserted.first_name as new_first_name',
864
+ * 'inserted.last_name as new_last_name',
865
+ * ])
866
+ * .where('created_at', '<', new Date())
867
+ * .executeTakeFirst()
868
+ * ```
869
+ *
870
+ * Return arbitrary expressions:
871
+ *
872
+ * ```ts
873
+ * import { sql } from 'kysely'
874
+ *
875
+ * const { id, full_name } = await db
876
+ * .deleteFrom('person')
877
+ * .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
878
+ * .where('created_at', '<', new Date())
879
+ * .executeTakeFirst()
880
+ * ```
881
+ *
882
+ * Return the action performed on the row:
883
+ *
884
+ * ```ts
885
+ * await db
886
+ * .mergeInto('person')
887
+ * .using('pet', 'pet.owner_id', 'person.id')
888
+ * .whenMatched()
889
+ * .thenDelete()
890
+ * .whenNotMatched()
891
+ * .thenInsertValues({
892
+ * first_name: 'John',
893
+ * last_name: 'Doe',
894
+ * gender: 'male'
895
+ * })
896
+ * .output([
897
+ * 'inserted.id as inserted_id',
898
+ * 'deleted.id as deleted_id',
899
+ * ])
900
+ * ```
901
+ */
902
+ output<OE extends OutputExpression<DB, UT>>(selections: readonly OE[]): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
903
+ output<CB extends OutputCallback<DB, TB>>(callback: CB): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>>;
904
+ output<OE extends OutputExpression<DB, TB>>(selection: OE): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
905
+ /**
906
+ * Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
907
+ * that support `output` such as MS SQL Server (MSSQL).
908
+ *
909
+ * Also see the {@link output} method.
825
910
  */
826
- returningAll(): UpdateQueryBuilder<DB, UT, TB, Selectable<DB[TB]>>;
911
+ outputAll(table: OutputPrefix): UpdateQueryBuilder<DB, UT, TB, ReturningAllRow<DB, TB, O>>;
827
912
  /**
828
913
  * Clears all `returning` clauses from the query.
829
914
  *
@@ -960,17 +1045,17 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
960
1045
  /**
961
1046
  * Asserts that query's output row type equals the given type `T`.
962
1047
  *
963
- * This method can be used to simplify excessively complex types to make typescript happy
1048
+ * This method can be used to simplify excessively complex types to make TypeScript happy
964
1049
  * and much faster.
965
1050
  *
966
1051
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
967
- * for typescript and you get errors like this:
1052
+ * for TypeScript and you get errors like this:
968
1053
  *
969
1054
  * ```
970
1055
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
971
1056
  * ```
972
1057
  *
973
- * In these case you can often use this method to help typescript a little bit. When you use this
1058
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
974
1059
  * method to assert the output type of a query, Kysely can drop the complex output type that
975
1060
  * consists of multiple nested helper types and replace it with the simple asserted type.
976
1061
  *
@@ -150,10 +150,22 @@ class UpdateQueryBuilder {
150
150
  queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(selection)),
151
151
  });
152
152
  }
153
- returningAll() {
153
+ returningAll(table) {
154
154
  return new UpdateQueryBuilder({
155
155
  ...this.#props,
156
- queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)()),
156
+ queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
157
+ });
158
+ }
159
+ output(args) {
160
+ return new UpdateQueryBuilder({
161
+ ...this.#props,
162
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
163
+ });
164
+ }
165
+ outputAll(table) {
166
+ return new UpdateQueryBuilder({
167
+ ...this.#props,
168
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
157
169
  });
158
170
  }
159
171
  /**
@@ -310,17 +322,17 @@ class UpdateQueryBuilder {
310
322
  /**
311
323
  * Asserts that query's output row type equals the given type `T`.
312
324
  *
313
- * This method can be used to simplify excessively complex types to make typescript happy
325
+ * This method can be used to simplify excessively complex types to make TypeScript happy
314
326
  * and much faster.
315
327
  *
316
328
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
317
- * for typescript and you get errors like this:
329
+ * for TypeScript and you get errors like this:
318
330
  *
319
331
  * ```
320
332
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
321
333
  * ```
322
334
  *
323
- * In these case you can often use this method to help typescript a little bit. When you use this
335
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
324
336
  * method to assert the output type of a query, Kysely can drop the complex output type that
325
337
  * consists of multiple nested helper types and replace it with the simple asserted type.
326
338
  *
@@ -375,9 +387,11 @@ class UpdateQueryBuilder {
375
387
  */
376
388
  async execute() {
377
389
  const compiledQuery = this.compile();
378
- const query = compiledQuery.query;
379
390
  const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
380
- if (this.#props.executor.adapter.supportsReturning && query.returning) {
391
+ const { adapter } = this.#props.executor;
392
+ const query = compiledQuery.query;
393
+ if ((query.returning && adapter.supportsReturning) ||
394
+ (query.output && adapter.supportsOutput)) {
381
395
  return result.rows;
382
396
  }
383
397
  return [
@@ -1,5 +1,14 @@
1
1
  export declare class UpdateResult {
2
+ /**
3
+ * The number of rows the update query updated (even if not changed).
4
+ */
2
5
  readonly numUpdatedRows: bigint;
6
+ /**
7
+ * The number of rows the update query changed.
8
+ *
9
+ * This is **optional** and only supported in dialects such as MySQL.
10
+ * You would probably use {@link numUpdatedRows} in most cases.
11
+ */
3
12
  readonly numChangedRows?: bigint;
4
13
  constructor(numUpdatedRows: bigint, numChangedRows: bigint | undefined);
5
14
  }
@@ -2,7 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UpdateResult = void 0;
4
4
  class UpdateResult {
5
+ /**
6
+ * The number of rows the update query updated (even if not changed).
7
+ */
5
8
  numUpdatedRows;
9
+ /**
10
+ * The number of rows the update query changed.
11
+ *
12
+ * This is **optional** and only supported in dialects such as MySQL.
13
+ * You would probably use {@link numUpdatedRows} in most cases.
14
+ */
6
15
  numChangedRows;
7
16
  constructor(numUpdatedRows, numChangedRows) {
8
17
  this.numUpdatedRows = numUpdatedRows;
@@ -265,7 +265,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
265
265
  * .selectFrom('person')
266
266
  * .selectAll()
267
267
  * .where(
268
- * sql`coalesce(first_name, last_name)`,
268
+ * sql<string>`coalesce(first_name, last_name)`,
269
269
  * 'like',
270
270
  * '%' + name + '%',
271
271
  * )
@@ -94,6 +94,7 @@ import { AddIndexNode } from '../operation-node/add-index-node.js';
94
94
  import { CastNode } from '../operation-node/cast-node.js';
95
95
  import { FetchNode } from '../operation-node/fetch-node.js';
96
96
  import { TopNode } from '../operation-node/top-node.js';
97
+ import { OutputNode } from '../operation-node/output-node.js';
97
98
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
98
99
  #private;
99
100
  protected get numParameters(): number;
@@ -195,6 +196,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
195
196
  protected visitAddIndex(node: AddIndexNode): void;
196
197
  protected visitCast(node: CastNode): void;
197
198
  protected visitFetch(node: FetchNode): void;
199
+ protected visitOutput(node: OutputNode): void;
198
200
  protected visitTop(node: TopNode): void;
199
201
  protected append(str: string): void;
200
202
  protected appendValue(parameter: unknown): void;
@@ -20,6 +20,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
20
20
  compileQuery(node) {
21
21
  this.#sql = '';
22
22
  this.#parameters = [];
23
+ this.nodeStack.splice(0, this.nodeStack.length);
23
24
  this.visitNode(node);
24
25
  return (0, object_utils_js_1.freeze)({
25
26
  query: node,
@@ -176,6 +177,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
176
177
  this.compileList(node.columns);
177
178
  this.append(')');
178
179
  }
180
+ if (node.output) {
181
+ this.append(' ');
182
+ this.visitNode(node.output);
183
+ }
179
184
  if (node.values) {
180
185
  this.append(' ');
181
186
  this.visitNode(node.values);
@@ -223,6 +228,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
223
228
  this.append(' ');
224
229
  }
225
230
  this.visitNode(node.from);
231
+ if (node.output) {
232
+ this.append(' ');
233
+ this.visitNode(node.output);
234
+ }
226
235
  if (node.using) {
227
236
  this.append(' ');
228
237
  this.visitNode(node.using);
@@ -393,6 +402,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
393
402
  }
394
403
  }
395
404
  visitColumnDefinition(node) {
405
+ if (node.ifNotExists) {
406
+ this.append('if not exists ');
407
+ }
396
408
  this.visitNode(node.column);
397
409
  this.append(' ');
398
410
  this.visitNode(node.dataType);
@@ -519,6 +531,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
519
531
  if (node.updates) {
520
532
  this.compileList(node.updates);
521
533
  }
534
+ if (node.output) {
535
+ this.append(' ');
536
+ this.visitNode(node.output);
537
+ }
522
538
  if (node.from) {
523
539
  this.append(' ');
524
540
  this.visitNode(node.from);
@@ -1093,7 +1109,11 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
1093
1109
  }
1094
1110
  if (node.whens) {
1095
1111
  this.append(' ');
1096
- this.compileList(node.whens);
1112
+ this.compileList(node.whens, ' ');
1113
+ }
1114
+ if (node.output) {
1115
+ this.append(' ');
1116
+ this.visitNode(node.output);
1097
1117
  }
1098
1118
  }
1099
1119
  visitMatched(node) {
@@ -1134,6 +1154,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
1134
1154
  this.visitNode(node.rowCount);
1135
1155
  this.append(` rows ${node.modifier}`);
1136
1156
  }
1157
+ visitOutput(node) {
1158
+ this.append('output ');
1159
+ this.compileList(node.selections);
1160
+ }
1137
1161
  visitTop(node) {
1138
1162
  this.append(`top(${node.expression})`);
1139
1163
  if (node.modifiers) {