kysely 0.17.3 → 0.18.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.
Files changed (40) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/operation-node/alias-node.d.ts +2 -2
  3. package/dist/cjs/operation-node/alias-node.js +1 -2
  4. package/dist/cjs/operation-node/operation-node-transformer.js +1 -0
  5. package/dist/cjs/operation-node/update-query-node.d.ts +3 -0
  6. package/dist/cjs/operation-node/update-query-node.js +11 -2
  7. package/dist/cjs/parser/reference-parser.js +2 -1
  8. package/dist/cjs/parser/table-parser.js +2 -1
  9. package/dist/cjs/parser/update-set-parser.d.ts +3 -3
  10. package/dist/cjs/parser/with-parser.d.ts +2 -2
  11. package/dist/cjs/query-builder/insert-query-builder.d.ts +1 -1
  12. package/dist/cjs/query-builder/on-conflict-builder.d.ts +1 -1
  13. package/dist/cjs/query-builder/select-query-builder.d.ts +3 -1
  14. package/dist/cjs/query-builder/select-query-builder.js +5 -5
  15. package/dist/cjs/query-builder/update-query-builder.d.ts +57 -28
  16. package/dist/cjs/query-builder/update-query-builder.js +7 -0
  17. package/dist/cjs/query-compiler/default-query-compiler.js +4 -0
  18. package/dist/cjs/query-creator.d.ts +1 -1
  19. package/dist/cjs/raw-builder/raw-builder.d.ts +32 -2
  20. package/dist/cjs/raw-builder/raw-builder.js +5 -26
  21. package/dist/esm/operation-node/alias-node.d.ts +2 -2
  22. package/dist/esm/operation-node/alias-node.js +1 -2
  23. package/dist/esm/operation-node/operation-node-transformer.js +1 -0
  24. package/dist/esm/operation-node/update-query-node.d.ts +3 -0
  25. package/dist/esm/operation-node/update-query-node.js +11 -2
  26. package/dist/esm/parser/reference-parser.js +2 -1
  27. package/dist/esm/parser/table-parser.js +2 -1
  28. package/dist/esm/parser/update-set-parser.d.ts +3 -3
  29. package/dist/esm/parser/with-parser.d.ts +2 -2
  30. package/dist/esm/query-builder/insert-query-builder.d.ts +1 -1
  31. package/dist/esm/query-builder/on-conflict-builder.d.ts +1 -1
  32. package/dist/esm/query-builder/select-query-builder.d.ts +3 -1
  33. package/dist/esm/query-builder/select-query-builder.js +5 -5
  34. package/dist/esm/query-builder/update-query-builder.d.ts +57 -28
  35. package/dist/esm/query-builder/update-query-builder.js +7 -0
  36. package/dist/esm/query-compiler/default-query-compiler.js +4 -0
  37. package/dist/esm/query-creator.d.ts +1 -1
  38. package/dist/esm/raw-builder/raw-builder.d.ts +32 -2
  39. package/dist/esm/raw-builder/raw-builder.js +5 -26
  40. package/package.json +1 -1
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://stand-with-ukraine.pp.ua)
2
+
1
3
  [![Discord](https://img.shields.io/discord/890118421587578920)](https://discord.gg/C9aJ49mCra)
2
4
  [![Tests](https://github.com/koskimas/kysely/actions/workflows/test.yml/badge.svg)](https://github.com/koskimas/kysely)
3
5
 
@@ -9,12 +9,12 @@ export declare type AliasNodeChild = ColumnNode | ReferenceNode | TableNode | Se
9
9
  export interface AliasNode extends OperationNode {
10
10
  readonly kind: 'AliasNode';
11
11
  readonly node: AliasNodeChild;
12
- readonly alias: IdentifierNode;
12
+ readonly alias: IdentifierNode | RawNode;
13
13
  }
14
14
  /**
15
15
  * @internal
16
16
  */
17
17
  export declare const AliasNode: Readonly<{
18
18
  is(node: OperationNode): node is AliasNode;
19
- create(node: AliasNodeChild, alias: string): AliasNode;
19
+ create(node: AliasNodeChild, alias: IdentifierNode | RawNode): AliasNode;
20
20
  }>;
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AliasNode = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
- const identifier_node_js_1 = require("./identifier-node.js");
6
5
  /**
7
6
  * @internal
8
7
  */
@@ -14,7 +13,7 @@ exports.AliasNode = (0, object_utils_js_1.freeze)({
14
13
  return (0, object_utils_js_1.freeze)({
15
14
  kind: 'AliasNode',
16
15
  node,
17
- alias: identifier_node_js_1.IdentifierNode.create(alias),
16
+ alias,
18
17
  });
19
18
  },
20
19
  });
@@ -333,6 +333,7 @@ class OperationNodeTransformer {
333
333
  return {
334
334
  kind: 'UpdateQueryNode',
335
335
  table: this.transformNode(node.table),
336
+ from: this.transformNode(node.from),
336
337
  joins: this.transformNodeList(node.joins),
337
338
  where: this.transformNode(node.where),
338
339
  updates: this.transformNodeList(node.updates),
@@ -7,10 +7,12 @@ import { ReturningNode } from './returning-node.js';
7
7
  import { ValueListNode } from './value-list-node.js';
8
8
  import { WhereNode } from './where-node.js';
9
9
  import { WithNode } from './with-node.js';
10
+ import { FromNode } from './from-node.js';
10
11
  export declare type UpdateValuesNode = ValueListNode | PrimitiveValueListNode;
11
12
  export interface UpdateQueryNode extends OperationNode {
12
13
  readonly kind: 'UpdateQueryNode';
13
14
  readonly table: TableExpressionNode;
15
+ readonly from?: FromNode;
14
16
  readonly joins?: ReadonlyArray<JoinNode>;
15
17
  readonly where?: WhereNode;
16
18
  readonly updates?: ReadonlyArray<ColumnUpdateNode>;
@@ -23,5 +25,6 @@ export interface UpdateQueryNode extends OperationNode {
23
25
  export declare const UpdateQueryNode: Readonly<{
24
26
  is(node: OperationNode): node is UpdateQueryNode;
25
27
  create(table: TableExpressionNode, withNode?: WithNode | undefined): UpdateQueryNode;
28
+ cloneWithFromItems(updateQuery: UpdateQueryNode, fromItems: ReadonlyArray<TableExpressionNode>): UpdateQueryNode;
26
29
  cloneWithUpdates(updateQuery: UpdateQueryNode, updates: ReadonlyArray<ColumnUpdateNode>): UpdateQueryNode;
27
30
  }>;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UpdateQueryNode = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
+ const from_node_js_1 = require("./from-node.js");
5
6
  /**
6
7
  * @internal
7
8
  */
@@ -10,11 +11,19 @@ exports.UpdateQueryNode = (0, object_utils_js_1.freeze)({
10
11
  return node.kind === 'UpdateQueryNode';
11
12
  },
12
13
  create(table, withNode) {
13
- return {
14
+ return (0, object_utils_js_1.freeze)({
14
15
  kind: 'UpdateQueryNode',
15
16
  table,
16
17
  ...(withNode && { with: withNode }),
17
- };
18
+ });
19
+ },
20
+ cloneWithFromItems(updateQuery, fromItems) {
21
+ return (0, object_utils_js_1.freeze)({
22
+ ...updateQuery,
23
+ from: updateQuery.from
24
+ ? from_node_js_1.FromNode.cloneWithFroms(updateQuery.from, fromItems)
25
+ : from_node_js_1.FromNode.create(fromItems),
26
+ });
18
27
  },
19
28
  cloneWithUpdates(updateQuery, updates) {
20
29
  return (0, object_utils_js_1.freeze)({
@@ -8,6 +8,7 @@ const table_node_js_1 = require("../operation-node/table-node.js");
8
8
  const object_utils_js_1 = require("../util/object-utils.js");
9
9
  const complex_expression_parser_js_1 = require("./complex-expression-parser.js");
10
10
  const dynamic_reference_builder_js_1 = require("../dynamic/dynamic-reference-builder.js");
11
+ const identifier_node_js_1 = require("../operation-node/identifier-node.js");
11
12
  function parseReferenceExpressionOrList(arg) {
12
13
  if ((0, object_utils_js_1.isReadonlyArray)(arg)) {
13
14
  return arg.map((it) => parseReferenceExpression(it));
@@ -50,7 +51,7 @@ function parseAliasedStringReference(ref) {
50
51
  const ALIAS_SEPARATOR = ' as ';
51
52
  if (ref.includes(ALIAS_SEPARATOR)) {
52
53
  const [columnRef, alias] = ref.split(ALIAS_SEPARATOR).map(trim);
53
- return alias_node_js_1.AliasNode.create(parseStringReference(columnRef), alias);
54
+ return alias_node_js_1.AliasNode.create(parseStringReference(columnRef), identifier_node_js_1.IdentifierNode.create(alias));
54
55
  }
55
56
  else {
56
57
  return parseStringReference(ref);
@@ -5,6 +5,7 @@ const object_utils_js_1 = require("../util/object-utils.js");
5
5
  const alias_node_js_1 = require("../operation-node/alias-node.js");
6
6
  const table_node_js_1 = require("../operation-node/table-node.js");
7
7
  const complex_expression_parser_js_1 = require("./complex-expression-parser.js");
8
+ const identifier_node_js_1 = require("../operation-node/identifier-node.js");
8
9
  function parseTableExpressionOrList(table) {
9
10
  if ((0, object_utils_js_1.isReadonlyArray)(table)) {
10
11
  return table.map((it) => parseTableExpression(it));
@@ -27,7 +28,7 @@ function parseAliasedTable(from) {
27
28
  const ALIAS_SEPARATOR = ' as ';
28
29
  if (from.includes(ALIAS_SEPARATOR)) {
29
30
  const [table, alias] = from.split(ALIAS_SEPARATOR).map(trim);
30
- return alias_node_js_1.AliasNode.create(parseTable(table), alias);
31
+ return alias_node_js_1.AliasNode.create(parseTable(table), identifier_node_js_1.IdentifierNode.create(alias));
31
32
  }
32
33
  else {
33
34
  return parseTable(from);
@@ -1,7 +1,7 @@
1
1
  import { ColumnUpdateNode } from '../operation-node/column-update-node.js';
2
2
  import { UpdateKeys, UpdateType } from '../util/column-type.js';
3
3
  import { ValueExpression } from './value-parser.js';
4
- export declare type MutationObject<DB, TB extends keyof DB> = {
5
- [C in UpdateKeys<DB[TB]>]?: ValueExpression<DB, TB, UpdateType<DB[TB][C]>>;
4
+ export declare type MutationObject<DB, TB extends keyof DB, TM extends keyof DB> = {
5
+ [C in UpdateKeys<DB[TM]>]?: ValueExpression<DB, TB, UpdateType<DB[TM][C]>>;
6
6
  };
7
- export declare function parseUpdateObject(row: MutationObject<any, any>): ReadonlyArray<ColumnUpdateNode>;
7
+ export declare function parseUpdateObject(row: MutationObject<any, any, any>): ReadonlyArray<ColumnUpdateNode>;
@@ -8,14 +8,14 @@ import { RawBuilder } from '../raw-builder/raw-builder.js';
8
8
  export declare type CommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB>) => CommonTableExpressionOutput<DB, CN>;
9
9
  export declare type RecursiveCommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpressionName<CN>>>) => CommonTableExpressionOutput<DB, CN>;
10
10
  export declare type QueryCreatorWithCommonTableExpression<DB, CN extends string, CTE> = QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpression<CTE>>>;
11
- declare type CommonTableExpressionOutput<DB, CN extends string> = SelectQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | InsertQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | UpdateQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | DeleteQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | RawBuilder<ExtractRowFromCommonTableExpressionName<CN>>;
11
+ declare type CommonTableExpressionOutput<DB, CN extends string> = SelectQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | InsertQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | UpdateQueryBuilder<DB, any, any, ExtractRowFromCommonTableExpressionName<CN>> | DeleteQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | RawBuilder<ExtractRowFromCommonTableExpressionName<CN>>;
12
12
  /**
13
13
  * Given a common CommonTableExpression CTE extracts the row type from it.
14
14
  *
15
15
  * For example a CTE `(db) => db.selectFrom('person').select(['id', 'first_name'])`
16
16
  * would result in `Pick<Person, 'id' | 'first_name'>`.
17
17
  */
18
- declare type ExtractRowFromCommonTableExpression<CTE> = CTE extends (creator: QueryCreator<any>) => infer Q ? Q extends SelectQueryBuilder<any, any, infer QO> ? QO : Q extends InsertQueryBuilder<any, any, infer QO> ? QO : Q extends UpdateQueryBuilder<any, any, infer QO> ? QO : Q extends DeleteQueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
18
+ declare type ExtractRowFromCommonTableExpression<CTE> = CTE extends (creator: QueryCreator<any>) => infer Q ? Q extends SelectQueryBuilder<any, any, infer QO> ? QO : Q extends InsertQueryBuilder<any, any, infer QO> ? QO : Q extends UpdateQueryBuilder<any, any, any, infer QO> ? QO : Q extends DeleteQueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
19
19
  /**
20
20
  * Extracts 'person' from a string like 'person(id, first_name)'.
21
21
  */
@@ -382,7 +382,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
382
382
  * .onDuplicateKeyUpdate({ species: 'hamster' })
383
383
  * ```
384
384
  */
385
- onDuplicateKeyUpdate(updates: MutationObject<DB, TB>): InsertQueryBuilder<DB, TB, O>;
385
+ onDuplicateKeyUpdate(updates: MutationObject<DB, TB, TB>): InsertQueryBuilder<DB, TB, O>;
386
386
  /**
387
387
  * Allows you to return data from modified rows.
388
388
  *
@@ -386,7 +386,7 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
386
386
  * do update set "first_name" = $3
387
387
  * ```
388
388
  */
389
- doUpdateSet(updates: MutationObject<OnConflictDatabase<DB, TB>, OnConflictTables<TB>>): OnConflictUpdateBuilder<OnConflictDatabase<DB, TB>, OnConflictTables<TB>>;
389
+ doUpdateSet(updates: MutationObject<OnConflictDatabase<DB, TB>, OnConflictTables<TB>, OnConflictTables<TB>>): OnConflictUpdateBuilder<OnConflictDatabase<DB, TB>, OnConflictTables<TB>>;
390
390
  }
391
391
  export interface OnConflictBuilderProps {
392
392
  readonly onConflictNode: OnConflictNode;
@@ -1212,7 +1212,7 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1212
1212
  * ### Examples
1213
1213
  *
1214
1214
  * ```ts
1215
- * await db.selectFrom('pet')
1215
+ * const pets = await db.selectFrom('pet')
1216
1216
  * .selectAll('pet')
1217
1217
  * .select(
1218
1218
  * (qb) => qb.selectFrom('person')
@@ -1221,6 +1221,8 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1221
1221
  * .as('owner_first_name')
1222
1222
  * )
1223
1223
  * .execute()
1224
+ *
1225
+ * pets[0].owner_first_name
1224
1226
  * ```
1225
1227
  */
1226
1228
  as<A extends string>(alias: A): AliasedQueryBuilder<DB, TB, O, A>;
@@ -15,6 +15,7 @@ const object_utils_js_1 = require("../util/object-utils.js");
15
15
  const group_by_parser_js_1 = require("../parser/group-by-parser.js");
16
16
  const union_parser_js_1 = require("../parser/union-parser.js");
17
17
  const no_result_error_js_1 = require("./no-result-error.js");
18
+ const identifier_node_js_1 = require("../operation-node/identifier-node.js");
18
19
  class SelectQueryBuilder {
19
20
  #props;
20
21
  constructor(props) {
@@ -515,7 +516,7 @@ class SelectQueryBuilder {
515
516
  * ### Examples
516
517
  *
517
518
  * ```ts
518
- * await db.selectFrom('pet')
519
+ * const pets = await db.selectFrom('pet')
519
520
  * .selectAll('pet')
520
521
  * .select(
521
522
  * (qb) => qb.selectFrom('person')
@@ -524,6 +525,8 @@ class SelectQueryBuilder {
524
525
  * .as('owner_first_name')
525
526
  * )
526
527
  * .execute()
528
+ *
529
+ * pets[0].owner_first_name
527
530
  * ```
528
531
  */
529
532
  as(alias) {
@@ -613,10 +616,7 @@ class AliasedQueryBuilder {
613
616
  }
614
617
  toOperationNode() {
615
618
  const node = this.#queryBuilder.toOperationNode();
616
- if (select_query_node_js_1.SelectQueryNode.is(node)) {
617
- return alias_node_js_1.AliasNode.create(node, this.#alias);
618
- }
619
- throw new Error('only select queries can be aliased');
619
+ return alias_node_js_1.AliasNode.create(node, identifier_node_js_1.IdentifierNode.create(this.#alias));
620
620
  }
621
621
  }
622
622
  exports.AliasedQueryBuilder = AliasedQueryBuilder;
@@ -19,7 +19,7 @@ import { JoinInterface } from './join-interface.js';
19
19
  import { ReturningInterface } from './returning-interface.js';
20
20
  import { NoResultErrorConstructor } from './no-result-error.js';
21
21
  import { Selectable } from '../util/column-type.js';
22
- export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, JoinInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable {
22
+ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, JoinInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable {
23
23
  #private;
24
24
  constructor(props: UpdateQueryBuilderProps);
25
25
  /**
@@ -206,9 +206,9 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
206
206
  * .execute()
207
207
  * ```
208
208
  */
209
- where<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): UpdateQueryBuilder<DB, TB, O>;
210
- where(grouper: WhereGrouper<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
211
- where(raw: AnyRawBuilder): UpdateQueryBuilder<DB, TB, O>;
209
+ where<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): UpdateQueryBuilder<DB, UT, TB, O>;
210
+ where(grouper: WhereGrouper<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
211
+ where(raw: AnyRawBuilder): UpdateQueryBuilder<DB, UT, TB, O>;
212
212
  /**
213
213
  * Adds a `where` clause where both sides of the operator are references
214
214
  * to columns.
@@ -260,7 +260,7 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
260
260
  * ) as "pet_name"
261
261
  * from "person"
262
262
  */
263
- whereRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
263
+ whereRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
264
264
  /**
265
265
  * Adds an `or where` clause to the query. Otherwise works just like {@link where}.
266
266
  *
@@ -324,15 +324,15 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
324
324
  * select * from "person" (where "id" = 1 or "id" = 2)
325
325
  * ```
326
326
  */
327
- orWhere<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): UpdateQueryBuilder<DB, TB, O>;
328
- orWhere(grouper: WhereGrouper<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
329
- orWhere(raw: AnyRawBuilder): UpdateQueryBuilder<DB, TB, O>;
327
+ orWhere<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): UpdateQueryBuilder<DB, UT, TB, O>;
328
+ orWhere(grouper: WhereGrouper<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
329
+ orWhere(raw: AnyRawBuilder): UpdateQueryBuilder<DB, UT, TB, O>;
330
330
  /**
331
331
  * Adds an `or where` clause to the query. Otherwise works just like {@link whereRef}.
332
332
  *
333
333
  * Also see {@link orWhere} and {@link where}.
334
334
  */
335
- orWhereRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
335
+ orWhereRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
336
336
  /**
337
337
  * Adds a `where exists` clause to the query.
338
338
  *
@@ -393,19 +393,48 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
393
393
  * )
394
394
  * ```
395
395
  */
396
- whereExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
396
+ whereExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
397
397
  /**
398
398
  * Just like {@link whereExists} but creates a `not exists` clause.
399
399
  */
400
- whereNotExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
400
+ whereNotExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
401
401
  /**
402
402
  * Just like {@link whereExists} but creates a `or exists` clause.
403
403
  */
404
- orWhereExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
404
+ orWhereExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
405
405
  /**
406
406
  * Just like {@link whereExists} but creates a `or not exists` clause.
407
407
  */
408
- orWhereNotExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
408
+ orWhereNotExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
409
+ /**
410
+ * Adds a from clause to the update query.
411
+ *
412
+ * This is supported only on some databases like PostgreSQL.
413
+ *
414
+ * The API is the same as {@link QueryCreator.selectFrom}.
415
+ *
416
+ * ### Examples
417
+ *
418
+ * ```ts
419
+ * db.updateTable('person')
420
+ * .from('pet')
421
+ * .set({
422
+ * first_name: (eb) => eb.ref('pet.name')
423
+ * })
424
+ * .whereRef('pet.owner_id', '=', 'person.id')
425
+ * ```
426
+ *
427
+ * The generated SQL (PostgreSQL):
428
+ *
429
+ * ```sql
430
+ * update "person"
431
+ * set "first_name" = "pet"."name"
432
+ * from "pet"
433
+ * where "pet"."owner_id" = "person"."id"
434
+ * ```
435
+ */
436
+ 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<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
409
438
  /**
410
439
  * Joins another table to the query using an inner join.
411
440
  *
@@ -515,23 +544,23 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
515
544
  * on "doggos"."owner_id" = "person"."id"
516
545
  * ```
517
546
  */
518
- innerJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, O>;
519
- innerJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, O>;
547
+ innerJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
548
+ innerJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
520
549
  /**
521
550
  * Just like {@link innerJoin} but adds a left join nstead of an inner join.
522
551
  */
523
- leftJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, O>;
524
- leftJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, O>;
552
+ leftJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
553
+ leftJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
525
554
  /**
526
555
  * Just like {@link innerJoin} but adds a right join instead of an inner join.
527
556
  */
528
- rightJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, TableExpressionTables<DB, TB, TE>, O>;
529
- rightJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, TableExpressionTables<DB, TB, TE>, O>;
557
+ rightJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
558
+ rightJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
530
559
  /**
531
560
  * Just like {@link innerJoin} but adds a full join instead of an inner join.
532
561
  */
533
- fullJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, TableExpressionTables<DB, TB, TE>, O>;
534
- fullJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, TableExpressionTables<DB, TB, TE>, O>;
562
+ fullJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
563
+ fullJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
535
564
  /**
536
565
  * Sets the values to update for an {@link Kysely.updateTable | update} query.
537
566
  *
@@ -619,7 +648,7 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
619
648
  * where "id" = $4
620
649
  * ```
621
650
  */
622
- set(row: MutationObject<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
651
+ set(row: MutationObject<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
623
652
  /**
624
653
  * Allows you to return data from modified rows.
625
654
  *
@@ -679,13 +708,13 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
679
708
  * .executeTakeFirst()
680
709
  * ```
681
710
  */
682
- returning<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): UpdateQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SE>>;
683
- returning<SE extends SelectExpression<DB, TB>>(selection: SE): UpdateQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SE>>;
711
+ returning<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SE>>;
712
+ returning<SE extends SelectExpression<DB, TB>>(selection: SE): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SE>>;
684
713
  /**
685
714
  * Adds a `returning *` to an insert/update/delete query on databases
686
715
  * that support `returning` such as PostgreSQL.
687
716
  */
688
- returningAll(): UpdateQueryBuilder<DB, TB, Selectable<DB[TB]>>;
717
+ returningAll(): UpdateQueryBuilder<DB, UT, TB, Selectable<DB[TB]>>;
689
718
  /**
690
719
  * Simply calls the given function passing `this` as the only argument.
691
720
  *
@@ -745,18 +774,18 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
745
774
  * }
746
775
  * ```
747
776
  */
748
- if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, TB, O2>): UpdateQueryBuilder<DB, TB, O2 extends UpdateResult ? UpdateResult : O extends UpdateResult ? Partial<O2> : MergePartial<O, O2>>;
777
+ if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): UpdateQueryBuilder<DB, UT, TB, O2 extends UpdateResult ? UpdateResult : O extends UpdateResult ? Partial<O2> : MergePartial<O, O2>>;
749
778
  /**
750
779
  * Change the output type of the query.
751
780
  *
752
781
  * You should only use this method as the last resort if the types
753
782
  * don't support your use case.
754
783
  */
755
- castTo<T>(): UpdateQueryBuilder<DB, TB, T>;
784
+ castTo<T>(): UpdateQueryBuilder<DB, UT, TB, T>;
756
785
  /**
757
786
  * Returns a copy of this UpdateQueryBuilder instance with the given plugin installed.
758
787
  */
759
- withPlugin(plugin: KyselyPlugin): UpdateQueryBuilder<DB, TB, O>;
788
+ withPlugin(plugin: KyselyPlugin): UpdateQueryBuilder<DB, UT, TB, O>;
760
789
  toOperationNode(): UpdateQueryNode;
761
790
  compile(): CompiledQuery;
762
791
  /**
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UpdateQueryBuilder = void 0;
4
4
  const join_parser_js_1 = require("../parser/join-parser.js");
5
+ const table_parser_js_1 = require("../parser/table-parser.js");
5
6
  const select_parser_js_1 = require("../parser/select-parser.js");
6
7
  const filter_parser_js_1 = require("../parser/filter-parser.js");
7
8
  const query_node_js_1 = require("../operation-node/query-node.js");
@@ -64,6 +65,12 @@ class UpdateQueryBuilder {
64
65
  queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(arg)),
65
66
  });
66
67
  }
68
+ from(from) {
69
+ return new UpdateQueryBuilder({
70
+ ...this.#props,
71
+ queryNode: update_query_node_js_1.UpdateQueryNode.cloneWithFromItems(this.#props.queryNode, (0, table_parser_js_1.parseTableExpressionOrList)(from)),
72
+ });
73
+ }
67
74
  innerJoin(...args) {
68
75
  return new UpdateQueryBuilder({
69
76
  ...this.#props,
@@ -427,6 +427,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
427
427
  if (node.updates) {
428
428
  this.compileList(node.updates);
429
429
  }
430
+ if (node.from) {
431
+ this.append(' ');
432
+ this.visitNode(node.from);
433
+ }
430
434
  if (node.joins) {
431
435
  this.append(' ');
432
436
  this.compileList(node.joins, ' ');
@@ -203,7 +203,7 @@ export declare class QueryCreator<DB> {
203
203
  * console.log(result.numUpdatedRows)
204
204
  * ```
205
205
  */
206
- updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<TableExpressionDatabase<DB, TR>, TableExpressionTables<DB, never, TR>, UpdateResult>;
206
+ updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<TableExpressionDatabase<DB, TR>, TableExpressionTables<DB, never, TR>, TableExpressionTables<DB, never, TR>, UpdateResult>;
207
207
  /**
208
208
  * Creates a `with` query (Common Table Expression).
209
209
  *
@@ -5,6 +5,7 @@ import { RawNode } from '../operation-node/raw-node.js';
5
5
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
6
6
  import { QueryExecutorProvider } from '../query-executor/query-executor-provider.js';
7
7
  import { QueryId } from '../util/query-id.js';
8
+ import { AnyRawBuilder } from '../util/type-utils.js';
8
9
  /**
9
10
  * An instance of this class can be used to create raw SQL snippets or queries.
10
11
  *
@@ -38,8 +39,37 @@ export declare class RawBuilder<O = unknown> implements OperationNodeSource {
38
39
  * select concat(first_name, ' ', last_name) as "full_name"
39
40
  * from "person"
40
41
  * ```
42
+ *
43
+ * You can also pass in a raw SQL snippet but in that case you must
44
+ * provide the alias as the only type argument:
45
+ *
46
+ * ```ts
47
+ * const values = sql<{ a: number, b: string }>`(values (1, 'foo'))`
48
+ *
49
+ * // The alias is `t(a, b)` which specifies the column names
50
+ * // in addition to the table name. We must tell kysely that
51
+ * // columns of the table can be referenced through `t`
52
+ * // by providing an explicit type argument.
53
+ * const aliasedValues = values.as<'t'>(sql`t(a, b)`)
54
+ *
55
+ * await db
56
+ * .insertInto('person')
57
+ * .columns(['first_name', 'last_name'])
58
+ * .expression(
59
+ * db.selectFrom(aliasedValues).select(['t.a', 't.b'])
60
+ * )
61
+ * ```
62
+ *
63
+ * The generated SQL (PostgreSQL):
64
+ *
65
+ * ```ts
66
+ * insert into "person" ("first_name", "last_name")
67
+ * from (values (1, 'foo')) as t(a, b)
68
+ * select "t"."a", "t"."b"
69
+ * ```
41
70
  */
42
71
  as<A extends string>(alias: A): AliasedRawBuilder<O, A>;
72
+ as<A extends string = never>(alias: AnyRawBuilder): AliasedRawBuilder<O, A>;
43
73
  /**
44
74
  * Change the output type of the raw expression.
45
75
  *
@@ -67,9 +97,9 @@ export declare class AliasedRawBuilder<O = unknown, A extends string = never> im
67
97
  * which causes this type to be equal to AliasedRawBuilder with any A
68
98
  * as long as O is the same.
69
99
  */
70
- protected get alias(): A;
100
+ protected get alias(): A | AnyRawBuilder;
71
101
  toOperationNode(): AliasNode;
72
- constructor(rawBuilder: RawBuilder<O>, alias: A);
102
+ constructor(rawBuilder: RawBuilder<O>, alias: A | AnyRawBuilder);
73
103
  }
74
104
  export interface RawBuilderProps {
75
105
  readonly queryId: QueryId;
@@ -2,9 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AliasedRawBuilder = exports.RawBuilder = void 0;
4
4
  const alias_node_js_1 = require("../operation-node/alias-node.js");
5
+ const operation_node_source_js_1 = require("../operation-node/operation-node-source.js");
5
6
  const prevent_await_js_1 = require("../util/prevent-await.js");
6
7
  const object_utils_js_1 = require("../util/object-utils.js");
7
8
  const noop_query_executor_js_1 = require("../query-executor/noop-query-executor.js");
9
+ const identifier_node_js_1 = require("../operation-node/identifier-node.js");
8
10
  /**
9
11
  * An instance of this class can be used to create raw SQL snippets or queries.
10
12
  *
@@ -16,31 +18,6 @@ class RawBuilder {
16
18
  constructor(props) {
17
19
  this.#props = (0, object_utils_js_1.freeze)(props);
18
20
  }
19
- /**
20
- * Returns an aliased version of the SQL expression.
21
- *
22
- * In addition to slapping `as "the_alias"` to the end of the SQL,
23
- * this method also provides strict typing:
24
- *
25
- * ```ts
26
- * const result = await db
27
- * .selectFrom('person')
28
- * .select(
29
- * sql<string>`concat(first_name, ' ', last_name)`.as('full_name')
30
- * )
31
- * .executeTakeFirstOrThrow()
32
- *
33
- * // `full_name: string` field exists in the result type.
34
- * console.log(result.full_name)
35
- * ```
36
- *
37
- * The generated SQL (PostgreSQL):
38
- *
39
- * ```ts
40
- * select concat(first_name, ' ', last_name) as "full_name"
41
- * from "person"
42
- * ```
43
- */
44
21
  as(alias) {
45
22
  return new AliasedRawBuilder(this, alias);
46
23
  }
@@ -103,7 +80,9 @@ class AliasedRawBuilder {
103
80
  return this.#alias;
104
81
  }
105
82
  toOperationNode() {
106
- return alias_node_js_1.AliasNode.create(this.#rawBuilder.toOperationNode(), this.#alias);
83
+ return alias_node_js_1.AliasNode.create(this.#rawBuilder.toOperationNode(), (0, operation_node_source_js_1.isOperationNodeSource)(this.#alias)
84
+ ? this.#alias.toOperationNode()
85
+ : identifier_node_js_1.IdentifierNode.create(this.#alias));
107
86
  }
108
87
  constructor(rawBuilder, alias) {
109
88
  this.#rawBuilder = rawBuilder;
@@ -9,12 +9,12 @@ export declare type AliasNodeChild = ColumnNode | ReferenceNode | TableNode | Se
9
9
  export interface AliasNode extends OperationNode {
10
10
  readonly kind: 'AliasNode';
11
11
  readonly node: AliasNodeChild;
12
- readonly alias: IdentifierNode;
12
+ readonly alias: IdentifierNode | RawNode;
13
13
  }
14
14
  /**
15
15
  * @internal
16
16
  */
17
17
  export declare const AliasNode: Readonly<{
18
18
  is(node: OperationNode): node is AliasNode;
19
- create(node: AliasNodeChild, alias: string): AliasNode;
19
+ create(node: AliasNodeChild, alias: IdentifierNode | RawNode): AliasNode;
20
20
  }>;
@@ -1,6 +1,5 @@
1
1
  /// <reference types="./alias-node.d.ts" />
2
2
  import { freeze } from '../util/object-utils.js';
3
- import { IdentifierNode } from './identifier-node.js';
4
3
  /**
5
4
  * @internal
6
5
  */
@@ -12,7 +11,7 @@ export const AliasNode = freeze({
12
11
  return freeze({
13
12
  kind: 'AliasNode',
14
13
  node,
15
- alias: IdentifierNode.create(alias),
14
+ alias,
16
15
  });
17
16
  },
18
17
  });
@@ -331,6 +331,7 @@ export class OperationNodeTransformer {
331
331
  return {
332
332
  kind: 'UpdateQueryNode',
333
333
  table: this.transformNode(node.table),
334
+ from: this.transformNode(node.from),
334
335
  joins: this.transformNodeList(node.joins),
335
336
  where: this.transformNode(node.where),
336
337
  updates: this.transformNodeList(node.updates),
@@ -7,10 +7,12 @@ import { ReturningNode } from './returning-node.js';
7
7
  import { ValueListNode } from './value-list-node.js';
8
8
  import { WhereNode } from './where-node.js';
9
9
  import { WithNode } from './with-node.js';
10
+ import { FromNode } from './from-node.js';
10
11
  export declare type UpdateValuesNode = ValueListNode | PrimitiveValueListNode;
11
12
  export interface UpdateQueryNode extends OperationNode {
12
13
  readonly kind: 'UpdateQueryNode';
13
14
  readonly table: TableExpressionNode;
15
+ readonly from?: FromNode;
14
16
  readonly joins?: ReadonlyArray<JoinNode>;
15
17
  readonly where?: WhereNode;
16
18
  readonly updates?: ReadonlyArray<ColumnUpdateNode>;
@@ -23,5 +25,6 @@ export interface UpdateQueryNode extends OperationNode {
23
25
  export declare const UpdateQueryNode: Readonly<{
24
26
  is(node: OperationNode): node is UpdateQueryNode;
25
27
  create(table: TableExpressionNode, withNode?: WithNode | undefined): UpdateQueryNode;
28
+ cloneWithFromItems(updateQuery: UpdateQueryNode, fromItems: ReadonlyArray<TableExpressionNode>): UpdateQueryNode;
26
29
  cloneWithUpdates(updateQuery: UpdateQueryNode, updates: ReadonlyArray<ColumnUpdateNode>): UpdateQueryNode;
27
30
  }>;
@@ -1,5 +1,6 @@
1
1
  /// <reference types="./update-query-node.d.ts" />
2
2
  import { freeze } from '../util/object-utils.js';
3
+ import { FromNode } from './from-node.js';
3
4
  /**
4
5
  * @internal
5
6
  */
@@ -8,11 +9,19 @@ export const UpdateQueryNode = freeze({
8
9
  return node.kind === 'UpdateQueryNode';
9
10
  },
10
11
  create(table, withNode) {
11
- return {
12
+ return freeze({
12
13
  kind: 'UpdateQueryNode',
13
14
  table,
14
15
  ...(withNode && { with: withNode }),
15
- };
16
+ });
17
+ },
18
+ cloneWithFromItems(updateQuery, fromItems) {
19
+ return freeze({
20
+ ...updateQuery,
21
+ from: updateQuery.from
22
+ ? FromNode.cloneWithFroms(updateQuery.from, fromItems)
23
+ : FromNode.create(fromItems),
24
+ });
16
25
  },
17
26
  cloneWithUpdates(updateQuery, updates) {
18
27
  return freeze({
@@ -6,6 +6,7 @@ import { TableNode } from '../operation-node/table-node.js';
6
6
  import { isReadonlyArray, isString } from '../util/object-utils.js';
7
7
  import { parseComplexExpression, } from './complex-expression-parser.js';
8
8
  import { isDynamicReferenceBuilder, } from '../dynamic/dynamic-reference-builder.js';
9
+ import { IdentifierNode } from '../operation-node/identifier-node.js';
9
10
  export function parseReferenceExpressionOrList(arg) {
10
11
  if (isReadonlyArray(arg)) {
11
12
  return arg.map((it) => parseReferenceExpression(it));
@@ -45,7 +46,7 @@ export function parseAliasedStringReference(ref) {
45
46
  const ALIAS_SEPARATOR = ' as ';
46
47
  if (ref.includes(ALIAS_SEPARATOR)) {
47
48
  const [columnRef, alias] = ref.split(ALIAS_SEPARATOR).map(trim);
48
- return AliasNode.create(parseStringReference(columnRef), alias);
49
+ return AliasNode.create(parseStringReference(columnRef), IdentifierNode.create(alias));
49
50
  }
50
51
  else {
51
52
  return parseStringReference(ref);
@@ -3,6 +3,7 @@ import { isReadonlyArray, isString } from '../util/object-utils.js';
3
3
  import { AliasNode } from '../operation-node/alias-node.js';
4
4
  import { TableNode } from '../operation-node/table-node.js';
5
5
  import { parseAliasedComplexExpression, } from './complex-expression-parser.js';
6
+ import { IdentifierNode } from '../operation-node/identifier-node.js';
6
7
  export function parseTableExpressionOrList(table) {
7
8
  if (isReadonlyArray(table)) {
8
9
  return table.map((it) => parseTableExpression(it));
@@ -23,7 +24,7 @@ export function parseAliasedTable(from) {
23
24
  const ALIAS_SEPARATOR = ' as ';
24
25
  if (from.includes(ALIAS_SEPARATOR)) {
25
26
  const [table, alias] = from.split(ALIAS_SEPARATOR).map(trim);
26
- return AliasNode.create(parseTable(table), alias);
27
+ return AliasNode.create(parseTable(table), IdentifierNode.create(alias));
27
28
  }
28
29
  else {
29
30
  return parseTable(from);
@@ -1,7 +1,7 @@
1
1
  import { ColumnUpdateNode } from '../operation-node/column-update-node.js';
2
2
  import { UpdateKeys, UpdateType } from '../util/column-type.js';
3
3
  import { ValueExpression } from './value-parser.js';
4
- export declare type MutationObject<DB, TB extends keyof DB> = {
5
- [C in UpdateKeys<DB[TB]>]?: ValueExpression<DB, TB, UpdateType<DB[TB][C]>>;
4
+ export declare type MutationObject<DB, TB extends keyof DB, TM extends keyof DB> = {
5
+ [C in UpdateKeys<DB[TM]>]?: ValueExpression<DB, TB, UpdateType<DB[TM][C]>>;
6
6
  };
7
- export declare function parseUpdateObject(row: MutationObject<any, any>): ReadonlyArray<ColumnUpdateNode>;
7
+ export declare function parseUpdateObject(row: MutationObject<any, any, any>): ReadonlyArray<ColumnUpdateNode>;
@@ -8,14 +8,14 @@ import { RawBuilder } from '../raw-builder/raw-builder.js';
8
8
  export declare type CommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB>) => CommonTableExpressionOutput<DB, CN>;
9
9
  export declare type RecursiveCommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpressionName<CN>>>) => CommonTableExpressionOutput<DB, CN>;
10
10
  export declare type QueryCreatorWithCommonTableExpression<DB, CN extends string, CTE> = QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpression<CTE>>>;
11
- declare type CommonTableExpressionOutput<DB, CN extends string> = SelectQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | InsertQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | UpdateQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | DeleteQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | RawBuilder<ExtractRowFromCommonTableExpressionName<CN>>;
11
+ declare type CommonTableExpressionOutput<DB, CN extends string> = SelectQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | InsertQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | UpdateQueryBuilder<DB, any, any, ExtractRowFromCommonTableExpressionName<CN>> | DeleteQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | RawBuilder<ExtractRowFromCommonTableExpressionName<CN>>;
12
12
  /**
13
13
  * Given a common CommonTableExpression CTE extracts the row type from it.
14
14
  *
15
15
  * For example a CTE `(db) => db.selectFrom('person').select(['id', 'first_name'])`
16
16
  * would result in `Pick<Person, 'id' | 'first_name'>`.
17
17
  */
18
- declare type ExtractRowFromCommonTableExpression<CTE> = CTE extends (creator: QueryCreator<any>) => infer Q ? Q extends SelectQueryBuilder<any, any, infer QO> ? QO : Q extends InsertQueryBuilder<any, any, infer QO> ? QO : Q extends UpdateQueryBuilder<any, any, infer QO> ? QO : Q extends DeleteQueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
18
+ declare type ExtractRowFromCommonTableExpression<CTE> = CTE extends (creator: QueryCreator<any>) => infer Q ? Q extends SelectQueryBuilder<any, any, infer QO> ? QO : Q extends InsertQueryBuilder<any, any, infer QO> ? QO : Q extends UpdateQueryBuilder<any, any, any, infer QO> ? QO : Q extends DeleteQueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
19
19
  /**
20
20
  * Extracts 'person' from a string like 'person(id, first_name)'.
21
21
  */
@@ -382,7 +382,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
382
382
  * .onDuplicateKeyUpdate({ species: 'hamster' })
383
383
  * ```
384
384
  */
385
- onDuplicateKeyUpdate(updates: MutationObject<DB, TB>): InsertQueryBuilder<DB, TB, O>;
385
+ onDuplicateKeyUpdate(updates: MutationObject<DB, TB, TB>): InsertQueryBuilder<DB, TB, O>;
386
386
  /**
387
387
  * Allows you to return data from modified rows.
388
388
  *
@@ -386,7 +386,7 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
386
386
  * do update set "first_name" = $3
387
387
  * ```
388
388
  */
389
- doUpdateSet(updates: MutationObject<OnConflictDatabase<DB, TB>, OnConflictTables<TB>>): OnConflictUpdateBuilder<OnConflictDatabase<DB, TB>, OnConflictTables<TB>>;
389
+ doUpdateSet(updates: MutationObject<OnConflictDatabase<DB, TB>, OnConflictTables<TB>, OnConflictTables<TB>>): OnConflictUpdateBuilder<OnConflictDatabase<DB, TB>, OnConflictTables<TB>>;
390
390
  }
391
391
  export interface OnConflictBuilderProps {
392
392
  readonly onConflictNode: OnConflictNode;
@@ -1212,7 +1212,7 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1212
1212
  * ### Examples
1213
1213
  *
1214
1214
  * ```ts
1215
- * await db.selectFrom('pet')
1215
+ * const pets = await db.selectFrom('pet')
1216
1216
  * .selectAll('pet')
1217
1217
  * .select(
1218
1218
  * (qb) => qb.selectFrom('person')
@@ -1221,6 +1221,8 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1221
1221
  * .as('owner_first_name')
1222
1222
  * )
1223
1223
  * .execute()
1224
+ *
1225
+ * pets[0].owner_first_name
1224
1226
  * ```
1225
1227
  */
1226
1228
  as<A extends string>(alias: A): AliasedQueryBuilder<DB, TB, O, A>;
@@ -13,6 +13,7 @@ import { freeze } from '../util/object-utils.js';
13
13
  import { parseGroupBy } from '../parser/group-by-parser.js';
14
14
  import { parseUnion } from '../parser/union-parser.js';
15
15
  import { NoResultError } from './no-result-error.js';
16
+ import { IdentifierNode } from '../operation-node/identifier-node.js';
16
17
  export class SelectQueryBuilder {
17
18
  #props;
18
19
  constructor(props) {
@@ -513,7 +514,7 @@ export class SelectQueryBuilder {
513
514
  * ### Examples
514
515
  *
515
516
  * ```ts
516
- * await db.selectFrom('pet')
517
+ * const pets = await db.selectFrom('pet')
517
518
  * .selectAll('pet')
518
519
  * .select(
519
520
  * (qb) => qb.selectFrom('person')
@@ -522,6 +523,8 @@ export class SelectQueryBuilder {
522
523
  * .as('owner_first_name')
523
524
  * )
524
525
  * .execute()
526
+ *
527
+ * pets[0].owner_first_name
525
528
  * ```
526
529
  */
527
530
  as(alias) {
@@ -610,9 +613,6 @@ export class AliasedQueryBuilder {
610
613
  }
611
614
  toOperationNode() {
612
615
  const node = this.#queryBuilder.toOperationNode();
613
- if (SelectQueryNode.is(node)) {
614
- return AliasNode.create(node, this.#alias);
615
- }
616
- throw new Error('only select queries can be aliased');
616
+ return AliasNode.create(node, IdentifierNode.create(this.#alias));
617
617
  }
618
618
  }
@@ -19,7 +19,7 @@ import { JoinInterface } from './join-interface.js';
19
19
  import { ReturningInterface } from './returning-interface.js';
20
20
  import { NoResultErrorConstructor } from './no-result-error.js';
21
21
  import { Selectable } from '../util/column-type.js';
22
- export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, JoinInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable {
22
+ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, JoinInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable {
23
23
  #private;
24
24
  constructor(props: UpdateQueryBuilderProps);
25
25
  /**
@@ -206,9 +206,9 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
206
206
  * .execute()
207
207
  * ```
208
208
  */
209
- where<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): UpdateQueryBuilder<DB, TB, O>;
210
- where(grouper: WhereGrouper<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
211
- where(raw: AnyRawBuilder): UpdateQueryBuilder<DB, TB, O>;
209
+ where<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): UpdateQueryBuilder<DB, UT, TB, O>;
210
+ where(grouper: WhereGrouper<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
211
+ where(raw: AnyRawBuilder): UpdateQueryBuilder<DB, UT, TB, O>;
212
212
  /**
213
213
  * Adds a `where` clause where both sides of the operator are references
214
214
  * to columns.
@@ -260,7 +260,7 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
260
260
  * ) as "pet_name"
261
261
  * from "person"
262
262
  */
263
- whereRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
263
+ whereRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
264
264
  /**
265
265
  * Adds an `or where` clause to the query. Otherwise works just like {@link where}.
266
266
  *
@@ -324,15 +324,15 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
324
324
  * select * from "person" (where "id" = 1 or "id" = 2)
325
325
  * ```
326
326
  */
327
- orWhere<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): UpdateQueryBuilder<DB, TB, O>;
328
- orWhere(grouper: WhereGrouper<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
329
- orWhere(raw: AnyRawBuilder): UpdateQueryBuilder<DB, TB, O>;
327
+ orWhere<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: FilterValueExpressionOrList<DB, TB, RE>): UpdateQueryBuilder<DB, UT, TB, O>;
328
+ orWhere(grouper: WhereGrouper<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
329
+ orWhere(raw: AnyRawBuilder): UpdateQueryBuilder<DB, UT, TB, O>;
330
330
  /**
331
331
  * Adds an `or where` clause to the query. Otherwise works just like {@link whereRef}.
332
332
  *
333
333
  * Also see {@link orWhere} and {@link where}.
334
334
  */
335
- orWhereRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
335
+ orWhereRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
336
336
  /**
337
337
  * Adds a `where exists` clause to the query.
338
338
  *
@@ -393,19 +393,48 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
393
393
  * )
394
394
  * ```
395
395
  */
396
- whereExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
396
+ whereExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
397
397
  /**
398
398
  * Just like {@link whereExists} but creates a `not exists` clause.
399
399
  */
400
- whereNotExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
400
+ whereNotExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
401
401
  /**
402
402
  * Just like {@link whereExists} but creates a `or exists` clause.
403
403
  */
404
- orWhereExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
404
+ orWhereExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
405
405
  /**
406
406
  * Just like {@link whereExists} but creates a `or not exists` clause.
407
407
  */
408
- orWhereNotExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
408
+ orWhereNotExists(arg: ExistsExpression<DB, TB>): UpdateQueryBuilder<DB, UT, TB, O>;
409
+ /**
410
+ * Adds a from clause to the update query.
411
+ *
412
+ * This is supported only on some databases like PostgreSQL.
413
+ *
414
+ * The API is the same as {@link QueryCreator.selectFrom}.
415
+ *
416
+ * ### Examples
417
+ *
418
+ * ```ts
419
+ * db.updateTable('person')
420
+ * .from('pet')
421
+ * .set({
422
+ * first_name: (eb) => eb.ref('pet.name')
423
+ * })
424
+ * .whereRef('pet.owner_id', '=', 'person.id')
425
+ * ```
426
+ *
427
+ * The generated SQL (PostgreSQL):
428
+ *
429
+ * ```sql
430
+ * update "person"
431
+ * set "first_name" = "pet"."name"
432
+ * from "pet"
433
+ * where "pet"."owner_id" = "person"."id"
434
+ * ```
435
+ */
436
+ 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<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
409
438
  /**
410
439
  * Joins another table to the query using an inner join.
411
440
  *
@@ -515,23 +544,23 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
515
544
  * on "doggos"."owner_id" = "person"."id"
516
545
  * ```
517
546
  */
518
- innerJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, O>;
519
- innerJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, O>;
547
+ innerJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
548
+ innerJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<TableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
520
549
  /**
521
550
  * Just like {@link innerJoin} but adds a left join nstead of an inner join.
522
551
  */
523
- leftJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, O>;
524
- leftJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, TableExpressionTables<DB, TB, TE>, O>;
552
+ leftJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
553
+ leftJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
525
554
  /**
526
555
  * Just like {@link innerJoin} but adds a right join instead of an inner join.
527
556
  */
528
- rightJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, TableExpressionTables<DB, TB, TE>, O>;
529
- rightJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, TableExpressionTables<DB, TB, TE>, O>;
557
+ rightJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
558
+ rightJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
530
559
  /**
531
560
  * Just like {@link innerJoin} but adds a full join instead of an inner join.
532
561
  */
533
- fullJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, TableExpressionTables<DB, TB, TE>, O>;
534
- fullJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, TableExpressionTables<DB, TB, TE>, O>;
562
+ fullJoin<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): UpdateQueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
563
+ fullJoin<TE extends TableExpression<DB, TB>, FN extends JoinCallbackExpression<DB, TB, TE>>(table: TE, callback: FN): UpdateQueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, UT, TableExpressionTables<DB, TB, TE>, O>;
535
564
  /**
536
565
  * Sets the values to update for an {@link Kysely.updateTable | update} query.
537
566
  *
@@ -619,7 +648,7 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
619
648
  * where "id" = $4
620
649
  * ```
621
650
  */
622
- set(row: MutationObject<DB, TB>): UpdateQueryBuilder<DB, TB, O>;
651
+ set(row: MutationObject<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
623
652
  /**
624
653
  * Allows you to return data from modified rows.
625
654
  *
@@ -679,13 +708,13 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
679
708
  * .executeTakeFirst()
680
709
  * ```
681
710
  */
682
- returning<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): UpdateQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SE>>;
683
- returning<SE extends SelectExpression<DB, TB>>(selection: SE): UpdateQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SE>>;
711
+ returning<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SE>>;
712
+ returning<SE extends SelectExpression<DB, TB>>(selection: SE): UpdateQueryBuilder<DB, UT, TB, ReturningRow<DB, TB, O, SE>>;
684
713
  /**
685
714
  * Adds a `returning *` to an insert/update/delete query on databases
686
715
  * that support `returning` such as PostgreSQL.
687
716
  */
688
- returningAll(): UpdateQueryBuilder<DB, TB, Selectable<DB[TB]>>;
717
+ returningAll(): UpdateQueryBuilder<DB, UT, TB, Selectable<DB[TB]>>;
689
718
  /**
690
719
  * Simply calls the given function passing `this` as the only argument.
691
720
  *
@@ -745,18 +774,18 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
745
774
  * }
746
775
  * ```
747
776
  */
748
- if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, TB, O2>): UpdateQueryBuilder<DB, TB, O2 extends UpdateResult ? UpdateResult : O extends UpdateResult ? Partial<O2> : MergePartial<O, O2>>;
777
+ if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): UpdateQueryBuilder<DB, UT, TB, O2 extends UpdateResult ? UpdateResult : O extends UpdateResult ? Partial<O2> : MergePartial<O, O2>>;
749
778
  /**
750
779
  * Change the output type of the query.
751
780
  *
752
781
  * You should only use this method as the last resort if the types
753
782
  * don't support your use case.
754
783
  */
755
- castTo<T>(): UpdateQueryBuilder<DB, TB, T>;
784
+ castTo<T>(): UpdateQueryBuilder<DB, UT, TB, T>;
756
785
  /**
757
786
  * Returns a copy of this UpdateQueryBuilder instance with the given plugin installed.
758
787
  */
759
- withPlugin(plugin: KyselyPlugin): UpdateQueryBuilder<DB, TB, O>;
788
+ withPlugin(plugin: KyselyPlugin): UpdateQueryBuilder<DB, UT, TB, O>;
760
789
  toOperationNode(): UpdateQueryNode;
761
790
  compile(): CompiledQuery;
762
791
  /**
@@ -1,5 +1,6 @@
1
1
  /// <reference types="./update-query-builder.d.ts" />
2
2
  import { parseJoin, } from '../parser/join-parser.js';
3
+ import { parseTableExpressionOrList, } from '../parser/table-parser.js';
3
4
  import { parseSelectExpressionOrList, parseSelectAll, } from '../parser/select-parser.js';
4
5
  import { parseExistFilter, parseReferenceFilter, parseWhereFilter, parseNotExistFilter, } from '../parser/filter-parser.js';
5
6
  import { QueryNode } from '../operation-node/query-node.js';
@@ -62,6 +63,12 @@ export class UpdateQueryBuilder {
62
63
  queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseNotExistFilter(arg)),
63
64
  });
64
65
  }
66
+ from(from) {
67
+ return new UpdateQueryBuilder({
68
+ ...this.#props,
69
+ queryNode: UpdateQueryNode.cloneWithFromItems(this.#props.queryNode, parseTableExpressionOrList(from)),
70
+ });
71
+ }
65
72
  innerJoin(...args) {
66
73
  return new UpdateQueryBuilder({
67
74
  ...this.#props,
@@ -425,6 +425,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
425
425
  if (node.updates) {
426
426
  this.compileList(node.updates);
427
427
  }
428
+ if (node.from) {
429
+ this.append(' ');
430
+ this.visitNode(node.from);
431
+ }
428
432
  if (node.joins) {
429
433
  this.append(' ');
430
434
  this.compileList(node.joins, ' ');
@@ -203,7 +203,7 @@ export declare class QueryCreator<DB> {
203
203
  * console.log(result.numUpdatedRows)
204
204
  * ```
205
205
  */
206
- updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<TableExpressionDatabase<DB, TR>, TableExpressionTables<DB, never, TR>, UpdateResult>;
206
+ updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<TableExpressionDatabase<DB, TR>, TableExpressionTables<DB, never, TR>, TableExpressionTables<DB, never, TR>, UpdateResult>;
207
207
  /**
208
208
  * Creates a `with` query (Common Table Expression).
209
209
  *
@@ -5,6 +5,7 @@ import { RawNode } from '../operation-node/raw-node.js';
5
5
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
6
6
  import { QueryExecutorProvider } from '../query-executor/query-executor-provider.js';
7
7
  import { QueryId } from '../util/query-id.js';
8
+ import { AnyRawBuilder } from '../util/type-utils.js';
8
9
  /**
9
10
  * An instance of this class can be used to create raw SQL snippets or queries.
10
11
  *
@@ -38,8 +39,37 @@ export declare class RawBuilder<O = unknown> implements OperationNodeSource {
38
39
  * select concat(first_name, ' ', last_name) as "full_name"
39
40
  * from "person"
40
41
  * ```
42
+ *
43
+ * You can also pass in a raw SQL snippet but in that case you must
44
+ * provide the alias as the only type argument:
45
+ *
46
+ * ```ts
47
+ * const values = sql<{ a: number, b: string }>`(values (1, 'foo'))`
48
+ *
49
+ * // The alias is `t(a, b)` which specifies the column names
50
+ * // in addition to the table name. We must tell kysely that
51
+ * // columns of the table can be referenced through `t`
52
+ * // by providing an explicit type argument.
53
+ * const aliasedValues = values.as<'t'>(sql`t(a, b)`)
54
+ *
55
+ * await db
56
+ * .insertInto('person')
57
+ * .columns(['first_name', 'last_name'])
58
+ * .expression(
59
+ * db.selectFrom(aliasedValues).select(['t.a', 't.b'])
60
+ * )
61
+ * ```
62
+ *
63
+ * The generated SQL (PostgreSQL):
64
+ *
65
+ * ```ts
66
+ * insert into "person" ("first_name", "last_name")
67
+ * from (values (1, 'foo')) as t(a, b)
68
+ * select "t"."a", "t"."b"
69
+ * ```
41
70
  */
42
71
  as<A extends string>(alias: A): AliasedRawBuilder<O, A>;
72
+ as<A extends string = never>(alias: AnyRawBuilder): AliasedRawBuilder<O, A>;
43
73
  /**
44
74
  * Change the output type of the raw expression.
45
75
  *
@@ -67,9 +97,9 @@ export declare class AliasedRawBuilder<O = unknown, A extends string = never> im
67
97
  * which causes this type to be equal to AliasedRawBuilder with any A
68
98
  * as long as O is the same.
69
99
  */
70
- protected get alias(): A;
100
+ protected get alias(): A | AnyRawBuilder;
71
101
  toOperationNode(): AliasNode;
72
- constructor(rawBuilder: RawBuilder<O>, alias: A);
102
+ constructor(rawBuilder: RawBuilder<O>, alias: A | AnyRawBuilder);
73
103
  }
74
104
  export interface RawBuilderProps {
75
105
  readonly queryId: QueryId;
@@ -1,8 +1,10 @@
1
1
  /// <reference types="./raw-builder.d.ts" />
2
2
  import { AliasNode } from '../operation-node/alias-node.js';
3
+ import { isOperationNodeSource, } from '../operation-node/operation-node-source.js';
3
4
  import { preventAwait } from '../util/prevent-await.js';
4
5
  import { freeze } from '../util/object-utils.js';
5
6
  import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
7
+ import { IdentifierNode } from '../operation-node/identifier-node.js';
6
8
  /**
7
9
  * An instance of this class can be used to create raw SQL snippets or queries.
8
10
  *
@@ -14,31 +16,6 @@ export class RawBuilder {
14
16
  constructor(props) {
15
17
  this.#props = freeze(props);
16
18
  }
17
- /**
18
- * Returns an aliased version of the SQL expression.
19
- *
20
- * In addition to slapping `as "the_alias"` to the end of the SQL,
21
- * this method also provides strict typing:
22
- *
23
- * ```ts
24
- * const result = await db
25
- * .selectFrom('person')
26
- * .select(
27
- * sql<string>`concat(first_name, ' ', last_name)`.as('full_name')
28
- * )
29
- * .executeTakeFirstOrThrow()
30
- *
31
- * // `full_name: string` field exists in the result type.
32
- * console.log(result.full_name)
33
- * ```
34
- *
35
- * The generated SQL (PostgreSQL):
36
- *
37
- * ```ts
38
- * select concat(first_name, ' ', last_name) as "full_name"
39
- * from "person"
40
- * ```
41
- */
42
19
  as(alias) {
43
20
  return new AliasedRawBuilder(this, alias);
44
21
  }
@@ -100,7 +77,9 @@ export class AliasedRawBuilder {
100
77
  return this.#alias;
101
78
  }
102
79
  toOperationNode() {
103
- return AliasNode.create(this.#rawBuilder.toOperationNode(), this.#alias);
80
+ return AliasNode.create(this.#rawBuilder.toOperationNode(), isOperationNodeSource(this.#alias)
81
+ ? this.#alias.toOperationNode()
82
+ : IdentifierNode.create(this.#alias));
104
83
  }
105
84
  constructor(rawBuilder, alias) {
106
85
  this.#rawBuilder = rawBuilder;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.17.3",
3
+ "version": "0.18.0",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",