@zmdb/mysql 1.0.0-beta.1

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.
@@ -0,0 +1,306 @@
1
+ import { action, CatalogRowError, flagField, integerField, normalizeDriftSnapshot, nullableIntegerField, nullableTextField, query, sortByName, sortWarnings, tableSelected, textField, } from '@zmdb/migrations/introspect/runtime';
2
+ import {} from '@zmdb/sql';
3
+ function placeholders(count) {
4
+ return Array.from({ length: count }, () => '?').join(', ');
5
+ }
6
+ function schemaFilter(field, options) {
7
+ const schemas = options.schemas;
8
+ if (schemas === undefined || schemas.length === 0)
9
+ return { sql: `${field} = DATABASE()`, parameters: [] };
10
+ const distinct = [...new Set(schemas)].toSorted();
11
+ return { sql: `${field} IN (${placeholders(distinct.length)})`, parameters: distinct };
12
+ }
13
+ function parseColumn(row, index) {
14
+ const catalog = 'mysql information_schema.COLUMNS';
15
+ const nullable = textField(row, 'IS_NULLABLE', catalog, index);
16
+ if (nullable !== 'YES' && nullable !== 'NO') {
17
+ throw new CatalogRowError(catalog, index, 'IS_NULLABLE', '"YES" or "NO"', nullable);
18
+ }
19
+ return {
20
+ table: textField(row, 'TABLE_NAME', catalog, index),
21
+ ordinal: integerField(row, 'ORDINAL_POSITION', catalog, index),
22
+ name: textField(row, 'COLUMN_NAME', catalog, index),
23
+ nullable: nullable === 'YES',
24
+ dataType: textField(row, 'DATA_TYPE', catalog, index),
25
+ catalogType: textField(row, 'COLUMN_TYPE', catalog, index),
26
+ length: nullableIntegerField(row, 'CHARACTER_MAXIMUM_LENGTH', catalog, index),
27
+ default: nullableTextField(row, 'COLUMN_DEFAULT', catalog, index),
28
+ extra: textField(row, 'EXTRA', catalog, index),
29
+ generationExpression: textField(row, 'GENERATION_EXPRESSION', catalog, index),
30
+ };
31
+ }
32
+ function parseKeyColumn(row, index) {
33
+ const catalog = 'mysql information_schema.KEY_COLUMN_USAGE';
34
+ return {
35
+ table: textField(row, 'TABLE_NAME', catalog, index),
36
+ constraint: textField(row, 'CONSTRAINT_NAME', catalog, index),
37
+ ordinal: integerField(row, 'ORDINAL_POSITION', catalog, index),
38
+ column: textField(row, 'COLUMN_NAME', catalog, index),
39
+ targetTable: nullableTextField(row, 'REFERENCED_TABLE_NAME', catalog, index),
40
+ targetColumn: nullableTextField(row, 'REFERENCED_COLUMN_NAME', catalog, index),
41
+ };
42
+ }
43
+ function parseReference(row, index) {
44
+ const catalog = 'mysql information_schema.REFERENTIAL_CONSTRAINTS';
45
+ return {
46
+ table: textField(row, 'TABLE_NAME', catalog, index),
47
+ constraint: textField(row, 'CONSTRAINT_NAME', catalog, index),
48
+ onUpdate: textField(row, 'UPDATE_RULE', catalog, index),
49
+ onDelete: textField(row, 'DELETE_RULE', catalog, index),
50
+ };
51
+ }
52
+ function parseStatistic(row, index) {
53
+ const catalog = 'mysql information_schema.STATISTICS';
54
+ return {
55
+ table: textField(row, 'TABLE_NAME', catalog, index),
56
+ name: textField(row, 'INDEX_NAME', catalog, index),
57
+ nonUnique: flagField(row, 'NON_UNIQUE', catalog, index),
58
+ sequence: integerField(row, 'SEQ_IN_INDEX', catalog, index),
59
+ column: nullableTextField(row, 'COLUMN_NAME', catalog, index),
60
+ expression: nullableTextField(row, 'EXPRESSION', catalog, index),
61
+ method: textField(row, 'INDEX_TYPE', catalog, index),
62
+ };
63
+ }
64
+ function mysqlType(column) {
65
+ const dataType = column.dataType.toLowerCase();
66
+ const catalogType = column.catalogType.toLowerCase();
67
+ if (column.extra.toLowerCase().split(/\s+/).includes('auto_increment'))
68
+ return { type: 'serial' };
69
+ if (dataType === 'int' || dataType === 'integer' || dataType === 'mediumint')
70
+ return { type: 'integer' };
71
+ if (dataType === 'bigint')
72
+ return { type: 'bigint' };
73
+ if (dataType === 'tinyint' && /^tinyint\s*\(\s*1\s*\)/.test(catalogType))
74
+ return { type: 'boolean' };
75
+ if (dataType === 'tinyint' || dataType === 'smallint') {
76
+ return { type: 'integer', warning: `MySQL type ${column.catalogType} was widened to integer` };
77
+ }
78
+ if (dataType === 'decimal' || dataType === 'numeric')
79
+ return { type: 'numeric' };
80
+ if (dataType === 'varchar') {
81
+ return column.length === null
82
+ ? { type: 'varchar', warning: `MySQL varchar ${column.catalogType} reported no length` }
83
+ : { type: 'varchar', length: column.length };
84
+ }
85
+ if (dataType === 'text' || dataType === 'tinytext' || dataType === 'mediumtext' || dataType === 'longtext') {
86
+ return dataType === 'text'
87
+ ? { type: 'text' }
88
+ : { type: 'text', warning: `MySQL type ${column.catalogType} was widened to text` };
89
+ }
90
+ if (dataType === 'datetime') {
91
+ return catalogType === 'datetime(3)'
92
+ ? { type: 'timestamp' }
93
+ : {
94
+ type: 'timestamp',
95
+ warning: `MySQL type ${column.catalogType} was normalized to timestamp; forward DDL emits DATETIME(3)`,
96
+ };
97
+ }
98
+ if (dataType === 'timestamp') {
99
+ return {
100
+ type: 'timestamp',
101
+ warning: 'MySQL TIMESTAMP converts through the session time zone and has a 2038 limit; forward DDL emits DATETIME(3)',
102
+ };
103
+ }
104
+ if (dataType === 'json')
105
+ return { type: 'json' };
106
+ if (dataType === 'enum')
107
+ return { type: 'jsonEnum' };
108
+ return {
109
+ type: column.catalogType,
110
+ warning: `MySQL type ${column.catalogType} cannot be represented by the current declared SQL type vocabulary`,
111
+ };
112
+ }
113
+ function primaryKeys(keys) {
114
+ const grouped = new Map();
115
+ for (const key of keys) {
116
+ if (key.constraint !== 'PRIMARY')
117
+ continue;
118
+ const values = grouped.get(key.table);
119
+ if (values)
120
+ values.push(key);
121
+ else
122
+ grouped.set(key.table, [key]);
123
+ }
124
+ return new Map([...grouped].map(([table, values]) => [
125
+ table,
126
+ values.toSorted((left, right) => left.ordinal - right.ordinal).map(value => value.column),
127
+ ]));
128
+ }
129
+ function foreignKeys(keys, references) {
130
+ const referenceByName = new Map(references.map(reference => [`${reference.table}\0${reference.constraint}`, reference]));
131
+ const grouped = new Map();
132
+ for (const key of keys) {
133
+ if (key.targetTable === null || key.targetColumn === null)
134
+ continue;
135
+ const id = `${key.table}\0${key.constraint}`;
136
+ const values = grouped.get(id);
137
+ if (values)
138
+ values.push(key);
139
+ else
140
+ grouped.set(id, [key]);
141
+ }
142
+ const result = new Map();
143
+ for (const [id, values] of grouped) {
144
+ values.sort((left, right) => left.ordinal - right.ordinal);
145
+ const first = values[0];
146
+ if (first === undefined)
147
+ continue;
148
+ const reference = referenceByName.get(id);
149
+ if (reference === undefined) {
150
+ throw new TypeError(`mysql catalog has key columns for foreign key "${first.constraint}" but no referential constraint row`);
151
+ }
152
+ const targetTable = first.targetTable;
153
+ if (targetTable === null ||
154
+ values.some(value => value.targetTable !== targetTable || value.targetColumn === null)) {
155
+ throw new TypeError(`mysql foreign key "${first.constraint}" has inconsistent target columns`);
156
+ }
157
+ const snapshot = {
158
+ name: first.constraint,
159
+ columns: values.map(value => value.column),
160
+ targetTable,
161
+ targetColumns: values.map(value => value.targetColumn).filter(value => value !== null),
162
+ onDelete: action(reference.onDelete, 'mysql information_schema.REFERENTIAL_CONSTRAINTS', 0, 'DELETE_RULE'),
163
+ onUpdate: action(reference.onUpdate, 'mysql information_schema.REFERENTIAL_CONSTRAINTS', 0, 'UPDATE_RULE'),
164
+ };
165
+ const tableValues = result.get(first.table);
166
+ if (tableValues)
167
+ tableValues.push(snapshot);
168
+ else
169
+ result.set(first.table, [snapshot]);
170
+ }
171
+ return new Map([...result].map(([table, values]) => [table, sortByName(values)]));
172
+ }
173
+ function indexes(statistics) {
174
+ const grouped = new Map();
175
+ for (const statistic of statistics) {
176
+ if (statistic.name === 'PRIMARY')
177
+ continue;
178
+ const id = `${statistic.table}\0${statistic.name}`;
179
+ const values = grouped.get(id);
180
+ if (values)
181
+ values.push(statistic);
182
+ else
183
+ grouped.set(id, [statistic]);
184
+ }
185
+ const byTable = new Map();
186
+ for (const values of grouped.values()) {
187
+ values.sort((left, right) => left.sequence - right.sequence);
188
+ const first = values[0];
189
+ if (first === undefined)
190
+ continue;
191
+ const columns = values.map(value => {
192
+ if (value.expression !== null)
193
+ return { expr: value.expression };
194
+ if (value.column !== null)
195
+ return value.column;
196
+ throw new TypeError(`mysql index "${first.name}" has neither COLUMN_NAME nor EXPRESSION`);
197
+ });
198
+ const method = first.method.toLowerCase();
199
+ const snapshot = {
200
+ name: first.name,
201
+ columns,
202
+ unique: !first.nonUnique,
203
+ ...(method === 'btree' ? {} : { method }),
204
+ };
205
+ const tableValues = byTable.get(first.table);
206
+ if (tableValues)
207
+ tableValues.push(snapshot);
208
+ else
209
+ byTable.set(first.table, [snapshot]);
210
+ }
211
+ return new Map([...byTable].map(([table, values]) => [table, sortByName(values)]));
212
+ }
213
+ export async function mysqlSnapshot(driver, options = {}) {
214
+ const tablesFilter = schemaFilter('TABLE_SCHEMA', options);
215
+ const constraintFilter = schemaFilter('CONSTRAINT_SCHEMA', options);
216
+ const [tableRows, columnRows, statisticRows, keyRows, referenceRows] = await Promise.all([
217
+ driver.execute(query(`SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE FROM information_schema.TABLES ` +
218
+ `WHERE ${tablesFilter.sql} AND TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME`, tablesFilter.parameters)),
219
+ driver.execute(query(`SELECT TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME, IS_NULLABLE, DATA_TYPE, COLUMN_TYPE, ` +
220
+ `CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, COLUMN_DEFAULT, EXTRA, ` +
221
+ `GENERATION_EXPRESSION FROM information_schema.COLUMNS WHERE ${tablesFilter.sql} ` +
222
+ `ORDER BY TABLE_NAME, ORDINAL_POSITION`, tablesFilter.parameters)),
223
+ driver.execute(query(`SELECT TABLE_NAME, INDEX_NAME, NON_UNIQUE, SEQ_IN_INDEX, COLUMN_NAME, EXPRESSION, INDEX_TYPE ` +
224
+ `FROM information_schema.STATISTICS WHERE ${tablesFilter.sql} ` +
225
+ `ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX`, tablesFilter.parameters)),
226
+ driver.execute(query(`SELECT TABLE_NAME, CONSTRAINT_NAME, ORDINAL_POSITION, POSITION_IN_UNIQUE_CONSTRAINT, ` +
227
+ `COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME ` +
228
+ `FROM information_schema.KEY_COLUMN_USAGE WHERE ${constraintFilter.sql} ` +
229
+ `ORDER BY TABLE_NAME, CONSTRAINT_NAME, ORDINAL_POSITION`, constraintFilter.parameters)),
230
+ driver.execute(query(`SELECT TABLE_NAME, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE ` +
231
+ `FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE ${constraintFilter.sql} ` +
232
+ `ORDER BY TABLE_NAME, CONSTRAINT_NAME`, constraintFilter.parameters)),
233
+ ]);
234
+ const tableNames = tableRows.map((row, index) => textField(row, 'TABLE_NAME', 'mysql information_schema.TABLES', index));
235
+ const duplicate = tableNames.find((name, index) => tableNames.indexOf(name) !== index);
236
+ if (duplicate !== undefined) {
237
+ throw new TypeError(`mysql introspection cannot represent table "${duplicate}" from more than one schema in a schema-neutral snapshot`);
238
+ }
239
+ const parsedColumns = columnRows.map(parseColumn);
240
+ const parsedKeys = keyRows.map(parseKeyColumn);
241
+ const parsedReferences = referenceRows.map(parseReference);
242
+ const parsedStatistics = statisticRows.map(parseStatistic);
243
+ const keyByTable = primaryKeys(parsedKeys);
244
+ const foreignKeyByTable = foreignKeys(parsedKeys, parsedReferences);
245
+ const indexByTable = indexes(parsedStatistics);
246
+ const tables = [];
247
+ const warnings = [];
248
+ for (const name of tableNames) {
249
+ if (!tableSelected(name, options))
250
+ continue;
251
+ const primaryKey = keyByTable.get(name) ?? [];
252
+ const columns = parsedColumns
253
+ .filter(column => column.table === name)
254
+ .map(column => {
255
+ const mapped = mysqlType(column);
256
+ if (mapped.warning !== undefined) {
257
+ warnings.push({ table: name, column: column.name, reason: mapped.warning });
258
+ }
259
+ const generated = column.generationExpression.length === 0
260
+ ? undefined
261
+ : {
262
+ expression: column.generationExpression,
263
+ stored: column.extra.toLowerCase().includes('stored generated'),
264
+ };
265
+ return {
266
+ name: column.name,
267
+ type: mapped.type,
268
+ catalogType: column.catalogType,
269
+ nullable: column.nullable,
270
+ primaryKey: primaryKey.includes(column.name),
271
+ ...(mapped.length === undefined ? {} : { length: mapped.length }),
272
+ ...(column.default === null ? {} : { default: column.default }),
273
+ ...(generated === undefined ? {} : { generated }),
274
+ };
275
+ })
276
+ .toSorted((left, right) => left.name.localeCompare(right.name));
277
+ tables.push({
278
+ name,
279
+ columns,
280
+ primaryKey,
281
+ foreignKeys: foreignKeyByTable.get(name) ?? [],
282
+ indexes: indexByTable.get(name) ?? [],
283
+ });
284
+ }
285
+ return {
286
+ version: 1,
287
+ tables: sortByName(tables),
288
+ extensions: [],
289
+ warnings: sortWarnings(warnings),
290
+ };
291
+ }
292
+ function mysqlNormalize(snapshot, role) {
293
+ return normalizeDriftSnapshot(snapshot, role, { omitForeignKeySupportIndexes: true });
294
+ }
295
+ export function mysqlFamilyIntrospector(name, overrides = {}) {
296
+ const snapshot = overrides.snapshot;
297
+ const normalize = overrides.normalizeForDrift;
298
+ const introspector = {
299
+ name,
300
+ snapshot: (driver, options = {}) => snapshot === undefined ? mysqlSnapshot(driver, options) : snapshot(driver, options, mysqlSnapshot),
301
+ normalizeForDrift: (catalog, role) => normalize === undefined ? mysqlNormalize(catalog, role) : normalize(catalog, role, mysqlNormalize),
302
+ };
303
+ return Object.freeze(introspector);
304
+ }
305
+ export const mysqlIntrospector = mysqlFamilyIntrospector('mysql');
306
+ //# sourceMappingURL=introspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.js","sourceRoot":"","sources":["../src/introspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ChangeOp } from '@zmdb/migrations';
2
+ import { type DialectTypeMap, type MigrationDialect } from '@zmdb/sql';
3
+ type CreateTableOperation = Extract<ChangeOp, {
4
+ readonly kind: 'create_table';
5
+ }>;
6
+ export interface MysqlTableDdlHelpers {
7
+ readonly quote: (identifier: string) => string;
8
+ readonly keyColumns: (columns: readonly string[]) => string;
9
+ }
10
+ export interface MysqlTableDdlExtension {
11
+ readonly createPrefix: (operation: CreateTableOperation) => string;
12
+ readonly definitions: (operation: CreateTableOperation, helpers: MysqlTableDdlHelpers) => readonly string[];
13
+ }
14
+ export interface MysqlMigrationOverrides {
15
+ readonly types?: Readonly<Partial<DialectTypeMap>>;
16
+ readonly table?: MysqlTableDdlExtension;
17
+ readonly ledger?: {
18
+ readonly createPrefix: string;
19
+ readonly definitions?: readonly string[];
20
+ };
21
+ }
22
+ export declare function mysqlFamilyMigrations<Name extends string>(name: Name, overrides?: MysqlMigrationOverrides): MigrationDialect<Name>;
23
+ export declare function createMysqlMigrations<Name extends string>(name: Name): MigrationDialect<Name>;
24
+ export {};
25
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAMT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,KAAK,cAAc,EAEnB,KAAK,gBAAgB,EAKtB,MAAM,WAAW,CAAC;AAkBnB,KAAK,oBAAoB,GAAG,OAAO,CAAC,QAAQ,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC;CAC7D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,MAAM,CAAC;IACnE,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,oBAAoB,EAAE,OAAO,EAAE,oBAAoB,KAAK,SAAS,MAAM,EAAE,CAAC;CAC7G;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAC1C,CAAC;CACH;AA0hBD,wBAAgB,qBAAqB,CAAC,IAAI,SAAS,MAAM,EACvD,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,uBAA4B,GACtC,gBAAgB,CAAC,IAAI,CAAC,CAoCxB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,SAAS,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAE7F"}