kysely 0.19.9 → 0.19.12

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 (116) hide show
  1. package/README.md +56 -7
  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-table-node.d.ts +3 -1
  14. package/dist/cjs/operation-node/create-table-node.js +2 -1
  15. package/dist/cjs/operation-node/create-type-node.d.ts +17 -0
  16. package/dist/cjs/operation-node/create-type-node.js +27 -0
  17. package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
  18. package/dist/cjs/operation-node/drop-type-node.d.ts +16 -0
  19. package/dist/cjs/operation-node/drop-type-node.js +25 -0
  20. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +2 -2
  21. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
  22. package/dist/cjs/operation-node/insert-query-node.js +2 -1
  23. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  24. package/dist/cjs/operation-node/operation-node-transformer.js +17 -0
  25. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  26. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  27. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  28. package/dist/cjs/operation-node/references-node.d.ts +3 -1
  29. package/dist/cjs/operation-node/references-node.js +8 -1
  30. package/dist/cjs/parser/on-commit-action-parse.d.ts +2 -0
  31. package/dist/cjs/parser/on-commit-action-parse.js +11 -0
  32. package/dist/cjs/parser/on-modify-action-parser.d.ts +2 -0
  33. package/dist/cjs/parser/on-modify-action-parser.js +11 -0
  34. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  35. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
  36. package/dist/cjs/query-builder/insert-query-builder.d.ts +1 -1
  37. package/dist/cjs/query-builder/select-query-builder.d.ts +27 -0
  38. package/dist/cjs/query-builder/select-query-builder.js +34 -2
  39. package/dist/cjs/query-compiler/default-query-compiler.d.ts +5 -0
  40. package/dist/cjs/query-compiler/default-query-compiler.js +35 -2
  41. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
  42. package/dist/cjs/query-creator.d.ts +27 -0
  43. package/dist/cjs/query-creator.js +33 -0
  44. package/dist/cjs/query-executor/query-executor-base.d.ts +6 -0
  45. package/dist/cjs/query-executor/query-executor-base.js +19 -0
  46. package/dist/cjs/query-executor/query-executor.d.ts +11 -0
  47. package/dist/cjs/schema/column-definition-builder.js +3 -2
  48. package/dist/cjs/schema/create-table-builder.d.ts +6 -6
  49. package/dist/cjs/schema/create-table-builder.js +8 -7
  50. package/dist/cjs/schema/create-type-builder.d.ts +28 -0
  51. package/dist/cjs/schema/create-type-builder.js +38 -0
  52. package/dist/cjs/schema/drop-type-builder.d.ts +19 -0
  53. package/dist/cjs/schema/drop-type-builder.js +31 -0
  54. package/dist/cjs/schema/foreign-key-constraint-builder.js +3 -2
  55. package/dist/cjs/schema/schema.d.ts +32 -0
  56. package/dist/cjs/schema/schema.js +46 -0
  57. package/dist/cjs/util/deferred.d.ts +7 -0
  58. package/dist/cjs/util/deferred.js +28 -0
  59. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  60. package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -0
  61. package/dist/esm/dialect/mysql/mysql-driver.js +25 -0
  62. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  63. package/dist/esm/dialect/postgres/postgres-driver.d.ts +6 -2
  64. package/dist/esm/dialect/postgres/postgres-driver.js +24 -2
  65. package/dist/esm/dialect/sqlite/sqlite-driver.js +3 -0
  66. package/dist/esm/driver/database-connection.d.ts +1 -0
  67. package/dist/esm/driver/dummy-driver.js +3 -0
  68. package/dist/esm/index.d.ts +4 -0
  69. package/dist/esm/index.js +4 -0
  70. package/dist/esm/operation-node/create-table-node.d.ts +3 -1
  71. package/dist/esm/operation-node/create-table-node.js +1 -0
  72. package/dist/esm/operation-node/create-type-node.d.ts +17 -0
  73. package/dist/esm/operation-node/create-type-node.js +25 -0
  74. package/dist/esm/operation-node/data-type-node.d.ts +1 -1
  75. package/dist/esm/operation-node/drop-type-node.d.ts +16 -0
  76. package/dist/esm/operation-node/drop-type-node.js +23 -0
  77. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +2 -2
  78. package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
  79. package/dist/esm/operation-node/insert-query-node.js +2 -1
  80. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  81. package/dist/esm/operation-node/operation-node-transformer.js +17 -0
  82. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  83. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  84. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  85. package/dist/esm/operation-node/references-node.d.ts +3 -1
  86. package/dist/esm/operation-node/references-node.js +7 -0
  87. package/dist/esm/parser/on-commit-action-parse.d.ts +2 -0
  88. package/dist/esm/parser/on-commit-action-parse.js +8 -0
  89. package/dist/esm/parser/on-modify-action-parser.d.ts +2 -0
  90. package/dist/esm/parser/on-modify-action-parser.js +8 -0
  91. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  92. package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
  93. package/dist/esm/query-builder/insert-query-builder.d.ts +1 -1
  94. package/dist/esm/query-builder/select-query-builder.d.ts +27 -0
  95. package/dist/esm/query-builder/select-query-builder.js +34 -2
  96. package/dist/esm/query-compiler/default-query-compiler.d.ts +5 -0
  97. package/dist/esm/query-compiler/default-query-compiler.js +35 -2
  98. package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
  99. package/dist/esm/query-creator.d.ts +27 -0
  100. package/dist/esm/query-creator.js +33 -0
  101. package/dist/esm/query-executor/query-executor-base.d.ts +6 -0
  102. package/dist/esm/query-executor/query-executor-base.js +19 -0
  103. package/dist/esm/query-executor/query-executor.d.ts +11 -0
  104. package/dist/esm/schema/column-definition-builder.js +3 -2
  105. package/dist/esm/schema/create-table-builder.d.ts +6 -6
  106. package/dist/esm/schema/create-table-builder.js +8 -7
  107. package/dist/esm/schema/create-type-builder.d.ts +28 -0
  108. package/dist/esm/schema/create-type-builder.js +35 -0
  109. package/dist/esm/schema/drop-type-builder.d.ts +19 -0
  110. package/dist/esm/schema/drop-type-builder.js +28 -0
  111. package/dist/esm/schema/foreign-key-constraint-builder.js +3 -2
  112. package/dist/esm/schema/schema.d.ts +32 -0
  113. package/dist/esm/schema/schema.js +46 -0
  114. package/dist/esm/util/deferred.d.ts +7 -0
  115. package/dist/esm/util/deferred.js +25 -0
  116. package/package.json +5 -2
@@ -100,6 +100,8 @@ export class OperationNodeTransformer {
100
100
  OnNode: this.transformOn.bind(this),
101
101
  ValuesNode: this.transformValues.bind(this),
102
102
  SelectModifierNode: this.transformSelectModifier.bind(this),
103
+ CreateTypeNode: this.transformCreateType.bind(this),
104
+ DropTypeNode: this.transformDropType.bind(this),
103
105
  });
104
106
  transformNode = (node) => {
105
107
  if (!node) {
@@ -240,6 +242,7 @@ export class OperationNodeTransformer {
240
242
  onDuplicateKey: this.transformNode(node.onDuplicateKey),
241
243
  with: this.transformNode(node.with),
242
244
  ignore: node.ignore,
245
+ replace: node.replace,
243
246
  });
244
247
  }
245
248
  transformValues(node) {
@@ -601,6 +604,20 @@ export class OperationNodeTransformer {
601
604
  rawModifier: this.transformNode(node.rawModifier),
602
605
  });
603
606
  }
607
+ transformCreateType(node) {
608
+ return requireAllProps({
609
+ kind: 'CreateTypeNode',
610
+ name: this.transformNode(node.name),
611
+ enum: this.transformNode(node.enum),
612
+ });
613
+ }
614
+ transformDropType(node) {
615
+ return requireAllProps({
616
+ kind: 'DropTypeNode',
617
+ name: this.transformNode(node.name),
618
+ ifExists: node.ifExists,
619
+ });
620
+ }
604
621
  transformDataType(node) {
605
622
  // An Object.freezed leaf node. No need to clone.
606
623
  return node;
@@ -66,6 +66,8 @@ import { DefaultValueNode } from './default-value-node.js';
66
66
  import { OnNode } from './on-node.js';
67
67
  import { ValuesNode } from './values-node.js';
68
68
  import { SelectModifierNode } from './select-modifier-node.js';
69
+ import { CreateTypeNode } from './create-type-node.js';
70
+ import { DropTypeNode } from './drop-type-node.js';
69
71
  export declare abstract class OperationNodeVisitor {
70
72
  #private;
71
73
  protected readonly nodeStack: OperationNode[];
@@ -138,4 +140,6 @@ export declare abstract class OperationNodeVisitor {
138
140
  protected abstract visitOn(node: OnNode): void;
139
141
  protected abstract visitValues(node: ValuesNode): void;
140
142
  protected abstract visitSelectModifier(node: SelectModifierNode): void;
143
+ protected abstract visitCreateType(node: CreateTypeNode): void;
144
+ protected abstract visitDropType(node: DropTypeNode): void;
141
145
  }
@@ -73,6 +73,8 @@ export class OperationNodeVisitor {
73
73
  OnNode: this.visitOn.bind(this),
74
74
  ValuesNode: this.visitValues.bind(this),
75
75
  SelectModifierNode: this.visitSelectModifier.bind(this),
76
+ CreateTypeNode: this.visitCreateType.bind(this),
77
+ DropTypeNode: this.visitDropType.bind(this),
76
78
  });
77
79
  visitNode = (node) => {
78
80
  this.nodeStack.push(node);
@@ -1,4 +1,4 @@
1
- export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode';
1
+ export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -1,7 +1,9 @@
1
1
  import { OperationNode } from './operation-node.js';
2
2
  import { ColumnNode } from './column-node.js';
3
3
  import { TableNode } from './table-node.js';
4
- export declare type OnModifyForeignAction = 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default';
4
+ import { ArrayItemType } from '../util/type-utils.js';
5
+ export declare const ON_MODIFY_FOREIGN_ACTIONS: readonly ["no action", "restrict", "cascade", "set null", "set default"];
6
+ export declare type OnModifyForeignAction = ArrayItemType<typeof ON_MODIFY_FOREIGN_ACTIONS>;
5
7
  export interface ReferencesNode extends OperationNode {
6
8
  readonly kind: 'ReferencesNode';
7
9
  readonly table: TableNode;
@@ -1,5 +1,12 @@
1
1
  /// <reference types="./references-node.d.ts" />
2
2
  import { freeze } from '../util/object-utils.js';
3
+ export const ON_MODIFY_FOREIGN_ACTIONS = [
4
+ 'no action',
5
+ 'restrict',
6
+ 'cascade',
7
+ 'set null',
8
+ 'set default',
9
+ ];
3
10
  /**
4
11
  * @internal
5
12
  */
@@ -0,0 +1,2 @@
1
+ import { OnCommitAction } from '../operation-node/create-table-node.js';
2
+ export declare function parseOnCommitAction(action: OnCommitAction): OnCommitAction;
@@ -0,0 +1,8 @@
1
+ /// <reference types="./on-commit-action-parse.d.ts" />
2
+ import { ON_COMMIT_ACTIONS, } from '../operation-node/create-table-node.js';
3
+ export function parseOnCommitAction(action) {
4
+ if (ON_COMMIT_ACTIONS.includes(action)) {
5
+ return action;
6
+ }
7
+ throw new Error(`invalid OnCommitAction ${action}`);
8
+ }
@@ -0,0 +1,2 @@
1
+ import { OnModifyForeignAction } from '../operation-node/references-node.js';
2
+ export declare function parseOnModifyForeignAction(action: OnModifyForeignAction): OnModifyForeignAction;
@@ -0,0 +1,8 @@
1
+ /// <reference types="./on-modify-action-parser.d.ts" />
2
+ import { ON_MODIFY_FOREIGN_ACTIONS, } from '../operation-node/references-node.js';
3
+ export function parseOnModifyForeignAction(action) {
4
+ if (ON_MODIFY_FOREIGN_ACTIONS.includes(action)) {
5
+ return action;
6
+ }
7
+ throw new Error(`invalid OnModifyForeignAction ${action}`);
8
+ }
@@ -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
  }
@@ -39,6 +39,12 @@ export class WithSchemaTransformer extends OperationNodeTransformer {
39
39
  transformDropView(node) {
40
40
  return this.#transformRoot(node, (node) => super.transformDropView(node));
41
41
  }
42
+ transformCreateType(node) {
43
+ return this.#transformRoot(node, (node) => super.transformCreateType(node));
44
+ }
45
+ transformDropType(node) {
46
+ return this.#transformRoot(node, (node) => super.transformDropType(node));
47
+ }
42
48
  transformAlterTable(node) {
43
49
  return this.#transformRoot(node, (node) => super.transformAlterTable(node));
44
50
  }
@@ -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',
@@ -1343,6 +1343,33 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1343
1343
  * error.
1344
1344
  */
1345
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>;
1346
1373
  }
1347
1374
  export interface SelectQueryBuilderProps {
1348
1375
  readonly queryId: QueryId;
@@ -1,5 +1,6 @@
1
1
  /// <reference types="./select-query-builder.d.ts" />
2
2
  import { AliasNode } from '../operation-node/alias-node.js';
3
+ import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
3
4
  import { parseJoin, } from '../parser/join-parser.js';
4
5
  import { parseSelectExpressionOrList, parseSelectAll, } from '../parser/select-parser.js';
5
6
  import { parseExistFilter, parseReferenceFilter, parseWhereFilter, parseHavingFilter, parseNotExistFilter, } from '../parser/filter-parser.js';
@@ -14,7 +15,6 @@ import { parseGroupBy } from '../parser/group-by-parser.js';
14
15
  import { parseUnion } from '../parser/union-parser.js';
15
16
  import { NoResultError } from './no-result-error.js';
16
17
  import { IdentifierNode } from '../operation-node/identifier-node.js';
17
- import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
18
18
  export class SelectQueryBuilder {
19
19
  #props;
20
20
  constructor(props) {
@@ -628,7 +628,6 @@ export class SelectQueryBuilder {
628
628
  */
629
629
  async execute() {
630
630
  const compildQuery = this.compile();
631
- const query = compildQuery.query;
632
631
  const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
633
632
  return result.rows;
634
633
  }
@@ -655,6 +654,39 @@ export class SelectQueryBuilder {
655
654
  }
656
655
  return result;
657
656
  }
657
+ /**
658
+ * Executes the query and streams the rows.
659
+ *
660
+ * The optional argument `chunkSize` defines how many rows to fetch from the database
661
+ * at a time. It only affects some dialects like PostgreSQL that support it.
662
+ *
663
+ * ### Examples
664
+ *
665
+ * ```ts
666
+ * const stream = db.
667
+ * .selectFrom('person')
668
+ * .select(['first_name', 'last_name'])
669
+ * .where('gender', '=', 'other')
670
+ * .stream()
671
+ *
672
+ * for await (const person of stream) {
673
+ * console.log(person.first_name)
674
+ *
675
+ * if (person.last_name === 'Something') {
676
+ * // Breaking or returning before the stream has ended will release
677
+ * // the database connection and invalidate the stream.
678
+ * break
679
+ * }
680
+ * }
681
+ * ```
682
+ */
683
+ async *stream(chunkSize = 100) {
684
+ const compildQuery = this.compile();
685
+ const stream = this.#props.executor.stream(compildQuery, chunkSize, this.#props.queryId);
686
+ for await (const item of stream) {
687
+ yield* item.rows;
688
+ }
689
+ }
658
690
  }
659
691
  preventAwait(SelectQueryBuilder, "don't await SelectQueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
660
692
  /**
@@ -69,6 +69,8 @@ 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
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';
72
74
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
73
75
  #private;
74
76
  protected get numParameters(): number;
@@ -145,11 +147,14 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
145
147
  protected visitGenerated(node: GeneratedNode): void;
146
148
  protected visitDefaultValue(node: DefaultValueNode): void;
147
149
  protected visitSelectModifier(node: SelectModifierNode): void;
150
+ protected visitCreateType(node: CreateTypeNode): void;
151
+ protected visitDropType(node: DropTypeNode): void;
148
152
  protected append(str: string): void;
149
153
  protected appendValue(parameter: unknown): void;
150
154
  protected getLeftIdentifierWrapper(): string;
151
155
  protected getRightIdentifierWrapper(): string;
152
156
  protected getCurrentParameterPlaceholder(): string;
157
+ protected sanitizeIdentifier(identifier: string): string;
153
158
  protected addParameter(parameter: unknown): void;
154
159
  protected appendImmediateValue(value: unknown): void;
155
160
  }
@@ -132,7 +132,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
132
132
  this.visitNode(node.with);
133
133
  this.append(' ');
134
134
  }
135
- this.append('insert');
135
+ this.append(node.replace ? 'replace' : 'insert');
136
136
  if (node.ignore) {
137
137
  this.append(' ignore');
138
138
  }
@@ -225,7 +225,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
225
225
  this.append(this.getRightIdentifierWrapper());
226
226
  }
227
227
  compileUnwrappedIdentifier(node) {
228
- this.append(node.identifier);
228
+ this.append(this.sanitizeIdentifier(node.identifier));
229
229
  }
230
230
  visitFilter(node) {
231
231
  if (node.left) {
@@ -789,6 +789,21 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
789
789
  this.append(SELECT_MODIFIER_SQL[node.modifier]);
790
790
  }
791
791
  }
792
+ visitCreateType(node) {
793
+ this.append('create type ');
794
+ this.visitNode(node.name);
795
+ if (node.enum) {
796
+ this.append(' as enum ');
797
+ this.visitNode(node.enum);
798
+ }
799
+ }
800
+ visitDropType(node) {
801
+ this.append('drop type ');
802
+ if (node.ifExists) {
803
+ this.append('if exists ');
804
+ }
805
+ this.visitNode(node.name);
806
+ }
792
807
  append(str) {
793
808
  this.#sql += str;
794
809
  }
@@ -805,6 +820,24 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
805
820
  getCurrentParameterPlaceholder() {
806
821
  return '$' + this.numParameters;
807
822
  }
823
+ sanitizeIdentifier(identifier) {
824
+ if (!isString(identifier)) {
825
+ throw new Error('a non-string identifier was passed to sanitizeIdentifier.');
826
+ }
827
+ const leftWrap = this.getLeftIdentifierWrapper();
828
+ const rightWrap = this.getRightIdentifierWrapper();
829
+ let sanitized = '';
830
+ for (const c of identifier) {
831
+ sanitized += c;
832
+ if (c === leftWrap) {
833
+ sanitized += leftWrap;
834
+ }
835
+ else if (c === rightWrap) {
836
+ sanitized += rightWrap;
837
+ }
838
+ }
839
+ return sanitized;
840
+ }
808
841
  addParameter(parameter) {
809
842
  this.#parameters.push(parameter);
810
843
  }
@@ -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
  *
@@ -70,6 +70,39 @@ export class QueryCreator {
70
70
  queryNode: InsertQueryNode.create(parseTable(table), this.#props.withNode),
71
71
  });
72
72
  }
73
+ /**
74
+ * Creates a replace query.
75
+ *
76
+ * A MySQL-only statement similar to {@link InsertQueryBuilder.onDuplicateKeyUpdate}
77
+ * that deletes and inserts values on collision instead of updating existing rows.
78
+ *
79
+ * The return value of this query is an instance of {@link InsertResult}. {@link InsertResult}
80
+ * has the {@link InsertResult.insertId | insertId} field that holds the auto incremented id of
81
+ * the inserted row if the db returned one.
82
+ *
83
+ * See the {@link InsertQueryBuilder.values | values} method for more info and examples.
84
+ *
85
+ * ### Examples
86
+ *
87
+ * ```ts
88
+ * const result = await db
89
+ * .replaceInto('person')
90
+ * .values({
91
+ * first_name: 'Jennifer',
92
+ * last_name: 'Aniston'
93
+ * })
94
+ * .executeTakeFirst()
95
+ *
96
+ * console.log(result.insertId)
97
+ * ```
98
+ */
99
+ replaceInto(table) {
100
+ return new InsertQueryBuilder({
101
+ queryId: createQueryId(),
102
+ executor: this.#props.executor,
103
+ queryNode: InsertQueryNode.create(parseTable(table), this.#props.withNode, true),
104
+ });
105
+ }
73
106
  /**
74
107
  * Creates a delete query.
75
108
  *
@@ -36,6 +36,12 @@ export declare abstract class QueryExecutorBase implements QueryExecutor {
36
36
  * `transformResult` method.
37
37
  */
38
38
  executeQuery<R>(compiledQuery: CompiledQuery, queryId: QueryId): Promise<QueryResult<R>>;
39
+ /**
40
+ * Executes a compiled query and runs the result through all plugins'
41
+ * `transformResult` method. Results are streamead instead of loaded
42
+ * at once.
43
+ */
44
+ stream<R>(compiledQuery: CompiledQuery, chunkSize: number, queryId: QueryId): AsyncIterableIterator<QueryResult<R>>;
39
45
  /**
40
46
  * Returns a copy of this executor with a new connection provider.
41
47
  */
@@ -1,5 +1,6 @@
1
1
  /// <reference types="./query-executor-base.d.ts" />
2
2
  import { freeze } from '../util/object-utils.js';
3
+ import { Deferred } from '../util/deferred.js';
3
4
  const NO_PLUGINS = freeze([]);
4
5
  export class QueryExecutorBase {
5
6
  #plugins;
@@ -34,6 +35,24 @@ export class QueryExecutorBase {
34
35
  return this.#transformResult(result, queryId);
35
36
  });
36
37
  }
38
+ async *stream(compiledQuery, chunkSize, queryId) {
39
+ const connectionDefer = new Deferred();
40
+ const connectionReleaseDefer = new Deferred();
41
+ this.provideConnection(async (connection) => {
42
+ connectionDefer.resolve(connection);
43
+ // Lets wait until we don't need connection before returning here (returning releases connection)
44
+ return await connectionReleaseDefer.promise;
45
+ }).catch((ex) => connectionDefer.reject(ex));
46
+ const connection = await connectionDefer.promise;
47
+ try {
48
+ for await (const result of connection.streamQuery(compiledQuery, chunkSize)) {
49
+ yield await this.#transformResult(result, queryId);
50
+ }
51
+ }
52
+ finally {
53
+ connectionReleaseDefer.resolve();
54
+ }
55
+ }
37
56
  async #transformResult(result, queryId) {
38
57
  for (const plugin of this.#plugins) {
39
58
  result = await plugin.transformResult({ result, queryId });
@@ -37,6 +37,17 @@ export interface QueryExecutor extends ConnectionProvider {
37
37
  * `transformResult` method.
38
38
  */
39
39
  executeQuery<R>(compiledQuery: CompiledQuery, queryId: QueryId): Promise<QueryResult<R>>;
40
+ /**
41
+ * Executes a compiled query and runs the result through all plugins'
42
+ * `transformResult` method. Results are streamead instead of loaded
43
+ * at once.
44
+ */
45
+ stream<R>(compiledQuery: CompiledQuery,
46
+ /**
47
+ * How many rows should be pulled from the database at once. Supported
48
+ * only by the postgres driver.
49
+ */
50
+ chunkSize: number, queryId: QueryId): AsyncIterableIterator<QueryResult<R>>;
40
51
  /**
41
52
  * Returns a copy of this executor with a new connection provider.
42
53
  */
@@ -9,6 +9,7 @@ import { ColumnDefinitionNode } from '../operation-node/column-definition-node.j
9
9
  import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
10
10
  import { GeneratedNode } from '../operation-node/generated-node.js';
11
11
  import { DefaultValueNode } from '../operation-node/default-value-node.js';
12
+ import { parseOnModifyForeignAction } from '../parser/on-modify-action-parser.js';
12
13
  export class ColumnDefinitionBuilder {
13
14
  #node;
14
15
  constructor(node) {
@@ -36,7 +37,7 @@ export class ColumnDefinitionBuilder {
36
37
  throw new Error('on delete constraint can only be added for foreign keys');
37
38
  }
38
39
  return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
39
- references: ReferencesNode.cloneWithOnDelete(this.#node.references, onDelete),
40
+ references: ReferencesNode.cloneWithOnDelete(this.#node.references, parseOnModifyForeignAction(onDelete)),
40
41
  }));
41
42
  }
42
43
  onUpdate(onUpdate) {
@@ -44,7 +45,7 @@ export class ColumnDefinitionBuilder {
44
45
  throw new Error('on update constraint can only be added for foreign keys');
45
46
  }
46
47
  return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
47
- references: ReferencesNode.cloneWithOnUpdate(this.#node.references, onUpdate),
48
+ references: ReferencesNode.cloneWithOnUpdate(this.#node.references, parseOnModifyForeignAction(onUpdate)),
48
49
  }));
49
50
  }
50
51
  unique() {
@@ -47,17 +47,17 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
47
47
  * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
48
48
  * .addColumn('last_name', 'varchar(255)')
49
49
  * .addColumn('bank_balance', 'numeric(8, 2)')
50
- * .addColumn('data', sql`customtype`)
50
+ * .addColumn('data', sql`some_type`)
51
51
  * .addColumn('parent_id', 'integer', (col) =>
52
52
  * col.references('person.id').onDelete('cascade'))
53
53
  * )
54
54
  * ```
55
55
  *
56
- * With this method, it's once again good to remember that Kysely just builds the query
57
- * and doesn't provide the same API for all databses. For example, some databases like
58
- * older MySQL don't support `references` statement in the column definition. Instead
59
- * foreign key constraints need to be defined in at the level of the `create table`
60
- * query. See the next example:
56
+ * With this method, it's once again good to remember that Kysely just builds the
57
+ * query and doesn't provide the same API for all databses. For example, some
58
+ * databases like older MySQL don't support the `references` statement in the
59
+ * column definition. Instead foreign key constraints need to be defined in the
60
+ * `create table` query. See the next example:
61
61
  *
62
62
  * ```ts
63
63
  * .addColumn('parent_id', 'integer')
@@ -12,6 +12,7 @@ import { PrimaryConstraintNode } from '../operation-node/primary-constraint-node
12
12
  import { UniqueConstraintNode } from '../operation-node/unique-constraint-node.js';
13
13
  import { CheckConstraintNode } from '../operation-node/check-constraint-node.js';
14
14
  import { parseTable } from '../parser/table-parser.js';
15
+ import { parseOnCommitAction } from '../parser/on-commit-action-parse.js';
15
16
  /**
16
17
  * This builder can be used to create a `create table` query.
17
18
  */
@@ -43,7 +44,7 @@ export class CreateTableBuilder {
43
44
  return new CreateTableBuilder({
44
45
  ...this.#props,
45
46
  createTableNode: CreateTableNode.cloneWith(this.#props.createTableNode, {
46
- onCommit,
47
+ onCommit: parseOnCommitAction(onCommit),
47
48
  }),
48
49
  });
49
50
  }
@@ -74,17 +75,17 @@ export class CreateTableBuilder {
74
75
  * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
75
76
  * .addColumn('last_name', 'varchar(255)')
76
77
  * .addColumn('bank_balance', 'numeric(8, 2)')
77
- * .addColumn('data', sql`customtype`)
78
+ * .addColumn('data', sql`some_type`)
78
79
  * .addColumn('parent_id', 'integer', (col) =>
79
80
  * col.references('person.id').onDelete('cascade'))
80
81
  * )
81
82
  * ```
82
83
  *
83
- * With this method, it's once again good to remember that Kysely just builds the query
84
- * and doesn't provide the same API for all databses. For example, some databases like
85
- * older MySQL don't support `references` statement in the column definition. Instead
86
- * foreign key constraints need to be defined in at the level of the `create table`
87
- * query. See the next example:
84
+ * With this method, it's once again good to remember that Kysely just builds the
85
+ * query and doesn't provide the same API for all databses. For example, some
86
+ * databases like older MySQL don't support the `references` statement in the
87
+ * column definition. Instead foreign key constraints need to be defined in the
88
+ * `create table` query. See the next example:
88
89
  *
89
90
  * ```ts
90
91
  * .addColumn('parent_id', 'integer')
@@ -0,0 +1,28 @@
1
+ import { OperationNodeSource } from '../operation-node/operation-node-source.js';
2
+ import { CompiledQuery } from '../query-compiler/compiled-query.js';
3
+ import { Compilable } from '../util/compilable.js';
4
+ import { QueryExecutor } from '../query-executor/query-executor.js';
5
+ import { QueryId } from '../util/query-id.js';
6
+ import { CreateTypeNode } from '../operation-node/create-type-node.js';
7
+ export declare class CreateTypeBuilder implements OperationNodeSource, Compilable {
8
+ #private;
9
+ constructor(props: CreateTypeBuilderProps);
10
+ toOperationNode(): CreateTypeNode;
11
+ /**
12
+ * Creates an anum type.
13
+ *
14
+ * ### Examples
15
+ *
16
+ * ```ts
17
+ * db.schema.createType('species').asEnum(['cat', 'dog', 'frog'])
18
+ * ```
19
+ */
20
+ asEnum(values: string[]): CreateTypeBuilder;
21
+ compile(): CompiledQuery;
22
+ execute(): Promise<void>;
23
+ }
24
+ export interface CreateTypeBuilderProps {
25
+ readonly queryId: QueryId;
26
+ readonly executor: QueryExecutor;
27
+ readonly createTypeNode: CreateTypeNode;
28
+ }