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.
- package/README.md +1 -1
- package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +5 -0
- package/dist/cjs/dialect/mysql/mysql-query-compiler.js +16 -0
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +5 -12
- package/dist/cjs/dialect/postgres/postgres-driver.js +16 -11
- package/dist/cjs/dialect/postgres/postgres-introspector.js +17 -9
- package/dist/cjs/dialect/postgres/postgres-query-compiler.d.ts +1 -3
- package/dist/cjs/dialect/postgres/postgres-query-compiler.js +3 -8
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +2 -0
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +3 -0
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +10 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.js +3 -0
- package/dist/cjs/operation-node/create-table-node.d.ts +6 -1
- package/dist/cjs/operation-node/create-table-node.js +16 -0
- package/dist/cjs/operation-node/create-type-node.d.ts +2 -2
- package/dist/cjs/operation-node/create-type-node.js +2 -2
- package/dist/cjs/operation-node/create-view-node.d.ts +2 -2
- package/dist/cjs/operation-node/create-view-node.js +2 -2
- package/dist/cjs/operation-node/delete-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/delete-query-node.js +6 -0
- package/dist/cjs/operation-node/drop-index-node.d.ts +2 -2
- package/dist/cjs/operation-node/drop-index-node.js +2 -2
- package/dist/cjs/operation-node/drop-type-node.d.ts +2 -2
- package/dist/cjs/operation-node/drop-type-node.js +2 -2
- package/dist/cjs/operation-node/drop-view-node.d.ts +2 -2
- package/dist/cjs/operation-node/drop-view-node.js +2 -2
- package/dist/cjs/operation-node/explain-node.d.ts +16 -0
- package/dist/cjs/operation-node/explain-node.js +19 -0
- package/dist/cjs/operation-node/identifier-node.d.ts +2 -2
- package/dist/cjs/operation-node/identifier-node.js +2 -2
- package/dist/cjs/operation-node/insert-query-node.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +7 -3
- package/dist/cjs/operation-node/operation-node-transformer.js +30 -6
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +8 -4
- package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/reference-node.d.ts +1 -1
- package/dist/cjs/operation-node/reference-node.js +1 -2
- package/dist/cjs/operation-node/schemable-identifier-node.d.ts +15 -0
- package/dist/cjs/operation-node/schemable-identifier-node.js +26 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/select-query-node.js +6 -0
- package/dist/cjs/operation-node/selection-node.d.ts +2 -1
- package/dist/cjs/operation-node/table-node.d.ts +2 -3
- package/dist/cjs/operation-node/table-node.js +3 -4
- package/dist/cjs/operation-node/update-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/update-query-node.js +6 -0
- package/dist/cjs/parser/select-parser.js +2 -1
- package/dist/cjs/plugin/camel-case/camel-case-transformer.js +1 -1
- package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -28
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +72 -78
- package/dist/cjs/query-builder/delete-query-builder.d.ts +19 -1
- package/dist/cjs/query-builder/delete-query-builder.js +24 -0
- package/dist/cjs/query-builder/function-builder.d.ts +3 -3
- package/dist/cjs/query-builder/insert-query-builder.d.ts +20 -2
- package/dist/cjs/query-builder/insert-query-builder.js +26 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +38 -1
- package/dist/cjs/query-builder/select-query-builder.js +45 -2
- package/dist/cjs/query-builder/update-query-builder.d.ts +20 -1
- package/dist/cjs/query-builder/update-query-builder.js +25 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +8 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +63 -5
- package/dist/cjs/raw-builder/sql.d.ts +96 -96
- package/dist/cjs/raw-builder/sql.js +0 -96
- package/dist/cjs/schema/alter-table-builder.d.ts +6 -6
- package/dist/cjs/schema/column-definition-builder.d.ts +6 -6
- package/dist/cjs/schema/create-table-builder.d.ts +54 -0
- package/dist/cjs/schema/create-table-builder.js +64 -0
- package/dist/cjs/util/explainable.d.ts +5 -0
- package/dist/cjs/util/explainable.js +2 -0
- package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +5 -0
- package/dist/esm/dialect/mysql/mysql-query-compiler.js +16 -0
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +5 -12
- package/dist/esm/dialect/postgres/postgres-driver.js +16 -11
- package/dist/esm/dialect/postgres/postgres-introspector.js +17 -9
- package/dist/esm/dialect/postgres/postgres-query-compiler.d.ts +1 -3
- package/dist/esm/dialect/postgres/postgres-query-compiler.js +3 -8
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -0
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +3 -0
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +10 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/operation-node/create-table-node.d.ts +6 -1
- package/dist/esm/operation-node/create-table-node.js +16 -0
- package/dist/esm/operation-node/create-type-node.d.ts +2 -2
- package/dist/esm/operation-node/create-type-node.js +2 -2
- package/dist/esm/operation-node/create-view-node.d.ts +2 -2
- package/dist/esm/operation-node/create-view-node.js +2 -2
- package/dist/esm/operation-node/delete-query-node.d.ts +3 -0
- package/dist/esm/operation-node/delete-query-node.js +6 -0
- package/dist/esm/operation-node/drop-index-node.d.ts +2 -2
- package/dist/esm/operation-node/drop-index-node.js +2 -2
- package/dist/esm/operation-node/drop-type-node.d.ts +2 -2
- package/dist/esm/operation-node/drop-type-node.js +2 -2
- package/dist/esm/operation-node/drop-view-node.d.ts +2 -2
- package/dist/esm/operation-node/drop-view-node.js +2 -2
- package/dist/esm/operation-node/explain-node.d.ts +16 -0
- package/dist/esm/operation-node/explain-node.js +17 -0
- package/dist/esm/operation-node/identifier-node.d.ts +2 -2
- package/dist/esm/operation-node/identifier-node.js +2 -2
- package/dist/esm/operation-node/insert-query-node.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +7 -3
- package/dist/esm/operation-node/operation-node-transformer.js +30 -6
- package/dist/esm/operation-node/operation-node-visitor.d.ts +8 -4
- package/dist/esm/operation-node/operation-node-visitor.js +2 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/reference-node.d.ts +1 -1
- package/dist/esm/operation-node/reference-node.js +1 -2
- package/dist/esm/operation-node/schemable-identifier-node.d.ts +15 -0
- package/dist/esm/operation-node/schemable-identifier-node.js +24 -0
- package/dist/esm/operation-node/select-query-node.d.ts +3 -0
- package/dist/esm/operation-node/select-query-node.js +6 -0
- package/dist/esm/operation-node/selection-node.d.ts +2 -1
- package/dist/esm/operation-node/table-node.d.ts +2 -3
- package/dist/esm/operation-node/table-node.js +3 -4
- package/dist/esm/operation-node/update-query-node.d.ts +3 -0
- package/dist/esm/operation-node/update-query-node.js +6 -0
- package/dist/esm/parser/select-parser.js +2 -1
- package/dist/esm/plugin/camel-case/camel-case-transformer.js +1 -1
- package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -28
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +72 -78
- package/dist/esm/query-builder/delete-query-builder.d.ts +19 -1
- package/dist/esm/query-builder/delete-query-builder.js +24 -0
- package/dist/esm/query-builder/function-builder.d.ts +3 -3
- package/dist/esm/query-builder/insert-query-builder.d.ts +20 -2
- package/dist/esm/query-builder/insert-query-builder.js +26 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +38 -1
- package/dist/esm/query-builder/select-query-builder.js +45 -2
- package/dist/esm/query-builder/update-query-builder.d.ts +20 -1
- package/dist/esm/query-builder/update-query-builder.js +25 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +8 -0
- package/dist/esm/query-compiler/default-query-compiler.js +63 -5
- package/dist/esm/raw-builder/sql.d.ts +96 -96
- package/dist/esm/raw-builder/sql.js +0 -96
- package/dist/esm/schema/alter-table-builder.d.ts +6 -6
- package/dist/esm/schema/column-definition-builder.d.ts +6 -6
- package/dist/esm/schema/create-table-builder.d.ts +54 -0
- package/dist/esm/schema/create-table-builder.js +64 -0
- package/dist/esm/util/explainable.d.ts +5 -0
- package/dist/esm/util/explainable.js +2 -0
- package/package.json +4 -1
|
@@ -3,119 +3,113 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.WithSchemaTransformer = void 0;
|
|
4
4
|
const alias_node_js_1 = require("../../operation-node/alias-node.js");
|
|
5
5
|
const operation_node_transformer_js_1 = require("../../operation-node/operation-node-transformer.js");
|
|
6
|
+
const schemable_identifier_node_js_1 = require("../../operation-node/schemable-identifier-node.js");
|
|
6
7
|
const table_node_js_1 = require("../../operation-node/table-node.js");
|
|
8
|
+
const object_utils_js_1 = require("../../util/object-utils.js");
|
|
9
|
+
// This object exist only so that we get a type error when a new RootOperationNode
|
|
10
|
+
// is added. If you get a type error here, make sure to add the new root node and
|
|
11
|
+
// handle it correctly in the transformer.
|
|
12
|
+
//
|
|
13
|
+
// DO NOT REFACTOR THIS EVEN IF IT SEEMS USELESS TO YOU!
|
|
14
|
+
const ROOT_OPERATION_NODES = (0, object_utils_js_1.freeze)({
|
|
15
|
+
AlterTableNode: true,
|
|
16
|
+
CreateIndexNode: true,
|
|
17
|
+
CreateSchemaNode: true,
|
|
18
|
+
CreateTableNode: true,
|
|
19
|
+
CreateTypeNode: true,
|
|
20
|
+
CreateViewNode: true,
|
|
21
|
+
DeleteQueryNode: true,
|
|
22
|
+
DropIndexNode: true,
|
|
23
|
+
DropSchemaNode: true,
|
|
24
|
+
DropTableNode: true,
|
|
25
|
+
DropTypeNode: true,
|
|
26
|
+
DropViewNode: true,
|
|
27
|
+
InsertQueryNode: true,
|
|
28
|
+
RawNode: true,
|
|
29
|
+
SelectQueryNode: true,
|
|
30
|
+
UpdateQueryNode: true,
|
|
31
|
+
});
|
|
7
32
|
class WithSchemaTransformer extends operation_node_transformer_js_1.OperationNodeTransformer {
|
|
8
33
|
#schema;
|
|
9
|
-
#
|
|
34
|
+
#schemableIds = new Set();
|
|
10
35
|
constructor(schema) {
|
|
11
36
|
super();
|
|
12
37
|
this.#schema = schema;
|
|
13
38
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return this.#transformRoot(node, (node) => super.transformCreateTable(node));
|
|
28
|
-
}
|
|
29
|
-
transformDropTable(node) {
|
|
30
|
-
return this.#transformRoot(node, (node) => super.transformDropTable(node));
|
|
31
|
-
}
|
|
32
|
-
transformCreateIndex(node) {
|
|
33
|
-
return this.#transformRoot(node, (node) => super.transformCreateIndex(node));
|
|
34
|
-
}
|
|
35
|
-
transformDropIndex(node) {
|
|
36
|
-
return this.#transformRoot(node, (node) => super.transformDropIndex(node));
|
|
37
|
-
}
|
|
38
|
-
transformCreateView(node) {
|
|
39
|
-
return this.#transformRoot(node, (node) => super.transformCreateView(node));
|
|
40
|
-
}
|
|
41
|
-
transformDropView(node) {
|
|
42
|
-
return this.#transformRoot(node, (node) => super.transformDropView(node));
|
|
43
|
-
}
|
|
44
|
-
transformCreateType(node) {
|
|
45
|
-
return this.#transformRoot(node, (node) => super.transformCreateType(node));
|
|
46
|
-
}
|
|
47
|
-
transformDropType(node) {
|
|
48
|
-
return this.#transformRoot(node, (node) => super.transformDropType(node));
|
|
49
|
-
}
|
|
50
|
-
transformAlterTable(node) {
|
|
51
|
-
return this.#transformRoot(node, (node) => super.transformAlterTable(node));
|
|
39
|
+
transformNodeImpl(node) {
|
|
40
|
+
if (!this.#isRootOperationNode(node)) {
|
|
41
|
+
return super.transformNodeImpl(node);
|
|
42
|
+
}
|
|
43
|
+
const tables = this.#collectSchemableIds(node);
|
|
44
|
+
for (const table of tables) {
|
|
45
|
+
this.#schemableIds.add(table);
|
|
46
|
+
}
|
|
47
|
+
const transformed = super.transformNodeImpl(node);
|
|
48
|
+
for (const table of tables) {
|
|
49
|
+
this.#schemableIds.delete(table);
|
|
50
|
+
}
|
|
51
|
+
return transformed;
|
|
52
52
|
}
|
|
53
|
-
|
|
54
|
-
const transformed = super.
|
|
55
|
-
if (transformed.schema || !this.#
|
|
53
|
+
transformSchemableIdentifier(node) {
|
|
54
|
+
const transformed = super.transformSchemableIdentifier(node);
|
|
55
|
+
if (transformed.schema || !this.#schemableIds.has(node.identifier.name)) {
|
|
56
56
|
return transformed;
|
|
57
57
|
}
|
|
58
58
|
return {
|
|
59
59
|
...transformed,
|
|
60
|
-
schema: {
|
|
60
|
+
schema: (0, object_utils_js_1.freeze)({
|
|
61
61
|
kind: 'IdentifierNode',
|
|
62
|
-
|
|
63
|
-
},
|
|
62
|
+
name: this.#schema,
|
|
63
|
+
}),
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
|
-
#
|
|
67
|
-
|
|
68
|
-
for (const table of tables) {
|
|
69
|
-
this.#tables.add(table);
|
|
70
|
-
}
|
|
71
|
-
const transformed = transform(node);
|
|
72
|
-
for (const table of tables) {
|
|
73
|
-
this.#tables.delete(table);
|
|
74
|
-
}
|
|
75
|
-
return transformed;
|
|
66
|
+
#isRootOperationNode(node) {
|
|
67
|
+
return node.kind in ROOT_OPERATION_NODES;
|
|
76
68
|
}
|
|
77
|
-
#
|
|
78
|
-
const
|
|
69
|
+
#collectSchemableIds(node) {
|
|
70
|
+
const schemableIds = new Set();
|
|
71
|
+
if ('name' in node && node.name && schemable_identifier_node_js_1.SchemableIdentifierNode.is(node.name)) {
|
|
72
|
+
this.#collectSchemableId(node.name, schemableIds);
|
|
73
|
+
}
|
|
79
74
|
if ('from' in node && node.from) {
|
|
80
|
-
|
|
75
|
+
for (const from of node.from.froms) {
|
|
76
|
+
this.#collectSchemableIdsFromTableExpr(from, schemableIds);
|
|
77
|
+
}
|
|
81
78
|
}
|
|
82
79
|
if ('into' in node && node.into) {
|
|
83
|
-
this.#
|
|
80
|
+
this.#collectSchemableIdsFromTableExpr(node.into, schemableIds);
|
|
84
81
|
}
|
|
85
82
|
if ('table' in node && node.table) {
|
|
86
|
-
this.#
|
|
83
|
+
this.#collectSchemableIdsFromTableExpr(node.table, schemableIds);
|
|
87
84
|
}
|
|
88
85
|
if ('joins' in node && node.joins) {
|
|
89
|
-
|
|
86
|
+
for (const join of node.joins) {
|
|
87
|
+
this.#collectSchemableIdsFromTableExpr(join.table, schemableIds);
|
|
88
|
+
}
|
|
90
89
|
}
|
|
91
90
|
if ('with' in node && node.with) {
|
|
92
|
-
this.#removeCommonTableExpressionTables(node.with,
|
|
93
|
-
}
|
|
94
|
-
return tables;
|
|
95
|
-
}
|
|
96
|
-
#collectTablesFromTableExpressionNodes(nodes, tables) {
|
|
97
|
-
for (const node of nodes) {
|
|
98
|
-
this.#collectTablesFromTableExpressionNode(node, tables);
|
|
91
|
+
this.#removeCommonTableExpressionTables(node.with, schemableIds);
|
|
99
92
|
}
|
|
93
|
+
return schemableIds;
|
|
100
94
|
}
|
|
101
|
-
#
|
|
102
|
-
for (const node of nodes) {
|
|
103
|
-
this.#collectTablesFromTableExpressionNode(node.table, tables);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
#collectTablesFromTableExpressionNode(node, tables) {
|
|
95
|
+
#collectSchemableIdsFromTableExpr(node, schemableIds) {
|
|
107
96
|
const table = table_node_js_1.TableNode.is(node)
|
|
108
97
|
? node
|
|
109
98
|
: alias_node_js_1.AliasNode.is(node) && table_node_js_1.TableNode.is(node.node)
|
|
110
99
|
? node.node
|
|
111
100
|
: null;
|
|
112
|
-
if (table
|
|
113
|
-
|
|
101
|
+
if (table) {
|
|
102
|
+
this.#collectSchemableId(table.table, schemableIds);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
#collectSchemableId(node, schemableIds) {
|
|
106
|
+
if (!this.#schemableIds.has(node.identifier.name)) {
|
|
107
|
+
schemableIds.add(node.identifier.name);
|
|
114
108
|
}
|
|
115
109
|
}
|
|
116
|
-
#removeCommonTableExpressionTables(node,
|
|
110
|
+
#removeCommonTableExpressionTables(node, schemableIds) {
|
|
117
111
|
for (const expr of node.expressions) {
|
|
118
|
-
|
|
112
|
+
schemableIds.delete(expr.name.table.table.identifier.name);
|
|
119
113
|
}
|
|
120
114
|
}
|
|
121
115
|
}
|
|
@@ -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
|
-
|
|
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> =
|
|
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> =
|
|
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> =
|
|
132
|
+
count<O extends number | string | bigint, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): RawBuilder<O>;
|
|
133
133
|
}
|
|
@@ -3,7 +3,7 @@ import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
|
3
3
|
import { SelectExpression } from '../parser/select-parser.js';
|
|
4
4
|
import { InsertObject } from '../parser/insert-values-parser.js';
|
|
5
5
|
import { InsertQueryNode } from '../operation-node/insert-query-node.js';
|
|
6
|
-
import { MergePartial, SingleResultType } from '../util/type-utils.js';
|
|
6
|
+
import { AnyRawBuilder, MergePartial, SingleResultType } from '../util/type-utils.js';
|
|
7
7
|
import { MutationObject } from '../parser/update-set-parser.js';
|
|
8
8
|
import { Compilable } from '../util/compilable.js';
|
|
9
9
|
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
@@ -16,7 +16,8 @@ import { ComplexExpression } from '../parser/complex-expression-parser.js';
|
|
|
16
16
|
import { ReturningInterface } from './returning-interface.js';
|
|
17
17
|
import { OnConflictBuilder, OnConflictDoNothingBuilder, OnConflictUpdateBuilder } from './on-conflict-builder.js';
|
|
18
18
|
import { Selectable } from '../util/column-type.js';
|
|
19
|
-
|
|
19
|
+
import { Explainable, ExplainFormat } from '../util/explainable.js';
|
|
20
|
+
export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable, Explainable {
|
|
20
21
|
#private;
|
|
21
22
|
constructor(props: InsertQueryBuilderProps);
|
|
22
23
|
/**
|
|
@@ -541,6 +542,23 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
541
542
|
* error.
|
|
542
543
|
*/
|
|
543
544
|
executeTakeFirstOrThrow(errorConstructor?: NoResultErrorConstructor): Promise<O>;
|
|
545
|
+
/**
|
|
546
|
+
* Executes query with `explain` statement before `insert` keyword.
|
|
547
|
+
*
|
|
548
|
+
* ```ts
|
|
549
|
+
* const explained = await db
|
|
550
|
+
* .insertInto('person')
|
|
551
|
+
* .values(values)
|
|
552
|
+
* .explain('json')
|
|
553
|
+
* ```
|
|
554
|
+
*
|
|
555
|
+
* The generated SQL (MySQL):
|
|
556
|
+
*
|
|
557
|
+
* ```sql
|
|
558
|
+
* explain format=json insert into `person` (`id`, `first_name`, `last_name`) values (?, ?, ?) (?, ?, ?)
|
|
559
|
+
* ```
|
|
560
|
+
*/
|
|
561
|
+
explain<ER extends Record<string, any> = Record<string, any>>(format?: ExplainFormat, options?: AnyRawBuilder): Promise<ER[]>;
|
|
544
562
|
}
|
|
545
563
|
export interface InsertQueryBuilderProps {
|
|
546
564
|
readonly queryId: QueryId;
|
|
@@ -15,6 +15,7 @@ const complex_expression_parser_js_1 = require("../parser/complex-expression-par
|
|
|
15
15
|
const column_node_js_1 = require("../operation-node/column-node.js");
|
|
16
16
|
const on_conflict_builder_js_1 = require("./on-conflict-builder.js");
|
|
17
17
|
const on_conflict_node_js_1 = require("../operation-node/on-conflict-node.js");
|
|
18
|
+
const explain_node_js_1 = require("../operation-node/explain-node.js");
|
|
18
19
|
class InsertQueryBuilder {
|
|
19
20
|
#props;
|
|
20
21
|
constructor(props) {
|
|
@@ -446,6 +447,31 @@ class InsertQueryBuilder {
|
|
|
446
447
|
}
|
|
447
448
|
return result;
|
|
448
449
|
}
|
|
450
|
+
/**
|
|
451
|
+
* Executes query with `explain` statement before `insert` keyword.
|
|
452
|
+
*
|
|
453
|
+
* ```ts
|
|
454
|
+
* const explained = await db
|
|
455
|
+
* .insertInto('person')
|
|
456
|
+
* .values(values)
|
|
457
|
+
* .explain('json')
|
|
458
|
+
* ```
|
|
459
|
+
*
|
|
460
|
+
* The generated SQL (MySQL):
|
|
461
|
+
*
|
|
462
|
+
* ```sql
|
|
463
|
+
* explain format=json insert into `person` (`id`, `first_name`, `last_name`) values (?, ?, ?) (?, ?, ?)
|
|
464
|
+
* ```
|
|
465
|
+
*/
|
|
466
|
+
async explain(format, options) {
|
|
467
|
+
const builder = new InsertQueryBuilder({
|
|
468
|
+
...this.#props,
|
|
469
|
+
queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
|
|
470
|
+
explain: explain_node_js_1.ExplainNode.create(format, options),
|
|
471
|
+
}),
|
|
472
|
+
});
|
|
473
|
+
return await builder.execute();
|
|
474
|
+
}
|
|
449
475
|
}
|
|
450
476
|
exports.InsertQueryBuilder = InsertQueryBuilder;
|
|
451
477
|
(0, prevent_await_js_1.preventAwait)(InsertQueryBuilder, "don't await InsertQueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
|
|
@@ -18,7 +18,8 @@ import { WhereInterface } from './where-interface.js';
|
|
|
18
18
|
import { NoResultErrorConstructor } from './no-result-error.js';
|
|
19
19
|
import { HavingInterface } from './having-interface.js';
|
|
20
20
|
import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
|
|
21
|
-
|
|
21
|
+
import { Explainable, ExplainFormat } from '../util/explainable.js';
|
|
22
|
+
export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, HavingInterface<DB, TB>, OperationNodeSource, Compilable, Explainable {
|
|
22
23
|
#private;
|
|
23
24
|
constructor(props: SelectQueryBuilderProps);
|
|
24
25
|
/**
|
|
@@ -1370,6 +1371,42 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
1370
1371
|
* ```
|
|
1371
1372
|
*/
|
|
1372
1373
|
stream(chunkSize?: number): AsyncIterableIterator<O>;
|
|
1374
|
+
/**
|
|
1375
|
+
* Executes query with `explain` statement before `select` keyword.
|
|
1376
|
+
*
|
|
1377
|
+
* ```ts
|
|
1378
|
+
* const explained = await db
|
|
1379
|
+
* .selectFrom('person')
|
|
1380
|
+
* .where('gender', '=', 'female')
|
|
1381
|
+
* .selectAll()
|
|
1382
|
+
* .explain('json')
|
|
1383
|
+
* ```
|
|
1384
|
+
*
|
|
1385
|
+
* The generated SQL (MySQL):
|
|
1386
|
+
*
|
|
1387
|
+
* ```sql
|
|
1388
|
+
* explain format=json select * from `person` where `gender` = ?
|
|
1389
|
+
* ```
|
|
1390
|
+
*
|
|
1391
|
+
* You can also execute `explain analyze` statements.
|
|
1392
|
+
*
|
|
1393
|
+
* ```ts
|
|
1394
|
+
* import { sql } from 'kysely'
|
|
1395
|
+
*
|
|
1396
|
+
* const explained = await db
|
|
1397
|
+
* .selectFrom('person')
|
|
1398
|
+
* .where('gender', '=', 'female')
|
|
1399
|
+
* .selectAll()
|
|
1400
|
+
* .explain('json', sql`analyze`)
|
|
1401
|
+
* ```
|
|
1402
|
+
*
|
|
1403
|
+
* The generated SQL (PostgreSQL):
|
|
1404
|
+
*
|
|
1405
|
+
* ```sql
|
|
1406
|
+
* explain (analyze, format json) select * from "person" where "gender" = $1
|
|
1407
|
+
* ```
|
|
1408
|
+
*/
|
|
1409
|
+
explain<ER extends Record<string, any> = Record<string, any>>(format?: ExplainFormat, options?: AnyRawBuilder): Promise<ER[]>;
|
|
1373
1410
|
}
|
|
1374
1411
|
export interface SelectQueryBuilderProps {
|
|
1375
1412
|
readonly queryId: QueryId;
|
|
@@ -17,6 +17,7 @@ const group_by_parser_js_1 = require("../parser/group-by-parser.js");
|
|
|
17
17
|
const union_parser_js_1 = require("../parser/union-parser.js");
|
|
18
18
|
const no_result_error_js_1 = require("./no-result-error.js");
|
|
19
19
|
const identifier_node_js_1 = require("../operation-node/identifier-node.js");
|
|
20
|
+
const explain_node_js_1 = require("../operation-node/explain-node.js");
|
|
20
21
|
class SelectQueryBuilder {
|
|
21
22
|
#props;
|
|
22
23
|
constructor(props) {
|
|
@@ -629,8 +630,8 @@ class SelectQueryBuilder {
|
|
|
629
630
|
* Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods.
|
|
630
631
|
*/
|
|
631
632
|
async execute() {
|
|
632
|
-
const
|
|
633
|
-
const result = await this.#props.executor.executeQuery(
|
|
633
|
+
const compiledQuery = this.compile();
|
|
634
|
+
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
634
635
|
return result.rows;
|
|
635
636
|
}
|
|
636
637
|
/**
|
|
@@ -689,6 +690,48 @@ class SelectQueryBuilder {
|
|
|
689
690
|
yield* item.rows;
|
|
690
691
|
}
|
|
691
692
|
}
|
|
693
|
+
/**
|
|
694
|
+
* Executes query with `explain` statement before `select` keyword.
|
|
695
|
+
*
|
|
696
|
+
* ```ts
|
|
697
|
+
* const explained = await db
|
|
698
|
+
* .selectFrom('person')
|
|
699
|
+
* .where('gender', '=', 'female')
|
|
700
|
+
* .selectAll()
|
|
701
|
+
* .explain('json')
|
|
702
|
+
* ```
|
|
703
|
+
*
|
|
704
|
+
* The generated SQL (MySQL):
|
|
705
|
+
*
|
|
706
|
+
* ```sql
|
|
707
|
+
* explain format=json select * from `person` where `gender` = ?
|
|
708
|
+
* ```
|
|
709
|
+
*
|
|
710
|
+
* You can also execute `explain analyze` statements.
|
|
711
|
+
*
|
|
712
|
+
* ```ts
|
|
713
|
+
* import { sql } from 'kysely'
|
|
714
|
+
*
|
|
715
|
+
* const explained = await db
|
|
716
|
+
* .selectFrom('person')
|
|
717
|
+
* .where('gender', '=', 'female')
|
|
718
|
+
* .selectAll()
|
|
719
|
+
* .explain('json', sql`analyze`)
|
|
720
|
+
* ```
|
|
721
|
+
*
|
|
722
|
+
* The generated SQL (PostgreSQL):
|
|
723
|
+
*
|
|
724
|
+
* ```sql
|
|
725
|
+
* explain (analyze, format json) select * from "person" where "gender" = $1
|
|
726
|
+
* ```
|
|
727
|
+
*/
|
|
728
|
+
async explain(format, options) {
|
|
729
|
+
const builder = new SelectQueryBuilder({
|
|
730
|
+
...this.#props,
|
|
731
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithExplain(this.#props.queryNode, explain_node_js_1.ExplainNode.create(format, options)),
|
|
732
|
+
});
|
|
733
|
+
return await builder.execute();
|
|
734
|
+
}
|
|
692
735
|
}
|
|
693
736
|
exports.SelectQueryBuilder = SelectQueryBuilder;
|
|
694
737
|
(0, prevent_await_js_1.preventAwait)(SelectQueryBuilder, "don't await SelectQueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
|
|
@@ -20,7 +20,8 @@ import { NoResultErrorConstructor } from './no-result-error.js';
|
|
|
20
20
|
import { Selectable } from '../util/column-type.js';
|
|
21
21
|
import { AliasedQueryBuilder } from './select-query-builder.js';
|
|
22
22
|
import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
|
|
23
|
-
|
|
23
|
+
import { Explainable, ExplainFormat } from '../util/explainable.js';
|
|
24
|
+
export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable, Explainable {
|
|
24
25
|
#private;
|
|
25
26
|
constructor(props: UpdateQueryBuilderProps);
|
|
26
27
|
/**
|
|
@@ -809,6 +810,24 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
809
810
|
* error.
|
|
810
811
|
*/
|
|
811
812
|
executeTakeFirstOrThrow(errorConstructor?: NoResultErrorConstructor): Promise<O>;
|
|
813
|
+
/**
|
|
814
|
+
* Executes query with `explain` statement before `update` keyword.
|
|
815
|
+
*
|
|
816
|
+
* ```ts
|
|
817
|
+
* const explained = await db
|
|
818
|
+
* .updateTable('person')
|
|
819
|
+
* .set(updates)
|
|
820
|
+
* .where('id', '=', 123)
|
|
821
|
+
* .explain('json')
|
|
822
|
+
* ```
|
|
823
|
+
*
|
|
824
|
+
* The generated SQL (MySQL):
|
|
825
|
+
*
|
|
826
|
+
* ```sql
|
|
827
|
+
* explain format=json update `person` set `first_name` = ?, `last_name` = ? where `id` = ?
|
|
828
|
+
* ```
|
|
829
|
+
*/
|
|
830
|
+
explain<ER extends Record<string, any> = Record<string, any>>(format?: ExplainFormat, options?: AnyRawBuilder): Promise<ER[]>;
|
|
812
831
|
}
|
|
813
832
|
export interface UpdateQueryBuilderProps {
|
|
814
833
|
readonly queryId: QueryId;
|
|
@@ -12,6 +12,7 @@ const prevent_await_js_1 = require("../util/prevent-await.js");
|
|
|
12
12
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
13
13
|
const update_result_js_1 = require("./update-result.js");
|
|
14
14
|
const no_result_error_js_1 = require("./no-result-error.js");
|
|
15
|
+
const explain_node_js_1 = require("../operation-node/explain-node.js");
|
|
15
16
|
class UpdateQueryBuilder {
|
|
16
17
|
#props;
|
|
17
18
|
constructor(props) {
|
|
@@ -332,6 +333,30 @@ class UpdateQueryBuilder {
|
|
|
332
333
|
}
|
|
333
334
|
return result;
|
|
334
335
|
}
|
|
336
|
+
/**
|
|
337
|
+
* Executes query with `explain` statement before `update` keyword.
|
|
338
|
+
*
|
|
339
|
+
* ```ts
|
|
340
|
+
* const explained = await db
|
|
341
|
+
* .updateTable('person')
|
|
342
|
+
* .set(updates)
|
|
343
|
+
* .where('id', '=', 123)
|
|
344
|
+
* .explain('json')
|
|
345
|
+
* ```
|
|
346
|
+
*
|
|
347
|
+
* The generated SQL (MySQL):
|
|
348
|
+
*
|
|
349
|
+
* ```sql
|
|
350
|
+
* explain format=json update `person` set `first_name` = ?, `last_name` = ? where `id` = ?
|
|
351
|
+
* ```
|
|
352
|
+
*/
|
|
353
|
+
async explain(format, options) {
|
|
354
|
+
const builder = new UpdateQueryBuilder({
|
|
355
|
+
...this.#props,
|
|
356
|
+
queryNode: update_query_node_js_1.UpdateQueryNode.cloneWithExplain(this.#props.queryNode, explain_node_js_1.ExplainNode.create(format, options)),
|
|
357
|
+
});
|
|
358
|
+
return await builder.execute();
|
|
359
|
+
}
|
|
335
360
|
}
|
|
336
361
|
exports.UpdateQueryBuilder = UpdateQueryBuilder;
|
|
337
362
|
(0, prevent_await_js_1.preventAwait)(UpdateQueryBuilder, "don't await UpdateQueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
|
|
@@ -71,6 +71,8 @@ import { CommonTableExpressionNameNode } from '../operation-node/common-table-ex
|
|
|
71
71
|
import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
|
|
72
72
|
import { CreateTypeNode } from '../operation-node/create-type-node.js';
|
|
73
73
|
import { DropTypeNode } from '../operation-node/drop-type-node.js';
|
|
74
|
+
import { ExplainNode } from '../operation-node/explain-node.js';
|
|
75
|
+
import { SchemableIdentifierNode } from '../operation-node/schemable-identifier-node.js';
|
|
74
76
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
75
77
|
#private;
|
|
76
78
|
protected get numParameters(): number;
|
|
@@ -105,6 +107,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
105
107
|
protected visitRaw(node: RawNode): void;
|
|
106
108
|
protected visitOperator(node: OperatorNode): void;
|
|
107
109
|
protected visitTable(node: TableNode): void;
|
|
110
|
+
protected visitSchemableIdentifier(node: SchemableIdentifierNode): void;
|
|
108
111
|
protected visitCreateTable(node: CreateTableNode): void;
|
|
109
112
|
protected visitColumnDefinition(node: ColumnDefinitionNode): void;
|
|
110
113
|
protected getAutoIncrement(): string;
|
|
@@ -149,11 +152,16 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
149
152
|
protected visitSelectModifier(node: SelectModifierNode): void;
|
|
150
153
|
protected visitCreateType(node: CreateTypeNode): void;
|
|
151
154
|
protected visitDropType(node: DropTypeNode): void;
|
|
155
|
+
protected visitExplain(node: ExplainNode): void;
|
|
152
156
|
protected append(str: string): void;
|
|
153
157
|
protected appendValue(parameter: unknown): void;
|
|
154
158
|
protected getLeftIdentifierWrapper(): string;
|
|
155
159
|
protected getRightIdentifierWrapper(): string;
|
|
156
160
|
protected getCurrentParameterPlaceholder(): string;
|
|
161
|
+
protected getLeftExplainOptionsWrapper(): string;
|
|
162
|
+
protected getExplainOptionAssignment(): string;
|
|
163
|
+
protected getExplainOptionsDelimiter(): string;
|
|
164
|
+
protected getRightExplainOptionsWrapper(): string;
|
|
157
165
|
protected sanitizeIdentifier(identifier: string): string;
|
|
158
166
|
protected addParameter(parameter: unknown): void;
|
|
159
167
|
protected appendImmediateValue(value: unknown): void;
|