kysely 0.19.12 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
  3. package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +5 -0
  4. package/dist/cjs/dialect/mysql/mysql-query-compiler.js +16 -0
  5. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +5 -12
  6. package/dist/cjs/dialect/postgres/postgres-driver.js +16 -11
  7. package/dist/cjs/dialect/postgres/postgres-introspector.js +17 -9
  8. package/dist/cjs/dialect/postgres/postgres-query-compiler.d.ts +1 -3
  9. package/dist/cjs/dialect/postgres/postgres-query-compiler.js +3 -8
  10. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +2 -0
  11. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +3 -0
  12. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +10 -0
  13. package/dist/cjs/index.d.ts +3 -0
  14. package/dist/cjs/index.js +3 -0
  15. package/dist/cjs/operation-node/create-table-node.d.ts +6 -1
  16. package/dist/cjs/operation-node/create-table-node.js +16 -0
  17. package/dist/cjs/operation-node/create-type-node.d.ts +2 -2
  18. package/dist/cjs/operation-node/create-type-node.js +2 -2
  19. package/dist/cjs/operation-node/create-view-node.d.ts +2 -2
  20. package/dist/cjs/operation-node/create-view-node.js +2 -2
  21. package/dist/cjs/operation-node/delete-query-node.d.ts +3 -0
  22. package/dist/cjs/operation-node/delete-query-node.js +6 -0
  23. package/dist/cjs/operation-node/drop-index-node.d.ts +2 -2
  24. package/dist/cjs/operation-node/drop-index-node.js +2 -2
  25. package/dist/cjs/operation-node/drop-type-node.d.ts +2 -2
  26. package/dist/cjs/operation-node/drop-type-node.js +2 -2
  27. package/dist/cjs/operation-node/drop-view-node.d.ts +2 -2
  28. package/dist/cjs/operation-node/drop-view-node.js +2 -2
  29. package/dist/cjs/operation-node/explain-node.d.ts +16 -0
  30. package/dist/cjs/operation-node/explain-node.js +19 -0
  31. package/dist/cjs/operation-node/identifier-node.d.ts +2 -2
  32. package/dist/cjs/operation-node/identifier-node.js +2 -2
  33. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -0
  34. package/dist/cjs/operation-node/operation-node-transformer.d.ts +7 -3
  35. package/dist/cjs/operation-node/operation-node-transformer.js +30 -6
  36. package/dist/cjs/operation-node/operation-node-visitor.d.ts +8 -4
  37. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  38. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  39. package/dist/cjs/operation-node/reference-node.d.ts +1 -1
  40. package/dist/cjs/operation-node/reference-node.js +1 -2
  41. package/dist/cjs/operation-node/schemable-identifier-node.d.ts +15 -0
  42. package/dist/cjs/operation-node/schemable-identifier-node.js +26 -0
  43. package/dist/cjs/operation-node/select-query-node.d.ts +3 -0
  44. package/dist/cjs/operation-node/select-query-node.js +6 -0
  45. package/dist/cjs/operation-node/selection-node.d.ts +2 -1
  46. package/dist/cjs/operation-node/table-node.d.ts +2 -3
  47. package/dist/cjs/operation-node/table-node.js +3 -4
  48. package/dist/cjs/operation-node/update-query-node.d.ts +3 -0
  49. package/dist/cjs/operation-node/update-query-node.js +6 -0
  50. package/dist/cjs/parser/select-parser.js +2 -1
  51. package/dist/cjs/plugin/camel-case/camel-case-transformer.js +1 -1
  52. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -28
  53. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +72 -78
  54. package/dist/cjs/query-builder/delete-query-builder.d.ts +19 -1
  55. package/dist/cjs/query-builder/delete-query-builder.js +24 -0
  56. package/dist/cjs/query-builder/function-builder.d.ts +3 -3
  57. package/dist/cjs/query-builder/insert-query-builder.d.ts +20 -2
  58. package/dist/cjs/query-builder/insert-query-builder.js +26 -0
  59. package/dist/cjs/query-builder/select-query-builder.d.ts +38 -1
  60. package/dist/cjs/query-builder/select-query-builder.js +45 -2
  61. package/dist/cjs/query-builder/update-query-builder.d.ts +20 -1
  62. package/dist/cjs/query-builder/update-query-builder.js +25 -0
  63. package/dist/cjs/query-compiler/default-query-compiler.d.ts +8 -0
  64. package/dist/cjs/query-compiler/default-query-compiler.js +63 -5
  65. package/dist/cjs/raw-builder/sql.d.ts +96 -96
  66. package/dist/cjs/raw-builder/sql.js +0 -96
  67. package/dist/cjs/schema/alter-table-builder.d.ts +6 -6
  68. package/dist/cjs/schema/column-definition-builder.d.ts +6 -6
  69. package/dist/cjs/schema/create-table-builder.d.ts +54 -0
  70. package/dist/cjs/schema/create-table-builder.js +64 -0
  71. package/dist/cjs/util/explainable.d.ts +5 -0
  72. package/dist/cjs/util/explainable.js +2 -0
  73. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
  74. package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +5 -0
  75. package/dist/esm/dialect/mysql/mysql-query-compiler.js +16 -0
  76. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +5 -12
  77. package/dist/esm/dialect/postgres/postgres-driver.js +16 -11
  78. package/dist/esm/dialect/postgres/postgres-introspector.js +17 -9
  79. package/dist/esm/dialect/postgres/postgres-query-compiler.d.ts +1 -3
  80. package/dist/esm/dialect/postgres/postgres-query-compiler.js +3 -8
  81. package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -0
  82. package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +3 -0
  83. package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +10 -0
  84. package/dist/esm/index.d.ts +3 -0
  85. package/dist/esm/index.js +3 -0
  86. package/dist/esm/operation-node/create-table-node.d.ts +6 -1
  87. package/dist/esm/operation-node/create-table-node.js +16 -0
  88. package/dist/esm/operation-node/create-type-node.d.ts +2 -2
  89. package/dist/esm/operation-node/create-type-node.js +2 -2
  90. package/dist/esm/operation-node/create-view-node.d.ts +2 -2
  91. package/dist/esm/operation-node/create-view-node.js +2 -2
  92. package/dist/esm/operation-node/delete-query-node.d.ts +3 -0
  93. package/dist/esm/operation-node/delete-query-node.js +6 -0
  94. package/dist/esm/operation-node/drop-index-node.d.ts +2 -2
  95. package/dist/esm/operation-node/drop-index-node.js +2 -2
  96. package/dist/esm/operation-node/drop-type-node.d.ts +2 -2
  97. package/dist/esm/operation-node/drop-type-node.js +2 -2
  98. package/dist/esm/operation-node/drop-view-node.d.ts +2 -2
  99. package/dist/esm/operation-node/drop-view-node.js +2 -2
  100. package/dist/esm/operation-node/explain-node.d.ts +16 -0
  101. package/dist/esm/operation-node/explain-node.js +17 -0
  102. package/dist/esm/operation-node/identifier-node.d.ts +2 -2
  103. package/dist/esm/operation-node/identifier-node.js +2 -2
  104. package/dist/esm/operation-node/insert-query-node.d.ts +2 -0
  105. package/dist/esm/operation-node/operation-node-transformer.d.ts +7 -3
  106. package/dist/esm/operation-node/operation-node-transformer.js +30 -6
  107. package/dist/esm/operation-node/operation-node-visitor.d.ts +8 -4
  108. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  109. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  110. package/dist/esm/operation-node/reference-node.d.ts +1 -1
  111. package/dist/esm/operation-node/reference-node.js +1 -2
  112. package/dist/esm/operation-node/schemable-identifier-node.d.ts +15 -0
  113. package/dist/esm/operation-node/schemable-identifier-node.js +24 -0
  114. package/dist/esm/operation-node/select-query-node.d.ts +3 -0
  115. package/dist/esm/operation-node/select-query-node.js +6 -0
  116. package/dist/esm/operation-node/selection-node.d.ts +2 -1
  117. package/dist/esm/operation-node/table-node.d.ts +2 -3
  118. package/dist/esm/operation-node/table-node.js +3 -4
  119. package/dist/esm/operation-node/update-query-node.d.ts +3 -0
  120. package/dist/esm/operation-node/update-query-node.js +6 -0
  121. package/dist/esm/parser/select-parser.js +2 -1
  122. package/dist/esm/plugin/camel-case/camel-case-transformer.js +1 -1
  123. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -28
  124. package/dist/esm/plugin/with-schema/with-schema-transformer.js +72 -78
  125. package/dist/esm/query-builder/delete-query-builder.d.ts +19 -1
  126. package/dist/esm/query-builder/delete-query-builder.js +24 -0
  127. package/dist/esm/query-builder/function-builder.d.ts +3 -3
  128. package/dist/esm/query-builder/insert-query-builder.d.ts +20 -2
  129. package/dist/esm/query-builder/insert-query-builder.js +26 -0
  130. package/dist/esm/query-builder/select-query-builder.d.ts +38 -1
  131. package/dist/esm/query-builder/select-query-builder.js +45 -2
  132. package/dist/esm/query-builder/update-query-builder.d.ts +20 -1
  133. package/dist/esm/query-builder/update-query-builder.js +25 -0
  134. package/dist/esm/query-compiler/default-query-compiler.d.ts +8 -0
  135. package/dist/esm/query-compiler/default-query-compiler.js +63 -5
  136. package/dist/esm/raw-builder/sql.d.ts +96 -96
  137. package/dist/esm/raw-builder/sql.js +0 -96
  138. package/dist/esm/schema/alter-table-builder.d.ts +6 -6
  139. package/dist/esm/schema/column-definition-builder.d.ts +6 -6
  140. package/dist/esm/schema/create-table-builder.d.ts +54 -0
  141. package/dist/esm/schema/create-table-builder.js +64 -0
  142. package/dist/esm/util/explainable.d.ts +5 -0
  143. package/dist/esm/util/explainable.js +2 -0
  144. package/package.json +4 -1
@@ -68,6 +68,8 @@ import { ValuesNode } from './values-node.js';
68
68
  import { SelectModifierNode } from './select-modifier-node.js';
69
69
  import { CreateTypeNode } from './create-type-node.js';
70
70
  import { DropTypeNode } from './drop-type-node.js';
71
+ import { ExplainNode } from './explain-node.js';
72
+ import { SchemableIdentifierNode } from './schemable-identifier-node.js';
71
73
  /**
72
74
  * Transforms an operation node tree into another one.
73
75
  *
@@ -100,9 +102,9 @@ import { DropTypeNode } from './drop-type-node.js';
100
102
  export declare class OperationNodeTransformer {
101
103
  #private;
102
104
  protected readonly nodeStack: OperationNode[];
103
- readonly transformNode: <T extends OperationNode | undefined, U extends T | undefined = T>(node: U) => T;
104
- protected transformNodeList<T extends OperationNode, U extends T = T>(list: readonly U[]): readonly T[];
105
- protected transformNodeList<T extends OperationNode, U extends T = T>(list: readonly U[] | undefined): readonly T[] | undefined;
105
+ transformNode<T extends OperationNode | undefined>(node: T): T;
106
+ protected transformNodeImpl<T extends OperationNode>(node: T): T;
107
+ protected transformNodeList<T extends ReadonlyArray<OperationNode> | undefined>(list: T): T;
106
108
  protected transformSelectQuery(node: SelectQueryNode): SelectQueryNode;
107
109
  protected transformSelection(node: SelectionNode): SelectionNode;
108
110
  protected transformColumn(node: ColumnNode): ColumnNode;
@@ -166,6 +168,8 @@ export declare class OperationNodeTransformer {
166
168
  protected transformSelectModifier(node: SelectModifierNode): SelectModifierNode;
167
169
  protected transformCreateType(node: CreateTypeNode): CreateTypeNode;
168
170
  protected transformDropType(node: DropTypeNode): DropTypeNode;
171
+ protected transformExplain(node: ExplainNode): ExplainNode;
172
+ protected transformSchemableIdentifier(node: SchemableIdentifierNode): SchemableIdentifierNode;
169
173
  protected transformDataType(node: DataTypeNode): DataTypeNode;
170
174
  protected transformSelectAll(node: SelectAllNode): SelectAllNode;
171
175
  protected transformIdentifier(node: IdentifierNode): IdentifierNode;
@@ -36,6 +36,7 @@ export class OperationNodeTransformer {
36
36
  AliasNode: this.transformAlias.bind(this),
37
37
  ColumnNode: this.transformColumn.bind(this),
38
38
  IdentifierNode: this.transformIdentifier.bind(this),
39
+ SchemableIdentifierNode: this.transformSchemableIdentifier.bind(this),
39
40
  RawNode: this.transformRaw.bind(this),
40
41
  ReferenceNode: this.transformReference.bind(this),
41
42
  SelectQueryNode: this.transformSelectQuery.bind(this),
@@ -102,21 +103,25 @@ export class OperationNodeTransformer {
102
103
  SelectModifierNode: this.transformSelectModifier.bind(this),
103
104
  CreateTypeNode: this.transformCreateType.bind(this),
104
105
  DropTypeNode: this.transformDropType.bind(this),
106
+ ExplainNode: this.transformExplain.bind(this),
105
107
  });
106
- transformNode = (node) => {
108
+ transformNode(node) {
107
109
  if (!node) {
108
- return undefined;
110
+ return node;
109
111
  }
110
112
  this.nodeStack.push(node);
111
- const out = this.#transformers[node.kind](node);
113
+ const out = this.transformNodeImpl(node);
112
114
  this.nodeStack.pop();
113
115
  return freeze(out);
114
- };
116
+ }
117
+ transformNodeImpl(node) {
118
+ return this.#transformers[node.kind](node);
119
+ }
115
120
  transformNodeList(list) {
116
121
  if (!list) {
117
122
  return list;
118
123
  }
119
- return freeze(list.map(this.transformNode));
124
+ return freeze(list.map((node) => this.transformNode(node)));
120
125
  }
121
126
  transformSelectQuery(node) {
122
127
  return requireAllProps({
@@ -135,6 +140,7 @@ export class OperationNodeTransformer {
135
140
  with: this.transformNode(node.with),
136
141
  having: this.transformNode(node.having),
137
142
  union: this.transformNodeList(node.union),
143
+ explain: this.transformNode(node.explain),
138
144
  });
139
145
  }
140
146
  transformSelection(node) {
@@ -159,7 +165,6 @@ export class OperationNodeTransformer {
159
165
  transformTable(node) {
160
166
  return requireAllProps({
161
167
  kind: 'TableNode',
162
- schema: this.transformNode(node.schema),
163
168
  table: this.transformNode(node.table),
164
169
  });
165
170
  }
@@ -243,6 +248,7 @@ export class OperationNodeTransformer {
243
248
  with: this.transformNode(node.with),
244
249
  ignore: node.ignore,
245
250
  replace: node.replace,
251
+ explain: this.transformNode(node.explain),
246
252
  });
247
253
  }
248
254
  transformValues(node) {
@@ -261,6 +267,7 @@ export class OperationNodeTransformer {
261
267
  with: this.transformNode(node.with),
262
268
  orderBy: this.transformNode(node.orderBy),
263
269
  limit: this.transformNode(node.limit),
270
+ explain: this.transformNode(node.explain),
264
271
  });
265
272
  }
266
273
  transformReturning(node) {
@@ -278,6 +285,8 @@ export class OperationNodeTransformer {
278
285
  temporary: node.temporary,
279
286
  ifNotExists: node.ifNotExists,
280
287
  onCommit: node.onCommit,
288
+ frontModifiers: this.transformNodeList(node.frontModifiers),
289
+ endModifiers: this.transformNodeList(node.endModifiers),
281
290
  });
282
291
  }
283
292
  transformColumnDefinition(node) {
@@ -344,6 +353,7 @@ export class OperationNodeTransformer {
344
353
  updates: this.transformNodeList(node.updates),
345
354
  returning: this.transformNode(node.returning),
346
355
  with: this.transformNode(node.with),
356
+ explain: this.transformNode(node.explain),
347
357
  });
348
358
  }
349
359
  transformColumnUpdate(node) {
@@ -618,6 +628,20 @@ export class OperationNodeTransformer {
618
628
  ifExists: node.ifExists,
619
629
  });
620
630
  }
631
+ transformExplain(node) {
632
+ return requireAllProps({
633
+ kind: 'ExplainNode',
634
+ format: node.format,
635
+ options: this.transformNode(node.options),
636
+ });
637
+ }
638
+ transformSchemableIdentifier(node) {
639
+ return requireAllProps({
640
+ kind: 'SchemableIdentifierNode',
641
+ schema: this.transformNode(node.schema),
642
+ identifier: this.transformNode(node.identifier),
643
+ });
644
+ }
621
645
  transformDataType(node) {
622
646
  // An Object.freezed leaf node. No need to clone.
623
647
  return node;
@@ -68,6 +68,8 @@ import { ValuesNode } from './values-node.js';
68
68
  import { SelectModifierNode } from './select-modifier-node.js';
69
69
  import { CreateTypeNode } from './create-type-node.js';
70
70
  import { DropTypeNode } from './drop-type-node.js';
71
+ import { ExplainNode } from './explain-node.js';
72
+ import { SchemableIdentifierNode } from './schemable-identifier-node.js';
71
73
  export declare abstract class OperationNodeVisitor {
72
74
  #private;
73
75
  protected readonly nodeStack: OperationNode[];
@@ -128,10 +130,11 @@ export declare abstract class OperationNodeVisitor {
128
130
  protected abstract visitForeignKeyConstraint(node: ForeignKeyConstraintNode): void;
129
131
  protected abstract visitUnion(node: UnionNode): void;
130
132
  protected abstract visitDataType(node: DataTypeNode): void;
131
- protected abstract visitSelectAll(_: SelectAllNode): void;
132
- protected abstract visitIdentifier(_: IdentifierNode): void;
133
- protected abstract visitValue(_: ValueNode): void;
134
- protected abstract visitPrimitiveValueList(_: PrimitiveValueListNode): void;
133
+ protected abstract visitSelectAll(node: SelectAllNode): void;
134
+ protected abstract visitIdentifier(node: IdentifierNode): void;
135
+ protected abstract visitSchemableIdentifier(node: SchemableIdentifierNode): void;
136
+ protected abstract visitValue(node: ValueNode): void;
137
+ protected abstract visitPrimitiveValueList(node: PrimitiveValueListNode): void;
135
138
  protected abstract visitOperator(node: OperatorNode): void;
136
139
  protected abstract visitCreateView(node: CreateViewNode): void;
137
140
  protected abstract visitDropView(node: DropViewNode): void;
@@ -142,4 +145,5 @@ export declare abstract class OperationNodeVisitor {
142
145
  protected abstract visitSelectModifier(node: SelectModifierNode): void;
143
146
  protected abstract visitCreateType(node: CreateTypeNode): void;
144
147
  protected abstract visitDropType(node: DropTypeNode): void;
148
+ protected abstract visitExplain(node: ExplainNode): void;
145
149
  }
@@ -9,6 +9,7 @@ export class OperationNodeVisitor {
9
9
  AliasNode: this.visitAlias.bind(this),
10
10
  ColumnNode: this.visitColumn.bind(this),
11
11
  IdentifierNode: this.visitIdentifier.bind(this),
12
+ SchemableIdentifierNode: this.visitSchemableIdentifier.bind(this),
12
13
  RawNode: this.visitRaw.bind(this),
13
14
  ReferenceNode: this.visitReference.bind(this),
14
15
  SelectQueryNode: this.visitSelectQuery.bind(this),
@@ -75,6 +76,7 @@ export class OperationNodeVisitor {
75
76
  SelectModifierNode: this.visitSelectModifier.bind(this),
76
77
  CreateTypeNode: this.visitCreateType.bind(this),
77
78
  DropTypeNode: this.visitDropType.bind(this),
79
+ ExplainNode: this.visitExplain.bind(this),
78
80
  });
79
81
  visitNode = (node) => {
80
82
  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' | 'CreateTypeNode' | 'DropTypeNode';
1
+ export declare type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | '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' | 'ExplainNode';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -13,5 +13,5 @@ export interface ReferenceNode extends OperationNode {
13
13
  export declare const ReferenceNode: Readonly<{
14
14
  is(node: OperationNode): node is ReferenceNode;
15
15
  create(table: TableNode, column: ColumnNode): ReferenceNode;
16
- createSelectAll(table: string): ReferenceNode;
16
+ createSelectAll(table: TableNode): ReferenceNode;
17
17
  }>;
@@ -1,5 +1,4 @@
1
1
  /// <reference types="./reference-node.d.ts" />
2
- import { TableNode } from './table-node.js';
3
2
  import { SelectAllNode } from './select-all-node.js';
4
3
  import { freeze } from '../util/object-utils.js';
5
4
  /**
@@ -19,7 +18,7 @@ export const ReferenceNode = freeze({
19
18
  createSelectAll(table) {
20
19
  return freeze({
21
20
  kind: 'ReferenceNode',
22
- table: TableNode.create(table),
21
+ table,
23
22
  column: SelectAllNode.create(),
24
23
  });
25
24
  },
@@ -0,0 +1,15 @@
1
+ import { IdentifierNode } from './identifier-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ export interface SchemableIdentifierNode extends OperationNode {
4
+ readonly kind: 'SchemableIdentifierNode';
5
+ readonly schema?: IdentifierNode;
6
+ readonly identifier: IdentifierNode;
7
+ }
8
+ /**
9
+ * @internal
10
+ */
11
+ export declare const SchemableIdentifierNode: Readonly<{
12
+ is(node: OperationNode): node is SchemableIdentifierNode;
13
+ create(identifier: string): SchemableIdentifierNode;
14
+ createWithSchema(schema: string, identifier: string): SchemableIdentifierNode;
15
+ }>;
@@ -0,0 +1,24 @@
1
+ /// <reference types="./schemable-identifier-node.d.ts" />
2
+ import { freeze } from '../util/object-utils.js';
3
+ import { IdentifierNode } from './identifier-node.js';
4
+ /**
5
+ * @internal
6
+ */
7
+ export const SchemableIdentifierNode = freeze({
8
+ is(node) {
9
+ return node.kind === 'SchemableIdentifierNode';
10
+ },
11
+ create(identifier) {
12
+ return freeze({
13
+ kind: 'SchemableIdentifierNode',
14
+ identifier: IdentifierNode.create(identifier),
15
+ });
16
+ },
17
+ createWithSchema(schema, identifier) {
18
+ return freeze({
19
+ kind: 'SchemableIdentifierNode',
20
+ schema: IdentifierNode.create(schema),
21
+ identifier: IdentifierNode.create(identifier),
22
+ });
23
+ },
24
+ });
@@ -14,6 +14,7 @@ import { WhereNode } from './where-node.js';
14
14
  import { WithNode } from './with-node.js';
15
15
  import { UnionNode } from './union-node.js';
16
16
  import { SelectModifierNode } from './select-modifier-node.js';
17
+ import { ExplainNode } from './explain-node.js';
17
18
  export interface SelectQueryNode extends OperationNode {
18
19
  readonly kind: 'SelectQueryNode';
19
20
  readonly from: FromNode;
@@ -30,6 +31,7 @@ export interface SelectQueryNode extends OperationNode {
30
31
  readonly with?: WithNode;
31
32
  readonly having?: HavingNode;
32
33
  readonly union?: ReadonlyArray<UnionNode>;
34
+ readonly explain?: ExplainNode;
33
35
  }
34
36
  /**
35
37
  * @internal
@@ -48,4 +50,5 @@ export declare const SelectQueryNode: Readonly<{
48
50
  cloneWithHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
49
51
  cloneWithOrHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
50
52
  cloneWithUnion(selectNode: SelectQueryNode, union: UnionNode): SelectQueryNode;
53
+ cloneWithExplain(selectNode: SelectQueryNode, explain: ExplainNode): SelectQueryNode;
51
54
  }>;
@@ -102,4 +102,10 @@ export const SelectQueryNode = freeze({
102
102
  : freeze([union]),
103
103
  });
104
104
  },
105
+ cloneWithExplain(selectNode, explain) {
106
+ return freeze({
107
+ ...selectNode,
108
+ explain,
109
+ });
110
+ },
105
111
  });
@@ -3,6 +3,7 @@ import { ColumnNode } from './column-node.js';
3
3
  import { OperationNode } from './operation-node.js';
4
4
  import { ReferenceNode } from './reference-node.js';
5
5
  import { SelectAllNode } from './select-all-node.js';
6
+ import { TableNode } from './table-node.js';
6
7
  declare type SelectionNodeChild = ColumnNode | ReferenceNode | AliasNode | SelectAllNode;
7
8
  export interface SelectionNode extends OperationNode {
8
9
  readonly kind: 'SelectionNode';
@@ -15,6 +16,6 @@ export declare const SelectionNode: Readonly<{
15
16
  is(node: OperationNode): node is SelectionNode;
16
17
  create(selection: SelectionNodeChild): SelectionNode;
17
18
  createSelectAll(): SelectionNode;
18
- createSelectAllFromTable(table: string): SelectionNode;
19
+ createSelectAllFromTable(table: TableNode): SelectionNode;
19
20
  }>;
20
21
  export {};
@@ -1,9 +1,8 @@
1
- import { IdentifierNode } from './identifier-node.js';
2
1
  import { OperationNode } from './operation-node.js';
2
+ import { SchemableIdentifierNode } from './schemable-identifier-node.js';
3
3
  export interface TableNode extends OperationNode {
4
4
  readonly kind: 'TableNode';
5
- readonly schema?: IdentifierNode;
6
- readonly table: IdentifierNode;
5
+ readonly table: SchemableIdentifierNode;
7
6
  }
8
7
  /**
9
8
  * @internal
@@ -1,6 +1,6 @@
1
1
  /// <reference types="./table-node.d.ts" />
2
2
  import { freeze } from '../util/object-utils.js';
3
- import { IdentifierNode } from './identifier-node.js';
3
+ import { SchemableIdentifierNode } from './schemable-identifier-node.js';
4
4
  /**
5
5
  * @internal
6
6
  */
@@ -11,14 +11,13 @@ export const TableNode = freeze({
11
11
  create(table) {
12
12
  return freeze({
13
13
  kind: 'TableNode',
14
- table: IdentifierNode.create(table),
14
+ table: SchemableIdentifierNode.create(table),
15
15
  });
16
16
  },
17
17
  createWithSchema(schema, table) {
18
18
  return freeze({
19
19
  kind: 'TableNode',
20
- schema: IdentifierNode.create(schema),
21
- table: IdentifierNode.create(table),
20
+ table: SchemableIdentifierNode.createWithSchema(schema, table),
22
21
  });
23
22
  },
24
23
  });
@@ -8,6 +8,7 @@ import { ValueListNode } from './value-list-node.js';
8
8
  import { WhereNode } from './where-node.js';
9
9
  import { WithNode } from './with-node.js';
10
10
  import { FromNode } from './from-node.js';
11
+ import { ExplainNode } from './explain-node.js';
11
12
  export declare type UpdateValuesNode = ValueListNode | PrimitiveValueListNode;
12
13
  export interface UpdateQueryNode extends OperationNode {
13
14
  readonly kind: 'UpdateQueryNode';
@@ -18,6 +19,7 @@ export interface UpdateQueryNode extends OperationNode {
18
19
  readonly updates?: ReadonlyArray<ColumnUpdateNode>;
19
20
  readonly returning?: ReturningNode;
20
21
  readonly with?: WithNode;
22
+ readonly explain?: ExplainNode;
21
23
  }
22
24
  /**
23
25
  * @internal
@@ -27,4 +29,5 @@ export declare const UpdateQueryNode: Readonly<{
27
29
  create(table: TableExpressionNode, withNode?: WithNode): UpdateQueryNode;
28
30
  cloneWithFromItems(updateQuery: UpdateQueryNode, fromItems: ReadonlyArray<TableExpressionNode>): UpdateQueryNode;
29
31
  cloneWithUpdates(updateQuery: UpdateQueryNode, updates: ReadonlyArray<ColumnUpdateNode>): UpdateQueryNode;
32
+ cloneWithExplain(updateQuery: UpdateQueryNode, explain: ExplainNode): UpdateQueryNode;
30
33
  }>;
@@ -31,4 +31,10 @@ export const UpdateQueryNode = freeze({
31
31
  : updates,
32
32
  });
33
33
  },
34
+ cloneWithExplain(updateQuery, explain) {
35
+ return freeze({
36
+ ...updateQuery,
37
+ explain,
38
+ });
39
+ },
34
40
  });
@@ -4,6 +4,7 @@ import { SelectionNode } from '../operation-node/selection-node.js';
4
4
  import { parseAliasedStringReference } from './reference-parser.js';
5
5
  import { isDynamicReferenceBuilder, } from '../dynamic/dynamic-reference-builder.js';
6
6
  import { parseAliasedComplexExpression, } from './complex-expression-parser.js';
7
+ import { parseTable } from './table-parser.js';
7
8
  export function parseSelectExpressionOrList(selection) {
8
9
  if (isReadonlyArray(selection)) {
9
10
  return selection.map((it) => parseSelectExpression(it));
@@ -36,7 +37,7 @@ export function parseSelectAll(table) {
36
37
  }
37
38
  function parseSelectAllArg(table) {
38
39
  if (isString(table)) {
39
- return SelectionNode.createSelectAllFromTable(table);
40
+ return SelectionNode.createSelectAllFromTable(parseTable(table));
40
41
  }
41
42
  throw new Error(`invalid value selectAll expression: ${JSON.stringify(table)}`);
42
43
  }
@@ -10,7 +10,7 @@ export class SnakeCaseTransformer extends OperationNodeTransformer {
10
10
  node = super.transformIdentifier(node);
11
11
  return {
12
12
  ...node,
13
- identifier: this.#snakeCase(node.identifier),
13
+ name: this.#snakeCase(node.name),
14
14
  };
15
15
  }
16
16
  }
@@ -1,33 +1,9 @@
1
- import { AlterTableNode } from '../../operation-node/alter-table-node.js';
2
- import { CreateIndexNode } from '../../operation-node/create-index-node.js';
3
- import { CreateTableNode } from '../../operation-node/create-table-node.js';
4
- import { CreateTypeNode } from '../../operation-node/create-type-node.js';
5
- import { CreateViewNode } from '../../operation-node/create-view-node.js';
6
- import { DeleteQueryNode } from '../../operation-node/delete-query-node.js';
7
- import { DropIndexNode } from '../../operation-node/drop-index-node.js';
8
- import { DropTableNode } from '../../operation-node/drop-table-node.js';
9
- import { DropTypeNode } from '../../operation-node/drop-type-node.js';
10
- import { DropViewNode } from '../../operation-node/drop-view-node.js';
11
- import { InsertQueryNode } from '../../operation-node/insert-query-node.js';
12
1
  import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
13
- import { SelectQueryNode } from '../../operation-node/select-query-node.js';
14
- import { TableNode } from '../../operation-node/table-node.js';
15
- import { UpdateQueryNode } from '../../operation-node/update-query-node.js';
2
+ import { OperationNode } from '../../operation-node/operation-node.js';
3
+ import { SchemableIdentifierNode } from '../../operation-node/schemable-identifier-node.js';
16
4
  export declare class WithSchemaTransformer extends OperationNodeTransformer {
17
5
  #private;
18
6
  constructor(schema: string);
19
- protected transformSelectQuery(node: SelectQueryNode): SelectQueryNode;
20
- protected transformInsertQuery(node: InsertQueryNode): InsertQueryNode;
21
- protected transformUpdateQuery(node: UpdateQueryNode): UpdateQueryNode;
22
- protected transformDeleteQuery(node: DeleteQueryNode): DeleteQueryNode;
23
- protected transformCreateTable(node: CreateTableNode): CreateTableNode;
24
- protected transformDropTable(node: DropTableNode): DropTableNode;
25
- protected transformCreateIndex(node: CreateIndexNode): CreateIndexNode;
26
- protected transformDropIndex(node: DropIndexNode): DropIndexNode;
27
- protected transformCreateView(node: CreateViewNode): CreateViewNode;
28
- protected transformDropView(node: DropViewNode): DropViewNode;
29
- protected transformCreateType(node: CreateTypeNode): CreateTypeNode;
30
- protected transformDropType(node: DropTypeNode): DropTypeNode;
31
- protected transformAlterTable(node: AlterTableNode): AlterTableNode;
32
- protected transformTable(node: TableNode): TableNode;
7
+ protected transformNodeImpl<T extends OperationNode>(node: T): T;
8
+ protected transformSchemableIdentifier(node: SchemableIdentifierNode): SchemableIdentifierNode;
33
9
  }
@@ -1,119 +1,113 @@
1
1
  /// <reference types="./with-schema-transformer.d.ts" />
2
2
  import { AliasNode } from '../../operation-node/alias-node.js';
3
3
  import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
4
+ import { SchemableIdentifierNode } from '../../operation-node/schemable-identifier-node.js';
4
5
  import { TableNode } from '../../operation-node/table-node.js';
6
+ import { freeze } from '../../util/object-utils.js';
7
+ // This object exist only so that we get a type error when a new RootOperationNode
8
+ // is added. If you get a type error here, make sure to add the new root node and
9
+ // handle it correctly in the transformer.
10
+ //
11
+ // DO NOT REFACTOR THIS EVEN IF IT SEEMS USELESS TO YOU!
12
+ const ROOT_OPERATION_NODES = freeze({
13
+ AlterTableNode: true,
14
+ CreateIndexNode: true,
15
+ CreateSchemaNode: true,
16
+ CreateTableNode: true,
17
+ CreateTypeNode: true,
18
+ CreateViewNode: true,
19
+ DeleteQueryNode: true,
20
+ DropIndexNode: true,
21
+ DropSchemaNode: true,
22
+ DropTableNode: true,
23
+ DropTypeNode: true,
24
+ DropViewNode: true,
25
+ InsertQueryNode: true,
26
+ RawNode: true,
27
+ SelectQueryNode: true,
28
+ UpdateQueryNode: true,
29
+ });
5
30
  export class WithSchemaTransformer extends OperationNodeTransformer {
6
31
  #schema;
7
- #tables = new Set();
32
+ #schemableIds = new Set();
8
33
  constructor(schema) {
9
34
  super();
10
35
  this.#schema = schema;
11
36
  }
12
- transformSelectQuery(node) {
13
- return this.#transformRoot(node, (node) => super.transformSelectQuery(node));
14
- }
15
- transformInsertQuery(node) {
16
- return this.#transformRoot(node, (node) => super.transformInsertQuery(node));
17
- }
18
- transformUpdateQuery(node) {
19
- return this.#transformRoot(node, (node) => super.transformUpdateQuery(node));
20
- }
21
- transformDeleteQuery(node) {
22
- return this.#transformRoot(node, (node) => super.transformDeleteQuery(node));
23
- }
24
- transformCreateTable(node) {
25
- return this.#transformRoot(node, (node) => super.transformCreateTable(node));
26
- }
27
- transformDropTable(node) {
28
- return this.#transformRoot(node, (node) => super.transformDropTable(node));
29
- }
30
- transformCreateIndex(node) {
31
- return this.#transformRoot(node, (node) => super.transformCreateIndex(node));
32
- }
33
- transformDropIndex(node) {
34
- return this.#transformRoot(node, (node) => super.transformDropIndex(node));
35
- }
36
- transformCreateView(node) {
37
- return this.#transformRoot(node, (node) => super.transformCreateView(node));
38
- }
39
- transformDropView(node) {
40
- return this.#transformRoot(node, (node) => super.transformDropView(node));
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
- }
48
- transformAlterTable(node) {
49
- return this.#transformRoot(node, (node) => super.transformAlterTable(node));
37
+ transformNodeImpl(node) {
38
+ if (!this.#isRootOperationNode(node)) {
39
+ return super.transformNodeImpl(node);
40
+ }
41
+ const tables = this.#collectSchemableIds(node);
42
+ for (const table of tables) {
43
+ this.#schemableIds.add(table);
44
+ }
45
+ const transformed = super.transformNodeImpl(node);
46
+ for (const table of tables) {
47
+ this.#schemableIds.delete(table);
48
+ }
49
+ return transformed;
50
50
  }
51
- transformTable(node) {
52
- const transformed = super.transformTable(node);
53
- if (transformed.schema || !this.#tables.has(node.table.identifier)) {
51
+ transformSchemableIdentifier(node) {
52
+ const transformed = super.transformSchemableIdentifier(node);
53
+ if (transformed.schema || !this.#schemableIds.has(node.identifier.name)) {
54
54
  return transformed;
55
55
  }
56
56
  return {
57
57
  ...transformed,
58
- schema: {
58
+ schema: freeze({
59
59
  kind: 'IdentifierNode',
60
- identifier: this.#schema,
61
- },
60
+ name: this.#schema,
61
+ }),
62
62
  };
63
63
  }
64
- #transformRoot(node, transform) {
65
- const tables = this.#collectTables(node);
66
- for (const table of tables) {
67
- this.#tables.add(table);
68
- }
69
- const transformed = transform(node);
70
- for (const table of tables) {
71
- this.#tables.delete(table);
72
- }
73
- return transformed;
64
+ #isRootOperationNode(node) {
65
+ return node.kind in ROOT_OPERATION_NODES;
74
66
  }
75
- #collectTables(node) {
76
- const tables = new Set();
67
+ #collectSchemableIds(node) {
68
+ const schemableIds = new Set();
69
+ if ('name' in node && node.name && SchemableIdentifierNode.is(node.name)) {
70
+ this.#collectSchemableId(node.name, schemableIds);
71
+ }
77
72
  if ('from' in node && node.from) {
78
- this.#collectTablesFromTableExpressionNodes(node.from.froms, tables);
73
+ for (const from of node.from.froms) {
74
+ this.#collectSchemableIdsFromTableExpr(from, schemableIds);
75
+ }
79
76
  }
80
77
  if ('into' in node && node.into) {
81
- this.#collectTablesFromTableExpressionNode(node.into, tables);
78
+ this.#collectSchemableIdsFromTableExpr(node.into, schemableIds);
82
79
  }
83
80
  if ('table' in node && node.table) {
84
- this.#collectTablesFromTableExpressionNode(node.table, tables);
81
+ this.#collectSchemableIdsFromTableExpr(node.table, schemableIds);
85
82
  }
86
83
  if ('joins' in node && node.joins) {
87
- this.#collectTablesFromJoins(node.joins, tables);
84
+ for (const join of node.joins) {
85
+ this.#collectSchemableIdsFromTableExpr(join.table, schemableIds);
86
+ }
88
87
  }
89
88
  if ('with' in node && node.with) {
90
- this.#removeCommonTableExpressionTables(node.with, tables);
91
- }
92
- return tables;
93
- }
94
- #collectTablesFromTableExpressionNodes(nodes, tables) {
95
- for (const node of nodes) {
96
- this.#collectTablesFromTableExpressionNode(node, tables);
89
+ this.#removeCommonTableExpressionTables(node.with, schemableIds);
97
90
  }
91
+ return schemableIds;
98
92
  }
99
- #collectTablesFromJoins(nodes, tables) {
100
- for (const node of nodes) {
101
- this.#collectTablesFromTableExpressionNode(node.table, tables);
102
- }
103
- }
104
- #collectTablesFromTableExpressionNode(node, tables) {
93
+ #collectSchemableIdsFromTableExpr(node, schemableIds) {
105
94
  const table = TableNode.is(node)
106
95
  ? node
107
96
  : AliasNode.is(node) && TableNode.is(node.node)
108
97
  ? node.node
109
98
  : null;
110
- if (table && !this.#tables.has(table.table.identifier)) {
111
- tables.add(table.table.identifier);
99
+ if (table) {
100
+ this.#collectSchemableId(table.table, schemableIds);
101
+ }
102
+ }
103
+ #collectSchemableId(node, schemableIds) {
104
+ if (!this.#schemableIds.has(node.identifier.name)) {
105
+ schemableIds.add(node.identifier.name);
112
106
  }
113
107
  }
114
- #removeCommonTableExpressionTables(node, tables) {
108
+ #removeCommonTableExpressionTables(node, schemableIds) {
115
109
  for (const expr of node.expressions) {
116
- tables.delete(expr.name.table.table.identifier);
110
+ schemableIds.delete(expr.name.table.table.identifier.name);
117
111
  }
118
112
  }
119
113
  }