Repository navigation
Отклонять зарезервированные слова MySQL 8 в SQL-идентификаторах - #663
Conversation
|
Список зарезервированных слов собран тщательно — 262 позиции, все версионные добавления MySQL 8 на месте: Grandfathering для extra fields сделан правильно: Квотирование идентификаторов в Локально: мерж с Но есть регрессия в механизме, который PR тоже трогает. Grandfathering не распространён на relation-колонки грид-конфигов
if (!GridColumnRules::isValidSqlIdentifier((string) $relation['foreignKey'])) {
return ['success' => false, 'message' => 'relation.foreignKey ' . self::NON_RESERVED_SQL_IDENTIFIER_MSG];
}А Ключевое: Проверено не чтением, а прогоном: вызвал Одинаково и для создания, и для обновления. Значит магазин с уже настроенной relation-колонкой, где Показательно, что для пути чтения ты Второй баг того же корня, тише и потому неприятнее
После PR такая колонка при рендере молча пропадает: Что нужно решитьЛибо распространить ту же схему, что сделана для extra fields: проверять зарезервированные слова только при создании новой relation-колонки, а при обновлении сверяться с сохранённым в БД значением, а не со слепо присланным. Либо явно объявить это ломающим изменением — с внятным сообщением об ошибке и описанным путём миграции. Сам не резолвлю: это решение о поведении, а не механический конфликт. МелочиПохоже, в списке отсутствует Сообщения Отдельно, вне этого PRТы честно отметил, что |
|
Решение: grandfathering как у extra fields (не breaking).
Тесты: |
…e-673-customers-relation-sql-quote Pick up relation grandfathering review fixes from #663.
Block reserved column keys at ExtraFields create time with a clear lexicon suggestion, while grandfathering existing keys and quoting relation SQL so reserved display fields stay safe at runtime.
Reject reserved FK/displayField/fieldName only on create; keep stored values editable. Read path allows reserved aliases when quoted. Add missing MySQL 8 keyword array.
32de0e9 to
2d3f56d
Compare
Описание
GridColumnRules::isValidSqlIdentifier()принимал имена вродеorder,rank,groups. Теперь проверка включает полный список reserved-слов MySQL 8(R).При создании extra field зарезервированный ключ отклоняется с лексиконом
ms3_err_extra_field_key_reservedи подсказкой альтернативы. Существующие ключи не мигрируются: update extra field ключ не переименовывает и не ревалидирует. Для relation JOIN/SELECT идентификаторы квотятся черезRelationSqlFragments(включая заказы), чтобы grandfathered reserved displayField не ломали SQL.Тип изменений
Связанные Issues
Closes #655
Как это было протестировано?
cd core/components/minishop3 php -l src/Services/Grid/GridColumnRules.php php -l src/Services/Grid/Mysql8ReservedKeywords.php php -l src/Services/Grid/RelationSqlFragments.php php -l src/Services/ExtraFieldsService.php php -l src/Services/Order/ManagerOrderListService.php php tests/RelationColumnSpecTest.php ./vendor/bin/phpunit tests/Unit/Services/ExtraFieldsValidationTest.php tests/Unit/Services/Grid/GridRelationFieldExtractorTest.phpРезультаты:
php -lOK,RelationColumnSpecTestOK, PHPUnit OK (10 tests, 610 assertions), exit 0.composer ci:php/composer test,npm run lint:ci,composer stan/ GitHub Actions CI)Конфигурация тестирования:
fix/issue-655-mysql-reserved-identifiersСкриншоты (если применимо)
Чеклист
composer stan/ CI jobPHPStan)npm run lint:ciдля Vue)Дополнительные заметки
Политика grandfathering: новые ключи режутся на create (extra fields) и в
GridColumnTypeValidatorдля relation. Уже сохранённые relation FK/displayField читаются charset-only + quoted SQL. BulksaveGridConfigпо-прежнему не гоняет reserved-check. Клиентский Vue regex для ключа не трогали.CustomersControllerraw SQL для relation aggregation вне этого PR.