kysely 0.26.1 → 0.26.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +3 -3
- package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +3 -2
- package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +3 -2
- package/dist/cjs/dialect/postgres/postgres-adapter.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +2 -2
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +4 -2
- package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -2
- package/dist/cjs/driver/runtime-driver.js +17 -2
- package/dist/cjs/expression/expression-builder.d.ts +300 -27
- package/dist/cjs/expression/expression-builder.js +36 -26
- package/dist/cjs/expression/expression-wrapper.d.ts +177 -8
- package/dist/cjs/expression/expression-wrapper.js +4 -4
- package/dist/cjs/expression/expression.d.ts +64 -1
- package/dist/cjs/helpers/mysql.d.ts +14 -11
- package/dist/cjs/helpers/mysql.js +21 -32
- package/dist/cjs/helpers/postgres.d.ts +8 -5
- package/dist/cjs/helpers/postgres.js +8 -5
- package/dist/cjs/helpers/sqlite.d.ts +164 -0
- package/dist/cjs/helpers/sqlite.js +180 -0
- package/dist/cjs/index.d.ts +5 -3
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/kysely.d.ts +4 -3
- package/dist/cjs/kysely.js +1 -1
- package/dist/cjs/operation-node/common-table-expression-node.d.ts +4 -0
- package/dist/cjs/operation-node/common-table-expression-node.js +6 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +1 -1
- package/dist/cjs/operation-node/delete-query-node.js +3 -3
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +8 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/operator-node.d.ts +3 -3
- package/dist/cjs/operation-node/operator-node.js +3 -0
- package/dist/cjs/operation-node/order-by-node.d.ts +2 -2
- package/dist/cjs/operation-node/order-by-node.js +4 -4
- package/dist/cjs/operation-node/over-node.d.ts +1 -1
- package/dist/cjs/operation-node/over-node.js +3 -3
- package/dist/cjs/operation-node/select-query-node.d.ts +5 -4
- package/dist/cjs/operation-node/select-query-node.js +13 -7
- package/dist/cjs/operation-node/tuple-node.d.ts +12 -0
- package/dist/cjs/operation-node/tuple-node.js +18 -0
- package/dist/cjs/parser/binary-operation-parser.d.ts +11 -7
- package/dist/cjs/parser/binary-operation-parser.js +35 -46
- package/dist/cjs/parser/expression-parser.d.ts +10 -5
- package/dist/cjs/parser/join-parser.d.ts +2 -2
- package/dist/cjs/parser/join-parser.js +2 -3
- package/dist/cjs/parser/order-by-parser.d.ts +6 -2
- package/dist/cjs/parser/order-by-parser.js +41 -7
- package/dist/cjs/parser/parse-utils.js +2 -2
- package/dist/cjs/parser/reference-parser.d.ts +2 -2
- package/dist/cjs/parser/reference-parser.js +1 -1
- package/dist/cjs/parser/returning-parser.d.ts +2 -1
- package/dist/cjs/parser/select-parser.d.ts +20 -9
- package/dist/cjs/parser/set-operation-parser.d.ts +3 -1
- package/dist/cjs/parser/set-operation-parser.js +13 -4
- package/dist/cjs/parser/tuple-parser.d.ts +47 -0
- package/dist/cjs/parser/tuple-parser.js +2 -0
- package/dist/cjs/parser/value-parser.d.ts +5 -3
- package/dist/cjs/parser/value-parser.js +12 -1
- package/dist/cjs/parser/with-parser.d.ts +3 -2
- package/dist/cjs/parser/with-parser.js +16 -4
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +3 -3
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +4 -8
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +50 -14
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +5 -5
- package/dist/cjs/query-builder/aggregate-function-builder.js +2 -2
- package/dist/cjs/query-builder/case-builder.js +8 -4
- package/dist/cjs/query-builder/cte-builder.d.ts +20 -0
- package/dist/cjs/query-builder/cte-builder.js +39 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +39 -10
- package/dist/cjs/query-builder/delete-query-builder.js +3 -3
- package/dist/cjs/query-builder/function-module.d.ts +41 -6
- package/dist/cjs/query-builder/function-module.js +3 -0
- package/dist/cjs/query-builder/having-interface.d.ts +2 -5
- package/dist/cjs/query-builder/insert-query-builder.d.ts +5 -3
- package/dist/cjs/query-builder/join-builder.d.ts +2 -6
- package/dist/cjs/query-builder/join-builder.js +2 -2
- package/dist/cjs/query-builder/json-path-builder.d.ts +59 -3
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +65 -12
- package/dist/cjs/query-builder/on-conflict-builder.js +4 -4
- package/dist/cjs/query-builder/over-builder.js +1 -1
- package/dist/cjs/query-builder/returning-interface.d.ts +3 -2
- package/dist/cjs/query-builder/select-query-builder-expression.d.ts +20 -0
- package/dist/cjs/query-builder/select-query-builder-expression.js +2 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +206 -67
- package/dist/cjs/query-builder/select-query-builder.js +75 -924
- package/dist/cjs/query-builder/update-query-builder.d.ts +39 -10
- package/dist/cjs/query-builder/update-query-builder.js +2 -2
- package/dist/cjs/query-builder/where-interface.d.ts +32 -8
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +3 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +39 -7
- package/dist/cjs/query-creator.d.ts +76 -2
- package/dist/cjs/query-creator.js +36 -6
- package/dist/cjs/raw-builder/raw-builder.d.ts +87 -51
- package/dist/cjs/raw-builder/raw-builder.js +18 -45
- package/dist/cjs/raw-builder/sql.js +8 -8
- package/dist/cjs/schema/alter-table-builder.d.ts +4 -0
- package/dist/cjs/schema/alter-table-builder.js +12 -0
- package/dist/cjs/schema/create-index-builder.d.ts +1 -1
- package/dist/cjs/schema/create-index-builder.js +1 -1
- package/dist/cjs/schema/create-view-builder.d.ts +2 -2
- package/dist/cjs/util/column-type.d.ts +7 -6
- package/dist/cjs/util/infer-result.d.ts +2 -1
- package/dist/cjs/util/json-object-args.d.ts +3 -0
- package/dist/cjs/util/json-object-args.js +35 -0
- package/dist/cjs/util/object-utils.d.ts +1 -0
- package/dist/cjs/util/object-utils.js +9 -1
- package/dist/cjs/util/type-utils.d.ts +16 -17
- package/dist/esm/dialect/dialect-adapter-base.d.ts +3 -3
- package/dist/esm/dialect/mysql/mysql-adapter.d.ts +3 -2
- package/dist/esm/dialect/mysql/mysql-adapter.js +2 -2
- package/dist/esm/dialect/postgres/postgres-adapter.d.ts +3 -2
- package/dist/esm/dialect/postgres/postgres-adapter.js +2 -2
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +2 -2
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +4 -2
- package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -2
- package/dist/esm/driver/runtime-driver.js +17 -2
- package/dist/esm/expression/expression-builder.d.ts +300 -27
- package/dist/esm/expression/expression-builder.js +40 -30
- package/dist/esm/expression/expression-wrapper.d.ts +177 -8
- package/dist/esm/expression/expression-wrapper.js +5 -5
- package/dist/esm/expression/expression.d.ts +64 -1
- package/dist/esm/helpers/mysql.d.ts +14 -11
- package/dist/esm/helpers/mysql.js +21 -32
- package/dist/esm/helpers/postgres.d.ts +8 -5
- package/dist/esm/helpers/postgres.js +8 -5
- package/dist/esm/helpers/sqlite.d.ts +164 -0
- package/dist/esm/helpers/sqlite.js +175 -0
- package/dist/esm/index.d.ts +5 -3
- package/dist/esm/index.js +1 -0
- package/dist/esm/kysely.d.ts +4 -3
- package/dist/esm/kysely.js +1 -1
- package/dist/esm/operation-node/common-table-expression-node.d.ts +4 -0
- package/dist/esm/operation-node/common-table-expression-node.js +6 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +1 -1
- package/dist/esm/operation-node/delete-query-node.js +3 -3
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +8 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/operator-node.d.ts +3 -3
- package/dist/esm/operation-node/operator-node.js +3 -0
- package/dist/esm/operation-node/order-by-node.d.ts +2 -2
- package/dist/esm/operation-node/order-by-node.js +4 -4
- package/dist/esm/operation-node/over-node.d.ts +1 -1
- package/dist/esm/operation-node/over-node.js +3 -3
- package/dist/esm/operation-node/select-query-node.d.ts +5 -4
- package/dist/esm/operation-node/select-query-node.js +13 -7
- package/dist/esm/operation-node/tuple-node.d.ts +12 -0
- package/dist/esm/operation-node/tuple-node.js +16 -0
- package/dist/esm/parser/binary-operation-parser.d.ts +11 -7
- package/dist/esm/parser/binary-operation-parser.js +36 -47
- package/dist/esm/parser/expression-parser.d.ts +10 -5
- package/dist/esm/parser/join-parser.d.ts +2 -2
- package/dist/esm/parser/join-parser.js +3 -4
- package/dist/esm/parser/order-by-parser.d.ts +6 -2
- package/dist/esm/parser/order-by-parser.js +40 -7
- package/dist/esm/parser/parse-utils.js +3 -3
- package/dist/esm/parser/reference-parser.d.ts +2 -2
- package/dist/esm/parser/reference-parser.js +1 -1
- package/dist/esm/parser/returning-parser.d.ts +2 -1
- package/dist/esm/parser/select-parser.d.ts +20 -9
- package/dist/esm/parser/set-operation-parser.d.ts +3 -1
- package/dist/esm/parser/set-operation-parser.js +11 -2
- package/dist/esm/parser/tuple-parser.d.ts +47 -0
- package/dist/esm/parser/tuple-parser.js +2 -0
- package/dist/esm/parser/value-parser.d.ts +5 -3
- package/dist/esm/parser/value-parser.js +10 -1
- package/dist/esm/parser/with-parser.d.ts +3 -2
- package/dist/esm/parser/with-parser.js +16 -4
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +3 -3
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +5 -9
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +51 -15
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +5 -5
- package/dist/esm/query-builder/aggregate-function-builder.js +3 -3
- package/dist/esm/query-builder/case-builder.js +10 -6
- package/dist/esm/query-builder/cte-builder.d.ts +20 -0
- package/dist/esm/query-builder/cte-builder.js +36 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +39 -10
- package/dist/esm/query-builder/delete-query-builder.js +4 -4
- package/dist/esm/query-builder/function-module.d.ts +41 -6
- package/dist/esm/query-builder/function-module.js +3 -0
- package/dist/esm/query-builder/having-interface.d.ts +2 -5
- package/dist/esm/query-builder/insert-query-builder.d.ts +5 -3
- package/dist/esm/query-builder/join-builder.d.ts +2 -6
- package/dist/esm/query-builder/join-builder.js +3 -3
- package/dist/esm/query-builder/json-path-builder.d.ts +59 -3
- package/dist/esm/query-builder/on-conflict-builder.d.ts +65 -12
- package/dist/esm/query-builder/on-conflict-builder.js +5 -5
- package/dist/esm/query-builder/over-builder.js +1 -1
- package/dist/esm/query-builder/returning-interface.d.ts +3 -2
- package/dist/esm/query-builder/select-query-builder-expression.d.ts +20 -0
- package/dist/esm/query-builder/select-query-builder-expression.js +2 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +206 -67
- package/dist/esm/query-builder/select-query-builder.js +75 -923
- package/dist/esm/query-builder/update-query-builder.d.ts +39 -10
- package/dist/esm/query-builder/update-query-builder.js +3 -3
- package/dist/esm/query-builder/where-interface.d.ts +32 -8
- package/dist/esm/query-compiler/default-query-compiler.d.ts +3 -0
- package/dist/esm/query-compiler/default-query-compiler.js +39 -7
- package/dist/esm/query-creator.d.ts +76 -2
- package/dist/esm/query-creator.js +37 -7
- package/dist/esm/raw-builder/raw-builder.d.ts +87 -51
- package/dist/esm/raw-builder/raw-builder.js +17 -42
- package/dist/esm/raw-builder/sql.js +9 -9
- package/dist/esm/schema/alter-table-builder.d.ts +4 -0
- package/dist/esm/schema/alter-table-builder.js +12 -0
- package/dist/esm/schema/create-index-builder.d.ts +1 -1
- package/dist/esm/schema/create-index-builder.js +2 -2
- package/dist/esm/schema/create-view-builder.d.ts +2 -2
- package/dist/esm/util/column-type.d.ts +7 -6
- package/dist/esm/util/infer-result.d.ts +2 -1
- package/dist/esm/util/json-object-args.d.ts +3 -0
- package/dist/esm/util/json-object-args.js +32 -0
- package/dist/esm/util/object-utils.d.ts +1 -0
- package/dist/esm/util/object-utils.js +7 -0
- package/dist/esm/util/type-utils.d.ts +16 -17
- package/helpers/sqlite.d.ts +1 -0
- package/helpers/sqlite.js +1 -0
- package/package.json +7 -4
|
@@ -2,11 +2,11 @@ import { OperationNodeSource } from '../operation-node/operation-node-source.js'
|
|
|
2
2
|
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
|
-
import { SelectExpression,
|
|
6
|
-
import { ReturningRow } from '../parser/returning-parser.js';
|
|
5
|
+
import { SelectExpression, SelectCallback } from '../parser/select-parser.js';
|
|
6
|
+
import { 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
|
-
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 {
|
|
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", "
|
|
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",
|
|
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",
|
|
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(
|
|
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.
|
|
@@ -714,7 +741,9 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
714
741
|
* .executeTakeFirst()
|
|
715
742
|
* ```
|
|
716
743
|
*/
|
|
717
|
-
returning<SE extends SelectExpression<DB, TB>>(
|
|
744
|
+
returning<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SE>>;
|
|
745
|
+
returning<CB extends SelectCallback<DB, TB>>(callback: CB): UpdateQueryBuilder<DB, UT, TB, ReturningCallbackRow<DB, TB, O, CB>>;
|
|
746
|
+
returning<SE extends SelectExpression<DB, TB>>(selection: SE): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SE>>;
|
|
718
747
|
/**
|
|
719
748
|
* Adds a `returning *` to an insert/update/delete query on databases
|
|
720
749
|
* that support `returning` such as PostgreSQL.
|
|
@@ -9,7 +9,7 @@ import { preventAwait } from '../util/prevent-await.js';
|
|
|
9
9
|
import { freeze } from '../util/object-utils.js';
|
|
10
10
|
import { UpdateResult } from './update-result.js';
|
|
11
11
|
import { isNoResultErrorConstructor, NoResultError, } from './no-result-error.js';
|
|
12
|
-
import {
|
|
12
|
+
import { parseReferentialBinaryOperation, parseValueBinaryOperationOrExpression, } from '../parser/binary-operation-parser.js';
|
|
13
13
|
export class UpdateQueryBuilder {
|
|
14
14
|
#props;
|
|
15
15
|
constructor(props) {
|
|
@@ -18,13 +18,13 @@ export class UpdateQueryBuilder {
|
|
|
18
18
|
where(...args) {
|
|
19
19
|
return new UpdateQueryBuilder({
|
|
20
20
|
...this.#props,
|
|
21
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
21
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseValueBinaryOperationOrExpression(args)),
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
whereRef(lhs, op, rhs) {
|
|
25
25
|
return new UpdateQueryBuilder({
|
|
26
26
|
...this.#props,
|
|
27
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
27
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseReferentialBinaryOperation(lhs, op, rhs)),
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
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 {
|
|
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", "
|
|
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",
|
|
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",
|
|
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(
|
|
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
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { InsertQueryNode } from '../operation-node/insert-query-node.js';
|
|
3
3
|
import { OperationNodeVisitor } from '../operation-node/operation-node-visitor.js';
|
|
4
4
|
import { OperatorNode } from '../operation-node/operator-node.js';
|
|
5
|
+
import { ParensNode } from '../operation-node/parens-node.js';
|
|
5
6
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
6
7
|
import { freeze, isString, isNumber, isBoolean, isNull, isDate, isBigInt, } from '../util/object-utils.js';
|
|
7
8
|
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
@@ -27,6 +28,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
27
28
|
}
|
|
28
29
|
visitSelectQuery(node) {
|
|
29
30
|
const wrapInParens = this.parentNode !== undefined &&
|
|
31
|
+
!ParensNode.is(this.parentNode) &&
|
|
30
32
|
!InsertQueryNode.is(this.parentNode) &&
|
|
31
33
|
!CreateViewNode.is(this.parentNode) &&
|
|
32
34
|
!SetOperationNode.is(this.parentNode);
|
|
@@ -41,20 +43,23 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
41
43
|
this.visitNode(node.with);
|
|
42
44
|
this.append(' ');
|
|
43
45
|
}
|
|
44
|
-
this.append('select
|
|
46
|
+
this.append('select');
|
|
45
47
|
if (node.distinctOn) {
|
|
46
|
-
this.compileDistinctOn(node.distinctOn);
|
|
47
48
|
this.append(' ');
|
|
49
|
+
this.compileDistinctOn(node.distinctOn);
|
|
48
50
|
}
|
|
49
|
-
if (node.frontModifiers
|
|
50
|
-
this.compileList(node.frontModifiers, ' ');
|
|
51
|
+
if (node.frontModifiers?.length) {
|
|
51
52
|
this.append(' ');
|
|
53
|
+
this.compileList(node.frontModifiers, ' ');
|
|
52
54
|
}
|
|
53
55
|
if (node.selections) {
|
|
56
|
+
this.append(' ');
|
|
54
57
|
this.compileList(node.selections);
|
|
58
|
+
}
|
|
59
|
+
if (node.from) {
|
|
55
60
|
this.append(' ');
|
|
61
|
+
this.visitNode(node.from);
|
|
56
62
|
}
|
|
57
|
-
this.visitNode(node.from);
|
|
58
63
|
if (node.joins) {
|
|
59
64
|
this.append(' ');
|
|
60
65
|
this.compileList(node.joins, ' ');
|
|
@@ -87,9 +92,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
87
92
|
this.append(' ');
|
|
88
93
|
this.visitNode(node.offset);
|
|
89
94
|
}
|
|
90
|
-
if (node.endModifiers
|
|
95
|
+
if (node.endModifiers?.length) {
|
|
91
96
|
this.append(' ');
|
|
92
|
-
this.compileList(node.endModifiers, ' ');
|
|
97
|
+
this.compileList(this.sortSelectModifiers([...node.endModifiers]), ' ');
|
|
93
98
|
}
|
|
94
99
|
if (wrapInParens) {
|
|
95
100
|
this.append(')');
|
|
@@ -271,6 +276,11 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
271
276
|
this.compileList(node.values);
|
|
272
277
|
this.append(')');
|
|
273
278
|
}
|
|
279
|
+
visitTuple(node) {
|
|
280
|
+
this.append('(');
|
|
281
|
+
this.compileList(node.values);
|
|
282
|
+
this.append(')');
|
|
283
|
+
}
|
|
274
284
|
visitPrimitiveValueList(node) {
|
|
275
285
|
this.append('(');
|
|
276
286
|
const { values } = node;
|
|
@@ -651,6 +661,12 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
651
661
|
visitCommonTableExpression(node) {
|
|
652
662
|
this.visitNode(node.name);
|
|
653
663
|
this.append(' as ');
|
|
664
|
+
if (isBoolean(node.materialized)) {
|
|
665
|
+
if (!node.materialized) {
|
|
666
|
+
this.append('not ');
|
|
667
|
+
}
|
|
668
|
+
this.append('materialized ');
|
|
669
|
+
}
|
|
654
670
|
this.visitNode(node.expression);
|
|
655
671
|
}
|
|
656
672
|
visitCommonTableExpressionName(node) {
|
|
@@ -1054,6 +1070,13 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
1054
1070
|
throw new Error(`invalid immediate value ${value}`);
|
|
1055
1071
|
}
|
|
1056
1072
|
}
|
|
1073
|
+
sortSelectModifiers(arr) {
|
|
1074
|
+
arr.sort((left, right) => left.modifier && right.modifier
|
|
1075
|
+
? SELECT_MODIFIER_PRIORITY[left.modifier] -
|
|
1076
|
+
SELECT_MODIFIER_PRIORITY[right.modifier]
|
|
1077
|
+
: 1);
|
|
1078
|
+
return freeze(arr);
|
|
1079
|
+
}
|
|
1057
1080
|
}
|
|
1058
1081
|
const SELECT_MODIFIER_SQL = freeze({
|
|
1059
1082
|
ForKeyShare: 'for key share',
|
|
@@ -1064,6 +1087,15 @@ const SELECT_MODIFIER_SQL = freeze({
|
|
|
1064
1087
|
SkipLocked: 'skip locked',
|
|
1065
1088
|
Distinct: 'distinct',
|
|
1066
1089
|
});
|
|
1090
|
+
const SELECT_MODIFIER_PRIORITY = freeze({
|
|
1091
|
+
ForKeyShare: 1,
|
|
1092
|
+
ForNoKeyUpdate: 1,
|
|
1093
|
+
ForUpdate: 1,
|
|
1094
|
+
ForShare: 1,
|
|
1095
|
+
NoWait: 2,
|
|
1096
|
+
SkipLocked: 2,
|
|
1097
|
+
Distinct: 0,
|
|
1098
|
+
});
|
|
1067
1099
|
const JOIN_TYPE_SQL = freeze({
|
|
1068
1100
|
InnerJoin: 'inner join',
|
|
1069
1101
|
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 { CallbackSelection, SelectCallback, 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,56 @@ 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.selectNoFrom((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>>(selections: ReadonlyArray<SE>): SelectQueryBuilder<DB, never, Selection<DB, never, SE>>;
|
|
178
|
+
selectNoFrom<CB extends SelectCallback<DB, never>>(callback: CB): SelectQueryBuilder<DB, never, CallbackSelection<DB, never, CB>>;
|
|
179
|
+
selectNoFrom<SE extends SelectExpression<DB, never>>(selection: SE): SelectQueryBuilder<DB, never, Selection<DB, never, SE>>;
|
|
128
180
|
/**
|
|
129
181
|
* Creates an insert query.
|
|
130
182
|
*
|
|
@@ -310,14 +362,36 @@ export declare class QueryCreator<DB> {
|
|
|
310
362
|
* .selectAll()
|
|
311
363
|
* .execute()
|
|
312
364
|
* ```
|
|
365
|
+
*
|
|
366
|
+
* The first argument can also be a callback. The callback is passed
|
|
367
|
+
* a `CTEBuilder` instance that can be used to configure the CTE:
|
|
368
|
+
*
|
|
369
|
+
* ```ts
|
|
370
|
+
* await db
|
|
371
|
+
* .with(
|
|
372
|
+
* (cte) => cte('jennifers').materialized(),
|
|
373
|
+
* (db) => db
|
|
374
|
+
* .selectFrom('person')
|
|
375
|
+
* .where('first_name', '=', 'Jennifer')
|
|
376
|
+
* .select(['id', 'age'])
|
|
377
|
+
* )
|
|
378
|
+
* .selectFrom('jennifers')
|
|
379
|
+
* .selectAll()
|
|
380
|
+
* .execute()
|
|
381
|
+
* ```
|
|
313
382
|
*/
|
|
314
|
-
with<N extends string, E extends CommonTableExpression<DB, N>>(
|
|
383
|
+
with<N extends string, E extends CommonTableExpression<DB, N>>(nameOrBuilder: N | CTEBuilderCallback<N>, expression: E): QueryCreatorWithCommonTableExpression<DB, N, E>;
|
|
315
384
|
/**
|
|
316
385
|
* Creates a recursive `with` query (Common Table Expression).
|
|
317
386
|
*
|
|
387
|
+
* Note that recursiveness is a property of the whole `with` statement.
|
|
388
|
+
* You cannot have recursive and non-recursive CTEs in a same `with` statement.
|
|
389
|
+
* Therefore the recursiveness is determined by the **first** `with` or
|
|
390
|
+
* `withRecusive` call you make.
|
|
391
|
+
*
|
|
318
392
|
* See the {@link with} method for examples and more documentation.
|
|
319
393
|
*/
|
|
320
|
-
withRecursive<N extends string, E extends RecursiveCommonTableExpression<DB, N>>(
|
|
394
|
+
withRecursive<N extends string, E extends RecursiveCommonTableExpression<DB, N>>(nameOrBuilder: N | CTEBuilderCallback<N>, expression: E): QueryCreatorWithCommonTableExpression<DB, N, E>;
|
|
321
395
|
/**
|
|
322
396
|
* Returns a copy of this query creator instance with the given plugin installed.
|
|
323
397
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="./query-creator.d.ts" />
|
|
2
|
-
import {
|
|
2
|
+
import { createSelectQueryBuilder, } from './query-builder/select-query-builder.js';
|
|
3
3
|
import { InsertQueryBuilder } from './query-builder/insert-query-builder.js';
|
|
4
4
|
import { DeleteQueryBuilder } from './query-builder/delete-query-builder.js';
|
|
5
5
|
import { UpdateQueryBuilder } from './query-builder/update-query-builder.js';
|
|
@@ -13,16 +13,24 @@ import { WithNode } from './operation-node/with-node.js';
|
|
|
13
13
|
import { createQueryId } from './util/query-id.js';
|
|
14
14
|
import { WithSchemaPlugin } from './plugin/with-schema/with-schema-plugin.js';
|
|
15
15
|
import { freeze } from './util/object-utils.js';
|
|
16
|
+
import { parseSelectArg, } from './parser/select-parser.js';
|
|
16
17
|
export class QueryCreator {
|
|
17
18
|
#props;
|
|
18
19
|
constructor(props) {
|
|
19
20
|
this.#props = freeze(props);
|
|
20
21
|
}
|
|
21
22
|
selectFrom(from) {
|
|
22
|
-
return
|
|
23
|
+
return createSelectQueryBuilder({
|
|
23
24
|
queryId: createQueryId(),
|
|
24
25
|
executor: this.#props.executor,
|
|
25
|
-
queryNode: SelectQueryNode.
|
|
26
|
+
queryNode: SelectQueryNode.createFrom(parseTableExpressionOrList(from), this.#props.withNode),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
selectNoFrom(selection) {
|
|
30
|
+
return createSelectQueryBuilder({
|
|
31
|
+
queryId: createQueryId(),
|
|
32
|
+
executor: this.#props.executor,
|
|
33
|
+
queryNode: SelectQueryNode.cloneWithSelections(SelectQueryNode.create(this.#props.withNode), parseSelectArg(selection)),
|
|
26
34
|
});
|
|
27
35
|
}
|
|
28
36
|
/**
|
|
@@ -157,9 +165,26 @@ export class QueryCreator {
|
|
|
157
165
|
* .selectAll()
|
|
158
166
|
* .execute()
|
|
159
167
|
* ```
|
|
168
|
+
*
|
|
169
|
+
* The first argument can also be a callback. The callback is passed
|
|
170
|
+
* a `CTEBuilder` instance that can be used to configure the CTE:
|
|
171
|
+
*
|
|
172
|
+
* ```ts
|
|
173
|
+
* await db
|
|
174
|
+
* .with(
|
|
175
|
+
* (cte) => cte('jennifers').materialized(),
|
|
176
|
+
* (db) => db
|
|
177
|
+
* .selectFrom('person')
|
|
178
|
+
* .where('first_name', '=', 'Jennifer')
|
|
179
|
+
* .select(['id', 'age'])
|
|
180
|
+
* )
|
|
181
|
+
* .selectFrom('jennifers')
|
|
182
|
+
* .selectAll()
|
|
183
|
+
* .execute()
|
|
184
|
+
* ```
|
|
160
185
|
*/
|
|
161
|
-
with(
|
|
162
|
-
const cte = parseCommonTableExpression(
|
|
186
|
+
with(nameOrBuilder, expression) {
|
|
187
|
+
const cte = parseCommonTableExpression(nameOrBuilder, expression);
|
|
163
188
|
return new QueryCreator({
|
|
164
189
|
...this.#props,
|
|
165
190
|
withNode: this.#props.withNode
|
|
@@ -170,10 +195,15 @@ export class QueryCreator {
|
|
|
170
195
|
/**
|
|
171
196
|
* Creates a recursive `with` query (Common Table Expression).
|
|
172
197
|
*
|
|
198
|
+
* Note that recursiveness is a property of the whole `with` statement.
|
|
199
|
+
* You cannot have recursive and non-recursive CTEs in a same `with` statement.
|
|
200
|
+
* Therefore the recursiveness is determined by the **first** `with` or
|
|
201
|
+
* `withRecusive` call you make.
|
|
202
|
+
*
|
|
173
203
|
* See the {@link with} method for examples and more documentation.
|
|
174
204
|
*/
|
|
175
|
-
withRecursive(
|
|
176
|
-
const cte = parseCommonTableExpression(
|
|
205
|
+
withRecursive(nameOrBuilder, expression) {
|
|
206
|
+
const cte = parseCommonTableExpression(nameOrBuilder, expression);
|
|
177
207
|
return new QueryCreator({
|
|
178
208
|
...this.#props,
|
|
179
209
|
withNode: this.#props.withNode
|