kysely 0.10.0 → 0.10.1
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/dist/cjs/driver/runtime-driver.js +3 -4
- package/dist/cjs/operation-node/column-definition-node.d.ts +4 -2
- package/dist/cjs/operation-node/default-value-node.d.ts +14 -0
- package/dist/cjs/operation-node/default-value-node.js +18 -0
- package/dist/cjs/operation-node/generated-always-as-node.d.ts +16 -0
- package/dist/cjs/operation-node/generated-always-as-node.js +25 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +18 -2
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +5 -2
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/raw-node.d.ts +1 -1
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +17 -1
- package/dist/cjs/raw-builder/raw-builder.d.ts +1 -1
- package/dist/cjs/schema/alter-table-builder.d.ts +4 -0
- package/dist/cjs/schema/alter-table-builder.js +24 -0
- package/dist/cjs/schema/column-definition-builder.d.ts +41 -0
- package/dist/cjs/schema/column-definition-builder.js +18 -1
- package/dist/cjs/schema/create-table-builder.d.ts +6 -7
- package/dist/cjs/schema/create-table-builder.js +6 -7
- package/dist/cjs/util/performance-now.d.ts +1 -0
- package/dist/cjs/util/performance-now.js +13 -0
- package/dist/esm/driver/runtime-driver.js +3 -4
- package/dist/esm/operation-node/column-definition-node.d.ts +4 -2
- package/dist/esm/operation-node/default-value-node.d.ts +14 -0
- package/dist/esm/operation-node/default-value-node.js +15 -0
- package/dist/esm/operation-node/generated-always-as-node.d.ts +16 -0
- package/dist/esm/operation-node/generated-always-as-node.js +22 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-transformer.js +18 -2
- package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-visitor.js +5 -2
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/raw-node.d.ts +1 -1
- package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/esm/query-compiler/default-query-compiler.js +17 -1
- package/dist/esm/raw-builder/raw-builder.d.ts +1 -1
- package/dist/esm/schema/alter-table-builder.d.ts +4 -0
- package/dist/esm/schema/alter-table-builder.js +24 -0
- package/dist/esm/schema/column-definition-builder.d.ts +41 -0
- package/dist/esm/schema/column-definition-builder.js +18 -1
- package/dist/esm/schema/create-table-builder.d.ts +6 -7
- package/dist/esm/schema/create-table-builder.js +6 -7
- package/dist/esm/util/performance-now.d.ts +1 -0
- package/dist/esm/util/performance-now.js +9 -0
- package/package.json +3 -3
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RuntimeDriver = void 0;
|
|
4
|
+
const performance_now_js_1 = require("../util/performance-now.js");
|
|
4
5
|
/**
|
|
5
6
|
* A small wrapper around {@link Driver} that makes sure the driver is
|
|
6
7
|
* initialized before it is used, only initialized and destroyed
|
|
@@ -75,7 +76,7 @@ class RuntimeConnection {
|
|
|
75
76
|
this.#log = log;
|
|
76
77
|
}
|
|
77
78
|
async executeQuery(compiledQuery) {
|
|
78
|
-
const startTime =
|
|
79
|
+
const startTime = (0, performance_now_js_1.performanceNow)();
|
|
79
80
|
try {
|
|
80
81
|
return await this.#connection.executeQuery(compiledQuery);
|
|
81
82
|
}
|
|
@@ -101,8 +102,6 @@ class RuntimeConnection {
|
|
|
101
102
|
}));
|
|
102
103
|
}
|
|
103
104
|
#calculateDurationMillis(startTime) {
|
|
104
|
-
|
|
105
|
-
const durationNanos = Number(endTime - startTime);
|
|
106
|
-
return durationNanos / 1_000_000;
|
|
105
|
+
return (0, performance_now_js_1.performanceNow)() - startTime;
|
|
107
106
|
}
|
|
108
107
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { CheckConstraintNode } from './check-constraint-node.js';
|
|
2
2
|
import { ColumnNode } from './column-node.js';
|
|
3
3
|
import { DataTypeNode } from './data-type-node.js';
|
|
4
|
+
import { DefaultValueNode } from './default-value-node.js';
|
|
5
|
+
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
|
|
4
6
|
import { OperationNode } from './operation-node.js';
|
|
5
7
|
import { RawNode } from './raw-node.js';
|
|
6
8
|
import { ReferencesNode } from './references-node.js';
|
|
7
|
-
import { ValueNode } from './value-node.js';
|
|
8
9
|
export declare type ColumnDefinitionNodeProps = Omit<Partial<ColumnDefinitionNode>, 'kind'>;
|
|
9
10
|
export declare type ColumnDataTypeNode = DataTypeNode | RawNode;
|
|
10
11
|
export interface ColumnDefinitionNode extends OperationNode {
|
|
@@ -16,8 +17,9 @@ export interface ColumnDefinitionNode extends OperationNode {
|
|
|
16
17
|
readonly autoIncrement: boolean;
|
|
17
18
|
readonly unique: boolean;
|
|
18
19
|
readonly nullable: boolean;
|
|
19
|
-
readonly defaultTo?:
|
|
20
|
+
readonly defaultTo?: DefaultValueNode;
|
|
20
21
|
readonly check?: CheckConstraintNode;
|
|
22
|
+
readonly generatedAlwaysAs?: GeneratedAlwaysAsNode;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* @internal
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
import { RawNode } from './raw-node.js';
|
|
3
|
+
import { ValueNode } from './value-node.js';
|
|
4
|
+
export interface DefaultValueNode extends OperationNode {
|
|
5
|
+
readonly kind: 'DefaultValueNode';
|
|
6
|
+
readonly defaultValue: ValueNode | RawNode;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare const DefaultValueNode: Readonly<{
|
|
12
|
+
is(node: OperationNode): node is DefaultValueNode;
|
|
13
|
+
create(defaultValue: ValueNode | RawNode): DefaultValueNode;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DefaultValueNode = void 0;
|
|
4
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
exports.DefaultValueNode = (0, object_utils_js_1.freeze)({
|
|
9
|
+
is(node) {
|
|
10
|
+
return node.kind === 'DefaultValueNode';
|
|
11
|
+
},
|
|
12
|
+
create(defaultValue) {
|
|
13
|
+
return (0, object_utils_js_1.freeze)({
|
|
14
|
+
kind: 'DefaultValueNode',
|
|
15
|
+
defaultValue,
|
|
16
|
+
});
|
|
17
|
+
},
|
|
18
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
import { RawNode } from './raw-node.js';
|
|
3
|
+
export declare type GeneratedAlwaysAsNodeParams = Omit<GeneratedAlwaysAsNode, 'kind' | 'expression'>;
|
|
4
|
+
export interface GeneratedAlwaysAsNode extends OperationNode {
|
|
5
|
+
readonly kind: 'GeneratedAlwaysAsNode';
|
|
6
|
+
readonly expression: RawNode;
|
|
7
|
+
readonly stored?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare const GeneratedAlwaysAsNode: Readonly<{
|
|
13
|
+
is(node: OperationNode): node is GeneratedAlwaysAsNode;
|
|
14
|
+
create(expression: string): GeneratedAlwaysAsNode;
|
|
15
|
+
cloneWith(node: GeneratedAlwaysAsNode, params: GeneratedAlwaysAsNodeParams): GeneratedAlwaysAsNode;
|
|
16
|
+
}>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeneratedAlwaysAsNode = void 0;
|
|
4
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
5
|
+
const raw_node_js_1 = require("./raw-node.js");
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
exports.GeneratedAlwaysAsNode = (0, object_utils_js_1.freeze)({
|
|
10
|
+
is(node) {
|
|
11
|
+
return node.kind === 'GeneratedAlwaysAsNode';
|
|
12
|
+
},
|
|
13
|
+
create(expression) {
|
|
14
|
+
return (0, object_utils_js_1.freeze)({
|
|
15
|
+
kind: 'GeneratedAlwaysAsNode',
|
|
16
|
+
expression: raw_node_js_1.RawNode.createWithSql(expression),
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
cloneWith(node, params) {
|
|
20
|
+
return (0, object_utils_js_1.freeze)({
|
|
21
|
+
...node,
|
|
22
|
+
...params,
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
});
|
|
@@ -60,6 +60,8 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
|
|
|
60
60
|
import { UnionNode } from './union-node.js';
|
|
61
61
|
import { CreateViewNode } from './create-view-node.js';
|
|
62
62
|
import { DropViewNode } from './drop-view-node.js';
|
|
63
|
+
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
|
|
64
|
+
import { DefaultValueNode } from './default-value-node.js';
|
|
63
65
|
/**
|
|
64
66
|
* Transforms an operation node tree into another one.
|
|
65
67
|
*
|
|
@@ -149,6 +151,8 @@ export declare class OperationNodeTransformer {
|
|
|
149
151
|
protected transformDropConstraint(node: DropConstraintNode): DropConstraintNode;
|
|
150
152
|
protected transformCreateView(node: CreateViewNode): CreateViewNode;
|
|
151
153
|
protected transformDropView(node: DropViewNode): DropViewNode;
|
|
154
|
+
protected transformGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): GeneratedAlwaysAsNode;
|
|
155
|
+
protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode;
|
|
152
156
|
protected transformDataType(node: DataTypeNode): DataTypeNode;
|
|
153
157
|
protected transformSelectAll(node: SelectAllNode): SelectAllNode;
|
|
154
158
|
protected transformIdentifier(node: IdentifierNode): IdentifierNode;
|
|
@@ -33,7 +33,7 @@ const object_utils_js_1 = require("../util/object-utils.js");
|
|
|
33
33
|
*/
|
|
34
34
|
class OperationNodeTransformer {
|
|
35
35
|
nodeStack = [];
|
|
36
|
-
#transformers = {
|
|
36
|
+
#transformers = (0, object_utils_js_1.freeze)({
|
|
37
37
|
AliasNode: this.transformAlias.bind(this),
|
|
38
38
|
ColumnNode: this.transformColumn.bind(this),
|
|
39
39
|
IdentifierNode: this.transformIdentifier.bind(this),
|
|
@@ -95,7 +95,9 @@ class OperationNodeTransformer {
|
|
|
95
95
|
UnionNode: this.transformUnion.bind(this),
|
|
96
96
|
CreateViewNode: this.transformCreateView.bind(this),
|
|
97
97
|
DropViewNode: this.transformDropView.bind(this),
|
|
98
|
-
|
|
98
|
+
GeneratedAlwaysAsNode: this.transformGeneratedAlwaysAs.bind(this),
|
|
99
|
+
DefaultValueNode: this.transformDefaultValue.bind(this),
|
|
100
|
+
});
|
|
99
101
|
transformNode = (node) => {
|
|
100
102
|
if (!node) {
|
|
101
103
|
return undefined;
|
|
@@ -274,6 +276,7 @@ class OperationNodeTransformer {
|
|
|
274
276
|
nullable: node.nullable,
|
|
275
277
|
defaultTo: this.transformNode(node.defaultTo),
|
|
276
278
|
check: this.transformNode(node.check),
|
|
279
|
+
generatedAlwaysAs: this.transformNode(node.generatedAlwaysAs),
|
|
277
280
|
};
|
|
278
281
|
}
|
|
279
282
|
transformAddColumn(node) {
|
|
@@ -538,6 +541,19 @@ class OperationNodeTransformer {
|
|
|
538
541
|
materialized: node.materialized,
|
|
539
542
|
};
|
|
540
543
|
}
|
|
544
|
+
transformGeneratedAlwaysAs(node) {
|
|
545
|
+
return {
|
|
546
|
+
kind: 'GeneratedAlwaysAsNode',
|
|
547
|
+
expression: this.transformNode(node.expression),
|
|
548
|
+
stored: node.stored,
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
transformDefaultValue(node) {
|
|
552
|
+
return {
|
|
553
|
+
kind: 'DefaultValueNode',
|
|
554
|
+
defaultValue: this.transformNode(node.defaultValue),
|
|
555
|
+
};
|
|
556
|
+
}
|
|
541
557
|
transformDataType(node) {
|
|
542
558
|
// An Object.freezed leaf node. No need to clone.
|
|
543
559
|
return node;
|
|
@@ -60,6 +60,8 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
|
|
|
60
60
|
import { UnionNode } from './union-node.js';
|
|
61
61
|
import { CreateViewNode } from './create-view-node.js';
|
|
62
62
|
import { DropViewNode } from './drop-view-node.js';
|
|
63
|
+
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
|
|
64
|
+
import { DefaultValueNode } from './default-value-node.js';
|
|
63
65
|
export declare abstract class OperationNodeVisitor {
|
|
64
66
|
#private;
|
|
65
67
|
protected readonly nodeStack: OperationNode[];
|
|
@@ -125,4 +127,6 @@ export declare abstract class OperationNodeVisitor {
|
|
|
125
127
|
protected abstract visitOperator(node: OperatorNode): void;
|
|
126
128
|
protected abstract visitCreateView(node: CreateViewNode): void;
|
|
127
129
|
protected abstract visitDropView(node: DropViewNode): void;
|
|
130
|
+
protected abstract visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void;
|
|
131
|
+
protected abstract visitDefaultValue(node: DefaultValueNode): void;
|
|
128
132
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.OperationNodeVisitor = void 0;
|
|
4
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
4
5
|
class OperationNodeVisitor {
|
|
5
6
|
nodeStack = [];
|
|
6
|
-
#visitors = {
|
|
7
|
+
#visitors = (0, object_utils_js_1.freeze)({
|
|
7
8
|
AliasNode: this.visitAlias.bind(this),
|
|
8
9
|
ColumnNode: this.visitColumn.bind(this),
|
|
9
10
|
IdentifierNode: this.visitIdentifier.bind(this),
|
|
@@ -65,7 +66,9 @@ class OperationNodeVisitor {
|
|
|
65
66
|
UnionNode: this.visitUnion.bind(this),
|
|
66
67
|
CreateViewNode: this.visitCreateView.bind(this),
|
|
67
68
|
DropViewNode: this.visitDropView.bind(this),
|
|
68
|
-
|
|
69
|
+
GeneratedAlwaysAsNode: this.visitGeneratedAlwaysAs.bind(this),
|
|
70
|
+
DefaultValueNode: this.visitDefaultValue.bind(this),
|
|
71
|
+
});
|
|
69
72
|
visitNode = (node) => {
|
|
70
73
|
this.nodeStack.push(node);
|
|
71
74
|
this.#visitors[node.kind](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';
|
|
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' | 'GeneratedAlwaysAsNode' | 'DefaultValueNode';
|
|
2
2
|
export interface OperationNode {
|
|
3
3
|
readonly kind: OperationNodeKind;
|
|
4
4
|
}
|
|
@@ -9,6 +9,6 @@ export interface RawNode extends OperationNode {
|
|
|
9
9
|
*/
|
|
10
10
|
export declare const RawNode: Readonly<{
|
|
11
11
|
is(node: OperationNode): node is RawNode;
|
|
12
|
-
create(sqlFragments: string
|
|
12
|
+
create(sqlFragments: ReadonlyArray<string>, params: ReadonlyArray<OperationNode>): RawNode;
|
|
13
13
|
createWithSql(sql: string): RawNode;
|
|
14
14
|
}>;
|
|
@@ -64,6 +64,8 @@ import { ColumnNode } from '../operation-node/column-node.js';
|
|
|
64
64
|
import { UnionNode } from '../operation-node/union-node.js';
|
|
65
65
|
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
66
66
|
import { DropViewNode } from '../operation-node/drop-view-node.js';
|
|
67
|
+
import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js';
|
|
68
|
+
import { DefaultValueNode } from '../operation-node/default-value-node.js';
|
|
67
69
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
68
70
|
#private;
|
|
69
71
|
protected get numParameters(): number;
|
|
@@ -134,6 +136,8 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
134
136
|
protected visitUnion(node: UnionNode): void;
|
|
135
137
|
protected visitCreateView(node: CreateViewNode): void;
|
|
136
138
|
protected visitDropView(node: DropViewNode): void;
|
|
139
|
+
protected visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void;
|
|
140
|
+
protected visitDefaultValue(node: DefaultValueNode): void;
|
|
137
141
|
protected append(str: string): void;
|
|
138
142
|
protected appendValue(parameter: unknown): void;
|
|
139
143
|
protected getLeftIdentifierWrapper(): string;
|
|
@@ -302,8 +302,12 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
302
302
|
this.visitNode(node.column);
|
|
303
303
|
this.append(' ');
|
|
304
304
|
this.visitNode(node.dataType);
|
|
305
|
+
if (node.generatedAlwaysAs) {
|
|
306
|
+
this.append(' ');
|
|
307
|
+
this.visitNode(node.generatedAlwaysAs);
|
|
308
|
+
}
|
|
305
309
|
if (node.defaultTo) {
|
|
306
|
-
this.append('
|
|
310
|
+
this.append(' ');
|
|
307
311
|
this.visitNode(node.defaultTo);
|
|
308
312
|
}
|
|
309
313
|
if (!node.nullable) {
|
|
@@ -679,6 +683,18 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
679
683
|
}
|
|
680
684
|
this.visitNode(node.name);
|
|
681
685
|
}
|
|
686
|
+
visitGeneratedAlwaysAs(node) {
|
|
687
|
+
this.append('generated always as (');
|
|
688
|
+
this.visitNode(node.expression);
|
|
689
|
+
this.append(')');
|
|
690
|
+
if (node.stored) {
|
|
691
|
+
this.append(' stored');
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
visitDefaultValue(node) {
|
|
695
|
+
this.append('default ');
|
|
696
|
+
this.visitNode(node.defaultValue);
|
|
697
|
+
}
|
|
682
698
|
append(str) {
|
|
683
699
|
this.#sql += str;
|
|
684
700
|
}
|
|
@@ -72,6 +72,8 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
|
|
|
72
72
|
notNull(): AlterTableAddColumnBuilder;
|
|
73
73
|
defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableAddColumnBuilder;
|
|
74
74
|
check(sql: string): AlterTableAddColumnBuilder;
|
|
75
|
+
generatedAlwaysAs(sql: string): AlterTableAddColumnBuilder;
|
|
76
|
+
stored(): AlterTableAddColumnBuilder;
|
|
75
77
|
toOperationNode(): AlterTableNode;
|
|
76
78
|
compile(): CompiledQuery;
|
|
77
79
|
execute(): Promise<void>;
|
|
@@ -91,6 +93,8 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
|
|
|
91
93
|
notNull(): AlterTableModifyColumnBuilder;
|
|
92
94
|
defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableModifyColumnBuilder;
|
|
93
95
|
check(sql: string): AlterTableModifyColumnBuilder;
|
|
96
|
+
generatedAlwaysAs(sql: string): AlterTableModifyColumnBuilder;
|
|
97
|
+
stored(): AlterTableModifyColumnBuilder;
|
|
94
98
|
toOperationNode(): AlterTableNode;
|
|
95
99
|
compile(): CompiledQuery;
|
|
96
100
|
execute(): Promise<void>;
|
|
@@ -244,6 +244,18 @@ class AlterTableAddColumnBuilder {
|
|
|
244
244
|
columnBuilder: this.#props.columnBuilder.check(sql),
|
|
245
245
|
});
|
|
246
246
|
}
|
|
247
|
+
generatedAlwaysAs(sql) {
|
|
248
|
+
return new AlterTableAddColumnBuilder({
|
|
249
|
+
...this.#props,
|
|
250
|
+
columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
stored() {
|
|
254
|
+
return new AlterTableAddColumnBuilder({
|
|
255
|
+
...this.#props,
|
|
256
|
+
columnBuilder: this.#props.columnBuilder.stored(),
|
|
257
|
+
});
|
|
258
|
+
}
|
|
247
259
|
toOperationNode() {
|
|
248
260
|
return this.#props.executor.transformQuery(alter_table_node_js_1.AlterTableNode.cloneWith(this.#props.alterTableNode, {
|
|
249
261
|
addColumn: add_column_node_js_1.AddColumnNode.create(this.#props.columnBuilder.toOperationNode()),
|
|
@@ -316,6 +328,18 @@ class AlterTableModifyColumnBuilder {
|
|
|
316
328
|
columnBuilder: this.#props.columnBuilder.check(sql),
|
|
317
329
|
});
|
|
318
330
|
}
|
|
331
|
+
generatedAlwaysAs(sql) {
|
|
332
|
+
return new AlterTableModifyColumnBuilder({
|
|
333
|
+
...this.#props,
|
|
334
|
+
columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
stored() {
|
|
338
|
+
return new AlterTableModifyColumnBuilder({
|
|
339
|
+
...this.#props,
|
|
340
|
+
columnBuilder: this.#props.columnBuilder.stored(),
|
|
341
|
+
});
|
|
342
|
+
}
|
|
319
343
|
toOperationNode() {
|
|
320
344
|
return this.#props.executor.transformQuery(alter_table_node_js_1.AlterTableNode.cloneWith(this.#props.alterTableNode, {
|
|
321
345
|
modifyColumn: modify_column_node_js_1.ModifyColumnNode.create(this.#props.columnBuilder.toOperationNode()),
|
|
@@ -40,10 +40,19 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
40
40
|
* column definition (like MySQL 5) you need to call the table level
|
|
41
41
|
* {@link TableBuilder.addForeignKeyConstraint} method instead.
|
|
42
42
|
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* col.references('person.id').onDelete('cascade')
|
|
46
|
+
* ```
|
|
43
47
|
*/
|
|
44
48
|
onDelete(onDelete: OnModifyForeignAction): R;
|
|
45
49
|
/**
|
|
46
50
|
* Adds an `on update` constraint for the foreign key column.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* col.references('person.id').onUpdate('cascade')
|
|
55
|
+
* ```
|
|
47
56
|
*/
|
|
48
57
|
onUpdate(onUpdate: OnModifyForeignAction): R;
|
|
49
58
|
/**
|
|
@@ -78,6 +87,36 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
78
87
|
* ```
|
|
79
88
|
*/
|
|
80
89
|
check(sql: string): R;
|
|
90
|
+
/**
|
|
91
|
+
* Makes the column a generated column using a `generated always as` statement.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* db.schema
|
|
96
|
+
* .createTable('person')
|
|
97
|
+
* .addColumn('full_name', 'varchar(255)',
|
|
98
|
+
* (col) => col.generatedAlwaysAs("concat(first_name, ' ', last_name)")
|
|
99
|
+
* )
|
|
100
|
+
* .execute()
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
generatedAlwaysAs(sql: string): R;
|
|
104
|
+
/**
|
|
105
|
+
* Makes a generated column stored instead of virtual. This method can only
|
|
106
|
+
* be used with {@link generatedAlwaysAs}
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* db.schema
|
|
111
|
+
* .createTable('person')
|
|
112
|
+
* .addColumn('full_name', 'varchar(255)', (col) => col
|
|
113
|
+
* .generatedAlwaysAs("concat(first_name, ' ', last_name)")
|
|
114
|
+
* .stored()
|
|
115
|
+
* )
|
|
116
|
+
* .execute()
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
stored(): R;
|
|
81
120
|
}
|
|
82
121
|
export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderInterface<ColumnDefinitionBuilder>, OperationNodeSource {
|
|
83
122
|
#private;
|
|
@@ -91,5 +130,7 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
|
|
|
91
130
|
notNull(): ColumnDefinitionBuilder;
|
|
92
131
|
defaultTo(value: DefaultValueExpression): ColumnDefinitionBuilder;
|
|
93
132
|
check(sql: string): ColumnDefinitionBuilder;
|
|
133
|
+
generatedAlwaysAs(sql: string): ColumnDefinitionBuilder;
|
|
134
|
+
stored(): ColumnDefinitionBuilder;
|
|
94
135
|
toOperationNode(): ColumnDefinitionNode;
|
|
95
136
|
}
|
|
@@ -9,6 +9,8 @@ const reference_parser_js_1 = require("../parser/reference-parser.js");
|
|
|
9
9
|
const prevent_await_js_1 = require("../util/prevent-await.js");
|
|
10
10
|
const column_definition_node_js_1 = require("../operation-node/column-definition-node.js");
|
|
11
11
|
const default_value_parser_js_1 = require("../parser/default-value-parser.js");
|
|
12
|
+
const generated_always_as_node_js_1 = require("../operation-node/generated-always-as-node.js");
|
|
13
|
+
const default_value_node_js_1 = require("../operation-node/default-value-node.js");
|
|
12
14
|
class ColumnDefinitionBuilder {
|
|
13
15
|
#node;
|
|
14
16
|
constructor(node) {
|
|
@@ -55,7 +57,7 @@ class ColumnDefinitionBuilder {
|
|
|
55
57
|
}
|
|
56
58
|
defaultTo(value) {
|
|
57
59
|
return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, {
|
|
58
|
-
defaultTo: (0, default_value_parser_js_1.parseDefaultValueExpression)(value),
|
|
60
|
+
defaultTo: default_value_node_js_1.DefaultValueNode.create((0, default_value_parser_js_1.parseDefaultValueExpression)(value)),
|
|
59
61
|
}));
|
|
60
62
|
}
|
|
61
63
|
check(sql) {
|
|
@@ -63,6 +65,21 @@ class ColumnDefinitionBuilder {
|
|
|
63
65
|
check: check_constraint_node_js_1.CheckConstraintNode.create(sql),
|
|
64
66
|
}));
|
|
65
67
|
}
|
|
68
|
+
generatedAlwaysAs(sql) {
|
|
69
|
+
return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, {
|
|
70
|
+
generatedAlwaysAs: generated_always_as_node_js_1.GeneratedAlwaysAsNode.create(sql),
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
stored() {
|
|
74
|
+
if (!this.#node.generatedAlwaysAs) {
|
|
75
|
+
throw new Error('stored() can only be called after generatedAlwaysAs');
|
|
76
|
+
}
|
|
77
|
+
return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, {
|
|
78
|
+
generatedAlwaysAs: generated_always_as_node_js_1.GeneratedAlwaysAsNode.cloneWith(this.#node.generatedAlwaysAs, {
|
|
79
|
+
stored: true,
|
|
80
|
+
}),
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
66
83
|
toOperationNode() {
|
|
67
84
|
return this.#node;
|
|
68
85
|
}
|
|
@@ -27,8 +27,8 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
|
|
|
27
27
|
* await db.schema
|
|
28
28
|
* .createTable('person')
|
|
29
29
|
* .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
|
|
30
|
-
* .addColumn('first_name', 'varchar(50), (col) => col.notNull())
|
|
31
|
-
* .addColumn('last_name', 'varchar')
|
|
30
|
+
* .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
|
|
31
|
+
* .addColumn('last_name', 'varchar(255)')
|
|
32
32
|
* .addColumn('bank_balance', 'numeric(8, 2)')
|
|
33
33
|
* .addColumn('data', db.raw('customtype'))
|
|
34
34
|
* .addColumn('parent_id', 'integer', (col) =>
|
|
@@ -37,11 +37,10 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
|
|
|
37
37
|
* ```
|
|
38
38
|
*
|
|
39
39
|
* With this method, it's once again good to remember that Kysely just builds the query
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* the next example:
|
|
40
|
+
* and doesn't provide the same API for all databses. For example, some databases like
|
|
41
|
+
* older MySQL don't support `references` statement in the column definition. Instead
|
|
42
|
+
* foreign key constraints need to be defined in at the level of the `create table`
|
|
43
|
+
* query. See the next example:
|
|
45
44
|
*
|
|
46
45
|
* @example
|
|
47
46
|
* ```ts
|
|
@@ -41,8 +41,8 @@ class CreateTableBuilder {
|
|
|
41
41
|
* await db.schema
|
|
42
42
|
* .createTable('person')
|
|
43
43
|
* .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
|
|
44
|
-
* .addColumn('first_name', 'varchar(50), (col) => col.notNull())
|
|
45
|
-
* .addColumn('last_name', 'varchar')
|
|
44
|
+
* .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
|
|
45
|
+
* .addColumn('last_name', 'varchar(255)')
|
|
46
46
|
* .addColumn('bank_balance', 'numeric(8, 2)')
|
|
47
47
|
* .addColumn('data', db.raw('customtype'))
|
|
48
48
|
* .addColumn('parent_id', 'integer', (col) =>
|
|
@@ -51,11 +51,10 @@ class CreateTableBuilder {
|
|
|
51
51
|
* ```
|
|
52
52
|
*
|
|
53
53
|
* With this method, it's once again good to remember that Kysely just builds the query
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* the next example:
|
|
54
|
+
* and doesn't provide the same API for all databses. For example, some databases like
|
|
55
|
+
* older MySQL don't support `references` statement in the column definition. Instead
|
|
56
|
+
* foreign key constraints need to be defined in at the level of the `create table`
|
|
57
|
+
* query. See the next example:
|
|
59
58
|
*
|
|
60
59
|
* @example
|
|
61
60
|
* ```ts
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function performanceNow(): number;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.performanceNow = void 0;
|
|
4
|
+
const object_utils_js_1 = require("./object-utils.js");
|
|
5
|
+
function performanceNow() {
|
|
6
|
+
if (typeof performance !== 'undefined' && (0, object_utils_js_1.isFunction)(performance.now)) {
|
|
7
|
+
return performance.now();
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
return Date.now();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.performanceNow = performanceNow;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { performanceNow } from '../util/performance-now.js';
|
|
1
2
|
/**
|
|
2
3
|
* A small wrapper around {@link Driver} that makes sure the driver is
|
|
3
4
|
* initialized before it is used, only initialized and destroyed
|
|
@@ -71,7 +72,7 @@ class RuntimeConnection {
|
|
|
71
72
|
this.#log = log;
|
|
72
73
|
}
|
|
73
74
|
async executeQuery(compiledQuery) {
|
|
74
|
-
const startTime =
|
|
75
|
+
const startTime = performanceNow();
|
|
75
76
|
try {
|
|
76
77
|
return await this.#connection.executeQuery(compiledQuery);
|
|
77
78
|
}
|
|
@@ -97,8 +98,6 @@ class RuntimeConnection {
|
|
|
97
98
|
}));
|
|
98
99
|
}
|
|
99
100
|
#calculateDurationMillis(startTime) {
|
|
100
|
-
|
|
101
|
-
const durationNanos = Number(endTime - startTime);
|
|
102
|
-
return durationNanos / 1_000_000;
|
|
101
|
+
return performanceNow() - startTime;
|
|
103
102
|
}
|
|
104
103
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { CheckConstraintNode } from './check-constraint-node.js';
|
|
2
2
|
import { ColumnNode } from './column-node.js';
|
|
3
3
|
import { DataTypeNode } from './data-type-node.js';
|
|
4
|
+
import { DefaultValueNode } from './default-value-node.js';
|
|
5
|
+
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
|
|
4
6
|
import { OperationNode } from './operation-node.js';
|
|
5
7
|
import { RawNode } from './raw-node.js';
|
|
6
8
|
import { ReferencesNode } from './references-node.js';
|
|
7
|
-
import { ValueNode } from './value-node.js';
|
|
8
9
|
export declare type ColumnDefinitionNodeProps = Omit<Partial<ColumnDefinitionNode>, 'kind'>;
|
|
9
10
|
export declare type ColumnDataTypeNode = DataTypeNode | RawNode;
|
|
10
11
|
export interface ColumnDefinitionNode extends OperationNode {
|
|
@@ -16,8 +17,9 @@ export interface ColumnDefinitionNode extends OperationNode {
|
|
|
16
17
|
readonly autoIncrement: boolean;
|
|
17
18
|
readonly unique: boolean;
|
|
18
19
|
readonly nullable: boolean;
|
|
19
|
-
readonly defaultTo?:
|
|
20
|
+
readonly defaultTo?: DefaultValueNode;
|
|
20
21
|
readonly check?: CheckConstraintNode;
|
|
22
|
+
readonly generatedAlwaysAs?: GeneratedAlwaysAsNode;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* @internal
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
import { RawNode } from './raw-node.js';
|
|
3
|
+
import { ValueNode } from './value-node.js';
|
|
4
|
+
export interface DefaultValueNode extends OperationNode {
|
|
5
|
+
readonly kind: 'DefaultValueNode';
|
|
6
|
+
readonly defaultValue: ValueNode | RawNode;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare const DefaultValueNode: Readonly<{
|
|
12
|
+
is(node: OperationNode): node is DefaultValueNode;
|
|
13
|
+
create(defaultValue: ValueNode | RawNode): DefaultValueNode;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { freeze } from '../util/object-utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export const DefaultValueNode = freeze({
|
|
6
|
+
is(node) {
|
|
7
|
+
return node.kind === 'DefaultValueNode';
|
|
8
|
+
},
|
|
9
|
+
create(defaultValue) {
|
|
10
|
+
return freeze({
|
|
11
|
+
kind: 'DefaultValueNode',
|
|
12
|
+
defaultValue,
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
import { RawNode } from './raw-node.js';
|
|
3
|
+
export declare type GeneratedAlwaysAsNodeParams = Omit<GeneratedAlwaysAsNode, 'kind' | 'expression'>;
|
|
4
|
+
export interface GeneratedAlwaysAsNode extends OperationNode {
|
|
5
|
+
readonly kind: 'GeneratedAlwaysAsNode';
|
|
6
|
+
readonly expression: RawNode;
|
|
7
|
+
readonly stored?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare const GeneratedAlwaysAsNode: Readonly<{
|
|
13
|
+
is(node: OperationNode): node is GeneratedAlwaysAsNode;
|
|
14
|
+
create(expression: string): GeneratedAlwaysAsNode;
|
|
15
|
+
cloneWith(node: GeneratedAlwaysAsNode, params: GeneratedAlwaysAsNodeParams): GeneratedAlwaysAsNode;
|
|
16
|
+
}>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { freeze } from '../util/object-utils.js';
|
|
2
|
+
import { RawNode } from './raw-node.js';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export const GeneratedAlwaysAsNode = freeze({
|
|
7
|
+
is(node) {
|
|
8
|
+
return node.kind === 'GeneratedAlwaysAsNode';
|
|
9
|
+
},
|
|
10
|
+
create(expression) {
|
|
11
|
+
return freeze({
|
|
12
|
+
kind: 'GeneratedAlwaysAsNode',
|
|
13
|
+
expression: RawNode.createWithSql(expression),
|
|
14
|
+
});
|
|
15
|
+
},
|
|
16
|
+
cloneWith(node, params) {
|
|
17
|
+
return freeze({
|
|
18
|
+
...node,
|
|
19
|
+
...params,
|
|
20
|
+
});
|
|
21
|
+
},
|
|
22
|
+
});
|
|
@@ -60,6 +60,8 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
|
|
|
60
60
|
import { UnionNode } from './union-node.js';
|
|
61
61
|
import { CreateViewNode } from './create-view-node.js';
|
|
62
62
|
import { DropViewNode } from './drop-view-node.js';
|
|
63
|
+
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
|
|
64
|
+
import { DefaultValueNode } from './default-value-node.js';
|
|
63
65
|
/**
|
|
64
66
|
* Transforms an operation node tree into another one.
|
|
65
67
|
*
|
|
@@ -149,6 +151,8 @@ export declare class OperationNodeTransformer {
|
|
|
149
151
|
protected transformDropConstraint(node: DropConstraintNode): DropConstraintNode;
|
|
150
152
|
protected transformCreateView(node: CreateViewNode): CreateViewNode;
|
|
151
153
|
protected transformDropView(node: DropViewNode): DropViewNode;
|
|
154
|
+
protected transformGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): GeneratedAlwaysAsNode;
|
|
155
|
+
protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode;
|
|
152
156
|
protected transformDataType(node: DataTypeNode): DataTypeNode;
|
|
153
157
|
protected transformSelectAll(node: SelectAllNode): SelectAllNode;
|
|
154
158
|
protected transformIdentifier(node: IdentifierNode): IdentifierNode;
|
|
@@ -30,7 +30,7 @@ import { freeze } from '../util/object-utils.js';
|
|
|
30
30
|
*/
|
|
31
31
|
export class OperationNodeTransformer {
|
|
32
32
|
nodeStack = [];
|
|
33
|
-
#transformers = {
|
|
33
|
+
#transformers = freeze({
|
|
34
34
|
AliasNode: this.transformAlias.bind(this),
|
|
35
35
|
ColumnNode: this.transformColumn.bind(this),
|
|
36
36
|
IdentifierNode: this.transformIdentifier.bind(this),
|
|
@@ -92,7 +92,9 @@ export class OperationNodeTransformer {
|
|
|
92
92
|
UnionNode: this.transformUnion.bind(this),
|
|
93
93
|
CreateViewNode: this.transformCreateView.bind(this),
|
|
94
94
|
DropViewNode: this.transformDropView.bind(this),
|
|
95
|
-
|
|
95
|
+
GeneratedAlwaysAsNode: this.transformGeneratedAlwaysAs.bind(this),
|
|
96
|
+
DefaultValueNode: this.transformDefaultValue.bind(this),
|
|
97
|
+
});
|
|
96
98
|
transformNode = (node) => {
|
|
97
99
|
if (!node) {
|
|
98
100
|
return undefined;
|
|
@@ -271,6 +273,7 @@ export class OperationNodeTransformer {
|
|
|
271
273
|
nullable: node.nullable,
|
|
272
274
|
defaultTo: this.transformNode(node.defaultTo),
|
|
273
275
|
check: this.transformNode(node.check),
|
|
276
|
+
generatedAlwaysAs: this.transformNode(node.generatedAlwaysAs),
|
|
274
277
|
};
|
|
275
278
|
}
|
|
276
279
|
transformAddColumn(node) {
|
|
@@ -535,6 +538,19 @@ export class OperationNodeTransformer {
|
|
|
535
538
|
materialized: node.materialized,
|
|
536
539
|
};
|
|
537
540
|
}
|
|
541
|
+
transformGeneratedAlwaysAs(node) {
|
|
542
|
+
return {
|
|
543
|
+
kind: 'GeneratedAlwaysAsNode',
|
|
544
|
+
expression: this.transformNode(node.expression),
|
|
545
|
+
stored: node.stored,
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
transformDefaultValue(node) {
|
|
549
|
+
return {
|
|
550
|
+
kind: 'DefaultValueNode',
|
|
551
|
+
defaultValue: this.transformNode(node.defaultValue),
|
|
552
|
+
};
|
|
553
|
+
}
|
|
538
554
|
transformDataType(node) {
|
|
539
555
|
// An Object.freezed leaf node. No need to clone.
|
|
540
556
|
return node;
|
|
@@ -60,6 +60,8 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
|
|
|
60
60
|
import { UnionNode } from './union-node.js';
|
|
61
61
|
import { CreateViewNode } from './create-view-node.js';
|
|
62
62
|
import { DropViewNode } from './drop-view-node.js';
|
|
63
|
+
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
|
|
64
|
+
import { DefaultValueNode } from './default-value-node.js';
|
|
63
65
|
export declare abstract class OperationNodeVisitor {
|
|
64
66
|
#private;
|
|
65
67
|
protected readonly nodeStack: OperationNode[];
|
|
@@ -125,4 +127,6 @@ export declare abstract class OperationNodeVisitor {
|
|
|
125
127
|
protected abstract visitOperator(node: OperatorNode): void;
|
|
126
128
|
protected abstract visitCreateView(node: CreateViewNode): void;
|
|
127
129
|
protected abstract visitDropView(node: DropViewNode): void;
|
|
130
|
+
protected abstract visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void;
|
|
131
|
+
protected abstract visitDefaultValue(node: DefaultValueNode): void;
|
|
128
132
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { freeze } from '../util/object-utils.js';
|
|
1
2
|
export class OperationNodeVisitor {
|
|
2
3
|
nodeStack = [];
|
|
3
|
-
#visitors = {
|
|
4
|
+
#visitors = freeze({
|
|
4
5
|
AliasNode: this.visitAlias.bind(this),
|
|
5
6
|
ColumnNode: this.visitColumn.bind(this),
|
|
6
7
|
IdentifierNode: this.visitIdentifier.bind(this),
|
|
@@ -62,7 +63,9 @@ export class OperationNodeVisitor {
|
|
|
62
63
|
UnionNode: this.visitUnion.bind(this),
|
|
63
64
|
CreateViewNode: this.visitCreateView.bind(this),
|
|
64
65
|
DropViewNode: this.visitDropView.bind(this),
|
|
65
|
-
|
|
66
|
+
GeneratedAlwaysAsNode: this.visitGeneratedAlwaysAs.bind(this),
|
|
67
|
+
DefaultValueNode: this.visitDefaultValue.bind(this),
|
|
68
|
+
});
|
|
66
69
|
visitNode = (node) => {
|
|
67
70
|
this.nodeStack.push(node);
|
|
68
71
|
this.#visitors[node.kind](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';
|
|
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' | 'GeneratedAlwaysAsNode' | 'DefaultValueNode';
|
|
2
2
|
export interface OperationNode {
|
|
3
3
|
readonly kind: OperationNodeKind;
|
|
4
4
|
}
|
|
@@ -9,6 +9,6 @@ export interface RawNode extends OperationNode {
|
|
|
9
9
|
*/
|
|
10
10
|
export declare const RawNode: Readonly<{
|
|
11
11
|
is(node: OperationNode): node is RawNode;
|
|
12
|
-
create(sqlFragments: string
|
|
12
|
+
create(sqlFragments: ReadonlyArray<string>, params: ReadonlyArray<OperationNode>): RawNode;
|
|
13
13
|
createWithSql(sql: string): RawNode;
|
|
14
14
|
}>;
|
|
@@ -64,6 +64,8 @@ import { ColumnNode } from '../operation-node/column-node.js';
|
|
|
64
64
|
import { UnionNode } from '../operation-node/union-node.js';
|
|
65
65
|
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
66
66
|
import { DropViewNode } from '../operation-node/drop-view-node.js';
|
|
67
|
+
import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js';
|
|
68
|
+
import { DefaultValueNode } from '../operation-node/default-value-node.js';
|
|
67
69
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
68
70
|
#private;
|
|
69
71
|
protected get numParameters(): number;
|
|
@@ -134,6 +136,8 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
134
136
|
protected visitUnion(node: UnionNode): void;
|
|
135
137
|
protected visitCreateView(node: CreateViewNode): void;
|
|
136
138
|
protected visitDropView(node: DropViewNode): void;
|
|
139
|
+
protected visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void;
|
|
140
|
+
protected visitDefaultValue(node: DefaultValueNode): void;
|
|
137
141
|
protected append(str: string): void;
|
|
138
142
|
protected appendValue(parameter: unknown): void;
|
|
139
143
|
protected getLeftIdentifierWrapper(): string;
|
|
@@ -299,8 +299,12 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
299
299
|
this.visitNode(node.column);
|
|
300
300
|
this.append(' ');
|
|
301
301
|
this.visitNode(node.dataType);
|
|
302
|
+
if (node.generatedAlwaysAs) {
|
|
303
|
+
this.append(' ');
|
|
304
|
+
this.visitNode(node.generatedAlwaysAs);
|
|
305
|
+
}
|
|
302
306
|
if (node.defaultTo) {
|
|
303
|
-
this.append('
|
|
307
|
+
this.append(' ');
|
|
304
308
|
this.visitNode(node.defaultTo);
|
|
305
309
|
}
|
|
306
310
|
if (!node.nullable) {
|
|
@@ -676,6 +680,18 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
676
680
|
}
|
|
677
681
|
this.visitNode(node.name);
|
|
678
682
|
}
|
|
683
|
+
visitGeneratedAlwaysAs(node) {
|
|
684
|
+
this.append('generated always as (');
|
|
685
|
+
this.visitNode(node.expression);
|
|
686
|
+
this.append(')');
|
|
687
|
+
if (node.stored) {
|
|
688
|
+
this.append(' stored');
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
visitDefaultValue(node) {
|
|
692
|
+
this.append('default ');
|
|
693
|
+
this.visitNode(node.defaultValue);
|
|
694
|
+
}
|
|
679
695
|
append(str) {
|
|
680
696
|
this.#sql += str;
|
|
681
697
|
}
|
|
@@ -72,6 +72,8 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
|
|
|
72
72
|
notNull(): AlterTableAddColumnBuilder;
|
|
73
73
|
defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableAddColumnBuilder;
|
|
74
74
|
check(sql: string): AlterTableAddColumnBuilder;
|
|
75
|
+
generatedAlwaysAs(sql: string): AlterTableAddColumnBuilder;
|
|
76
|
+
stored(): AlterTableAddColumnBuilder;
|
|
75
77
|
toOperationNode(): AlterTableNode;
|
|
76
78
|
compile(): CompiledQuery;
|
|
77
79
|
execute(): Promise<void>;
|
|
@@ -91,6 +93,8 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
|
|
|
91
93
|
notNull(): AlterTableModifyColumnBuilder;
|
|
92
94
|
defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableModifyColumnBuilder;
|
|
93
95
|
check(sql: string): AlterTableModifyColumnBuilder;
|
|
96
|
+
generatedAlwaysAs(sql: string): AlterTableModifyColumnBuilder;
|
|
97
|
+
stored(): AlterTableModifyColumnBuilder;
|
|
94
98
|
toOperationNode(): AlterTableNode;
|
|
95
99
|
compile(): CompiledQuery;
|
|
96
100
|
execute(): Promise<void>;
|
|
@@ -238,6 +238,18 @@ export class AlterTableAddColumnBuilder {
|
|
|
238
238
|
columnBuilder: this.#props.columnBuilder.check(sql),
|
|
239
239
|
});
|
|
240
240
|
}
|
|
241
|
+
generatedAlwaysAs(sql) {
|
|
242
|
+
return new AlterTableAddColumnBuilder({
|
|
243
|
+
...this.#props,
|
|
244
|
+
columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
stored() {
|
|
248
|
+
return new AlterTableAddColumnBuilder({
|
|
249
|
+
...this.#props,
|
|
250
|
+
columnBuilder: this.#props.columnBuilder.stored(),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
241
253
|
toOperationNode() {
|
|
242
254
|
return this.#props.executor.transformQuery(AlterTableNode.cloneWith(this.#props.alterTableNode, {
|
|
243
255
|
addColumn: AddColumnNode.create(this.#props.columnBuilder.toOperationNode()),
|
|
@@ -309,6 +321,18 @@ export class AlterTableModifyColumnBuilder {
|
|
|
309
321
|
columnBuilder: this.#props.columnBuilder.check(sql),
|
|
310
322
|
});
|
|
311
323
|
}
|
|
324
|
+
generatedAlwaysAs(sql) {
|
|
325
|
+
return new AlterTableModifyColumnBuilder({
|
|
326
|
+
...this.#props,
|
|
327
|
+
columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
stored() {
|
|
331
|
+
return new AlterTableModifyColumnBuilder({
|
|
332
|
+
...this.#props,
|
|
333
|
+
columnBuilder: this.#props.columnBuilder.stored(),
|
|
334
|
+
});
|
|
335
|
+
}
|
|
312
336
|
toOperationNode() {
|
|
313
337
|
return this.#props.executor.transformQuery(AlterTableNode.cloneWith(this.#props.alterTableNode, {
|
|
314
338
|
modifyColumn: ModifyColumnNode.create(this.#props.columnBuilder.toOperationNode()),
|
|
@@ -40,10 +40,19 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
40
40
|
* column definition (like MySQL 5) you need to call the table level
|
|
41
41
|
* {@link TableBuilder.addForeignKeyConstraint} method instead.
|
|
42
42
|
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* col.references('person.id').onDelete('cascade')
|
|
46
|
+
* ```
|
|
43
47
|
*/
|
|
44
48
|
onDelete(onDelete: OnModifyForeignAction): R;
|
|
45
49
|
/**
|
|
46
50
|
* Adds an `on update` constraint for the foreign key column.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* col.references('person.id').onUpdate('cascade')
|
|
55
|
+
* ```
|
|
47
56
|
*/
|
|
48
57
|
onUpdate(onUpdate: OnModifyForeignAction): R;
|
|
49
58
|
/**
|
|
@@ -78,6 +87,36 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
78
87
|
* ```
|
|
79
88
|
*/
|
|
80
89
|
check(sql: string): R;
|
|
90
|
+
/**
|
|
91
|
+
* Makes the column a generated column using a `generated always as` statement.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* db.schema
|
|
96
|
+
* .createTable('person')
|
|
97
|
+
* .addColumn('full_name', 'varchar(255)',
|
|
98
|
+
* (col) => col.generatedAlwaysAs("concat(first_name, ' ', last_name)")
|
|
99
|
+
* )
|
|
100
|
+
* .execute()
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
generatedAlwaysAs(sql: string): R;
|
|
104
|
+
/**
|
|
105
|
+
* Makes a generated column stored instead of virtual. This method can only
|
|
106
|
+
* be used with {@link generatedAlwaysAs}
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* db.schema
|
|
111
|
+
* .createTable('person')
|
|
112
|
+
* .addColumn('full_name', 'varchar(255)', (col) => col
|
|
113
|
+
* .generatedAlwaysAs("concat(first_name, ' ', last_name)")
|
|
114
|
+
* .stored()
|
|
115
|
+
* )
|
|
116
|
+
* .execute()
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
stored(): R;
|
|
81
120
|
}
|
|
82
121
|
export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderInterface<ColumnDefinitionBuilder>, OperationNodeSource {
|
|
83
122
|
#private;
|
|
@@ -91,5 +130,7 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
|
|
|
91
130
|
notNull(): ColumnDefinitionBuilder;
|
|
92
131
|
defaultTo(value: DefaultValueExpression): ColumnDefinitionBuilder;
|
|
93
132
|
check(sql: string): ColumnDefinitionBuilder;
|
|
133
|
+
generatedAlwaysAs(sql: string): ColumnDefinitionBuilder;
|
|
134
|
+
stored(): ColumnDefinitionBuilder;
|
|
94
135
|
toOperationNode(): ColumnDefinitionNode;
|
|
95
136
|
}
|
|
@@ -6,6 +6,8 @@ import { parseStringReference } from '../parser/reference-parser.js';
|
|
|
6
6
|
import { preventAwait } from '../util/prevent-await.js';
|
|
7
7
|
import { ColumnDefinitionNode } from '../operation-node/column-definition-node.js';
|
|
8
8
|
import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
|
|
9
|
+
import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js';
|
|
10
|
+
import { DefaultValueNode } from '../operation-node/default-value-node.js';
|
|
9
11
|
export class ColumnDefinitionBuilder {
|
|
10
12
|
#node;
|
|
11
13
|
constructor(node) {
|
|
@@ -52,7 +54,7 @@ export class ColumnDefinitionBuilder {
|
|
|
52
54
|
}
|
|
53
55
|
defaultTo(value) {
|
|
54
56
|
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
55
|
-
defaultTo: parseDefaultValueExpression(value),
|
|
57
|
+
defaultTo: DefaultValueNode.create(parseDefaultValueExpression(value)),
|
|
56
58
|
}));
|
|
57
59
|
}
|
|
58
60
|
check(sql) {
|
|
@@ -60,6 +62,21 @@ export class ColumnDefinitionBuilder {
|
|
|
60
62
|
check: CheckConstraintNode.create(sql),
|
|
61
63
|
}));
|
|
62
64
|
}
|
|
65
|
+
generatedAlwaysAs(sql) {
|
|
66
|
+
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
67
|
+
generatedAlwaysAs: GeneratedAlwaysAsNode.create(sql),
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
stored() {
|
|
71
|
+
if (!this.#node.generatedAlwaysAs) {
|
|
72
|
+
throw new Error('stored() can only be called after generatedAlwaysAs');
|
|
73
|
+
}
|
|
74
|
+
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
75
|
+
generatedAlwaysAs: GeneratedAlwaysAsNode.cloneWith(this.#node.generatedAlwaysAs, {
|
|
76
|
+
stored: true,
|
|
77
|
+
}),
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
63
80
|
toOperationNode() {
|
|
64
81
|
return this.#node;
|
|
65
82
|
}
|
|
@@ -27,8 +27,8 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
|
|
|
27
27
|
* await db.schema
|
|
28
28
|
* .createTable('person')
|
|
29
29
|
* .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
|
|
30
|
-
* .addColumn('first_name', 'varchar(50), (col) => col.notNull())
|
|
31
|
-
* .addColumn('last_name', 'varchar')
|
|
30
|
+
* .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
|
|
31
|
+
* .addColumn('last_name', 'varchar(255)')
|
|
32
32
|
* .addColumn('bank_balance', 'numeric(8, 2)')
|
|
33
33
|
* .addColumn('data', db.raw('customtype'))
|
|
34
34
|
* .addColumn('parent_id', 'integer', (col) =>
|
|
@@ -37,11 +37,10 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
|
|
|
37
37
|
* ```
|
|
38
38
|
*
|
|
39
39
|
* With this method, it's once again good to remember that Kysely just builds the query
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* the next example:
|
|
40
|
+
* and doesn't provide the same API for all databses. For example, some databases like
|
|
41
|
+
* older MySQL don't support `references` statement in the column definition. Instead
|
|
42
|
+
* foreign key constraints need to be defined in at the level of the `create table`
|
|
43
|
+
* query. See the next example:
|
|
45
44
|
*
|
|
46
45
|
* @example
|
|
47
46
|
* ```ts
|
|
@@ -38,8 +38,8 @@ export class CreateTableBuilder {
|
|
|
38
38
|
* await db.schema
|
|
39
39
|
* .createTable('person')
|
|
40
40
|
* .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
|
|
41
|
-
* .addColumn('first_name', 'varchar(50), (col) => col.notNull())
|
|
42
|
-
* .addColumn('last_name', 'varchar')
|
|
41
|
+
* .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
|
|
42
|
+
* .addColumn('last_name', 'varchar(255)')
|
|
43
43
|
* .addColumn('bank_balance', 'numeric(8, 2)')
|
|
44
44
|
* .addColumn('data', db.raw('customtype'))
|
|
45
45
|
* .addColumn('parent_id', 'integer', (col) =>
|
|
@@ -48,11 +48,10 @@ export class CreateTableBuilder {
|
|
|
48
48
|
* ```
|
|
49
49
|
*
|
|
50
50
|
* With this method, it's once again good to remember that Kysely just builds the query
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* the next example:
|
|
51
|
+
* and doesn't provide the same API for all databses. For example, some databases like
|
|
52
|
+
* older MySQL don't support `references` statement in the column definition. Instead
|
|
53
|
+
* foreign key constraints need to be defined in at the level of the `create table`
|
|
54
|
+
* query. See the next example:
|
|
56
55
|
*
|
|
57
56
|
* @example
|
|
58
57
|
* ```ts
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function performanceNow(): number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kysely",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Type safe SQL query builder",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -47,9 +47,9 @@
|
|
|
47
47
|
"mocha": "^9.1.3",
|
|
48
48
|
"mysql2": "^2.3.3",
|
|
49
49
|
"pg": "^8.7.1",
|
|
50
|
-
"prettier": "^2.
|
|
50
|
+
"prettier": "^2.5.1",
|
|
51
51
|
"tsd": "^0.19.0",
|
|
52
|
-
"typedoc": "^0.22.
|
|
52
|
+
"typedoc": "^0.22.10",
|
|
53
53
|
"typescript": "4.5.2"
|
|
54
54
|
}
|
|
55
55
|
}
|