Это мой набор изменений Liquibase:
<changeSet author = "user" id = "1712203200334-1">
<sqlFile path = "config/liquibase/IsValidCoordinatesFormat.sql"/>
</changeSet>
Это файл config/liquibase/IsValidCoordinatesFormat.sql:
CREATE FUNCTION IsValidCoordinatesFormat(coordString VARCHAR(255)) RETURNS BOOLEAN
DETERMINISTIC
BEGIN
DECLARE isValid BOOLEAN;
DECLARE regex VARCHAR(255);
SET isValid = FALSE;
SET regex = '^(-?\\d+(\\.\\d+)?);(-?\\d+(\\.\\d+)?)$';
IF coordString REGEXP regex THEN
SET isValid = TRUE;
END IF;
RETURN isValid;
END;
И это ошибка, которую я получаю
Reason: liquibase.exception.DatabaseException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 12 [Failed SQL: (1064) CREATE FUNCTION IsValidCoordinatesFormat(coordString VARCHAR(255)) RETURNS BOOLEAN
2024-04-04 08:00:53 DETERMINISTIC
2024-04-04 08:00:53 BEGIN
2024-04-04 08:00:53 DECLARE isValid BOOLEAN;
2024-04-04 08:00:53 DECLARE regex VARCHAR(255);
2024-04-04 08:00:53 SET isValid = FALSE;
2024-04-04 08:00:53
2024-04-04 08:00:53 SET regex = '^(-?\\d+(\\.\\d+)?);(-?\\d+(\\.\\d+)?)$';
2024-04-04 08:00:53
2024-04-04 08:00:53 IF coordString REGEXP regex THEN
2024-04-04 08:00:53 SET isValid = TRUE;
2024-04-04 08:00:53 END IF]
Синтаксис SQL мне кажется правильным. Что вызывает проблему?
Как отметил Акина, этот случай можно исправить, переписав функцию с одним оператором. В случаях, когда вам нужно иметь несколько операторов в теле подпрограммы, вы можете использовать endDelimiter.


Большая часть вашего кода является лишней. Используйте код функции с одним оператором, который не требует изменения разделителя:
CREATE FUNCTION IsValidCoordinatesFormat(coordString VARCHAR(255))
RETURNS BOOLEAN
DETERMINISTIC
RETURN COALESCE(coordString REGEXP '^(-?\\d+(\\.\\d+)?);(-?\\d+(\\.\\d+)?)$', FALSE);
Если вы гарантируете, что coordString не будет NULL или NULL, поскольку в этом случае вывод функции безопасен для вас, вы можете удалить COALESCE().
Что вызывает проблему? Настройки метода выполнения. Если вы хотите создать составной оператор, вам необходимо переопределить разделитель. Если нет, то сервер не может определить, завершает ли какой-либо
;весь код создания объекта или является частью этого кода и завершает один оператор. С другой стороны, вы можете легко преобразовать свою сложную функцию в однооператорную форму, большая часть вашего кода является лишней.