kysely 0.19.4 → 0.19.7
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/dist/cjs/dialect/database-introspector.d.ts +11 -2
- package/dist/cjs/dialect/mysql/mysql-introspector.js +4 -0
- package/dist/cjs/dialect/postgres/postgres-introspector.js +12 -0
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +17 -2
- package/dist/cjs/operation-node/join-node.d.ts +1 -1
- package/dist/cjs/operation-node/operation-node-transformer.js +3 -0
- package/dist/cjs/parser/join-parser.d.ts +4 -4
- package/dist/cjs/parser/table-parser.d.ts +5 -5
- package/dist/cjs/query-builder/expression-builder.d.ts +3 -3
- package/dist/cjs/query-builder/join-builder.d.ts +4 -0
- package/dist/cjs/query-builder/join-builder.js +10 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +40 -0
- package/dist/cjs/query-builder/select-query-builder.js +12 -0
- package/dist/cjs/query-builder/update-query-builder.d.ts +3 -3
- package/dist/cjs/query-compiler/default-query-compiler.js +2 -0
- package/dist/cjs/query-creator.d.ts +5 -5
- package/dist/esm/dialect/database-introspector.d.ts +11 -2
- package/dist/esm/dialect/mysql/mysql-introspector.js +4 -0
- package/dist/esm/dialect/postgres/postgres-introspector.js +12 -0
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +17 -2
- package/dist/esm/operation-node/join-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.js +3 -0
- package/dist/esm/parser/join-parser.d.ts +4 -4
- package/dist/esm/parser/table-parser.d.ts +5 -5
- package/dist/esm/query-builder/expression-builder.d.ts +3 -3
- package/dist/esm/query-builder/join-builder.d.ts +4 -0
- package/dist/esm/query-builder/join-builder.js +10 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +40 -0
- package/dist/esm/query-builder/select-query-builder.js +12 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +3 -3
- package/dist/esm/query-compiler/default-query-compiler.js +2 -0
- package/dist/esm/query-creator.d.ts +5 -5
- package/package.json +1 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ColumnDataType } from '../operation-node/data-type-node.js';
|
|
2
1
|
/**
|
|
3
2
|
* An interface for getting the database metadata (names of the tables and columns etc.)
|
|
4
3
|
*/
|
|
@@ -41,6 +40,16 @@ export interface TableMetadata {
|
|
|
41
40
|
}
|
|
42
41
|
export interface ColumnMetadata {
|
|
43
42
|
readonly name: string;
|
|
44
|
-
|
|
43
|
+
/**
|
|
44
|
+
* The data type of the column as reported by the database.
|
|
45
|
+
*
|
|
46
|
+
* NOTE: This value is whatever the database engine returns and it will be
|
|
47
|
+
* different on different dialects even if you run the same migrations.
|
|
48
|
+
* For example `integer` datatype in a migration will produce `int4`
|
|
49
|
+
* on PostgreSQL, `INTEGER` on SQLite and `int` on MySQL.
|
|
50
|
+
*/
|
|
51
|
+
readonly dataType: string;
|
|
52
|
+
readonly isAutoIncrementing: boolean;
|
|
45
53
|
readonly isNullable: boolean;
|
|
54
|
+
readonly hasDefaultValue: boolean;
|
|
46
55
|
}
|
|
@@ -22,10 +22,12 @@ class MysqlIntrospector {
|
|
|
22
22
|
.selectFrom('information_schema.columns')
|
|
23
23
|
.select([
|
|
24
24
|
'column_name',
|
|
25
|
+
'column_default',
|
|
25
26
|
'table_name',
|
|
26
27
|
'table_schema',
|
|
27
28
|
'is_nullable',
|
|
28
29
|
'data_type',
|
|
30
|
+
'extra',
|
|
29
31
|
])
|
|
30
32
|
.where('table_schema', '=', (0, sql_js_1.sql) `database()`)
|
|
31
33
|
.castTo();
|
|
@@ -57,6 +59,8 @@ class MysqlIntrospector {
|
|
|
57
59
|
name: it.COLUMN_NAME,
|
|
58
60
|
dataType: it.DATA_TYPE,
|
|
59
61
|
isNullable: it.IS_NULLABLE === 'YES',
|
|
62
|
+
isAutoIncrementing: it.EXTRA.toLowerCase().includes('auto_increment'),
|
|
63
|
+
hasDefaultValue: it.COLUMN_DEFAULT !== null,
|
|
60
64
|
}));
|
|
61
65
|
return tables;
|
|
62
66
|
}, []);
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.PostgresIntrospector = void 0;
|
|
4
4
|
const migrator_js_1 = require("../../migration/migrator.js");
|
|
5
5
|
const object_utils_js_1 = require("../../util/object-utils.js");
|
|
6
|
+
const sql_js_1 = require("../../raw-builder/sql.js");
|
|
6
7
|
class PostgresIntrospector {
|
|
7
8
|
#db;
|
|
8
9
|
constructor(db) {
|
|
@@ -25,9 +26,18 @@ class PostgresIntrospector {
|
|
|
25
26
|
.select([
|
|
26
27
|
'a.attname as column',
|
|
27
28
|
'a.attnotnull as not_null',
|
|
29
|
+
'a.atthasdef as has_default',
|
|
28
30
|
't.tablename as table',
|
|
29
31
|
't.schemaname as schema',
|
|
30
32
|
'typ.typname as type',
|
|
33
|
+
// Detect if the column is auto incrementing by finding the sequence
|
|
34
|
+
// that is created for `serial` and `bigserial` columns.
|
|
35
|
+
this.#db
|
|
36
|
+
.selectFrom('pg_class')
|
|
37
|
+
.select((0, sql_js_1.sql) `true`.as('auto_incrementing'))
|
|
38
|
+
.where('relkind', '=', 'S')
|
|
39
|
+
.where('relname', '=', (0, sql_js_1.sql) `t.tablename || '_' || a.attname || '_seq'`)
|
|
40
|
+
.as('auto_incrementing'),
|
|
31
41
|
])
|
|
32
42
|
.where('t.schemaname', '!~', '^pg_')
|
|
33
43
|
.where('t.schemaname', '!=', 'information_schema')
|
|
@@ -62,6 +72,8 @@ class PostgresIntrospector {
|
|
|
62
72
|
name: it.column,
|
|
63
73
|
dataType: it.type,
|
|
64
74
|
isNullable: !it.not_null,
|
|
75
|
+
isAutoIncrementing: !!it.auto_incrementing,
|
|
76
|
+
hasDefaultValue: it.has_default,
|
|
65
77
|
}));
|
|
66
78
|
return tables;
|
|
67
79
|
}, []);
|
|
@@ -34,9 +34,22 @@ class SqliteIntrospector {
|
|
|
34
34
|
}
|
|
35
35
|
async #getTableMetadata(table) {
|
|
36
36
|
const db = this.#db;
|
|
37
|
+
// Get the SQL that was used to create the table.
|
|
38
|
+
const createSql = await db
|
|
39
|
+
.selectFrom('sqlite_master')
|
|
40
|
+
.where('name', '=', table)
|
|
41
|
+
.select('sql')
|
|
42
|
+
.castTo()
|
|
43
|
+
.execute();
|
|
44
|
+
// Try to find the name of the column that has `autoincrement` 🤦
|
|
45
|
+
const autoIncrementCol = createSql[0]?.sql
|
|
46
|
+
?.split(/[\(\),]/)
|
|
47
|
+
?.find((it) => it.toLowerCase().includes('autoincrement'))
|
|
48
|
+
?.split(/\s+/)?.[0]
|
|
49
|
+
?.replace(/["`]/g, '');
|
|
37
50
|
const columns = await db
|
|
38
|
-
.selectFrom((0, sql_js_1.sql) `
|
|
39
|
-
.select(['name', 'type', 'notnull'])
|
|
51
|
+
.selectFrom((0, sql_js_1.sql) `pragma_table_info(${table})`.as('table_info'))
|
|
52
|
+
.select(['name', 'type', 'notnull', 'dflt_value'])
|
|
40
53
|
.execute();
|
|
41
54
|
return {
|
|
42
55
|
name: table,
|
|
@@ -44,6 +57,8 @@ class SqliteIntrospector {
|
|
|
44
57
|
name: col.name,
|
|
45
58
|
dataType: col.type,
|
|
46
59
|
isNullable: !col.notnull,
|
|
60
|
+
isAutoIncrementing: col.name === autoIncrementCol,
|
|
61
|
+
hasDefaultValue: !!col.dflt_value,
|
|
47
62
|
})),
|
|
48
63
|
};
|
|
49
64
|
}
|
|
@@ -4,7 +4,7 @@ import { FilterExpressionNode } from './operation-node-utils.js';
|
|
|
4
4
|
import { OperationNode } from './operation-node.js';
|
|
5
5
|
import { TableNode } from './table-node.js';
|
|
6
6
|
export declare type JoinTableNode = TableNode | AliasNode;
|
|
7
|
-
export declare type JoinType = 'InnerJoin' | 'LeftJoin' | 'RightJoin' | 'FullJoin';
|
|
7
|
+
export declare type JoinType = 'InnerJoin' | 'LeftJoin' | 'RightJoin' | 'FullJoin' | 'LateralInnerJoin' | 'LateralLeftJoin';
|
|
8
8
|
export interface JoinNode extends OperationNode {
|
|
9
9
|
readonly kind: 'JoinNode';
|
|
10
10
|
readonly joinType: JoinType;
|
|
@@ -256,6 +256,8 @@ class OperationNodeTransformer {
|
|
|
256
256
|
where: this.transformNode(node.where),
|
|
257
257
|
returning: this.transformNode(node.returning),
|
|
258
258
|
with: this.transformNode(node.with),
|
|
259
|
+
orderBy: this.transformNode(node.orderBy),
|
|
260
|
+
limit: this.transformNode(node.limit),
|
|
259
261
|
};
|
|
260
262
|
}
|
|
261
263
|
transformReturning(node) {
|
|
@@ -480,6 +482,7 @@ class OperationNodeTransformer {
|
|
|
480
482
|
return {
|
|
481
483
|
kind: 'CreateSchemaNode',
|
|
482
484
|
schema: this.transformNode(node.schema),
|
|
485
|
+
ifNotExists: node.ifNotExists,
|
|
483
486
|
};
|
|
484
487
|
}
|
|
485
488
|
transformDropSchema(node) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { JoinNode, JoinType } from '../operation-node/join-node.js';
|
|
2
2
|
import { AnyColumn, AnyColumnWithTable } from '../util/type-utils.js';
|
|
3
|
-
import {
|
|
3
|
+
import { From, FromTables } from './table-parser.js';
|
|
4
4
|
import { JoinBuilder } from '../query-builder/join-builder.js';
|
|
5
5
|
export declare type JoinReferenceExpression<DB, TB extends keyof DB, TE> = AnyJoinColumn<DB, TB, TE> | AnyJoinColumnWithTable<DB, TB, TE>;
|
|
6
|
-
export declare type JoinCallbackExpression<DB, TB extends keyof DB, TE> = (join: JoinBuilder<
|
|
7
|
-
declare type AnyJoinColumn<DB, TB extends keyof DB, TE> = AnyColumn<
|
|
8
|
-
declare type AnyJoinColumnWithTable<DB, TB extends keyof DB, TE> = AnyColumnWithTable<
|
|
6
|
+
export declare type JoinCallbackExpression<DB, TB extends keyof DB, TE> = (join: JoinBuilder<From<DB, TE>, FromTables<DB, TB, TE>>) => JoinBuilder<any, any>;
|
|
7
|
+
declare type AnyJoinColumn<DB, TB extends keyof DB, TE> = AnyColumn<From<DB, TE>, FromTables<DB, TB, TE>>;
|
|
8
|
+
declare type AnyJoinColumnWithTable<DB, TB extends keyof DB, TE> = AnyColumnWithTable<From<DB, TE>, FromTables<DB, TB, TE>>;
|
|
9
9
|
export declare function parseJoin(joinType: JoinType, args: any[]): JoinNode;
|
|
10
10
|
export {};
|
|
@@ -7,12 +7,12 @@ import { AliasedComplexExpression } from './complex-expression-parser.js';
|
|
|
7
7
|
export declare type TableExpression<DB, TB extends keyof DB> = TableReference<DB> | AliasedComplexExpression<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> | AnyTable<DB> | AnyAliasedRawBuilder;
|
|
10
|
-
export declare type
|
|
11
|
-
[C in keyof DB |
|
|
10
|
+
export declare type From<DB, TE> = {
|
|
11
|
+
[C in keyof DB | ExtractAliasFromTableExpression<DB, TE>]: C extends ExtractAliasFromTableExpression<DB, TE> ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? DB[C] : never;
|
|
12
12
|
};
|
|
13
|
-
export declare type
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
export declare type FromTables<DB, TB extends keyof DB, TE> = TB | ExtractAliasFromTableExpression<DB, TE>;
|
|
14
|
+
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;
|
|
15
|
+
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 : TE extends (qb: any) => AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : never;
|
|
16
16
|
declare type AnyAliasedTable<DB> = `${AnyTable<DB>} as ${string}`;
|
|
17
17
|
declare type AnyTable<DB> = keyof DB & string;
|
|
18
18
|
export declare function parseTableExpressionOrList(table: TableExpressionOrList<any, any>): TableExpressionNode[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SelectQueryBuilder } from './select-query-builder.js';
|
|
2
|
-
import { TableExpression,
|
|
2
|
+
import { TableExpression, From, FromTables } from '../parser/table-parser.js';
|
|
3
3
|
import { FunctionBuilder } from './function-builder.js';
|
|
4
4
|
import { ExtractTypeFromReferenceExpression, StringReference } from '../parser/reference-parser.js';
|
|
5
5
|
import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
@@ -83,8 +83,8 @@ export declare class ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
83
83
|
* that case Kysely typings wouldn't allow you to reference `pet.owner_id`
|
|
84
84
|
* because `pet` is not joined to that query.
|
|
85
85
|
*/
|
|
86
|
-
selectFrom<TE extends TableExpression<DB, TB>>(from: TE[]): SelectQueryBuilder<
|
|
87
|
-
selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<
|
|
86
|
+
selectFrom<TE extends TableExpression<DB, TB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
87
|
+
selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
88
88
|
/**
|
|
89
89
|
* See {@link QueryCreator.withSchema}
|
|
90
90
|
*/
|
|
@@ -66,6 +66,10 @@ export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNo
|
|
|
66
66
|
* See {@link WhereInterface.orWhereNotExists} for documentation and examples.
|
|
67
67
|
*/
|
|
68
68
|
orOnNotExists(arg: ExistsExpression<DB, TB>): JoinBuilder<DB, TB>;
|
|
69
|
+
/**
|
|
70
|
+
* Adds `on true`.
|
|
71
|
+
*/
|
|
72
|
+
onTrue(): JoinBuilder<DB, TB>;
|
|
69
73
|
toOperationNode(): JoinNode;
|
|
70
74
|
}
|
|
71
75
|
export interface JoinBuilderProps {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.JoinBuilder = void 0;
|
|
4
4
|
const join_node_js_1 = require("../operation-node/join-node.js");
|
|
5
|
+
const raw_node_js_1 = require("../operation-node/raw-node.js");
|
|
5
6
|
const filter_parser_js_1 = require("../parser/filter-parser.js");
|
|
6
7
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
7
8
|
const prevent_await_js_1 = require("../util/prevent-await.js");
|
|
@@ -94,6 +95,15 @@ class JoinBuilder {
|
|
|
94
95
|
joinNode: join_node_js_1.JoinNode.cloneWithOrOn(this.#props.joinNode, (0, filter_parser_js_1.parseNotExistFilter)(arg)),
|
|
95
96
|
});
|
|
96
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Adds `on true`.
|
|
100
|
+
*/
|
|
101
|
+
onTrue() {
|
|
102
|
+
return new JoinBuilder({
|
|
103
|
+
...this.#props,
|
|
104
|
+
joinNode: join_node_js_1.JoinNode.cloneWithOn(this.#props.joinNode, raw_node_js_1.RawNode.createWithSql('true')),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
97
107
|
toOperationNode() {
|
|
98
108
|
return this.#props.joinNode;
|
|
99
109
|
}
|
|
@@ -873,6 +873,46 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
873
873
|
*/
|
|
874
874
|
fullJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): SelectQueryBuilderWithFullJoin<DB, TB, O, TE>;
|
|
875
875
|
fullJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): SelectQueryBuilderWithFullJoin<DB, TB, O, TE>;
|
|
876
|
+
/**
|
|
877
|
+
* Just like {@link innerJoin} but adds a lateral join instead of an inner join.
|
|
878
|
+
*
|
|
879
|
+
* ### Examples
|
|
880
|
+
*
|
|
881
|
+
* ```ts
|
|
882
|
+
* db.selectFrom('person')
|
|
883
|
+
* .innerJoinLateral(
|
|
884
|
+
* (eb) =>
|
|
885
|
+
* eb.selectFrom('pet')
|
|
886
|
+
* .select('name')
|
|
887
|
+
* .whereRef('pet.owner_id', '=', 'person.id')
|
|
888
|
+
* .as('p'),
|
|
889
|
+
* (join) => join.onTrue()
|
|
890
|
+
* )
|
|
891
|
+
* .select(['first_name', 'p.name'])
|
|
892
|
+
* .orderBy('first_name')
|
|
893
|
+
*/
|
|
894
|
+
innerJoinLateral<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): SelectQueryBuilderWithInnerJoin<DB, TB, O, TE>;
|
|
895
|
+
innerJoinLateral<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): SelectQueryBuilderWithInnerJoin<DB, TB, O, TE>;
|
|
896
|
+
/**
|
|
897
|
+
* Just like {@link innerJoin} but adds a lateral left join instead of an inner join.
|
|
898
|
+
* ### Examples
|
|
899
|
+
*
|
|
900
|
+
* ```ts
|
|
901
|
+
* db.selectFrom('person')
|
|
902
|
+
* .leftJoinLateral(
|
|
903
|
+
* (eb) =>
|
|
904
|
+
* eb.selectFrom('pet')
|
|
905
|
+
* .select('name')
|
|
906
|
+
* .whereRef('pet.owner_id', '=', 'person.id')
|
|
907
|
+
* .as('p'),
|
|
908
|
+
* (join) => join.onTrue()
|
|
909
|
+
* )
|
|
910
|
+
* .select(['first_name', 'p.name'])
|
|
911
|
+
* .orderBy('first_name')
|
|
912
|
+
* ```
|
|
913
|
+
*/
|
|
914
|
+
leftJoinLateral<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): SelectQueryBuilderWithLeftJoin<DB, TB, O, TE>;
|
|
915
|
+
leftJoinLateral<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): SelectQueryBuilderWithLeftJoin<DB, TB, O, TE>;
|
|
876
916
|
/**
|
|
877
917
|
* Adds an `order by` clause to the query.
|
|
878
918
|
*
|
|
@@ -237,6 +237,18 @@ class SelectQueryBuilder {
|
|
|
237
237
|
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('FullJoin', args)),
|
|
238
238
|
});
|
|
239
239
|
}
|
|
240
|
+
innerJoinLateral(...args) {
|
|
241
|
+
return new SelectQueryBuilder({
|
|
242
|
+
...this.#props,
|
|
243
|
+
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('LateralInnerJoin', args)),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
leftJoinLateral(...args) {
|
|
247
|
+
return new SelectQueryBuilder({
|
|
248
|
+
...this.#props,
|
|
249
|
+
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('LateralLeftJoin', args)),
|
|
250
|
+
});
|
|
251
|
+
}
|
|
240
252
|
/**
|
|
241
253
|
* Adds an `order by` clause to the query.
|
|
242
254
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
2
2
|
import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
3
3
|
import { JoinCallbackExpression, JoinReferenceExpression } from '../parser/join-parser.js';
|
|
4
|
-
import { TableExpression,
|
|
4
|
+
import { TableExpression, From, FromTables } from '../parser/table-parser.js';
|
|
5
5
|
import { SelectExpression } from '../parser/select-parser.js';
|
|
6
6
|
import { ExistsExpression, FilterOperator, FilterValueExpressionOrList, WhereGrouper } from '../parser/filter-parser.js';
|
|
7
7
|
import { ReturningRow } from '../parser/returning-parser.js';
|
|
@@ -434,8 +434,8 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
434
434
|
* where "pet"."owner_id" = "person"."id"
|
|
435
435
|
* ```
|
|
436
436
|
*/
|
|
437
|
-
from<TE extends TableExpression<DB, TB>>(table: TE): UpdateQueryBuilder<
|
|
438
|
-
from<TE extends TableExpression<DB, TB>>(table: TE[]): UpdateQueryBuilder<
|
|
437
|
+
from<TE extends TableExpression<DB, TB>>(table: TE): UpdateQueryBuilder<From<DB, TE>, UT, FromTables<DB, TB, TE>, O>;
|
|
438
|
+
from<TE extends TableExpression<DB, TB>>(table: TE[]): UpdateQueryBuilder<From<DB, TE>, UT, FromTables<DB, TB, TE>, O>;
|
|
439
439
|
/**
|
|
440
440
|
* Joins another table to the query using an inner join.
|
|
441
441
|
*
|
|
@@ -2,7 +2,7 @@ import { SelectQueryBuilder } from './query-builder/select-query-builder.js';
|
|
|
2
2
|
import { InsertQueryBuilder } from './query-builder/insert-query-builder.js';
|
|
3
3
|
import { DeleteQueryBuilder } from './query-builder/delete-query-builder.js';
|
|
4
4
|
import { UpdateQueryBuilder } from './query-builder/update-query-builder.js';
|
|
5
|
-
import { TableExpression,
|
|
5
|
+
import { TableExpression, From, FromTables, TableReference } from './parser/table-parser.js';
|
|
6
6
|
import { QueryExecutor } from './query-executor/query-executor.js';
|
|
7
7
|
import { CommonTableExpression, QueryCreatorWithCommonTableExpression, RecursiveCommonTableExpression } from './parser/with-parser.js';
|
|
8
8
|
import { WithNode } from './operation-node/with-node.js';
|
|
@@ -120,8 +120,8 @@ export declare class QueryCreator<DB> {
|
|
|
120
120
|
* (select 1 as one) as "q"
|
|
121
121
|
* ```
|
|
122
122
|
*/
|
|
123
|
-
selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE[]): SelectQueryBuilder<
|
|
124
|
-
selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<
|
|
123
|
+
selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
|
|
124
|
+
selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
|
|
125
125
|
/**
|
|
126
126
|
* Creates an insert query.
|
|
127
127
|
*
|
|
@@ -180,7 +180,7 @@ export declare class QueryCreator<DB> {
|
|
|
180
180
|
* console.log(result.numDeletedRows)
|
|
181
181
|
* ```
|
|
182
182
|
*/
|
|
183
|
-
deleteFrom<TR extends TableReference<DB>>(table: TR): DeleteQueryBuilder<
|
|
183
|
+
deleteFrom<TR extends TableReference<DB>>(table: TR): DeleteQueryBuilder<From<DB, TR>, FromTables<DB, never, TR>, DeleteResult>;
|
|
184
184
|
/**
|
|
185
185
|
* Creates an update query.
|
|
186
186
|
*
|
|
@@ -204,7 +204,7 @@ export declare class QueryCreator<DB> {
|
|
|
204
204
|
* console.log(result.numUpdatedRows)
|
|
205
205
|
* ```
|
|
206
206
|
*/
|
|
207
|
-
updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<
|
|
207
|
+
updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<From<DB, TR>, FromTables<DB, never, TR>, FromTables<DB, never, TR>, UpdateResult>;
|
|
208
208
|
/**
|
|
209
209
|
* Creates a `with` query (Common Table Expression).
|
|
210
210
|
*
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ColumnDataType } from '../operation-node/data-type-node.js';
|
|
2
1
|
/**
|
|
3
2
|
* An interface for getting the database metadata (names of the tables and columns etc.)
|
|
4
3
|
*/
|
|
@@ -41,6 +40,16 @@ export interface TableMetadata {
|
|
|
41
40
|
}
|
|
42
41
|
export interface ColumnMetadata {
|
|
43
42
|
readonly name: string;
|
|
44
|
-
|
|
43
|
+
/**
|
|
44
|
+
* The data type of the column as reported by the database.
|
|
45
|
+
*
|
|
46
|
+
* NOTE: This value is whatever the database engine returns and it will be
|
|
47
|
+
* different on different dialects even if you run the same migrations.
|
|
48
|
+
* For example `integer` datatype in a migration will produce `int4`
|
|
49
|
+
* on PostgreSQL, `INTEGER` on SQLite and `int` on MySQL.
|
|
50
|
+
*/
|
|
51
|
+
readonly dataType: string;
|
|
52
|
+
readonly isAutoIncrementing: boolean;
|
|
45
53
|
readonly isNullable: boolean;
|
|
54
|
+
readonly hasDefaultValue: boolean;
|
|
46
55
|
}
|
|
@@ -20,10 +20,12 @@ export class MysqlIntrospector {
|
|
|
20
20
|
.selectFrom('information_schema.columns')
|
|
21
21
|
.select([
|
|
22
22
|
'column_name',
|
|
23
|
+
'column_default',
|
|
23
24
|
'table_name',
|
|
24
25
|
'table_schema',
|
|
25
26
|
'is_nullable',
|
|
26
27
|
'data_type',
|
|
28
|
+
'extra',
|
|
27
29
|
])
|
|
28
30
|
.where('table_schema', '=', sql `database()`)
|
|
29
31
|
.castTo();
|
|
@@ -55,6 +57,8 @@ export class MysqlIntrospector {
|
|
|
55
57
|
name: it.COLUMN_NAME,
|
|
56
58
|
dataType: it.DATA_TYPE,
|
|
57
59
|
isNullable: it.IS_NULLABLE === 'YES',
|
|
60
|
+
isAutoIncrementing: it.EXTRA.toLowerCase().includes('auto_increment'),
|
|
61
|
+
hasDefaultValue: it.COLUMN_DEFAULT !== null,
|
|
58
62
|
}));
|
|
59
63
|
return tables;
|
|
60
64
|
}, []);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="./postgres-introspector.d.ts" />
|
|
2
2
|
import { DEFAULT_MIGRATION_LOCK_TABLE, DEFAULT_MIGRATION_TABLE, } from '../../migration/migrator.js';
|
|
3
3
|
import { freeze } from '../../util/object-utils.js';
|
|
4
|
+
import { sql } from '../../raw-builder/sql.js';
|
|
4
5
|
export class PostgresIntrospector {
|
|
5
6
|
#db;
|
|
6
7
|
constructor(db) {
|
|
@@ -23,9 +24,18 @@ export class PostgresIntrospector {
|
|
|
23
24
|
.select([
|
|
24
25
|
'a.attname as column',
|
|
25
26
|
'a.attnotnull as not_null',
|
|
27
|
+
'a.atthasdef as has_default',
|
|
26
28
|
't.tablename as table',
|
|
27
29
|
't.schemaname as schema',
|
|
28
30
|
'typ.typname as type',
|
|
31
|
+
// Detect if the column is auto incrementing by finding the sequence
|
|
32
|
+
// that is created for `serial` and `bigserial` columns.
|
|
33
|
+
this.#db
|
|
34
|
+
.selectFrom('pg_class')
|
|
35
|
+
.select(sql `true`.as('auto_incrementing'))
|
|
36
|
+
.where('relkind', '=', 'S')
|
|
37
|
+
.where('relname', '=', sql `t.tablename || '_' || a.attname || '_seq'`)
|
|
38
|
+
.as('auto_incrementing'),
|
|
29
39
|
])
|
|
30
40
|
.where('t.schemaname', '!~', '^pg_')
|
|
31
41
|
.where('t.schemaname', '!=', 'information_schema')
|
|
@@ -60,6 +70,8 @@ export class PostgresIntrospector {
|
|
|
60
70
|
name: it.column,
|
|
61
71
|
dataType: it.type,
|
|
62
72
|
isNullable: !it.not_null,
|
|
73
|
+
isAutoIncrementing: !!it.auto_incrementing,
|
|
74
|
+
hasDefaultValue: it.has_default,
|
|
63
75
|
}));
|
|
64
76
|
return tables;
|
|
65
77
|
}, []);
|
|
@@ -32,9 +32,22 @@ export class SqliteIntrospector {
|
|
|
32
32
|
}
|
|
33
33
|
async #getTableMetadata(table) {
|
|
34
34
|
const db = this.#db;
|
|
35
|
+
// Get the SQL that was used to create the table.
|
|
36
|
+
const createSql = await db
|
|
37
|
+
.selectFrom('sqlite_master')
|
|
38
|
+
.where('name', '=', table)
|
|
39
|
+
.select('sql')
|
|
40
|
+
.castTo()
|
|
41
|
+
.execute();
|
|
42
|
+
// Try to find the name of the column that has `autoincrement` 🤦
|
|
43
|
+
const autoIncrementCol = createSql[0]?.sql
|
|
44
|
+
?.split(/[\(\),]/)
|
|
45
|
+
?.find((it) => it.toLowerCase().includes('autoincrement'))
|
|
46
|
+
?.split(/\s+/)?.[0]
|
|
47
|
+
?.replace(/["`]/g, '');
|
|
35
48
|
const columns = await db
|
|
36
|
-
.selectFrom(sql `
|
|
37
|
-
.select(['name', 'type', 'notnull'])
|
|
49
|
+
.selectFrom(sql `pragma_table_info(${table})`.as('table_info'))
|
|
50
|
+
.select(['name', 'type', 'notnull', 'dflt_value'])
|
|
38
51
|
.execute();
|
|
39
52
|
return {
|
|
40
53
|
name: table,
|
|
@@ -42,6 +55,8 @@ export class SqliteIntrospector {
|
|
|
42
55
|
name: col.name,
|
|
43
56
|
dataType: col.type,
|
|
44
57
|
isNullable: !col.notnull,
|
|
58
|
+
isAutoIncrementing: col.name === autoIncrementCol,
|
|
59
|
+
hasDefaultValue: !!col.dflt_value,
|
|
45
60
|
})),
|
|
46
61
|
};
|
|
47
62
|
}
|
|
@@ -4,7 +4,7 @@ import { FilterExpressionNode } from './operation-node-utils.js';
|
|
|
4
4
|
import { OperationNode } from './operation-node.js';
|
|
5
5
|
import { TableNode } from './table-node.js';
|
|
6
6
|
export declare type JoinTableNode = TableNode | AliasNode;
|
|
7
|
-
export declare type JoinType = 'InnerJoin' | 'LeftJoin' | 'RightJoin' | 'FullJoin';
|
|
7
|
+
export declare type JoinType = 'InnerJoin' | 'LeftJoin' | 'RightJoin' | 'FullJoin' | 'LateralInnerJoin' | 'LateralLeftJoin';
|
|
8
8
|
export interface JoinNode extends OperationNode {
|
|
9
9
|
readonly kind: 'JoinNode';
|
|
10
10
|
readonly joinType: JoinType;
|
|
@@ -254,6 +254,8 @@ export class OperationNodeTransformer {
|
|
|
254
254
|
where: this.transformNode(node.where),
|
|
255
255
|
returning: this.transformNode(node.returning),
|
|
256
256
|
with: this.transformNode(node.with),
|
|
257
|
+
orderBy: this.transformNode(node.orderBy),
|
|
258
|
+
limit: this.transformNode(node.limit),
|
|
257
259
|
};
|
|
258
260
|
}
|
|
259
261
|
transformReturning(node) {
|
|
@@ -478,6 +480,7 @@ export class OperationNodeTransformer {
|
|
|
478
480
|
return {
|
|
479
481
|
kind: 'CreateSchemaNode',
|
|
480
482
|
schema: this.transformNode(node.schema),
|
|
483
|
+
ifNotExists: node.ifNotExists,
|
|
481
484
|
};
|
|
482
485
|
}
|
|
483
486
|
transformDropSchema(node) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { JoinNode, JoinType } from '../operation-node/join-node.js';
|
|
2
2
|
import { AnyColumn, AnyColumnWithTable } from '../util/type-utils.js';
|
|
3
|
-
import {
|
|
3
|
+
import { From, FromTables } from './table-parser.js';
|
|
4
4
|
import { JoinBuilder } from '../query-builder/join-builder.js';
|
|
5
5
|
export declare type JoinReferenceExpression<DB, TB extends keyof DB, TE> = AnyJoinColumn<DB, TB, TE> | AnyJoinColumnWithTable<DB, TB, TE>;
|
|
6
|
-
export declare type JoinCallbackExpression<DB, TB extends keyof DB, TE> = (join: JoinBuilder<
|
|
7
|
-
declare type AnyJoinColumn<DB, TB extends keyof DB, TE> = AnyColumn<
|
|
8
|
-
declare type AnyJoinColumnWithTable<DB, TB extends keyof DB, TE> = AnyColumnWithTable<
|
|
6
|
+
export declare type JoinCallbackExpression<DB, TB extends keyof DB, TE> = (join: JoinBuilder<From<DB, TE>, FromTables<DB, TB, TE>>) => JoinBuilder<any, any>;
|
|
7
|
+
declare type AnyJoinColumn<DB, TB extends keyof DB, TE> = AnyColumn<From<DB, TE>, FromTables<DB, TB, TE>>;
|
|
8
|
+
declare type AnyJoinColumnWithTable<DB, TB extends keyof DB, TE> = AnyColumnWithTable<From<DB, TE>, FromTables<DB, TB, TE>>;
|
|
9
9
|
export declare function parseJoin(joinType: JoinType, args: any[]): JoinNode;
|
|
10
10
|
export {};
|
|
@@ -7,12 +7,12 @@ import { AliasedComplexExpression } from './complex-expression-parser.js';
|
|
|
7
7
|
export declare type TableExpression<DB, TB extends keyof DB> = TableReference<DB> | AliasedComplexExpression<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> | AnyTable<DB> | AnyAliasedRawBuilder;
|
|
10
|
-
export declare type
|
|
11
|
-
[C in keyof DB |
|
|
10
|
+
export declare type From<DB, TE> = {
|
|
11
|
+
[C in keyof DB | ExtractAliasFromTableExpression<DB, TE>]: C extends ExtractAliasFromTableExpression<DB, TE> ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? DB[C] : never;
|
|
12
12
|
};
|
|
13
|
-
export declare type
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
export declare type FromTables<DB, TB extends keyof DB, TE> = TB | ExtractAliasFromTableExpression<DB, TE>;
|
|
14
|
+
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;
|
|
15
|
+
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 : TE extends (qb: any) => AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : never;
|
|
16
16
|
declare type AnyAliasedTable<DB> = `${AnyTable<DB>} as ${string}`;
|
|
17
17
|
declare type AnyTable<DB> = keyof DB & string;
|
|
18
18
|
export declare function parseTableExpressionOrList(table: TableExpressionOrList<any, any>): TableExpressionNode[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SelectQueryBuilder } from './select-query-builder.js';
|
|
2
|
-
import { TableExpression,
|
|
2
|
+
import { TableExpression, From, FromTables } from '../parser/table-parser.js';
|
|
3
3
|
import { FunctionBuilder } from './function-builder.js';
|
|
4
4
|
import { ExtractTypeFromReferenceExpression, StringReference } from '../parser/reference-parser.js';
|
|
5
5
|
import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
@@ -83,8 +83,8 @@ export declare class ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
83
83
|
* that case Kysely typings wouldn't allow you to reference `pet.owner_id`
|
|
84
84
|
* because `pet` is not joined to that query.
|
|
85
85
|
*/
|
|
86
|
-
selectFrom<TE extends TableExpression<DB, TB>>(from: TE[]): SelectQueryBuilder<
|
|
87
|
-
selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<
|
|
86
|
+
selectFrom<TE extends TableExpression<DB, TB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
87
|
+
selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
88
88
|
/**
|
|
89
89
|
* See {@link QueryCreator.withSchema}
|
|
90
90
|
*/
|
|
@@ -66,6 +66,10 @@ export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNo
|
|
|
66
66
|
* See {@link WhereInterface.orWhereNotExists} for documentation and examples.
|
|
67
67
|
*/
|
|
68
68
|
orOnNotExists(arg: ExistsExpression<DB, TB>): JoinBuilder<DB, TB>;
|
|
69
|
+
/**
|
|
70
|
+
* Adds `on true`.
|
|
71
|
+
*/
|
|
72
|
+
onTrue(): JoinBuilder<DB, TB>;
|
|
69
73
|
toOperationNode(): JoinNode;
|
|
70
74
|
}
|
|
71
75
|
export interface JoinBuilderProps {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="./join-builder.d.ts" />
|
|
2
2
|
import { JoinNode } from '../operation-node/join-node.js';
|
|
3
|
+
import { RawNode } from '../operation-node/raw-node.js';
|
|
3
4
|
import { parseExistFilter, parseNotExistFilter, parseOnFilter, parseReferenceFilter, } from '../parser/filter-parser.js';
|
|
4
5
|
import { freeze } from '../util/object-utils.js';
|
|
5
6
|
import { preventAwait } from '../util/prevent-await.js';
|
|
@@ -92,6 +93,15 @@ export class JoinBuilder {
|
|
|
92
93
|
joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseNotExistFilter(arg)),
|
|
93
94
|
});
|
|
94
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Adds `on true`.
|
|
98
|
+
*/
|
|
99
|
+
onTrue() {
|
|
100
|
+
return new JoinBuilder({
|
|
101
|
+
...this.#props,
|
|
102
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, RawNode.createWithSql('true')),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
95
105
|
toOperationNode() {
|
|
96
106
|
return this.#props.joinNode;
|
|
97
107
|
}
|
|
@@ -873,6 +873,46 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
873
873
|
*/
|
|
874
874
|
fullJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): SelectQueryBuilderWithFullJoin<DB, TB, O, TE>;
|
|
875
875
|
fullJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): SelectQueryBuilderWithFullJoin<DB, TB, O, TE>;
|
|
876
|
+
/**
|
|
877
|
+
* Just like {@link innerJoin} but adds a lateral join instead of an inner join.
|
|
878
|
+
*
|
|
879
|
+
* ### Examples
|
|
880
|
+
*
|
|
881
|
+
* ```ts
|
|
882
|
+
* db.selectFrom('person')
|
|
883
|
+
* .innerJoinLateral(
|
|
884
|
+
* (eb) =>
|
|
885
|
+
* eb.selectFrom('pet')
|
|
886
|
+
* .select('name')
|
|
887
|
+
* .whereRef('pet.owner_id', '=', 'person.id')
|
|
888
|
+
* .as('p'),
|
|
889
|
+
* (join) => join.onTrue()
|
|
890
|
+
* )
|
|
891
|
+
* .select(['first_name', 'p.name'])
|
|
892
|
+
* .orderBy('first_name')
|
|
893
|
+
*/
|
|
894
|
+
innerJoinLateral<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): SelectQueryBuilderWithInnerJoin<DB, TB, O, TE>;
|
|
895
|
+
innerJoinLateral<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): SelectQueryBuilderWithInnerJoin<DB, TB, O, TE>;
|
|
896
|
+
/**
|
|
897
|
+
* Just like {@link innerJoin} but adds a lateral left join instead of an inner join.
|
|
898
|
+
* ### Examples
|
|
899
|
+
*
|
|
900
|
+
* ```ts
|
|
901
|
+
* db.selectFrom('person')
|
|
902
|
+
* .leftJoinLateral(
|
|
903
|
+
* (eb) =>
|
|
904
|
+
* eb.selectFrom('pet')
|
|
905
|
+
* .select('name')
|
|
906
|
+
* .whereRef('pet.owner_id', '=', 'person.id')
|
|
907
|
+
* .as('p'),
|
|
908
|
+
* (join) => join.onTrue()
|
|
909
|
+
* )
|
|
910
|
+
* .select(['first_name', 'p.name'])
|
|
911
|
+
* .orderBy('first_name')
|
|
912
|
+
* ```
|
|
913
|
+
*/
|
|
914
|
+
leftJoinLateral<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): SelectQueryBuilderWithLeftJoin<DB, TB, O, TE>;
|
|
915
|
+
leftJoinLateral<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): SelectQueryBuilderWithLeftJoin<DB, TB, O, TE>;
|
|
876
916
|
/**
|
|
877
917
|
* Adds an `order by` clause to the query.
|
|
878
918
|
*
|
|
@@ -235,6 +235,18 @@ export class SelectQueryBuilder {
|
|
|
235
235
|
queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin('FullJoin', args)),
|
|
236
236
|
});
|
|
237
237
|
}
|
|
238
|
+
innerJoinLateral(...args) {
|
|
239
|
+
return new SelectQueryBuilder({
|
|
240
|
+
...this.#props,
|
|
241
|
+
queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin('LateralInnerJoin', args)),
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
leftJoinLateral(...args) {
|
|
245
|
+
return new SelectQueryBuilder({
|
|
246
|
+
...this.#props,
|
|
247
|
+
queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin('LateralLeftJoin', args)),
|
|
248
|
+
});
|
|
249
|
+
}
|
|
238
250
|
/**
|
|
239
251
|
* Adds an `order by` clause to the query.
|
|
240
252
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
2
2
|
import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
3
3
|
import { JoinCallbackExpression, JoinReferenceExpression } from '../parser/join-parser.js';
|
|
4
|
-
import { TableExpression,
|
|
4
|
+
import { TableExpression, From, FromTables } from '../parser/table-parser.js';
|
|
5
5
|
import { SelectExpression } from '../parser/select-parser.js';
|
|
6
6
|
import { ExistsExpression, FilterOperator, FilterValueExpressionOrList, WhereGrouper } from '../parser/filter-parser.js';
|
|
7
7
|
import { ReturningRow } from '../parser/returning-parser.js';
|
|
@@ -434,8 +434,8 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
434
434
|
* where "pet"."owner_id" = "person"."id"
|
|
435
435
|
* ```
|
|
436
436
|
*/
|
|
437
|
-
from<TE extends TableExpression<DB, TB>>(table: TE): UpdateQueryBuilder<
|
|
438
|
-
from<TE extends TableExpression<DB, TB>>(table: TE[]): UpdateQueryBuilder<
|
|
437
|
+
from<TE extends TableExpression<DB, TB>>(table: TE): UpdateQueryBuilder<From<DB, TE>, UT, FromTables<DB, TB, TE>, O>;
|
|
438
|
+
from<TE extends TableExpression<DB, TB>>(table: TE[]): UpdateQueryBuilder<From<DB, TE>, UT, FromTables<DB, TB, TE>, O>;
|
|
439
439
|
/**
|
|
440
440
|
* Joins another table to the query using an inner join.
|
|
441
441
|
*
|
|
@@ -2,7 +2,7 @@ import { SelectQueryBuilder } from './query-builder/select-query-builder.js';
|
|
|
2
2
|
import { InsertQueryBuilder } from './query-builder/insert-query-builder.js';
|
|
3
3
|
import { DeleteQueryBuilder } from './query-builder/delete-query-builder.js';
|
|
4
4
|
import { UpdateQueryBuilder } from './query-builder/update-query-builder.js';
|
|
5
|
-
import { TableExpression,
|
|
5
|
+
import { TableExpression, From, FromTables, TableReference } from './parser/table-parser.js';
|
|
6
6
|
import { QueryExecutor } from './query-executor/query-executor.js';
|
|
7
7
|
import { CommonTableExpression, QueryCreatorWithCommonTableExpression, RecursiveCommonTableExpression } from './parser/with-parser.js';
|
|
8
8
|
import { WithNode } from './operation-node/with-node.js';
|
|
@@ -120,8 +120,8 @@ export declare class QueryCreator<DB> {
|
|
|
120
120
|
* (select 1 as one) as "q"
|
|
121
121
|
* ```
|
|
122
122
|
*/
|
|
123
|
-
selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE[]): SelectQueryBuilder<
|
|
124
|
-
selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<
|
|
123
|
+
selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
|
|
124
|
+
selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
|
|
125
125
|
/**
|
|
126
126
|
* Creates an insert query.
|
|
127
127
|
*
|
|
@@ -180,7 +180,7 @@ export declare class QueryCreator<DB> {
|
|
|
180
180
|
* console.log(result.numDeletedRows)
|
|
181
181
|
* ```
|
|
182
182
|
*/
|
|
183
|
-
deleteFrom<TR extends TableReference<DB>>(table: TR): DeleteQueryBuilder<
|
|
183
|
+
deleteFrom<TR extends TableReference<DB>>(table: TR): DeleteQueryBuilder<From<DB, TR>, FromTables<DB, never, TR>, DeleteResult>;
|
|
184
184
|
/**
|
|
185
185
|
* Creates an update query.
|
|
186
186
|
*
|
|
@@ -204,7 +204,7 @@ export declare class QueryCreator<DB> {
|
|
|
204
204
|
* console.log(result.numUpdatedRows)
|
|
205
205
|
* ```
|
|
206
206
|
*/
|
|
207
|
-
updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<
|
|
207
|
+
updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<From<DB, TR>, FromTables<DB, never, TR>, FromTables<DB, never, TR>, UpdateResult>;
|
|
208
208
|
/**
|
|
209
209
|
* Creates a `with` query (Common Table Expression).
|
|
210
210
|
*
|