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.
Files changed (119) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/index.d.ts +9 -4
  3. package/dist/cjs/index.js +7 -2
  4. package/dist/cjs/kysely.d.ts +3 -3
  5. package/dist/cjs/kysely.js +3 -3
  6. package/dist/cjs/migration/file-migration-provider.js +7 -2
  7. package/dist/cjs/operation-node/aggregate-function-node.d.ts +22 -0
  8. package/dist/cjs/operation-node/aggregate-function-node.js +31 -0
  9. package/dist/cjs/operation-node/alias-node.d.ts +2 -1
  10. package/dist/cjs/operation-node/group-by-node.d.ts +1 -1
  11. package/dist/cjs/operation-node/group-by-node.js +3 -3
  12. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
  13. package/dist/cjs/operation-node/operation-node-transformer.d.ts +10 -2
  14. package/dist/cjs/operation-node/operation-node-transformer.js +38 -5
  15. package/dist/cjs/operation-node/operation-node-utils.d.ts +2 -1
  16. package/dist/cjs/operation-node/operation-node-visitor.d.ts +10 -2
  17. package/dist/cjs/operation-node/operation-node-visitor.js +5 -1
  18. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  19. package/dist/cjs/operation-node/over-node.d.ts +19 -0
  20. package/dist/cjs/operation-node/over-node.js +35 -0
  21. package/dist/cjs/operation-node/partition-by-item-node.d.ts +14 -0
  22. package/dist/cjs/operation-node/{union-node.js → partition-by-item-node.js} +6 -7
  23. package/dist/cjs/operation-node/partition-by-node.d.ts +14 -0
  24. package/dist/cjs/operation-node/partition-by-node.js +24 -0
  25. package/dist/cjs/operation-node/select-query-node.d.ts +3 -3
  26. package/dist/cjs/operation-node/select-query-node.js +4 -4
  27. package/dist/cjs/operation-node/set-operation-node.d.ts +18 -0
  28. package/dist/cjs/operation-node/set-operation-node.js +20 -0
  29. package/dist/cjs/operation-node/value-list-node.d.ts +2 -1
  30. package/dist/cjs/parser/complex-expression-parser.d.ts +6 -4
  31. package/dist/cjs/parser/group-by-parser.d.ts +1 -1
  32. package/dist/cjs/parser/group-by-parser.js +2 -2
  33. package/dist/cjs/parser/parse-utils.d.ts +2 -0
  34. package/dist/cjs/parser/parse-utils.js +9 -1
  35. package/dist/cjs/parser/partition-by-parser.d.ts +6 -0
  36. package/dist/cjs/parser/partition-by-parser.js +9 -0
  37. package/dist/cjs/parser/reference-parser.d.ts +2 -1
  38. package/dist/cjs/parser/select-parser.d.ts +4 -3
  39. package/dist/cjs/parser/set-operation-parser.d.ts +5 -0
  40. package/dist/cjs/parser/set-operation-parser.js +8 -0
  41. package/dist/cjs/parser/value-parser.d.ts +2 -1
  42. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +117 -0
  43. package/dist/cjs/query-builder/aggregate-function-builder.js +146 -0
  44. package/dist/cjs/query-builder/expression-builder.d.ts +3 -3
  45. package/dist/cjs/query-builder/expression-builder.js +3 -3
  46. package/dist/cjs/query-builder/{function-builder.d.ts → function-module.d.ts} +49 -42
  47. package/dist/cjs/query-builder/{function-builder.js → function-module.js} +70 -59
  48. package/dist/cjs/query-builder/over-builder.d.ts +59 -0
  49. package/dist/cjs/query-builder/over-builder.js +50 -0
  50. package/dist/cjs/query-builder/select-query-builder.d.ts +63 -3
  51. package/dist/cjs/query-builder/select-query-builder.js +83 -3
  52. package/dist/cjs/query-compiler/default-query-compiler.d.ts +10 -2
  53. package/dist/cjs/query-compiler/default-query-compiler.js +41 -14
  54. package/dist/cjs/raw-builder/sql.d.ts +13 -5
  55. package/dist/cjs/raw-builder/sql.js +6 -0
  56. package/dist/cjs/util/type-utils.d.ts +4 -0
  57. package/dist/esm/index.d.ts +9 -4
  58. package/dist/esm/index.js +7 -2
  59. package/dist/esm/kysely.d.ts +3 -3
  60. package/dist/esm/kysely.js +3 -3
  61. package/dist/esm/migration/file-migration-provider.js +7 -2
  62. package/dist/esm/operation-node/aggregate-function-node.d.ts +22 -0
  63. package/dist/esm/operation-node/aggregate-function-node.js +29 -0
  64. package/dist/esm/operation-node/alias-node.d.ts +2 -1
  65. package/dist/esm/operation-node/group-by-node.d.ts +1 -1
  66. package/dist/esm/operation-node/group-by-node.js +3 -3
  67. package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
  68. package/dist/esm/operation-node/operation-node-transformer.d.ts +10 -2
  69. package/dist/esm/operation-node/operation-node-transformer.js +38 -5
  70. package/dist/esm/operation-node/operation-node-utils.d.ts +2 -1
  71. package/dist/esm/operation-node/operation-node-visitor.d.ts +10 -2
  72. package/dist/esm/operation-node/operation-node-visitor.js +5 -1
  73. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  74. package/dist/esm/operation-node/over-node.d.ts +19 -0
  75. package/dist/esm/operation-node/over-node.js +33 -0
  76. package/dist/esm/operation-node/partition-by-item-node.d.ts +14 -0
  77. package/dist/esm/operation-node/partition-by-item-node.js +16 -0
  78. package/dist/esm/operation-node/partition-by-node.d.ts +14 -0
  79. package/dist/esm/operation-node/partition-by-node.js +22 -0
  80. package/dist/esm/operation-node/select-query-node.d.ts +3 -3
  81. package/dist/esm/operation-node/select-query-node.js +4 -4
  82. package/dist/esm/operation-node/set-operation-node.d.ts +18 -0
  83. package/dist/esm/operation-node/set-operation-node.js +18 -0
  84. package/dist/esm/operation-node/value-list-node.d.ts +2 -1
  85. package/dist/esm/parser/complex-expression-parser.d.ts +6 -4
  86. package/dist/esm/parser/group-by-parser.d.ts +1 -1
  87. package/dist/esm/parser/group-by-parser.js +2 -2
  88. package/dist/esm/parser/parse-utils.d.ts +2 -0
  89. package/dist/esm/parser/parse-utils.js +7 -0
  90. package/dist/esm/parser/partition-by-parser.d.ts +6 -0
  91. package/dist/esm/parser/partition-by-parser.js +6 -0
  92. package/dist/esm/parser/reference-parser.d.ts +2 -1
  93. package/dist/esm/parser/select-parser.d.ts +4 -3
  94. package/dist/esm/parser/set-operation-parser.d.ts +5 -0
  95. package/dist/esm/parser/set-operation-parser.js +5 -0
  96. package/dist/esm/parser/value-parser.d.ts +2 -1
  97. package/dist/esm/query-builder/aggregate-function-builder.d.ts +117 -0
  98. package/dist/esm/query-builder/aggregate-function-builder.js +142 -0
  99. package/dist/esm/query-builder/expression-builder.d.ts +3 -3
  100. package/dist/esm/query-builder/expression-builder.js +3 -3
  101. package/dist/esm/query-builder/{function-builder.d.ts → function-module.d.ts} +49 -42
  102. package/dist/esm/query-builder/{function-builder.js → function-module.js} +69 -58
  103. package/dist/esm/query-builder/over-builder.d.ts +59 -0
  104. package/dist/esm/query-builder/over-builder.js +47 -0
  105. package/dist/esm/query-builder/select-query-builder.d.ts +63 -3
  106. package/dist/esm/query-builder/select-query-builder.js +83 -3
  107. package/dist/esm/query-compiler/default-query-compiler.d.ts +10 -2
  108. package/dist/esm/query-compiler/default-query-compiler.js +41 -14
  109. package/dist/esm/raw-builder/sql.d.ts +13 -5
  110. package/dist/esm/raw-builder/sql.js +6 -0
  111. package/dist/esm/util/type-utils.d.ts +4 -0
  112. package/package.json +4 -1
  113. package/dist/cjs/operation-node/union-node.d.ts +0 -16
  114. package/dist/cjs/parser/union-parser.d.ts +0 -5
  115. package/dist/cjs/parser/union-parser.js +0 -8
  116. package/dist/esm/operation-node/union-node.d.ts +0 -16
  117. package/dist/esm/operation-node/union-node.js +0 -17
  118. package/dist/esm/parser/union-parser.d.ts +0 -5
  119. 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: UnionExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
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: UnionExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
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.cloneWithUnion(this.#props.queryNode, parseUnion(expression, false)),
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.cloneWithUnion(this.#props.queryNode, parseUnion(expression, true)),
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 visitUnion(node: UnionNode): void;
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
- !UnionNode.is(this.parentNode);
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.union) {
73
+ if (node.setOperations) {
75
74
  this.append(' ');
76
- this.compileList(node.union, ' ');
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
- visitUnion(node) {
754
- this.append('union ');
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.union);
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 NOT interpolated to the SQL string. There's no need to worry
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. Otherwise Kysely is not able to add
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.21.6",
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;
@@ -1,5 +0,0 @@
1
- /// <reference types="./union-parser.d.ts" />
2
- import { UnionNode } from '../operation-node/union-node.js';
3
- export function parseUnion(union, all) {
4
- return UnionNode.create(union.toOperationNode(), all);
5
- }