kysely 0.21.6 → 0.22.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 +2 -2
- package/dist/cjs/index.d.ts +9 -4
- package/dist/cjs/index.js +7 -2
- package/dist/cjs/kysely.d.ts +3 -3
- package/dist/cjs/kysely.js +3 -3
- package/dist/cjs/migration/file-migration-provider.js +7 -2
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +22 -0
- package/dist/cjs/operation-node/aggregate-function-node.js +31 -0
- package/dist/cjs/operation-node/alias-node.d.ts +2 -1
- package/dist/cjs/operation-node/group-by-node.d.ts +1 -1
- package/dist/cjs/operation-node/group-by-node.js +3 -3
- package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +10 -2
- package/dist/cjs/operation-node/operation-node-transformer.js +38 -5
- package/dist/cjs/operation-node/operation-node-utils.d.ts +2 -1
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +10 -2
- package/dist/cjs/operation-node/operation-node-visitor.js +5 -1
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/over-node.d.ts +19 -0
- package/dist/cjs/operation-node/over-node.js +35 -0
- package/dist/cjs/operation-node/partition-by-item-node.d.ts +14 -0
- package/dist/cjs/operation-node/{union-node.js → partition-by-item-node.js} +6 -7
- package/dist/cjs/operation-node/partition-by-node.d.ts +14 -0
- package/dist/cjs/operation-node/partition-by-node.js +24 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +3 -3
- package/dist/cjs/operation-node/select-query-node.js +4 -4
- package/dist/cjs/operation-node/set-operation-node.d.ts +18 -0
- package/dist/cjs/operation-node/set-operation-node.js +20 -0
- package/dist/cjs/operation-node/value-list-node.d.ts +2 -1
- package/dist/cjs/parser/complex-expression-parser.d.ts +6 -4
- package/dist/cjs/parser/group-by-parser.d.ts +1 -1
- package/dist/cjs/parser/group-by-parser.js +2 -2
- package/dist/cjs/parser/parse-utils.d.ts +2 -0
- package/dist/cjs/parser/parse-utils.js +9 -1
- package/dist/cjs/parser/partition-by-parser.d.ts +6 -0
- package/dist/cjs/parser/partition-by-parser.js +9 -0
- package/dist/cjs/parser/reference-parser.d.ts +2 -1
- package/dist/cjs/parser/select-parser.d.ts +4 -3
- package/dist/cjs/parser/set-operation-parser.d.ts +5 -0
- package/dist/cjs/parser/set-operation-parser.js +8 -0
- package/dist/cjs/parser/value-parser.d.ts +2 -1
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +117 -0
- package/dist/cjs/query-builder/aggregate-function-builder.js +146 -0
- package/dist/cjs/query-builder/expression-builder.d.ts +3 -3
- package/dist/cjs/query-builder/expression-builder.js +3 -3
- package/dist/cjs/query-builder/{function-builder.d.ts → function-module.d.ts} +49 -42
- package/dist/cjs/query-builder/{function-builder.js → function-module.js} +70 -59
- package/dist/cjs/query-builder/over-builder.d.ts +59 -0
- package/dist/cjs/query-builder/over-builder.js +50 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +63 -3
- package/dist/cjs/query-builder/select-query-builder.js +83 -3
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +10 -2
- package/dist/cjs/query-compiler/default-query-compiler.js +41 -14
- package/dist/cjs/raw-builder/sql.d.ts +13 -5
- package/dist/cjs/raw-builder/sql.js +6 -0
- package/dist/cjs/util/type-utils.d.ts +4 -0
- package/dist/esm/index.d.ts +9 -4
- package/dist/esm/index.js +7 -2
- package/dist/esm/kysely.d.ts +3 -3
- package/dist/esm/kysely.js +3 -3
- package/dist/esm/migration/file-migration-provider.js +7 -2
- package/dist/esm/operation-node/aggregate-function-node.d.ts +22 -0
- package/dist/esm/operation-node/aggregate-function-node.js +29 -0
- package/dist/esm/operation-node/alias-node.d.ts +2 -1
- package/dist/esm/operation-node/group-by-node.d.ts +1 -1
- package/dist/esm/operation-node/group-by-node.js +3 -3
- package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +10 -2
- package/dist/esm/operation-node/operation-node-transformer.js +38 -5
- package/dist/esm/operation-node/operation-node-utils.d.ts +2 -1
- package/dist/esm/operation-node/operation-node-visitor.d.ts +10 -2
- package/dist/esm/operation-node/operation-node-visitor.js +5 -1
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/over-node.d.ts +19 -0
- package/dist/esm/operation-node/over-node.js +33 -0
- package/dist/esm/operation-node/partition-by-item-node.d.ts +14 -0
- package/dist/esm/operation-node/partition-by-item-node.js +16 -0
- package/dist/esm/operation-node/partition-by-node.d.ts +14 -0
- package/dist/esm/operation-node/partition-by-node.js +22 -0
- package/dist/esm/operation-node/select-query-node.d.ts +3 -3
- package/dist/esm/operation-node/select-query-node.js +4 -4
- package/dist/esm/operation-node/set-operation-node.d.ts +18 -0
- package/dist/esm/operation-node/set-operation-node.js +18 -0
- package/dist/esm/operation-node/value-list-node.d.ts +2 -1
- package/dist/esm/parser/complex-expression-parser.d.ts +6 -4
- package/dist/esm/parser/group-by-parser.d.ts +1 -1
- package/dist/esm/parser/group-by-parser.js +2 -2
- package/dist/esm/parser/parse-utils.d.ts +2 -0
- package/dist/esm/parser/parse-utils.js +7 -0
- package/dist/esm/parser/partition-by-parser.d.ts +6 -0
- package/dist/esm/parser/partition-by-parser.js +6 -0
- package/dist/esm/parser/reference-parser.d.ts +2 -1
- package/dist/esm/parser/select-parser.d.ts +4 -3
- package/dist/esm/parser/set-operation-parser.d.ts +5 -0
- package/dist/esm/parser/set-operation-parser.js +5 -0
- package/dist/esm/parser/value-parser.d.ts +2 -1
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +117 -0
- package/dist/esm/query-builder/aggregate-function-builder.js +142 -0
- package/dist/esm/query-builder/expression-builder.d.ts +3 -3
- package/dist/esm/query-builder/expression-builder.js +3 -3
- package/dist/esm/query-builder/{function-builder.d.ts → function-module.d.ts} +49 -42
- package/dist/esm/query-builder/{function-builder.js → function-module.js} +69 -58
- package/dist/esm/query-builder/over-builder.d.ts +59 -0
- package/dist/esm/query-builder/over-builder.js +47 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +63 -3
- package/dist/esm/query-builder/select-query-builder.js +83 -3
- package/dist/esm/query-compiler/default-query-compiler.d.ts +10 -2
- package/dist/esm/query-compiler/default-query-compiler.js +41 -14
- package/dist/esm/raw-builder/sql.d.ts +13 -5
- package/dist/esm/raw-builder/sql.js +6 -0
- package/dist/esm/util/type-utils.d.ts +4 -0
- package/package.json +4 -1
- package/dist/cjs/operation-node/union-node.d.ts +0 -16
- package/dist/cjs/parser/union-parser.d.ts +0 -5
- package/dist/cjs/parser/union-parser.js +0 -8
- package/dist/esm/operation-node/union-node.d.ts +0 -16
- package/dist/esm/operation-node/union-node.js +0 -17
- package/dist/esm/parser/union-parser.d.ts +0 -5
- package/dist/esm/parser/union-parser.js +0 -5
|
@@ -13,13 +13,13 @@ import { Compilable } from '../util/compilable.js';
|
|
|
13
13
|
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
14
14
|
import { QueryId } from '../util/query-id.js';
|
|
15
15
|
import { GroupByExpression } from '../parser/group-by-parser.js';
|
|
16
|
-
import { UnionExpression } from '../parser/union-parser.js';
|
|
17
16
|
import { KyselyPlugin } from '../plugin/kysely-plugin.js';
|
|
18
17
|
import { WhereInterface } from './where-interface.js';
|
|
19
18
|
import { NoResultErrorConstructor } from './no-result-error.js';
|
|
20
19
|
import { HavingInterface } from './having-interface.js';
|
|
21
20
|
import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
|
|
22
21
|
import { Explainable, ExplainFormat } from '../util/explainable.js';
|
|
22
|
+
import { SetOperationExpression } from '../parser/set-operation-parser.js';
|
|
23
23
|
export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, HavingInterface<DB, TB>, OperationNodeSource, Compilable, Explainable {
|
|
24
24
|
#private;
|
|
25
25
|
constructor(props: SelectQueryBuilderProps);
|
|
@@ -1202,7 +1202,7 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
1202
1202
|
* .orderBy('name')
|
|
1203
1203
|
* ```
|
|
1204
1204
|
*/
|
|
1205
|
-
union(expression:
|
|
1205
|
+
union(expression: SetOperationExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
|
|
1206
1206
|
/**
|
|
1207
1207
|
* Combines another select query or raw expression to this query using `union all`.
|
|
1208
1208
|
*
|
|
@@ -1217,7 +1217,67 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
1217
1217
|
* .orderBy('name')
|
|
1218
1218
|
* ```
|
|
1219
1219
|
*/
|
|
1220
|
-
unionAll(expression:
|
|
1220
|
+
unionAll(expression: SetOperationExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
|
|
1221
|
+
/**
|
|
1222
|
+
* Combines another select query or raw expression to this query using `intersect`.
|
|
1223
|
+
*
|
|
1224
|
+
* The output row type of the combined query must match `this` query.
|
|
1225
|
+
*
|
|
1226
|
+
* ### Examples
|
|
1227
|
+
*
|
|
1228
|
+
* ```ts
|
|
1229
|
+
* db.selectFrom('person')
|
|
1230
|
+
* .select(['id', 'first_name as name'])
|
|
1231
|
+
* .intersect(db.selectFrom('pet').select(['id', 'name']))
|
|
1232
|
+
* .orderBy('name')
|
|
1233
|
+
* ```
|
|
1234
|
+
*/
|
|
1235
|
+
intersect(expression: SetOperationExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
|
|
1236
|
+
/**
|
|
1237
|
+
* Combines another select query or raw expression to this query using `intersect all`.
|
|
1238
|
+
*
|
|
1239
|
+
* The output row type of the combined query must match `this` query.
|
|
1240
|
+
*
|
|
1241
|
+
* ### Examples
|
|
1242
|
+
*
|
|
1243
|
+
* ```ts
|
|
1244
|
+
* db.selectFrom('person')
|
|
1245
|
+
* .select(['id', 'first_name as name'])
|
|
1246
|
+
* .intersectAll(db.selectFrom('pet').select(['id', 'name']))
|
|
1247
|
+
* .orderBy('name')
|
|
1248
|
+
* ```
|
|
1249
|
+
*/
|
|
1250
|
+
intersectAll(expression: SetOperationExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
|
|
1251
|
+
/**
|
|
1252
|
+
* Combines another select query or raw expression to this query using `except`.
|
|
1253
|
+
*
|
|
1254
|
+
* The output row type of the combined query must match `this` query.
|
|
1255
|
+
*
|
|
1256
|
+
* ### Examples
|
|
1257
|
+
*
|
|
1258
|
+
* ```ts
|
|
1259
|
+
* db.selectFrom('person')
|
|
1260
|
+
* .select(['id', 'first_name as name'])
|
|
1261
|
+
* .except(db.selectFrom('pet').select(['id', 'name']))
|
|
1262
|
+
* .orderBy('name')
|
|
1263
|
+
* ```
|
|
1264
|
+
*/
|
|
1265
|
+
except(expression: SetOperationExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
|
|
1266
|
+
/**
|
|
1267
|
+
* Combines another select query or raw expression to this query using `except all`.
|
|
1268
|
+
*
|
|
1269
|
+
* The output row type of the combined query must match `this` query.
|
|
1270
|
+
*
|
|
1271
|
+
* ### Examples
|
|
1272
|
+
*
|
|
1273
|
+
* ```ts
|
|
1274
|
+
* db.selectFrom('person')
|
|
1275
|
+
* .select(['id', 'first_name as name'])
|
|
1276
|
+
* .exceptAll(db.selectFrom('pet').select(['id', 'name']))
|
|
1277
|
+
* .orderBy('name')
|
|
1278
|
+
* ```
|
|
1279
|
+
*/
|
|
1280
|
+
exceptAll(expression: SetOperationExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
|
|
1221
1281
|
/**
|
|
1222
1282
|
* Simply calls the given function passing `this` as the only argument.
|
|
1223
1283
|
*
|
|
@@ -12,10 +12,10 @@ import { LimitNode } from '../operation-node/limit-node.js';
|
|
|
12
12
|
import { OffsetNode } from '../operation-node/offset-node.js';
|
|
13
13
|
import { freeze } from '../util/object-utils.js';
|
|
14
14
|
import { parseGroupBy, } from '../parser/group-by-parser.js';
|
|
15
|
-
import { parseUnion } from '../parser/union-parser.js';
|
|
16
15
|
import { NoResultError } from './no-result-error.js';
|
|
17
16
|
import { IdentifierNode } from '../operation-node/identifier-node.js';
|
|
18
17
|
import { ExplainNode } from '../operation-node/explain-node.js';
|
|
18
|
+
import { parseSetOperation, } from '../parser/set-operation-parser.js';
|
|
19
19
|
export class SelectQueryBuilder {
|
|
20
20
|
#props;
|
|
21
21
|
constructor(props) {
|
|
@@ -470,7 +470,7 @@ export class SelectQueryBuilder {
|
|
|
470
470
|
union(expression) {
|
|
471
471
|
return new SelectQueryBuilder({
|
|
472
472
|
...this.#props,
|
|
473
|
-
queryNode: SelectQueryNode.
|
|
473
|
+
queryNode: SelectQueryNode.cloneWithSetOperation(this.#props.queryNode, parseSetOperation('union', expression, false)),
|
|
474
474
|
});
|
|
475
475
|
}
|
|
476
476
|
/**
|
|
@@ -490,7 +490,87 @@ export class SelectQueryBuilder {
|
|
|
490
490
|
unionAll(expression) {
|
|
491
491
|
return new SelectQueryBuilder({
|
|
492
492
|
...this.#props,
|
|
493
|
-
queryNode: SelectQueryNode.
|
|
493
|
+
queryNode: SelectQueryNode.cloneWithSetOperation(this.#props.queryNode, parseSetOperation('union', expression, true)),
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Combines another select query or raw expression to this query using `intersect`.
|
|
498
|
+
*
|
|
499
|
+
* The output row type of the combined query must match `this` query.
|
|
500
|
+
*
|
|
501
|
+
* ### Examples
|
|
502
|
+
*
|
|
503
|
+
* ```ts
|
|
504
|
+
* db.selectFrom('person')
|
|
505
|
+
* .select(['id', 'first_name as name'])
|
|
506
|
+
* .intersect(db.selectFrom('pet').select(['id', 'name']))
|
|
507
|
+
* .orderBy('name')
|
|
508
|
+
* ```
|
|
509
|
+
*/
|
|
510
|
+
intersect(expression) {
|
|
511
|
+
return new SelectQueryBuilder({
|
|
512
|
+
...this.#props,
|
|
513
|
+
queryNode: SelectQueryNode.cloneWithSetOperation(this.#props.queryNode, parseSetOperation('intersect', expression, false)),
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Combines another select query or raw expression to this query using `intersect all`.
|
|
518
|
+
*
|
|
519
|
+
* The output row type of the combined query must match `this` query.
|
|
520
|
+
*
|
|
521
|
+
* ### Examples
|
|
522
|
+
*
|
|
523
|
+
* ```ts
|
|
524
|
+
* db.selectFrom('person')
|
|
525
|
+
* .select(['id', 'first_name as name'])
|
|
526
|
+
* .intersectAll(db.selectFrom('pet').select(['id', 'name']))
|
|
527
|
+
* .orderBy('name')
|
|
528
|
+
* ```
|
|
529
|
+
*/
|
|
530
|
+
intersectAll(expression) {
|
|
531
|
+
return new SelectQueryBuilder({
|
|
532
|
+
...this.#props,
|
|
533
|
+
queryNode: SelectQueryNode.cloneWithSetOperation(this.#props.queryNode, parseSetOperation('intersect', expression, true)),
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Combines another select query or raw expression to this query using `except`.
|
|
538
|
+
*
|
|
539
|
+
* The output row type of the combined query must match `this` query.
|
|
540
|
+
*
|
|
541
|
+
* ### Examples
|
|
542
|
+
*
|
|
543
|
+
* ```ts
|
|
544
|
+
* db.selectFrom('person')
|
|
545
|
+
* .select(['id', 'first_name as name'])
|
|
546
|
+
* .except(db.selectFrom('pet').select(['id', 'name']))
|
|
547
|
+
* .orderBy('name')
|
|
548
|
+
* ```
|
|
549
|
+
*/
|
|
550
|
+
except(expression) {
|
|
551
|
+
return new SelectQueryBuilder({
|
|
552
|
+
...this.#props,
|
|
553
|
+
queryNode: SelectQueryNode.cloneWithSetOperation(this.#props.queryNode, parseSetOperation('except', expression, false)),
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Combines another select query or raw expression to this query using `except all`.
|
|
558
|
+
*
|
|
559
|
+
* The output row type of the combined query must match `this` query.
|
|
560
|
+
*
|
|
561
|
+
* ### Examples
|
|
562
|
+
*
|
|
563
|
+
* ```ts
|
|
564
|
+
* db.selectFrom('person')
|
|
565
|
+
* .select(['id', 'first_name as name'])
|
|
566
|
+
* .exceptAll(db.selectFrom('pet').select(['id', 'name']))
|
|
567
|
+
* .orderBy('name')
|
|
568
|
+
* ```
|
|
569
|
+
*/
|
|
570
|
+
exceptAll(expression) {
|
|
571
|
+
return new SelectQueryBuilder({
|
|
572
|
+
...this.#props,
|
|
573
|
+
queryNode: SelectQueryNode.cloneWithSetOperation(this.#props.queryNode, parseSetOperation('except', expression, true)),
|
|
494
574
|
});
|
|
495
575
|
}
|
|
496
576
|
/**
|
|
@@ -60,7 +60,6 @@ import { ColumnDefinitionNode } from '../operation-node/column-definition-node.j
|
|
|
60
60
|
import { ModifyColumnNode } from '../operation-node/modify-column-node.js';
|
|
61
61
|
import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
|
|
62
62
|
import { ColumnNode } from '../operation-node/column-node.js';
|
|
63
|
-
import { UnionNode } from '../operation-node/union-node.js';
|
|
64
63
|
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
65
64
|
import { DropViewNode } from '../operation-node/drop-view-node.js';
|
|
66
65
|
import { GeneratedNode } from '../operation-node/generated-node.js';
|
|
@@ -74,6 +73,11 @@ import { DropTypeNode } from '../operation-node/drop-type-node.js';
|
|
|
74
73
|
import { ExplainNode } from '../operation-node/explain-node.js';
|
|
75
74
|
import { SchemableIdentifierNode } from '../operation-node/schemable-identifier-node.js';
|
|
76
75
|
import { DefaultInsertValueNode } from '../operation-node/default-insert-value-node.js';
|
|
76
|
+
import { AggregateFunctionNode } from '../operation-node/aggregate-function-node.js';
|
|
77
|
+
import { OverNode } from '../operation-node/over-node.js';
|
|
78
|
+
import { PartitionByNode } from '../operation-node/partition-by-node.js';
|
|
79
|
+
import { PartitionByItemNode } from '../operation-node/partition-by-item-node.js';
|
|
80
|
+
import { SetOperationNode } from '../operation-node/set-operation-node.js';
|
|
77
81
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
78
82
|
#private;
|
|
79
83
|
protected get numParameters(): number;
|
|
@@ -145,7 +149,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
145
149
|
protected visitModifyColumn(node: ModifyColumnNode): void;
|
|
146
150
|
protected visitAddConstraint(node: AddConstraintNode): void;
|
|
147
151
|
protected visitDropConstraint(node: DropConstraintNode): void;
|
|
148
|
-
protected
|
|
152
|
+
protected visitSetOperation(node: SetOperationNode): void;
|
|
149
153
|
protected visitCreateView(node: CreateViewNode): void;
|
|
150
154
|
protected visitDropView(node: DropViewNode): void;
|
|
151
155
|
protected visitGenerated(node: GeneratedNode): void;
|
|
@@ -155,6 +159,10 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
155
159
|
protected visitDropType(node: DropTypeNode): void;
|
|
156
160
|
protected visitExplain(node: ExplainNode): void;
|
|
157
161
|
protected visitDefaultInsertValue(_: DefaultInsertValueNode): void;
|
|
162
|
+
protected visitAggregateFunction(node: AggregateFunctionNode): void;
|
|
163
|
+
protected visitOver(node: OverNode): void;
|
|
164
|
+
protected visitPartitionBy(node: PartitionByNode): void;
|
|
165
|
+
protected visitPartitionByItem(node: PartitionByItemNode): void;
|
|
158
166
|
protected append(str: string): void;
|
|
159
167
|
protected appendValue(parameter: unknown): void;
|
|
160
168
|
protected getLeftIdentifierWrapper(): string;
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
import { InsertQueryNode } from '../operation-node/insert-query-node.js';
|
|
3
3
|
import { OperationNodeVisitor } from '../operation-node/operation-node-visitor.js';
|
|
4
4
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
5
|
-
import { RawNode } from '../operation-node/raw-node.js';
|
|
6
5
|
import { getLast, freeze, isString, isNumber, isBoolean, isNull, isDate, isBigInt, } from '../util/object-utils.js';
|
|
7
|
-
import { UnionNode } from '../operation-node/union-node.js';
|
|
8
6
|
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
7
|
+
import { SetOperationNode } from '../operation-node/set-operation-node.js';
|
|
9
8
|
export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
10
9
|
#sql = '';
|
|
11
10
|
#parameters = [];
|
|
@@ -29,7 +28,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
29
28
|
const wrapInParens = this.parentNode !== undefined &&
|
|
30
29
|
!InsertQueryNode.is(this.parentNode) &&
|
|
31
30
|
!CreateViewNode.is(this.parentNode) &&
|
|
32
|
-
!
|
|
31
|
+
!SetOperationNode.is(this.parentNode);
|
|
33
32
|
if (this.parentNode === undefined && node.explain) {
|
|
34
33
|
this.visitNode(node.explain);
|
|
35
34
|
this.append(' ');
|
|
@@ -71,9 +70,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
71
70
|
this.append(' ');
|
|
72
71
|
this.visitNode(node.having);
|
|
73
72
|
}
|
|
74
|
-
if (node.
|
|
73
|
+
if (node.setOperations) {
|
|
75
74
|
this.append(' ');
|
|
76
|
-
this.compileList(node.
|
|
75
|
+
this.compileList(node.setOperations, ' ');
|
|
77
76
|
}
|
|
78
77
|
if (node.orderBy) {
|
|
79
78
|
this.append(' ');
|
|
@@ -542,13 +541,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
542
541
|
}
|
|
543
542
|
if (node.expression) {
|
|
544
543
|
this.append(' (');
|
|
545
|
-
if (RawNode.is(node.expression)) {
|
|
546
|
-
this.append('(');
|
|
547
|
-
}
|
|
548
544
|
this.visitNode(node.expression);
|
|
549
|
-
if (RawNode.is(node.expression)) {
|
|
550
|
-
this.append(')');
|
|
551
|
-
}
|
|
552
545
|
this.append(')');
|
|
553
546
|
}
|
|
554
547
|
}
|
|
@@ -750,12 +743,13 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
750
743
|
this.append(' restrict');
|
|
751
744
|
}
|
|
752
745
|
}
|
|
753
|
-
|
|
754
|
-
this.append(
|
|
746
|
+
visitSetOperation(node) {
|
|
747
|
+
this.append(node.operator);
|
|
748
|
+
this.append(' ');
|
|
755
749
|
if (node.all) {
|
|
756
750
|
this.append('all ');
|
|
757
751
|
}
|
|
758
|
-
this.visitNode(node.
|
|
752
|
+
this.visitNode(node.expression);
|
|
759
753
|
}
|
|
760
754
|
visitCreateView(node) {
|
|
761
755
|
this.append('create ');
|
|
@@ -868,6 +862,39 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
868
862
|
visitDefaultInsertValue(_) {
|
|
869
863
|
this.append('default');
|
|
870
864
|
}
|
|
865
|
+
visitAggregateFunction(node) {
|
|
866
|
+
this.append(node.func);
|
|
867
|
+
this.append('(');
|
|
868
|
+
if (node.distinct) {
|
|
869
|
+
this.append('distinct ');
|
|
870
|
+
}
|
|
871
|
+
this.visitNode(node.column);
|
|
872
|
+
this.append(')');
|
|
873
|
+
if (node.over) {
|
|
874
|
+
this.append(' ');
|
|
875
|
+
this.visitNode(node.over);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
visitOver(node) {
|
|
879
|
+
this.append('over(');
|
|
880
|
+
if (node.partitionBy) {
|
|
881
|
+
this.visitNode(node.partitionBy);
|
|
882
|
+
if (node.orderBy) {
|
|
883
|
+
this.append(' ');
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
if (node.orderBy) {
|
|
887
|
+
this.visitNode(node.orderBy);
|
|
888
|
+
}
|
|
889
|
+
this.append(')');
|
|
890
|
+
}
|
|
891
|
+
visitPartitionBy(node) {
|
|
892
|
+
this.append('partition by ');
|
|
893
|
+
this.compileList(node.items);
|
|
894
|
+
}
|
|
895
|
+
visitPartitionByItem(node) {
|
|
896
|
+
this.visitNode(node.partitionBy);
|
|
897
|
+
}
|
|
871
898
|
append(str) {
|
|
872
899
|
this.#sql += str;
|
|
873
900
|
}
|
|
@@ -7,13 +7,14 @@ export interface Sql {
|
|
|
7
7
|
* import { sql } from 'kysely'
|
|
8
8
|
*
|
|
9
9
|
* const id = 123
|
|
10
|
-
*
|
|
11
10
|
* const snippet = sql<Person[]>`select * from person where id = ${id}`
|
|
12
11
|
* ```
|
|
13
12
|
*
|
|
14
13
|
* Substitutions (the things inside `${}`) are automatically passed to the database
|
|
15
|
-
* as parameters and are
|
|
16
|
-
* about SQL injection vulnerabilities.
|
|
14
|
+
* as parameters and are never interpolated to the SQL string. There's no need to worry
|
|
15
|
+
* about SQL injection vulnerabilities. Substitutions can be values, other `sql`
|
|
16
|
+
* expressions, queries and almost anything else Kysely can produce and they get
|
|
17
|
+
* handled correctly. See the examples below.
|
|
17
18
|
*
|
|
18
19
|
* If you need your substitutions to be interpreted as identifiers, value literals or
|
|
19
20
|
* lists of things, see the {@link Sql.ref}, {@link Sql.table}, {@link Sql.id},
|
|
@@ -29,8 +30,7 @@ export interface Sql {
|
|
|
29
30
|
* .selectFrom('person')
|
|
30
31
|
* .select(
|
|
31
32
|
* // If you use `sql` in a select statement, remember to call the `as`
|
|
32
|
-
* // method to give it an alias.
|
|
33
|
-
* // the column to the result type.
|
|
33
|
+
* // method to give it an alias.
|
|
34
34
|
* sql<string>`concat(first_name, ' ', last_name)`.as('full_name')
|
|
35
35
|
* )
|
|
36
36
|
* .where(sql`birthdate between ${date1} and ${date2}`)
|
|
@@ -97,6 +97,14 @@ export interface Sql {
|
|
|
97
97
|
* type-safety though... But it's possible.
|
|
98
98
|
*/
|
|
99
99
|
<T = unknown>(sqlFragments: TemplateStringsArray, ...parameters: unknown[]): RawBuilder<T>;
|
|
100
|
+
/**
|
|
101
|
+
* `sql.value(value)` is a shortcut for:
|
|
102
|
+
*
|
|
103
|
+
* ```ts
|
|
104
|
+
* sql`${value}`
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
value(value: unknown): RawBuilder<unknown>;
|
|
100
108
|
/**
|
|
101
109
|
* This can be used to add runtime column references to SQL snippets.
|
|
102
110
|
*
|
|
@@ -19,6 +19,12 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
|
|
|
19
19
|
rawNode: RawNode.createWithChild(parseStringReference(columnReference)),
|
|
20
20
|
});
|
|
21
21
|
},
|
|
22
|
+
value(value) {
|
|
23
|
+
return new RawBuilder({
|
|
24
|
+
queryId: createQueryId(),
|
|
25
|
+
rawNode: RawNode.createWithChild(parseValueExpression(value)),
|
|
26
|
+
});
|
|
27
|
+
},
|
|
22
28
|
table(tableReference) {
|
|
23
29
|
return new RawBuilder({
|
|
24
30
|
queryId: createQueryId(),
|
|
@@ -4,6 +4,7 @@ import { ExpressionBuilder } from '../query-builder/expression-builder.js';
|
|
|
4
4
|
import { InsertResult } from '../query-builder/insert-result.js';
|
|
5
5
|
import { DeleteResult } from '../query-builder/delete-result.js';
|
|
6
6
|
import { UpdateResult } from '../query-builder/update-result.js';
|
|
7
|
+
import { AggregateFunctionBuilder, AliasedAggregateFunctionBuilder } from '../query-builder/aggregate-function-builder.js';
|
|
7
8
|
/**
|
|
8
9
|
* Given an object type, extracts the union of all value types.
|
|
9
10
|
*/
|
|
@@ -102,10 +103,13 @@ export declare type AnySelectQueryBuilder = SelectQueryBuilder<any, any, any>;
|
|
|
102
103
|
export declare type AnyAliasedQueryBuilder = AliasedQueryBuilder<any, any, any, any>;
|
|
103
104
|
export declare type AnyRawBuilder = RawBuilder<any>;
|
|
104
105
|
export declare type AnyAliasedRawBuilder = AliasedRawBuilder<any, any>;
|
|
106
|
+
export declare type AnyAliasedAggregateFunctionBuilder = AliasedAggregateFunctionBuilder<any, any, any, any>;
|
|
105
107
|
export declare type SelectQueryBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnySelectQueryBuilder;
|
|
106
108
|
export declare type AliasedQueryBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedQueryBuilder;
|
|
107
109
|
export declare type RawBuilderFactory<DB, TB extends keyof DB, O = any> = (qb: ExpressionBuilder<DB, TB>) => RawBuilder<O>;
|
|
108
110
|
export declare type AliasedRawBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedRawBuilder;
|
|
111
|
+
export declare type AggregateFunctionBuilderFactory<DB, TB extends keyof DB, O = unknown> = (qb: ExpressionBuilder<DB, TB>) => AggregateFunctionBuilder<DB, TB, O>;
|
|
112
|
+
export declare type AliasedAggregateFunctionBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedAggregateFunctionBuilder;
|
|
109
113
|
export declare type SingleResultType<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : O | undefined;
|
|
110
114
|
export declare type UnknownRow = Record<string, unknown>;
|
|
111
115
|
export declare type Nullable<T> = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kysely",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Type safe SQL query builder",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -41,6 +41,9 @@
|
|
|
41
41
|
},
|
|
42
42
|
"author": "Sami Koskimäki <sami@jakso.me>",
|
|
43
43
|
"license": "MIT",
|
|
44
|
+
"contributors": [
|
|
45
|
+
"Igal Klebanov <igalklebanov@gmail.com>"
|
|
46
|
+
],
|
|
44
47
|
"devDependencies": {
|
|
45
48
|
"@types/better-sqlite3": "^7.5.0",
|
|
46
49
|
"@types/chai": "^4.3.1",
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { OperationNode } from './operation-node.js';
|
|
2
|
-
import { RawNode } from './raw-node.js';
|
|
3
|
-
import { SelectQueryNode } from './select-query-node.js';
|
|
4
|
-
export declare type UnionExpressionNode = SelectQueryNode | RawNode;
|
|
5
|
-
export interface UnionNode extends OperationNode {
|
|
6
|
-
readonly kind: 'UnionNode';
|
|
7
|
-
readonly union: UnionExpressionNode;
|
|
8
|
-
readonly all: boolean;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* @internal
|
|
12
|
-
*/
|
|
13
|
-
export declare const UnionNode: Readonly<{
|
|
14
|
-
is(node: OperationNode): node is UnionNode;
|
|
15
|
-
create(union: UnionExpressionNode, all: boolean): UnionNode;
|
|
16
|
-
}>;
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { UnionNode } from '../operation-node/union-node.js';
|
|
2
|
-
import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
3
|
-
import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
4
|
-
export declare type UnionExpression<DB, O> = SelectQueryBuilder<DB, any, O> | RawBuilder<O>;
|
|
5
|
-
export declare function parseUnion(union: UnionExpression<any, any>, all: boolean): UnionNode;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseUnion = void 0;
|
|
4
|
-
const union_node_js_1 = require("../operation-node/union-node.js");
|
|
5
|
-
function parseUnion(union, all) {
|
|
6
|
-
return union_node_js_1.UnionNode.create(union.toOperationNode(), all);
|
|
7
|
-
}
|
|
8
|
-
exports.parseUnion = parseUnion;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { OperationNode } from './operation-node.js';
|
|
2
|
-
import { RawNode } from './raw-node.js';
|
|
3
|
-
import { SelectQueryNode } from './select-query-node.js';
|
|
4
|
-
export declare type UnionExpressionNode = SelectQueryNode | RawNode;
|
|
5
|
-
export interface UnionNode extends OperationNode {
|
|
6
|
-
readonly kind: 'UnionNode';
|
|
7
|
-
readonly union: UnionExpressionNode;
|
|
8
|
-
readonly all: boolean;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* @internal
|
|
12
|
-
*/
|
|
13
|
-
export declare const UnionNode: Readonly<{
|
|
14
|
-
is(node: OperationNode): node is UnionNode;
|
|
15
|
-
create(union: UnionExpressionNode, all: boolean): UnionNode;
|
|
16
|
-
}>;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/// <reference types="./union-node.d.ts" />
|
|
2
|
-
import { freeze } from '../util/object-utils.js';
|
|
3
|
-
/**
|
|
4
|
-
* @internal
|
|
5
|
-
*/
|
|
6
|
-
export const UnionNode = freeze({
|
|
7
|
-
is(node) {
|
|
8
|
-
return node.kind === 'UnionNode';
|
|
9
|
-
},
|
|
10
|
-
create(union, all) {
|
|
11
|
-
return freeze({
|
|
12
|
-
kind: 'UnionNode',
|
|
13
|
-
union,
|
|
14
|
-
all,
|
|
15
|
-
});
|
|
16
|
-
},
|
|
17
|
-
});
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { UnionNode } from '../operation-node/union-node.js';
|
|
2
|
-
import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
3
|
-
import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
4
|
-
export declare type UnionExpression<DB, O> = SelectQueryBuilder<DB, any, O> | RawBuilder<O>;
|
|
5
|
-
export declare function parseUnion(union: UnionExpression<any, any>, all: boolean): UnionNode;
|