@dbml/core 5.3.1 → 5.4.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.
@@ -1,157 +1,262 @@
1
- # MySQL model structure generator
2
-
3
- This folder houses the implementation of the MySQL model structure generator based on the ANTLR4 parser.
4
-
5
- This file documents the current features and bugs of this model structure generator.
6
-
7
- In the below table, the following notation is used:
8
- - ✅: Supported.
9
- - 🤷🏼‍♂️: Invalid SQL in MySQL.
10
- - ❓: Valid SQL in MySQL, the generator can still generate output but it ignores this syntax.
11
- - ❌: Valid SQL in MySQL, but the generator fails to generate any output.
12
-
13
- | SQL syntax | MySQL |
14
- |-------------------------------|---------------|
15
- | 1. INSERT statement | |
16
- | 1.a. Basic INSERT ... VALUES | |
17
- | 1.b. INSERT ... SELECT | ❌ |
18
- | 1.c. Multi-row INSERT | ✅ |
19
- | 1.d. Common table expression (WITH clause) | ❌ |
20
- | 1.e. Target table alias | 🤷🏼‍♂️ |
21
- | 1.f. INSERT ... RETURNING/INSERT OUTPUT | 🤷🏼‍♂️ |
22
- | 1.g. INSERT ... ON CONFLICT (UPSERT)/INSERT ... ON DUPLICATE KEY/INSERT … IGNORE | ❓ (ignore the ON DUPLICATE KEY and IGNORE clauses) |
23
- | 1.h. INSERT OVERWRITE | 🤷🏼‍♂️ |
24
- | 1.i. Multi-table INSERT | ❌ |
25
- | 1.j. Conditional multi-table INSERT (WHEN/FIRST/ALL) | ❌ |
26
- | 6. CREATE TABLE | |
27
- | 6.a. Basic syntax | ✅ |
28
- | 6.a.i. Enumerated data type | 🤷🏼‍♂️ |
29
- | 6.a.ii. Data type of the form name(...) | ✅ |
30
- | 6.a.iii. Data type of the form name\[...\] | 🤷🏼‍♂️ |
31
- | 6.b. PRIMARY KEY | |
32
- | 6.b.i. Inline PRIMARY KEY | ✅ |
33
- | 6.b.ii. Out-of-line PRIMARY KEY | ✅ |
34
- | 6.b.iii. Composite PRIMARY KEY | ✅ |
35
- | 6.b.iv. Named PRIMARY KEY | ✅ |
36
- | 6.b.v. Other options (deferrable, etc.) | ❓ (ignore the options) |
37
- | 6.c. FOREIGN KEY | |
38
- | 6.c.i. Inline FOREIGN KEY | ✅ |
39
- | 6.c.ii. Out-of-line FOREIGN KEY | ✅ |
40
- | 6.c.iii. Composite FOREIGN KEY | ✅ |
41
- | 6.c.iv. Named FOREIGN KEY | ✅ |
42
- | 6.c.v. ON UPDATE | ✅ |
43
- | 6.c.vi. ON DELETE | ✅ |
44
- | 6.c.vii. Other options (deferrable, etc.) | ❓ (ignore the options) |
45
- | 6.d. UNIQUE | |
46
- | 6.d.i. Inline UNIQUE | ✅ |
47
- | 6.d.ii. Out-of-line UNIQUE | |
48
- | 6.d.iii. Composite UNIQUE | |
49
- | 6.d.iv. Named UNIQUE | |
50
- | 6.d.v. Other options (deferrable, etc) | (ignore the option) |
51
- | 6.d.vi. NULLS NOT DISTINCT | (parse fail) |
52
- | 6.d.vii. UNIQUE KEY/UNIQUE INDEX | |
53
- | 6.e. CHECK | |
54
- | 6.e.i. Inline CHECK | ✅ |
55
- | 6.e.ii. Out-of-line CHECK | ✅ |
56
- | 6.e.iii. Named CHECK | ✅ (ignored for inline checks) |
57
- | 6.e.iv. Other options (enforcement control, etc.) | ❓ (ignore the options) |
58
- | 6.f. DEFAULT values | |
59
- | 6.f.i. Inline DEFAULT | |
60
- | 6.f.ii. Out-of-line DEFAULT | 🤷🏼‍♂️ |
61
- | 6.f.iii. Functional DEFAULT | |
62
- | 6.f.iv. Named DEFAULT | 🤷🏼‍♂️ |
63
- | 6.g. NULL | |
64
- | 6.h. NOT NULL | |
65
- | 6.h.i. Inline NOT NULL | |
66
- | 6.h.ii. Out-of-line NOT NULL | 🤷🏼‍♂️ |
67
- | 6.h.iii. Named NOT NULL | 🤷🏼‍♂️ |
68
- | 6.h.iv. Other options (deferrable, etc.) | ❓ (ignore) |
69
- | 6.i. Indexes | |
70
- | 6.i.i. Inline indexes | ❌ (parse fail) |
71
- | 6.i.ii. Out-of-line indexes | |
72
- | 6.i.iii. Named indexes | |
73
- | 6.i.iv. Multi-column indexes | |
74
- | 6.i.v. CLUSTERED/NONCLUSTERED | 🤷🏼‍♂️ |
75
- | 6.i.vi. FULLTEXT | (ignore) |
76
- | 6.i.vii. SPATIAL | (ignore) |
77
- | 6.i.viii. Other options | (ignore) |
78
- | 6.i.ix. USING HASH/BTREE | ✅ |
79
- | 6.j. Auto-increment | |
80
- | 6.j.i. AUTO_INCREMENT | ✅ |
81
- | 6.j.ii. SERIAL/BIG SERIAL | 🤷🏼‍♂️ |
82
- | 6.j.iii. IDENTITY | 🤷🏼‍♂️ |
83
- | 6.j.iv. Increment range | (ignore) |
84
- | 6.j.v. GENERATED ... AS IDENTITY | 🤷🏼‍♂️ |
85
- | 6.k. Computed column | |
86
- | 6.l. TEMPORARY tables | (Totally ignored) |
87
- | 6.m. CREATE TABLE AS SELECT (CTAS) | |
88
- | 6.n. Comments | |
89
- | 6.n.i. Table comments | |
90
- | 6.n.ii. Column comments | ✅ |
91
- | 6.o. Other options (inheritance, UNLOGGED, partition, collate, etc.) | ❓ |
92
- | 7. ALTER TABLE | |
93
- | 7.a. ADD COLUMN | |
94
- | 7.a.i. Type | ❌ |
95
- | 7.a.ii. DEFAULT | |
96
- | 7.a.iii. NOT NULL | |
97
- | 7.a.iv. NULL | |
98
- | 7.a.v. CHECK | |
99
- | 7.a.vi. UNIQUE | ❌ (parse fail when giving a name) |
100
- | 7.a.vii. FOREIGN KEY | ❌ (parse fail for FOREIGN KEY name REFERENCES ...) |
101
- | 7.a.viii. PRIMARY KEY | ❌ |
102
- | 7.a.ix. AUTOINCREMENT/SERIAL/BIGSERIAL/IDENTITY/GENERATED AS IDENTITY | |
103
- | 7.a.x. Computed column | ❌ |
104
- | 7.b. DROP COLUMN | |
105
- | 7.c. ALTER COLUMN / MODIFY COLUMN | |
106
- | 7.c.i. COMMENT | |
107
- | 7.c.ii. Others | |
108
- | 7.d. RENAME COLUMN | ❌ |
109
- | 7.e. ADD CONSTRAINT | |
110
- | 7.e.i. DEFAULT | ❌ (parse fail) |
111
- | 7.e.ii. NOT NULL | |
112
- | 7.e.iii. NULL | ❌ |
113
- | 7.e.iv. named CHECK | |
114
- | 7.e.v. unnamed CHECK | |
115
- | 7.e.vi. named UNIQUE | |
116
- | 7.e.vii. unnamed UNIQUE | |
117
- | 7.e.viii. named PRIMARY KEY | ❓ (ignore name) |
118
- | 7.e.ix. unnamed PRIMARY KEY | ✅ |
119
- | 7.e.x. named FOREIGN KEY | ✅ |
120
- | 7.e.xi. unnamed FOREIGN KEY | |
121
- | 7.g. DROP CONSTRAINT | ❌ |
122
- | 7.h. ALTER CONSTRAINT | |
123
- | 7.i. RENAME TABLE | |
124
- | 7.j. SET SCHEMA | |
125
- | 7.k. ALTER INDEX | |
126
- | 7.l. DROP INDEX | |
127
- | 7.m. SET COMMENT/COMMENT = | |
128
- | 7.n. ADD INDEX | ❌ |
129
- | 8. DROP TABLE | |
130
- | 8.a. Basic syntax | ❌ |
131
- | 9. CREATE INDEX | |
132
- | 9.a. Basic syntax | ✅ |
133
- | 9.b. Composite index | |
134
- | 9.c. Named index | |
135
- | 9.d. UNIQUE index | |
136
- | 9.e. Partial/Filtered index | (parse fail) |
137
- | 9.f. BTREE/HASH/GIST/BRIN/… index | |
138
- | 9.g. INCLUDE columns | 🤷🏼‍♂️ |
139
- | 9.h. CLUSTERED/NONCLUSTERED | (ignore) |
140
- | 9.i. Functional index | |
141
- | 9.j. FULLTEXT/SPATIAL index | (ignore) |
142
- | 9.k. COLLATE | (parse fail) |
143
- | 9.l. COMMENT | ❓ (ignore) |
144
- | 9.m. NULLS LAST/FIRST | 🤷🏼‍♂️ |
145
- | 9.n. ASC/DESC | ❓ (ignore) |
146
- | 10. DROP INDEX | |
147
- | 10.a. Basic syntax | ❌ |
148
- | 11. ALTER INDEX | 🤷🏼‍♂️ |
149
- | 11.a. RENAME | 🤷🏼‍♂️ |
150
- | 11.b. ALTER COLUMN | 🤷🏼‍♂️ |
151
- | 12. CREATE VIEW | |
152
- | 12.a. Basic syntax | ❌ |
153
- | 13. Comment | |
154
- | 13.a. Table comments | 🤷🏼‍♂️ |
155
- | 13.b. Column comments | 🤷🏼‍♂️ |
156
- | 13.c. COMMENT … IS NULL | 🤷🏼‍♂️ |
157
- | 13.d. Index comments | (parse fail) |
1
+ # MySQL SQL Parser Support
2
+
3
+ > Comprehensive documentation for the MySQL model structure generator based on the ANTLR4 parser.
4
+
5
+ ## Overview
6
+
7
+ This module provides SQL parsing capabilities for MySQL databases, enabling conversion of MySQL DDL statements to DBML format. The parser supports MySQL-specific syntax including `AUTO_INCREMENT` columns, `UNIQUE KEY`/`UNIQUE INDEX` syntax, inline table and column comments, and various index types.
8
+
9
+ ## Support Legend
10
+
11
+ | Symbol | Meaning |
12
+ |--------|---------|
13
+ | | Fully supported and correctly parsed |
14
+ | ◐ | Valid SQL that is parsed, but some options/clauses are ignored |
15
+ | | Valid MySQL syntax, but the parser fails to generate output |
16
+ | | Syntax not valid in MySQL |
17
+
18
+ ## Key Capabilities
19
+
20
+ - **Data Definition**
21
+ - `CREATE TABLE` with full syntax support
22
+ - Data types: parameterized types (e.g., `VARCHAR(255)`, `DECIMAL(10,2)`)
23
+ - **Constraints**
24
+ - `PRIMARY KEY` (column-level, table-level, multi-column, with explicit name)
25
+ - `FOREIGN KEY` with `ON UPDATE` / `ON DELETE` actions
26
+ - `UNIQUE`, `UNIQUE KEY`, `UNIQUE INDEX`
27
+ - `CHECK`, `DEFAULT`, `NOT NULL`
28
+ - **Auto-increment**
29
+ - `AUTO_INCREMENT` column attribute
30
+ - **Indexes**
31
+ - `CREATE INDEX` with BTREE, HASH
32
+ - Table-level indexes in `CREATE TABLE`
33
+ - Function-based indexes
34
+ - **Comments**
35
+ - Inline `COMMENT` attribute for tables and columns
36
+ - **Data Manipulation**
37
+ - Basic `INSERT` and multi-row `INSERT`
38
+
39
+ ---
40
+
41
+ ## Feature Support Matrix
42
+
43
+ ### `CREATE TABLE`
44
+
45
+ | Feature | Status | Notes |
46
+ |---------|---------|-------|
47
+ | Basic `CREATE TABLE` syntax | | |
48
+ | Enumerated data types (ENUM) | | MySQL uses inline ENUM type |
49
+ | Parameterized types `name(...)` | | e.g., `VARCHAR(255)`, `DECIMAL(10,2)` |
50
+ | Array types `name[...]` | | Not supported in MySQL |
51
+ | TEMPORARY tables | | Tables are completely ignored |
52
+ | `CREATE TABLE` AS SELECT | | |
53
+ | Table options (ENGINE, CHARSET, etc.) || Options are ignored |
54
+
55
+ ### Constraints
56
+
57
+ #### `PRIMARY KEY`
58
+
59
+ | Feature | Status | Notes |
60
+ |---------|---------|-------|
61
+ | Column-level `PRIMARY KEY` | | `id INT PRIMARY KEY` |
62
+ | Table-level `PRIMARY KEY` | | `PRIMARY KEY (id)` |
63
+ | Multi-column `PRIMARY KEY` | | `PRIMARY KEY (a, b)` |
64
+ | Explicitly named (CONSTRAINT name) || `CONSTRAINT pk_name PRIMARY KEY (id)` |
65
+ | Index options (USING BTREE, etc.) | | Options are ignored |
66
+
67
+ #### `FOREIGN KEY`
68
+
69
+ | Feature | Status | Notes |
70
+ |---------|---------|-------|
71
+ | Column-level `FOREIGN KEY` | | `col INT REFERENCES other(id)` |
72
+ | Table-level `FOREIGN KEY` | | `FOREIGN KEY (col) REFERENCES other(id)` |
73
+ | Multi-column `FOREIGN KEY` | | `FOREIGN KEY (a, b) REFERENCES other(x, y)` |
74
+ | Explicitly named (CONSTRAINT name) | | `CONSTRAINT fk_name FOREIGN KEY ...` |
75
+ | `ON UPDATE` action | | CASCADE, SET NULL, RESTRICT, NO ACTION |
76
+ | `ON DELETE` action | | CASCADE, SET NULL, RESTRICT, NO ACTION |
77
+ | Index options | | Options are ignored |
78
+
79
+ #### `UNIQUE`
80
+
81
+ | Feature | Status | Notes |
82
+ |---------|---------|-------|
83
+ | Column-level `UNIQUE` | | `col INT UNIQUE` |
84
+ | Table-level `UNIQUE` | | `UNIQUE (col)` |
85
+ | Multi-column `UNIQUE` | | `UNIQUE (a, b)` |
86
+ | Explicitly named (CONSTRAINT name) | | `CONSTRAINT uq_name UNIQUE (col)` |
87
+ | Index options | | Options are ignored |
88
+ | NULLS NOT DISTINCT || Treats NULLs as equal - parse failure in MySQL |
89
+ | `UNIQUE KEY` / `UNIQUE INDEX` | | MySQL-specific alternative syntax |
90
+
91
+ #### `CHECK`
92
+
93
+ | Feature | Status | Notes |
94
+ |---------|---------|-------|
95
+ | Column-level `CHECK` | | `col INT CHECK (col > 0)` |
96
+ | Table-level `CHECK` | | `CHECK (col > 0)` |
97
+ | Explicitly named (CONSTRAINT name) | | Name ignored for column-level checks |
98
+ | NOT ENFORCED option | | Enforcement control is ignored |
99
+
100
+ #### `DEFAULT`
101
+
102
+ | Feature | Status | Notes |
103
+ |---------|---------|-------|
104
+ | Column-level `DEFAULT` | | `col INT DEFAULT 0` |
105
+ | Table-level `DEFAULT` | | MySQL only supports column-level `DEFAULT` |
106
+ | Function as `DEFAULT` | | `DEFAULT CURRENT_TIMESTAMP`, `DEFAULT UUID()` |
107
+ | Explicitly named `DEFAULT` | | MySQL doesn't support named `DEFAULT` constraints |
108
+
109
+ #### `NOT NULL` / NULL
110
+
111
+ | Feature | Status | Notes |
112
+ |---------|---------|-------|
113
+ | Column-level `NOT NULL` | | `col INT NOT NULL` |
114
+ | NULL (explicitly nullable) | | `col INT NULL` |
115
+ | Table-level `NOT NULL` | | MySQL only supports column-level `NOT NULL` |
116
+ | Constraint options | | Options are ignored |
117
+
118
+ ### Auto-Increment Columns
119
+
120
+ | Feature | Status | Notes |
121
+ |---------|---------|-------|
122
+ | `AUTO_INCREMENT` (column attribute) | | `id INT AUTO_INCREMENT PRIMARY KEY` |
123
+ | `AUTO_INCREMENT` starting value | | `AUTO_INCREMENT=1000` table option is ignored |
124
+ | `SERIAL` (pseudo-type) | | PostgreSQL syntax - not valid in MySQL |
125
+ | `BIGSERIAL` (pseudo-type) | | PostgreSQL syntax - not valid in MySQL |
126
+ | `IDENTITY(seed, increment)` (column property) | | SQL Server/Snowflake syntax - not valid in MySQL |
127
+ | `GENERATED AS IDENTITY` (column property) | | SQL standard syntax - not valid in MySQL |
128
+
129
+ ### Inline Indexes (in `CREATE TABLE`)
130
+
131
+ | Feature | Status | Notes |
132
+ |---------|---------|-------|
133
+ | Column-level indexes | | Parse failure |
134
+ | Table-level indexes (INDEX/KEY) | | |
135
+ | Named indexes | | |
136
+ | Multi-column indexes | | |
137
+ | USING BTREE | | |
138
+ | USING HASH | | |
139
+ | CLUSTERED/NONCLUSTERED | | SQL Server syntax |
140
+ | FULLTEXT index | | Ignored |
141
+ | SPATIAL index | | Ignored |
142
+ | Other index options | | Ignored |
143
+
144
+ ### Table/Column Comments (in `CREATE TABLE`)
145
+
146
+ | Feature | Status | Notes |
147
+ |---------|---------|-------|
148
+ | Table `COMMENT` attribute | | e.g., `CREATE TABLE t (...) COMMENT 'desc'` |
149
+ | Column `COMMENT` attribute | | e.g., `col INT COMMENT 'desc'` |
150
+
151
+ ---
152
+
153
+ ### `CREATE INDEX`
154
+
155
+ | Feature | Status | Notes |
156
+ |---------|---------|-------|
157
+ | Basic `CREATE INDEX` | | |
158
+ | Multi-column index | ✓ | |
159
+ | Explicitly named index | ✓ | |
160
+ | `UNIQUE` index | ✓ | |
161
+ | BTREE index | ✓ | |
162
+ | HASH index | ✓ | |
163
+ | Function-based index | ✓ | e.g., `CREATE INDEX ON t ((col + 1))` |
164
+ | Partial/Filtered index | ✗ | Parse failure |
165
+ | INCLUDE columns | — | Not supported in MySQL |
166
+ | CLUSTERED/NONCLUSTERED | ◐ | Ignored |
167
+ | FULLTEXT index | ◐ | Ignored |
168
+ | SPATIAL index | ◐ | Ignored |
169
+ | COLLATE | ✗ | Parse failure |
170
+ | Index `COMMENT` | ◐ | Ignored |
171
+ | NULLS FIRST/LAST | — | Not supported in MySQL |
172
+ | ASC/DESC | ◐ | Ignored |
173
+
174
+ ---
175
+
176
+ ### `INSERT` Statements
177
+
178
+ | Feature | Status | Notes |
179
+ |---------|---------|-------|
180
+ | Basic `INSERT` ... VALUES | ✓ | |
181
+ | Multi-row `INSERT` | ✓ | |
182
+ | `INSERT` ... SELECT | ✗ | |
183
+ | WITH clause (CTE) | ✗ | |
184
+ | Target table alias | — | Not supported in MySQL |
185
+ | `INSERT` ... RETURNING | — | Not supported in MySQL |
186
+ | `INSERT` ... ON DUPLICATE KEY UPDATE | ◐ | Clause is ignored |
187
+ | `INSERT` IGNORE | ◐ | IGNORE is ignored |
188
+ | `INSERT` OVERWRITE | — | Snowflake/Hive syntax |
189
+ | Multi-table `INSERT` | ✗ | |
190
+ | Conditional `INSERT` (WHEN/FIRST/ALL) | ✗ | |
191
+
192
+ ---
193
+
194
+ ### `ALTER TABLE`
195
+
196
+ | Feature | Status | Notes |
197
+ |---------|---------|-------|
198
+ | **ADD COLUMN** | | |
199
+ | - All column properties | ✗ | |
200
+ | **DROP COLUMN** | ✗ | |
201
+ | **ALTER COLUMN / MODIFY COLUMN** | | |
202
+ | - `COMMENT` | ✗ | |
203
+ | - Other modifications | ✗ | |
204
+ | **RENAME COLUMN** | ✗ | |
205
+ | **ADD CONSTRAINT** | | |
206
+ | - Named `CHECK` | ✓ | |
207
+ | - Unnamed `CHECK` | ✓ | |
208
+ | - Named `UNIQUE` | ✗ | |
209
+ | - Unnamed `UNIQUE` | ✗ | |
210
+ | - Named `PRIMARY KEY` | ◐ | Name is ignored |
211
+ | - Unnamed `PRIMARY KEY` | ✓ | |
212
+ | - Named `FOREIGN KEY` | ✓ | |
213
+ | - Unnamed `FOREIGN KEY` | ✓ | |
214
+ | - `DEFAULT` | ✗ | Parse failure |
215
+ | - `NOT NULL` / NULL | ✗ | |
216
+ | **DROP CONSTRAINT** | ✗ | |
217
+ | **ALTER CONSTRAINT** | ✗ | |
218
+ | **RENAME TABLE** | ✗ | |
219
+ | **SET SCHEMA** | ✗ | |
220
+ | **ADD INDEX** | ✗ | |
221
+
222
+ ---
223
+
224
+ ### Other DDL Statements
225
+
226
+ | Feature | Status | Notes |
227
+ |---------|---------|-------|
228
+ | `DROP TABLE` | ✗ | |
229
+ | `DROP INDEX` | ✗ | |
230
+ | `ALTER INDEX` | — | Not supported in MySQL |
231
+ | `CREATE VIEW` | ✗ | |
232
+
233
+ ---
234
+
235
+ ### Comments (Standalone Statements)
236
+
237
+ | Feature | Status | Notes |
238
+ |---------|---------|-------|
239
+ | Standalone table comments | — | Use inline `COMMENT` in `CREATE TABLE` |
240
+ | Standalone column comments | — | Use inline `COMMENT` |
241
+ | Index comments | ✗ | Parse failure |
242
+
243
+ ---
244
+
245
+ ## Known Limitations
246
+
247
+ - **TEMPORARY tables**: Completely ignored during parsing
248
+ - **Column-level indexes in `CREATE TABLE`**: Parse failure for INDEX/KEY definitions inline with columns
249
+ - **`ALTER TABLE` operations**: Limited support; primarily ADD CONSTRAINT (`CHECK`, `FOREIGN KEY`) is functional
250
+ - **DDL modification statements**: `DROP TABLE`, `DROP INDEX` not supported
251
+ - **`INSERT` ... SELECT**: Subqueries in `INSERT` statements not supported
252
+ - **`CREATE VIEW`**: View definitions are not parsed
253
+ - **FULLTEXT/SPATIAL indexes**: Parsed but ignored in output
254
+
255
+ ## MySQL-Specific Notes
256
+
257
+ 1. **`AUTO_INCREMENT`**: The MySQL-specific `AUTO_INCREMENT` attribute is correctly recognized and converted to auto-increment columns in DBML
258
+ 2. **`UNIQUE KEY`/`UNIQUE INDEX`**: Both MySQL syntaxes are supported for defining unique constraints
259
+ 3. **Inline Comments**: MySQL's `COMMENT` attribute for tables and columns is fully supported (unlike PostgreSQL which uses `COMMENT ON` statements)
260
+ 4. **Index Types**: `BTREE` and `HASH` index types are supported; `FULLTEXT` and `SPATIAL` are parsed but ignored
261
+ 5. **Table Engine**: `ENGINE`, `CHARSET`, `COLLATE` and other table options are parsed but ignored in DBML output
262
+ 6. **ENUM Type**: MySQL's inline `ENUM` type definition is handled differently from PostgreSQL's `CREATE TYPE`