@mikro-orm/sql 7.0.10 → 7.0.11-dev.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 (87) hide show
  1. package/AbstractSqlConnection.d.ts +58 -94
  2. package/AbstractSqlConnection.js +238 -235
  3. package/AbstractSqlDriver.d.ts +155 -410
  4. package/AbstractSqlDriver.js +1968 -2096
  5. package/AbstractSqlPlatform.d.ts +75 -85
  6. package/AbstractSqlPlatform.js +162 -166
  7. package/PivotCollectionPersister.d.ts +15 -33
  8. package/PivotCollectionPersister.js +160 -158
  9. package/README.md +1 -1
  10. package/SqlEntityManager.d.ts +22 -67
  11. package/SqlEntityManager.js +38 -54
  12. package/SqlEntityRepository.d.ts +14 -14
  13. package/SqlEntityRepository.js +23 -23
  14. package/dialects/mssql/MsSqlNativeQueryBuilder.d.ts +12 -12
  15. package/dialects/mssql/MsSqlNativeQueryBuilder.js +201 -199
  16. package/dialects/mysql/BaseMySqlPlatform.d.ts +46 -65
  17. package/dialects/mysql/BaseMySqlPlatform.js +134 -137
  18. package/dialects/mysql/MySqlExceptionConverter.d.ts +6 -6
  19. package/dialects/mysql/MySqlExceptionConverter.js +77 -91
  20. package/dialects/mysql/MySqlNativeQueryBuilder.d.ts +3 -3
  21. package/dialects/mysql/MySqlNativeQueryBuilder.js +69 -66
  22. package/dialects/mysql/MySqlSchemaHelper.d.ts +39 -58
  23. package/dialects/mysql/MySqlSchemaHelper.js +319 -327
  24. package/dialects/oracledb/OracleDialect.d.ts +52 -81
  25. package/dialects/oracledb/OracleDialect.js +149 -155
  26. package/dialects/oracledb/OracleNativeQueryBuilder.d.ts +12 -12
  27. package/dialects/oracledb/OracleNativeQueryBuilder.js +243 -239
  28. package/dialects/postgresql/BasePostgreSqlPlatform.d.ts +106 -109
  29. package/dialects/postgresql/BasePostgreSqlPlatform.js +353 -354
  30. package/dialects/postgresql/FullTextType.d.ts +6 -10
  31. package/dialects/postgresql/FullTextType.js +51 -51
  32. package/dialects/postgresql/PostgreSqlExceptionConverter.d.ts +5 -5
  33. package/dialects/postgresql/PostgreSqlExceptionConverter.js +43 -55
  34. package/dialects/postgresql/PostgreSqlNativeQueryBuilder.d.ts +1 -1
  35. package/dialects/postgresql/PostgreSqlNativeQueryBuilder.js +4 -4
  36. package/dialects/postgresql/PostgreSqlSchemaHelper.d.ts +82 -117
  37. package/dialects/postgresql/PostgreSqlSchemaHelper.js +711 -747
  38. package/dialects/sqlite/BaseSqliteConnection.d.ts +5 -3
  39. package/dialects/sqlite/BaseSqliteConnection.js +19 -21
  40. package/dialects/sqlite/NodeSqliteDialect.d.ts +1 -1
  41. package/dialects/sqlite/NodeSqliteDialect.js +23 -23
  42. package/dialects/sqlite/SqliteDriver.d.ts +1 -1
  43. package/dialects/sqlite/SqliteDriver.js +3 -3
  44. package/dialects/sqlite/SqliteExceptionConverter.d.ts +6 -6
  45. package/dialects/sqlite/SqliteExceptionConverter.js +51 -67
  46. package/dialects/sqlite/SqliteNativeQueryBuilder.d.ts +2 -2
  47. package/dialects/sqlite/SqliteNativeQueryBuilder.js +7 -7
  48. package/dialects/sqlite/SqlitePlatform.d.ts +72 -63
  49. package/dialects/sqlite/SqlitePlatform.js +139 -139
  50. package/dialects/sqlite/SqliteSchemaHelper.d.ts +60 -77
  51. package/dialects/sqlite/SqliteSchemaHelper.js +522 -541
  52. package/package.json +2 -2
  53. package/plugin/index.d.ts +35 -42
  54. package/plugin/index.js +36 -43
  55. package/plugin/transformer.d.ts +94 -117
  56. package/plugin/transformer.js +881 -890
  57. package/query/ArrayCriteriaNode.d.ts +4 -4
  58. package/query/ArrayCriteriaNode.js +18 -18
  59. package/query/CriteriaNode.d.ts +25 -35
  60. package/query/CriteriaNode.js +123 -133
  61. package/query/CriteriaNodeFactory.d.ts +6 -49
  62. package/query/CriteriaNodeFactory.js +94 -97
  63. package/query/NativeQueryBuilder.d.ts +120 -120
  64. package/query/NativeQueryBuilder.js +501 -507
  65. package/query/ObjectCriteriaNode.d.ts +12 -12
  66. package/query/ObjectCriteriaNode.js +282 -298
  67. package/query/QueryBuilder.d.ts +906 -1558
  68. package/query/QueryBuilder.js +2202 -2331
  69. package/query/QueryBuilderHelper.d.ts +72 -153
  70. package/query/QueryBuilderHelper.js +1032 -1084
  71. package/query/ScalarCriteriaNode.d.ts +3 -3
  72. package/query/ScalarCriteriaNode.js +46 -53
  73. package/query/enums.d.ts +14 -14
  74. package/query/enums.js +14 -14
  75. package/query/raw.d.ts +6 -16
  76. package/query/raw.js +10 -10
  77. package/schema/DatabaseSchema.d.ts +50 -74
  78. package/schema/DatabaseSchema.js +327 -355
  79. package/schema/DatabaseTable.d.ts +73 -96
  80. package/schema/DatabaseTable.js +927 -1002
  81. package/schema/SchemaComparator.d.ts +66 -70
  82. package/schema/SchemaComparator.js +764 -790
  83. package/schema/SchemaHelper.d.ts +97 -128
  84. package/schema/SchemaHelper.js +668 -683
  85. package/schema/SqlSchemaGenerator.d.ts +59 -79
  86. package/schema/SqlSchemaGenerator.js +495 -525
  87. package/typings.d.ts +275 -405
@@ -1,92 +1,82 @@
1
- import {
2
- type RawQueryFragment,
3
- type Constructor,
4
- type EntityManager,
5
- type EntityRepository,
6
- type IDatabaseDriver,
7
- type IsolationLevel,
8
- type MikroORM,
9
- Platform,
10
- } from '@mikro-orm/core';
1
+ import { type RawQueryFragment, type Constructor, type EntityManager, type EntityRepository, type IDatabaseDriver, type IsolationLevel, type MikroORM, Platform } from '@mikro-orm/core';
11
2
  import { SqlSchemaGenerator } from './schema/SqlSchemaGenerator.js';
12
3
  import { type SchemaHelper } from './schema/SchemaHelper.js';
13
4
  import type { IndexDef } from './typings.js';
14
5
  import { NativeQueryBuilder } from './query/NativeQueryBuilder.js';
15
6
  /** Base class for SQL database platforms, providing SQL generation and quoting utilities. */
16
7
  export declare abstract class AbstractSqlPlatform extends Platform {
17
- #private;
18
- protected readonly schemaHelper?: SchemaHelper;
19
- usesPivotTable(): boolean;
20
- indexForeignKeys(): boolean;
21
- getRepositoryClass<T extends object>(): Constructor<EntityRepository<T>>;
22
- getSchemaHelper(): SchemaHelper | undefined;
23
- /** @inheritDoc */
24
- lookupExtensions(orm: MikroORM): void;
25
- getSchemaGenerator(driver: IDatabaseDriver, em?: EntityManager): SqlSchemaGenerator;
26
- /** @internal */
27
- createNativeQueryBuilder(): NativeQueryBuilder;
28
- getBeginTransactionSQL(options?: { isolationLevel?: IsolationLevel; readOnly?: boolean }): string[];
29
- getCommitTransactionSQL(): string;
30
- getRollbackTransactionSQL(): string;
31
- getSavepointSQL(savepointName: string): string;
32
- getRollbackToSavepointSQL(savepointName: string): string;
33
- getReleaseSavepointSQL(savepointName: string): string;
34
- quoteValue(value: any): string;
35
- getSearchJsonPropertySQL(path: string, type: string, aliased: boolean): string | RawQueryFragment;
36
- getSearchJsonPropertyKey(path: string[], type: string, aliased: boolean, value?: unknown): string | RawQueryFragment;
37
- /**
38
- * Quotes a key for use inside a JSON path expression (e.g. `$.key`).
39
- * Simple alphanumeric keys are left unquoted; others are wrapped in double quotes.
40
- * @internal
41
- */
42
- quoteJsonKey(key: string): string;
43
- getJsonIndexDefinition(index: IndexDef): string[];
44
- supportsUnionWhere(): boolean;
45
- /** Whether the platform supports `count(distinct col1, col2)` with multiple columns. If false, a subquery wrapper is used instead. */
46
- supportsMultiColumnCountDistinct(): boolean;
47
- supportsSchemas(): boolean;
48
- /** @inheritDoc */
49
- generateCustomOrder(escapedColumn: string, values: unknown[]): string;
50
- /**
51
- * @internal
52
- */
53
- getOrderByExpression(column: string, direction: string, collation?: string): string[];
54
- /**
55
- * Quotes a collation name for use in COLLATE clauses.
56
- * @internal
57
- */
58
- quoteCollation(collation: string): string;
59
- /** @internal */
60
- protected validateCollationName(collation: string): void;
61
- /** @internal */
62
- validateJsonPropertyName(name: string): void;
63
- /**
64
- * Returns FROM clause for JSON array iteration.
65
- * @internal
66
- */
67
- getJsonArrayFromSQL(
68
- column: string,
69
- alias: string,
70
- _properties: {
71
- name: string;
72
- type: string;
73
- }[],
74
- ): string;
75
- /**
76
- * Returns SQL expression to access an element's property within a JSON array iteration.
77
- * @internal
78
- */
79
- getJsonArrayElementPropertySQL(alias: string, property: string, _type: string): string;
80
- /**
81
- * Wraps JSON array FROM clause and WHERE condition into a full EXISTS condition.
82
- * MySQL overrides this because `json_table` doesn't support correlated subqueries.
83
- * @internal
84
- */
85
- getJsonArrayExistsSQL(from: string, where: string): string;
86
- /**
87
- * Maps a runtime type name (e.g. 'string', 'number') to a driver-specific bind type constant.
88
- * Used by NativeQueryBuilder for output bindings.
89
- * @internal
90
- */
91
- mapToBindType(type: string): unknown;
8
+ #private;
9
+ protected readonly schemaHelper?: SchemaHelper;
10
+ usesPivotTable(): boolean;
11
+ indexForeignKeys(): boolean;
12
+ getRepositoryClass<T extends object>(): Constructor<EntityRepository<T>>;
13
+ getSchemaHelper(): SchemaHelper | undefined;
14
+ /** @inheritDoc */
15
+ lookupExtensions(orm: MikroORM): void;
16
+ getSchemaGenerator(driver: IDatabaseDriver, em?: EntityManager): SqlSchemaGenerator;
17
+ /** @internal */
18
+ createNativeQueryBuilder(): NativeQueryBuilder;
19
+ getBeginTransactionSQL(options?: {
20
+ isolationLevel?: IsolationLevel;
21
+ readOnly?: boolean;
22
+ }): string[];
23
+ getCommitTransactionSQL(): string;
24
+ getRollbackTransactionSQL(): string;
25
+ getSavepointSQL(savepointName: string): string;
26
+ getRollbackToSavepointSQL(savepointName: string): string;
27
+ getReleaseSavepointSQL(savepointName: string): string;
28
+ quoteValue(value: any): string;
29
+ getSearchJsonPropertySQL(path: string, type: string, aliased: boolean): string | RawQueryFragment;
30
+ getSearchJsonPropertyKey(path: string[], type: string, aliased: boolean, value?: unknown): string | RawQueryFragment;
31
+ /**
32
+ * Quotes a key for use inside a JSON path expression (e.g. `$.key`).
33
+ * Simple alphanumeric keys are left unquoted; others are wrapped in double quotes.
34
+ * @internal
35
+ */
36
+ quoteJsonKey(key: string): string;
37
+ getJsonIndexDefinition(index: IndexDef): string[];
38
+ supportsUnionWhere(): boolean;
39
+ /** Whether the platform supports `count(distinct col1, col2)` with multiple columns. If false, a subquery wrapper is used instead. */
40
+ supportsMultiColumnCountDistinct(): boolean;
41
+ supportsSchemas(): boolean;
42
+ /** @inheritDoc */
43
+ generateCustomOrder(escapedColumn: string, values: unknown[]): string;
44
+ /**
45
+ * @internal
46
+ */
47
+ getOrderByExpression(column: string, direction: string, collation?: string): string[];
48
+ /**
49
+ * Quotes a collation name for use in COLLATE clauses.
50
+ * @internal
51
+ */
52
+ quoteCollation(collation: string): string;
53
+ /** @internal */
54
+ protected validateCollationName(collation: string): void;
55
+ /** @internal */
56
+ validateJsonPropertyName(name: string): void;
57
+ /**
58
+ * Returns FROM clause for JSON array iteration.
59
+ * @internal
60
+ */
61
+ getJsonArrayFromSQL(column: string, alias: string, _properties: {
62
+ name: string;
63
+ type: string;
64
+ }[]): string;
65
+ /**
66
+ * Returns SQL expression to access an element's property within a JSON array iteration.
67
+ * @internal
68
+ */
69
+ getJsonArrayElementPropertySQL(alias: string, property: string, _type: string): string;
70
+ /**
71
+ * Wraps JSON array FROM clause and WHERE condition into a full EXISTS condition.
72
+ * MySQL overrides this because `json_table` doesn't support correlated subqueries.
73
+ * @internal
74
+ */
75
+ getJsonArrayExistsSQL(from: string, where: string): string;
76
+ /**
77
+ * Maps a runtime type name (e.g. 'string', 'number') to a driver-specific bind type constant.
78
+ * Used by NativeQueryBuilder for output bindings.
79
+ * @internal
80
+ */
81
+ mapToBindType(type: string): unknown;
92
82
  }
@@ -1,172 +1,168 @@
1
- import { isRaw, JsonProperty, Platform, raw, Utils } from '@mikro-orm/core';
1
+ import { isRaw, JsonProperty, Platform, raw, Utils, } from '@mikro-orm/core';
2
2
  import { SqlEntityRepository } from './SqlEntityRepository.js';
3
3
  import { SqlSchemaGenerator } from './schema/SqlSchemaGenerator.js';
4
4
  import { NativeQueryBuilder } from './query/NativeQueryBuilder.js';
5
5
  /** Base class for SQL database platforms, providing SQL generation and quoting utilities. */
6
6
  export class AbstractSqlPlatform extends Platform {
7
- static #JSON_PROPERTY_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
8
- schemaHelper;
9
- usesPivotTable() {
10
- return true;
11
- }
12
- indexForeignKeys() {
13
- return true;
14
- }
15
- getRepositoryClass() {
16
- return SqlEntityRepository;
17
- }
18
- getSchemaHelper() {
19
- return this.schemaHelper;
20
- }
21
- /** @inheritDoc */
22
- lookupExtensions(orm) {
23
- SqlSchemaGenerator.register(orm);
24
- }
25
- /* v8 ignore next: kept for type inference only */
26
- getSchemaGenerator(driver, em) {
27
- return new SqlSchemaGenerator(em ?? driver);
28
- }
29
- /** @internal */
30
- /* v8 ignore next */
31
- createNativeQueryBuilder() {
32
- return new NativeQueryBuilder(this);
33
- }
34
- getBeginTransactionSQL(options) {
35
- if (options?.isolationLevel) {
36
- return [`set transaction isolation level ${options.isolationLevel}`, 'begin'];
37
- }
38
- return ['begin'];
39
- }
40
- getCommitTransactionSQL() {
41
- return 'commit';
42
- }
43
- getRollbackTransactionSQL() {
44
- return 'rollback';
45
- }
46
- getSavepointSQL(savepointName) {
47
- return `savepoint ${this.quoteIdentifier(savepointName)}`;
48
- }
49
- getRollbackToSavepointSQL(savepointName) {
50
- return `rollback to savepoint ${this.quoteIdentifier(savepointName)}`;
51
- }
52
- getReleaseSavepointSQL(savepointName) {
53
- return `release savepoint ${this.quoteIdentifier(savepointName)}`;
54
- }
55
- quoteValue(value) {
56
- if (isRaw(value)) {
57
- return this.formatQuery(value.sql, value.params);
58
- }
59
- if (Utils.isPlainObject(value) || value?.[JsonProperty]) {
60
- return this.escape(JSON.stringify(value));
61
- }
62
- return this.escape(value);
63
- }
64
- getSearchJsonPropertySQL(path, type, aliased) {
65
- return this.getSearchJsonPropertyKey(path.split('->'), type, aliased);
66
- }
67
- getSearchJsonPropertyKey(path, type, aliased, value) {
68
- const [a, ...b] = path;
69
- if (aliased) {
70
- return raw(
71
- alias => `json_extract(${this.quoteIdentifier(`${alias}.${a}`)}, '$.${b.map(this.quoteJsonKey).join('.')}')`,
72
- );
73
- }
74
- return raw(`json_extract(${this.quoteIdentifier(a)}, '$.${b.map(this.quoteJsonKey).join('.')}')`);
75
- }
76
- /**
77
- * Quotes a key for use inside a JSON path expression (e.g. `$.key`).
78
- * Simple alphanumeric keys are left unquoted; others are wrapped in double quotes.
79
- * @internal
80
- */
81
- quoteJsonKey(key) {
82
- return /^[a-z]\w*$/i.exec(key) ? key : `"${key}"`;
83
- }
84
- getJsonIndexDefinition(index) {
85
- return index.columnNames.map(column => {
86
- if (!column.includes('.')) {
87
- return column;
88
- }
89
- const [root, ...path] = column.split('.');
90
- return `(json_extract(${root}, '$.${path.join('.')}'))`;
91
- });
92
- }
93
- supportsUnionWhere() {
94
- return true;
95
- }
96
- /** Whether the platform supports `count(distinct col1, col2)` with multiple columns. If false, a subquery wrapper is used instead. */
97
- supportsMultiColumnCountDistinct() {
98
- return false;
99
- }
100
- supportsSchemas() {
101
- return false;
102
- }
103
- /** @inheritDoc */
104
- generateCustomOrder(escapedColumn, values) {
105
- let ret = '(case ';
106
- values.forEach((v, i) => {
107
- ret += `when ${escapedColumn} = ${this.quoteValue(v)} then ${i} `;
108
- });
109
- return ret + 'else null end)';
110
- }
111
- /**
112
- * @internal
113
- */
114
- getOrderByExpression(column, direction, collation) {
115
- if (collation) {
116
- return [`${column} collate ${this.quoteCollation(collation)} ${direction.toLowerCase()}`];
117
- }
118
- return [`${column} ${direction.toLowerCase()}`];
119
- }
120
- /**
121
- * Quotes a collation name for use in COLLATE clauses.
122
- * @internal
123
- */
124
- quoteCollation(collation) {
125
- this.validateCollationName(collation);
126
- return this.quoteIdentifier(collation);
127
- }
128
- /** @internal */
129
- validateCollationName(collation) {
130
- if (!/^[\w]+$/.test(collation)) {
131
- throw new Error(`Invalid collation name: '${collation}'. Collation names must contain only word characters.`);
132
- }
133
- }
134
- /** @internal */
135
- validateJsonPropertyName(name) {
136
- if (!AbstractSqlPlatform.#JSON_PROPERTY_NAME_RE.test(name)) {
137
- throw new Error(
138
- `Invalid JSON property name: '${name}'. JSON property names must contain only alphanumeric characters and underscores.`,
139
- );
140
- }
141
- }
142
- /**
143
- * Returns FROM clause for JSON array iteration.
144
- * @internal
145
- */
146
- getJsonArrayFromSQL(column, alias, _properties) {
147
- return `json_each(${column}) as ${this.quoteIdentifier(alias)}`;
148
- }
149
- /**
150
- * Returns SQL expression to access an element's property within a JSON array iteration.
151
- * @internal
152
- */
153
- getJsonArrayElementPropertySQL(alias, property, _type) {
154
- return `${this.quoteIdentifier(alias)}.${this.quoteIdentifier(property)}`;
155
- }
156
- /**
157
- * Wraps JSON array FROM clause and WHERE condition into a full EXISTS condition.
158
- * MySQL overrides this because `json_table` doesn't support correlated subqueries.
159
- * @internal
160
- */
161
- getJsonArrayExistsSQL(from, where) {
162
- return `exists (select 1 from ${from} where ${where})`;
163
- }
164
- /**
165
- * Maps a runtime type name (e.g. 'string', 'number') to a driver-specific bind type constant.
166
- * Used by NativeQueryBuilder for output bindings.
167
- * @internal
168
- */
169
- mapToBindType(type) {
170
- return type;
171
- }
7
+ static #JSON_PROPERTY_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
8
+ schemaHelper;
9
+ usesPivotTable() {
10
+ return true;
11
+ }
12
+ indexForeignKeys() {
13
+ return true;
14
+ }
15
+ getRepositoryClass() {
16
+ return SqlEntityRepository;
17
+ }
18
+ getSchemaHelper() {
19
+ return this.schemaHelper;
20
+ }
21
+ /** @inheritDoc */
22
+ lookupExtensions(orm) {
23
+ SqlSchemaGenerator.register(orm);
24
+ }
25
+ /* v8 ignore next: kept for type inference only */
26
+ getSchemaGenerator(driver, em) {
27
+ return new SqlSchemaGenerator(em ?? driver);
28
+ }
29
+ /** @internal */
30
+ /* v8 ignore next */
31
+ createNativeQueryBuilder() {
32
+ return new NativeQueryBuilder(this);
33
+ }
34
+ getBeginTransactionSQL(options) {
35
+ if (options?.isolationLevel) {
36
+ return [`set transaction isolation level ${options.isolationLevel}`, 'begin'];
37
+ }
38
+ return ['begin'];
39
+ }
40
+ getCommitTransactionSQL() {
41
+ return 'commit';
42
+ }
43
+ getRollbackTransactionSQL() {
44
+ return 'rollback';
45
+ }
46
+ getSavepointSQL(savepointName) {
47
+ return `savepoint ${this.quoteIdentifier(savepointName)}`;
48
+ }
49
+ getRollbackToSavepointSQL(savepointName) {
50
+ return `rollback to savepoint ${this.quoteIdentifier(savepointName)}`;
51
+ }
52
+ getReleaseSavepointSQL(savepointName) {
53
+ return `release savepoint ${this.quoteIdentifier(savepointName)}`;
54
+ }
55
+ quoteValue(value) {
56
+ if (isRaw(value)) {
57
+ return this.formatQuery(value.sql, value.params);
58
+ }
59
+ if (Utils.isPlainObject(value) || value?.[JsonProperty]) {
60
+ return this.escape(JSON.stringify(value));
61
+ }
62
+ return this.escape(value);
63
+ }
64
+ getSearchJsonPropertySQL(path, type, aliased) {
65
+ return this.getSearchJsonPropertyKey(path.split('->'), type, aliased);
66
+ }
67
+ getSearchJsonPropertyKey(path, type, aliased, value) {
68
+ const [a, ...b] = path;
69
+ if (aliased) {
70
+ return raw(alias => `json_extract(${this.quoteIdentifier(`${alias}.${a}`)}, '$.${b.map(this.quoteJsonKey).join('.')}')`);
71
+ }
72
+ return raw(`json_extract(${this.quoteIdentifier(a)}, '$.${b.map(this.quoteJsonKey).join('.')}')`);
73
+ }
74
+ /**
75
+ * Quotes a key for use inside a JSON path expression (e.g. `$.key`).
76
+ * Simple alphanumeric keys are left unquoted; others are wrapped in double quotes.
77
+ * @internal
78
+ */
79
+ quoteJsonKey(key) {
80
+ return /^[a-z]\w*$/i.exec(key) ? key : `"${key}"`;
81
+ }
82
+ getJsonIndexDefinition(index) {
83
+ return index.columnNames.map(column => {
84
+ if (!column.includes('.')) {
85
+ return column;
86
+ }
87
+ const [root, ...path] = column.split('.');
88
+ return `(json_extract(${root}, '$.${path.join('.')}'))`;
89
+ });
90
+ }
91
+ supportsUnionWhere() {
92
+ return true;
93
+ }
94
+ /** Whether the platform supports `count(distinct col1, col2)` with multiple columns. If false, a subquery wrapper is used instead. */
95
+ supportsMultiColumnCountDistinct() {
96
+ return false;
97
+ }
98
+ supportsSchemas() {
99
+ return false;
100
+ }
101
+ /** @inheritDoc */
102
+ generateCustomOrder(escapedColumn, values) {
103
+ let ret = '(case ';
104
+ values.forEach((v, i) => {
105
+ ret += `when ${escapedColumn} = ${this.quoteValue(v)} then ${i} `;
106
+ });
107
+ return ret + 'else null end)';
108
+ }
109
+ /**
110
+ * @internal
111
+ */
112
+ getOrderByExpression(column, direction, collation) {
113
+ if (collation) {
114
+ return [`${column} collate ${this.quoteCollation(collation)} ${direction.toLowerCase()}`];
115
+ }
116
+ return [`${column} ${direction.toLowerCase()}`];
117
+ }
118
+ /**
119
+ * Quotes a collation name for use in COLLATE clauses.
120
+ * @internal
121
+ */
122
+ quoteCollation(collation) {
123
+ this.validateCollationName(collation);
124
+ return this.quoteIdentifier(collation);
125
+ }
126
+ /** @internal */
127
+ validateCollationName(collation) {
128
+ if (!/^[\w]+$/.test(collation)) {
129
+ throw new Error(`Invalid collation name: '${collation}'. Collation names must contain only word characters.`);
130
+ }
131
+ }
132
+ /** @internal */
133
+ validateJsonPropertyName(name) {
134
+ if (!AbstractSqlPlatform.#JSON_PROPERTY_NAME_RE.test(name)) {
135
+ throw new Error(`Invalid JSON property name: '${name}'. JSON property names must contain only alphanumeric characters and underscores.`);
136
+ }
137
+ }
138
+ /**
139
+ * Returns FROM clause for JSON array iteration.
140
+ * @internal
141
+ */
142
+ getJsonArrayFromSQL(column, alias, _properties) {
143
+ return `json_each(${column}) as ${this.quoteIdentifier(alias)}`;
144
+ }
145
+ /**
146
+ * Returns SQL expression to access an element's property within a JSON array iteration.
147
+ * @internal
148
+ */
149
+ getJsonArrayElementPropertySQL(alias, property, _type) {
150
+ return `${this.quoteIdentifier(alias)}.${this.quoteIdentifier(property)}`;
151
+ }
152
+ /**
153
+ * Wraps JSON array FROM clause and WHERE condition into a full EXISTS condition.
154
+ * MySQL overrides this because `json_table` doesn't support correlated subqueries.
155
+ * @internal
156
+ */
157
+ getJsonArrayExistsSQL(from, where) {
158
+ return `exists (select 1 from ${from} where ${where})`;
159
+ }
160
+ /**
161
+ * Maps a runtime type name (e.g. 'string', 'number') to a driver-specific bind type constant.
162
+ * Used by NativeQueryBuilder for output bindings.
163
+ * @internal
164
+ */
165
+ mapToBindType(type) {
166
+ return type;
167
+ }
172
168
  }
@@ -1,36 +1,18 @@
1
- import {
2
- type Dictionary,
3
- type EntityMetadata,
4
- type EntityProperty,
5
- type Primary,
6
- type Transaction,
7
- } from '@mikro-orm/core';
1
+ import { type Dictionary, type EntityMetadata, type EntityProperty, type Primary, type Transaction } from '@mikro-orm/core';
8
2
  import { type AbstractSqlDriver } from './AbstractSqlDriver.js';
9
3
  export declare class PivotCollectionPersister<Entity extends object> {
10
- #private;
11
- constructor(
12
- meta: EntityMetadata<Entity>,
13
- driver: AbstractSqlDriver,
14
- ctx?: Transaction,
15
- schema?: string,
16
- loggerContext?: Dictionary,
17
- );
18
- enqueueUpdate(
19
- prop: EntityProperty<Entity>,
20
- insertDiff: Primary<Entity>[][],
21
- deleteDiff: Primary<Entity>[][] | boolean,
22
- pks: Primary<Entity>[],
23
- isInitialized?: boolean,
24
- ): void;
25
- private enqueueInsert;
26
- private enqueueUpsert;
27
- private createInsertStatement;
28
- private enqueueDelete;
29
- /**
30
- * Build the keys and data arrays for pivot table operations.
31
- * Handles polymorphic M:N by prepending the discriminator column/value.
32
- */
33
- private buildPivotKeysAndData;
34
- private collectStatements;
35
- execute(): Promise<void>;
4
+ #private;
5
+ constructor(meta: EntityMetadata<Entity>, driver: AbstractSqlDriver, ctx?: Transaction, schema?: string, loggerContext?: Dictionary);
6
+ enqueueUpdate(prop: EntityProperty<Entity>, insertDiff: Primary<Entity>[][], deleteDiff: Primary<Entity>[][] | boolean, pks: Primary<Entity>[], isInitialized?: boolean): void;
7
+ private enqueueInsert;
8
+ private enqueueUpsert;
9
+ private createInsertStatement;
10
+ private enqueueDelete;
11
+ /**
12
+ * Build the keys and data arrays for pivot table operations.
13
+ * Handles polymorphic M:N by prepending the discriminator column/value.
14
+ */
15
+ private buildPivotKeysAndData;
16
+ private collectStatements;
17
+ execute(): Promise<void>;
36
18
  }