kysely 0.27.2 → 0.27.3

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 (157) hide show
  1. package/dist/cjs/dialect/database-introspector.d.ts +1 -0
  2. package/dist/cjs/dialect/mssql/mssql-introspector.js +13 -2
  3. package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  4. package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
  5. package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
  6. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  7. package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
  8. package/dist/cjs/dialect/postgres/postgres-introspector.js +2 -0
  9. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
  10. package/dist/cjs/driver/database-connection.d.ts +1 -1
  11. package/dist/cjs/expression/expression-builder.d.ts +30 -4
  12. package/dist/cjs/expression/expression-builder.js +5 -0
  13. package/dist/cjs/index.d.ts +7 -1
  14. package/dist/cjs/index.js +6 -0
  15. package/dist/cjs/operation-node/add-index-node.js +1 -1
  16. package/dist/cjs/operation-node/cast-node.d.ts +13 -0
  17. package/dist/cjs/operation-node/cast-node.js +19 -0
  18. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
  19. package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
  20. package/dist/cjs/operation-node/data-type-node.js +55 -1
  21. package/dist/cjs/operation-node/delete-query-node.d.ts +4 -0
  22. package/dist/cjs/operation-node/delete-query-node.js +12 -0
  23. package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
  24. package/dist/cjs/operation-node/fetch-node.js +19 -0
  25. package/dist/cjs/operation-node/insert-query-node.d.ts +4 -1
  26. package/dist/cjs/operation-node/insert-query-node.js +5 -0
  27. package/dist/cjs/operation-node/join-node.d.ts +1 -1
  28. package/dist/cjs/operation-node/matched-node.d.ts +13 -0
  29. package/dist/cjs/operation-node/matched-node.js +19 -0
  30. package/dist/cjs/operation-node/merge-query-node.d.ts +25 -0
  31. package/dist/cjs/operation-node/merge-query-node.js +45 -0
  32. package/dist/cjs/operation-node/operation-node-transformer.d.ts +10 -0
  33. package/dist/cjs/operation-node/operation-node-transformer.js +50 -0
  34. package/dist/cjs/operation-node/operation-node-visitor.d.ts +10 -0
  35. package/dist/cjs/operation-node/operation-node-visitor.js +5 -0
  36. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  37. package/dist/cjs/operation-node/query-node.d.ts +10 -3
  38. package/dist/cjs/operation-node/query-node.js +15 -1
  39. package/dist/cjs/operation-node/select-query-node.d.ts +5 -0
  40. package/dist/cjs/operation-node/select-query-node.js +6 -0
  41. package/dist/cjs/operation-node/top-node.d.ts +14 -0
  42. package/dist/cjs/operation-node/top-node.js +19 -0
  43. package/dist/cjs/operation-node/update-query-node.d.ts +7 -1
  44. package/dist/cjs/operation-node/update-query-node.js +11 -0
  45. package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
  46. package/dist/cjs/parser/binary-operation-parser.js +2 -2
  47. package/dist/cjs/parser/data-type-parser.js +7 -3
  48. package/dist/cjs/parser/fetch-parser.d.ts +2 -0
  49. package/dist/cjs/parser/fetch-parser.js +18 -0
  50. package/dist/cjs/parser/insert-values-parser.d.ts +3 -3
  51. package/dist/cjs/parser/merge-parser.d.ts +9 -0
  52. package/dist/cjs/parser/merge-parser.js +32 -0
  53. package/dist/cjs/parser/table-parser.d.ts +4 -3
  54. package/dist/cjs/parser/top-parser.d.ts +2 -0
  55. package/dist/cjs/parser/top-parser.js +20 -0
  56. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
  57. package/dist/cjs/query-builder/delete-query-builder.d.ts +99 -0
  58. package/dist/cjs/query-builder/delete-query-builder.js +120 -0
  59. package/dist/cjs/query-builder/insert-query-builder.d.ts +71 -0
  60. package/dist/cjs/query-builder/insert-query-builder.js +82 -0
  61. package/dist/cjs/query-builder/merge-query-builder.d.ts +557 -0
  62. package/dist/cjs/query-builder/merge-query-builder.js +518 -0
  63. package/dist/cjs/query-builder/merge-result.d.ts +4 -0
  64. package/dist/cjs/query-builder/merge-result.js +10 -0
  65. package/dist/cjs/query-builder/select-query-builder.d.ts +102 -7
  66. package/dist/cjs/query-builder/select-query-builder.js +14 -0
  67. package/dist/cjs/query-builder/update-query-builder.d.ts +80 -0
  68. package/dist/cjs/query-builder/update-query-builder.js +98 -0
  69. package/dist/cjs/query-compiler/default-query-compiler.d.ts +10 -0
  70. package/dist/cjs/query-compiler/default-query-compiler.js +94 -10
  71. package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
  72. package/dist/cjs/query-creator.d.ts +40 -2
  73. package/dist/cjs/query-creator.js +9 -0
  74. package/dist/cjs/schema/alter-table-add-index-builder.js +6 -2
  75. package/dist/cjs/schema/column-definition-builder.d.ts +13 -1
  76. package/dist/cjs/schema/column-definition-builder.js +15 -1
  77. package/dist/cjs/util/infer-result.d.ts +2 -1
  78. package/dist/cjs/util/type-utils.d.ts +3 -2
  79. package/dist/esm/dialect/database-introspector.d.ts +1 -0
  80. package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
  81. package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  82. package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
  83. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
  84. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  85. package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
  86. package/dist/esm/dialect/postgres/postgres-introspector.js +2 -0
  87. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
  88. package/dist/esm/driver/database-connection.d.ts +1 -1
  89. package/dist/esm/expression/expression-builder.d.ts +30 -4
  90. package/dist/esm/expression/expression-builder.js +5 -0
  91. package/dist/esm/index.d.ts +7 -1
  92. package/dist/esm/index.js +6 -0
  93. package/dist/esm/operation-node/add-index-node.js +1 -1
  94. package/dist/esm/operation-node/cast-node.d.ts +13 -0
  95. package/dist/esm/operation-node/cast-node.js +17 -0
  96. package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
  97. package/dist/esm/operation-node/data-type-node.d.ts +5 -1
  98. package/dist/esm/operation-node/data-type-node.js +53 -0
  99. package/dist/esm/operation-node/delete-query-node.d.ts +4 -0
  100. package/dist/esm/operation-node/delete-query-node.js +12 -0
  101. package/dist/esm/operation-node/fetch-node.d.ts +15 -0
  102. package/dist/esm/operation-node/fetch-node.js +17 -0
  103. package/dist/esm/operation-node/insert-query-node.d.ts +4 -1
  104. package/dist/esm/operation-node/insert-query-node.js +5 -0
  105. package/dist/esm/operation-node/join-node.d.ts +1 -1
  106. package/dist/esm/operation-node/matched-node.d.ts +13 -0
  107. package/dist/esm/operation-node/matched-node.js +17 -0
  108. package/dist/esm/operation-node/merge-query-node.d.ts +25 -0
  109. package/dist/esm/operation-node/merge-query-node.js +43 -0
  110. package/dist/esm/operation-node/operation-node-transformer.d.ts +10 -0
  111. package/dist/esm/operation-node/operation-node-transformer.js +50 -0
  112. package/dist/esm/operation-node/operation-node-visitor.d.ts +10 -0
  113. package/dist/esm/operation-node/operation-node-visitor.js +5 -0
  114. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  115. package/dist/esm/operation-node/query-node.d.ts +10 -3
  116. package/dist/esm/operation-node/query-node.js +15 -1
  117. package/dist/esm/operation-node/select-query-node.d.ts +5 -0
  118. package/dist/esm/operation-node/select-query-node.js +6 -0
  119. package/dist/esm/operation-node/top-node.d.ts +14 -0
  120. package/dist/esm/operation-node/top-node.js +17 -0
  121. package/dist/esm/operation-node/update-query-node.d.ts +7 -1
  122. package/dist/esm/operation-node/update-query-node.js +11 -0
  123. package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
  124. package/dist/esm/parser/binary-operation-parser.js +2 -2
  125. package/dist/esm/parser/data-type-parser.js +8 -4
  126. package/dist/esm/parser/fetch-parser.d.ts +2 -0
  127. package/dist/esm/parser/fetch-parser.js +15 -0
  128. package/dist/esm/parser/insert-values-parser.d.ts +3 -3
  129. package/dist/esm/parser/merge-parser.d.ts +9 -0
  130. package/dist/esm/parser/merge-parser.js +28 -0
  131. package/dist/esm/parser/table-parser.d.ts +4 -3
  132. package/dist/esm/parser/top-parser.d.ts +2 -0
  133. package/dist/esm/parser/top-parser.js +17 -0
  134. package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
  135. package/dist/esm/query-builder/delete-query-builder.d.ts +99 -0
  136. package/dist/esm/query-builder/delete-query-builder.js +120 -0
  137. package/dist/esm/query-builder/insert-query-builder.d.ts +71 -0
  138. package/dist/esm/query-builder/insert-query-builder.js +82 -0
  139. package/dist/esm/query-builder/merge-query-builder.d.ts +557 -0
  140. package/dist/esm/query-builder/merge-query-builder.js +512 -0
  141. package/dist/esm/query-builder/merge-result.d.ts +4 -0
  142. package/dist/esm/query-builder/merge-result.js +7 -0
  143. package/dist/esm/query-builder/select-query-builder.d.ts +102 -7
  144. package/dist/esm/query-builder/select-query-builder.js +14 -0
  145. package/dist/esm/query-builder/update-query-builder.d.ts +80 -0
  146. package/dist/esm/query-builder/update-query-builder.js +98 -0
  147. package/dist/esm/query-compiler/default-query-compiler.d.ts +10 -0
  148. package/dist/esm/query-compiler/default-query-compiler.js +94 -10
  149. package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
  150. package/dist/esm/query-creator.d.ts +40 -2
  151. package/dist/esm/query-creator.js +10 -1
  152. package/dist/esm/schema/alter-table-add-index-builder.js +7 -3
  153. package/dist/esm/schema/column-definition-builder.d.ts +13 -1
  154. package/dist/esm/schema/column-definition-builder.js +15 -1
  155. package/dist/esm/util/infer-result.d.ts +2 -1
  156. package/dist/esm/util/type-utils.d.ts +3 -2
  157. package/package.json +22 -21
@@ -58,4 +58,5 @@ export interface ColumnMetadata {
58
58
  readonly isAutoIncrementing: boolean;
59
59
  readonly isNullable: boolean;
60
60
  readonly hasDefaultValue: boolean;
61
+ readonly comment?: string;
61
62
  }
@@ -16,8 +16,12 @@ class MssqlIntrospector {
16
16
  .selectFrom('sys.tables as tables')
17
17
  .leftJoin('sys.schemas as table_schemas', 'table_schemas.schema_id', 'tables.schema_id')
18
18
  .innerJoin('sys.columns as columns', 'columns.object_id', 'tables.object_id')
19
- .innerJoin('sys.types as types', 'types.system_type_id', 'columns.system_type_id')
19
+ .innerJoin('sys.types as types', 'types.user_type_id', 'columns.user_type_id')
20
20
  .leftJoin('sys.schemas as type_schemas', 'type_schemas.schema_id', 'types.schema_id')
21
+ .leftJoin('sys.extended_properties as comments', (join) => join
22
+ .onRef('comments.major_id', '=', 'tables.object_id')
23
+ .onRef('comments.minor_id', '=', 'columns.column_id')
24
+ .on('comments.name', '=', 'MS_Description'))
21
25
  .$if(!options.withInternalKyselyTables, (qb) => qb
22
26
  .where('tables.name', '!=', migrator_js_1.DEFAULT_MIGRATION_TABLE)
23
27
  .where('tables.name', '!=', migrator_js_1.DEFAULT_MIGRATION_LOCK_TABLE))
@@ -38,13 +42,18 @@ class MssqlIntrospector {
38
42
  'types.is_nullable as type_is_nullable',
39
43
  'types.name as type_name',
40
44
  'type_schemas.name as type_schema_name',
45
+ 'comments.value as column_comment',
41
46
  ])
42
47
  .unionAll(this.#db
43
48
  .selectFrom('sys.views as views')
44
49
  .leftJoin('sys.schemas as view_schemas', 'view_schemas.schema_id', 'views.schema_id')
45
50
  .innerJoin('sys.columns as columns', 'columns.object_id', 'views.object_id')
46
- .innerJoin('sys.types as types', 'types.system_type_id', 'columns.system_type_id')
51
+ .innerJoin('sys.types as types', 'types.user_type_id', 'columns.user_type_id')
47
52
  .leftJoin('sys.schemas as type_schemas', 'type_schemas.schema_id', 'types.schema_id')
53
+ .leftJoin('sys.extended_properties as comments', (join) => join
54
+ .onRef('comments.major_id', '=', 'views.object_id')
55
+ .onRef('comments.minor_id', '=', 'columns.column_id')
56
+ .on('comments.name', '=', 'MS_Description'))
48
57
  .select([
49
58
  'views.name as table_name',
50
59
  'views.type as table_type',
@@ -59,6 +68,7 @@ class MssqlIntrospector {
59
68
  'types.is_nullable as type_is_nullable',
60
69
  'types.name as type_name',
61
70
  'type_schemas.name as type_schema_name',
71
+ 'comments.value as column_comment',
62
72
  ]))
63
73
  .orderBy('table_schema_name')
64
74
  .orderBy('table_name')
@@ -86,6 +96,7 @@ class MssqlIntrospector {
86
96
  isAutoIncrementing: rawColumn.column_is_identity,
87
97
  isNullable: rawColumn.column_is_nullable && rawColumn.type_is_nullable,
88
98
  name: rawColumn.column_name,
99
+ comment: rawColumn.column_comment ?? undefined,
89
100
  }));
90
101
  }
91
102
  return Object.values(tableDictionary);
@@ -1,11 +1,15 @@
1
1
  import { AddColumnNode } from '../../operation-node/add-column-node.js';
2
2
  import { AlterTableColumnAlterationNode } from '../../operation-node/alter-table-node.js';
3
3
  import { DropColumnNode } from '../../operation-node/drop-column-node.js';
4
+ import { OffsetNode } from '../../operation-node/offset-node.js';
5
+ import { MergeQueryNode } from '../../operation-node/merge-query-node.js';
4
6
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
5
7
  export declare class MssqlQueryCompiler extends DefaultQueryCompiler {
6
8
  protected getCurrentParameterPlaceholder(): string;
9
+ protected visitOffset(node: OffsetNode): void;
7
10
  protected compileColumnAlterations(columnAlterations: readonly AlterTableColumnAlterationNode[]): void;
8
11
  protected visitAddColumn(node: AddColumnNode): void;
9
12
  protected visitDropColumn(node: DropColumnNode): void;
13
+ protected visitMergeQuery(node: MergeQueryNode): void;
10
14
  protected announcesNewColumnDataType(): boolean;
11
15
  }
@@ -6,6 +6,10 @@ class MssqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompile
6
6
  getCurrentParameterPlaceholder() {
7
7
  return `@${this.numParameters}`;
8
8
  }
9
+ visitOffset(node) {
10
+ super.visitOffset(node);
11
+ this.append(' rows');
12
+ }
9
13
  // mssql allows multi-column alterations in a single statement,
10
14
  // but you can only use the command keyword/s once.
11
15
  // it also doesn't support multiple kinds of commands in the same
@@ -57,6 +61,10 @@ class MssqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompile
57
61
  visitDropColumn(node) {
58
62
  this.visitNode(node.column);
59
63
  }
64
+ visitMergeQuery(node) {
65
+ super.visitMergeQuery(node);
66
+ this.append(';');
67
+ }
60
68
  announcesNewColumnDataType() {
61
69
  return false;
62
70
  }
@@ -33,6 +33,7 @@ class MysqlIntrospector {
33
33
  'columns.IS_NULLABLE',
34
34
  'columns.DATA_TYPE',
35
35
  'columns.EXTRA',
36
+ 'columns.COLUMN_COMMENT',
36
37
  ])
37
38
  .where('columns.TABLE_SCHEMA', '=', (0, sql_js_1.sql) `database()`)
38
39
  .orderBy('columns.TABLE_NAME')
@@ -69,6 +70,7 @@ class MysqlIntrospector {
69
70
  isNullable: it.IS_NULLABLE === 'YES',
70
71
  isAutoIncrementing: it.EXTRA.toLowerCase().includes('auto_increment'),
71
72
  hasDefaultValue: it.COLUMN_DEFAULT !== null,
73
+ comment: it.COLUMN_COMMENT === '' ? undefined : it.COLUMN_COMMENT,
72
74
  }));
73
75
  return tables;
74
76
  }, []);
@@ -52,7 +52,7 @@ export interface PostgresCursor<T> {
52
52
  }
53
53
  export type PostgresCursorConstructor = new <T>(sql: string, parameters: unknown[]) => PostgresCursor<T>;
54
54
  export interface PostgresQueryResult<R> {
55
- command: 'UPDATE' | 'DELETE' | 'INSERT' | 'SELECT';
55
+ command: 'UPDATE' | 'DELETE' | 'INSERT' | 'SELECT' | 'MERGE';
56
56
  rowCount: number;
57
57
  rows: R[];
58
58
  }
@@ -74,7 +74,8 @@ class PostgresConnection {
74
74
  ]);
75
75
  if (result.command === 'INSERT' ||
76
76
  result.command === 'UPDATE' ||
77
- result.command === 'DELETE') {
77
+ result.command === 'DELETE' ||
78
+ result.command === 'MERGE') {
78
79
  const numAffectedRows = BigInt(result.rowCount);
79
80
  return {
80
81
  // TODO: remove.
@@ -38,6 +38,7 @@ class PostgresIntrospector {
38
38
  'ns.nspname as schema',
39
39
  'typ.typname as type',
40
40
  'dtns.nspname as type_schema',
41
+ (0, sql_js_1.sql) `col_description(a.attrelid, a.attnum)`.as('column_description'),
41
42
  // Detect if the column is auto incrementing by finding the sequence
42
43
  // that is created for `serial` and `bigserial` columns.
43
44
  this.#db
@@ -92,6 +93,7 @@ class PostgresIntrospector {
92
93
  isNullable: !it.not_null,
93
94
  isAutoIncrementing: !!it.auto_incrementing,
94
95
  hasDefaultValue: it.has_default,
96
+ comment: it.column_description ?? undefined,
95
97
  }));
96
98
  return tables;
97
99
  }, []);
@@ -63,6 +63,7 @@ class SqliteIntrospector {
63
63
  isNullable: !col.notnull,
64
64
  isAutoIncrementing: col.name === autoIncrementCol,
65
65
  hasDefaultValue: col.dflt_value != null,
66
+ comment: undefined,
66
67
  })),
67
68
  };
68
69
  }
@@ -14,7 +14,7 @@ export interface QueryResult<O> {
14
14
  */
15
15
  readonly numUpdatedOrDeletedRows?: bigint;
16
16
  /**
17
- * This is defined for insert, update and delete queries and contains
17
+ * This is defined for insert, update, delete and merge queries and contains
18
18
  * the number of rows the query inserted/updated/deleted.
19
19
  */
20
20
  readonly numAffectedRows?: bigint;
@@ -15,6 +15,7 @@ import { OperandExpression } from '../parser/expression-parser.js';
15
15
  import { RefTuple2, RefTuple3, RefTuple4, RefTuple5, ValTuple2, ValTuple3, ValTuple4, ValTuple5 } from '../parser/tuple-parser.js';
16
16
  import { Selectable } from '../util/column-type.js';
17
17
  import { KyselyTypeError } from '../util/type-error.js';
18
+ import { DataTypeExpression } from '../parser/data-type-parser.js';
18
19
  export interface ExpressionBuilder<DB, TB extends keyof DB> {
19
20
  /**
20
21
  * Creates a binary expression.
@@ -194,7 +195,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
194
195
  selectFrom<TE extends keyof DB & string>(from: TE[]): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
195
196
  selectFrom<TE extends TableExpression<DB, TB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
196
197
  selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
197
- selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB, TE>, {}>;
198
+ selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB & PickTableWithAlias<DB, TE>, TE>, {}>;
198
199
  selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
199
200
  /**
200
201
  * Creates a `case` statement/operator.
@@ -218,7 +219,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
218
219
  * .when('gender', '=', 'female')
219
220
  * .then(
220
221
  * eb
221
- * .case('martialStatus')
222
+ * .case('maritalStatus')
222
223
  * .when('single')
223
224
  * .then('Ms.')
224
225
  * .else('Mrs.')
@@ -238,7 +239,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
238
239
  * case
239
240
  * when "gender" = $1 then $2
240
241
  * when "gender" = $3 then
241
- * case "martialStatus"
242
+ * case "maritalStatus"
242
243
  * when $4 then $5
243
244
  * else $6
244
245
  * end
@@ -775,7 +776,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
775
776
  * ```ts
776
777
  * db.selectFrom('person')
777
778
  * .selectAll('person')
778
- * .where((eb) => parens(
779
+ * .where((eb) => eb.parens(
779
780
  * eb('age', '=', 1).or('age', '=', 2))
780
781
  * ).and(
781
782
  * eb('first_name', '=', 'Jennifer').or('first_name', '=', 'Arnold')
@@ -792,6 +793,31 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
792
793
  */
793
794
  parens<RE extends ReferenceExpression<DB, TB>, OP extends BinaryOperatorExpression, VE extends OperandValueExpressionOrList<DB, TB, RE>>(lhs: RE, op: OP, rhs: VE): ExpressionWrapper<DB, TB, OP extends ComparisonOperator ? SqlBool : ExtractTypeFromReferenceExpression<DB, TB, RE>>;
794
795
  parens<T>(expr: Expression<T>): ExpressionWrapper<DB, TB, T>;
796
+ /**
797
+ * Creates a `cast(expr as dataType)` expression.
798
+ *
799
+ * Since Kysely can't know the mapping between javascript and database types,
800
+ * you need to provide both explicitly.
801
+ *
802
+ * ### Examples
803
+ *
804
+ * ```ts
805
+ * db.selectFrom('person')
806
+ * .select((eb) => [
807
+ * 'id',
808
+ * 'first_name',
809
+ * eb.cast<number>('age', 'integer').as('age')
810
+ * ])
811
+ * ```
812
+ *
813
+ * The generated SQL (PostgreSQL):
814
+ *
815
+ * ```sql
816
+ * select cast("age" as integer) as "age"
817
+ * from "person"
818
+ * ```
819
+ */
820
+ cast<T, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(expr: RE, dataType: DataTypeExpression): ExpressionWrapper<DB, TB, T>;
795
821
  /**
796
822
  * See {@link QueryCreator.withSchema}
797
823
  *
@@ -23,6 +23,8 @@ const binary_operation_node_js_1 = require("../operation-node/binary-operation-n
23
23
  const and_node_js_1 = require("../operation-node/and-node.js");
24
24
  const tuple_node_js_1 = require("../operation-node/tuple-node.js");
25
25
  const json_path_node_js_1 = require("../operation-node/json-path-node.js");
26
+ const data_type_parser_js_1 = require("../parser/data-type-parser.js");
27
+ const cast_node_js_1 = require("../operation-node/cast-node.js");
26
28
  function createExpressionBuilder(executor = noop_query_executor_js_1.NOOP_QUERY_EXECUTOR) {
27
29
  function binary(lhs, op, rhs) {
28
30
  return new expression_wrapper_js_1.ExpressionWrapper((0, binary_operation_parser_js_1.parseValueBinaryOperation)(lhs, op, rhs));
@@ -109,6 +111,9 @@ function createExpressionBuilder(executor = noop_query_executor_js_1.NOOP_QUERY_
109
111
  return new expression_wrapper_js_1.ExpressionWrapper(parens_node_js_1.ParensNode.create(node));
110
112
  }
111
113
  },
114
+ cast(expr, dataType) {
115
+ return new expression_wrapper_js_1.ExpressionWrapper(cast_node_js_1.CastNode.create((0, reference_parser_js_1.parseReferenceExpression)(expr), (0, data_type_parser_js_1.parseDataTypeExpression)(dataType)));
116
+ },
112
117
  withSchema(schema) {
113
118
  return createExpressionBuilder(executor.withPluginAtFront(new with_schema_plugin_js_1.WithSchemaPlugin(schema)));
114
119
  },
@@ -20,6 +20,8 @@ export * from './query-builder/on-conflict-builder.js';
20
20
  export * from './query-builder/aggregate-function-builder.js';
21
21
  export * from './query-builder/case-builder.js';
22
22
  export * from './query-builder/json-path-builder.js';
23
+ export * from './query-builder/merge-query-builder.js';
24
+ export * from './query-builder/merge-result.js';
23
25
  export * from './raw-builder/raw-builder.js';
24
26
  export * from './raw-builder/sql.js';
25
27
  export * from './query-executor/query-executor.js';
@@ -177,6 +179,10 @@ export * from './operation-node/json-path-leg-node.js';
177
179
  export * from './operation-node/json-path-node.js';
178
180
  export * from './operation-node/json-operator-chain-node.js';
179
181
  export * from './operation-node/tuple-node.js';
182
+ export * from './operation-node/merge-query-node.js';
183
+ export * from './operation-node/matched-node.js';
184
+ export * from './operation-node/fetch-node.js';
185
+ export * from './operation-node/top-node.js';
180
186
  export * from './util/column-type.js';
181
187
  export * from './util/compilable.js';
182
188
  export * from './util/explainable.js';
@@ -188,7 +194,7 @@ export { logOnce } from './util/log-once.js';
188
194
  export { SelectExpression, SelectCallback, SelectArg, Selection, CallbackSelection, } from './parser/select-parser.js';
189
195
  export { ReferenceExpression, ReferenceExpressionOrList, SimpleReferenceExpression, StringReference, ExtractTypeFromStringReference, ExtractTypeFromReferenceExpression, } from './parser/reference-parser.js';
190
196
  export { ValueExpression, ValueExpressionOrList, } from './parser/value-parser.js';
191
- export { TableExpression, TableExpressionOrList, } from './parser/table-parser.js';
197
+ export { SimpleTableReference, TableExpression, TableExpressionOrList, } from './parser/table-parser.js';
192
198
  export { JoinReferenceExpression, JoinCallbackExpression, } from './parser/join-parser.js';
193
199
  export { InsertObject } from './parser/insert-values-parser.js';
194
200
  export { UpdateObject } from './parser/update-set-parser.js';
package/dist/cjs/index.js CHANGED
@@ -38,6 +38,8 @@ __exportStar(require("./query-builder/on-conflict-builder.js"), exports);
38
38
  __exportStar(require("./query-builder/aggregate-function-builder.js"), exports);
39
39
  __exportStar(require("./query-builder/case-builder.js"), exports);
40
40
  __exportStar(require("./query-builder/json-path-builder.js"), exports);
41
+ __exportStar(require("./query-builder/merge-query-builder.js"), exports);
42
+ __exportStar(require("./query-builder/merge-result.js"), exports);
41
43
  __exportStar(require("./raw-builder/raw-builder.js"), exports);
42
44
  __exportStar(require("./raw-builder/sql.js"), exports);
43
45
  __exportStar(require("./query-executor/query-executor.js"), exports);
@@ -195,6 +197,10 @@ __exportStar(require("./operation-node/json-path-leg-node.js"), exports);
195
197
  __exportStar(require("./operation-node/json-path-node.js"), exports);
196
198
  __exportStar(require("./operation-node/json-operator-chain-node.js"), exports);
197
199
  __exportStar(require("./operation-node/tuple-node.js"), exports);
200
+ __exportStar(require("./operation-node/merge-query-node.js"), exports);
201
+ __exportStar(require("./operation-node/matched-node.js"), exports);
202
+ __exportStar(require("./operation-node/fetch-node.js"), exports);
203
+ __exportStar(require("./operation-node/top-node.js"), exports);
198
204
  __exportStar(require("./util/column-type.js"), exports);
199
205
  __exportStar(require("./util/compilable.js"), exports);
200
206
  __exportStar(require("./util/explainable.js"), exports);
@@ -13,7 +13,7 @@ exports.AddIndexNode = (0, object_utils_js_1.freeze)({
13
13
  create(name) {
14
14
  return (0, object_utils_js_1.freeze)({
15
15
  kind: 'AddIndexNode',
16
- name: identifier_node_js_1.IdentifierNode.create(name)
16
+ name: identifier_node_js_1.IdentifierNode.create(name),
17
17
  });
18
18
  },
19
19
  cloneWith(node, props) {
@@ -0,0 +1,13 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ export interface CastNode extends OperationNode {
3
+ readonly kind: 'CastNode';
4
+ readonly expression: OperationNode;
5
+ readonly dataType: OperationNode;
6
+ }
7
+ /**
8
+ * @internal
9
+ */
10
+ export declare const CastNode: Readonly<{
11
+ is(node: OperationNode): node is CastNode;
12
+ create(expression: OperationNode, dataType: OperationNode): CastNode;
13
+ }>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CastNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ /**
6
+ * @internal
7
+ */
8
+ exports.CastNode = (0, object_utils_js_1.freeze)({
9
+ is(node) {
10
+ return node.kind === 'CastNode';
11
+ },
12
+ create(expression, dataType) {
13
+ return (0, object_utils_js_1.freeze)({
14
+ kind: 'CastNode',
15
+ expression,
16
+ dataType,
17
+ });
18
+ },
19
+ });
@@ -21,6 +21,7 @@ export interface ColumnDefinitionNode extends OperationNode {
21
21
  readonly frontModifiers?: ReadonlyArray<OperationNode>;
22
22
  readonly endModifiers?: ReadonlyArray<OperationNode>;
23
23
  readonly nullsNotDistinct?: boolean;
24
+ readonly identity?: boolean;
24
25
  }
25
26
  /**
26
27
  * @internal
@@ -1,5 +1,7 @@
1
1
  import { OperationNode } from './operation-node.js';
2
- export type ColumnDataType = 'varchar' | `varchar(${number})` | 'char' | `char(${number})` | 'text' | 'integer' | 'int2' | 'int4' | 'int8' | 'bigint' | 'boolean' | 'real' | 'double precision' | 'float4' | 'float8' | 'decimal' | `decimal(${number}, ${number})` | 'numeric' | `numeric(${number}, ${number})` | 'binary' | `binary(${number})` | 'bytea' | 'date' | 'datetime' | `datetime(${number})` | 'time' | `time(${number})` | 'timetz' | `timetz(${number})` | 'timestamp' | `timestamp(${number})` | 'timestamptz' | `timestamptz(${number})` | 'serial' | 'bigserial' | 'uuid' | 'json' | 'jsonb' | 'blob';
2
+ declare const SIMPLE_COLUMN_DATA_TYPES: readonly ["varchar", "char", "text", "integer", "int2", "int4", "int8", "smallint", "bigint", "boolean", "real", "double precision", "float4", "float8", "decimal", "numeric", "binary", "bytea", "date", "datetime", "time", "timetz", "timestamp", "timestamptz", "serial", "bigserial", "uuid", "json", "jsonb", "blob"];
3
+ type SimpleColumnDataType = (typeof SIMPLE_COLUMN_DATA_TYPES)[number];
4
+ export type ColumnDataType = SimpleColumnDataType | `varchar(${number})` | `char(${number})` | `decimal(${number}, ${number})` | `numeric(${number}, ${number})` | `binary(${number})` | `datetime(${number})` | `time(${number})` | `timetz(${number})` | `timestamp(${number})` | `timestamptz(${number})`;
3
5
  export type DataTypeParams = Omit<DataTypeNode, 'kind' | 'dataType'>;
4
6
  export interface DataTypeNode extends OperationNode {
5
7
  readonly kind: 'DataTypeNode';
@@ -12,3 +14,5 @@ export declare const DataTypeNode: Readonly<{
12
14
  is(node: OperationNode): node is DataTypeNode;
13
15
  create(dataType: ColumnDataType): DataTypeNode;
14
16
  }>;
17
+ export declare function isColumnDataType(dataType: string): dataType is ColumnDataType;
18
+ export {};
@@ -1,7 +1,51 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DataTypeNode = void 0;
3
+ exports.isColumnDataType = exports.DataTypeNode = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
+ const SIMPLE_COLUMN_DATA_TYPES = [
6
+ 'varchar',
7
+ 'char',
8
+ 'text',
9
+ 'integer',
10
+ 'int2',
11
+ 'int4',
12
+ 'int8',
13
+ 'smallint',
14
+ 'bigint',
15
+ 'boolean',
16
+ 'real',
17
+ 'double precision',
18
+ 'float4',
19
+ 'float8',
20
+ 'decimal',
21
+ 'numeric',
22
+ 'binary',
23
+ 'bytea',
24
+ 'date',
25
+ 'datetime',
26
+ 'time',
27
+ 'timetz',
28
+ 'timestamp',
29
+ 'timestamptz',
30
+ 'serial',
31
+ 'bigserial',
32
+ 'uuid',
33
+ 'json',
34
+ 'jsonb',
35
+ 'blob',
36
+ ];
37
+ const COLUMN_DATA_TYPE_REGEX = [
38
+ /^varchar\(\d+\)$/,
39
+ /^char\(\d+\)$/,
40
+ /^decimal\(\d+, \d+\)$/,
41
+ /^numeric\(\d+, \d+\)$/,
42
+ /^binary\(\d+\)$/,
43
+ /^datetime\(\d+\)$/,
44
+ /^time\(\d+\)$/,
45
+ /^timez\(\d+\)$/,
46
+ /^timestamp\(\d+\)$/,
47
+ /^timestamptz\(\d+\)$/,
48
+ ];
5
49
  /**
6
50
  * @internal
7
51
  */
@@ -16,3 +60,13 @@ exports.DataTypeNode = (0, object_utils_js_1.freeze)({
16
60
  });
17
61
  },
18
62
  });
63
+ function isColumnDataType(dataType) {
64
+ if (SIMPLE_COLUMN_DATA_TYPES.includes(dataType)) {
65
+ return true;
66
+ }
67
+ if (COLUMN_DATA_TYPE_REGEX.some((r) => r.test(dataType))) {
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+ exports.isColumnDataType = isColumnDataType;
@@ -9,6 +9,7 @@ import { OrderByNode } from './order-by-node.js';
9
9
  import { OrderByItemNode } from './order-by-item-node.js';
10
10
  import { ExplainNode } from './explain-node.js';
11
11
  import { UsingNode } from './using-node.js';
12
+ import { TopNode } from './top-node.js';
12
13
  export interface DeleteQueryNode extends OperationNode {
13
14
  readonly kind: 'DeleteQueryNode';
14
15
  readonly from: FromNode;
@@ -20,6 +21,7 @@ export interface DeleteQueryNode extends OperationNode {
20
21
  readonly orderBy?: OrderByNode;
21
22
  readonly limit?: LimitNode;
22
23
  readonly explain?: ExplainNode;
24
+ readonly top?: TopNode;
23
25
  }
24
26
  /**
25
27
  * @internal
@@ -28,6 +30,8 @@ export declare const DeleteQueryNode: Readonly<{
28
30
  is(node: OperationNode): node is DeleteQueryNode;
29
31
  create(fromItems: OperationNode[], withNode?: WithNode): DeleteQueryNode;
30
32
  cloneWithOrderByItems(deleteNode: DeleteQueryNode, items: ReadonlyArray<OrderByItemNode>): DeleteQueryNode;
33
+ cloneWithoutOrderBy(deleteNode: DeleteQueryNode): DeleteQueryNode;
31
34
  cloneWithLimit(deleteNode: DeleteQueryNode, limit: LimitNode): DeleteQueryNode;
35
+ cloneWithoutLimit(deleteNode: DeleteQueryNode): DeleteQueryNode;
32
36
  cloneWithUsing(deleteNode: DeleteQueryNode, tables: OperationNode[]): DeleteQueryNode;
33
37
  }>;
@@ -27,12 +27,24 @@ exports.DeleteQueryNode = (0, object_utils_js_1.freeze)({
27
27
  : order_by_node_js_1.OrderByNode.create(items),
28
28
  });
29
29
  },
30
+ cloneWithoutOrderBy(deleteNode) {
31
+ return (0, object_utils_js_1.freeze)({
32
+ ...deleteNode,
33
+ orderBy: undefined,
34
+ });
35
+ },
30
36
  cloneWithLimit(deleteNode, limit) {
31
37
  return (0, object_utils_js_1.freeze)({
32
38
  ...deleteNode,
33
39
  limit,
34
40
  });
35
41
  },
42
+ cloneWithoutLimit(deleteNode) {
43
+ return (0, object_utils_js_1.freeze)({
44
+ ...deleteNode,
45
+ limit: undefined,
46
+ });
47
+ },
36
48
  cloneWithUsing(deleteNode, tables) {
37
49
  return (0, object_utils_js_1.freeze)({
38
50
  ...deleteNode,
@@ -0,0 +1,15 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ import { ValueNode } from './value-node.js';
3
+ export type FetchModifier = 'only' | 'with ties';
4
+ export interface FetchNode extends OperationNode {
5
+ readonly kind: 'FetchNode';
6
+ readonly rowCount: ValueNode;
7
+ readonly modifier: FetchModifier;
8
+ }
9
+ /**
10
+ * @internal
11
+ */
12
+ export declare const FetchNode: {
13
+ is(node: OperationNode): node is FetchNode;
14
+ create(rowCount: number | bigint, modifier: FetchModifier): FetchNode;
15
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FetchNode = void 0;
4
+ const value_node_js_1 = require("./value-node.js");
5
+ /**
6
+ * @internal
7
+ */
8
+ exports.FetchNode = {
9
+ is(node) {
10
+ return node.kind === 'FetchNode';
11
+ },
12
+ create(rowCount, modifier) {
13
+ return {
14
+ kind: 'FetchNode',
15
+ rowCount: value_node_js_1.ValueNode.create(rowCount),
16
+ modifier,
17
+ };
18
+ },
19
+ };
@@ -5,11 +5,12 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
5
5
  import { OperationNode } from './operation-node.js';
6
6
  import { ReturningNode } from './returning-node.js';
7
7
  import { TableNode } from './table-node.js';
8
+ import { TopNode } from './top-node.js';
8
9
  import { WithNode } from './with-node.js';
9
10
  export type InsertQueryNodeProps = Omit<InsertQueryNode, 'kind' | 'into'>;
10
11
  export interface InsertQueryNode extends OperationNode {
11
12
  readonly kind: 'InsertQueryNode';
12
- readonly into: TableNode;
13
+ readonly into?: TableNode;
13
14
  readonly columns?: ReadonlyArray<ColumnNode>;
14
15
  readonly values?: OperationNode;
15
16
  readonly returning?: ReturningNode;
@@ -20,6 +21,7 @@ export interface InsertQueryNode extends OperationNode {
20
21
  readonly replace?: boolean;
21
22
  readonly explain?: ExplainNode;
22
23
  readonly defaultValues?: boolean;
24
+ readonly top?: TopNode;
23
25
  }
24
26
  /**
25
27
  * @internal
@@ -27,5 +29,6 @@ export interface InsertQueryNode extends OperationNode {
27
29
  export declare const InsertQueryNode: Readonly<{
28
30
  is(node: OperationNode): node is InsertQueryNode;
29
31
  create(into: TableNode, withNode?: WithNode, replace?: boolean): InsertQueryNode;
32
+ createWithoutInto(): InsertQueryNode;
30
33
  cloneWith(insertQuery: InsertQueryNode, props: InsertQueryNodeProps): InsertQueryNode;
31
34
  }>;
@@ -17,6 +17,11 @@ exports.InsertQueryNode = (0, object_utils_js_1.freeze)({
17
17
  replace,
18
18
  });
19
19
  },
20
+ createWithoutInto() {
21
+ return (0, object_utils_js_1.freeze)({
22
+ kind: 'InsertQueryNode',
23
+ });
24
+ },
20
25
  cloneWith(insertQuery, props) {
21
26
  return (0, object_utils_js_1.freeze)({
22
27
  ...insertQuery,
@@ -1,6 +1,6 @@
1
1
  import { OnNode } from './on-node.js';
2
2
  import { OperationNode } from './operation-node.js';
3
- export type JoinType = 'InnerJoin' | 'LeftJoin' | 'RightJoin' | 'FullJoin' | 'LateralInnerJoin' | 'LateralLeftJoin';
3
+ export type JoinType = 'InnerJoin' | 'LeftJoin' | 'RightJoin' | 'FullJoin' | 'LateralInnerJoin' | 'LateralLeftJoin' | 'Using';
4
4
  export interface JoinNode extends OperationNode {
5
5
  readonly kind: 'JoinNode';
6
6
  readonly joinType: JoinType;
@@ -0,0 +1,13 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ export interface MatchedNode extends OperationNode {
3
+ readonly kind: 'MatchedNode';
4
+ readonly not: boolean;
5
+ readonly bySource: boolean;
6
+ }
7
+ /**
8
+ * @internal
9
+ */
10
+ export declare const MatchedNode: Readonly<{
11
+ is(node: OperationNode): node is MatchedNode;
12
+ create(not: boolean, bySource?: boolean): MatchedNode;
13
+ }>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MatchedNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ /**
6
+ * @internal
7
+ */
8
+ exports.MatchedNode = (0, object_utils_js_1.freeze)({
9
+ is(node) {
10
+ return node.kind === 'MatchedNode';
11
+ },
12
+ create(not, bySource = false) {
13
+ return (0, object_utils_js_1.freeze)({
14
+ kind: 'MatchedNode',
15
+ not,
16
+ bySource,
17
+ });
18
+ },
19
+ });