kysely 0.10.1 → 0.11.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 +7 -3
- package/dist/cjs/dialect/dialect-adapter.d.ts +3 -2
- package/dist/cjs/dialect/mysql/mysql-adapter.js +1 -1
- package/dist/cjs/dialect/mysql/mysql-dialect.d.ts +3 -3
- package/dist/cjs/dialect/mysql/mysql-driver.js +25 -32
- package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +0 -2
- package/dist/cjs/dialect/mysql/mysql-query-compiler.js +0 -6
- package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +2 -2
- package/dist/cjs/dialect/postgres/postgres-driver.js +8 -19
- package/dist/cjs/dialect/postgres/postgres-query-compiler.d.ts +3 -0
- package/dist/cjs/dialect/postgres/postgres-query-compiler.js +9 -1
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +7 -0
- package/dist/cjs/dialect/sqlite/sqlite-adapter.js +18 -0
- package/dist/cjs/dialect/sqlite/sqlite-dialect.d.ts +64 -0
- package/dist/cjs/dialect/sqlite/sqlite-dialect.js +33 -0
- package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +14 -0
- package/dist/cjs/dialect/sqlite/sqlite-driver.js +116 -0
- package/dist/cjs/dialect/sqlite/sqlite-introspector.d.ts +7 -0
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +44 -0
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +7 -0
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +19 -0
- package/dist/cjs/driver/database-connection.d.ts +2 -2
- package/dist/cjs/driver/runtime-driver.js +1 -1
- package/dist/cjs/index.d.ts +46 -30
- package/dist/cjs/index.js +45 -29
- package/dist/cjs/kysely.d.ts +28 -10
- package/dist/cjs/kysely.js +6 -4
- package/dist/cjs/migration/migration.d.ts +1 -1
- package/dist/cjs/migration/migration.js +3 -3
- package/dist/cjs/operation-node/alias-node.d.ts +1 -1
- package/dist/cjs/operation-node/create-view-node.d.ts +1 -0
- package/dist/cjs/operation-node/having-node.d.ts +4 -8
- package/dist/cjs/operation-node/having-node.js +3 -3
- package/dist/cjs/operation-node/join-node.d.ts +6 -9
- package/dist/cjs/operation-node/join-node.js +10 -7
- package/dist/cjs/operation-node/on-node.d.ts +14 -0
- package/dist/cjs/operation-node/on-node.js +28 -0
- 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-utils.d.ts +1 -1
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +3 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +4 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/query-node.d.ts +3 -3
- package/dist/cjs/operation-node/select-query-node.d.ts +4 -4
- package/dist/cjs/operation-node/where-node.d.ts +4 -8
- package/dist/cjs/operation-node/where-node.js +3 -3
- package/dist/cjs/parser/filter-parser.d.ts +1 -0
- package/dist/cjs/parser/filter-parser.js +49 -52
- package/dist/cjs/parser/returning-parser.d.ts +4 -2
- package/dist/cjs/parser/select-parser.d.ts +2 -2
- package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.d.ts +1 -1
- package/dist/cjs/query-builder/delete-result.d.ts +5 -0
- package/dist/cjs/query-builder/delete-result.js +13 -0
- package/dist/cjs/query-builder/expression-builder.d.ts +2 -2
- package/dist/cjs/query-builder/expression-builder.js +1 -1
- package/dist/cjs/query-builder/function-builder.d.ts +5 -5
- package/dist/cjs/query-builder/function-builder.js +3 -3
- package/dist/cjs/query-builder/insert-result.d.ts +27 -0
- package/dist/cjs/query-builder/insert-result.js +35 -0
- package/dist/cjs/query-builder/join-builder.d.ts +3 -0
- package/dist/cjs/query-builder/query-builder.d.ts +95 -81
- package/dist/cjs/query-builder/query-builder.js +38 -41
- package/dist/cjs/query-builder/update-result.d.ts +5 -0
- package/dist/cjs/query-builder/update-result.js +13 -0
- package/dist/cjs/query-compiler/compiled-query.d.ts +5 -0
- package/dist/cjs/query-compiler/compiled-query.js +12 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +24 -13
- package/dist/cjs/query-creator.d.ts +36 -26
- package/dist/cjs/query-creator.js +25 -17
- package/dist/cjs/schema/create-view-builder.d.ts +4 -0
- package/dist/cjs/schema/create-view-builder.js +11 -0
- package/dist/cjs/util/dynamic-import.d.ts +2 -0
- package/dist/cjs/util/dynamic-import.js +32 -0
- package/dist/cjs/util/log.d.ts +10 -8
- package/dist/cjs/util/log.js +29 -9
- package/dist/cjs/util/type-utils.d.ts +4 -15
- package/dist/esm/dialect/dialect-adapter.d.ts +3 -2
- package/dist/esm/dialect/mysql/mysql-adapter.js +1 -1
- package/dist/esm/dialect/mysql/mysql-dialect.d.ts +3 -3
- package/dist/esm/dialect/mysql/mysql-driver.js +26 -33
- package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +0 -2
- package/dist/esm/dialect/mysql/mysql-query-compiler.js +0 -6
- package/dist/esm/dialect/postgres/postgres-dialect.d.ts +2 -2
- package/dist/esm/dialect/postgres/postgres-driver.js +8 -19
- package/dist/esm/dialect/postgres/postgres-query-compiler.d.ts +3 -0
- package/dist/esm/dialect/postgres/postgres-query-compiler.js +9 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +7 -0
- package/dist/esm/dialect/sqlite/sqlite-adapter.js +14 -0
- package/dist/esm/dialect/sqlite/sqlite-dialect.d.ts +64 -0
- package/dist/esm/dialect/sqlite/sqlite-dialect.js +29 -0
- package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +14 -0
- package/dist/esm/dialect/sqlite/sqlite-driver.js +112 -0
- package/dist/esm/dialect/sqlite/sqlite-introspector.d.ts +7 -0
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +40 -0
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +7 -0
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +15 -0
- package/dist/esm/driver/database-connection.d.ts +2 -2
- package/dist/esm/driver/runtime-driver.js +1 -1
- package/dist/esm/index.d.ts +46 -30
- package/dist/esm/index.js +45 -29
- package/dist/esm/kysely.d.ts +28 -10
- package/dist/esm/kysely.js +6 -4
- package/dist/esm/migration/migration.d.ts +1 -1
- package/dist/esm/migration/migration.js +3 -3
- package/dist/esm/operation-node/alias-node.d.ts +1 -1
- package/dist/esm/operation-node/create-view-node.d.ts +1 -0
- package/dist/esm/operation-node/having-node.d.ts +4 -8
- package/dist/esm/operation-node/having-node.js +3 -3
- package/dist/esm/operation-node/join-node.d.ts +6 -9
- package/dist/esm/operation-node/join-node.js +10 -7
- package/dist/esm/operation-node/on-node.d.ts +14 -0
- package/dist/esm/operation-node/on-node.js +25 -0
- 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-utils.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-visitor.d.ts +3 -0
- package/dist/esm/operation-node/operation-node-visitor.js +4 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/query-node.d.ts +3 -3
- package/dist/esm/operation-node/select-query-node.d.ts +4 -4
- package/dist/esm/operation-node/where-node.d.ts +4 -8
- package/dist/esm/operation-node/where-node.js +3 -3
- package/dist/esm/parser/filter-parser.d.ts +1 -0
- package/dist/esm/parser/filter-parser.js +48 -52
- package/dist/esm/parser/returning-parser.d.ts +4 -2
- package/dist/esm/parser/select-parser.d.ts +2 -2
- package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.d.ts +1 -1
- package/dist/esm/query-builder/delete-result.d.ts +5 -0
- package/dist/esm/query-builder/delete-result.js +9 -0
- package/dist/esm/query-builder/expression-builder.d.ts +2 -2
- package/dist/esm/query-builder/expression-builder.js +1 -1
- package/dist/esm/query-builder/function-builder.d.ts +5 -5
- package/dist/esm/query-builder/function-builder.js +3 -3
- package/dist/esm/query-builder/insert-result.d.ts +27 -0
- package/dist/esm/query-builder/insert-result.js +31 -0
- package/dist/esm/query-builder/join-builder.d.ts +3 -0
- package/dist/esm/query-builder/query-builder.d.ts +95 -81
- package/dist/esm/query-builder/query-builder.js +38 -41
- package/dist/esm/query-builder/update-result.d.ts +5 -0
- package/dist/esm/query-builder/update-result.js +9 -0
- package/dist/esm/query-compiler/compiled-query.d.ts +5 -0
- package/dist/esm/query-compiler/compiled-query.js +11 -1
- package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/esm/query-compiler/default-query-compiler.js +24 -13
- package/dist/esm/query-creator.d.ts +36 -26
- package/dist/esm/query-creator.js +25 -17
- package/dist/esm/schema/create-view-builder.d.ts +4 -0
- package/dist/esm/schema/create-view-builder.js +11 -0
- package/dist/esm/util/dynamic-import.d.ts +2 -0
- package/dist/esm/util/dynamic-import.js +27 -0
- package/dist/esm/util/log.d.ts +10 -8
- package/dist/esm/util/log.js +30 -10
- package/dist/esm/util/type-utils.d.ts +4 -15
- package/package.json +3 -1
package/dist/esm/kysely.js
CHANGED
|
@@ -151,7 +151,7 @@ export class Kysely extends QueryCreator {
|
|
|
151
151
|
* .execute()
|
|
152
152
|
* ```
|
|
153
153
|
*
|
|
154
|
-
* The generated SQL (
|
|
154
|
+
* The generated SQL (PostgreSQL):
|
|
155
155
|
*
|
|
156
156
|
* ```sql
|
|
157
157
|
* select "person"."id", count("pet"."id") as "pet_count"
|
|
@@ -183,17 +183,19 @@ export class Kysely extends QueryCreator {
|
|
|
183
183
|
* const catto = await db.transaction().execute(async (trx) => {
|
|
184
184
|
* const jennifer = await trx.insertInto('person')
|
|
185
185
|
* .values({
|
|
186
|
+
* id: db.generated,
|
|
186
187
|
* first_name: 'Jennifer',
|
|
187
|
-
*
|
|
188
|
+
* last_name: 'Aniston',
|
|
188
189
|
* })
|
|
189
190
|
* .returning('id')
|
|
190
|
-
* .
|
|
191
|
+
* .executeTakeFirstOrThrow()
|
|
191
192
|
*
|
|
192
193
|
* await someFunction(trx, jennifer)
|
|
193
194
|
*
|
|
194
195
|
* return await trx.insertInto('pet')
|
|
195
196
|
* .values({
|
|
196
|
-
*
|
|
197
|
+
* id: db.generated,
|
|
198
|
+
* user_id: jennifer.id,
|
|
197
199
|
* name: 'Catto',
|
|
198
200
|
* species: 'cat'
|
|
199
201
|
* })
|
|
@@ -57,7 +57,7 @@ async function ensureMigrationTableExists(db) {
|
|
|
57
57
|
.execute();
|
|
58
58
|
}
|
|
59
59
|
catch (error) {
|
|
60
|
-
// At least on
|
|
60
|
+
// At least on PostgreSQL, `if not exists` doesn't guarantee the `create table`
|
|
61
61
|
// query doesn't throw if the table already exits. That's why we check if
|
|
62
62
|
// the table exist here and ignore the error if it does.
|
|
63
63
|
if (!(await doesTableExists(db, MIGRATION_TABLE))) {
|
|
@@ -77,7 +77,7 @@ async function ensureMigrationLockTableExists(db) {
|
|
|
77
77
|
.execute();
|
|
78
78
|
}
|
|
79
79
|
catch (error) {
|
|
80
|
-
// At least on
|
|
80
|
+
// At least on PostgreSQL, `if not exists` doesn't guarantee the `create table`
|
|
81
81
|
// query doesn't throw if the table already exits. That's why we check if
|
|
82
82
|
// the table exist here and ignore the error if it does.
|
|
83
83
|
if (!(await doesTableExists(db, MIGRATION_LOCK_TABLE))) {
|
|
@@ -179,5 +179,5 @@ function ensureMigrationsAreNotCorrupted(executedMigrationNames, oldMigrationNam
|
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
181
|
function isMigration(obj) {
|
|
182
|
-
return isObject(obj) && isFunction(obj.up)
|
|
182
|
+
return isObject(obj) && isFunction(obj.up);
|
|
183
183
|
}
|
|
@@ -5,7 +5,7 @@ import { RawNode } from './raw-node.js';
|
|
|
5
5
|
import { ReferenceNode } from './reference-node.js';
|
|
6
6
|
import { SelectQueryNode } from './select-query-node.js';
|
|
7
7
|
import { TableNode } from './table-node.js';
|
|
8
|
-
export declare type AliasNodeChild = ColumnNode | ReferenceNode | TableNode |
|
|
8
|
+
export declare type AliasNodeChild = ColumnNode | ReferenceNode | TableNode | SelectQueryNode | RawNode;
|
|
9
9
|
export interface AliasNode extends OperationNode {
|
|
10
10
|
readonly kind: 'AliasNode';
|
|
11
11
|
readonly node: AliasNodeChild;
|
|
@@ -9,6 +9,7 @@ export interface CreateViewNode extends OperationNode {
|
|
|
9
9
|
readonly name: IdentifierNode;
|
|
10
10
|
readonly materialized?: boolean;
|
|
11
11
|
readonly orReplace?: boolean;
|
|
12
|
+
readonly ifNotExists?: boolean;
|
|
12
13
|
readonly columns?: ReadonlyArray<ColumnNode>;
|
|
13
14
|
readonly as?: SelectQueryNode | RawNode;
|
|
14
15
|
}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FilterNode } from './filter-node.js';
|
|
1
|
+
import { FilterExpressionNode } from './operation-node-utils.js';
|
|
3
2
|
import { OperationNode } from './operation-node.js';
|
|
4
|
-
import { OrNode } from './or-node.js';
|
|
5
|
-
import { ParensNode } from './parens-node.js';
|
|
6
|
-
export declare type HavingNodeChild = FilterNode | AndNode | OrNode | ParensNode;
|
|
7
3
|
export interface HavingNode extends OperationNode {
|
|
8
4
|
readonly kind: 'HavingNode';
|
|
9
|
-
readonly having:
|
|
5
|
+
readonly having: FilterExpressionNode;
|
|
10
6
|
}
|
|
11
7
|
/**
|
|
12
8
|
* @internal
|
|
13
9
|
*/
|
|
14
10
|
export declare const HavingNode: Readonly<{
|
|
15
11
|
is(node: OperationNode): node is HavingNode;
|
|
16
|
-
create(filter:
|
|
17
|
-
cloneWithFilter(havingNode: HavingNode, op: 'And' | 'Or',
|
|
12
|
+
create(filter: FilterExpressionNode): HavingNode;
|
|
13
|
+
cloneWithFilter(havingNode: HavingNode, op: 'And' | 'Or', filter: FilterExpressionNode): HavingNode;
|
|
18
14
|
}>;
|
|
@@ -14,12 +14,12 @@ export const HavingNode = freeze({
|
|
|
14
14
|
having: filter,
|
|
15
15
|
});
|
|
16
16
|
},
|
|
17
|
-
cloneWithFilter(havingNode, op,
|
|
17
|
+
cloneWithFilter(havingNode, op, filter) {
|
|
18
18
|
return freeze({
|
|
19
19
|
...havingNode,
|
|
20
20
|
having: op === 'And'
|
|
21
|
-
? AndNode.create(havingNode.having,
|
|
22
|
-
: OrNode.create(havingNode.having,
|
|
21
|
+
? AndNode.create(havingNode.having, filter)
|
|
22
|
+
: OrNode.create(havingNode.having, filter),
|
|
23
23
|
});
|
|
24
24
|
},
|
|
25
25
|
});
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import { AliasNode } from './alias-node.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { OnNode } from './on-node.js';
|
|
3
|
+
import { FilterExpressionNode } from './operation-node-utils.js';
|
|
4
4
|
import { OperationNode } from './operation-node.js';
|
|
5
|
-
import { OrNode } from './or-node.js';
|
|
6
|
-
import { ParensNode } from './parens-node.js';
|
|
7
5
|
import { TableNode } from './table-node.js';
|
|
8
6
|
export declare type JoinTableNode = TableNode | AliasNode;
|
|
9
7
|
export declare type JoinType = 'InnerJoin' | 'LeftJoin' | 'RightJoin' | 'FullJoin';
|
|
10
|
-
export declare type JoinNodeOnNode = FilterNode | AndNode | OrNode | ParensNode;
|
|
11
8
|
export interface JoinNode extends OperationNode {
|
|
12
9
|
readonly kind: 'JoinNode';
|
|
13
10
|
readonly joinType: JoinType;
|
|
14
11
|
readonly table: JoinTableNode;
|
|
15
|
-
readonly on?:
|
|
12
|
+
readonly on?: OnNode;
|
|
16
13
|
}
|
|
17
14
|
/**
|
|
18
15
|
* @internal
|
|
@@ -20,7 +17,7 @@ export interface JoinNode extends OperationNode {
|
|
|
20
17
|
export declare const JoinNode: Readonly<{
|
|
21
18
|
is(node: OperationNode): node is JoinNode;
|
|
22
19
|
create(joinType: JoinType, table: JoinTableNode): JoinNode;
|
|
23
|
-
createWithOn(joinType: JoinType, table: JoinTableNode, on:
|
|
24
|
-
cloneWithOn(joinNode: JoinNode,
|
|
25
|
-
cloneWithOrOn(joinNode: JoinNode,
|
|
20
|
+
createWithOn(joinType: JoinType, table: JoinTableNode, on: FilterExpressionNode): JoinNode;
|
|
21
|
+
cloneWithOn(joinNode: JoinNode, filter: FilterExpressionNode): JoinNode;
|
|
22
|
+
cloneWithOrOn(joinNode: JoinNode, filter: FilterExpressionNode): JoinNode;
|
|
26
23
|
}>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { freeze } from '../util/object-utils.js';
|
|
2
|
-
import {
|
|
3
|
-
import { OrNode } from './or-node.js';
|
|
2
|
+
import { OnNode } from './on-node.js';
|
|
4
3
|
/**
|
|
5
4
|
* @internal
|
|
6
5
|
*/
|
|
@@ -21,19 +20,23 @@ export const JoinNode = freeze({
|
|
|
21
20
|
kind: 'JoinNode',
|
|
22
21
|
joinType,
|
|
23
22
|
table,
|
|
24
|
-
on,
|
|
23
|
+
on: OnNode.create(on),
|
|
25
24
|
});
|
|
26
25
|
},
|
|
27
|
-
cloneWithOn(joinNode,
|
|
26
|
+
cloneWithOn(joinNode, filter) {
|
|
28
27
|
return freeze({
|
|
29
28
|
...joinNode,
|
|
30
|
-
on: joinNode.on
|
|
29
|
+
on: joinNode.on
|
|
30
|
+
? OnNode.cloneWithFilter(joinNode.on, 'And', filter)
|
|
31
|
+
: OnNode.create(filter),
|
|
31
32
|
});
|
|
32
33
|
},
|
|
33
|
-
cloneWithOrOn(joinNode,
|
|
34
|
+
cloneWithOrOn(joinNode, filter) {
|
|
34
35
|
return freeze({
|
|
35
36
|
...joinNode,
|
|
36
|
-
on: joinNode.on
|
|
37
|
+
on: joinNode.on
|
|
38
|
+
? OnNode.cloneWithFilter(joinNode.on, 'Or', filter)
|
|
39
|
+
: OnNode.create(filter),
|
|
37
40
|
});
|
|
38
41
|
},
|
|
39
42
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FilterExpressionNode } from './operation-node-utils.js';
|
|
2
|
+
import { OperationNode } from './operation-node.js';
|
|
3
|
+
export interface OnNode extends OperationNode {
|
|
4
|
+
readonly kind: 'OnNode';
|
|
5
|
+
readonly on: FilterExpressionNode;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export declare const OnNode: Readonly<{
|
|
11
|
+
is(node: OperationNode): node is OnNode;
|
|
12
|
+
create(filter: FilterExpressionNode): OnNode;
|
|
13
|
+
cloneWithFilter(onNode: OnNode, op: 'And' | 'Or', filter: FilterExpressionNode): OnNode;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { freeze } from '../util/object-utils.js';
|
|
2
|
+
import { AndNode } from './and-node.js';
|
|
3
|
+
import { OrNode } from './or-node.js';
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export const OnNode = freeze({
|
|
8
|
+
is(node) {
|
|
9
|
+
return node.kind === 'OnNode';
|
|
10
|
+
},
|
|
11
|
+
create(filter) {
|
|
12
|
+
return freeze({
|
|
13
|
+
kind: 'OnNode',
|
|
14
|
+
on: filter,
|
|
15
|
+
});
|
|
16
|
+
},
|
|
17
|
+
cloneWithFilter(onNode, op, filter) {
|
|
18
|
+
return freeze({
|
|
19
|
+
...onNode,
|
|
20
|
+
on: op === 'And'
|
|
21
|
+
? AndNode.create(onNode.on, filter)
|
|
22
|
+
: OrNode.create(onNode.on, filter),
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
});
|
|
@@ -62,6 +62,7 @@ import { CreateViewNode } from './create-view-node.js';
|
|
|
62
62
|
import { DropViewNode } from './drop-view-node.js';
|
|
63
63
|
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
|
|
64
64
|
import { DefaultValueNode } from './default-value-node.js';
|
|
65
|
+
import { OnNode } from './on-node.js';
|
|
65
66
|
/**
|
|
66
67
|
* Transforms an operation node tree into another one.
|
|
67
68
|
*
|
|
@@ -153,6 +154,7 @@ export declare class OperationNodeTransformer {
|
|
|
153
154
|
protected transformDropView(node: DropViewNode): DropViewNode;
|
|
154
155
|
protected transformGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): GeneratedAlwaysAsNode;
|
|
155
156
|
protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode;
|
|
157
|
+
protected transformOn(node: OnNode): OnNode;
|
|
156
158
|
protected transformDataType(node: DataTypeNode): DataTypeNode;
|
|
157
159
|
protected transformSelectAll(node: SelectAllNode): SelectAllNode;
|
|
158
160
|
protected transformIdentifier(node: IdentifierNode): IdentifierNode;
|
|
@@ -94,6 +94,7 @@ export class OperationNodeTransformer {
|
|
|
94
94
|
DropViewNode: this.transformDropView.bind(this),
|
|
95
95
|
GeneratedAlwaysAsNode: this.transformGeneratedAlwaysAs.bind(this),
|
|
96
96
|
DefaultValueNode: this.transformDefaultValue.bind(this),
|
|
97
|
+
OnNode: this.transformOn.bind(this),
|
|
97
98
|
});
|
|
98
99
|
transformNode = (node) => {
|
|
99
100
|
if (!node) {
|
|
@@ -525,6 +526,7 @@ export class OperationNodeTransformer {
|
|
|
525
526
|
kind: 'CreateViewNode',
|
|
526
527
|
name: this.transformNode(node.name),
|
|
527
528
|
orReplace: node.orReplace,
|
|
529
|
+
ifNotExists: node.ifNotExists,
|
|
528
530
|
materialized: node.materialized,
|
|
529
531
|
columns: this.transformNodeList(node.columns),
|
|
530
532
|
as: this.transformNode(node.as),
|
|
@@ -551,6 +553,12 @@ export class OperationNodeTransformer {
|
|
|
551
553
|
defaultValue: this.transformNode(node.defaultValue),
|
|
552
554
|
};
|
|
553
555
|
}
|
|
556
|
+
transformOn(node) {
|
|
557
|
+
return {
|
|
558
|
+
kind: 'OnNode',
|
|
559
|
+
on: this.transformNode(node.on),
|
|
560
|
+
};
|
|
561
|
+
}
|
|
554
562
|
transformDataType(node) {
|
|
555
563
|
// An Object.freezed leaf node. No need to clone.
|
|
556
564
|
return node;
|
|
@@ -14,4 +14,4 @@ import { ValueNode } from './value-node.js';
|
|
|
14
14
|
export declare type ReferenceExpressionNode = ColumnNode | ReferenceNode | SelectQueryNode | RawNode;
|
|
15
15
|
export declare type ValueExpressionNode = ValueNode | ValueListNode | PrimitiveValueListNode | ReferenceExpressionNode;
|
|
16
16
|
export declare type TableExpressionNode = TableNode | AliasNode;
|
|
17
|
-
export declare type FilterExpressionNode = FilterNode | AndNode | OrNode | ParensNode;
|
|
17
|
+
export declare type FilterExpressionNode = FilterNode | AndNode | OrNode | ParensNode | RawNode;
|
|
@@ -62,9 +62,11 @@ import { CreateViewNode } from './create-view-node.js';
|
|
|
62
62
|
import { DropViewNode } from './drop-view-node.js';
|
|
63
63
|
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
|
|
64
64
|
import { DefaultValueNode } from './default-value-node.js';
|
|
65
|
+
import { OnNode } from './on-node.js';
|
|
65
66
|
export declare abstract class OperationNodeVisitor {
|
|
66
67
|
#private;
|
|
67
68
|
protected readonly nodeStack: OperationNode[];
|
|
69
|
+
protected get parentNode(): OperationNode | undefined;
|
|
68
70
|
protected readonly visitNode: (node: OperationNode) => void;
|
|
69
71
|
protected abstract visitSelectQuery(node: SelectQueryNode): void;
|
|
70
72
|
protected abstract visitSelection(node: SelectionNode): void;
|
|
@@ -129,4 +131,5 @@ export declare abstract class OperationNodeVisitor {
|
|
|
129
131
|
protected abstract visitDropView(node: DropViewNode): void;
|
|
130
132
|
protected abstract visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void;
|
|
131
133
|
protected abstract visitDefaultValue(node: DefaultValueNode): void;
|
|
134
|
+
protected abstract visitOn(node: OnNode): void;
|
|
132
135
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { freeze } from '../util/object-utils.js';
|
|
2
2
|
export class OperationNodeVisitor {
|
|
3
3
|
nodeStack = [];
|
|
4
|
+
get parentNode() {
|
|
5
|
+
return this.nodeStack[this.nodeStack.length - 2];
|
|
6
|
+
}
|
|
4
7
|
#visitors = freeze({
|
|
5
8
|
AliasNode: this.visitAlias.bind(this),
|
|
6
9
|
ColumnNode: this.visitColumn.bind(this),
|
|
@@ -65,6 +68,7 @@ export class OperationNodeVisitor {
|
|
|
65
68
|
DropViewNode: this.visitDropView.bind(this),
|
|
66
69
|
GeneratedAlwaysAsNode: this.visitGeneratedAlwaysAs.bind(this),
|
|
67
70
|
DefaultValueNode: this.visitDefaultValue.bind(this),
|
|
71
|
+
OnNode: this.visitOn.bind(this),
|
|
68
72
|
});
|
|
69
73
|
visitNode = (node) => {
|
|
70
74
|
this.nodeStack.push(node);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedAlwaysAsNode' | 'DefaultValueNode';
|
|
1
|
+
export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedAlwaysAsNode' | 'DefaultValueNode' | 'OnNode';
|
|
2
2
|
export interface OperationNode {
|
|
3
3
|
readonly kind: OperationNodeKind;
|
|
4
4
|
}
|
|
@@ -2,10 +2,10 @@ import { InsertQueryNode } from './insert-query-node.js';
|
|
|
2
2
|
import { SelectQueryNode } from './select-query-node.js';
|
|
3
3
|
import { UpdateQueryNode } from './update-query-node.js';
|
|
4
4
|
import { DeleteQueryNode } from './delete-query-node.js';
|
|
5
|
-
import { WhereChildNode } from './where-node.js';
|
|
6
5
|
import { JoinNode } from './join-node.js';
|
|
7
6
|
import { SelectionNode } from './selection-node.js';
|
|
8
7
|
import { OperationNode } from './operation-node.js';
|
|
8
|
+
import { FilterExpressionNode } from './operation-node-utils.js';
|
|
9
9
|
export declare type QueryNode = SelectQueryNode | DeleteQueryNode | InsertQueryNode | UpdateQueryNode;
|
|
10
10
|
export declare type MutatingQueryNode = DeleteQueryNode | InsertQueryNode | UpdateQueryNode;
|
|
11
11
|
export declare type FilterableQueryNode = SelectQueryNode | DeleteQueryNode | UpdateQueryNode;
|
|
@@ -16,8 +16,8 @@ export declare const QueryNode: Readonly<{
|
|
|
16
16
|
is(node: OperationNode): node is QueryNode;
|
|
17
17
|
isMutating(node: OperationNode): node is MutatingQueryNode;
|
|
18
18
|
isFilterable(node: OperationNode): node is FilterableQueryNode;
|
|
19
|
-
cloneWithWhere<T extends FilterableQueryNode>(node: T, filter:
|
|
20
|
-
cloneWithOrWhere<T_1 extends FilterableQueryNode>(node: T_1, filter:
|
|
19
|
+
cloneWithWhere<T extends FilterableQueryNode>(node: T, filter: FilterExpressionNode): T;
|
|
20
|
+
cloneWithOrWhere<T_1 extends FilterableQueryNode>(node: T_1, filter: FilterExpressionNode): T_1;
|
|
21
21
|
cloneWithJoin<T_2 extends FilterableQueryNode>(node: T_2, join: JoinNode): T_2;
|
|
22
22
|
cloneWithReturning<T_3 extends MutatingQueryNode>(node: T_3, selections: ReadonlyArray<SelectionNode>): T_3;
|
|
23
23
|
}>;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { FromNode } from './from-node.js';
|
|
2
2
|
import { GroupByItemNode } from './group-by-item-node.js';
|
|
3
3
|
import { GroupByNode } from './group-by-node.js';
|
|
4
|
-
import { HavingNode
|
|
4
|
+
import { HavingNode } from './having-node.js';
|
|
5
5
|
import { JoinNode } from './join-node.js';
|
|
6
6
|
import { LimitNode } from './limit-node.js';
|
|
7
7
|
import { OffsetNode } from './offset-node.js';
|
|
8
8
|
import { OperationNode } from './operation-node.js';
|
|
9
|
-
import { TableExpressionNode } from './operation-node-utils.js';
|
|
9
|
+
import { FilterExpressionNode, TableExpressionNode } from './operation-node-utils.js';
|
|
10
10
|
import { OrderByItemNode } from './order-by-item-node.js';
|
|
11
11
|
import { OrderByNode } from './order-by-node.js';
|
|
12
12
|
import { SelectionNode } from './selection-node.js';
|
|
@@ -44,8 +44,8 @@ export declare const SelectQueryNode: Readonly<{
|
|
|
44
44
|
cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
|
|
45
45
|
cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
|
|
46
46
|
cloneWithOffset(selectNode: SelectQueryNode, offset: OffsetNode): SelectQueryNode;
|
|
47
|
-
cloneWithHaving(selectNode: SelectQueryNode, filter:
|
|
48
|
-
cloneWithOrHaving(selectNode: SelectQueryNode, filter:
|
|
47
|
+
cloneWithHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
|
|
48
|
+
cloneWithOrHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
|
|
49
49
|
cloneWithDistinct(selectNode: SelectQueryNode): SelectQueryNode;
|
|
50
50
|
cloneWithUnion(selectNode: SelectQueryNode, union: UnionNode): SelectQueryNode;
|
|
51
51
|
}>;
|
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FilterNode } from './filter-node.js';
|
|
1
|
+
import { FilterExpressionNode } from './operation-node-utils.js';
|
|
3
2
|
import { OperationNode } from './operation-node.js';
|
|
4
|
-
import { OrNode } from './or-node.js';
|
|
5
|
-
import { ParensNode } from './parens-node.js';
|
|
6
|
-
export declare type WhereChildNode = FilterNode | AndNode | OrNode | ParensNode;
|
|
7
3
|
export interface WhereNode extends OperationNode {
|
|
8
4
|
readonly kind: 'WhereNode';
|
|
9
|
-
readonly where:
|
|
5
|
+
readonly where: FilterExpressionNode;
|
|
10
6
|
}
|
|
11
7
|
/**
|
|
12
8
|
* @internal
|
|
13
9
|
*/
|
|
14
10
|
export declare const WhereNode: Readonly<{
|
|
15
11
|
is(node: OperationNode): node is WhereNode;
|
|
16
|
-
create(filter:
|
|
17
|
-
cloneWithFilter(whereNode: WhereNode, op: 'And' | 'Or',
|
|
12
|
+
create(filter: FilterExpressionNode): WhereNode;
|
|
13
|
+
cloneWithFilter(whereNode: WhereNode, op: 'And' | 'Or', filter: FilterExpressionNode): WhereNode;
|
|
18
14
|
}>;
|
|
@@ -14,12 +14,12 @@ export const WhereNode = freeze({
|
|
|
14
14
|
where: filter,
|
|
15
15
|
});
|
|
16
16
|
},
|
|
17
|
-
cloneWithFilter(whereNode, op,
|
|
17
|
+
cloneWithFilter(whereNode, op, filter) {
|
|
18
18
|
return freeze({
|
|
19
19
|
...whereNode,
|
|
20
20
|
where: op === 'And'
|
|
21
|
-
? AndNode.create(whereNode.where,
|
|
22
|
-
: OrNode.create(whereNode.where,
|
|
21
|
+
? AndNode.create(whereNode.where, filter)
|
|
22
|
+
: OrNode.create(whereNode.where, filter),
|
|
23
23
|
});
|
|
24
24
|
},
|
|
25
25
|
});
|
|
@@ -12,3 +12,4 @@ export declare function parseOnFilter(ctx: ParseContext, args: any[]): FilterExp
|
|
|
12
12
|
export declare function parseReferenceFilter(ctx: ParseContext, lhs: ReferenceExpression<any, any>, op: FilterOperator, rhs: ReferenceExpression<any, any>): FilterNode;
|
|
13
13
|
export declare function parseExistFilter(ctx: ParseContext, arg: ExistsExpression<any, any>): FilterNode;
|
|
14
14
|
export declare function parseNotExistFilter(ctx: ParseContext, arg: ExistsExpression<any, any>): FilterNode;
|
|
15
|
+
export declare function parseFilter(ctx: ParseContext, type: 'where' | 'having' | 'on', args: any[]): FilterExpressionNode;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FilterNode } from '../operation-node/filter-node.js';
|
|
2
|
-
import { isBoolean, isFunction, isNull, isString, } from '../util/object-utils.js';
|
|
2
|
+
import { freeze, isBoolean, isFunction, isNull, isString, } from '../util/object-utils.js';
|
|
3
3
|
import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
4
4
|
import { RawNode } from '../operation-node/raw-node.js';
|
|
5
5
|
import { OperatorNode, OPERATORS, } from '../operation-node/operator-node.js';
|
|
@@ -9,37 +9,13 @@ import { parseValueExpressionOrList, } from './value-parser.js';
|
|
|
9
9
|
import { SelectQueryNode } from '../operation-node/select-query-node.js';
|
|
10
10
|
import { ValueNode } from '../operation-node/value-node.js';
|
|
11
11
|
export function parseWhereFilter(ctx, args) {
|
|
12
|
-
|
|
13
|
-
return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
|
|
14
|
-
}
|
|
15
|
-
else if (args.length === 1 && isFunction(args[0])) {
|
|
16
|
-
return parseWhereGroup(ctx, args[0]);
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
throw new Error(`invalid arguments passed to a where method ${JSON.stringify(args)}`);
|
|
20
|
-
}
|
|
12
|
+
return parseFilter(ctx, 'where', args);
|
|
21
13
|
}
|
|
22
14
|
export function parseHavingFilter(ctx, args) {
|
|
23
|
-
|
|
24
|
-
return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
|
|
25
|
-
}
|
|
26
|
-
else if (args.length === 1 && isFunction(args[0])) {
|
|
27
|
-
return parseHavingGroup(ctx, args[0]);
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
throw new Error(`invalid arguments passed to a having method ${JSON.stringify(args)}`);
|
|
31
|
-
}
|
|
15
|
+
return parseFilter(ctx, 'having', args);
|
|
32
16
|
}
|
|
33
17
|
export function parseOnFilter(ctx, args) {
|
|
34
|
-
|
|
35
|
-
return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
|
|
36
|
-
}
|
|
37
|
-
else if (args.length === 1 && isFunction(args[0])) {
|
|
38
|
-
return parseOnGroup(ctx, args[0]);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
throw new Error(`invalid arguments passed to an on method ${JSON.stringify(args)}`);
|
|
42
|
-
}
|
|
18
|
+
return parseFilter(ctx, 'on', args);
|
|
43
19
|
}
|
|
44
20
|
export function parseReferenceFilter(ctx, lhs, op, rhs) {
|
|
45
21
|
return FilterNode.create(parseReferenceExpression(ctx, lhs), parseFilterOperator(op), parseReferenceExpression(ctx, rhs));
|
|
@@ -50,6 +26,24 @@ export function parseExistFilter(ctx, arg) {
|
|
|
50
26
|
export function parseNotExistFilter(ctx, arg) {
|
|
51
27
|
return parseExistExpression(ctx, 'not exists', arg);
|
|
52
28
|
}
|
|
29
|
+
export function parseFilter(ctx, type, args) {
|
|
30
|
+
if (args.length === 3) {
|
|
31
|
+
return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
|
|
32
|
+
}
|
|
33
|
+
else if (args.length === 1) {
|
|
34
|
+
const arg = args[0];
|
|
35
|
+
if (isFunction(arg)) {
|
|
36
|
+
return GROUP_PARSERS[type](ctx, arg);
|
|
37
|
+
}
|
|
38
|
+
else if (isOperationNodeSource(arg)) {
|
|
39
|
+
const node = arg.toOperationNode();
|
|
40
|
+
if (RawNode.is(node)) {
|
|
41
|
+
return node;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
throw new Error(`invalid arguments passed to a '${type}' method: ${JSON.stringify(args)}`);
|
|
46
|
+
}
|
|
53
47
|
function parseThreeArgFilter(ctx, left, op, right) {
|
|
54
48
|
if ((op === 'is' || op === 'is not') && (isNull(right) || isBoolean(right))) {
|
|
55
49
|
return parseIsFilter(ctx, left, op, right);
|
|
@@ -70,30 +64,6 @@ function parseFilterOperator(op) {
|
|
|
70
64
|
}
|
|
71
65
|
throw new Error(`invalid comparison operator ${JSON.stringify(op)} passed to a filter method`);
|
|
72
66
|
}
|
|
73
|
-
function parseWhereGroup(ctx, callback) {
|
|
74
|
-
const query = callback(ctx.createSelectQueryBuilder([]));
|
|
75
|
-
const queryNode = query.toOperationNode();
|
|
76
|
-
if (!queryNode.where) {
|
|
77
|
-
throw new Error('no `where*` methods called insided a group callback');
|
|
78
|
-
}
|
|
79
|
-
return ParensNode.create(queryNode.where.where);
|
|
80
|
-
}
|
|
81
|
-
function parseHavingGroup(ctx, callback) {
|
|
82
|
-
const query = callback(ctx.createSelectQueryBuilder([]));
|
|
83
|
-
const queryNode = query.toOperationNode();
|
|
84
|
-
if (!queryNode.having) {
|
|
85
|
-
throw new Error('no `having*` methods called insided a group callback');
|
|
86
|
-
}
|
|
87
|
-
return ParensNode.create(queryNode.having.having);
|
|
88
|
-
}
|
|
89
|
-
function parseOnGroup(ctx, callback) {
|
|
90
|
-
const joinBuilder = callback(ctx.createJoinBuilder('InnerJoin', 'table'));
|
|
91
|
-
const joinNode = joinBuilder.toOperationNode();
|
|
92
|
-
if (!joinNode.on) {
|
|
93
|
-
throw new Error('no `on*` methods called insided a group callback');
|
|
94
|
-
}
|
|
95
|
-
return ParensNode.create(joinNode.on);
|
|
96
|
-
}
|
|
97
67
|
function parseExistExpression(ctx, type, arg) {
|
|
98
68
|
const node = isFunction(arg)
|
|
99
69
|
? arg(ctx.createExpressionBuilder()).toOperationNode()
|
|
@@ -103,3 +73,29 @@ function parseExistExpression(ctx, type, arg) {
|
|
|
103
73
|
}
|
|
104
74
|
return FilterNode.create(undefined, OperatorNode.create(type), node);
|
|
105
75
|
}
|
|
76
|
+
const GROUP_PARSERS = freeze({
|
|
77
|
+
where(ctx, callback) {
|
|
78
|
+
const query = callback(ctx.createSelectQueryBuilder([]));
|
|
79
|
+
const queryNode = query.toOperationNode();
|
|
80
|
+
if (!queryNode.where) {
|
|
81
|
+
throw new Error('no `where` methods called insided a group callback');
|
|
82
|
+
}
|
|
83
|
+
return ParensNode.create(queryNode.where.where);
|
|
84
|
+
},
|
|
85
|
+
having(ctx, callback) {
|
|
86
|
+
const query = callback(ctx.createSelectQueryBuilder([]));
|
|
87
|
+
const queryNode = query.toOperationNode();
|
|
88
|
+
if (!queryNode.having) {
|
|
89
|
+
throw new Error('no `having` methods called insided a group callback');
|
|
90
|
+
}
|
|
91
|
+
return ParensNode.create(queryNode.having.having);
|
|
92
|
+
},
|
|
93
|
+
on(ctx, callback) {
|
|
94
|
+
const joinBuilder = callback(ctx.createJoinBuilder('InnerJoin', 'table'));
|
|
95
|
+
const joinNode = joinBuilder.toOperationNode();
|
|
96
|
+
if (!joinNode.on) {
|
|
97
|
+
throw new Error('no `on` methods called insided a group callback');
|
|
98
|
+
}
|
|
99
|
+
return ParensNode.create(joinNode.on.on);
|
|
100
|
+
},
|
|
101
|
+
});
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { DeleteResult } from '../query-builder/delete-result.js';
|
|
2
|
+
import { InsertResult } from '../query-builder/insert-result.js';
|
|
1
3
|
import { QueryBuilder } from '../query-builder/query-builder.js';
|
|
2
|
-
import {
|
|
4
|
+
import { UpdateResult } from '../query-builder/update-result.js';
|
|
3
5
|
import { Selection } from './select-parser.js';
|
|
4
6
|
/**
|
|
5
7
|
* `returning` method output query builder type
|
|
6
8
|
*/
|
|
7
|
-
export declare type QueryBuilderWithReturning<DB, TB extends keyof DB, O, S> = QueryBuilder<DB, TB, O extends
|
|
9
|
+
export declare type QueryBuilderWithReturning<DB, TB extends keyof DB, O, S> = QueryBuilder<DB, TB, O extends InsertResult ? Selection<DB, TB, S> : O extends DeleteResult ? Selection<DB, TB, S> : O extends UpdateResult ? Selection<DB, TB, S> : O & Selection<DB, TB, S>>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
|
|
2
2
|
import { AliasedQueryBuilder, QueryBuilder } from '../query-builder/query-builder.js';
|
|
3
3
|
import { SelectionNode } from '../operation-node/selection-node.js';
|
|
4
|
-
import { AliasedQueryBuilderFactory, AliasedRawBuilderFactory, AnyAliasedColumn, AnyAliasedColumnWithTable, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, AnyColumn, AnyColumnWithTable,
|
|
4
|
+
import { AliasedQueryBuilderFactory, AliasedRawBuilderFactory, AnyAliasedColumn, AnyAliasedColumnWithTable, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, AnyColumn, AnyColumnWithTable, RowType, ValueType } from '../util/type-utils.js';
|
|
5
5
|
import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
|
|
6
6
|
import { ParseContext } from './parse-context.js';
|
|
7
7
|
/**
|
|
@@ -13,7 +13,7 @@ export declare type SelectExpressionOrList<DB, TB extends keyof DB> = SelectExpr
|
|
|
13
13
|
* Given a selection expression returns a query builder type that
|
|
14
14
|
* has the selection.
|
|
15
15
|
*/
|
|
16
|
-
export declare type QueryBuilderWithSelection<DB, TB extends keyof DB, O, S> = QueryBuilder<DB, TB, O
|
|
16
|
+
export declare type QueryBuilderWithSelection<DB, TB extends keyof DB, O, S> = QueryBuilder<DB, TB, O & Selection<DB, TB, S>>;
|
|
17
17
|
/**
|
|
18
18
|
* `selectAll` output query builder type.
|
|
19
19
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { QueryResult } from '../../driver/database-connection.js';
|
|
2
|
-
import { UnknownRow } from '../../index.js';
|
|
3
2
|
import { RootOperationNode } from '../../query-compiler/query-compiler.js';
|
|
3
|
+
import { UnknownRow } from '../../util/type-utils.js';
|
|
4
4
|
import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
|
|
5
5
|
/**
|
|
6
6
|
* Transforms all ValueNodes to immediate.
|