kysely 0.7.8 → 0.9.0
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 +47 -8
- package/dist/cjs/dialect/mysql/mysql-adapter.js +6 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +5 -5
- package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +0 -2
- package/dist/cjs/dialect/mysql/mysql-query-compiler.js +0 -29
- package/dist/cjs/dialect/postgres/postgres-driver.js +5 -5
- package/dist/cjs/operation-node/primitive-value-list-node.js +1 -1
- package/dist/cjs/parser/insert-values-parser.d.ts +1 -1
- package/dist/cjs/parser/join-parser.d.ts +6 -3
- package/dist/cjs/parser/table-parser.d.ts +18 -7
- package/dist/cjs/parser/update-set-parser.d.ts +1 -1
- package/dist/cjs/query-builder/function-builder.d.ts +6 -6
- package/dist/cjs/query-builder/function-builder.js +7 -7
- package/dist/cjs/query-builder/query-builder.d.ts +7 -7
- package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +3 -2
- package/dist/cjs/query-compiler/default-query-compiler.js +21 -27
- package/dist/cjs/query-creator.d.ts +14 -11
- package/dist/cjs/query-creator.js +14 -11
- package/dist/cjs/raw-builder/raw-builder.d.ts +1 -1
- package/dist/cjs/raw-builder/raw-builder.js +6 -6
- package/dist/cjs/schema/alter-table-builder.d.ts +3 -0
- package/dist/cjs/schema/alter-table-builder.js +3 -0
- package/dist/cjs/schema/column-definition-builder.d.ts +14 -5
- package/dist/cjs/schema/create-table-builder.d.ts +55 -10
- package/dist/cjs/schema/create-table-builder.js +52 -13
- package/dist/cjs/schema/schema.d.ts +37 -2
- package/dist/cjs/schema/schema.js +36 -1
- package/dist/cjs/util/object-utils.d.ts +1 -0
- package/dist/cjs/util/object-utils.js +5 -1
- package/dist/cjs/util/type-utils.d.ts +3 -0
- package/dist/esm/dialect/mysql/mysql-adapter.js +6 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +5 -5
- package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +0 -2
- package/dist/esm/dialect/mysql/mysql-query-compiler.js +0 -29
- package/dist/esm/dialect/postgres/postgres-driver.js +5 -5
- package/dist/esm/operation-node/primitive-value-list-node.js +1 -1
- package/dist/esm/parser/insert-values-parser.d.ts +1 -1
- package/dist/esm/parser/join-parser.d.ts +6 -3
- package/dist/esm/parser/table-parser.d.ts +18 -7
- package/dist/esm/parser/update-set-parser.d.ts +1 -1
- package/dist/esm/query-builder/function-builder.d.ts +6 -6
- package/dist/esm/query-builder/function-builder.js +7 -7
- package/dist/esm/query-builder/query-builder.d.ts +7 -7
- package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
- package/dist/esm/query-compiler/default-query-compiler.d.ts +3 -2
- package/dist/esm/query-compiler/default-query-compiler.js +21 -27
- package/dist/esm/query-creator.d.ts +14 -11
- package/dist/esm/query-creator.js +14 -11
- package/dist/esm/raw-builder/raw-builder.d.ts +1 -1
- package/dist/esm/raw-builder/raw-builder.js +6 -6
- package/dist/esm/schema/alter-table-builder.d.ts +3 -0
- package/dist/esm/schema/alter-table-builder.js +3 -0
- package/dist/esm/schema/column-definition-builder.d.ts +14 -5
- package/dist/esm/schema/create-table-builder.d.ts +55 -10
- package/dist/esm/schema/create-table-builder.js +53 -14
- package/dist/esm/schema/schema.d.ts +37 -2
- package/dist/esm/schema/schema.js +36 -1
- package/dist/esm/util/object-utils.d.ts +1 -0
- package/dist/esm/util/object-utils.js +3 -0
- package/dist/esm/util/type-utils.d.ts +3 -0
- package/package.json +7 -7
|
@@ -37,18 +37,18 @@ export class PostgresDriver {
|
|
|
37
37
|
if (settings.isolationLevel) {
|
|
38
38
|
await connection.executeQuery({
|
|
39
39
|
sql: `start transaction isolation level ${settings.isolationLevel}`,
|
|
40
|
-
|
|
40
|
+
parameters: [],
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
43
|
else {
|
|
44
|
-
await connection.executeQuery({ sql: 'begin',
|
|
44
|
+
await connection.executeQuery({ sql: 'begin', parameters: [] });
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
async commitTransaction(connection) {
|
|
48
|
-
await connection.executeQuery({ sql: 'commit',
|
|
48
|
+
await connection.executeQuery({ sql: 'commit', parameters: [] });
|
|
49
49
|
}
|
|
50
50
|
async rollbackTransaction(connection) {
|
|
51
|
-
await connection.executeQuery({ sql: 'rollback',
|
|
51
|
+
await connection.executeQuery({ sql: 'rollback', parameters: [] });
|
|
52
52
|
}
|
|
53
53
|
async releaseConnection(connection) {
|
|
54
54
|
const pgConnection = connection;
|
|
@@ -86,7 +86,7 @@ class PostgresConnection {
|
|
|
86
86
|
}
|
|
87
87
|
async executeQuery(compiledQuery) {
|
|
88
88
|
const result = await this.#client.query(compiledQuery.sql, [
|
|
89
|
-
...compiledQuery.
|
|
89
|
+
...compiledQuery.parameters,
|
|
90
90
|
]);
|
|
91
91
|
if (result.command === 'UPDATE' || result.command === 'DELETE') {
|
|
92
92
|
return {
|
|
@@ -9,7 +9,7 @@ export declare type InsertObject<DB, TB extends keyof DB> = {
|
|
|
9
9
|
[C in keyof DB[TB]]: InsertValueExpression<DB[TB][C]>;
|
|
10
10
|
};
|
|
11
11
|
export declare type InsertObjectOrList<DB, TB extends keyof DB> = InsertObject<DB, TB> | InsertObject<DB, TB>[];
|
|
12
|
-
declare type InsertValueExpression<T
|
|
12
|
+
declare type InsertValueExpression<T> = T | AnyQueryBuilder | AnyRawBuilder | GeneratedPlaceholder;
|
|
13
13
|
export declare function parseInsertObjectOrList(args: InsertObjectOrList<any, any>): [ReadonlyArray<ColumnNode>, ReadonlyArray<InsertValuesNode>];
|
|
14
14
|
export declare function parseInsertValueExpression(value: InsertValueExpression<PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
|
|
15
15
|
export {};
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { JoinNode, JoinType } from '../operation-node/join-node.js';
|
|
2
2
|
import { AnyColumn, AnyColumnWithTable } from '../util/type-utils.js';
|
|
3
|
-
import { ExtractAliasFromTableExpression,
|
|
3
|
+
import { ExtractAliasFromTableExpression, TableExpressionDatabase } from './table-parser.js';
|
|
4
4
|
import { JoinBuilder } from '../query-builder/join-builder.js';
|
|
5
5
|
import { ParseContext } from './parse-context.js';
|
|
6
|
-
export declare type JoinReferenceExpression<DB, TB extends keyof DB, F> =
|
|
7
|
-
export declare type JoinCallbackExpression<DB, TB extends keyof DB, F> = (join: JoinBuilder<
|
|
6
|
+
export declare type JoinReferenceExpression<DB, TB extends keyof DB, F> = AnyJoinColumn<DB, TB, F> | AnyJoinColumnWithTable<DB, TB, F>;
|
|
7
|
+
export declare type JoinCallbackExpression<DB, TB extends keyof DB, F> = (join: JoinBuilder<TableExpressionDatabase<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>) => JoinBuilder<any, any>;
|
|
8
|
+
declare type AnyJoinColumn<DB, TB extends keyof DB, F> = AnyColumn<TableExpressionDatabase<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>;
|
|
9
|
+
declare type AnyJoinColumnWithTable<DB, TB extends keyof DB, F> = AnyColumnWithTable<TableExpressionDatabase<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>;
|
|
8
10
|
export declare function parseJoin(ctx: ParseContext, joinType: JoinType, args: any[]): JoinNode;
|
|
11
|
+
export {};
|
|
@@ -1,21 +1,32 @@
|
|
|
1
1
|
import { AliasedQueryBuilder, QueryBuilder } from '../query-builder/query-builder.js';
|
|
2
2
|
import { TableNode } from '../operation-node/table-node.js';
|
|
3
|
-
import { AliasedQueryBuilderFactory, AnyAliasedQueryBuilder, AnyAliasedRawBuilder } from '../util/type-utils.js';
|
|
3
|
+
import { AliasedQueryBuilderFactory, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, Nullable } from '../util/type-utils.js';
|
|
4
4
|
import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
|
|
5
5
|
import { TableExpressionNode } from '../operation-node/operation-node-utils.js';
|
|
6
6
|
import { ParseContext } from './parse-context.js';
|
|
7
7
|
export declare type TableExpression<DB, TB extends keyof DB> = TableReference<DB> | AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB>;
|
|
8
8
|
export declare type TableExpressionOrList<DB, TB extends keyof DB> = TableExpression<DB, TB> | ReadonlyArray<TableExpression<DB, TB>>;
|
|
9
9
|
export declare type TableReference<DB> = AnyAliasedTable<DB, any, any> | AnyTable<DB> | AnyAliasedRawBuilder;
|
|
10
|
-
export declare type QueryBuilderWithTable<DB, TB extends keyof DB, O, TE> = QueryBuilder<
|
|
11
|
-
export declare type
|
|
10
|
+
export declare type QueryBuilderWithTable<DB, TB extends keyof DB, O, TE> = QueryBuilder<TableExpressionDatabase<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
|
|
11
|
+
export declare type TableExpressionDatabase<DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
|
|
12
|
+
[C in keyof DB | A]: C extends A ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? DB[C] : never;
|
|
13
|
+
};
|
|
14
|
+
export declare type QueryBuilderWithLeftJoin<DB, TB extends keyof DB, O, TE> = QueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
|
|
15
|
+
export declare type LeftJoinTableExpressionDatabase<DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
|
|
16
|
+
[C in keyof DB | A]: C extends A ? Nullable<ExtractRowTypeFromTableExpression<DB, TE, C>> : C extends keyof DB ? DB[C] : never;
|
|
17
|
+
};
|
|
18
|
+
export declare type QueryBuilderWithRightJoin<DB, TB extends keyof DB, O, TE> = QueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
|
|
19
|
+
export declare type RightJoinTableExpressionDatabase<DB, TB extends keyof DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
|
|
20
|
+
[C in keyof DB | A]: C extends A ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? C extends TB ? Nullable<DB[C]> : DB[C] : never;
|
|
21
|
+
};
|
|
22
|
+
export declare type QueryBuilderWithFullJoin<DB, TB extends keyof DB, O, TE> = QueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
|
|
23
|
+
export declare type FullJoinTableExpressionDatabase<DB, TB extends keyof DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
|
|
24
|
+
[C in keyof DB | A]: C extends A ? Nullable<ExtractRowTypeFromTableExpression<DB, TE, C>> : C extends keyof DB ? C extends TB ? Nullable<DB[C]> : DB[C] : never;
|
|
25
|
+
};
|
|
12
26
|
export declare type ExtractAliasFromTableExpression<DB, TE> = TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : TE extends AliasedQueryBuilder<any, any, any, infer QA> ? QA : TE extends (qb: any) => AliasedQueryBuilder<any, any, any, infer QA> ? QA : TE extends AliasedRawBuilder<any, infer RA> ? RA : TE extends (qb: any) => AliasedRawBuilder<any, infer RA> ? RA : never;
|
|
27
|
+
declare type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : never;
|
|
13
28
|
declare type AnyAliasedTable<DB, TB extends keyof DB, A extends string> = TB extends string ? `${TB} as ${A}` : never;
|
|
14
29
|
declare type AnyTable<DB> = keyof DB;
|
|
15
|
-
declare type ExtractDatabaseTypeFromTableExpression<DB, TE> = {
|
|
16
|
-
[A in ExtractAliasFromTableExpression<DB, TE>]: ExtractRowTypeFromTableExpression<DB, TE, A>;
|
|
17
|
-
};
|
|
18
|
-
declare type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : never;
|
|
19
30
|
export declare function parseTableExpressionOrList(ctx: ParseContext, table: TableExpressionOrList<any, any>): TableExpressionNode[];
|
|
20
31
|
export declare function parseTableExpression(ctx: ParseContext, table: TableExpression<any, any>): TableExpressionNode;
|
|
21
32
|
export declare function parseAliasedTable(from: string): TableExpressionNode;
|
|
@@ -8,6 +8,6 @@ import { ParseContext } from './parse-context.js';
|
|
|
8
8
|
export declare type MutationObject<DB, TB extends keyof DB> = {
|
|
9
9
|
[C in keyof DB[TB]]?: MutationValueExpression<DB, TB, DB[TB][C]>;
|
|
10
10
|
};
|
|
11
|
-
export declare type MutationValueExpression<DB, TB extends keyof DB, T
|
|
11
|
+
export declare type MutationValueExpression<DB, TB extends keyof DB, T> = T | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB>;
|
|
12
12
|
export declare function parseUpdateObject(ctx: ParseContext, row: MutationObject<any, any>): ReadonlyArray<ColumnUpdateNode>;
|
|
13
13
|
export declare function parseMutationValueExpression(ctx: ParseContext, value: MutationValueExpression<any, any, PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
|
|
@@ -66,9 +66,9 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
|
|
|
66
66
|
* Calls the `sum` function for the column given as the argument.
|
|
67
67
|
*
|
|
68
68
|
* If this is used in a `select` statement the type of the selected expression
|
|
69
|
-
* will be `number | string` by default. This is because Kysely can't
|
|
70
|
-
* type the db driver outputs. Sometimes the output can be larger than
|
|
71
|
-
* largest javascript number and a string is returned instead. Most drivers
|
|
69
|
+
* will be `number | string | BigInt` by default. This is because Kysely can't
|
|
70
|
+
* know the type the db driver outputs. Sometimes the output can be larger than
|
|
71
|
+
* the largest javascript number and a string is returned instead. Most drivers
|
|
72
72
|
* allow you to configure the output type of large numbers and Kysely can't
|
|
73
73
|
* know if you've done so.
|
|
74
74
|
*
|
|
@@ -88,9 +88,9 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
|
|
|
88
88
|
* Calls the `count` function for the column given as the argument.
|
|
89
89
|
*
|
|
90
90
|
* If this is used in a `select` statement the type of the selected expression
|
|
91
|
-
* will be `number | string` by default. This is because Kysely can't
|
|
92
|
-
* type the db driver outputs. Sometimes the output can be larger than
|
|
93
|
-
* largest javascript number and a string is returned instead. Most drivers
|
|
91
|
+
* will be `number | string | BigInt` by default. This is because Kysely can't
|
|
92
|
+
* know the type the db driver outputs. Sometimes the output can be larger than
|
|
93
|
+
* the largest javascript number and a string is returned instead. Most drivers
|
|
94
94
|
* allow you to configure the output type of large numbers and Kysely can't
|
|
95
95
|
* know if you've done so.
|
|
96
96
|
*
|
|
@@ -79,9 +79,9 @@ export class FunctionBuilder {
|
|
|
79
79
|
* Calls the `sum` function for the column given as the argument.
|
|
80
80
|
*
|
|
81
81
|
* If this is used in a `select` statement the type of the selected expression
|
|
82
|
-
* will be `number | string` by default. This is because Kysely can't
|
|
83
|
-
* type the db driver outputs. Sometimes the output can be larger than
|
|
84
|
-
* largest javascript number and a string is returned instead. Most drivers
|
|
82
|
+
* will be `number | string | BigInt` by default. This is because Kysely can't
|
|
83
|
+
* know the type the db driver outputs. Sometimes the output can be larger than
|
|
84
|
+
* the largest javascript number and a string is returned instead. Most drivers
|
|
85
85
|
* allow you to configure the output type of large numbers and Kysely can't
|
|
86
86
|
* know if you've done so.
|
|
87
87
|
*
|
|
@@ -103,9 +103,9 @@ export class FunctionBuilder {
|
|
|
103
103
|
* Calls the `count` function for the column given as the argument.
|
|
104
104
|
*
|
|
105
105
|
* If this is used in a `select` statement the type of the selected expression
|
|
106
|
-
* will be `number | string` by default. This is because Kysely can't
|
|
107
|
-
* type the db driver outputs. Sometimes the output can be larger than
|
|
108
|
-
* largest javascript number and a string is returned instead. Most drivers
|
|
106
|
+
* will be `number | string | BigInt` by default. This is because Kysely can't
|
|
107
|
+
* know the type the db driver outputs. Sometimes the output can be larger than
|
|
108
|
+
* the largest javascript number and a string is returned instead. Most drivers
|
|
109
109
|
* allow you to configure the output type of large numbers and Kysely can't
|
|
110
110
|
* know if you've done so.
|
|
111
111
|
*
|
|
@@ -128,7 +128,7 @@ export class FunctionBuilder {
|
|
|
128
128
|
queryId: createQueryId(),
|
|
129
129
|
executor: this.#props.executor,
|
|
130
130
|
sql: `${fn}(??)`,
|
|
131
|
-
|
|
131
|
+
parameters: [column],
|
|
132
132
|
});
|
|
133
133
|
}
|
|
134
134
|
}
|
|
@@ -2,7 +2,7 @@ import { AliasNode } from '../operation-node/alias-node.js';
|
|
|
2
2
|
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
3
3
|
import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
4
4
|
import { JoinCallbackExpression, JoinReferenceExpression } from '../parser/join-parser.js';
|
|
5
|
-
import { TableExpression, QueryBuilderWithTable } from '../parser/table-parser.js';
|
|
5
|
+
import { TableExpression, QueryBuilderWithTable, QueryBuilderWithLeftJoin, QueryBuilderWithRightJoin, QueryBuilderWithFullJoin } from '../parser/table-parser.js';
|
|
6
6
|
import { SelectExpression, QueryBuilderWithSelection, SelectAllQueryBuilder } from '../parser/select-parser.js';
|
|
7
7
|
import { ExistsExpression, FilterOperator } from '../parser/filter-parser.js';
|
|
8
8
|
import { InsertObject } from '../parser/insert-values-parser.js';
|
|
@@ -869,20 +869,20 @@ export declare class QueryBuilder<DB, TB extends keyof DB, O = {}> implements Op
|
|
|
869
869
|
* Just like {@link QueryBuilder.innerJoin | innerJoin} but adds a left join
|
|
870
870
|
* instead of an inner join.
|
|
871
871
|
*/
|
|
872
|
-
leftJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2):
|
|
873
|
-
leftJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN):
|
|
872
|
+
leftJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): QueryBuilderWithLeftJoin<DB, TB, O, TE>;
|
|
873
|
+
leftJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): QueryBuilderWithLeftJoin<DB, TB, O, TE>;
|
|
874
874
|
/**
|
|
875
875
|
* Just like {@link QueryBuilder.innerJoin | innerJoin} but adds a right join
|
|
876
876
|
* instead of an inner join.
|
|
877
877
|
*/
|
|
878
|
-
rightJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2):
|
|
879
|
-
rightJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN):
|
|
878
|
+
rightJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): QueryBuilderWithRightJoin<DB, TB, O, TE>;
|
|
879
|
+
rightJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): QueryBuilderWithRightJoin<DB, TB, O, TE>;
|
|
880
880
|
/**
|
|
881
881
|
* Just like {@link QueryBuilder.innerJoin | innerJoin} but adds a full join
|
|
882
882
|
* instead of an inner join.
|
|
883
883
|
*/
|
|
884
|
-
fullJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2):
|
|
885
|
-
fullJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN):
|
|
884
|
+
fullJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): QueryBuilderWithFullJoin<DB, TB, O, TE>;
|
|
885
|
+
fullJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): QueryBuilderWithFullJoin<DB, TB, O, TE>;
|
|
886
886
|
/**
|
|
887
887
|
* Sets the values to insert for an {@link Kysely.insertInto | insert} query.
|
|
888
888
|
*
|
|
@@ -62,7 +62,7 @@ import { ModifyColumnNode } from '../operation-node/modify-column-node.js';
|
|
|
62
62
|
import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
|
|
63
63
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
64
64
|
#private;
|
|
65
|
-
protected get
|
|
65
|
+
protected get numParameters(): number;
|
|
66
66
|
compileQuery(node: RootOperationNode): CompiledQuery;
|
|
67
67
|
protected getSql(): string;
|
|
68
68
|
protected visitSelectQuery(node: SelectQueryNode): void;
|
|
@@ -92,6 +92,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
92
92
|
protected visitTable(node: TableNode): void;
|
|
93
93
|
protected visitCreateTable(node: CreateTableNode): void;
|
|
94
94
|
protected visitColumnDefinition(node: ColumnDefinitionNode): void;
|
|
95
|
+
protected getAutoIncrement(): string;
|
|
95
96
|
protected visitReferences(node: ReferencesNode): void;
|
|
96
97
|
protected visitDropTable(node: DropTableNode): void;
|
|
97
98
|
protected visitDataType(node: DataTypeNode): void;
|
|
@@ -129,6 +130,6 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
129
130
|
protected getLeftIdentifierWrapper(): string;
|
|
130
131
|
protected getRightIdentifierWrapper(): string;
|
|
131
132
|
protected getCurrentParameterPlaceholder(): string;
|
|
132
|
-
protected
|
|
133
|
+
protected addParameter(parameter: any): void;
|
|
133
134
|
protected appendImmediateValue(value: PrimitiveValue): void;
|
|
134
135
|
}
|
|
@@ -1,25 +1,24 @@
|
|
|
1
|
-
import { DataTypeNode } from '../operation-node/data-type-node.js';
|
|
2
1
|
import { OperationNodeVisitor } from '../operation-node/operation-node-visitor.js';
|
|
3
2
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
4
3
|
import { RawNode } from '../operation-node/raw-node.js';
|
|
5
4
|
import { getLast, freeze, isString, isNumber, isBoolean, isNull, isDate, isBigInt, } from '../util/object-utils.js';
|
|
6
5
|
export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
get
|
|
10
|
-
return this.#
|
|
6
|
+
#sql = '';
|
|
7
|
+
#parameters = [];
|
|
8
|
+
get numParameters() {
|
|
9
|
+
return this.#parameters.length;
|
|
11
10
|
}
|
|
12
11
|
compileQuery(node) {
|
|
13
|
-
this.#
|
|
14
|
-
this.#
|
|
12
|
+
this.#sql = '';
|
|
13
|
+
this.#parameters = [];
|
|
15
14
|
this.visitNode(node);
|
|
16
15
|
return freeze({
|
|
17
16
|
sql: this.getSql(),
|
|
18
|
-
|
|
17
|
+
parameters: this.#parameters,
|
|
19
18
|
});
|
|
20
19
|
}
|
|
21
20
|
getSql() {
|
|
22
|
-
return this.#
|
|
21
|
+
return this.#sql;
|
|
23
22
|
}
|
|
24
23
|
visitSelectQuery(node) {
|
|
25
24
|
// This is a sub query if this is not the root node.
|
|
@@ -289,19 +288,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
289
288
|
visitColumnDefinition(node) {
|
|
290
289
|
this.visitNode(node.column);
|
|
291
290
|
this.append(' ');
|
|
292
|
-
|
|
293
|
-
// Postgres overrides the data type for autoincrementing columns.
|
|
294
|
-
if (DataTypeNode.is(node.dataType) &&
|
|
295
|
-
node.dataType.dataType === 'bigint') {
|
|
296
|
-
this.append('bigserial');
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
this.append('serial');
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
this.visitNode(node.dataType);
|
|
304
|
-
}
|
|
291
|
+
this.visitNode(node.dataType);
|
|
305
292
|
if (node.defaultTo) {
|
|
306
293
|
this.append(' default ');
|
|
307
294
|
this.visitNode(node.defaultTo);
|
|
@@ -309,6 +296,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
309
296
|
if (!node.isNullable) {
|
|
310
297
|
this.append(' not null');
|
|
311
298
|
}
|
|
299
|
+
if (node.isAutoIncrementing) {
|
|
300
|
+
this.append(' ');
|
|
301
|
+
this.append(this.getAutoIncrement());
|
|
302
|
+
}
|
|
312
303
|
if (node.isUnique) {
|
|
313
304
|
this.append(' unique');
|
|
314
305
|
}
|
|
@@ -324,6 +315,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
324
315
|
this.visitNode(node.check);
|
|
325
316
|
}
|
|
326
317
|
}
|
|
318
|
+
getAutoIncrement() {
|
|
319
|
+
return 'auto_increment';
|
|
320
|
+
}
|
|
327
321
|
visitReferences(node) {
|
|
328
322
|
this.append('references ');
|
|
329
323
|
this.visitNode(node.table);
|
|
@@ -634,10 +628,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
634
628
|
this.visitNode(node.constraintName);
|
|
635
629
|
}
|
|
636
630
|
append(str) {
|
|
637
|
-
this.#
|
|
631
|
+
this.#sql += str;
|
|
638
632
|
}
|
|
639
633
|
appendValue(value) {
|
|
640
|
-
this.
|
|
634
|
+
this.addParameter(value);
|
|
641
635
|
this.append(this.getCurrentParameterPlaceholder());
|
|
642
636
|
}
|
|
643
637
|
getLeftIdentifierWrapper() {
|
|
@@ -647,10 +641,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
647
641
|
return '"';
|
|
648
642
|
}
|
|
649
643
|
getCurrentParameterPlaceholder() {
|
|
650
|
-
return '$' + this.
|
|
644
|
+
return '$' + this.numParameters;
|
|
651
645
|
}
|
|
652
|
-
|
|
653
|
-
this.#
|
|
646
|
+
addParameter(parameter) {
|
|
647
|
+
this.#parameters.push(parameter);
|
|
654
648
|
}
|
|
655
649
|
appendImmediateValue(value) {
|
|
656
650
|
if (isString(value)) {
|
|
@@ -10,7 +10,7 @@ export declare class QueryCreator<DB> {
|
|
|
10
10
|
#private;
|
|
11
11
|
constructor(props: QueryCreatorProps);
|
|
12
12
|
/**
|
|
13
|
-
* Creates a `select` query builder
|
|
13
|
+
* Creates a `select` query builder for the given table or tables.
|
|
14
14
|
*
|
|
15
15
|
* The tables passed to this method are built as the query's `from` clause.
|
|
16
16
|
*
|
|
@@ -221,6 +221,9 @@ export declare class QueryCreator<DB> {
|
|
|
221
221
|
* Sets the schema to be used for all table references that don't explicitly
|
|
222
222
|
* specify a schema.
|
|
223
223
|
*
|
|
224
|
+
* This only affects the query created through the builder returned from
|
|
225
|
+
* this method and doesn't modify the `db` instance.
|
|
226
|
+
*
|
|
224
227
|
* @example
|
|
225
228
|
* ```
|
|
226
229
|
* await db.withSchema('mammals')
|
|
@@ -261,10 +264,10 @@ export declare class QueryCreator<DB> {
|
|
|
261
264
|
* Provides a way to pass arbitrary SQL into your query and executing completely
|
|
262
265
|
* raw queries.
|
|
263
266
|
*
|
|
264
|
-
* You can use strings `?` and `??` in the `sql` to bind parameters such as
|
|
267
|
+
* You can use the strings `?` and `??` in the `sql` to bind parameters such as
|
|
265
268
|
* user input to the SQL. You should never EVER concatenate untrusted user
|
|
266
269
|
* input to the SQL string to avoid injection vulnerabilities. Instead use `?`
|
|
267
|
-
* in place of
|
|
270
|
+
* in place of a value and pass the actual value in the `parameters` list. See
|
|
268
271
|
* the examples below.
|
|
269
272
|
*
|
|
270
273
|
* You should only use `raw` when there is no other way to get the job done. This is
|
|
@@ -276,11 +279,11 @@ export declare class QueryCreator<DB> {
|
|
|
276
279
|
* Raw builder instances can be passed to pretty much anywhere: `select`, `where`,
|
|
277
280
|
* `*Join`, `groupBy`, `orderBy` etc. Just try it. If the method accepts it, it works.
|
|
278
281
|
*
|
|
279
|
-
* @param sql - The raw SQL. Special strings `?` and `??` can be used
|
|
280
|
-
*
|
|
282
|
+
* @param sql - The raw SQL. Special strings `?` and `??` can be used as parameter
|
|
283
|
+
* placeholders. `?` for values and `??` for identifiers such as column names
|
|
281
284
|
* or `column.table` references.
|
|
282
285
|
*
|
|
283
|
-
* @param params - The parameters that will be bound to the `?` and `??`
|
|
286
|
+
* @param params - The parameters that will be bound to the `?` and `??` placeholders in
|
|
284
287
|
* the sql string.
|
|
285
288
|
*
|
|
286
289
|
* @example
|
|
@@ -318,7 +321,7 @@ export declare class QueryCreator<DB> {
|
|
|
318
321
|
* the output type. In this case you need to use the `castTo` method on the query
|
|
319
322
|
* to specify a return type for the query.
|
|
320
323
|
*
|
|
321
|
-
* We could've also used `??`
|
|
324
|
+
* We could've also used a `??` placeholder to provide `first_name` and `last_name` like
|
|
322
325
|
* this:
|
|
323
326
|
*
|
|
324
327
|
* ```ts
|
|
@@ -333,9 +336,9 @@ export declare class QueryCreator<DB> {
|
|
|
333
336
|
*
|
|
334
337
|
* But it's often cleaner to just write the column names in the SQL. Again remember to
|
|
335
338
|
* never concatenate column names or any other untrusted user input to the SQL string or you
|
|
336
|
-
* are going to create an injection vulnerability. All user input should go to the
|
|
339
|
+
* are going to create an injection vulnerability. All user input should go to the parameters
|
|
337
340
|
* array, never to the SQL string directly. But if the column names or values are trusted
|
|
338
|
-
* and known at compile time, there is no reason to use
|
|
341
|
+
* and known at compile time, there is no reason to use parameters.
|
|
339
342
|
*
|
|
340
343
|
* @example
|
|
341
344
|
* Example of using `raw` in `where`:
|
|
@@ -361,7 +364,7 @@ export declare class QueryCreator<DB> {
|
|
|
361
364
|
*
|
|
362
365
|
* The function in the above example returns people that are older than the given number of
|
|
363
366
|
* years. The number of years in this example is an untrusted user input, and therefore we use
|
|
364
|
-
* a `?`
|
|
367
|
+
* a `?` placeholder for it.
|
|
365
368
|
*
|
|
366
369
|
* @example
|
|
367
370
|
* Example of creating a completely raw query from scratch:
|
|
@@ -375,7 +378,7 @@ export declare class QueryCreator<DB> {
|
|
|
375
378
|
* The result of `execute()` method is always an array. In this case the type of
|
|
376
379
|
* the `persons` variable is `Person[]`.
|
|
377
380
|
*/
|
|
378
|
-
raw<T = unknown>(sql: string,
|
|
381
|
+
raw<T = unknown>(sql: string, parameters?: any[]): RawBuilder<T>;
|
|
379
382
|
}
|
|
380
383
|
export interface QueryCreatorProps {
|
|
381
384
|
readonly executor: QueryExecutor;
|
|
@@ -155,6 +155,9 @@ export class QueryCreator {
|
|
|
155
155
|
* Sets the schema to be used for all table references that don't explicitly
|
|
156
156
|
* specify a schema.
|
|
157
157
|
*
|
|
158
|
+
* This only affects the query created through the builder returned from
|
|
159
|
+
* this method and doesn't modify the `db` instance.
|
|
160
|
+
*
|
|
158
161
|
* @example
|
|
159
162
|
* ```
|
|
160
163
|
* await db.withSchema('mammals')
|
|
@@ -200,10 +203,10 @@ export class QueryCreator {
|
|
|
200
203
|
* Provides a way to pass arbitrary SQL into your query and executing completely
|
|
201
204
|
* raw queries.
|
|
202
205
|
*
|
|
203
|
-
* You can use strings `?` and `??` in the `sql` to bind parameters such as
|
|
206
|
+
* You can use the strings `?` and `??` in the `sql` to bind parameters such as
|
|
204
207
|
* user input to the SQL. You should never EVER concatenate untrusted user
|
|
205
208
|
* input to the SQL string to avoid injection vulnerabilities. Instead use `?`
|
|
206
|
-
* in place of
|
|
209
|
+
* in place of a value and pass the actual value in the `parameters` list. See
|
|
207
210
|
* the examples below.
|
|
208
211
|
*
|
|
209
212
|
* You should only use `raw` when there is no other way to get the job done. This is
|
|
@@ -215,11 +218,11 @@ export class QueryCreator {
|
|
|
215
218
|
* Raw builder instances can be passed to pretty much anywhere: `select`, `where`,
|
|
216
219
|
* `*Join`, `groupBy`, `orderBy` etc. Just try it. If the method accepts it, it works.
|
|
217
220
|
*
|
|
218
|
-
* @param sql - The raw SQL. Special strings `?` and `??` can be used
|
|
219
|
-
*
|
|
221
|
+
* @param sql - The raw SQL. Special strings `?` and `??` can be used as parameter
|
|
222
|
+
* placeholders. `?` for values and `??` for identifiers such as column names
|
|
220
223
|
* or `column.table` references.
|
|
221
224
|
*
|
|
222
|
-
* @param params - The parameters that will be bound to the `?` and `??`
|
|
225
|
+
* @param params - The parameters that will be bound to the `?` and `??` placeholders in
|
|
223
226
|
* the sql string.
|
|
224
227
|
*
|
|
225
228
|
* @example
|
|
@@ -257,7 +260,7 @@ export class QueryCreator {
|
|
|
257
260
|
* the output type. In this case you need to use the `castTo` method on the query
|
|
258
261
|
* to specify a return type for the query.
|
|
259
262
|
*
|
|
260
|
-
* We could've also used `??`
|
|
263
|
+
* We could've also used a `??` placeholder to provide `first_name` and `last_name` like
|
|
261
264
|
* this:
|
|
262
265
|
*
|
|
263
266
|
* ```ts
|
|
@@ -272,9 +275,9 @@ export class QueryCreator {
|
|
|
272
275
|
*
|
|
273
276
|
* But it's often cleaner to just write the column names in the SQL. Again remember to
|
|
274
277
|
* never concatenate column names or any other untrusted user input to the SQL string or you
|
|
275
|
-
* are going to create an injection vulnerability. All user input should go to the
|
|
278
|
+
* are going to create an injection vulnerability. All user input should go to the parameters
|
|
276
279
|
* array, never to the SQL string directly. But if the column names or values are trusted
|
|
277
|
-
* and known at compile time, there is no reason to use
|
|
280
|
+
* and known at compile time, there is no reason to use parameters.
|
|
278
281
|
*
|
|
279
282
|
* @example
|
|
280
283
|
* Example of using `raw` in `where`:
|
|
@@ -300,7 +303,7 @@ export class QueryCreator {
|
|
|
300
303
|
*
|
|
301
304
|
* The function in the above example returns people that are older than the given number of
|
|
302
305
|
* years. The number of years in this example is an untrusted user input, and therefore we use
|
|
303
|
-
* a `?`
|
|
306
|
+
* a `?` placeholder for it.
|
|
304
307
|
*
|
|
305
308
|
* @example
|
|
306
309
|
* Example of creating a completely raw query from scratch:
|
|
@@ -314,12 +317,12 @@ export class QueryCreator {
|
|
|
314
317
|
* The result of `execute()` method is always an array. In this case the type of
|
|
315
318
|
* the `persons` variable is `Person[]`.
|
|
316
319
|
*/
|
|
317
|
-
raw(sql,
|
|
320
|
+
raw(sql, parameters) {
|
|
318
321
|
return new RawBuilder({
|
|
319
322
|
queryId: createQueryId(),
|
|
320
323
|
executor: this.#props.executor,
|
|
321
324
|
sql,
|
|
322
|
-
|
|
325
|
+
parameters,
|
|
323
326
|
});
|
|
324
327
|
}
|
|
325
328
|
}
|
|
@@ -25,24 +25,24 @@ export class RawBuilder {
|
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
27
|
toOperationNode() {
|
|
28
|
-
const
|
|
28
|
+
const parameterPlaceholderRegex = /(\?\??)/g;
|
|
29
29
|
const sql = this.#props.sql;
|
|
30
|
-
const
|
|
30
|
+
const parameters = this.#props.parameters ?? [];
|
|
31
31
|
const sqlFragments = [];
|
|
32
32
|
const argNodes = [];
|
|
33
33
|
let paramIdx = 0;
|
|
34
34
|
let sqlIdx = 0;
|
|
35
35
|
let match = null;
|
|
36
|
-
while ((match =
|
|
36
|
+
while ((match = parameterPlaceholderRegex.exec(sql))) {
|
|
37
37
|
const str = match[1];
|
|
38
|
-
if (paramIdx >=
|
|
39
|
-
throw new Error(`value not provided for all
|
|
38
|
+
if (paramIdx >= parameters.length) {
|
|
39
|
+
throw new Error(`value not provided for all placeholders in string ${sql}`);
|
|
40
40
|
}
|
|
41
41
|
if (match.index > 0 && sql[match.index - 1] === '\\') {
|
|
42
42
|
continue;
|
|
43
43
|
}
|
|
44
44
|
sqlFragments.push(sql.slice(sqlIdx, match.index).replaceAll('\\?', '?'));
|
|
45
|
-
argNodes.push(parseRawArg(str,
|
|
45
|
+
argNodes.push(parseRawArg(str, parameters[paramIdx]));
|
|
46
46
|
sqlIdx = match.index + str.length;
|
|
47
47
|
++paramIdx;
|
|
48
48
|
}
|
|
@@ -12,6 +12,9 @@ import { QueryId } from '../util/query-id.js';
|
|
|
12
12
|
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
13
13
|
import { DataTypeExpression } from '../parser/data-type-parser.js';
|
|
14
14
|
import { ForeignKeyConstraintBuilder, ForeignKeyConstraintBuilderInterface } from './foreign-key-constraint-builder.js';
|
|
15
|
+
/**
|
|
16
|
+
* This builder can be used to create a `alter table` query.
|
|
17
|
+
*/
|
|
15
18
|
export declare class AlterTableBuilder {
|
|
16
19
|
#private;
|
|
17
20
|
constructor(props: AlterTableBuilderProps);
|
|
@@ -20,6 +20,9 @@ import { UniqueConstraintNode } from '../operation-node/unique-constraint-node.j
|
|
|
20
20
|
import { CheckConstraintNode } from '../operation-node/check-constraint-node.js';
|
|
21
21
|
import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constraint-node.js';
|
|
22
22
|
import { ColumnNode } from '../operation-node/column-node.js';
|
|
23
|
+
/**
|
|
24
|
+
* This builder can be used to create a `alter table` query.
|
|
25
|
+
*/
|
|
23
26
|
export class AlterTableBuilder {
|
|
24
27
|
#props;
|
|
25
28
|
constructor(props) {
|
|
@@ -6,11 +6,11 @@ import { AnyRawBuilder } from '../util/type-utils.js';
|
|
|
6
6
|
import { DefaultValueExpression } from '../parser/default-value-parser.js';
|
|
7
7
|
export interface ColumnDefinitionBuilderInterface<R> {
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Adds `auto_increment` or `autoincrement` to the column definition
|
|
10
|
+
* depending on the dialect.
|
|
10
11
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* have specified before.
|
|
12
|
+
* Some dialects like PostgreSQL don't support this. On PostgreSQL
|
|
13
|
+
* you can use the `serial` or `bigserial` data type instead.
|
|
14
14
|
*/
|
|
15
15
|
increments(): R;
|
|
16
16
|
/**
|
|
@@ -23,6 +23,10 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
23
23
|
/**
|
|
24
24
|
* Adds a foreign key constraint for the column.
|
|
25
25
|
*
|
|
26
|
+
* If your database engine doesn't support foreign key constraints in the
|
|
27
|
+
* column definition (like MySQL 5) you need to call the table level
|
|
28
|
+
* {@link TableBuilder.addForeignKeyConstraint} method instead.
|
|
29
|
+
*
|
|
26
30
|
* @example
|
|
27
31
|
* ```ts
|
|
28
32
|
* col.references('person.id')
|
|
@@ -31,6 +35,11 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
31
35
|
references(ref: string): R;
|
|
32
36
|
/**
|
|
33
37
|
* Adds an `on delete` constraint for the foreign key column.
|
|
38
|
+
*
|
|
39
|
+
* If your database engine doesn't support foreign key constraints in the
|
|
40
|
+
* column definition (like MySQL 5) you need to call the table level
|
|
41
|
+
* {@link TableBuilder.addForeignKeyConstraint} method instead.
|
|
42
|
+
*
|
|
34
43
|
*/
|
|
35
44
|
onDelete(onDelete: OnModifyForeignAction): R;
|
|
36
45
|
/**
|
|
@@ -64,7 +73,7 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
64
73
|
* ```ts
|
|
65
74
|
* db.schema
|
|
66
75
|
* .createTable('pet')
|
|
67
|
-
* .addColumn('number_of_legs', (col) => col.check('number_of_legs < 5'
|
|
76
|
+
* .addColumn('number_of_legs', 'integer', (col) => col.check('number_of_legs < 5'))
|
|
68
77
|
* .execute()
|
|
69
78
|
* ```
|
|
70
79
|
*/
|