Что происходит, когда MySQL добавляет функцию с тем же именем, что и у вас?

Я использую хэши sha3 в php (7.2), и я собирался продолжать использовать их в MySQL, но MySQL пока не поддерживает их.

Если я напишу свой UDF и позвоню, скажем, sha3, но потом какая-то будущая версия MySQL добавляет нативную sha3 функция, что происходит?

Я, вероятно, в любом случае назову это как-то иначе, чтобы избежать возможного конфликта, но в конечном итоге это может произойти с любой функцией, поэтому мне, безусловно, любопытно.


На всякий случай, если кто-то ищет поддержку sha3 в MySQL, я написал MySQL UDF, которая делает именно это, используя rhash, который намеревается функционировать точно так же, как встроенная функция sha2, которую вы можете скачать здесь (инструкции по установке и использованию находятся в комментариях) https://gist.github.com/BrianLeishman/a0f40e7a0a87a7069c5c56a768ff3179

Кроме того, стоит отметить, что sha3 должен быть быстрее, чем sha2 (я думаю), но моя функция в 4 раза медленнее, чем собственная sha2 (при генерации 100 000 хешей), но, надеюсь, будущая собственная sha3 решит эту проблему.


Я добавил отдельный UDF для возврата хэшей без шестнадцатеричной кодировки unhex_sha3 который должен буквально действовать как unhex(sha3(... и эта версия почти точно родная скорость (по сравнению с sha2), поскольку я могу избежать бессмысленного перевода между шестнадцатеричным кодированием и обратно.

https://gist.github.com/BrianLeishman/d7903a4acba75707c05fc581e1c714c3

1 ответ

Решение

Из директивы разрешения имени функции:

Избегайте создания пользовательских функций или хранимых функций, которые имеют то же имя, что и встроенная функция....

  • Если вы уже создали пользовательскую функцию с заданным именем и обновили MySQL до версии, которая реализует новую встроенную функцию с тем же именем, UDF становится недоступным. Чтобы исправить это, используйте DROP FUNCTION, чтобы удалить UDF, и CREATE FUNCTION, чтобы воссоздать UDF с другим неконфликтующим именем. Затем измените любой затронутый код, чтобы использовать новое имя.

  • Если в новой версии MySQL реализована встроенная функция с тем же именем, что и у существующей хранимой функции, у вас есть два варианта: переименовать хранимую функцию, чтобы использовать неконфликтующее имя, или изменить вызовы функции, чтобы они использовали спецификатор схемы (то есть используйте синтаксис schema_name.func_name()). В любом случае измените любой уязвимый код соответствующим образом.

Другие вопросы по тегам