kysely 0.19.12 → 0.20.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 (90) 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-introspector.js +7 -1
  6. package/dist/cjs/dialect/postgres/postgres-query-compiler.d.ts +1 -3
  7. package/dist/cjs/dialect/postgres/postgres-query-compiler.js +3 -8
  8. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +2 -0
  9. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +3 -0
  10. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +10 -0
  11. package/dist/cjs/index.d.ts +2 -0
  12. package/dist/cjs/index.js +2 -0
  13. package/dist/cjs/operation-node/create-table-node.d.ts +6 -1
  14. package/dist/cjs/operation-node/create-table-node.js +16 -0
  15. package/dist/cjs/operation-node/delete-query-node.d.ts +3 -0
  16. package/dist/cjs/operation-node/delete-query-node.js +6 -0
  17. package/dist/cjs/operation-node/explain-node.d.ts +16 -0
  18. package/dist/cjs/operation-node/explain-node.js +19 -0
  19. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -0
  20. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  21. package/dist/cjs/operation-node/operation-node-transformer.js +14 -0
  22. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  23. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  24. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  25. package/dist/cjs/operation-node/select-query-node.d.ts +3 -0
  26. package/dist/cjs/operation-node/select-query-node.js +6 -0
  27. package/dist/cjs/operation-node/update-query-node.d.ts +3 -0
  28. package/dist/cjs/operation-node/update-query-node.js +6 -0
  29. package/dist/cjs/query-builder/delete-query-builder.d.ts +19 -1
  30. package/dist/cjs/query-builder/delete-query-builder.js +24 -0
  31. package/dist/cjs/query-builder/function-builder.d.ts +3 -3
  32. package/dist/cjs/query-builder/insert-query-builder.d.ts +20 -2
  33. package/dist/cjs/query-builder/insert-query-builder.js +26 -0
  34. package/dist/cjs/query-builder/select-query-builder.d.ts +38 -1
  35. package/dist/cjs/query-builder/select-query-builder.js +45 -2
  36. package/dist/cjs/query-builder/update-query-builder.d.ts +20 -1
  37. package/dist/cjs/query-builder/update-query-builder.js +25 -0
  38. package/dist/cjs/query-compiler/default-query-compiler.d.ts +6 -0
  39. package/dist/cjs/query-compiler/default-query-compiler.js +58 -3
  40. package/dist/cjs/raw-builder/sql.d.ts +96 -96
  41. package/dist/cjs/raw-builder/sql.js +0 -96
  42. package/dist/cjs/schema/create-table-builder.d.ts +54 -0
  43. package/dist/cjs/schema/create-table-builder.js +64 -0
  44. package/dist/cjs/util/explainable.d.ts +5 -0
  45. package/dist/cjs/util/explainable.js +2 -0
  46. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
  47. package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +5 -0
  48. package/dist/esm/dialect/mysql/mysql-query-compiler.js +16 -0
  49. package/dist/esm/dialect/postgres/postgres-introspector.js +7 -1
  50. package/dist/esm/dialect/postgres/postgres-query-compiler.d.ts +1 -3
  51. package/dist/esm/dialect/postgres/postgres-query-compiler.js +3 -8
  52. package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -0
  53. package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +3 -0
  54. package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +10 -0
  55. package/dist/esm/index.d.ts +2 -0
  56. package/dist/esm/index.js +2 -0
  57. package/dist/esm/operation-node/create-table-node.d.ts +6 -1
  58. package/dist/esm/operation-node/create-table-node.js +16 -0
  59. package/dist/esm/operation-node/delete-query-node.d.ts +3 -0
  60. package/dist/esm/operation-node/delete-query-node.js +6 -0
  61. package/dist/esm/operation-node/explain-node.d.ts +16 -0
  62. package/dist/esm/operation-node/explain-node.js +17 -0
  63. package/dist/esm/operation-node/insert-query-node.d.ts +2 -0
  64. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  65. package/dist/esm/operation-node/operation-node-transformer.js +14 -0
  66. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  67. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  68. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  69. package/dist/esm/operation-node/select-query-node.d.ts +3 -0
  70. package/dist/esm/operation-node/select-query-node.js +6 -0
  71. package/dist/esm/operation-node/update-query-node.d.ts +3 -0
  72. package/dist/esm/operation-node/update-query-node.js +6 -0
  73. package/dist/esm/query-builder/delete-query-builder.d.ts +19 -1
  74. package/dist/esm/query-builder/delete-query-builder.js +24 -0
  75. package/dist/esm/query-builder/function-builder.d.ts +3 -3
  76. package/dist/esm/query-builder/insert-query-builder.d.ts +20 -2
  77. package/dist/esm/query-builder/insert-query-builder.js +26 -0
  78. package/dist/esm/query-builder/select-query-builder.d.ts +38 -1
  79. package/dist/esm/query-builder/select-query-builder.js +45 -2
  80. package/dist/esm/query-builder/update-query-builder.d.ts +20 -1
  81. package/dist/esm/query-builder/update-query-builder.js +25 -0
  82. package/dist/esm/query-compiler/default-query-compiler.d.ts +6 -0
  83. package/dist/esm/query-compiler/default-query-compiler.js +58 -3
  84. package/dist/esm/raw-builder/sql.d.ts +96 -96
  85. package/dist/esm/raw-builder/sql.js +0 -96
  86. package/dist/esm/schema/create-table-builder.d.ts +54 -0
  87. package/dist/esm/schema/create-table-builder.js +64 -0
  88. package/dist/esm/util/explainable.d.ts +5 -0
  89. package/dist/esm/util/explainable.js +2 -0
  90. package/package.json +3 -1
package/README.md CHANGED
@@ -21,7 +21,7 @@ column names, aliases and types from selected subqueries, joined subqueries, `wi
21
21
  much anything you can think of.
22
22
 
23
23
  Of course there are cases where things cannot be typed at compile time, and Kysely offers escape
24
- hatches for these situations. See the [sql template tag](https://koskimas.github.io/kysely/modules.html#sql)
24
+ hatches for these situations. See the [sql template tag](https://koskimas.github.io/kysely/functions/sql.html)
25
25
  and the [DynamicModule](https://koskimas.github.io/kysely/classes/DynamicModule.html#ref) for more info.
26
26
 
27
27
  If you start using Kysely and can't find something you'd want to use, please open an issue or join our
@@ -30,6 +30,8 @@ class MysqlIntrospector {
30
30
  'extra',
31
31
  ])
32
32
  .where('table_schema', '=', (0, sql_js_1.sql) `database()`)
33
+ .orderBy('table_name')
34
+ .orderBy('column_name')
33
35
  .castTo();
34
36
  if (!options.withInternalKyselyTables) {
35
37
  query = query
@@ -1,6 +1,11 @@
1
1
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
2
2
  export declare class MysqlQueryCompiler extends DefaultQueryCompiler {
3
3
  protected getCurrentParameterPlaceholder(): string;
4
+ protected getLeftExplainOptionsWrapper(): string;
5
+ protected getExplainOptionAssignment(): string;
6
+ protected getExplainOptionsDelimiter(): string;
7
+ protected getRightExplainOptionsWrapper(): string;
4
8
  protected getLeftIdentifierWrapper(): string;
5
9
  protected getRightIdentifierWrapper(): string;
10
+ protected sanitizeIdentifier(identifier: string): string;
6
11
  }
@@ -2,15 +2,31 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MysqlQueryCompiler = void 0;
4
4
  const default_query_compiler_js_1 = require("../../query-compiler/default-query-compiler.js");
5
+ const ID_WRAP_REGEX = /`/g;
5
6
  class MysqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompiler {
6
7
  getCurrentParameterPlaceholder() {
7
8
  return '?';
8
9
  }
10
+ getLeftExplainOptionsWrapper() {
11
+ return '';
12
+ }
13
+ getExplainOptionAssignment() {
14
+ return '=';
15
+ }
16
+ getExplainOptionsDelimiter() {
17
+ return ' ';
18
+ }
19
+ getRightExplainOptionsWrapper() {
20
+ return '';
21
+ }
9
22
  getLeftIdentifierWrapper() {
10
23
  return '`';
11
24
  }
12
25
  getRightIdentifierWrapper() {
13
26
  return '`';
14
27
  }
28
+ sanitizeIdentifier(identifier) {
29
+ return identifier.replace(ID_WRAP_REGEX, '``');
30
+ }
15
31
  }
16
32
  exports.MysqlQueryCompiler = MysqlQueryCompiler;
@@ -21,7 +21,10 @@ class PostgresIntrospector {
21
21
  let query = this.#db
22
22
  .selectFrom('pg_catalog.pg_attribute as a')
23
23
  .innerJoin('pg_catalog.pg_class as c', 'a.attrelid', 'c.oid')
24
- .innerJoin('pg_catalog.pg_tables as t', 't.tablename', 'c.relname')
24
+ .innerJoin('pg_catalog.pg_namespace as ns', 'c.relnamespace', 'ns.oid')
25
+ .innerJoin('pg_catalog.pg_tables as t', (join) => join
26
+ .onRef('t.tablename', '=', 'c.relname')
27
+ .onRef('t.schemaname', '=', 'ns.nspname'))
25
28
  .innerJoin('pg_catalog.pg_type as typ', 'a.atttypid', 'typ.oid')
26
29
  .select([
27
30
  'a.attname as column',
@@ -43,6 +46,9 @@ class PostgresIntrospector {
43
46
  .where('t.schemaname', '!=', 'information_schema')
44
47
  .where('a.attnum', '>=', 0) // No system columns
45
48
  .where('a.attisdropped', '!=', true)
49
+ .orderBy('t.schemaname')
50
+ .orderBy('t.tablename')
51
+ .orderBy('a.attname')
46
52
  .castTo();
47
53
  if (!options.withInternalKyselyTables) {
48
54
  query = query
@@ -1,6 +1,4 @@
1
1
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
2
2
  export declare class PostgresQueryCompiler extends DefaultQueryCompiler {
3
- protected getCurrentParameterPlaceholder(): string;
4
- protected getLeftIdentifierWrapper(): string;
5
- protected getRightIdentifierWrapper(): string;
3
+ protected sanitizeIdentifier(identifier: string): string;
6
4
  }
@@ -2,15 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PostgresQueryCompiler = void 0;
4
4
  const default_query_compiler_js_1 = require("../../query-compiler/default-query-compiler.js");
5
+ const ID_WRAP_REGEX = /"/g;
5
6
  class PostgresQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompiler {
6
- getCurrentParameterPlaceholder() {
7
- return '$' + this.numParameters;
8
- }
9
- getLeftIdentifierWrapper() {
10
- return '"';
11
- }
12
- getRightIdentifierWrapper() {
13
- return '"';
7
+ sanitizeIdentifier(identifier) {
8
+ return identifier.replace(ID_WRAP_REGEX, '""');
14
9
  }
15
10
  }
16
11
  exports.PostgresQueryCompiler = PostgresQueryCompiler;
@@ -18,6 +18,7 @@ class SqliteIntrospector {
18
18
  .where('type', '=', 'table')
19
19
  .where('name', 'not like', 'sqlite_%')
20
20
  .select('name')
21
+ .orderBy('name')
21
22
  .castTo();
22
23
  if (!options.withInternalKyselyTables) {
23
24
  query = query
@@ -50,6 +51,7 @@ class SqliteIntrospector {
50
51
  const columns = await db
51
52
  .selectFrom((0, sql_js_1.sql) `pragma_table_info(${table})`.as('table_info'))
52
53
  .select(['name', 'type', 'notnull', 'dflt_value'])
54
+ .orderBy('name')
53
55
  .execute();
54
56
  return {
55
57
  name: table,
@@ -1,7 +1,10 @@
1
1
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
2
2
  export declare class SqliteQueryCompiler extends DefaultQueryCompiler {
3
3
  protected getCurrentParameterPlaceholder(): string;
4
+ protected getLeftExplainOptionsWrapper(): string;
5
+ protected getRightExplainOptionsWrapper(): string;
4
6
  protected getLeftIdentifierWrapper(): string;
5
7
  protected getRightIdentifierWrapper(): string;
6
8
  protected getAutoIncrement(): string;
9
+ protected sanitizeIdentifier(identifier: string): string;
7
10
  }
@@ -2,10 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SqliteQueryCompiler = void 0;
4
4
  const default_query_compiler_js_1 = require("../../query-compiler/default-query-compiler.js");
5
+ const ID_WRAP_REGEX = /"/g;
5
6
  class SqliteQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompiler {
6
7
  getCurrentParameterPlaceholder() {
7
8
  return '?';
8
9
  }
10
+ getLeftExplainOptionsWrapper() {
11
+ return '';
12
+ }
13
+ getRightExplainOptionsWrapper() {
14
+ return '';
15
+ }
9
16
  getLeftIdentifierWrapper() {
10
17
  return '"';
11
18
  }
@@ -15,5 +22,8 @@ class SqliteQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompil
15
22
  getAutoIncrement() {
16
23
  return 'autoincrement';
17
24
  }
25
+ sanitizeIdentifier(identifier) {
26
+ return identifier.replace(ID_WRAP_REGEX, '""');
27
+ }
18
28
  }
19
29
  exports.SqliteQueryCompiler = SqliteQueryCompiler;
@@ -149,8 +149,10 @@ export * from './operation-node/value-node.js';
149
149
  export * from './operation-node/values-node.js';
150
150
  export * from './operation-node/where-node.js';
151
151
  export * from './operation-node/with-node.js';
152
+ export * from './operation-node/explain-node.js';
152
153
  export * from './util/column-type.js';
153
154
  export * from './util/compilable.js';
155
+ export * from './util/explainable.js';
154
156
  export * from './util/log.js';
155
157
  export { AnyColumn, UnknownRow, AnySelectQueryBuilder, } from './util/type-utils.js';
156
158
  export { SelectExpression, SelectExpressionOrList, Selection, } from './parser/select-parser.js';
package/dist/cjs/index.js CHANGED
@@ -165,6 +165,8 @@ __exportStar(require("./operation-node/value-node.js"), exports);
165
165
  __exportStar(require("./operation-node/values-node.js"), exports);
166
166
  __exportStar(require("./operation-node/where-node.js"), exports);
167
167
  __exportStar(require("./operation-node/with-node.js"), exports);
168
+ __exportStar(require("./operation-node/explain-node.js"), exports);
168
169
  __exportStar(require("./util/column-type.js"), exports);
169
170
  __exportStar(require("./util/compilable.js"), exports);
171
+ __exportStar(require("./util/explainable.js"), exports);
170
172
  __exportStar(require("./util/log.js"), exports);
@@ -3,9 +3,10 @@ import { TableNode } from './table-node.js';
3
3
  import { ConstraintNode } from './constraint-node.js';
4
4
  import { ColumnDefinitionNode } from './column-definition-node.js';
5
5
  import { ArrayItemType } from '../util/type-utils.js';
6
+ import { RawNode } from './raw-node.js';
6
7
  export declare const ON_COMMIT_ACTIONS: string[];
7
8
  export declare type OnCommitAction = ArrayItemType<typeof ON_COMMIT_ACTIONS>;
8
- export declare type CreateTableNodeParams = Omit<CreateTableNode, 'kind' | 'table' | 'columns' | 'constraints'>;
9
+ export declare type CreateTableNodeParams = Omit<CreateTableNode, 'kind' | 'table' | 'columns' | 'constraints' | 'frontModifiers' | 'endModifiers'>;
9
10
  export interface CreateTableNode extends OperationNode {
10
11
  readonly kind: 'CreateTableNode';
11
12
  readonly table: TableNode;
@@ -14,6 +15,8 @@ export interface CreateTableNode extends OperationNode {
14
15
  readonly temporary?: boolean;
15
16
  readonly ifNotExists?: boolean;
16
17
  readonly onCommit?: OnCommitAction;
18
+ readonly frontModifiers?: ReadonlyArray<RawNode>;
19
+ readonly endModifiers?: ReadonlyArray<RawNode>;
17
20
  }
18
21
  /**
19
22
  * @internal
@@ -23,5 +26,7 @@ export declare const CreateTableNode: Readonly<{
23
26
  create(table: TableNode): CreateTableNode;
24
27
  cloneWithColumn(createTable: CreateTableNode, column: ColumnDefinitionNode): CreateTableNode;
25
28
  cloneWithConstraint(createTable: CreateTableNode, constraint: ConstraintNode): CreateTableNode;
29
+ cloneWithFrontModifier(createTable: CreateTableNode, modifier: RawNode): CreateTableNode;
30
+ cloneWithEndModifier(createTable: CreateTableNode, modifier: RawNode): CreateTableNode;
26
31
  cloneWith(createTable: CreateTableNode, params: CreateTableNodeParams): CreateTableNode;
27
32
  }>;
@@ -31,6 +31,22 @@ exports.CreateTableNode = (0, object_utils_js_1.freeze)({
31
31
  : (0, object_utils_js_1.freeze)([constraint]),
32
32
  });
33
33
  },
34
+ cloneWithFrontModifier(createTable, modifier) {
35
+ return (0, object_utils_js_1.freeze)({
36
+ ...createTable,
37
+ frontModifiers: createTable.frontModifiers
38
+ ? (0, object_utils_js_1.freeze)([...createTable.frontModifiers, modifier])
39
+ : (0, object_utils_js_1.freeze)([modifier]),
40
+ });
41
+ },
42
+ cloneWithEndModifier(createTable, modifier) {
43
+ return (0, object_utils_js_1.freeze)({
44
+ ...createTable,
45
+ endModifiers: createTable.endModifiers
46
+ ? (0, object_utils_js_1.freeze)([...createTable.endModifiers, modifier])
47
+ : (0, object_utils_js_1.freeze)([modifier]),
48
+ });
49
+ },
34
50
  cloneWith(createTable, params) {
35
51
  return (0, object_utils_js_1.freeze)({
36
52
  ...createTable,
@@ -8,6 +8,7 @@ import { WithNode } from './with-node.js';
8
8
  import { LimitNode } from './limit-node.js';
9
9
  import { OrderByNode } from './order-by-node.js';
10
10
  import { OrderByItemNode } from './order-by-item-node.js';
11
+ import { ExplainNode } from './explain-node.js';
11
12
  export interface DeleteQueryNode extends OperationNode {
12
13
  readonly kind: 'DeleteQueryNode';
13
14
  readonly from: FromNode;
@@ -17,6 +18,7 @@ export interface DeleteQueryNode extends OperationNode {
17
18
  readonly with?: WithNode;
18
19
  readonly orderBy?: OrderByNode;
19
20
  readonly limit?: LimitNode;
21
+ readonly explain?: ExplainNode;
20
22
  }
21
23
  /**
22
24
  * @internal
@@ -26,4 +28,5 @@ export declare const DeleteQueryNode: Readonly<{
26
28
  create(fromItem: TableExpressionNode, withNode?: WithNode): DeleteQueryNode;
27
29
  cloneWithOrderByItem(deleteNode: DeleteQueryNode, item: OrderByItemNode): DeleteQueryNode;
28
30
  cloneWithLimit(deleteNode: DeleteQueryNode, limit: LimitNode): DeleteQueryNode;
31
+ cloneWithExplain(deleteNode: DeleteQueryNode, explain: ExplainNode): DeleteQueryNode;
29
32
  }>;
@@ -32,4 +32,10 @@ exports.DeleteQueryNode = (0, object_utils_js_1.freeze)({
32
32
  limit,
33
33
  });
34
34
  },
35
+ cloneWithExplain(deleteNode, explain) {
36
+ return (0, object_utils_js_1.freeze)({
37
+ ...deleteNode,
38
+ explain,
39
+ });
40
+ },
35
41
  });
@@ -0,0 +1,16 @@
1
+ import { ExplainFormat } from '../util/explainable.js';
2
+ import { AnyRawBuilder } from '../util/type-utils.js';
3
+ import { OperationNode } from './operation-node.js';
4
+ import { RawNode } from './raw-node.js';
5
+ export interface ExplainNode extends OperationNode {
6
+ readonly kind: 'ExplainNode';
7
+ readonly format?: ExplainFormat;
8
+ readonly options?: RawNode;
9
+ }
10
+ /**
11
+ * @internal
12
+ */
13
+ export declare const ExplainNode: Readonly<{
14
+ is(node: OperationNode): node is ExplainNode;
15
+ create(format?: ExplainFormat, options?: AnyRawBuilder): ExplainNode;
16
+ }>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExplainNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ /**
6
+ * @internal
7
+ */
8
+ exports.ExplainNode = (0, object_utils_js_1.freeze)({
9
+ is(node) {
10
+ return node.kind === 'ExplainNode';
11
+ },
12
+ create(format, options) {
13
+ return (0, object_utils_js_1.freeze)({
14
+ kind: 'ExplainNode',
15
+ format,
16
+ options: options?.toOperationNode(),
17
+ });
18
+ },
19
+ });
@@ -1,4 +1,5 @@
1
1
  import { ColumnNode } from './column-node.js';
2
+ import { ExplainNode } from './explain-node.js';
2
3
  import { OnConflictNode } from './on-conflict-node.js';
3
4
  import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
4
5
  import { OperationNode } from './operation-node.js';
@@ -20,6 +21,7 @@ export interface InsertQueryNode extends OperationNode {
20
21
  readonly with?: WithNode;
21
22
  readonly ignore?: boolean;
22
23
  readonly replace?: boolean;
24
+ readonly explain?: ExplainNode;
23
25
  }
24
26
  /**
25
27
  * @internal
@@ -68,6 +68,7 @@ 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';
71
72
  /**
72
73
  * Transforms an operation node tree into another one.
73
74
  *
@@ -172,4 +173,5 @@ export declare class OperationNodeTransformer {
172
173
  protected transformValue(node: ValueNode): ValueNode;
173
174
  protected transformPrimitiveValueList(node: PrimitiveValueListNode): PrimitiveValueListNode;
174
175
  protected transformOperator(node: OperatorNode): OperatorNode;
176
+ protected transformExplain(node: ExplainNode): ExplainNode;
175
177
  }
@@ -104,6 +104,7 @@ class OperationNodeTransformer {
104
104
  SelectModifierNode: this.transformSelectModifier.bind(this),
105
105
  CreateTypeNode: this.transformCreateType.bind(this),
106
106
  DropTypeNode: this.transformDropType.bind(this),
107
+ ExplainNode: this.transformExplain.bind(this),
107
108
  });
108
109
  transformNode = (node) => {
109
110
  if (!node) {
@@ -137,6 +138,7 @@ class OperationNodeTransformer {
137
138
  with: this.transformNode(node.with),
138
139
  having: this.transformNode(node.having),
139
140
  union: this.transformNodeList(node.union),
141
+ explain: this.transformNode(node.explain),
140
142
  });
141
143
  }
142
144
  transformSelection(node) {
@@ -245,6 +247,7 @@ class OperationNodeTransformer {
245
247
  with: this.transformNode(node.with),
246
248
  ignore: node.ignore,
247
249
  replace: node.replace,
250
+ explain: this.transformNode(node.explain),
248
251
  });
249
252
  }
250
253
  transformValues(node) {
@@ -263,6 +266,7 @@ class OperationNodeTransformer {
263
266
  with: this.transformNode(node.with),
264
267
  orderBy: this.transformNode(node.orderBy),
265
268
  limit: this.transformNode(node.limit),
269
+ explain: this.transformNode(node.explain),
266
270
  });
267
271
  }
268
272
  transformReturning(node) {
@@ -280,6 +284,8 @@ class OperationNodeTransformer {
280
284
  temporary: node.temporary,
281
285
  ifNotExists: node.ifNotExists,
282
286
  onCommit: node.onCommit,
287
+ frontModifiers: this.transformNodeList(node.frontModifiers),
288
+ endModifiers: this.transformNodeList(node.endModifiers),
283
289
  });
284
290
  }
285
291
  transformColumnDefinition(node) {
@@ -346,6 +352,7 @@ class OperationNodeTransformer {
346
352
  updates: this.transformNodeList(node.updates),
347
353
  returning: this.transformNode(node.returning),
348
354
  with: this.transformNode(node.with),
355
+ explain: this.transformNode(node.explain),
349
356
  });
350
357
  }
351
358
  transformColumnUpdate(node) {
@@ -644,5 +651,12 @@ class OperationNodeTransformer {
644
651
  // An Object.freezed leaf node. No need to clone.
645
652
  return node;
646
653
  }
654
+ transformExplain(node) {
655
+ return (0, require_all_props_js_1.requireAllProps)({
656
+ kind: 'ExplainNode',
657
+ format: node.format,
658
+ options: this.transformNode(node.options),
659
+ });
660
+ }
647
661
  }
648
662
  exports.OperationNodeTransformer = OperationNodeTransformer;
@@ -68,6 +68,7 @@ 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';
71
72
  export declare abstract class OperationNodeVisitor {
72
73
  #private;
73
74
  protected readonly nodeStack: OperationNode[];
@@ -142,4 +143,5 @@ export declare abstract class OperationNodeVisitor {
142
143
  protected abstract visitSelectModifier(node: SelectModifierNode): void;
143
144
  protected abstract visitCreateType(node: CreateTypeNode): void;
144
145
  protected abstract visitDropType(node: DropTypeNode): void;
146
+ protected abstract visitExplain(node: ExplainNode): void;
145
147
  }
@@ -77,6 +77,7 @@ class OperationNodeVisitor {
77
77
  SelectModifierNode: this.visitSelectModifier.bind(this),
78
78
  CreateTypeNode: this.visitCreateType.bind(this),
79
79
  DropTypeNode: this.visitDropType.bind(this),
80
+ ExplainNode: this.visitExplain.bind(this),
80
81
  });
81
82
  visitNode = (node) => {
82
83
  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' | '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
  }
@@ -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
  }>;
@@ -104,4 +104,10 @@ exports.SelectQueryNode = (0, object_utils_js_1.freeze)({
104
104
  : (0, object_utils_js_1.freeze)([union]),
105
105
  });
106
106
  },
107
+ cloneWithExplain(selectNode, explain) {
108
+ return (0, object_utils_js_1.freeze)({
109
+ ...selectNode,
110
+ explain,
111
+ });
112
+ },
107
113
  });
@@ -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
  }>;
@@ -33,4 +33,10 @@ exports.UpdateQueryNode = (0, object_utils_js_1.freeze)({
33
33
  : updates,
34
34
  });
35
35
  },
36
+ cloneWithExplain(updateQuery, explain) {
37
+ return (0, object_utils_js_1.freeze)({
38
+ ...updateQuery,
39
+ explain,
40
+ });
41
+ },
36
42
  });
@@ -20,7 +20,8 @@ import { Selectable } from '../util/column-type.js';
20
20
  import { OrderByDirectionExpression, OrderByExpression } from '../parser/order-by-parser.js';
21
21
  import { AliasedQueryBuilder } from './select-query-builder.js';
22
22
  import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
23
- export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable {
23
+ import { Explainable, ExplainFormat } from '../util/explainable.js';
24
+ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable, Explainable {
24
25
  #private;
25
26
  constructor(props: DeleteQueryBuilderProps);
26
27
  /**
@@ -744,6 +745,23 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
744
745
  * error.
745
746
  */
746
747
  executeTakeFirstOrThrow(errorConstructor?: NoResultErrorConstructor): Promise<O>;
748
+ /**
749
+ * Executes query with `explain` statement before `delete` keyword.
750
+ *
751
+ * ```ts
752
+ * const explained = await db
753
+ * .deleteFrom('person')
754
+ * .where('id', '=', 123)
755
+ * .explain('json')
756
+ * ```
757
+ *
758
+ * The generated SQL (MySQL):
759
+ *
760
+ * ```sql
761
+ * explain format=json delete from `person` where `id` = ?
762
+ * ```
763
+ */
764
+ explain<ER extends Record<string, any> = Record<string, any>>(format?: ExplainFormat, options?: AnyRawBuilder): Promise<ER[]>;
747
765
  }
748
766
  export interface DeleteQueryBuilderProps {
749
767
  readonly queryId: QueryId;
@@ -12,6 +12,7 @@ const delete_result_js_1 = require("./delete-result.js");
12
12
  const delete_query_node_js_1 = require("../operation-node/delete-query-node.js");
13
13
  const limit_node_js_1 = require("../operation-node/limit-node.js");
14
14
  const order_by_parser_js_1 = require("../parser/order-by-parser.js");
15
+ const explain_node_js_1 = require("../operation-node/explain-node.js");
15
16
  class DeleteQueryBuilder {
16
17
  #props;
17
18
  constructor(props) {
@@ -295,6 +296,29 @@ class DeleteQueryBuilder {
295
296
  }
296
297
  return result;
297
298
  }
299
+ /**
300
+ * Executes query with `explain` statement before `delete` keyword.
301
+ *
302
+ * ```ts
303
+ * const explained = await db
304
+ * .deleteFrom('person')
305
+ * .where('id', '=', 123)
306
+ * .explain('json')
307
+ * ```
308
+ *
309
+ * The generated SQL (MySQL):
310
+ *
311
+ * ```sql
312
+ * explain format=json delete from `person` where `id` = ?
313
+ * ```
314
+ */
315
+ async explain(format, options) {
316
+ const builder = new DeleteQueryBuilder({
317
+ ...this.#props,
318
+ queryNode: delete_query_node_js_1.DeleteQueryNode.cloneWithExplain(this.#props.queryNode, explain_node_js_1.ExplainNode.create(format, options)),
319
+ });
320
+ return await builder.execute();
321
+ }
298
322
  }
299
323
  exports.DeleteQueryBuilder = DeleteQueryBuilder;
300
324
  (0, prevent_await_js_1.preventAwait)(DeleteQueryBuilder, "don't await DeleteQueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
@@ -85,7 +85,7 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
85
85
  * .execute()
86
86
  * ```
87
87
  */
88
- avg<O extends number | string, C extends StringReference<DB, TB> = any>(column: C): RawBuilder<O>;
88
+ avg<O extends number | string, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): RawBuilder<O>;
89
89
  /**
90
90
  * Calls the `sum` function for the column given as the argument.
91
91
  *
@@ -107,7 +107,7 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
107
107
  * .execute()
108
108
  * ```
109
109
  */
110
- sum<O extends number | string | bigint, C extends StringReference<DB, TB> = any>(column: C): RawBuilder<O>;
110
+ sum<O extends number | string | bigint, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): RawBuilder<O>;
111
111
  /**
112
112
  * Calls the `count` function for the column given as the argument.
113
113
  *
@@ -129,5 +129,5 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
129
129
  * .execute()
130
130
  * ```
131
131
  */
132
- count<O extends number | string | bigint, C extends StringReference<DB, TB> = any>(column: C): RawBuilder<O>;
132
+ count<O extends number | string | bigint, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): RawBuilder<O>;
133
133
  }