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
|
@@ -18,6 +18,9 @@ import { DeleteQueryNode } from '../operation-node/delete-query-node.js';
|
|
|
18
18
|
import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
|
|
19
19
|
import { parseGroupBy } from '../parser/group-by-parser.js';
|
|
20
20
|
import { parseUnion } from '../parser/union-parser.js';
|
|
21
|
+
import { InsertResult } from './insert-result.js';
|
|
22
|
+
import { UpdateResult } from './update-result.js';
|
|
23
|
+
import { DeleteResult } from './delete-result.js';
|
|
21
24
|
/**
|
|
22
25
|
* The main query builder class.
|
|
23
26
|
*
|
|
@@ -62,7 +65,7 @@ export class QueryBuilder {
|
|
|
62
65
|
* .whereRef('person.first_name', '=', 'pet.name')
|
|
63
66
|
* ```
|
|
64
67
|
*
|
|
65
|
-
* The generated SQL (
|
|
68
|
+
* The generated SQL (PostgreSQL):
|
|
66
69
|
*
|
|
67
70
|
* ```sql
|
|
68
71
|
* select * from "person", "pet" where "person"."first_name" = "pet"."name"
|
|
@@ -85,7 +88,7 @@ export class QueryBuilder {
|
|
|
85
88
|
* .execute()
|
|
86
89
|
* ```
|
|
87
90
|
*
|
|
88
|
-
* The generated SQL (
|
|
91
|
+
* The generated SQL (PostgreSQL):
|
|
89
92
|
*
|
|
90
93
|
* ```sql
|
|
91
94
|
* select "person".*, (
|
|
@@ -144,7 +147,7 @@ export class QueryBuilder {
|
|
|
144
147
|
* .execute()
|
|
145
148
|
* ```
|
|
146
149
|
*
|
|
147
|
-
* The generated SQL (
|
|
150
|
+
* The generated SQL (PostgreSQL):
|
|
148
151
|
*
|
|
149
152
|
* ```sql
|
|
150
153
|
* select * from "person"
|
|
@@ -170,7 +173,7 @@ export class QueryBuilder {
|
|
|
170
173
|
* )
|
|
171
174
|
* ```
|
|
172
175
|
*
|
|
173
|
-
* The generated SQL (
|
|
176
|
+
* The generated SQL (PostgreSQL):
|
|
174
177
|
*
|
|
175
178
|
* ```sql
|
|
176
179
|
* select * from "person"
|
|
@@ -324,7 +327,7 @@ export class QueryBuilder {
|
|
|
324
327
|
* .execute()
|
|
325
328
|
* ```
|
|
326
329
|
*
|
|
327
|
-
* The generated SQL (
|
|
330
|
+
* The generated SQL (PostgreSQL):
|
|
328
331
|
*
|
|
329
332
|
* ```sql
|
|
330
333
|
* select distinct "first_name" from "person"
|
|
@@ -523,15 +526,15 @@ export class QueryBuilder {
|
|
|
523
526
|
* values to update. In addition to the column's type, the values can be `raw`
|
|
524
527
|
* instances or select queries.
|
|
525
528
|
*
|
|
526
|
-
* The return value
|
|
527
|
-
* {@link QueryBuilder.returning | returning} method on
|
|
528
|
-
* to get out the updated rows.
|
|
529
|
+
* The return value of an update query is an instance of {@link UpdateResult}.
|
|
530
|
+
* You can use the {@link QueryBuilder.returning | returning} method on
|
|
531
|
+
* supported databases to get out the updated rows.
|
|
529
532
|
*
|
|
530
533
|
* @example
|
|
531
534
|
* Update a row in `person` table:
|
|
532
535
|
*
|
|
533
536
|
* ```ts
|
|
534
|
-
* const
|
|
537
|
+
* const result = await db
|
|
535
538
|
* .updateTable('person')
|
|
536
539
|
* .set({
|
|
537
540
|
* first_name: 'Jennifer',
|
|
@@ -539,9 +542,11 @@ export class QueryBuilder {
|
|
|
539
542
|
* })
|
|
540
543
|
* .where('id', '=', 1)
|
|
541
544
|
* .executeTakeFirst()
|
|
545
|
+
*
|
|
546
|
+
* console.log(result.numUpdatedRows)
|
|
542
547
|
* ```
|
|
543
548
|
*
|
|
544
|
-
* The generated SQL (
|
|
549
|
+
* The generated SQL (PostgreSQL):
|
|
545
550
|
*
|
|
546
551
|
* ```sql
|
|
547
552
|
* update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3
|
|
@@ -566,7 +571,7 @@ export class QueryBuilder {
|
|
|
566
571
|
* row.id
|
|
567
572
|
* ```
|
|
568
573
|
*
|
|
569
|
-
* The generated SQL (
|
|
574
|
+
* The generated SQL (PostgreSQL):
|
|
570
575
|
*
|
|
571
576
|
* ```sql
|
|
572
577
|
* update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3 returning "id"
|
|
@@ -577,7 +582,7 @@ export class QueryBuilder {
|
|
|
577
582
|
* select queries:
|
|
578
583
|
*
|
|
579
584
|
* ```ts
|
|
580
|
-
* const
|
|
585
|
+
* const result = await db
|
|
581
586
|
* .updateTable('person')
|
|
582
587
|
* .set({
|
|
583
588
|
* first_name: 'Jennifer',
|
|
@@ -586,9 +591,11 @@ export class QueryBuilder {
|
|
|
586
591
|
* })
|
|
587
592
|
* .where('id', '=', 1)
|
|
588
593
|
* .executeTakeFirst()
|
|
594
|
+
*
|
|
595
|
+
* console.log(result.numUpdatedRows)
|
|
589
596
|
* ```
|
|
590
597
|
*
|
|
591
|
-
* The generated SQL (
|
|
598
|
+
* The generated SQL (PostgreSQL):
|
|
592
599
|
*
|
|
593
600
|
* ```sql
|
|
594
601
|
* update "person" set
|
|
@@ -614,7 +621,7 @@ export class QueryBuilder {
|
|
|
614
621
|
}
|
|
615
622
|
/**
|
|
616
623
|
* Adds a `returning *` to an insert/update/delete query on databases
|
|
617
|
-
* that support `returning` such as
|
|
624
|
+
* that support `returning` such as PostgreSQL.
|
|
618
625
|
*/
|
|
619
626
|
returningAll() {
|
|
620
627
|
assertCanHaveReturningClause(this.#props.queryNode);
|
|
@@ -642,7 +649,7 @@ export class QueryBuilder {
|
|
|
642
649
|
* .execute()
|
|
643
650
|
* ```
|
|
644
651
|
*
|
|
645
|
-
* The generated SQL (
|
|
652
|
+
* The generated SQL (PostgreSQL):
|
|
646
653
|
*
|
|
647
654
|
* ```sql
|
|
648
655
|
* select "person"."first_name" as "fn"
|
|
@@ -669,7 +676,7 @@ export class QueryBuilder {
|
|
|
669
676
|
* .execute()
|
|
670
677
|
* ```
|
|
671
678
|
*
|
|
672
|
-
* The generated SQL (
|
|
679
|
+
* The generated SQL (PostgreSQL):
|
|
673
680
|
*
|
|
674
681
|
* ```sql
|
|
675
682
|
* select *
|
|
@@ -701,7 +708,7 @@ export class QueryBuilder {
|
|
|
701
708
|
* someQuery('fn')
|
|
702
709
|
* ```
|
|
703
710
|
*
|
|
704
|
-
* The generated SQL (
|
|
711
|
+
* The generated SQL (PostgreSQL):
|
|
705
712
|
*
|
|
706
713
|
* ```sql
|
|
707
714
|
* select "person"."first_name" as "fn"
|
|
@@ -892,32 +899,22 @@ export class QueryBuilder {
|
|
|
892
899
|
* Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods.
|
|
893
900
|
*/
|
|
894
901
|
async execute() {
|
|
895
|
-
const
|
|
896
|
-
const
|
|
902
|
+
const compildQuery = this.compile();
|
|
903
|
+
const query = compildQuery.query;
|
|
897
904
|
const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
|
|
898
|
-
if (
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
}
|
|
905
|
+
if (this.#props.parseContext.adapter.supportsReturning &&
|
|
906
|
+
QueryNode.isMutating(query) &&
|
|
907
|
+
query.returning) {
|
|
908
|
+
return result.rows;
|
|
909
|
+
}
|
|
910
|
+
else if (InsertQueryNode.is(query)) {
|
|
911
|
+
return [new InsertResult(result.insertId)];
|
|
912
|
+
}
|
|
913
|
+
else if (UpdateQueryNode.is(query)) {
|
|
914
|
+
return [new UpdateResult(result.numUpdatedOrDeletedRows)];
|
|
909
915
|
}
|
|
910
|
-
else if (
|
|
911
|
-
|
|
912
|
-
node.returning) {
|
|
913
|
-
return result.rows;
|
|
914
|
-
}
|
|
915
|
-
else if (result.numUpdatedOrDeletedRows != null) {
|
|
916
|
-
return [result.numUpdatedOrDeletedRows];
|
|
917
|
-
}
|
|
918
|
-
else {
|
|
919
|
-
return [];
|
|
920
|
-
}
|
|
916
|
+
else if (DeleteQueryNode.is(query)) {
|
|
917
|
+
return [new DeleteResult(result.numUpdatedOrDeletedRows)];
|
|
921
918
|
}
|
|
922
919
|
else {
|
|
923
920
|
return result.rows;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
import { RootOperationNode } from './query-compiler.js';
|
|
1
2
|
export interface CompiledQuery {
|
|
3
|
+
readonly query: RootOperationNode;
|
|
2
4
|
readonly sql: string;
|
|
3
5
|
readonly parameters: ReadonlyArray<unknown>;
|
|
4
6
|
}
|
|
7
|
+
export declare const CompiledQuery: Readonly<{
|
|
8
|
+
raw(sql: string): CompiledQuery;
|
|
9
|
+
}>;
|
|
@@ -1 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { RawNode } from '../operation-node/raw-node.js';
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
export const CompiledQuery = freeze({
|
|
4
|
+
raw(sql) {
|
|
5
|
+
return freeze({
|
|
6
|
+
sql,
|
|
7
|
+
query: RawNode.createWithSql(sql),
|
|
8
|
+
parameters: freeze([]),
|
|
9
|
+
});
|
|
10
|
+
},
|
|
11
|
+
});
|
|
@@ -66,6 +66,7 @@ import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
|
66
66
|
import { DropViewNode } from '../operation-node/drop-view-node.js';
|
|
67
67
|
import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js';
|
|
68
68
|
import { DefaultValueNode } from '../operation-node/default-value-node.js';
|
|
69
|
+
import { OnNode } from '../operation-node/on-node.js';
|
|
69
70
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
70
71
|
#private;
|
|
71
72
|
protected get numParameters(): number;
|
|
@@ -95,6 +96,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
95
96
|
protected visitPrimitiveValueList(node: PrimitiveValueListNode): void;
|
|
96
97
|
protected visitParens(node: ParensNode): void;
|
|
97
98
|
protected visitJoin(node: JoinNode): void;
|
|
99
|
+
protected visitOn(node: OnNode): void;
|
|
98
100
|
protected visitRaw(node: RawNode): void;
|
|
99
101
|
protected visitOperator(node: OperatorNode): void;
|
|
100
102
|
protected visitTable(node: TableNode): void;
|
|
@@ -2,6 +2,8 @@ import { OperationNodeVisitor } from '../operation-node/operation-node-visitor.j
|
|
|
2
2
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
3
3
|
import { RawNode } from '../operation-node/raw-node.js';
|
|
4
4
|
import { getLast, freeze, isString, isNumber, isBoolean, isNull, isDate, isBigInt, } from '../util/object-utils.js';
|
|
5
|
+
import { UnionNode } from '../operation-node/union-node.js';
|
|
6
|
+
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
5
7
|
export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
6
8
|
#sql = '';
|
|
7
9
|
#parameters = [];
|
|
@@ -13,6 +15,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
13
15
|
this.#parameters = [];
|
|
14
16
|
this.visitNode(node);
|
|
15
17
|
return freeze({
|
|
18
|
+
query: node,
|
|
16
19
|
sql: this.getSql(),
|
|
17
20
|
parameters: [...this.#parameters],
|
|
18
21
|
});
|
|
@@ -21,9 +24,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
21
24
|
return this.#sql;
|
|
22
25
|
}
|
|
23
26
|
visitSelectQuery(node) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
const wrapInParens = this.nodeStack.length !== 1 &&
|
|
28
|
+
!CreateViewNode.is(this.parentNode) &&
|
|
29
|
+
!UnionNode.is(this.parentNode);
|
|
30
|
+
if (wrapInParens) {
|
|
27
31
|
this.append('(');
|
|
28
32
|
}
|
|
29
33
|
if (node.with) {
|
|
@@ -82,7 +86,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
82
86
|
this.append(SELECT_MODIFIER_SQL[modifier]);
|
|
83
87
|
});
|
|
84
88
|
}
|
|
85
|
-
if (
|
|
89
|
+
if (wrapInParens) {
|
|
86
90
|
this.append(')');
|
|
87
91
|
}
|
|
88
92
|
}
|
|
@@ -262,11 +266,15 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
262
266
|
this.append(JOIN_TYPE_SQL[node.joinType]);
|
|
263
267
|
this.append(' ');
|
|
264
268
|
this.visitNode(node.table);
|
|
265
|
-
this.append(' on ');
|
|
266
269
|
if (node.on) {
|
|
270
|
+
this.append(' ');
|
|
267
271
|
this.visitNode(node.on);
|
|
268
272
|
}
|
|
269
273
|
}
|
|
274
|
+
visitOn(node) {
|
|
275
|
+
this.append('on ');
|
|
276
|
+
this.visitNode(node.on);
|
|
277
|
+
}
|
|
270
278
|
visitRaw(node) {
|
|
271
279
|
node.sqlFragments.forEach((sql, i) => {
|
|
272
280
|
this.append(sql);
|
|
@@ -310,16 +318,16 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
310
318
|
if (!node.nullable) {
|
|
311
319
|
this.append(' not null');
|
|
312
320
|
}
|
|
313
|
-
if (node.autoIncrement) {
|
|
314
|
-
this.append(' ');
|
|
315
|
-
this.append(this.getAutoIncrement());
|
|
316
|
-
}
|
|
317
321
|
if (node.unique) {
|
|
318
322
|
this.append(' unique');
|
|
319
323
|
}
|
|
320
324
|
if (node.primaryKey) {
|
|
321
325
|
this.append(' primary key');
|
|
322
326
|
}
|
|
327
|
+
if (node.autoIncrement) {
|
|
328
|
+
this.append(' ');
|
|
329
|
+
this.append(this.getAutoIncrement());
|
|
330
|
+
}
|
|
323
331
|
if (node.references) {
|
|
324
332
|
this.append(' ');
|
|
325
333
|
this.visitNode(node.references);
|
|
@@ -657,6 +665,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
657
665
|
this.append('materialized ');
|
|
658
666
|
}
|
|
659
667
|
this.append('view ');
|
|
668
|
+
if (node.ifNotExists) {
|
|
669
|
+
this.append('if not exists ');
|
|
670
|
+
}
|
|
660
671
|
this.visitNode(node.name);
|
|
661
672
|
this.append(' ');
|
|
662
673
|
if (node.columns) {
|
|
@@ -732,17 +743,17 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
732
743
|
}
|
|
733
744
|
}
|
|
734
745
|
}
|
|
735
|
-
const SELECT_MODIFIER_SQL = {
|
|
746
|
+
const SELECT_MODIFIER_SQL = freeze({
|
|
736
747
|
ForKeyShare: 'for key share',
|
|
737
748
|
ForNoKeyUpdate: 'for no key update',
|
|
738
749
|
ForUpdate: 'for update',
|
|
739
750
|
ForShare: 'for share',
|
|
740
751
|
NoWait: 'nowait',
|
|
741
752
|
SkipLocked: 'skip locked',
|
|
742
|
-
};
|
|
743
|
-
const JOIN_TYPE_SQL = {
|
|
753
|
+
});
|
|
754
|
+
const JOIN_TYPE_SQL = freeze({
|
|
744
755
|
InnerJoin: 'inner join',
|
|
745
756
|
LeftJoin: 'left join',
|
|
746
757
|
RightJoin: 'right join',
|
|
747
758
|
FullJoin: 'full join',
|
|
748
|
-
};
|
|
759
|
+
});
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { QueryBuilder } from './query-builder/query-builder.js';
|
|
2
2
|
import { QueryBuilderWithTable, TableExpression, TableReference } from './parser/table-parser.js';
|
|
3
|
-
import { InsertResultTypeTag, DeleteResultTypeTag, UpdateResultTypeTag } from './util/type-utils.js';
|
|
4
3
|
import { QueryExecutor } from './query-executor/query-executor.js';
|
|
5
4
|
import { RawBuilder } from './raw-builder/raw-builder.js';
|
|
6
5
|
import { CommonTableExpression, QueryCreatorWithCommonTableExpression } from './parser/with-parser.js';
|
|
7
6
|
import { WithNode } from './operation-node/with-node.js';
|
|
8
7
|
import { ParseContext } from './parser/parse-context.js';
|
|
8
|
+
import { InsertResult } from './query-builder/insert-result.js';
|
|
9
|
+
import { DeleteResult } from './query-builder/delete-result.js';
|
|
10
|
+
import { UpdateResult } from './query-builder/update-result.js';
|
|
9
11
|
export declare class QueryCreator<DB> {
|
|
10
12
|
#private;
|
|
11
13
|
constructor(props: QueryCreatorProps);
|
|
@@ -21,7 +23,7 @@ export declare class QueryCreator<DB> {
|
|
|
21
23
|
* db.selectFrom('person').selectAll()
|
|
22
24
|
* ```
|
|
23
25
|
*
|
|
24
|
-
* The generated SQL (
|
|
26
|
+
* The generated SQL (PostgreSQL):
|
|
25
27
|
*
|
|
26
28
|
* ```sql
|
|
27
29
|
* select * from "person"
|
|
@@ -38,7 +40,7 @@ export declare class QueryCreator<DB> {
|
|
|
38
40
|
* console.log(persons[0].id)
|
|
39
41
|
* ```
|
|
40
42
|
*
|
|
41
|
-
* The generated SQL (
|
|
43
|
+
* The generated SQL (PostgreSQL):
|
|
42
44
|
*
|
|
43
45
|
* ```sql
|
|
44
46
|
* select "p"."id", "p"."first_name" from "person" as "p"
|
|
@@ -57,7 +59,7 @@ export declare class QueryCreator<DB> {
|
|
|
57
59
|
* console.log(persons[0].identifier)
|
|
58
60
|
* ```
|
|
59
61
|
*
|
|
60
|
-
* The generated SQL (
|
|
62
|
+
* The generated SQL (PostgreSQL):
|
|
61
63
|
*
|
|
62
64
|
* ```sql
|
|
63
65
|
* select "p"."identifier",
|
|
@@ -79,7 +81,7 @@ export declare class QueryCreator<DB> {
|
|
|
79
81
|
* console.log(items[0].one)
|
|
80
82
|
* ```
|
|
81
83
|
*
|
|
82
|
-
* The generated SQL (
|
|
84
|
+
* The generated SQL (PostgreSQL):
|
|
83
85
|
*
|
|
84
86
|
* ```sql
|
|
85
87
|
* select "q"."one",
|
|
@@ -106,7 +108,7 @@ export declare class QueryCreator<DB> {
|
|
|
106
108
|
* .execute()
|
|
107
109
|
* ```
|
|
108
110
|
*
|
|
109
|
-
* The generated SQL (
|
|
111
|
+
* The generated SQL (PostgreSQL):
|
|
110
112
|
*
|
|
111
113
|
* ```sql
|
|
112
114
|
* select "p".id, "a"."species", "q"."one"
|
|
@@ -121,20 +123,17 @@ export declare class QueryCreator<DB> {
|
|
|
121
123
|
/**
|
|
122
124
|
* Creates an insert query.
|
|
123
125
|
*
|
|
124
|
-
* The return value of this query is
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* If you are running a database engine like `Mysql` that always returns the primary
|
|
128
|
-
* key, you can safely use `!` or the {@link QueryBuilder.castTo | castTo} method
|
|
129
|
-
* to cast away the `undefined` from the type.
|
|
126
|
+
* The return value of this query is an instance of {@link InsertResult}. {@link InsertResult}
|
|
127
|
+
* has the {@link InsertResult.insertId | insertId} field that holds the auto incremented id of
|
|
128
|
+
* the inserted row if the db returned one.
|
|
130
129
|
*
|
|
131
130
|
* See the {@link QueryBuilder.values | values} method for more info and examples. Also see
|
|
132
131
|
* the {@link QueryBuilder.returning | returning} method for a way to return columns
|
|
133
|
-
* on supported databases like
|
|
132
|
+
* on supported databases like PostgreSQL.
|
|
134
133
|
*
|
|
135
134
|
* @example
|
|
136
135
|
* ```ts
|
|
137
|
-
* const
|
|
136
|
+
* const result = await db
|
|
138
137
|
* .insertInto('person')
|
|
139
138
|
* .values({
|
|
140
139
|
* id: db.generated,
|
|
@@ -142,10 +141,12 @@ export declare class QueryCreator<DB> {
|
|
|
142
141
|
* last_name: 'Aniston'
|
|
143
142
|
* })
|
|
144
143
|
* .executeTakeFirst()
|
|
144
|
+
*
|
|
145
|
+
* console.log(result.insertId)
|
|
145
146
|
* ```
|
|
146
147
|
*
|
|
147
148
|
* @example
|
|
148
|
-
* Some databases like
|
|
149
|
+
* Some databases like PostgreSQL support the `returning` method:
|
|
149
150
|
*
|
|
150
151
|
* ```ts
|
|
151
152
|
* const { id } = await db
|
|
@@ -159,22 +160,26 @@ export declare class QueryCreator<DB> {
|
|
|
159
160
|
* .executeTakeFirst()
|
|
160
161
|
* ```
|
|
161
162
|
*/
|
|
162
|
-
insertInto<T extends keyof DB & string>(table: T): QueryBuilder<DB, T,
|
|
163
|
+
insertInto<T extends keyof DB & string>(table: T): QueryBuilder<DB, T, InsertResult>;
|
|
163
164
|
/**
|
|
164
165
|
* Creates a delete query.
|
|
165
166
|
*
|
|
166
167
|
* See the {@link QueryBuilder.where} method for examples on how to specify
|
|
167
|
-
* a where clause for the delete operation
|
|
168
|
+
* a where clause for the delete operation.
|
|
169
|
+
*
|
|
170
|
+
* The return value of the query is an instance of {@link DeleteResult}.
|
|
168
171
|
*
|
|
169
172
|
* @example
|
|
170
173
|
* ```ts
|
|
171
|
-
* const
|
|
174
|
+
* const result = await db
|
|
172
175
|
* .deleteFrom('person')
|
|
173
176
|
* .where('person.id', '=', 1)
|
|
174
177
|
* .executeTakeFirst()
|
|
178
|
+
*
|
|
179
|
+
* console.log(result.numDeletedRows)
|
|
175
180
|
* ```
|
|
176
181
|
*/
|
|
177
|
-
deleteFrom<TR extends TableReference<DB>>(table: TR): QueryBuilderWithTable<DB, never,
|
|
182
|
+
deleteFrom<TR extends TableReference<DB>>(table: TR): QueryBuilderWithTable<DB, never, DeleteResult, TR>;
|
|
178
183
|
/**
|
|
179
184
|
* Creates an update query.
|
|
180
185
|
*
|
|
@@ -184,16 +189,20 @@ export declare class QueryCreator<DB> {
|
|
|
184
189
|
* See the {@link QueryBuilder.set} method for examples on how to
|
|
185
190
|
* specify the updates.
|
|
186
191
|
*
|
|
192
|
+
* The return value of the query is an {@link UpdateResult}.
|
|
193
|
+
*
|
|
187
194
|
* @example
|
|
188
195
|
* ```ts
|
|
189
|
-
* const
|
|
196
|
+
* const result = await db
|
|
190
197
|
* .updateTable('person')
|
|
191
198
|
* .set({ first_name: 'Jennifer' })
|
|
192
199
|
* .where('person.id', '=', 1)
|
|
193
200
|
* .executeTakeFirst()
|
|
201
|
+
*
|
|
202
|
+
* console.log(result.numUpdatedRows)
|
|
194
203
|
* ```
|
|
195
204
|
*/
|
|
196
|
-
updateTable<TR extends TableReference<DB>>(table: TR): QueryBuilderWithTable<DB, never,
|
|
205
|
+
updateTable<TR extends TableReference<DB>>(table: TR): QueryBuilderWithTable<DB, never, UpdateResult, TR>;
|
|
197
206
|
/**
|
|
198
207
|
* Creates a `with` query (common table expressions).
|
|
199
208
|
*
|
|
@@ -233,7 +242,7 @@ export declare class QueryCreator<DB> {
|
|
|
233
242
|
* .execute()
|
|
234
243
|
* ```
|
|
235
244
|
*
|
|
236
|
-
* The generated SQL (
|
|
245
|
+
* The generated SQL (PostgreSQL):
|
|
237
246
|
*
|
|
238
247
|
* ```sql
|
|
239
248
|
* select * from "mammals"."pet"
|
|
@@ -253,7 +262,7 @@ export declare class QueryCreator<DB> {
|
|
|
253
262
|
* .execute()
|
|
254
263
|
* ```
|
|
255
264
|
*
|
|
256
|
-
* The generated SQL (
|
|
265
|
+
* The generated SQL (PostgreSQL):
|
|
257
266
|
*
|
|
258
267
|
* ```sql
|
|
259
268
|
* select "p"."name" from "mammals"."pet" as "p"
|
|
@@ -298,7 +307,7 @@ export declare class QueryCreator<DB> {
|
|
|
298
307
|
* console.log(person.name)
|
|
299
308
|
* ```
|
|
300
309
|
*
|
|
301
|
-
* The generated SQL (
|
|
310
|
+
* The generated SQL (PostgreSQL):
|
|
302
311
|
*
|
|
303
312
|
* ```sql
|
|
304
313
|
* select concat(first_name, ' ', last_name) as "name"
|
|
@@ -356,7 +365,7 @@ export declare class QueryCreator<DB> {
|
|
|
356
365
|
* }
|
|
357
366
|
* ```
|
|
358
367
|
*
|
|
359
|
-
* The generated SQL (
|
|
368
|
+
* The generated SQL (PostgreSQL):
|
|
360
369
|
*
|
|
361
370
|
* ```sql
|
|
362
371
|
* select * from "person" where now() - birth_date > interval $1 year
|
|
@@ -370,7 +379,8 @@ export declare class QueryCreator<DB> {
|
|
|
370
379
|
* Example of creating a completely raw query from scratch:
|
|
371
380
|
*
|
|
372
381
|
* ```ts
|
|
373
|
-
* const
|
|
382
|
+
* const result = await db.raw<Person>('select p.* from person p').execute()
|
|
383
|
+
* const persons = result.rows
|
|
374
384
|
* ```
|
|
375
385
|
*
|
|
376
386
|
* For a raw query, you need to specify the type of the returned __row__. In
|
|
@@ -26,20 +26,17 @@ export class QueryCreator {
|
|
|
26
26
|
/**
|
|
27
27
|
* Creates an insert query.
|
|
28
28
|
*
|
|
29
|
-
* The return value of this query is
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* If you are running a database engine like `Mysql` that always returns the primary
|
|
33
|
-
* key, you can safely use `!` or the {@link QueryBuilder.castTo | castTo} method
|
|
34
|
-
* to cast away the `undefined` from the type.
|
|
29
|
+
* The return value of this query is an instance of {@link InsertResult}. {@link InsertResult}
|
|
30
|
+
* has the {@link InsertResult.insertId | insertId} field that holds the auto incremented id of
|
|
31
|
+
* the inserted row if the db returned one.
|
|
35
32
|
*
|
|
36
33
|
* See the {@link QueryBuilder.values | values} method for more info and examples. Also see
|
|
37
34
|
* the {@link QueryBuilder.returning | returning} method for a way to return columns
|
|
38
|
-
* on supported databases like
|
|
35
|
+
* on supported databases like PostgreSQL.
|
|
39
36
|
*
|
|
40
37
|
* @example
|
|
41
38
|
* ```ts
|
|
42
|
-
* const
|
|
39
|
+
* const result = await db
|
|
43
40
|
* .insertInto('person')
|
|
44
41
|
* .values({
|
|
45
42
|
* id: db.generated,
|
|
@@ -47,10 +44,12 @@ export class QueryCreator {
|
|
|
47
44
|
* last_name: 'Aniston'
|
|
48
45
|
* })
|
|
49
46
|
* .executeTakeFirst()
|
|
47
|
+
*
|
|
48
|
+
* console.log(result.insertId)
|
|
50
49
|
* ```
|
|
51
50
|
*
|
|
52
51
|
* @example
|
|
53
|
-
* Some databases like
|
|
52
|
+
* Some databases like PostgreSQL support the `returning` method:
|
|
54
53
|
*
|
|
55
54
|
* ```ts
|
|
56
55
|
* const { id } = await db
|
|
@@ -76,14 +75,18 @@ export class QueryCreator {
|
|
|
76
75
|
* Creates a delete query.
|
|
77
76
|
*
|
|
78
77
|
* See the {@link QueryBuilder.where} method for examples on how to specify
|
|
79
|
-
* a where clause for the delete operation
|
|
78
|
+
* a where clause for the delete operation.
|
|
79
|
+
*
|
|
80
|
+
* The return value of the query is an instance of {@link DeleteResult}.
|
|
80
81
|
*
|
|
81
82
|
* @example
|
|
82
83
|
* ```ts
|
|
83
|
-
* const
|
|
84
|
+
* const result = await db
|
|
84
85
|
* .deleteFrom('person')
|
|
85
86
|
* .where('person.id', '=', 1)
|
|
86
87
|
* .executeTakeFirst()
|
|
88
|
+
*
|
|
89
|
+
* console.log(result.numDeletedRows)
|
|
87
90
|
* ```
|
|
88
91
|
*/
|
|
89
92
|
deleteFrom(table) {
|
|
@@ -103,13 +106,17 @@ export class QueryCreator {
|
|
|
103
106
|
* See the {@link QueryBuilder.set} method for examples on how to
|
|
104
107
|
* specify the updates.
|
|
105
108
|
*
|
|
109
|
+
* The return value of the query is an {@link UpdateResult}.
|
|
110
|
+
*
|
|
106
111
|
* @example
|
|
107
112
|
* ```ts
|
|
108
|
-
* const
|
|
113
|
+
* const result = await db
|
|
109
114
|
* .updateTable('person')
|
|
110
115
|
* .set({ first_name: 'Jennifer' })
|
|
111
116
|
* .where('person.id', '=', 1)
|
|
112
117
|
* .executeTakeFirst()
|
|
118
|
+
*
|
|
119
|
+
* console.log(result.numUpdatedRows)
|
|
113
120
|
* ```
|
|
114
121
|
*/
|
|
115
122
|
updateTable(table) {
|
|
@@ -167,7 +174,7 @@ export class QueryCreator {
|
|
|
167
174
|
* .execute()
|
|
168
175
|
* ```
|
|
169
176
|
*
|
|
170
|
-
* The generated SQL (
|
|
177
|
+
* The generated SQL (PostgreSQL):
|
|
171
178
|
*
|
|
172
179
|
* ```sql
|
|
173
180
|
* select * from "mammals"."pet"
|
|
@@ -187,7 +194,7 @@ export class QueryCreator {
|
|
|
187
194
|
* .execute()
|
|
188
195
|
* ```
|
|
189
196
|
*
|
|
190
|
-
* The generated SQL (
|
|
197
|
+
* The generated SQL (PostgreSQL):
|
|
191
198
|
*
|
|
192
199
|
* ```sql
|
|
193
200
|
* select "p"."name" from "mammals"."pet" as "p"
|
|
@@ -237,7 +244,7 @@ export class QueryCreator {
|
|
|
237
244
|
* console.log(person.name)
|
|
238
245
|
* ```
|
|
239
246
|
*
|
|
240
|
-
* The generated SQL (
|
|
247
|
+
* The generated SQL (PostgreSQL):
|
|
241
248
|
*
|
|
242
249
|
* ```sql
|
|
243
250
|
* select concat(first_name, ' ', last_name) as "name"
|
|
@@ -295,7 +302,7 @@ export class QueryCreator {
|
|
|
295
302
|
* }
|
|
296
303
|
* ```
|
|
297
304
|
*
|
|
298
|
-
* The generated SQL (
|
|
305
|
+
* The generated SQL (PostgreSQL):
|
|
299
306
|
*
|
|
300
307
|
* ```sql
|
|
301
308
|
* select * from "person" where now() - birth_date > interval $1 year
|
|
@@ -309,7 +316,8 @@ export class QueryCreator {
|
|
|
309
316
|
* Example of creating a completely raw query from scratch:
|
|
310
317
|
*
|
|
311
318
|
* ```ts
|
|
312
|
-
* const
|
|
319
|
+
* const result = await db.raw<Person>('select p.* from person p').execute()
|
|
320
|
+
* const persons = result.rows
|
|
313
321
|
* ```
|
|
314
322
|
*
|
|
315
323
|
* For a raw query, you need to specify the type of the returned __row__. In
|