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
@@ -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
  *
@@ -148,10 +148,22 @@ export class UpdateQueryBuilder {
148
148
  queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectArg(selection)),
149
149
  });
150
150
  }
151
- returningAll() {
151
+ returningAll(table) {
152
152
  return new UpdateQueryBuilder({
153
153
  ...this.#props,
154
- queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll()),
154
+ queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll(table)),
155
+ });
156
+ }
157
+ output(args) {
158
+ return new UpdateQueryBuilder({
159
+ ...this.#props,
160
+ queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
161
+ });
162
+ }
163
+ outputAll(table) {
164
+ return new UpdateQueryBuilder({
165
+ ...this.#props,
166
+ queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
155
167
  });
156
168
  }
157
169
  /**
@@ -308,17 +320,17 @@ export class UpdateQueryBuilder {
308
320
  /**
309
321
  * Asserts that query's output row type equals the given type `T`.
310
322
  *
311
- * This method can be used to simplify excessively complex types to make typescript happy
323
+ * This method can be used to simplify excessively complex types to make TypeScript happy
312
324
  * and much faster.
313
325
  *
314
326
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
315
- * for typescript and you get errors like this:
327
+ * for TypeScript and you get errors like this:
316
328
  *
317
329
  * ```
318
330
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
319
331
  * ```
320
332
  *
321
- * In these case you can often use this method to help typescript a little bit. When you use this
333
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
322
334
  * method to assert the output type of a query, Kysely can drop the complex output type that
323
335
  * consists of multiple nested helper types and replace it with the simple asserted type.
324
336
  *
@@ -373,9 +385,11 @@ export class UpdateQueryBuilder {
373
385
  */
374
386
  async execute() {
375
387
  const compiledQuery = this.compile();
376
- const query = compiledQuery.query;
377
388
  const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
378
- if (this.#props.executor.adapter.supportsReturning && query.returning) {
389
+ const { adapter } = this.#props.executor;
390
+ const query = compiledQuery.query;
391
+ if ((query.returning && adapter.supportsReturning) ||
392
+ (query.output && adapter.supportsOutput)) {
379
393
  return result.rows;
380
394
  }
381
395
  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
  }
@@ -1,6 +1,15 @@
1
1
  /// <reference types="./update-result.d.ts" />
2
2
  export class UpdateResult {
3
+ /**
4
+ * The number of rows the update query updated (even if not changed).
5
+ */
3
6
  numUpdatedRows;
7
+ /**
8
+ * The number of rows the update query changed.
9
+ *
10
+ * This is **optional** and only supported in dialects such as MySQL.
11
+ * You would probably use {@link numUpdatedRows} in most cases.
12
+ */
4
13
  numChangedRows;
5
14
  constructor(numUpdatedRows, numChangedRows) {
6
15
  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;
@@ -18,6 +18,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
18
18
  compileQuery(node) {
19
19
  this.#sql = '';
20
20
  this.#parameters = [];
21
+ this.nodeStack.splice(0, this.nodeStack.length);
21
22
  this.visitNode(node);
22
23
  return freeze({
23
24
  query: node,
@@ -174,6 +175,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
174
175
  this.compileList(node.columns);
175
176
  this.append(')');
176
177
  }
178
+ if (node.output) {
179
+ this.append(' ');
180
+ this.visitNode(node.output);
181
+ }
177
182
  if (node.values) {
178
183
  this.append(' ');
179
184
  this.visitNode(node.values);
@@ -221,6 +226,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
221
226
  this.append(' ');
222
227
  }
223
228
  this.visitNode(node.from);
229
+ if (node.output) {
230
+ this.append(' ');
231
+ this.visitNode(node.output);
232
+ }
224
233
  if (node.using) {
225
234
  this.append(' ');
226
235
  this.visitNode(node.using);
@@ -391,6 +400,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
391
400
  }
392
401
  }
393
402
  visitColumnDefinition(node) {
403
+ if (node.ifNotExists) {
404
+ this.append('if not exists ');
405
+ }
394
406
  this.visitNode(node.column);
395
407
  this.append(' ');
396
408
  this.visitNode(node.dataType);
@@ -517,6 +529,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
517
529
  if (node.updates) {
518
530
  this.compileList(node.updates);
519
531
  }
532
+ if (node.output) {
533
+ this.append(' ');
534
+ this.visitNode(node.output);
535
+ }
520
536
  if (node.from) {
521
537
  this.append(' ');
522
538
  this.visitNode(node.from);
@@ -1091,7 +1107,11 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
1091
1107
  }
1092
1108
  if (node.whens) {
1093
1109
  this.append(' ');
1094
- this.compileList(node.whens);
1110
+ this.compileList(node.whens, ' ');
1111
+ }
1112
+ if (node.output) {
1113
+ this.append(' ');
1114
+ this.visitNode(node.output);
1095
1115
  }
1096
1116
  }
1097
1117
  visitMatched(node) {
@@ -1132,6 +1152,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
1132
1152
  this.visitNode(node.rowCount);
1133
1153
  this.append(` rows ${node.modifier}`);
1134
1154
  }
1155
+ visitOutput(node) {
1156
+ this.append('output ');
1157
+ this.compileList(node.selections);
1158
+ }
1135
1159
  visitTop(node) {
1136
1160
  this.append(`top(${node.expression})`);
1137
1161
  if (node.modifiers) {
@@ -125,10 +125,10 @@ export declare class QueryCreator<DB> {
125
125
  * ```
126
126
  */
127
127
  selectFrom<TE extends keyof DB & string>(from: TE[]): SelectQueryBuilder<DB, ExtractTableAlias<DB, TE>, {}>;
128
- selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
128
+ selectFrom<TE extends TableExpression<DB, never>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
129
129
  selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, ExtractTableAlias<DB, TE>, {}>;
130
130
  selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, ExtractTableAlias<DB & PickTableWithAlias<DB, TE>, TE>, {}>;
131
- selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
131
+ selectFrom<TE extends TableExpression<DB, never>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
132
132
  /**
133
133
  * Creates a `select` query builder without a `from` clause.
134
134
  *
@@ -365,24 +365,77 @@ export declare class QueryCreator<DB> {
365
365
  *
366
366
  * ### Examples
367
367
  *
368
+ * <!-- siteExample("cte", "Simple selects", 10) -->
369
+ *
370
+ * Common table expressions (CTE) are a great way to modularize complex queries.
371
+ * Essentially they allow you to run multiple separate queries within a
372
+ * single roundtrip to the DB.
373
+ *
374
+ * Since CTEs are a part of the main query, query optimizers inside DB
375
+ * engines are able to optimize the overall query. For example, postgres
376
+ * is able to inline the CTEs inside the using queries if it decides it's
377
+ * faster.
378
+ *
368
379
  * ```ts
369
- * await db
380
+ * const result = await db
381
+ * // Create a CTE called `jennifers` that selects all
382
+ * // persons named 'Jennifer'.
370
383
  * .with('jennifers', (db) => db
371
384
  * .selectFrom('person')
372
385
  * .where('first_name', '=', 'Jennifer')
373
386
  * .select(['id', 'age'])
374
387
  * )
388
+ * // Select all rows from the `jennifers` CTE and
389
+ * // further filter it.
375
390
  * .with('adult_jennifers', (db) => db
376
391
  * .selectFrom('jennifers')
377
392
  * .where('age', '>', 18)
378
393
  * .select(['id', 'age'])
379
394
  * )
395
+ * // Finally select all adult jennifers that are
396
+ * // also younger than 60.
380
397
  * .selectFrom('adult_jennifers')
381
398
  * .where('age', '<', 60)
382
399
  * .selectAll()
383
400
  * .execute()
384
401
  * ```
385
402
  *
403
+ * <!-- siteExample("cte", "Inserts, updates and deletions", 20) -->
404
+ *
405
+ * Some databases like postgres also allow you to run other queries than selects
406
+ * in CTEs. On these databases CTEs are extremely powerful:
407
+ *
408
+ * ```ts
409
+ * const result = await db
410
+ * .with('new_person', (db) => db
411
+ * .insertInto('person')
412
+ * .values({
413
+ * first_name: 'Jennifer',
414
+ * age: 35,
415
+ * })
416
+ * .returning('id')
417
+ * )
418
+ * .with('new_pet', (db) => db
419
+ * .insertInto('pet')
420
+ * .values({
421
+ * name: 'Doggo',
422
+ * species: 'dog',
423
+ * is_favorite: true,
424
+ * // Use the id of the person we just inserted.
425
+ * owner_id: db
426
+ * .selectFrom('new_person')
427
+ * .select('id')
428
+ * })
429
+ * .returning('id')
430
+ * )
431
+ * .selectFrom(['new_person', 'new_pet'])
432
+ * .select([
433
+ * 'new_person.id as person_id',
434
+ * 'new_pet.id as pet_id'
435
+ * ])
436
+ * .execute()
437
+ * ```
438
+ *
386
439
  * The CTE name can optionally specify column names in addition to
387
440
  * a name. In that case Kysely requires the expression to retun
388
441
  * rows with the same columns.
@@ -139,24 +139,77 @@ export class QueryCreator {
139
139
  *
140
140
  * ### Examples
141
141
  *
142
+ * <!-- siteExample("cte", "Simple selects", 10) -->
143
+ *
144
+ * Common table expressions (CTE) are a great way to modularize complex queries.
145
+ * Essentially they allow you to run multiple separate queries within a
146
+ * single roundtrip to the DB.
147
+ *
148
+ * Since CTEs are a part of the main query, query optimizers inside DB
149
+ * engines are able to optimize the overall query. For example, postgres
150
+ * is able to inline the CTEs inside the using queries if it decides it's
151
+ * faster.
152
+ *
142
153
  * ```ts
143
- * await db
154
+ * const result = await db
155
+ * // Create a CTE called `jennifers` that selects all
156
+ * // persons named 'Jennifer'.
144
157
  * .with('jennifers', (db) => db
145
158
  * .selectFrom('person')
146
159
  * .where('first_name', '=', 'Jennifer')
147
160
  * .select(['id', 'age'])
148
161
  * )
162
+ * // Select all rows from the `jennifers` CTE and
163
+ * // further filter it.
149
164
  * .with('adult_jennifers', (db) => db
150
165
  * .selectFrom('jennifers')
151
166
  * .where('age', '>', 18)
152
167
  * .select(['id', 'age'])
153
168
  * )
169
+ * // Finally select all adult jennifers that are
170
+ * // also younger than 60.
154
171
  * .selectFrom('adult_jennifers')
155
172
  * .where('age', '<', 60)
156
173
  * .selectAll()
157
174
  * .execute()
158
175
  * ```
159
176
  *
177
+ * <!-- siteExample("cte", "Inserts, updates and deletions", 20) -->
178
+ *
179
+ * Some databases like postgres also allow you to run other queries than selects
180
+ * in CTEs. On these databases CTEs are extremely powerful:
181
+ *
182
+ * ```ts
183
+ * const result = await db
184
+ * .with('new_person', (db) => db
185
+ * .insertInto('person')
186
+ * .values({
187
+ * first_name: 'Jennifer',
188
+ * age: 35,
189
+ * })
190
+ * .returning('id')
191
+ * )
192
+ * .with('new_pet', (db) => db
193
+ * .insertInto('pet')
194
+ * .values({
195
+ * name: 'Doggo',
196
+ * species: 'dog',
197
+ * is_favorite: true,
198
+ * // Use the id of the person we just inserted.
199
+ * owner_id: db
200
+ * .selectFrom('new_person')
201
+ * .select('id')
202
+ * })
203
+ * .returning('id')
204
+ * )
205
+ * .selectFrom(['new_person', 'new_pet'])
206
+ * .select([
207
+ * 'new_person.id as person_id',
208
+ * 'new_pet.id as pet_id'
209
+ * ])
210
+ * .execute()
211
+ * ```
212
+ *
160
213
  * The CTE name can optionally specify column names in addition to
161
214
  * a name. In that case Kysely requires the expression to retun
162
215
  * rows with the same columns.
@@ -33,12 +33,12 @@ export interface Sql {
33
33
  * // method to give it an alias.
34
34
  * sql<string>`concat(first_name, ' ', last_name)`.as('full_name')
35
35
  * )
36
- * .where(sql`birthdate between ${date1} and ${date2}`)
36
+ * .where(sql<boolean>`birthdate between ${date1} and ${date2}`)
37
37
  * // Here we assume we have list of nicknames for the person
38
38
  * // (a list of strings) and we use the PostgreSQL `@>` operator
39
39
  * // to test if all of them are valid nicknames for the user.
40
- * .where('nicknames', '@>', sql`ARRAY[${sql.join(nicknames)}]`)
41
- * .orderBy(sql`concat(first_name, ' ', last_name)`)
40
+ * .where('nicknames', '@>', sql<string[]>`ARRAY[${sql.join(nicknames)}]`)
41
+ * .orderBy(sql<string>`concat(first_name, ' ', last_name)`)
42
42
  * .execute()
43
43
  * ```
44
44
  *
@@ -63,7 +63,7 @@ export interface Sql {
63
63
  *
64
64
  * ```ts
65
65
  * const petName = db.selectFrom('pet').select('name').limit(1)
66
- * const fullName = sql`concat(first_name, ' ', last_name)`
66
+ * const fullName = sql<string>`concat(first_name, ' ', last_name)`
67
67
  *
68
68
  * sql`
69
69
  * select ${fullName} as full_name, ${petName} as pet_name
@@ -301,7 +301,7 @@ export interface Sql {
301
301
  * return db
302
302
  * .selectFrom('person')
303
303
  * .selectAll()
304
- * .where('nicknames', '@>', sql`ARRAY[${sql.join(nicknames)}]`)
304
+ * .where('nicknames', '@>', sql<string[]>`ARRAY[${sql.join(nicknames)}]`)
305
305
  * .execute()
306
306
  * }
307
307
  * ```
@@ -2,6 +2,7 @@
2
2
  import { AlterColumnNode } from '../operation-node/alter-column-node.js';
3
3
  import { parseDataTypeExpression, } from '../parser/data-type-parser.js';
4
4
  import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
5
+ import { preventAwait } from '../util/prevent-await.js';
5
6
  export class AlterColumnBuilder {
6
7
  #column;
7
8
  constructor(column) {
@@ -30,6 +31,7 @@ export class AlterColumnBuilder {
30
31
  return func(this);
31
32
  }
32
33
  }
34
+ preventAwait(AlterColumnBuilder, "don't await AlterColumnBuilder instances");
33
35
  /**
34
36
  * Allows us to force consumers to do exactly one alteration to a column.
35
37
  *
@@ -54,3 +56,4 @@ export class AlteredColumnBuilder {
54
56
  return this.#alterColumnNode;
55
57
  }
56
58
  }
59
+ preventAwait(AlteredColumnBuilder, "don't await AlteredColumnBuilder instances");
@@ -72,7 +72,7 @@ export declare class AlterTableAddIndexBuilder implements OperationNodeSource, C
72
72
  * await db.schema
73
73
  * .alterTable('person')
74
74
  * .addIndex('person_first_name_index')
75
- * .expression(sql`(first_name < 'Sami')`)
75
+ * .expression(sql<boolean>`(first_name < 'Sami')`)
76
76
  * .execute()
77
77
  * ```
78
78
  *
@@ -97,7 +97,7 @@ export class AlterTableAddIndexBuilder {
97
97
  * await db.schema
98
98
  * .alterTable('person')
99
99
  * .addIndex('person_first_name_index')
100
- * .expression(sql`(first_name < 'Sami')`)
100
+ * .expression(sql<boolean>`(first_name < 'Sami')`)
101
101
  * .execute()
102
102
  * ```
103
103
  *
@@ -200,6 +200,7 @@ export class AlterTableBuilder {
200
200
  return func(this);
201
201
  }
202
202
  }
203
+ preventAwait(AlterTableBuilder, "don't await AlterTableBuilder instances");
203
204
  export class AlterTableColumnAlteringBuilder {
204
205
  #props;
205
206
  constructor(props) {
@@ -248,6 +249,4 @@ export class AlterTableColumnAlteringBuilder {
248
249
  await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
249
250
  }
250
251
  }
251
- preventAwait(AlterTableBuilder, "don't await AlterTableBuilder instances");
252
- preventAwait(AlterColumnBuilder, "don't await AlterColumnBuilder instances");
253
252
  preventAwait(AlterTableColumnAlteringBuilder, "don't await AlterTableColumnAlteringBuilder instances directly. To execute the query you need to call `execute`");
@@ -220,6 +220,11 @@ export declare class ColumnDefinitionBuilder implements OperationNodeSource {
220
220
  * ```
221
221
  */
222
222
  nullsNotDistinct(): ColumnDefinitionBuilder;
223
+ /**
224
+ * Adds `if not exists` specifier.
225
+ * This only works for PostgreSQL.
226
+ */
227
+ ifNotExists(): ColumnDefinitionBuilder;
223
228
  /**
224
229
  * This can be used to add any additional SQL to the end of the column definition.
225
230
  *
@@ -297,6 +297,13 @@ export class ColumnDefinitionBuilder {
297
297
  nullsNotDistinct() {
298
298
  return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { nullsNotDistinct: true }));
299
299
  }
300
+ /**
301
+ * Adds `if not exists` specifier.
302
+ * This only works for PostgreSQL.
303
+ */
304
+ ifNotExists() {
305
+ return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { ifNotExists: true }));
306
+ }
300
307
  /**
301
308
  * This can be used to add any additional SQL to the end of the column definition.
302
309
  *