kysely 0.26.1 → 0.26.2

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 (210) hide show
  1. package/README.md +6 -6
  2. package/dist/cjs/dialect/dialect-adapter-base.d.ts +3 -3
  3. package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +3 -2
  4. package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -2
  5. package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +3 -2
  6. package/dist/cjs/dialect/postgres/postgres-adapter.js +2 -2
  7. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +2 -2
  8. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +4 -2
  9. package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -2
  10. package/dist/cjs/driver/runtime-driver.js +17 -2
  11. package/dist/cjs/expression/expression-builder.d.ts +298 -27
  12. package/dist/cjs/expression/expression-builder.js +36 -26
  13. package/dist/cjs/expression/expression-wrapper.d.ts +177 -8
  14. package/dist/cjs/expression/expression-wrapper.js +4 -4
  15. package/dist/cjs/expression/expression.d.ts +64 -1
  16. package/dist/cjs/helpers/mysql.d.ts +11 -8
  17. package/dist/cjs/helpers/mysql.js +21 -32
  18. package/dist/cjs/helpers/postgres.d.ts +8 -5
  19. package/dist/cjs/helpers/postgres.js +8 -5
  20. package/dist/cjs/helpers/sqlite.d.ts +164 -0
  21. package/dist/cjs/helpers/sqlite.js +180 -0
  22. package/dist/cjs/index.d.ts +3 -1
  23. package/dist/cjs/index.js +1 -0
  24. package/dist/cjs/kysely.d.ts +4 -3
  25. package/dist/cjs/kysely.js +1 -1
  26. package/dist/cjs/operation-node/common-table-expression-node.d.ts +4 -0
  27. package/dist/cjs/operation-node/common-table-expression-node.js +6 -0
  28. package/dist/cjs/operation-node/delete-query-node.d.ts +1 -1
  29. package/dist/cjs/operation-node/delete-query-node.js +3 -3
  30. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  31. package/dist/cjs/operation-node/operation-node-transformer.js +8 -0
  32. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  33. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  34. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  35. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  36. package/dist/cjs/operation-node/operator-node.js +3 -0
  37. package/dist/cjs/operation-node/order-by-node.d.ts +2 -2
  38. package/dist/cjs/operation-node/order-by-node.js +4 -4
  39. package/dist/cjs/operation-node/over-node.d.ts +1 -1
  40. package/dist/cjs/operation-node/over-node.js +3 -3
  41. package/dist/cjs/operation-node/select-query-node.d.ts +5 -4
  42. package/dist/cjs/operation-node/select-query-node.js +13 -7
  43. package/dist/cjs/operation-node/tuple-node.d.ts +12 -0
  44. package/dist/cjs/operation-node/tuple-node.js +18 -0
  45. package/dist/cjs/parser/binary-operation-parser.d.ts +11 -7
  46. package/dist/cjs/parser/binary-operation-parser.js +35 -46
  47. package/dist/cjs/parser/expression-parser.d.ts +9 -4
  48. package/dist/cjs/parser/join-parser.d.ts +2 -2
  49. package/dist/cjs/parser/join-parser.js +2 -3
  50. package/dist/cjs/parser/order-by-parser.d.ts +6 -2
  51. package/dist/cjs/parser/order-by-parser.js +41 -7
  52. package/dist/cjs/parser/parse-utils.js +2 -2
  53. package/dist/cjs/parser/reference-parser.js +1 -1
  54. package/dist/cjs/parser/select-parser.d.ts +5 -5
  55. package/dist/cjs/parser/set-operation-parser.d.ts +3 -1
  56. package/dist/cjs/parser/set-operation-parser.js +13 -4
  57. package/dist/cjs/parser/tuple-parser.d.ts +47 -0
  58. package/dist/cjs/parser/tuple-parser.js +2 -0
  59. package/dist/cjs/parser/value-parser.d.ts +4 -2
  60. package/dist/cjs/parser/value-parser.js +12 -1
  61. package/dist/cjs/parser/with-parser.d.ts +3 -2
  62. package/dist/cjs/parser/with-parser.js +16 -4
  63. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +3 -3
  64. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +4 -8
  65. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
  66. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +50 -14
  67. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +5 -5
  68. package/dist/cjs/query-builder/aggregate-function-builder.js +2 -2
  69. package/dist/cjs/query-builder/case-builder.js +8 -4
  70. package/dist/cjs/query-builder/cte-builder.d.ts +20 -0
  71. package/dist/cjs/query-builder/cte-builder.js +39 -0
  72. package/dist/cjs/query-builder/delete-query-builder.d.ts +34 -7
  73. package/dist/cjs/query-builder/delete-query-builder.js +3 -3
  74. package/dist/cjs/query-builder/function-module.d.ts +41 -6
  75. package/dist/cjs/query-builder/function-module.js +3 -0
  76. package/dist/cjs/query-builder/having-interface.d.ts +2 -5
  77. package/dist/cjs/query-builder/join-builder.d.ts +2 -6
  78. package/dist/cjs/query-builder/join-builder.js +2 -2
  79. package/dist/cjs/query-builder/json-path-builder.d.ts +59 -3
  80. package/dist/cjs/query-builder/on-conflict-builder.d.ts +65 -12
  81. package/dist/cjs/query-builder/on-conflict-builder.js +4 -4
  82. package/dist/cjs/query-builder/over-builder.js +1 -1
  83. package/dist/cjs/query-builder/select-query-builder.d.ts +201 -65
  84. package/dist/cjs/query-builder/select-query-builder.js +72 -924
  85. package/dist/cjs/query-builder/update-query-builder.d.ts +34 -7
  86. package/dist/cjs/query-builder/update-query-builder.js +2 -2
  87. package/dist/cjs/query-builder/where-interface.d.ts +32 -8
  88. package/dist/cjs/query-compiler/default-query-compiler.d.ts +3 -0
  89. package/dist/cjs/query-compiler/default-query-compiler.js +39 -7
  90. package/dist/cjs/query-creator.d.ts +74 -2
  91. package/dist/cjs/query-creator.js +83 -6
  92. package/dist/cjs/raw-builder/raw-builder.d.ts +88 -49
  93. package/dist/cjs/raw-builder/raw-builder.js +18 -45
  94. package/dist/cjs/raw-builder/sql.js +8 -8
  95. package/dist/cjs/schema/alter-table-builder.d.ts +4 -0
  96. package/dist/cjs/schema/alter-table-builder.js +12 -0
  97. package/dist/cjs/schema/create-index-builder.d.ts +1 -1
  98. package/dist/cjs/schema/create-index-builder.js +1 -1
  99. package/dist/cjs/util/column-type.d.ts +7 -6
  100. package/dist/cjs/util/json-object-args.d.ts +3 -0
  101. package/dist/cjs/util/json-object-args.js +35 -0
  102. package/dist/cjs/util/object-utils.d.ts +1 -0
  103. package/dist/cjs/util/object-utils.js +9 -1
  104. package/dist/cjs/util/type-utils.d.ts +10 -10
  105. package/dist/esm/dialect/dialect-adapter-base.d.ts +3 -3
  106. package/dist/esm/dialect/mysql/mysql-adapter.d.ts +3 -2
  107. package/dist/esm/dialect/mysql/mysql-adapter.js +2 -2
  108. package/dist/esm/dialect/postgres/postgres-adapter.d.ts +3 -2
  109. package/dist/esm/dialect/postgres/postgres-adapter.js +2 -2
  110. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +2 -2
  111. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +4 -2
  112. package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -2
  113. package/dist/esm/driver/runtime-driver.js +17 -2
  114. package/dist/esm/expression/expression-builder.d.ts +298 -27
  115. package/dist/esm/expression/expression-builder.js +40 -30
  116. package/dist/esm/expression/expression-wrapper.d.ts +177 -8
  117. package/dist/esm/expression/expression-wrapper.js +5 -5
  118. package/dist/esm/expression/expression.d.ts +64 -1
  119. package/dist/esm/helpers/mysql.d.ts +11 -8
  120. package/dist/esm/helpers/mysql.js +21 -32
  121. package/dist/esm/helpers/postgres.d.ts +8 -5
  122. package/dist/esm/helpers/postgres.js +8 -5
  123. package/dist/esm/helpers/sqlite.d.ts +164 -0
  124. package/dist/esm/helpers/sqlite.js +175 -0
  125. package/dist/esm/index.d.ts +3 -1
  126. package/dist/esm/index.js +1 -0
  127. package/dist/esm/kysely.d.ts +4 -3
  128. package/dist/esm/kysely.js +1 -1
  129. package/dist/esm/operation-node/common-table-expression-node.d.ts +4 -0
  130. package/dist/esm/operation-node/common-table-expression-node.js +6 -0
  131. package/dist/esm/operation-node/delete-query-node.d.ts +1 -1
  132. package/dist/esm/operation-node/delete-query-node.js +3 -3
  133. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  134. package/dist/esm/operation-node/operation-node-transformer.js +8 -0
  135. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  136. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  137. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  138. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  139. package/dist/esm/operation-node/operator-node.js +3 -0
  140. package/dist/esm/operation-node/order-by-node.d.ts +2 -2
  141. package/dist/esm/operation-node/order-by-node.js +4 -4
  142. package/dist/esm/operation-node/over-node.d.ts +1 -1
  143. package/dist/esm/operation-node/over-node.js +3 -3
  144. package/dist/esm/operation-node/select-query-node.d.ts +5 -4
  145. package/dist/esm/operation-node/select-query-node.js +13 -7
  146. package/dist/esm/operation-node/tuple-node.d.ts +12 -0
  147. package/dist/esm/operation-node/tuple-node.js +16 -0
  148. package/dist/esm/parser/binary-operation-parser.d.ts +11 -7
  149. package/dist/esm/parser/binary-operation-parser.js +36 -47
  150. package/dist/esm/parser/expression-parser.d.ts +9 -4
  151. package/dist/esm/parser/join-parser.d.ts +2 -2
  152. package/dist/esm/parser/join-parser.js +3 -4
  153. package/dist/esm/parser/order-by-parser.d.ts +6 -2
  154. package/dist/esm/parser/order-by-parser.js +40 -7
  155. package/dist/esm/parser/parse-utils.js +3 -3
  156. package/dist/esm/parser/reference-parser.js +1 -1
  157. package/dist/esm/parser/select-parser.d.ts +5 -5
  158. package/dist/esm/parser/set-operation-parser.d.ts +3 -1
  159. package/dist/esm/parser/set-operation-parser.js +11 -2
  160. package/dist/esm/parser/tuple-parser.d.ts +47 -0
  161. package/dist/esm/parser/tuple-parser.js +2 -0
  162. package/dist/esm/parser/value-parser.d.ts +4 -2
  163. package/dist/esm/parser/value-parser.js +10 -1
  164. package/dist/esm/parser/with-parser.d.ts +3 -2
  165. package/dist/esm/parser/with-parser.js +16 -4
  166. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +3 -3
  167. package/dist/esm/plugin/camel-case/camel-case-plugin.js +5 -9
  168. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
  169. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +51 -15
  170. package/dist/esm/query-builder/aggregate-function-builder.d.ts +5 -5
  171. package/dist/esm/query-builder/aggregate-function-builder.js +3 -3
  172. package/dist/esm/query-builder/case-builder.js +10 -6
  173. package/dist/esm/query-builder/cte-builder.d.ts +20 -0
  174. package/dist/esm/query-builder/cte-builder.js +36 -0
  175. package/dist/esm/query-builder/delete-query-builder.d.ts +34 -7
  176. package/dist/esm/query-builder/delete-query-builder.js +4 -4
  177. package/dist/esm/query-builder/function-module.d.ts +41 -6
  178. package/dist/esm/query-builder/function-module.js +3 -0
  179. package/dist/esm/query-builder/having-interface.d.ts +2 -5
  180. package/dist/esm/query-builder/join-builder.d.ts +2 -6
  181. package/dist/esm/query-builder/join-builder.js +3 -3
  182. package/dist/esm/query-builder/json-path-builder.d.ts +59 -3
  183. package/dist/esm/query-builder/on-conflict-builder.d.ts +65 -12
  184. package/dist/esm/query-builder/on-conflict-builder.js +5 -5
  185. package/dist/esm/query-builder/over-builder.js +1 -1
  186. package/dist/esm/query-builder/select-query-builder.d.ts +201 -65
  187. package/dist/esm/query-builder/select-query-builder.js +72 -923
  188. package/dist/esm/query-builder/update-query-builder.d.ts +34 -7
  189. package/dist/esm/query-builder/update-query-builder.js +3 -3
  190. package/dist/esm/query-builder/where-interface.d.ts +32 -8
  191. package/dist/esm/query-compiler/default-query-compiler.d.ts +3 -0
  192. package/dist/esm/query-compiler/default-query-compiler.js +39 -7
  193. package/dist/esm/query-creator.d.ts +74 -2
  194. package/dist/esm/query-creator.js +84 -7
  195. package/dist/esm/raw-builder/raw-builder.d.ts +88 -49
  196. package/dist/esm/raw-builder/raw-builder.js +17 -42
  197. package/dist/esm/raw-builder/sql.js +9 -9
  198. package/dist/esm/schema/alter-table-builder.d.ts +4 -0
  199. package/dist/esm/schema/alter-table-builder.js +12 -0
  200. package/dist/esm/schema/create-index-builder.d.ts +1 -1
  201. package/dist/esm/schema/create-index-builder.js +2 -2
  202. package/dist/esm/util/column-type.d.ts +7 -6
  203. package/dist/esm/util/json-object-args.d.ts +3 -0
  204. package/dist/esm/util/json-object-args.js +32 -0
  205. package/dist/esm/util/object-utils.d.ts +1 -0
  206. package/dist/esm/util/object-utils.js +7 -0
  207. package/dist/esm/util/type-utils.d.ts +10 -10
  208. package/helpers/sqlite.d.ts +1 -0
  209. package/helpers/sqlite.js +1 -0
  210. package/package.json +7 -4
@@ -6,7 +6,7 @@ import { SelectExpression, SelectArg } from '../parser/select-parser.js';
6
6
  import { 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
- import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, SimplifyResult, SimplifySingleResult } from '../util/type-utils.js';
9
+ import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, SimplifyResult, SimplifySingleResult, SqlBool } from '../util/type-utils.js';
10
10
  import { UpdateQueryNode } from '../operation-node/update-query-node.js';
11
11
  import { UpdateObject, UpdateObjectFactory } from '../parser/update-set-parser.js';
12
12
  import { Compilable } from '../util/compilable.js';
@@ -14,7 +14,7 @@ import { QueryExecutor } from '../query-executor/query-executor.js';
14
14
  import { QueryId } from '../util/query-id.js';
15
15
  import { UpdateResult } from './update-result.js';
16
16
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
17
- import { WhereExpressionFactory, WhereInterface } from './where-interface.js';
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
20
  import { Selectable } from '../util/column-type.js';
@@ -23,6 +23,7 @@ import { AliasedExpression, Expression } from '../expression/expression.js';
23
23
  import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
24
24
  import { KyselyTypeError } from '../util/type-error.js';
25
25
  import { Streamable } from '../util/streamable.js';
26
+ import { ExpressionOrFactory } from '../parser/expression-parser.js';
26
27
  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
28
  #private;
28
29
  constructor(props: UpdateQueryBuilderProps);
@@ -79,7 +80,34 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
79
80
  * select * from "person" where "id" in ($1, $2, $3)
80
81
  * ```
81
82
  *
82
- * <!-- siteExample("where", "OR where", 30) -->
83
+ * <!-- siteExample("where", "Object filter", 30) -->
84
+ *
85
+ * You can use the `and` function to create a simple equality
86
+ * filter using an object
87
+ *
88
+ * ```ts
89
+ * const persons = await db
90
+ * .selectFrom('person')
91
+ * .selectAll()
92
+ * .where((eb) => eb.and({
93
+ * first_name: 'Jennifer',
94
+ * last_name: eb.ref('first_name')
95
+ * }))
96
+ * .execute()
97
+ * ```
98
+ *
99
+ * The generated SQL (PostgreSQL):
100
+ *
101
+ * ```sql
102
+ * select *
103
+ * from "person"
104
+ * where (
105
+ * "first_name" = $1
106
+ * and "last_name" = "first_name"
107
+ * )
108
+ * ```
109
+ *
110
+ * <!-- siteExample("where", "OR where", 40) -->
83
111
  *
84
112
  * To combine conditions using `OR`, you can use the expression builder.
85
113
  * There are two ways to create `OR` expressions. Both are shown in this
@@ -114,7 +142,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
114
142
  * )
115
143
  * ```
116
144
  *
117
- * <!-- siteExample("where", "Conditional where calls", 40) -->
145
+ * <!-- siteExample("where", "Conditional where calls", 50) -->
118
146
  *
119
147
  * You can add expressions conditionally like this:
120
148
  *
@@ -209,7 +237,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
209
237
  * select * from "person" where "id" in ($1, $2, $3)
210
238
  * ```
211
239
  *
212
- * <!-- siteExample("where", "Complex where clause", 50) -->
240
+ * <!-- siteExample("where", "Complex where clause", 60) -->
213
241
  *
214
242
  * For complex `where` expressions you can pass in a single callback and
215
243
  * use the `ExpressionBuilder` to build your expression:
@@ -299,8 +327,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
299
327
  * ```
300
328
  */
301
329
  where<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): UpdateQueryBuilder<DB, UT, TB, O>;
302
- where(factory: WhereExpressionFactory<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
303
- where(expression: Expression<any>): UpdateQueryBuilder<DB, UT, TB, O>;
330
+ where(expression: ExpressionOrFactory<DB, TB, SqlBool>): UpdateQueryBuilder<DB, UT, TB, O>;
304
331
  /**
305
332
  * Adds a `where` clause where both sides of the operator are references
306
333
  * to columns.
@@ -20,13 +20,13 @@ class UpdateQueryBuilder {
20
20
  where(...args) {
21
21
  return new UpdateQueryBuilder({
22
22
  ...this.#props,
23
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, binary_operation_parser_js_1.parseFilter)(args)),
23
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, binary_operation_parser_js_1.parseValueBinaryOperationOrExpression)(args)),
24
24
  });
25
25
  }
26
26
  whereRef(lhs, op, rhs) {
27
27
  return new UpdateQueryBuilder({
28
28
  ...this.#props,
29
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, binary_operation_parser_js_1.parseReferentialComparison)(lhs, op, rhs)),
29
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, binary_operation_parser_js_1.parseReferentialBinaryOperation)(lhs, op, rhs)),
30
30
  });
31
31
  }
32
32
  clearWhere() {
@@ -1,8 +1,7 @@
1
- import { Expression } from '../expression/expression.js';
2
1
  import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
3
2
  import { ReferenceExpression } from '../parser/reference-parser.js';
4
3
  import { SqlBool } from '../util/type-utils.js';
5
- import { ExpressionBuilder } from '../expression/expression-builder.js';
4
+ import { ExpressionOrFactory } from '../parser/expression-parser.js';
6
5
  export interface WhereInterface<DB, TB extends keyof DB> {
7
6
  /**
8
7
  * Adds a `where` expression to the query.
@@ -57,7 +56,34 @@ export interface WhereInterface<DB, TB extends keyof DB> {
57
56
  * select * from "person" where "id" in ($1, $2, $3)
58
57
  * ```
59
58
  *
60
- * <!-- siteExample("where", "OR where", 30) -->
59
+ * <!-- siteExample("where", "Object filter", 30) -->
60
+ *
61
+ * You can use the `and` function to create a simple equality
62
+ * filter using an object
63
+ *
64
+ * ```ts
65
+ * const persons = await db
66
+ * .selectFrom('person')
67
+ * .selectAll()
68
+ * .where((eb) => eb.and({
69
+ * first_name: 'Jennifer',
70
+ * last_name: eb.ref('first_name')
71
+ * }))
72
+ * .execute()
73
+ * ```
74
+ *
75
+ * The generated SQL (PostgreSQL):
76
+ *
77
+ * ```sql
78
+ * select *
79
+ * from "person"
80
+ * where (
81
+ * "first_name" = $1
82
+ * and "last_name" = "first_name"
83
+ * )
84
+ * ```
85
+ *
86
+ * <!-- siteExample("where", "OR where", 40) -->
61
87
  *
62
88
  * To combine conditions using `OR`, you can use the expression builder.
63
89
  * There are two ways to create `OR` expressions. Both are shown in this
@@ -92,7 +118,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
92
118
  * )
93
119
  * ```
94
120
  *
95
- * <!-- siteExample("where", "Conditional where calls", 40) -->
121
+ * <!-- siteExample("where", "Conditional where calls", 50) -->
96
122
  *
97
123
  * You can add expressions conditionally like this:
98
124
  *
@@ -187,7 +213,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
187
213
  * select * from "person" where "id" in ($1, $2, $3)
188
214
  * ```
189
215
  *
190
- * <!-- siteExample("where", "Complex where clause", 50) -->
216
+ * <!-- siteExample("where", "Complex where clause", 60) -->
191
217
  *
192
218
  * For complex `where` expressions you can pass in a single callback and
193
219
  * use the `ExpressionBuilder` to build your expression:
@@ -277,8 +303,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
277
303
  * ```
278
304
  */
279
305
  where<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): WhereInterface<DB, TB>;
280
- where(factory: WhereExpressionFactory<DB, TB>): WhereInterface<DB, TB>;
281
- where(expression: Expression<any>): WhereInterface<DB, TB>;
306
+ where(expression: ExpressionOrFactory<DB, TB, SqlBool>): WhereInterface<DB, TB>;
282
307
  /**
283
308
  * Adds a `where` clause where both sides of the operator are references
284
309
  * to columns.
@@ -351,4 +376,3 @@ export interface WhereInterface<DB, TB extends keyof DB> {
351
376
  */
352
377
  clearWhere(): WhereInterface<DB, TB>;
353
378
  }
354
- export type WhereExpressionFactory<DB, TB extends keyof DB> = (eb: ExpressionBuilder<DB, TB>) => Expression<SqlBool>;
@@ -87,6 +87,7 @@ import { JSONReferenceNode } from '../operation-node/json-reference-node.js';
87
87
  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
+ import { TupleNode } from '../operation-node/tuple-node.js';
90
91
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
91
92
  #private;
92
93
  protected get numParameters(): number;
@@ -113,6 +114,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
113
114
  protected visitOr(node: OrNode): void;
114
115
  protected visitValue(node: ValueNode): void;
115
116
  protected visitValueList(node: ValueListNode): void;
117
+ protected visitTuple(node: TupleNode): void;
116
118
  protected visitPrimitiveValueList(node: PrimitiveValueListNode): void;
117
119
  protected visitParens(node: ParensNode): void;
118
120
  protected visitJoin(node: JoinNode): void;
@@ -194,4 +196,5 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
194
196
  protected sanitizeIdentifier(identifier: string): string;
195
197
  protected addParameter(parameter: unknown): void;
196
198
  protected appendImmediateValue(value: unknown): void;
199
+ protected sortSelectModifiers(arr: SelectModifierNode[]): ReadonlyArray<SelectModifierNode>;
197
200
  }
@@ -4,6 +4,7 @@ exports.DefaultQueryCompiler = void 0;
4
4
  const insert_query_node_js_1 = require("../operation-node/insert-query-node.js");
5
5
  const operation_node_visitor_js_1 = require("../operation-node/operation-node-visitor.js");
6
6
  const operator_node_js_1 = require("../operation-node/operator-node.js");
7
+ const parens_node_js_1 = require("../operation-node/parens-node.js");
7
8
  const query_node_js_1 = require("../operation-node/query-node.js");
8
9
  const object_utils_js_1 = require("../util/object-utils.js");
9
10
  const create_view_node_js_1 = require("../operation-node/create-view-node.js");
@@ -29,6 +30,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
29
30
  }
30
31
  visitSelectQuery(node) {
31
32
  const wrapInParens = this.parentNode !== undefined &&
33
+ !parens_node_js_1.ParensNode.is(this.parentNode) &&
32
34
  !insert_query_node_js_1.InsertQueryNode.is(this.parentNode) &&
33
35
  !create_view_node_js_1.CreateViewNode.is(this.parentNode) &&
34
36
  !set_operation_node_js_1.SetOperationNode.is(this.parentNode);
@@ -43,20 +45,23 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
43
45
  this.visitNode(node.with);
44
46
  this.append(' ');
45
47
  }
46
- this.append('select ');
48
+ this.append('select');
47
49
  if (node.distinctOn) {
48
- this.compileDistinctOn(node.distinctOn);
49
50
  this.append(' ');
51
+ this.compileDistinctOn(node.distinctOn);
50
52
  }
51
- if (node.frontModifiers && node.frontModifiers.length > 0) {
52
- this.compileList(node.frontModifiers, ' ');
53
+ if (node.frontModifiers?.length) {
53
54
  this.append(' ');
55
+ this.compileList(node.frontModifiers, ' ');
54
56
  }
55
57
  if (node.selections) {
58
+ this.append(' ');
56
59
  this.compileList(node.selections);
60
+ }
61
+ if (node.from) {
57
62
  this.append(' ');
63
+ this.visitNode(node.from);
58
64
  }
59
- this.visitNode(node.from);
60
65
  if (node.joins) {
61
66
  this.append(' ');
62
67
  this.compileList(node.joins, ' ');
@@ -89,9 +94,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
89
94
  this.append(' ');
90
95
  this.visitNode(node.offset);
91
96
  }
92
- if (node.endModifiers && node.endModifiers.length > 0) {
97
+ if (node.endModifiers?.length) {
93
98
  this.append(' ');
94
- this.compileList(node.endModifiers, ' ');
99
+ this.compileList(this.sortSelectModifiers([...node.endModifiers]), ' ');
95
100
  }
96
101
  if (wrapInParens) {
97
102
  this.append(')');
@@ -273,6 +278,11 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
273
278
  this.compileList(node.values);
274
279
  this.append(')');
275
280
  }
281
+ visitTuple(node) {
282
+ this.append('(');
283
+ this.compileList(node.values);
284
+ this.append(')');
285
+ }
276
286
  visitPrimitiveValueList(node) {
277
287
  this.append('(');
278
288
  const { values } = node;
@@ -653,6 +663,12 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
653
663
  visitCommonTableExpression(node) {
654
664
  this.visitNode(node.name);
655
665
  this.append(' as ');
666
+ if ((0, object_utils_js_1.isBoolean)(node.materialized)) {
667
+ if (!node.materialized) {
668
+ this.append('not ');
669
+ }
670
+ this.append('materialized ');
671
+ }
656
672
  this.visitNode(node.expression);
657
673
  }
658
674
  visitCommonTableExpressionName(node) {
@@ -1056,6 +1072,13 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
1056
1072
  throw new Error(`invalid immediate value ${value}`);
1057
1073
  }
1058
1074
  }
1075
+ sortSelectModifiers(arr) {
1076
+ arr.sort((left, right) => left.modifier && right.modifier
1077
+ ? SELECT_MODIFIER_PRIORITY[left.modifier] -
1078
+ SELECT_MODIFIER_PRIORITY[right.modifier]
1079
+ : 1);
1080
+ return (0, object_utils_js_1.freeze)(arr);
1081
+ }
1059
1082
  }
1060
1083
  exports.DefaultQueryCompiler = DefaultQueryCompiler;
1061
1084
  const SELECT_MODIFIER_SQL = (0, object_utils_js_1.freeze)({
@@ -1067,6 +1090,15 @@ const SELECT_MODIFIER_SQL = (0, object_utils_js_1.freeze)({
1067
1090
  SkipLocked: 'skip locked',
1068
1091
  Distinct: 'distinct',
1069
1092
  });
1093
+ const SELECT_MODIFIER_PRIORITY = (0, object_utils_js_1.freeze)({
1094
+ ForKeyShare: 1,
1095
+ ForNoKeyUpdate: 1,
1096
+ ForUpdate: 1,
1097
+ ForShare: 1,
1098
+ NoWait: 2,
1099
+ SkipLocked: 2,
1100
+ Distinct: 0,
1101
+ });
1070
1102
  const JOIN_TYPE_SQL = (0, object_utils_js_1.freeze)({
1071
1103
  InnerJoin: 'inner join',
1072
1104
  LeftJoin: 'left join',
@@ -10,6 +10,8 @@ import { InsertResult } from './query-builder/insert-result.js';
10
10
  import { DeleteResult } from './query-builder/delete-result.js';
11
11
  import { UpdateResult } from './query-builder/update-result.js';
12
12
  import { KyselyPlugin } from './plugin/kysely-plugin.js';
13
+ import { CTEBuilderCallback } from './query-builder/cte-builder.js';
14
+ import { SelectArg, SelectExpression, Selection } from './parser/select-parser.js';
13
15
  export declare class QueryCreator<DB> {
14
16
  #private;
15
17
  constructor(props: QueryCreatorProps);
@@ -125,6 +127,54 @@ 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 AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, ExtractTableAlias<DB, TE>, {}>;
127
129
  selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
130
+ /**
131
+ * Creates a `select` query builder without a `from` clause.
132
+ *
133
+ * If you want to create a `select from` query, use the `selectFrom` method instead.
134
+ * This one can be used to create a plain `select` statement without a `from` clause.
135
+ *
136
+ * This method accepts the same inputs as {@link SelectQueryBuilder.select}. See its
137
+ * documentation for more examples.
138
+ *
139
+ * ### Examples
140
+ *
141
+ * ```ts
142
+ * const result = db.select((eb) => [
143
+ * eb.selectFrom('person')
144
+ * .select('id')
145
+ * .where('first_name', '=', 'Jennifer')
146
+ * .limit(1)
147
+ * .as('jennifer_id'),
148
+ *
149
+ * eb.selectFrom('pet')
150
+ * .select('id')
151
+ * .where('name', '=', 'Doggo')
152
+ * .limit(1)
153
+ * .as('doggo_id')
154
+ * ])
155
+ * .executeTakeFirstOrThrow()
156
+ *
157
+ * console.log(result.jennifer_id)
158
+ * console.log(result.doggo_id)
159
+ * ```
160
+ *
161
+ * The generated SQL (PostgreSQL):
162
+ *
163
+ * ```sql
164
+ * select (
165
+ * select "id"
166
+ * from "person"
167
+ * where "first_name" = $1
168
+ * limit $2
169
+ * ) as "jennifer_id", (
170
+ * select "id"
171
+ * from "pet"
172
+ * where "name" = $3
173
+ * limit $4
174
+ * ) as "doggo_id"
175
+ * ```
176
+ */
177
+ selectNoFrom<SE extends SelectExpression<DB, never>>(selection: SelectArg<DB, never, SE>): SelectQueryBuilder<DB, never, Selection<DB, never, SE>>;
128
178
  /**
129
179
  * Creates an insert query.
130
180
  *
@@ -310,14 +360,36 @@ export declare class QueryCreator<DB> {
310
360
  * .selectAll()
311
361
  * .execute()
312
362
  * ```
363
+ *
364
+ * The first argument can also be a callback. The callback is passed
365
+ * a `CTEBuilder` instance that can be used to configure the CTE:
366
+ *
367
+ * ```ts
368
+ * await db
369
+ * .with(
370
+ * (cte) => cte('jennifers').materialized(),
371
+ * (db) => db
372
+ * .selectFrom('person')
373
+ * .where('first_name', '=', 'Jennifer')
374
+ * .select(['id', 'age'])
375
+ * )
376
+ * .selectFrom('jennifers')
377
+ * .selectAll()
378
+ * .execute()
379
+ * ```
313
380
  */
314
- with<N extends string, E extends CommonTableExpression<DB, N>>(name: N, expression: E): QueryCreatorWithCommonTableExpression<DB, N, E>;
381
+ with<N extends string, E extends CommonTableExpression<DB, N>>(nameOrBuilder: N | CTEBuilderCallback<N>, expression: E): QueryCreatorWithCommonTableExpression<DB, N, E>;
315
382
  /**
316
383
  * Creates a recursive `with` query (Common Table Expression).
317
384
  *
385
+ * Note that recursiveness is a property of the whole `with` statement.
386
+ * You cannot have recursive and non-recursive CTEs in a same `with` statement.
387
+ * Therefore the recursiveness is determined by the **first** `with` or
388
+ * `withRecusive` call you make.
389
+ *
318
390
  * See the {@link with} method for examples and more documentation.
319
391
  */
320
- withRecursive<N extends string, E extends RecursiveCommonTableExpression<DB, N>>(name: N, expression: E): QueryCreatorWithCommonTableExpression<DB, N, E>;
392
+ withRecursive<N extends string, E extends RecursiveCommonTableExpression<DB, N>>(nameOrBuilder: N | CTEBuilderCallback<N>, expression: E): QueryCreatorWithCommonTableExpression<DB, N, E>;
321
393
  /**
322
394
  * Returns a copy of this query creator instance with the given plugin installed.
323
395
  */
@@ -15,16 +15,71 @@ const with_node_js_1 = require("./operation-node/with-node.js");
15
15
  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
+ const select_parser_js_1 = require("./parser/select-parser.js");
18
19
  class QueryCreator {
19
20
  #props;
20
21
  constructor(props) {
21
22
  this.#props = (0, object_utils_js_1.freeze)(props);
22
23
  }
23
24
  selectFrom(from) {
24
- return new select_query_builder_js_1.SelectQueryBuilder({
25
+ return (0, select_query_builder_js_1.createSelectQueryBuilder)({
25
26
  queryId: (0, query_id_js_1.createQueryId)(),
26
27
  executor: this.#props.executor,
27
- queryNode: select_query_node_js_1.SelectQueryNode.create((0, table_parser_js_1.parseTableExpressionOrList)(from), this.#props.withNode),
28
+ queryNode: select_query_node_js_1.SelectQueryNode.createFrom((0, table_parser_js_1.parseTableExpressionOrList)(from), this.#props.withNode),
29
+ });
30
+ }
31
+ /**
32
+ * Creates a `select` query builder without a `from` clause.
33
+ *
34
+ * If you want to create a `select from` query, use the `selectFrom` method instead.
35
+ * This one can be used to create a plain `select` statement without a `from` clause.
36
+ *
37
+ * This method accepts the same inputs as {@link SelectQueryBuilder.select}. See its
38
+ * documentation for more examples.
39
+ *
40
+ * ### Examples
41
+ *
42
+ * ```ts
43
+ * const result = db.select((eb) => [
44
+ * eb.selectFrom('person')
45
+ * .select('id')
46
+ * .where('first_name', '=', 'Jennifer')
47
+ * .limit(1)
48
+ * .as('jennifer_id'),
49
+ *
50
+ * eb.selectFrom('pet')
51
+ * .select('id')
52
+ * .where('name', '=', 'Doggo')
53
+ * .limit(1)
54
+ * .as('doggo_id')
55
+ * ])
56
+ * .executeTakeFirstOrThrow()
57
+ *
58
+ * console.log(result.jennifer_id)
59
+ * console.log(result.doggo_id)
60
+ * ```
61
+ *
62
+ * The generated SQL (PostgreSQL):
63
+ *
64
+ * ```sql
65
+ * select (
66
+ * select "id"
67
+ * from "person"
68
+ * where "first_name" = $1
69
+ * limit $2
70
+ * ) as "jennifer_id", (
71
+ * select "id"
72
+ * from "pet"
73
+ * where "name" = $3
74
+ * limit $4
75
+ * ) as "doggo_id"
76
+ * ```
77
+ */
78
+ selectNoFrom(selection) {
79
+ return (0, select_query_builder_js_1.createSelectQueryBuilder)({
80
+ queryId: (0, query_id_js_1.createQueryId)(),
81
+ executor: this.#props.executor,
82
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithSelections(select_query_node_js_1.SelectQueryNode.create(this.#props.withNode), (0, select_parser_js_1.parseSelectArg)(selection)),
28
83
  });
29
84
  }
30
85
  /**
@@ -159,9 +214,26 @@ class QueryCreator {
159
214
  * .selectAll()
160
215
  * .execute()
161
216
  * ```
217
+ *
218
+ * The first argument can also be a callback. The callback is passed
219
+ * a `CTEBuilder` instance that can be used to configure the CTE:
220
+ *
221
+ * ```ts
222
+ * await db
223
+ * .with(
224
+ * (cte) => cte('jennifers').materialized(),
225
+ * (db) => db
226
+ * .selectFrom('person')
227
+ * .where('first_name', '=', 'Jennifer')
228
+ * .select(['id', 'age'])
229
+ * )
230
+ * .selectFrom('jennifers')
231
+ * .selectAll()
232
+ * .execute()
233
+ * ```
162
234
  */
163
- with(name, expression) {
164
- const cte = (0, with_parser_js_1.parseCommonTableExpression)(name, expression);
235
+ with(nameOrBuilder, expression) {
236
+ const cte = (0, with_parser_js_1.parseCommonTableExpression)(nameOrBuilder, expression);
165
237
  return new QueryCreator({
166
238
  ...this.#props,
167
239
  withNode: this.#props.withNode
@@ -172,10 +244,15 @@ class QueryCreator {
172
244
  /**
173
245
  * Creates a recursive `with` query (Common Table Expression).
174
246
  *
247
+ * Note that recursiveness is a property of the whole `with` statement.
248
+ * You cannot have recursive and non-recursive CTEs in a same `with` statement.
249
+ * Therefore the recursiveness is determined by the **first** `with` or
250
+ * `withRecusive` call you make.
251
+ *
175
252
  * See the {@link with} method for examples and more documentation.
176
253
  */
177
- withRecursive(name, expression) {
178
- const cte = (0, with_parser_js_1.parseCommonTableExpression)(name, expression);
254
+ withRecursive(nameOrBuilder, expression) {
255
+ const cte = (0, with_parser_js_1.parseCommonTableExpression)(nameOrBuilder, expression);
179
256
  return new QueryCreator({
180
257
  ...this.#props,
181
258
  withNode: this.#props.withNode