@mikro-orm/sql 7.0.10-dev.9 → 7.0.10

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 +94 -58
  2. package/AbstractSqlConnection.js +235 -238
  3. package/AbstractSqlDriver.d.ts +410 -155
  4. package/AbstractSqlDriver.js +2096 -1968
  5. package/AbstractSqlPlatform.d.ts +85 -75
  6. package/AbstractSqlPlatform.js +166 -162
  7. package/PivotCollectionPersister.d.ts +33 -15
  8. package/PivotCollectionPersister.js +158 -160
  9. package/README.md +1 -1
  10. package/SqlEntityManager.d.ts +67 -22
  11. package/SqlEntityManager.js +54 -38
  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 +200 -202
  16. package/dialects/mysql/BaseMySqlPlatform.d.ts +65 -46
  17. package/dialects/mysql/BaseMySqlPlatform.js +137 -134
  18. package/dialects/mysql/MySqlExceptionConverter.d.ts +6 -6
  19. package/dialects/mysql/MySqlExceptionConverter.js +91 -77
  20. package/dialects/mysql/MySqlNativeQueryBuilder.d.ts +3 -3
  21. package/dialects/mysql/MySqlNativeQueryBuilder.js +67 -70
  22. package/dialects/mysql/MySqlSchemaHelper.d.ts +58 -39
  23. package/dialects/mysql/MySqlSchemaHelper.js +327 -319
  24. package/dialects/oracledb/OracleDialect.d.ts +81 -52
  25. package/dialects/oracledb/OracleDialect.js +155 -149
  26. package/dialects/oracledb/OracleNativeQueryBuilder.d.ts +12 -12
  27. package/dialects/oracledb/OracleNativeQueryBuilder.js +240 -244
  28. package/dialects/postgresql/BasePostgreSqlPlatform.d.ts +109 -106
  29. package/dialects/postgresql/BasePostgreSqlPlatform.js +354 -353
  30. package/dialects/postgresql/FullTextType.d.ts +10 -6
  31. package/dialects/postgresql/FullTextType.js +51 -51
  32. package/dialects/postgresql/PostgreSqlExceptionConverter.d.ts +5 -5
  33. package/dialects/postgresql/PostgreSqlExceptionConverter.js +55 -43
  34. package/dialects/postgresql/PostgreSqlNativeQueryBuilder.d.ts +1 -1
  35. package/dialects/postgresql/PostgreSqlNativeQueryBuilder.js +4 -4
  36. package/dialects/postgresql/PostgreSqlSchemaHelper.d.ts +117 -82
  37. package/dialects/postgresql/PostgreSqlSchemaHelper.js +747 -711
  38. package/dialects/sqlite/BaseSqliteConnection.d.ts +3 -5
  39. package/dialects/sqlite/BaseSqliteConnection.js +21 -19
  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 +67 -51
  46. package/dialects/sqlite/SqliteNativeQueryBuilder.d.ts +2 -2
  47. package/dialects/sqlite/SqliteNativeQueryBuilder.js +7 -7
  48. package/dialects/sqlite/SqlitePlatform.d.ts +63 -72
  49. package/dialects/sqlite/SqlitePlatform.js +139 -139
  50. package/dialects/sqlite/SqliteSchemaHelper.d.ts +77 -60
  51. package/dialects/sqlite/SqliteSchemaHelper.js +541 -522
  52. package/package.json +3 -3
  53. package/plugin/index.d.ts +42 -35
  54. package/plugin/index.js +43 -36
  55. package/plugin/transformer.d.ts +117 -94
  56. package/plugin/transformer.js +890 -881
  57. package/query/ArrayCriteriaNode.d.ts +4 -4
  58. package/query/ArrayCriteriaNode.js +18 -18
  59. package/query/CriteriaNode.d.ts +35 -25
  60. package/query/CriteriaNode.js +133 -123
  61. package/query/CriteriaNodeFactory.d.ts +49 -6
  62. package/query/CriteriaNodeFactory.js +97 -94
  63. package/query/NativeQueryBuilder.d.ts +121 -121
  64. package/query/NativeQueryBuilder.js +507 -501
  65. package/query/ObjectCriteriaNode.d.ts +12 -12
  66. package/query/ObjectCriteriaNode.js +298 -282
  67. package/query/QueryBuilder.d.ts +1558 -905
  68. package/query/QueryBuilder.js +2331 -2192
  69. package/query/QueryBuilderHelper.d.ts +153 -72
  70. package/query/QueryBuilderHelper.js +1084 -1028
  71. package/query/ScalarCriteriaNode.d.ts +3 -3
  72. package/query/ScalarCriteriaNode.js +53 -46
  73. package/query/enums.d.ts +14 -14
  74. package/query/enums.js +14 -14
  75. package/query/raw.d.ts +16 -6
  76. package/query/raw.js +10 -10
  77. package/schema/DatabaseSchema.d.ts +74 -50
  78. package/schema/DatabaseSchema.js +355 -327
  79. package/schema/DatabaseTable.d.ts +96 -73
  80. package/schema/DatabaseTable.js +1002 -927
  81. package/schema/SchemaComparator.d.ts +70 -66
  82. package/schema/SchemaComparator.js +790 -764
  83. package/schema/SchemaHelper.d.ts +128 -97
  84. package/schema/SchemaHelper.js +683 -668
  85. package/schema/SqlSchemaGenerator.d.ts +79 -59
  86. package/schema/SqlSchemaGenerator.js +525 -495
  87. package/typings.d.ts +405 -275
@@ -1,82 +1,92 @@
1
- import { type RawQueryFragment, type Constructor, type EntityManager, type EntityRepository, type IDatabaseDriver, type IsolationLevel, type MikroORM, Platform } from '@mikro-orm/core';
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';
2
11
  import { SqlSchemaGenerator } from './schema/SqlSchemaGenerator.js';
3
12
  import { type SchemaHelper } from './schema/SchemaHelper.js';
4
13
  import type { IndexDef } from './typings.js';
5
14
  import { NativeQueryBuilder } from './query/NativeQueryBuilder.js';
6
15
  /** Base class for SQL database platforms, providing SQL generation and quoting utilities. */
7
16
  export declare abstract class AbstractSqlPlatform extends Platform {
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;
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;
82
92
  }
@@ -1,168 +1,172 @@
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(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
- }
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
+ }
168
172
  }
@@ -1,18 +1,36 @@
1
- import { type Dictionary, type EntityMetadata, type EntityProperty, type Primary, type Transaction } from '@mikro-orm/core';
1
+ import {
2
+ type Dictionary,
3
+ type EntityMetadata,
4
+ type EntityProperty,
5
+ type Primary,
6
+ type Transaction,
7
+ } from '@mikro-orm/core';
2
8
  import { type AbstractSqlDriver } from './AbstractSqlDriver.js';
3
9
  export declare class PivotCollectionPersister<Entity extends object> {
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>;
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>;
18
36
  }