kysely 0.9.0 → 0.9.4

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 (109) hide show
  1. package/dist/cjs/dialect/mysql/mysql-dialect.d.ts +9 -0
  2. package/dist/cjs/dialect/mysql/mysql-dialect.js +7 -0
  3. package/dist/cjs/dialect/mysql/mysql-driver.js +2 -2
  4. package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +11 -1
  5. package/dist/cjs/dialect/postgres/postgres-dialect.js +10 -0
  6. package/dist/cjs/driver/runtime-driver.d.ts +3 -2
  7. package/dist/cjs/driver/runtime-driver.js +43 -4
  8. package/dist/cjs/index.d.ts +1 -1
  9. package/dist/cjs/kysely.d.ts +26 -9
  10. package/dist/cjs/kysely.js +16 -9
  11. package/dist/cjs/migration/migration.d.ts +32 -0
  12. package/dist/cjs/operation-node/create-schema-node.d.ts +1 -1
  13. package/dist/cjs/operation-node/create-schema-node.js +2 -2
  14. package/dist/cjs/operation-node/create-table-node.d.ts +1 -5
  15. package/dist/cjs/operation-node/create-table-node.js +1 -31
  16. package/dist/cjs/operation-node/join-node.d.ts +2 -1
  17. package/dist/cjs/operation-node/join-node.js +8 -6
  18. package/dist/cjs/operation-node/operation-node-source.d.ts +1 -1
  19. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  20. package/dist/cjs/operation-node/operation-node-transformer.js +11 -1
  21. package/dist/cjs/operation-node/operation-node-visitor.d.ts +61 -59
  22. package/dist/cjs/operation-node/operation-node-visitor.js +1 -316
  23. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  24. package/dist/cjs/operation-node/query-node.d.ts +4 -3
  25. package/dist/cjs/operation-node/query-node.js +10 -2
  26. package/dist/cjs/operation-node/select-query-node.d.ts +5 -1
  27. package/dist/cjs/operation-node/select-query-node.js +18 -2
  28. package/dist/cjs/operation-node/union-node.d.ts +16 -0
  29. package/dist/cjs/operation-node/union-node.js +19 -0
  30. package/dist/cjs/parser/group-by-parser.d.ts +4 -0
  31. package/dist/cjs/parser/group-by-parser.js +9 -0
  32. package/dist/cjs/parser/insert-values-parser.d.ts +1 -1
  33. package/dist/cjs/parser/join-parser.d.ts +4 -4
  34. package/dist/cjs/parser/order-by-parser.d.ts +2 -4
  35. package/dist/cjs/parser/order-by-parser.js +6 -3
  36. package/dist/cjs/parser/reference-parser.d.ts +1 -1
  37. package/dist/cjs/parser/reference-parser.js +1 -1
  38. package/dist/cjs/parser/union-parser.d.ts +5 -0
  39. package/dist/cjs/parser/union-parser.js +13 -0
  40. package/dist/cjs/parser/value-parser.d.ts +1 -1
  41. package/dist/cjs/query-builder/join-builder.js +8 -8
  42. package/dist/cjs/query-builder/query-builder.d.ts +65 -1
  43. package/dist/cjs/query-builder/query-builder.js +103 -22
  44. package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
  45. package/dist/cjs/query-compiler/default-query-compiler.d.ts +7 -2
  46. package/dist/cjs/query-compiler/default-query-compiler.js +21 -4
  47. package/dist/cjs/schema/create-schema-builder.js +1 -1
  48. package/dist/cjs/schema/create-table-builder.js +7 -4
  49. package/dist/cjs/util/log.d.ts +8 -0
  50. package/dist/cjs/util/log.js +21 -0
  51. package/dist/cjs/util/object-utils.d.ts +11 -11
  52. package/dist/cjs/util/object-utils.js +1 -1
  53. package/dist/cjs/util/random-string.js +6 -3
  54. package/dist/cjs/util/type-utils.d.ts +4 -4
  55. package/dist/esm/dialect/mysql/mysql-dialect.d.ts +9 -0
  56. package/dist/esm/dialect/mysql/mysql-dialect.js +7 -0
  57. package/dist/esm/dialect/mysql/mysql-driver.js +3 -3
  58. package/dist/esm/dialect/postgres/postgres-dialect.d.ts +11 -1
  59. package/dist/esm/dialect/postgres/postgres-dialect.js +10 -0
  60. package/dist/esm/driver/runtime-driver.d.ts +3 -2
  61. package/dist/esm/driver/runtime-driver.js +43 -4
  62. package/dist/esm/index.d.ts +1 -1
  63. package/dist/esm/kysely.d.ts +26 -9
  64. package/dist/esm/kysely.js +16 -9
  65. package/dist/esm/migration/migration.d.ts +32 -0
  66. package/dist/esm/operation-node/create-schema-node.d.ts +1 -1
  67. package/dist/esm/operation-node/create-schema-node.js +2 -2
  68. package/dist/esm/operation-node/create-table-node.d.ts +1 -5
  69. package/dist/esm/operation-node/create-table-node.js +1 -31
  70. package/dist/esm/operation-node/join-node.d.ts +2 -1
  71. package/dist/esm/operation-node/join-node.js +8 -6
  72. package/dist/esm/operation-node/operation-node-source.d.ts +1 -1
  73. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  74. package/dist/esm/operation-node/operation-node-transformer.js +11 -1
  75. package/dist/esm/operation-node/operation-node-visitor.d.ts +61 -59
  76. package/dist/esm/operation-node/operation-node-visitor.js +1 -316
  77. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  78. package/dist/esm/operation-node/query-node.d.ts +4 -3
  79. package/dist/esm/operation-node/query-node.js +10 -2
  80. package/dist/esm/operation-node/select-query-node.d.ts +5 -1
  81. package/dist/esm/operation-node/select-query-node.js +18 -2
  82. package/dist/esm/operation-node/union-node.d.ts +16 -0
  83. package/dist/esm/operation-node/union-node.js +16 -0
  84. package/dist/esm/parser/group-by-parser.d.ts +4 -0
  85. package/dist/esm/parser/group-by-parser.js +5 -0
  86. package/dist/esm/parser/insert-values-parser.d.ts +1 -1
  87. package/dist/esm/parser/join-parser.d.ts +4 -4
  88. package/dist/esm/parser/order-by-parser.d.ts +2 -4
  89. package/dist/esm/parser/order-by-parser.js +6 -2
  90. package/dist/esm/parser/reference-parser.d.ts +1 -1
  91. package/dist/esm/parser/reference-parser.js +2 -2
  92. package/dist/esm/parser/union-parser.d.ts +5 -0
  93. package/dist/esm/parser/union-parser.js +9 -0
  94. package/dist/esm/parser/value-parser.d.ts +1 -1
  95. package/dist/esm/query-builder/join-builder.js +8 -8
  96. package/dist/esm/query-builder/query-builder.d.ts +65 -1
  97. package/dist/esm/query-builder/query-builder.js +104 -23
  98. package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
  99. package/dist/esm/query-compiler/default-query-compiler.d.ts +7 -2
  100. package/dist/esm/query-compiler/default-query-compiler.js +21 -4
  101. package/dist/esm/schema/create-schema-builder.js +1 -1
  102. package/dist/esm/schema/create-table-builder.js +7 -4
  103. package/dist/esm/util/log.d.ts +8 -0
  104. package/dist/esm/util/log.js +17 -0
  105. package/dist/esm/util/object-utils.d.ts +11 -11
  106. package/dist/esm/util/object-utils.js +1 -1
  107. package/dist/esm/util/random-string.js +6 -3
  108. package/dist/esm/util/type-utils.d.ts +4 -4
  109. package/package.json +1 -1
@@ -8,7 +8,7 @@ import { PrimitiveValue } from '../util/object-utils.js';
8
8
  export declare type InsertObject<DB, TB extends keyof DB> = {
9
9
  [C in keyof DB[TB]]: InsertValueExpression<DB[TB][C]>;
10
10
  };
11
- export declare type InsertObjectOrList<DB, TB extends keyof DB> = InsertObject<DB, TB> | InsertObject<DB, TB>[];
11
+ export declare type InsertObjectOrList<DB, TB extends keyof DB> = InsertObject<DB, TB> | ReadonlyArray<InsertObject<DB, TB>>;
12
12
  declare type InsertValueExpression<T> = T | AnyQueryBuilder | AnyRawBuilder | GeneratedPlaceholder;
13
13
  export declare function parseInsertObjectOrList(args: InsertObjectOrList<any, any>): [ReadonlyArray<ColumnNode>, ReadonlyArray<InsertValuesNode>];
14
14
  export declare function parseInsertValueExpression(value: InsertValueExpression<PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
@@ -3,9 +3,9 @@ import { AnyColumn, AnyColumnWithTable } from '../util/type-utils.js';
3
3
  import { ExtractAliasFromTableExpression, TableExpressionDatabase } from './table-parser.js';
4
4
  import { JoinBuilder } from '../query-builder/join-builder.js';
5
5
  import { ParseContext } from './parse-context.js';
6
- export declare type JoinReferenceExpression<DB, TB extends keyof DB, F> = AnyJoinColumn<DB, TB, F> | AnyJoinColumnWithTable<DB, TB, F>;
7
- export declare type JoinCallbackExpression<DB, TB extends keyof DB, F> = (join: JoinBuilder<TableExpressionDatabase<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>) => JoinBuilder<any, any>;
8
- declare type AnyJoinColumn<DB, TB extends keyof DB, F> = AnyColumn<TableExpressionDatabase<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>;
9
- declare type AnyJoinColumnWithTable<DB, TB extends keyof DB, F> = AnyColumnWithTable<TableExpressionDatabase<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>;
6
+ export declare type JoinReferenceExpression<DB, TB extends keyof DB, TE> = AnyJoinColumn<DB, TB, TE> | AnyJoinColumnWithTable<DB, TB, TE>;
7
+ export declare type JoinCallbackExpression<DB, TB extends keyof DB, TE> = (join: JoinBuilder<TableExpressionDatabase<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>>) => JoinBuilder<any, any>;
8
+ declare type AnyJoinColumn<DB, TB extends keyof DB, TE> = AnyColumn<TableExpressionDatabase<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>>;
9
+ declare type AnyJoinColumnWithTable<DB, TB extends keyof DB, TE> = AnyColumnWithTable<TableExpressionDatabase<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>>;
10
10
  export declare function parseJoin(ctx: ParseContext, joinType: JoinType, args: any[]): JoinNode;
11
11
  export {};
@@ -1,10 +1,8 @@
1
- import { ReferenceExpressionNode } from '../operation-node/operation-node-utils.js';
2
- import { RawNode } from '../operation-node/raw-node.js';
1
+ import { OrderByItemNode } from '../operation-node/order-by-item-node.js';
3
2
  import { AnyRawBuilder } from '../util/type-utils.js';
4
3
  import { ParseContext } from './parse-context.js';
5
4
  import { ReferenceExpression } from './reference-parser.js';
6
5
  export declare type OrderByDirection = 'asc' | 'desc';
7
6
  export declare type OrderByExpression<DB, TB extends keyof DB, O> = ReferenceExpression<DB, TB> | keyof O;
8
7
  export declare type OrderByDirectionExpression = OrderByDirection | AnyRawBuilder;
9
- export declare function parseOrderByExpression(ctx: ParseContext, expr: OrderByExpression<any, any, any>): ReferenceExpressionNode;
10
- export declare function parseOrderByDirectionExpression(expr?: OrderByDirectionExpression): RawNode | undefined;
8
+ export declare function parseOrderBy(ctx: ParseContext, orderBy: OrderByExpression<any, any, any>, direction?: OrderByDirectionExpression): OrderByItemNode;
@@ -1,9 +1,13 @@
1
+ import { OrderByItemNode } from '../operation-node/order-by-item-node.js';
1
2
  import { RawNode } from '../operation-node/raw-node.js';
2
3
  import { parseReferenceExpression, } from './reference-parser.js';
3
- export function parseOrderByExpression(ctx, expr) {
4
+ export function parseOrderBy(ctx, orderBy, direction) {
5
+ return OrderByItemNode.create(parseOrderByExpression(ctx, orderBy), parseOrderByDirectionExpression(direction));
6
+ }
7
+ function parseOrderByExpression(ctx, expr) {
4
8
  return parseReferenceExpression(ctx, expr);
5
9
  }
6
- export function parseOrderByDirectionExpression(expr) {
10
+ function parseOrderByDirectionExpression(expr) {
7
11
  if (!expr) {
8
12
  return undefined;
9
13
  }
@@ -9,7 +9,7 @@ import { RawBuilder } from '../raw-builder/raw-builder.js';
9
9
  import { QueryBuilder } from '../query-builder/query-builder.js';
10
10
  import { ParseContext } from './parse-context.js';
11
11
  export declare type ReferenceExpression<DB, TB extends keyof DB> = StringReference<DB, TB> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
12
- export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReferenceExpression<DB, TB>[];
12
+ export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReadonlyArray<ReferenceExpression<DB, TB>>;
13
13
  export declare type StringReference<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB>;
14
14
  export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE> = RE extends string ? ExtractTypeFromStringReference<DB, TB, RE> : RE extends RawBuilder<infer O> ? O : RE extends (qb: any) => RawBuilder<infer O> ? O : RE extends QueryBuilder<any, any, infer O> ? ValueType<O> : RE extends (qb: any) => QueryBuilder<any, any, infer O> ? ValueType<O> : PrimitiveValue;
15
15
  declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, S extends string, R = RowType<DB, TB>> = S extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : S extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : S extends keyof R ? R[S] : PrimitiveValue;
@@ -3,10 +3,10 @@ import { ColumnNode } from '../operation-node/column-node.js';
3
3
  import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
4
4
  import { ReferenceNode } from '../operation-node/reference-node.js';
5
5
  import { TableNode } from '../operation-node/table-node.js';
6
- import { isFunction, isString } from '../util/object-utils.js';
6
+ import { isFunction, isReadonlyArray, isString, } from '../util/object-utils.js';
7
7
  import { QueryNode } from '../operation-node/query-node.js';
8
8
  export function parseReferenceExpressionOrList(ctx, arg) {
9
- if (Array.isArray(arg)) {
9
+ if (isReadonlyArray(arg)) {
10
10
  return arg.map((it) => parseReferenceExpression(ctx, it));
11
11
  }
12
12
  else {
@@ -0,0 +1,5 @@
1
+ import { UnionNode } from '../operation-node/union-node.js';
2
+ import { QueryBuilder } from '../query-builder/query-builder.js';
3
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
4
+ export declare type UnionExpression<DB, O> = QueryBuilder<DB, any, O> | RawBuilder<O>;
5
+ export declare function parseUnion(union: UnionExpression<any, any>, all: boolean): UnionNode;
@@ -0,0 +1,9 @@
1
+ import { QueryNode } from '../operation-node/query-node.js';
2
+ import { UnionNode } from '../operation-node/union-node.js';
3
+ export function parseUnion(union, all) {
4
+ const node = union.toOperationNode();
5
+ if (QueryNode.isMutating(node)) {
6
+ throw new Error("can't combine insert, update or delete queries using union");
7
+ }
8
+ return UnionNode.create(node, all);
9
+ }
@@ -3,6 +3,6 @@ import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory
3
3
  import { ExtractTypeFromReferenceExpression } from './reference-parser.js';
4
4
  import { ParseContext } from './parse-context.js';
5
5
  export declare type ValueExpression<DB, TB extends keyof DB, RE> = ExtractTypeFromReferenceExpression<DB, TB, RE> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB>;
6
- export declare type ValueExpressionOrList<DB, TB extends keyof DB, RE> = ValueExpression<DB, TB, RE> | ValueExpression<DB, TB, RE>[];
6
+ export declare type ValueExpressionOrList<DB, TB extends keyof DB, RE> = ValueExpression<DB, TB, RE> | ReadonlyArray<ValueExpression<DB, TB, RE>>;
7
7
  export declare function parseValueExpressionOrList(ctx: ParseContext, arg: ValueExpressionOrList<any, any, any>): ValueExpressionNode;
8
8
  export declare function parseValueExpression(ctx: ParseContext, arg: ValueExpression<any, any, any>): ValueExpressionNode;
@@ -10,13 +10,13 @@ export class JoinBuilder {
10
10
  on(...args) {
11
11
  return new JoinBuilder({
12
12
  ...this.#props,
13
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseOnFilter(this.#props.parseContext, args)),
13
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseOnFilter(this.#props.parseContext, args)),
14
14
  });
15
15
  }
16
16
  orOn(...args) {
17
17
  return new JoinBuilder({
18
18
  ...this.#props,
19
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseOnFilter(this.#props.parseContext, args)),
19
+ joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseOnFilter(this.#props.parseContext, args)),
20
20
  });
21
21
  }
22
22
  /**
@@ -28,7 +28,7 @@ export class JoinBuilder {
28
28
  onRef(lhs, op, rhs) {
29
29
  return new JoinBuilder({
30
30
  ...this.#props,
31
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
31
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
32
32
  });
33
33
  }
34
34
  /**
@@ -40,7 +40,7 @@ export class JoinBuilder {
40
40
  orOnRef(lhs, op, rhs) {
41
41
  return new JoinBuilder({
42
42
  ...this.#props,
43
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
43
+ joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
44
44
  });
45
45
  }
46
46
  /**
@@ -52,7 +52,7 @@ export class JoinBuilder {
52
52
  onExists(arg) {
53
53
  return new JoinBuilder({
54
54
  ...this.#props,
55
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseExistFilter(this.#props.parseContext, arg)),
55
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseExistFilter(this.#props.parseContext, arg)),
56
56
  });
57
57
  }
58
58
  /**
@@ -64,7 +64,7 @@ export class JoinBuilder {
64
64
  onNotExists(arg) {
65
65
  return new JoinBuilder({
66
66
  ...this.#props,
67
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseNotExistFilter(this.#props.parseContext, arg)),
67
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseNotExistFilter(this.#props.parseContext, arg)),
68
68
  });
69
69
  }
70
70
  /**
@@ -76,7 +76,7 @@ export class JoinBuilder {
76
76
  orOnExists(arg) {
77
77
  return new JoinBuilder({
78
78
  ...this.#props,
79
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseExistFilter(this.#props.parseContext, arg)),
79
+ joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseExistFilter(this.#props.parseContext, arg)),
80
80
  });
81
81
  }
82
82
  /**
@@ -88,7 +88,7 @@ export class JoinBuilder {
88
88
  orOnNotExists(arg) {
89
89
  return new JoinBuilder({
90
90
  ...this.#props,
91
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseNotExistFilter(this.#props.parseContext, arg)),
91
+ joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseNotExistFilter(this.#props.parseContext, arg)),
92
92
  });
93
93
  }
94
94
  toOperationNode() {
@@ -18,6 +18,7 @@ import { QueryExecutor } from '../query-executor/query-executor.js';
18
18
  import { QueryId } from '../util/query-id.js';
19
19
  import { OnConflictConstraintTarget } from '../parser/on-conflict-parser.js';
20
20
  import { ParseContext } from '../parser/parse-context.js';
21
+ import { UnionExpression } from '../parser/union-parser.js';
21
22
  /**
22
23
  * The main query builder class.
23
24
  *
@@ -998,7 +999,7 @@ export declare class QueryBuilder<DB, TB extends keyof DB, O = {}> implements Op
998
999
  * ```
999
1000
  */
1000
1001
  values(row: InsertObject<DB, TB>): QueryBuilder<DB, TB, O>;
1001
- values(row: InsertObject<DB, TB>[]): QueryBuilder<DB, TB, O>;
1002
+ values(row: ReadonlyArray<InsertObject<DB, TB>>): QueryBuilder<DB, TB, O>;
1002
1003
  /**
1003
1004
  * Ignores the insert if the column or constraint given as the first
1004
1005
  * argument conflicts with the current rows in the database. The
@@ -1553,6 +1554,69 @@ export declare class QueryBuilder<DB, TB extends keyof DB, O = {}> implements Op
1553
1554
  * ```
1554
1555
  */
1555
1556
  offset(offset: number): QueryBuilder<DB, TB, O>;
1557
+ /**
1558
+ * Combines another select query or raw expression to this query using `union`.
1559
+ *
1560
+ * The output row type of the combined query must match `this` query.
1561
+ *
1562
+ * @xample
1563
+ * ```ts
1564
+ * db.selectFrom('person')
1565
+ * .select(['id', 'first_name as name'])
1566
+ * .union(db.selectFrom('pet').select(['id', 'name']))
1567
+ * .orderBy('name')
1568
+ * ```
1569
+ */
1570
+ union(expression: UnionExpression<DB, O>): QueryBuilder<DB, TB, O>;
1571
+ /**
1572
+ * Combines another select query or raw expression to this query using `union all`.
1573
+ *
1574
+ * The output row type of the combined query must match `this` query.
1575
+ *
1576
+ * @xample
1577
+ * ```ts
1578
+ * db.selectFrom('person')
1579
+ * .select(['id', 'first_name as name'])
1580
+ * .unionAll(db.selectFrom('pet').select(['id', 'name']))
1581
+ * .orderBy('name')
1582
+ * ```
1583
+ */
1584
+ unionAll(expression: UnionExpression<DB, O>): QueryBuilder<DB, TB, O>;
1585
+ /**
1586
+ * Simply calls the given method passing `this` as the only argument.
1587
+ *
1588
+ * This method can be useful when adding optional method calls:
1589
+ *
1590
+ * @example
1591
+ * ```ts
1592
+ * db.selectFrom('person')
1593
+ * .selectAll()
1594
+ * .call((qb) => {
1595
+ * if (something) {
1596
+ * return qb.where('something', '=', something)
1597
+ * } else {
1598
+ * return qb.where('somethingElse', '=', somethingElse)
1599
+ * }
1600
+ * })
1601
+ * .execute()
1602
+ * ```
1603
+ *
1604
+ * The next example uses a helper funtion `log` to log a query:
1605
+ *
1606
+ * @example
1607
+ * ```ts
1608
+ * function log<T extends AnyQueryBuilder>(qb: T): T {
1609
+ * console.log(qb.compile())
1610
+ * return qb
1611
+ * }
1612
+ *
1613
+ * db.selectFrom('person')
1614
+ * .selectAll()
1615
+ * .call(log)
1616
+ * .execute()
1617
+ * ```
1618
+ */
1619
+ call<T>(func: (qb: this) => T): T;
1556
1620
  /**
1557
1621
  * Gives an alias for the query. This method is only useful for sub queries.
1558
1622
  *
@@ -3,13 +3,10 @@ import { parseJoin, } from '../parser/join-parser.js';
3
3
  import { parseSelectExpressionOrList, parseSelectAll, } from '../parser/select-parser.js';
4
4
  import { parseExistFilter, parseReferenceFilter, parseWhereFilter, parseHavingFilter, parseNotExistFilter, } from '../parser/filter-parser.js';
5
5
  import { parseInsertObjectOrList, } from '../parser/insert-values-parser.js';
6
- import { parseReferenceExpressionOrList, } from '../parser/reference-parser.js';
7
- import { OrderByItemNode } from '../operation-node/order-by-item-node.js';
8
6
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
9
7
  import { InsertQueryNode } from '../operation-node/insert-query-node.js';
10
8
  import { QueryNode, } from '../operation-node/query-node.js';
11
- import { parseOrderByDirectionExpression, parseOrderByExpression, } from '../parser/order-by-parser.js';
12
- import { GroupByItemNode } from '../operation-node/group-by-item-node.js';
9
+ import { parseOrderBy, } from '../parser/order-by-parser.js';
13
10
  import { UpdateQueryNode } from '../operation-node/update-query-node.js';
14
11
  import { parseUpdateObject, } from '../parser/update-set-parser.js';
15
12
  import { preventAwait } from '../util/prevent-await.js';
@@ -19,6 +16,8 @@ import { parseOnConflictDoNothing, parseOnConflictUpdate, } from '../parser/on-c
19
16
  import { freeze } from '../util/object-utils.js';
20
17
  import { DeleteQueryNode } from '../operation-node/delete-query-node.js';
21
18
  import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
19
+ import { parseGroupBy } from '../parser/group-by-parser.js';
20
+ import { parseUnion } from '../parser/union-parser.js';
22
21
  /**
23
22
  * The main query builder class.
24
23
  *
@@ -43,7 +42,7 @@ export class QueryBuilder {
43
42
  assertCanHaveWhereClause(this.#props.queryNode);
44
43
  return new QueryBuilder({
45
44
  ...this.#props,
46
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, 'And', parseWhereFilter(this.#props.parseContext, args)),
45
+ queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
47
46
  });
48
47
  }
49
48
  /**
@@ -101,14 +100,14 @@ export class QueryBuilder {
101
100
  assertCanHaveWhereClause(this.#props.queryNode);
102
101
  return new QueryBuilder({
103
102
  ...this.#props,
104
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, 'And', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
103
+ queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
105
104
  });
106
105
  }
107
106
  orWhere(...args) {
108
107
  assertCanHaveWhereClause(this.#props.queryNode);
109
108
  return new QueryBuilder({
110
109
  ...this.#props,
111
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, 'Or', parseWhereFilter(this.#props.parseContext, args)),
110
+ queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
112
111
  });
113
112
  }
114
113
  /**
@@ -121,7 +120,7 @@ export class QueryBuilder {
121
120
  assertCanHaveWhereClause(this.#props.queryNode);
122
121
  return new QueryBuilder({
123
122
  ...this.#props,
124
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, 'Or', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
123
+ queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
125
124
  });
126
125
  }
127
126
  /**
@@ -187,7 +186,7 @@ export class QueryBuilder {
187
186
  assertCanHaveWhereClause(this.#props.queryNode);
188
187
  return new QueryBuilder({
189
188
  ...this.#props,
190
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, 'And', parseExistFilter(this.#props.parseContext, arg)),
189
+ queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
191
190
  });
192
191
  }
193
192
  /**
@@ -197,7 +196,7 @@ export class QueryBuilder {
197
196
  assertCanHaveWhereClause(this.#props.queryNode);
198
197
  return new QueryBuilder({
199
198
  ...this.#props,
200
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, 'And', parseNotExistFilter(this.#props.parseContext, arg)),
199
+ queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
201
200
  });
202
201
  }
203
202
  /**
@@ -207,7 +206,7 @@ export class QueryBuilder {
207
206
  assertCanHaveWhereClause(this.#props.queryNode);
208
207
  return new QueryBuilder({
209
208
  ...this.#props,
210
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, 'Or', parseExistFilter(this.#props.parseContext, arg)),
209
+ queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
211
210
  });
212
211
  }
213
212
  /**
@@ -217,14 +216,14 @@ export class QueryBuilder {
217
216
  assertCanHaveWhereClause(this.#props.queryNode);
218
217
  return new QueryBuilder({
219
218
  ...this.#props,
220
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, 'Or', parseNotExistFilter(this.#props.parseContext, arg)),
219
+ queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
221
220
  });
222
221
  }
223
222
  having(...args) {
224
223
  assertCanHaveHavingClause(this.#props.queryNode);
225
224
  return new QueryBuilder({
226
225
  ...this.#props,
227
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, 'And', parseHavingFilter(this.#props.parseContext, args)),
226
+ queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
228
227
  });
229
228
  }
230
229
  /**
@@ -235,14 +234,14 @@ export class QueryBuilder {
235
234
  assertCanHaveHavingClause(this.#props.queryNode);
236
235
  return new QueryBuilder({
237
236
  ...this.#props,
238
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, 'And', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
237
+ queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
239
238
  });
240
239
  }
241
240
  orHaving(...args) {
242
241
  assertCanHaveHavingClause(this.#props.queryNode);
243
242
  return new QueryBuilder({
244
243
  ...this.#props,
245
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, 'Or', parseHavingFilter(this.#props.parseContext, args)),
244
+ queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
246
245
  });
247
246
  }
248
247
  /**
@@ -253,7 +252,7 @@ export class QueryBuilder {
253
252
  assertCanHaveHavingClause(this.#props.queryNode);
254
253
  return new QueryBuilder({
255
254
  ...this.#props,
256
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, 'Or', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
255
+ queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
257
256
  });
258
257
  }
259
258
  /**
@@ -264,7 +263,7 @@ export class QueryBuilder {
264
263
  assertCanHaveHavingClause(this.#props.queryNode);
265
264
  return new QueryBuilder({
266
265
  ...this.#props,
267
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, 'And', parseExistFilter(this.#props.parseContext, arg)),
266
+ queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
268
267
  });
269
268
  }
270
269
  /**
@@ -275,7 +274,7 @@ export class QueryBuilder {
275
274
  assertCanHaveHavingClause(this.#props.queryNode);
276
275
  return new QueryBuilder({
277
276
  ...this.#props,
278
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, 'And', parseNotExistFilter(this.#props.parseContext, arg)),
277
+ queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
279
278
  });
280
279
  }
281
280
  /**
@@ -286,7 +285,7 @@ export class QueryBuilder {
286
285
  assertCanHaveHavingClause(this.#props.queryNode);
287
286
  return new QueryBuilder({
288
287
  ...this.#props,
289
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, 'Or', parseExistFilter(this.#props.parseContext, arg)),
288
+ queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
290
289
  });
291
290
  }
292
291
  /**
@@ -297,7 +296,7 @@ export class QueryBuilder {
297
296
  assertCanHaveHavingClause(this.#props.queryNode);
298
297
  return new QueryBuilder({
299
298
  ...this.#props,
300
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, 'Or', parseNotExistFilter(this.#props.parseContext, arg)),
299
+ queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
301
300
  });
302
301
  }
303
302
  select(selection) {
@@ -714,14 +713,14 @@ export class QueryBuilder {
714
713
  assertCanHaveOrderByClause(this.#props.queryNode);
715
714
  return new QueryBuilder({
716
715
  ...this.#props,
717
- queryNode: SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode, OrderByItemNode.create(parseOrderByExpression(this.#props.parseContext, orderBy), parseOrderByDirectionExpression(direction))),
716
+ queryNode: SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode, parseOrderBy(this.#props.parseContext, orderBy, direction)),
718
717
  });
719
718
  }
720
719
  groupBy(orderBy) {
721
720
  assertCanHaveGroupByClause(this.#props.queryNode);
722
721
  return new QueryBuilder({
723
722
  ...this.#props,
724
- queryNode: SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode, parseReferenceExpressionOrList(this.#props.parseContext, orderBy).map(GroupByItemNode.create)),
723
+ queryNode: SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode, parseGroupBy(this.#props.parseContext, orderBy)),
725
724
  });
726
725
  }
727
726
  /**
@@ -776,6 +775,83 @@ export class QueryBuilder {
776
775
  queryNode: SelectQueryNode.cloneWithOffset(this.#props.queryNode, OffsetNode.create(offset)),
777
776
  });
778
777
  }
778
+ /**
779
+ * Combines another select query or raw expression to this query using `union`.
780
+ *
781
+ * The output row type of the combined query must match `this` query.
782
+ *
783
+ * @xample
784
+ * ```ts
785
+ * db.selectFrom('person')
786
+ * .select(['id', 'first_name as name'])
787
+ * .union(db.selectFrom('pet').select(['id', 'name']))
788
+ * .orderBy('name')
789
+ * ```
790
+ */
791
+ union(expression) {
792
+ assertCanHaveUnion(this.#props.queryNode);
793
+ return new QueryBuilder({
794
+ ...this.#props,
795
+ queryNode: SelectQueryNode.cloneWithUnion(this.#props.queryNode, parseUnion(expression, false)),
796
+ });
797
+ }
798
+ /**
799
+ * Combines another select query or raw expression to this query using `union all`.
800
+ *
801
+ * The output row type of the combined query must match `this` query.
802
+ *
803
+ * @xample
804
+ * ```ts
805
+ * db.selectFrom('person')
806
+ * .select(['id', 'first_name as name'])
807
+ * .unionAll(db.selectFrom('pet').select(['id', 'name']))
808
+ * .orderBy('name')
809
+ * ```
810
+ */
811
+ unionAll(expression) {
812
+ assertCanHaveUnion(this.#props.queryNode);
813
+ return new QueryBuilder({
814
+ ...this.#props,
815
+ queryNode: SelectQueryNode.cloneWithUnion(this.#props.queryNode, parseUnion(expression, true)),
816
+ });
817
+ }
818
+ /**
819
+ * Simply calls the given method passing `this` as the only argument.
820
+ *
821
+ * This method can be useful when adding optional method calls:
822
+ *
823
+ * @example
824
+ * ```ts
825
+ * db.selectFrom('person')
826
+ * .selectAll()
827
+ * .call((qb) => {
828
+ * if (something) {
829
+ * return qb.where('something', '=', something)
830
+ * } else {
831
+ * return qb.where('somethingElse', '=', somethingElse)
832
+ * }
833
+ * })
834
+ * .execute()
835
+ * ```
836
+ *
837
+ * The next example uses a helper funtion `log` to log a query:
838
+ *
839
+ * @example
840
+ * ```ts
841
+ * function log<T extends AnyQueryBuilder>(qb: T): T {
842
+ * console.log(qb.compile())
843
+ * return qb
844
+ * }
845
+ *
846
+ * db.selectFrom('person')
847
+ * .selectAll()
848
+ * .call(log)
849
+ * .execute()
850
+ * ```
851
+ */
852
+ call(func) {
853
+ return func(this);
854
+ }
779
855
  /**
780
856
  * Gives an alias for the query. This method is only useful for sub queries.
781
857
  *
@@ -958,7 +1034,7 @@ function assertCanHaveUpdates(node) {
958
1034
  }
959
1035
  function assertCanHaveReturningClause(node) {
960
1036
  if (!QueryNode.isMutating(node)) {
961
- throw new Error('only an insert, delete and update queries can have a returning clause');
1037
+ throw new Error('only insert, delete and update queries can have a returning clause');
962
1038
  }
963
1039
  }
964
1040
  function assertCanHaveOrderByClause(node) {
@@ -981,3 +1057,8 @@ function assertCanHaveOffset(node) {
981
1057
  throw new Error('only a select query can have an offset');
982
1058
  }
983
1059
  }
1060
+ function assertCanHaveUnion(node) {
1061
+ if (!SelectQueryNode.is(node)) {
1062
+ throw new Error('only a select query can have an union');
1063
+ }
1064
+ }
@@ -1,4 +1,4 @@
1
1
  export interface CompiledQuery {
2
2
  readonly sql: string;
3
- readonly parameters: ReadonlyArray<any>;
3
+ readonly parameters: ReadonlyArray<unknown>;
4
4
  }
@@ -60,6 +60,8 @@ import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constrai
60
60
  import { ColumnDefinitionNode } from '../operation-node/column-definition-node.js';
61
61
  import { ModifyColumnNode } from '../operation-node/modify-column-node.js';
62
62
  import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
63
+ import { ColumnNode } from '../operation-node/column-node.js';
64
+ import { UnionNode } from '../operation-node/union-node.js';
63
65
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
64
66
  #private;
65
67
  protected get numParameters(): number;
@@ -67,6 +69,8 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
67
69
  protected getSql(): string;
68
70
  protected visitSelectQuery(node: SelectQueryNode): void;
69
71
  protected visitFrom(node: FromNode): void;
72
+ protected visitSelection(node: SelectionNode): void;
73
+ protected visitColumn(node: ColumnNode): void;
70
74
  protected compileDistinctOn(selections: ReadonlyArray<SelectionNode>): void;
71
75
  protected compileList(nodes: ReadonlyArray<OperationNode>, separator?: string): void;
72
76
  protected visitWhere(node: WhereNode): void;
@@ -125,11 +129,12 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
125
129
  protected visitModifyColumn(node: ModifyColumnNode): void;
126
130
  protected visitAddConstraint(node: AddConstraintNode): void;
127
131
  protected visitDropConstraint(node: DropConstraintNode): void;
132
+ protected visitUnion(node: UnionNode): void;
128
133
  protected append(str: string): void;
129
- protected appendValue(value: PrimitiveValue): void;
134
+ protected appendValue(parameter: unknown): void;
130
135
  protected getLeftIdentifierWrapper(): string;
131
136
  protected getRightIdentifierWrapper(): string;
132
137
  protected getCurrentParameterPlaceholder(): string;
133
- protected addParameter(parameter: any): void;
138
+ protected addParameter(parameter: unknown): void;
134
139
  protected appendImmediateValue(value: PrimitiveValue): void;
135
140
  }
@@ -14,7 +14,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
14
14
  this.visitNode(node);
15
15
  return freeze({
16
16
  sql: this.getSql(),
17
- parameters: this.#parameters,
17
+ parameters: [...this.#parameters],
18
18
  });
19
19
  }
20
20
  getSql() {
@@ -60,6 +60,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
60
60
  this.append(' ');
61
61
  this.visitNode(node.having);
62
62
  }
63
+ if (node.union) {
64
+ this.append(' ');
65
+ this.compileList(node.union, ' ');
66
+ }
63
67
  if (node.orderBy) {
64
68
  this.append(' ');
65
69
  this.visitNode(node.orderBy);
@@ -86,6 +90,12 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
86
90
  this.append('from ');
87
91
  this.compileList(node.froms);
88
92
  }
93
+ visitSelection(node) {
94
+ this.visitNode(node.selection);
95
+ }
96
+ visitColumn(node) {
97
+ this.visitNode(node.column);
98
+ }
89
99
  compileDistinctOn(selections) {
90
100
  this.append('distinct on (');
91
101
  this.compileList(selections);
@@ -627,11 +637,18 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
627
637
  this.append('drop constraint ');
628
638
  this.visitNode(node.constraintName);
629
639
  }
640
+ visitUnion(node) {
641
+ this.append('union ');
642
+ if (node.all) {
643
+ this.append('all ');
644
+ }
645
+ this.visitNode(node.union);
646
+ }
630
647
  append(str) {
631
648
  this.#sql += str;
632
649
  }
633
- appendValue(value) {
634
- this.addParameter(value);
650
+ appendValue(parameter) {
651
+ this.addParameter(parameter);
635
652
  this.append(this.getCurrentParameterPlaceholder());
636
653
  }
637
654
  getLeftIdentifierWrapper() {
@@ -672,7 +689,7 @@ const SELECT_MODIFIER_SQL = {
672
689
  ForNoKeyUpdate: 'for no key update',
673
690
  ForUpdate: 'for update',
674
691
  ForShare: 'for share',
675
- NoWait: 'no wait',
692
+ NoWait: 'nowait',
676
693
  SkipLocked: 'skip locked',
677
694
  };
678
695
  const JOIN_TYPE_SQL = {
@@ -9,7 +9,7 @@ export class CreateSchemaBuilder {
9
9
  ifNotExists() {
10
10
  return new CreateSchemaBuilder({
11
11
  ...this.#props,
12
- createSchemaNode: CreateSchemaNode.cloneWithModifier(this.#props.createSchemaNode, 'IfNotExists'),
12
+ createSchemaNode: CreateSchemaNode.cloneWith(this.#props.createSchemaNode, { modifier: 'IfNotExists' }),
13
13
  });
14
14
  }
15
15
  toOperationNode() {