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.
Files changed (33) hide show
  1. package/dist/cjs/dialect/database-introspector.d.ts +11 -2
  2. package/dist/cjs/dialect/mysql/mysql-introspector.js +4 -0
  3. package/dist/cjs/dialect/postgres/postgres-introspector.js +12 -0
  4. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +17 -2
  5. package/dist/cjs/operation-node/join-node.d.ts +1 -1
  6. package/dist/cjs/operation-node/operation-node-transformer.js +3 -0
  7. package/dist/cjs/parser/join-parser.d.ts +4 -4
  8. package/dist/cjs/parser/table-parser.d.ts +5 -5
  9. package/dist/cjs/query-builder/expression-builder.d.ts +3 -3
  10. package/dist/cjs/query-builder/join-builder.d.ts +4 -0
  11. package/dist/cjs/query-builder/join-builder.js +10 -0
  12. package/dist/cjs/query-builder/select-query-builder.d.ts +40 -0
  13. package/dist/cjs/query-builder/select-query-builder.js +12 -0
  14. package/dist/cjs/query-builder/update-query-builder.d.ts +3 -3
  15. package/dist/cjs/query-compiler/default-query-compiler.js +2 -0
  16. package/dist/cjs/query-creator.d.ts +5 -5
  17. package/dist/esm/dialect/database-introspector.d.ts +11 -2
  18. package/dist/esm/dialect/mysql/mysql-introspector.js +4 -0
  19. package/dist/esm/dialect/postgres/postgres-introspector.js +12 -0
  20. package/dist/esm/dialect/sqlite/sqlite-introspector.js +17 -2
  21. package/dist/esm/operation-node/join-node.d.ts +1 -1
  22. package/dist/esm/operation-node/operation-node-transformer.js +3 -0
  23. package/dist/esm/parser/join-parser.d.ts +4 -4
  24. package/dist/esm/parser/table-parser.d.ts +5 -5
  25. package/dist/esm/query-builder/expression-builder.d.ts +3 -3
  26. package/dist/esm/query-builder/join-builder.d.ts +4 -0
  27. package/dist/esm/query-builder/join-builder.js +10 -0
  28. package/dist/esm/query-builder/select-query-builder.d.ts +40 -0
  29. package/dist/esm/query-builder/select-query-builder.js +12 -0
  30. package/dist/esm/query-builder/update-query-builder.d.ts +3 -3
  31. package/dist/esm/query-compiler/default-query-compiler.js +2 -0
  32. package/dist/esm/query-creator.d.ts +5 -5
  33. 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
- readonly dataType: ColumnDataType;
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) `PRAGMA_TABLE_INFO(${table})`.as('table_info'))
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 { TableExpressionDatabase, TableExpressionTables } from './table-parser.js';
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<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>>) => JoinBuilder<any, any>;
7
- declare type AnyJoinColumn<DB, TB extends keyof DB, TE> = AnyColumn<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>>;
8
- declare type AnyJoinColumnWithTable<DB, TB extends keyof DB, TE> = AnyColumnWithTable<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>>;
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 TableExpressionDatabase<DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
11
- [C in keyof DB | A]: C extends A ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? DB[C] : never;
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 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;
14
- export declare type TableExpressionTables<DB, TB extends keyof DB, TE> = TB | ExtractAliasFromTableExpression<DB, TE>;
15
- export 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;
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, TableExpressionDatabase, TableExpressionTables } from '../parser/table-parser.js';
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<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, {}>;
87
- selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, {}>;
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, TableExpressionDatabase, TableExpressionTables } from '../parser/table-parser.js';
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<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
438
- from<TE extends TableExpression<DB, TB>>(table: TE[]): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
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
  *
@@ -839,4 +839,6 @@ const JOIN_TYPE_SQL = (0, object_utils_js_1.freeze)({
839
839
  LeftJoin: 'left join',
840
840
  RightJoin: 'right join',
841
841
  FullJoin: 'full join',
842
+ LateralInnerJoin: 'inner join lateral',
843
+ LateralLeftJoin: 'left join lateral',
842
844
  });
@@ -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, TableExpressionDatabase, TableExpressionTables, TableReference } from './parser/table-parser.js';
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<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, never, TE>, {}>;
124
- selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, never, TE>, {}>;
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<TableExpressionDatabase<DB, TR>, TableExpressionTables<DB, never, TR>, DeleteResult>;
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<TableExpressionDatabase<DB, TR>, TableExpressionTables<DB, never, TR>, TableExpressionTables<DB, never, TR>, UpdateResult>;
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
- readonly dataType: ColumnDataType;
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 `PRAGMA_TABLE_INFO(${table})`.as('table_info'))
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 { TableExpressionDatabase, TableExpressionTables } from './table-parser.js';
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<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>>) => JoinBuilder<any, any>;
7
- declare type AnyJoinColumn<DB, TB extends keyof DB, TE> = AnyColumn<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>>;
8
- declare type AnyJoinColumnWithTable<DB, TB extends keyof DB, TE> = AnyColumnWithTable<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>>;
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 TableExpressionDatabase<DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
11
- [C in keyof DB | A]: C extends A ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? DB[C] : never;
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 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;
14
- export declare type TableExpressionTables<DB, TB extends keyof DB, TE> = TB | ExtractAliasFromTableExpression<DB, TE>;
15
- export 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;
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, TableExpressionDatabase, TableExpressionTables } from '../parser/table-parser.js';
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<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, {}>;
87
- selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, {}>;
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, TableExpressionDatabase, TableExpressionTables } from '../parser/table-parser.js';
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<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
438
- from<TE extends TableExpression<DB, TB>>(table: TE[]): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
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
  *
@@ -836,4 +836,6 @@ const JOIN_TYPE_SQL = freeze({
836
836
  LeftJoin: 'left join',
837
837
  RightJoin: 'right join',
838
838
  FullJoin: 'full join',
839
+ LateralInnerJoin: 'inner join lateral',
840
+ LateralLeftJoin: 'left join lateral',
839
841
  });
@@ -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, TableExpressionDatabase, TableExpressionTables, TableReference } from './parser/table-parser.js';
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<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, never, TE>, {}>;
124
- selectFrom<TE extends TableExpression<DB, keyof DB>>(from: TE): SelectQueryBuilder<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, never, TE>, {}>;
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<TableExpressionDatabase<DB, TR>, TableExpressionTables<DB, never, TR>, DeleteResult>;
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<TableExpressionDatabase<DB, TR>, TableExpressionTables<DB, never, TR>, TableExpressionTables<DB, never, TR>, UpdateResult>;
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
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.19.4",
3
+ "version": "0.19.7",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",