Commit 104a872
authored
Support MySQL
## Summary
MySQL supports `BINARY expr` as a shorthand for `CAST(expr AS BINARY)` —
a type cast that forces byte-by-byte string comparison. The translator
previously stripped the `BINARY` keyword entirely (`translate_token()`
returned `null`), which silently produced wrong results in two cases:
1. **Columns with explicit `COLLATE NOCASE`** (notably
`information_schema` tables, where `TABLE_NAME` is `NOCASE`): `WHERE
TABLE_NAME = BINARY 'Foo'` became case-insensitive instead of
case-sensitive.
2. **`CAST(x AS BINARY) = y`**: translated to `CAST(x AS BLOB) = y`,
which always returned `FALSE` due to SQLite's storage-class ordering
(`BLOB > TEXT`), even when the bytes were equal.
## Translation
`BINARY expr` is now emitted as `expr COLLATE BINARY`:
```sql
-- MySQL
SELECT * FROM t WHERE a = BINARY b
SELECT a FROM t ORDER BY BINARY a
SELECT BINARY 'abc'
-- Translated SQLite
SELECT * FROM `t` WHERE `a` = `b` COLLATE BINARY
SELECT `a` FROM `t` ORDER BY `a` COLLATE BINARY
SELECT 'abc' COLLATE BINARY AS `BINARY 'abc'`
```
`CAST(x AS BINARY)` and `CONVERT(x, BINARY)` now emit `CAST(x AS TEXT)
COLLATE BINARY` via a shared helper — the value keeps `TEXT` storage
class (so equality against `TEXT` works) while the explicit BINARY
collation preserves byte-by-byte comparison semantics:
```sql
-- MySQL
SELECT CAST('abc' AS BINARY)
SELECT CONVERT('abc', BINARY)
-- Translated SQLite
SELECT CAST('abc' AS TEXT) COLLATE BINARY AS `CAST('abc' AS BINARY)`
SELECT CAST('abc' AS TEXT) COLLATE BINARY AS `CONVERT('abc', BINARY)`
```
SQLite's `COLLATE BINARY` overrides an operand's declared collation, so
the `NOCASE`-column case in `information_schema` now works correctly.
## Additional fix
The last commit fixes a pre-existing bug in `translate_select_item()`
surfaced during this work: its alias-inference heuristic (`$item ===
translate($textStringLiteral)`) misfired for `CONVERT(expr USING
charset)`, producing alias `` `Customer` `` instead of the original
expression text for `SELECT CONVERT('Customer' USING utf8mb4)`. Replaced
with a structural walk that stops at a `textStringLiteral` only when
each intermediate level has exactly one child node.
Fixes #31BINARY operator (#369)1 parent c214cda commit 104a872
3 files changed
Lines changed: 160 additions & 17 deletions
File tree
- packages/mysql-on-sqlite
- src/sqlite
- tests
Lines changed: 58 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3960 | 3960 | | |
3961 | 3961 | | |
3962 | 3962 | | |
3963 | | - | |
3964 | | - | |
3965 | | - | |
| 3963 | + | |
| 3964 | + | |
| 3965 | + | |
3966 | 3966 | | |
3967 | 3967 | | |
3968 | 3968 | | |
| |||
4310 | 4310 | | |
4311 | 4311 | | |
4312 | 4312 | | |
| 4313 | + | |
| 4314 | + | |
| 4315 | + | |
| 4316 | + | |
| 4317 | + | |
| 4318 | + | |
| 4319 | + | |
| 4320 | + | |
| 4321 | + | |
| 4322 | + | |
| 4323 | + | |
| 4324 | + | |
| 4325 | + | |
| 4326 | + | |
| 4327 | + | |
| 4328 | + | |
| 4329 | + | |
| 4330 | + | |
4313 | 4331 | | |
4314 | 4332 | | |
4315 | 4333 | | |
| |||
4318 | 4336 | | |
4319 | 4337 | | |
4320 | 4338 | | |
4321 | | - | |
| 4339 | + | |
4322 | 4340 | | |
4323 | 4341 | | |
4324 | 4342 | | |
4325 | 4343 | | |
4326 | 4344 | | |
4327 | | - | |
| 4345 | + | |
4328 | 4346 | | |
4329 | 4347 | | |
4330 | 4348 | | |
4331 | | - | |
| 4349 | + | |
4332 | 4350 | | |
4333 | 4351 | | |
4334 | 4352 | | |
4335 | 4353 | | |
4336 | 4354 | | |
4337 | 4355 | | |
| 4356 | + | |
| 4357 | + | |
| 4358 | + | |
| 4359 | + | |
| 4360 | + | |
| 4361 | + | |
| 4362 | + | |
| 4363 | + | |
| 4364 | + | |
| 4365 | + | |
| 4366 | + | |
| 4367 | + | |
| 4368 | + | |
| 4369 | + | |
| 4370 | + | |
| 4371 | + | |
| 4372 | + | |
| 4373 | + | |
| 4374 | + | |
| 4375 | + | |
| 4376 | + | |
4338 | 4377 | | |
4339 | 4378 | | |
4340 | 4379 | | |
| |||
4693 | 4732 | | |
4694 | 4733 | | |
4695 | 4734 | | |
| 4735 | + | |
| 4736 | + | |
| 4737 | + | |
4696 | 4738 | | |
4697 | | - | |
4698 | | - | |
4699 | | - | |
4700 | | - | |
| 4739 | + | |
| 4740 | + | |
| 4741 | + | |
| 4742 | + | |
| 4743 | + | |
| 4744 | + | |
| 4745 | + | |
| 4746 | + | |
| 4747 | + | |
| 4748 | + | |
4701 | 4749 | | |
4702 | 4750 | | |
4703 | 4751 | | |
| |||
Lines changed: 49 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
281 | 281 | | |
282 | 282 | | |
283 | 283 | | |
284 | | - | |
285 | | - | |
286 | | - | |
287 | | - | |
| 284 | + | |
| 285 | + | |
288 | 286 | | |
289 | 287 | | |
290 | 288 | | |
291 | 289 | | |
292 | 290 | | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
293 | 338 | | |
294 | 339 | | |
295 | 340 | | |
| |||
Lines changed: 53 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
107 | | - | |
| 107 | + | |
108 | 108 | | |
109 | 109 | | |
110 | 110 | | |
| |||
120 | 120 | | |
121 | 121 | | |
122 | 122 | | |
123 | | - | |
| 123 | + | |
124 | 124 | | |
125 | 125 | | |
126 | 126 | | |
127 | 127 | | |
128 | | - | |
| 128 | + | |
129 | 129 | | |
130 | 130 | | |
131 | 131 | | |
| |||
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
139 | 189 | | |
140 | 190 | | |
141 | 191 | | |
| |||
0 commit comments