kysely 0.19.8 → 0.19.11

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 (106) hide show
  1. package/README.md +67 -13
  2. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  3. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +1 -0
  4. package/dist/cjs/dialect/mysql/mysql-driver.js +25 -0
  5. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  6. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +6 -2
  7. package/dist/cjs/dialect/postgres/postgres-driver.js +24 -2
  8. package/dist/cjs/dialect/sqlite/sqlite-driver.js +3 -0
  9. package/dist/cjs/driver/database-connection.d.ts +1 -0
  10. package/dist/cjs/driver/dummy-driver.js +3 -0
  11. package/dist/cjs/index.d.ts +4 -0
  12. package/dist/cjs/index.js +4 -0
  13. package/dist/cjs/operation-node/create-type-node.d.ts +17 -0
  14. package/dist/cjs/operation-node/create-type-node.js +27 -0
  15. package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
  16. package/dist/cjs/operation-node/drop-type-node.d.ts +16 -0
  17. package/dist/cjs/operation-node/drop-type-node.js +25 -0
  18. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
  19. package/dist/cjs/operation-node/insert-query-node.js +2 -1
  20. package/dist/cjs/operation-node/operation-node-transformer.d.ts +9 -2
  21. package/dist/cjs/operation-node/operation-node-transformer.js +148 -122
  22. package/dist/cjs/operation-node/operation-node-visitor.d.ts +6 -0
  23. package/dist/cjs/operation-node/operation-node-visitor.js +3 -0
  24. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  25. package/dist/cjs/operation-node/select-modifier-node.d.ts +16 -0
  26. package/dist/cjs/operation-node/select-modifier-node.js +24 -0
  27. package/dist/cjs/operation-node/select-query-node.d.ts +5 -5
  28. package/dist/cjs/operation-node/select-query-node.js +11 -9
  29. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  30. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
  31. package/dist/cjs/query-builder/insert-query-builder.d.ts +1 -1
  32. package/dist/cjs/query-builder/select-query-builder.d.ts +77 -6
  33. package/dist/cjs/query-builder/select-query-builder.js +101 -14
  34. package/dist/cjs/query-compiler/default-query-compiler.d.ts +6 -0
  35. package/dist/cjs/query-compiler/default-query-compiler.js +30 -8
  36. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
  37. package/dist/cjs/query-creator.d.ts +27 -0
  38. package/dist/cjs/query-creator.js +33 -0
  39. package/dist/cjs/query-executor/query-executor-base.d.ts +6 -0
  40. package/dist/cjs/query-executor/query-executor-base.js +19 -0
  41. package/dist/cjs/query-executor/query-executor.d.ts +11 -0
  42. package/dist/cjs/schema/create-table-builder.d.ts +6 -6
  43. package/dist/cjs/schema/create-table-builder.js +6 -6
  44. package/dist/cjs/schema/create-type-builder.d.ts +28 -0
  45. package/dist/cjs/schema/create-type-builder.js +38 -0
  46. package/dist/cjs/schema/drop-type-builder.d.ts +19 -0
  47. package/dist/cjs/schema/drop-type-builder.js +31 -0
  48. package/dist/cjs/schema/schema.d.ts +32 -0
  49. package/dist/cjs/schema/schema.js +46 -0
  50. package/dist/cjs/util/deferred.d.ts +7 -0
  51. package/dist/cjs/util/deferred.js +28 -0
  52. package/dist/cjs/util/require-all-props.d.ts +43 -0
  53. package/dist/cjs/util/require-all-props.js +40 -0
  54. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  55. package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -0
  56. package/dist/esm/dialect/mysql/mysql-driver.js +25 -0
  57. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  58. package/dist/esm/dialect/postgres/postgres-driver.d.ts +6 -2
  59. package/dist/esm/dialect/postgres/postgres-driver.js +24 -2
  60. package/dist/esm/dialect/sqlite/sqlite-driver.js +3 -0
  61. package/dist/esm/driver/database-connection.d.ts +1 -0
  62. package/dist/esm/driver/dummy-driver.js +3 -0
  63. package/dist/esm/index.d.ts +4 -0
  64. package/dist/esm/index.js +4 -0
  65. package/dist/esm/operation-node/create-type-node.d.ts +17 -0
  66. package/dist/esm/operation-node/create-type-node.js +25 -0
  67. package/dist/esm/operation-node/data-type-node.d.ts +1 -1
  68. package/dist/esm/operation-node/drop-type-node.d.ts +16 -0
  69. package/dist/esm/operation-node/drop-type-node.js +23 -0
  70. package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
  71. package/dist/esm/operation-node/insert-query-node.js +2 -1
  72. package/dist/esm/operation-node/operation-node-transformer.d.ts +9 -2
  73. package/dist/esm/operation-node/operation-node-transformer.js +148 -122
  74. package/dist/esm/operation-node/operation-node-visitor.d.ts +6 -0
  75. package/dist/esm/operation-node/operation-node-visitor.js +3 -0
  76. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  77. package/dist/esm/operation-node/select-modifier-node.d.ts +16 -0
  78. package/dist/esm/operation-node/select-modifier-node.js +22 -0
  79. package/dist/esm/operation-node/select-query-node.d.ts +5 -5
  80. package/dist/esm/operation-node/select-query-node.js +11 -9
  81. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  82. package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
  83. package/dist/esm/query-builder/insert-query-builder.d.ts +1 -1
  84. package/dist/esm/query-builder/select-query-builder.d.ts +77 -6
  85. package/dist/esm/query-builder/select-query-builder.js +101 -14
  86. package/dist/esm/query-compiler/default-query-compiler.d.ts +6 -0
  87. package/dist/esm/query-compiler/default-query-compiler.js +30 -8
  88. package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
  89. package/dist/esm/query-creator.d.ts +27 -0
  90. package/dist/esm/query-creator.js +33 -0
  91. package/dist/esm/query-executor/query-executor-base.d.ts +6 -0
  92. package/dist/esm/query-executor/query-executor-base.js +19 -0
  93. package/dist/esm/query-executor/query-executor.d.ts +11 -0
  94. package/dist/esm/schema/create-table-builder.d.ts +6 -6
  95. package/dist/esm/schema/create-table-builder.js +6 -6
  96. package/dist/esm/schema/create-type-builder.d.ts +28 -0
  97. package/dist/esm/schema/create-type-builder.js +35 -0
  98. package/dist/esm/schema/drop-type-builder.d.ts +19 -0
  99. package/dist/esm/schema/drop-type-builder.js +28 -0
  100. package/dist/esm/schema/schema.d.ts +32 -0
  101. package/dist/esm/schema/schema.js +46 -0
  102. package/dist/esm/util/deferred.d.ts +7 -0
  103. package/dist/esm/util/deferred.js +25 -0
  104. package/dist/esm/util/require-all-props.d.ts +43 -0
  105. package/dist/esm/util/require-all-props.js +37 -0
  106. package/package.json +5 -2
@@ -0,0 +1,16 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ import { RawNode } from './raw-node.js';
3
+ export declare type SelectModifier = 'ForUpdate' | 'ForNoKeyUpdate' | 'ForShare' | 'ForKeyShare' | 'NoWait' | 'SkipLocked' | 'Distinct';
4
+ export interface SelectModifierNode extends OperationNode {
5
+ readonly kind: 'SelectModifierNode';
6
+ readonly modifier?: SelectModifier;
7
+ readonly rawModifier?: RawNode;
8
+ }
9
+ /**
10
+ * @internal
11
+ */
12
+ export declare const SelectModifierNode: Readonly<{
13
+ is(node: OperationNode): node is SelectModifierNode;
14
+ create(modifier: SelectModifier): SelectModifierNode;
15
+ createWithRaw(modifier: RawNode): SelectModifierNode;
16
+ }>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SelectModifierNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ /**
6
+ * @internal
7
+ */
8
+ exports.SelectModifierNode = (0, object_utils_js_1.freeze)({
9
+ is(node) {
10
+ return node.kind === 'SelectModifierNode';
11
+ },
12
+ create(modifier) {
13
+ return (0, object_utils_js_1.freeze)({
14
+ kind: 'SelectModifierNode',
15
+ modifier,
16
+ });
17
+ },
18
+ createWithRaw(modifier) {
19
+ return (0, object_utils_js_1.freeze)({
20
+ kind: 'SelectModifierNode',
21
+ rawModifier: modifier,
22
+ });
23
+ },
24
+ });
@@ -13,18 +13,18 @@ import { SelectionNode } from './selection-node.js';
13
13
  import { WhereNode } from './where-node.js';
14
14
  import { WithNode } from './with-node.js';
15
15
  import { UnionNode } from './union-node.js';
16
- export declare type SelectModifier = 'ForUpdate' | 'ForNoKeyUpdate' | 'ForShare' | 'ForKeyShare' | 'NoWait' | 'SkipLocked';
16
+ import { SelectModifierNode } from './select-modifier-node.js';
17
17
  export interface SelectQueryNode extends OperationNode {
18
18
  readonly kind: 'SelectQueryNode';
19
19
  readonly from: FromNode;
20
20
  readonly selections?: ReadonlyArray<SelectionNode>;
21
21
  readonly distinctOnSelections?: ReadonlyArray<SelectionNode>;
22
- readonly distinct?: boolean;
23
22
  readonly joins?: ReadonlyArray<JoinNode>;
24
23
  readonly groupBy?: GroupByNode;
25
24
  readonly orderBy?: OrderByNode;
26
25
  readonly where?: WhereNode;
27
- readonly modifiers?: ReadonlyArray<SelectModifier>;
26
+ readonly frontModifiers?: ReadonlyArray<SelectModifierNode>;
27
+ readonly endModifiers?: ReadonlyArray<SelectModifierNode>;
28
28
  readonly limit?: LimitNode;
29
29
  readonly offset?: OffsetNode;
30
30
  readonly with?: WithNode;
@@ -39,13 +39,13 @@ export declare const SelectQueryNode: Readonly<{
39
39
  create(fromItems: ReadonlyArray<TableExpressionNode>, withNode?: WithNode): SelectQueryNode;
40
40
  cloneWithSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
41
41
  cloneWithDistinctOnSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
42
- cloneWithModifier(select: SelectQueryNode, modifier: SelectModifier): SelectQueryNode;
42
+ cloneWithFrontModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
43
+ cloneWithEndModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
43
44
  cloneWithOrderByItem(selectNode: SelectQueryNode, item: OrderByItemNode): SelectQueryNode;
44
45
  cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
45
46
  cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
46
47
  cloneWithOffset(selectNode: SelectQueryNode, offset: OffsetNode): SelectQueryNode;
47
48
  cloneWithHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
48
49
  cloneWithOrHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
49
- cloneWithDistinct(selectNode: SelectQueryNode): SelectQueryNode;
50
50
  cloneWithUnion(selectNode: SelectQueryNode, union: UnionNode): SelectQueryNode;
51
51
  }>;
@@ -36,11 +36,19 @@ exports.SelectQueryNode = (0, object_utils_js_1.freeze)({
36
36
  : (0, object_utils_js_1.freeze)(selections),
37
37
  });
38
38
  },
39
- cloneWithModifier(select, modifier) {
39
+ cloneWithFrontModifier(select, modifier) {
40
40
  return (0, object_utils_js_1.freeze)({
41
41
  ...select,
42
- modifiers: select.modifiers
43
- ? (0, object_utils_js_1.freeze)([...select.modifiers, modifier])
42
+ frontModifiers: select.frontModifiers
43
+ ? (0, object_utils_js_1.freeze)([...select.frontModifiers, modifier])
44
+ : (0, object_utils_js_1.freeze)([modifier]),
45
+ });
46
+ },
47
+ cloneWithEndModifier(select, modifier) {
48
+ return (0, object_utils_js_1.freeze)({
49
+ ...select,
50
+ endModifiers: select.endModifiers
51
+ ? (0, object_utils_js_1.freeze)([...select.endModifiers, modifier])
44
52
  : (0, object_utils_js_1.freeze)([modifier]),
45
53
  });
46
54
  },
@@ -88,12 +96,6 @@ exports.SelectQueryNode = (0, object_utils_js_1.freeze)({
88
96
  : having_node_js_1.HavingNode.create(filter),
89
97
  });
90
98
  },
91
- cloneWithDistinct(selectNode) {
92
- return (0, object_utils_js_1.freeze)({
93
- ...selectNode,
94
- distinct: true,
95
- });
96
- },
97
99
  cloneWithUnion(selectNode, union) {
98
100
  return (0, object_utils_js_1.freeze)({
99
101
  ...selectNode,
@@ -1,10 +1,12 @@
1
1
  import { AlterTableNode } from '../../operation-node/alter-table-node.js';
2
2
  import { CreateIndexNode } from '../../operation-node/create-index-node.js';
3
3
  import { CreateTableNode } from '../../operation-node/create-table-node.js';
4
+ import { CreateTypeNode } from '../../operation-node/create-type-node.js';
4
5
  import { CreateViewNode } from '../../operation-node/create-view-node.js';
5
6
  import { DeleteQueryNode } from '../../operation-node/delete-query-node.js';
6
7
  import { DropIndexNode } from '../../operation-node/drop-index-node.js';
7
8
  import { DropTableNode } from '../../operation-node/drop-table-node.js';
9
+ import { DropTypeNode } from '../../operation-node/drop-type-node.js';
8
10
  import { DropViewNode } from '../../operation-node/drop-view-node.js';
9
11
  import { InsertQueryNode } from '../../operation-node/insert-query-node.js';
10
12
  import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
@@ -24,6 +26,8 @@ export declare class WithSchemaTransformer extends OperationNodeTransformer {
24
26
  protected transformDropIndex(node: DropIndexNode): DropIndexNode;
25
27
  protected transformCreateView(node: CreateViewNode): CreateViewNode;
26
28
  protected transformDropView(node: DropViewNode): DropViewNode;
29
+ protected transformCreateType(node: CreateTypeNode): CreateTypeNode;
30
+ protected transformDropType(node: DropTypeNode): DropTypeNode;
27
31
  protected transformAlterTable(node: AlterTableNode): AlterTableNode;
28
32
  protected transformTable(node: TableNode): TableNode;
29
33
  }
@@ -41,6 +41,12 @@ class WithSchemaTransformer extends operation_node_transformer_js_1.OperationNod
41
41
  transformDropView(node) {
42
42
  return this.#transformRoot(node, (node) => super.transformDropView(node));
43
43
  }
44
+ transformCreateType(node) {
45
+ return this.#transformRoot(node, (node) => super.transformCreateType(node));
46
+ }
47
+ transformDropType(node) {
48
+ return this.#transformRoot(node, (node) => super.transformDropType(node));
49
+ }
44
50
  transformAlterTable(node) {
45
51
  return this.#transformRoot(node, (node) => super.transformAlterTable(node));
46
52
  }
@@ -43,7 +43,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
43
43
  *
44
44
  * Insert a row into `person`:
45
45
  * ```ts
46
- * const id = await db
46
+ * const result = await db
47
47
  * .insertInto('person')
48
48
  * .values({
49
49
  * first_name: 'Jennifer',
@@ -653,6 +653,50 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
653
653
  */
654
654
  distinctOn<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): SelectQueryBuilder<DB, TB, O>;
655
655
  distinctOn<SE extends SelectExpression<DB, TB>>(selection: SE): SelectQueryBuilder<DB, TB, O>;
656
+ /**
657
+ * This can be used to add any additional SQL to the front of the query __after__ the `select` keyword.
658
+ *
659
+ * ### Examples
660
+ *
661
+ * ```ts
662
+ * db.selectFrom('person')
663
+ * .modifyFront(sql`sql_no_cache`)
664
+ * .select('first_name')
665
+ * .execute()
666
+ * ```
667
+ *
668
+ * The generated SQL (MySQL):
669
+ *
670
+ * ```sql
671
+ * select sql_no_cache `first_name`
672
+ * from `person`
673
+ * ```
674
+ */
675
+ modifyFront(modifier: AnyRawBuilder): SelectQueryBuilder<DB, TB, O>;
676
+ /**
677
+ * This can be used to add any additional SQL to the end of the query.
678
+ *
679
+ * Also see {@link forUpdate}, {@link forShare}, {@link forKeyShare}, {@link forNoKeyUpdate}
680
+ * {@link skipLocked} and {@link noWait}.
681
+ *
682
+ * ### Examples
683
+ *
684
+ * ```ts
685
+ * db.selectFrom('person')
686
+ * .select('first_name')
687
+ * .modifyEnd(sql`for update`)
688
+ * .execute()
689
+ * ```
690
+ *
691
+ * The generated SQL (PostgreSQL):
692
+ *
693
+ * ```sql
694
+ * select "first_name"
695
+ * from "person"
696
+ * for update
697
+ * ```
698
+ */
699
+ modifyEnd(modifier: AnyRawBuilder): SelectQueryBuilder<DB, TB, O>;
656
700
  /**
657
701
  * Makes the selection distinct.
658
702
  *
@@ -673,27 +717,27 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
673
717
  */
674
718
  distinct(): SelectQueryBuilder<DB, TB, O>;
675
719
  /**
676
- * Adds the `for update` option to a select query on supported databases.
720
+ * Adds the `for update` modifier to a select query on supported databases.
677
721
  */
678
722
  forUpdate(): SelectQueryBuilder<DB, TB, O>;
679
723
  /**
680
- * Adds the `for share` option to a select query on supported databases.
724
+ * Adds the `for share` modifier to a select query on supported databases.
681
725
  */
682
726
  forShare(): SelectQueryBuilder<DB, TB, O>;
683
727
  /**
684
- * Adds the `for key share` option to a select query on supported databases.
728
+ * Adds the `for key share` modifier to a select query on supported databases.
685
729
  */
686
730
  forKeyShare(): SelectQueryBuilder<DB, TB, O>;
687
731
  /**
688
- * Adds the `for no key update` option to a select query on supported databases.
732
+ * Adds the `for no key update` modifier to a select query on supported databases.
689
733
  */
690
734
  forNoKeyUpdate(): SelectQueryBuilder<DB, TB, O>;
691
735
  /**
692
- * Adds the `skip locked` option to a select query on supported databases.
736
+ * Adds the `skip locked` modifier to a select query on supported databases.
693
737
  */
694
738
  skipLocked(): SelectQueryBuilder<DB, TB, O>;
695
739
  /**
696
- * Adds the `nowait` option to a select query on supported databases.
740
+ * Adds the `nowait` modifier to a select query on supported databases.
697
741
  */
698
742
  noWait(): SelectQueryBuilder<DB, TB, O>;
699
743
  /**
@@ -1299,6 +1343,33 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1299
1343
  * error.
1300
1344
  */
1301
1345
  executeTakeFirstOrThrow(errorConstructor?: NoResultErrorConstructor): Promise<O>;
1346
+ /**
1347
+ * Executes the query and streams the rows.
1348
+ *
1349
+ * The optional argument `chunkSize` defines how many rows to fetch from the database
1350
+ * at a time. It only affects some dialects like PostgreSQL that support it.
1351
+ *
1352
+ * ### Examples
1353
+ *
1354
+ * ```ts
1355
+ * const stream = db.
1356
+ * .selectFrom('person')
1357
+ * .select(['first_name', 'last_name'])
1358
+ * .where('gender', '=', 'other')
1359
+ * .stream()
1360
+ *
1361
+ * for await (const person of stream) {
1362
+ * console.log(person.first_name)
1363
+ *
1364
+ * if (person.last_name === 'Something') {
1365
+ * // Breaking or returning before the stream has ended will release
1366
+ * // the database connection and invalidate the stream.
1367
+ * break
1368
+ * }
1369
+ * }
1370
+ * ```
1371
+ */
1372
+ stream(chunkSize?: number): AsyncIterableIterator<O>;
1302
1373
  }
1303
1374
  export interface SelectQueryBuilderProps {
1304
1375
  readonly queryId: QueryId;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AliasedQueryBuilder = exports.SelectQueryBuilder = void 0;
4
4
  const alias_node_js_1 = require("../operation-node/alias-node.js");
5
+ const select_modifier_node_js_1 = require("../operation-node/select-modifier-node.js");
5
6
  const join_parser_js_1 = require("../parser/join-parser.js");
6
7
  const select_parser_js_1 = require("../parser/select-parser.js");
7
8
  const filter_parser_js_1 = require("../parser/filter-parser.js");
@@ -129,6 +130,60 @@ class SelectQueryBuilder {
129
130
  queryNode: select_query_node_js_1.SelectQueryNode.cloneWithDistinctOnSelections(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(selection)),
130
131
  });
131
132
  }
133
+ /**
134
+ * This can be used to add any additional SQL to the front of the query __after__ the `select` keyword.
135
+ *
136
+ * ### Examples
137
+ *
138
+ * ```ts
139
+ * db.selectFrom('person')
140
+ * .modifyFront(sql`sql_no_cache`)
141
+ * .select('first_name')
142
+ * .execute()
143
+ * ```
144
+ *
145
+ * The generated SQL (MySQL):
146
+ *
147
+ * ```sql
148
+ * select sql_no_cache `first_name`
149
+ * from `person`
150
+ * ```
151
+ */
152
+ modifyFront(modifier) {
153
+ return new SelectQueryBuilder({
154
+ ...this.#props,
155
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithFrontModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.createWithRaw(modifier.toOperationNode())),
156
+ });
157
+ }
158
+ /**
159
+ * This can be used to add any additional SQL to the end of the query.
160
+ *
161
+ * Also see {@link forUpdate}, {@link forShare}, {@link forKeyShare}, {@link forNoKeyUpdate}
162
+ * {@link skipLocked} and {@link noWait}.
163
+ *
164
+ * ### Examples
165
+ *
166
+ * ```ts
167
+ * db.selectFrom('person')
168
+ * .select('first_name')
169
+ * .modifyEnd(sql`for update`)
170
+ * .execute()
171
+ * ```
172
+ *
173
+ * The generated SQL (PostgreSQL):
174
+ *
175
+ * ```sql
176
+ * select "first_name"
177
+ * from "person"
178
+ * for update
179
+ * ```
180
+ */
181
+ modifyEnd(modifier) {
182
+ return new SelectQueryBuilder({
183
+ ...this.#props,
184
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.createWithRaw(modifier.toOperationNode())),
185
+ });
186
+ }
132
187
  /**
133
188
  * Makes the selection distinct.
134
189
  *
@@ -150,61 +205,61 @@ class SelectQueryBuilder {
150
205
  distinct() {
151
206
  return new SelectQueryBuilder({
152
207
  ...this.#props,
153
- queryNode: select_query_node_js_1.SelectQueryNode.cloneWithDistinct(this.#props.queryNode),
208
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithFrontModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('Distinct')),
154
209
  });
155
210
  }
156
211
  /**
157
- * Adds the `for update` option to a select query on supported databases.
212
+ * Adds the `for update` modifier to a select query on supported databases.
158
213
  */
159
214
  forUpdate() {
160
215
  return new SelectQueryBuilder({
161
216
  ...this.#props,
162
- queryNode: select_query_node_js_1.SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForUpdate'),
217
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('ForUpdate')),
163
218
  });
164
219
  }
165
220
  /**
166
- * Adds the `for share` option to a select query on supported databases.
221
+ * Adds the `for share` modifier to a select query on supported databases.
167
222
  */
168
223
  forShare() {
169
224
  return new SelectQueryBuilder({
170
225
  ...this.#props,
171
- queryNode: select_query_node_js_1.SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForShare'),
226
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('ForShare')),
172
227
  });
173
228
  }
174
229
  /**
175
- * Adds the `for key share` option to a select query on supported databases.
230
+ * Adds the `for key share` modifier to a select query on supported databases.
176
231
  */
177
232
  forKeyShare() {
178
233
  return new SelectQueryBuilder({
179
234
  ...this.#props,
180
- queryNode: select_query_node_js_1.SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForKeyShare'),
235
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('ForKeyShare')),
181
236
  });
182
237
  }
183
238
  /**
184
- * Adds the `for no key update` option to a select query on supported databases.
239
+ * Adds the `for no key update` modifier to a select query on supported databases.
185
240
  */
186
241
  forNoKeyUpdate() {
187
242
  return new SelectQueryBuilder({
188
243
  ...this.#props,
189
- queryNode: select_query_node_js_1.SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForNoKeyUpdate'),
244
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('ForNoKeyUpdate')),
190
245
  });
191
246
  }
192
247
  /**
193
- * Adds the `skip locked` option to a select query on supported databases.
248
+ * Adds the `skip locked` modifier to a select query on supported databases.
194
249
  */
195
250
  skipLocked() {
196
251
  return new SelectQueryBuilder({
197
252
  ...this.#props,
198
- queryNode: select_query_node_js_1.SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'SkipLocked'),
253
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('SkipLocked')),
199
254
  });
200
255
  }
201
256
  /**
202
- * Adds the `nowait` option to a select query on supported databases.
257
+ * Adds the `nowait` modifier to a select query on supported databases.
203
258
  */
204
259
  noWait() {
205
260
  return new SelectQueryBuilder({
206
261
  ...this.#props,
207
- queryNode: select_query_node_js_1.SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'NoWait'),
262
+ queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('NoWait')),
208
263
  });
209
264
  }
210
265
  selectAll(table) {
@@ -575,7 +630,6 @@ class SelectQueryBuilder {
575
630
  */
576
631
  async execute() {
577
632
  const compildQuery = this.compile();
578
- const query = compildQuery.query;
579
633
  const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
580
634
  return result.rows;
581
635
  }
@@ -602,6 +656,39 @@ class SelectQueryBuilder {
602
656
  }
603
657
  return result;
604
658
  }
659
+ /**
660
+ * Executes the query and streams the rows.
661
+ *
662
+ * The optional argument `chunkSize` defines how many rows to fetch from the database
663
+ * at a time. It only affects some dialects like PostgreSQL that support it.
664
+ *
665
+ * ### Examples
666
+ *
667
+ * ```ts
668
+ * const stream = db.
669
+ * .selectFrom('person')
670
+ * .select(['first_name', 'last_name'])
671
+ * .where('gender', '=', 'other')
672
+ * .stream()
673
+ *
674
+ * for await (const person of stream) {
675
+ * console.log(person.first_name)
676
+ *
677
+ * if (person.last_name === 'Something') {
678
+ * // Breaking or returning before the stream has ended will release
679
+ * // the database connection and invalidate the stream.
680
+ * break
681
+ * }
682
+ * }
683
+ * ```
684
+ */
685
+ async *stream(chunkSize = 100) {
686
+ const compildQuery = this.compile();
687
+ const stream = this.#props.executor.stream(compildQuery, chunkSize, this.#props.queryId);
688
+ for await (const item of stream) {
689
+ yield* item.rows;
690
+ }
691
+ }
605
692
  }
606
693
  exports.SelectQueryBuilder = SelectQueryBuilder;
607
694
  (0, prevent_await_js_1.preventAwait)(SelectQueryBuilder, "don't await SelectQueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
@@ -68,6 +68,9 @@ import { DefaultValueNode } from '../operation-node/default-value-node.js';
68
68
  import { OnNode } from '../operation-node/on-node.js';
69
69
  import { ValuesNode } from '../operation-node/values-node.js';
70
70
  import { CommonTableExpressionNameNode } from '../operation-node/common-table-expression-name-node.js';
71
+ import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
72
+ import { CreateTypeNode } from '../operation-node/create-type-node.js';
73
+ import { DropTypeNode } from '../operation-node/drop-type-node.js';
71
74
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
72
75
  #private;
73
76
  protected get numParameters(): number;
@@ -143,6 +146,9 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
143
146
  protected visitDropView(node: DropViewNode): void;
144
147
  protected visitGenerated(node: GeneratedNode): void;
145
148
  protected visitDefaultValue(node: DefaultValueNode): void;
149
+ protected visitSelectModifier(node: SelectModifierNode): void;
150
+ protected visitCreateType(node: CreateTypeNode): void;
151
+ protected visitDropType(node: DropTypeNode): void;
146
152
  protected append(str: string): void;
147
153
  protected appendValue(parameter: unknown): void;
148
154
  protected getLeftIdentifierWrapper(): string;
@@ -44,8 +44,8 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
44
44
  this.compileDistinctOn(node.distinctOnSelections);
45
45
  this.append(' ');
46
46
  }
47
- if (node.distinct) {
48
- this.append('distinct');
47
+ if (node.frontModifiers && node.frontModifiers.length > 0) {
48
+ this.compileList(node.frontModifiers, ' ');
49
49
  this.append(' ');
50
50
  }
51
51
  if (node.selections) {
@@ -85,11 +85,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
85
85
  this.append(' ');
86
86
  this.visitNode(node.offset);
87
87
  }
88
- if (node.modifiers) {
89
- node.modifiers.forEach((modifier) => {
90
- this.append(' ');
91
- this.append(SELECT_MODIFIER_SQL[modifier]);
92
- });
88
+ if (node.endModifiers && node.endModifiers.length > 0) {
89
+ this.append(' ');
90
+ this.compileList(node.endModifiers, ' ');
93
91
  }
94
92
  if (wrapInParens) {
95
93
  this.append(')');
@@ -136,7 +134,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
136
134
  this.visitNode(node.with);
137
135
  this.append(' ');
138
136
  }
139
- this.append('insert');
137
+ this.append(node.replace ? 'replace' : 'insert');
140
138
  if (node.ignore) {
141
139
  this.append(' ignore');
142
140
  }
@@ -785,6 +783,29 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
785
783
  this.append('default ');
786
784
  this.visitNode(node.defaultValue);
787
785
  }
786
+ visitSelectModifier(node) {
787
+ if (node.rawModifier) {
788
+ this.visitNode(node.rawModifier);
789
+ }
790
+ else {
791
+ this.append(SELECT_MODIFIER_SQL[node.modifier]);
792
+ }
793
+ }
794
+ visitCreateType(node) {
795
+ this.append('create type ');
796
+ this.visitNode(node.name);
797
+ if (node.enum) {
798
+ this.append(' as enum ');
799
+ this.visitNode(node.enum);
800
+ }
801
+ }
802
+ visitDropType(node) {
803
+ this.append('drop type ');
804
+ if (node.ifExists) {
805
+ this.append('if exists ');
806
+ }
807
+ this.visitNode(node.name);
808
+ }
788
809
  append(str) {
789
810
  this.#sql += str;
790
811
  }
@@ -833,6 +854,7 @@ const SELECT_MODIFIER_SQL = (0, object_utils_js_1.freeze)({
833
854
  ForShare: 'for share',
834
855
  NoWait: 'nowait',
835
856
  SkipLocked: 'skip locked',
857
+ Distinct: 'distinct',
836
858
  });
837
859
  const JOIN_TYPE_SQL = (0, object_utils_js_1.freeze)({
838
860
  InnerJoin: 'inner join',
@@ -2,15 +2,17 @@ import { AlterTableNode } from '../operation-node/alter-table-node.js';
2
2
  import { CreateIndexNode } from '../operation-node/create-index-node.js';
3
3
  import { CreateSchemaNode } from '../operation-node/create-schema-node.js';
4
4
  import { CreateTableNode } from '../operation-node/create-table-node.js';
5
+ import { CreateTypeNode } from '../operation-node/create-type-node.js';
5
6
  import { CreateViewNode } from '../operation-node/create-view-node.js';
6
7
  import { DropIndexNode } from '../operation-node/drop-index-node.js';
7
8
  import { DropSchemaNode } from '../operation-node/drop-schema-node.js';
8
9
  import { DropTableNode } from '../operation-node/drop-table-node.js';
10
+ import { DropTypeNode } from '../operation-node/drop-type-node.js';
9
11
  import { DropViewNode } from '../operation-node/drop-view-node.js';
10
12
  import { QueryNode } from '../operation-node/query-node.js';
11
13
  import { RawNode } from '../operation-node/raw-node.js';
12
14
  import { CompiledQuery } from './compiled-query.js';
13
- export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode;
15
+ export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode | CreateTypeNode | DropTypeNode;
14
16
  /**
15
17
  * a `QueryCompiler` compiles a query expressed as a tree of `OperationNodes` into SQL.
16
18
  */
@@ -161,6 +161,33 @@ export declare class QueryCreator<DB> {
161
161
  * ```
162
162
  */
163
163
  insertInto<T extends keyof DB & string>(table: T): InsertQueryBuilder<DB, T, InsertResult>;
164
+ /**
165
+ * Creates a replace query.
166
+ *
167
+ * A MySQL-only statement similar to {@link InsertQueryBuilder.onDuplicateKeyUpdate}
168
+ * that deletes and inserts values on collision instead of updating existing rows.
169
+ *
170
+ * The return value of this query is an instance of {@link InsertResult}. {@link InsertResult}
171
+ * has the {@link InsertResult.insertId | insertId} field that holds the auto incremented id of
172
+ * the inserted row if the db returned one.
173
+ *
174
+ * See the {@link InsertQueryBuilder.values | values} method for more info and examples.
175
+ *
176
+ * ### Examples
177
+ *
178
+ * ```ts
179
+ * const result = await db
180
+ * .replaceInto('person')
181
+ * .values({
182
+ * first_name: 'Jennifer',
183
+ * last_name: 'Aniston'
184
+ * })
185
+ * .executeTakeFirst()
186
+ *
187
+ * console.log(result.insertId)
188
+ * ```
189
+ */
190
+ replaceInto<T extends keyof DB & string>(table: T): InsertQueryBuilder<DB, T, InsertResult>;
164
191
  /**
165
192
  * Creates a delete query.
166
193
  *
@@ -72,6 +72,39 @@ class QueryCreator {
72
72
  queryNode: insert_query_node_js_1.InsertQueryNode.create((0, table_parser_js_1.parseTable)(table), this.#props.withNode),
73
73
  });
74
74
  }
75
+ /**
76
+ * Creates a replace query.
77
+ *
78
+ * A MySQL-only statement similar to {@link InsertQueryBuilder.onDuplicateKeyUpdate}
79
+ * that deletes and inserts values on collision instead of updating existing rows.
80
+ *
81
+ * The return value of this query is an instance of {@link InsertResult}. {@link InsertResult}
82
+ * has the {@link InsertResult.insertId | insertId} field that holds the auto incremented id of
83
+ * the inserted row if the db returned one.
84
+ *
85
+ * See the {@link InsertQueryBuilder.values | values} method for more info and examples.
86
+ *
87
+ * ### Examples
88
+ *
89
+ * ```ts
90
+ * const result = await db
91
+ * .replaceInto('person')
92
+ * .values({
93
+ * first_name: 'Jennifer',
94
+ * last_name: 'Aniston'
95
+ * })
96
+ * .executeTakeFirst()
97
+ *
98
+ * console.log(result.insertId)
99
+ * ```
100
+ */
101
+ replaceInto(table) {
102
+ return new insert_query_builder_js_1.InsertQueryBuilder({
103
+ queryId: (0, query_id_js_1.createQueryId)(),
104
+ executor: this.#props.executor,
105
+ queryNode: insert_query_node_js_1.InsertQueryNode.create((0, table_parser_js_1.parseTable)(table), this.#props.withNode, true),
106
+ });
107
+ }
75
108
  /**
76
109
  * Creates a delete query.
77
110
  *