endDelimiter SQL attribute

endDelimiter is an attribute that lets you specify a delimiter to separate raw SQL statements in your changesets. When you run commands like update or rollback, Liquibase first parses any raw SQL you want to execute. Liquibase looks for the endDelimiter string in each changeset and splits the SQL on the endDelimter boundary. This ensures that your database receives only one SQL statement at a time, even if your raw SQL contains many statements.

You can use endDelimiter in a individual changeset containing the sql or sqlFile Change Types. endDelimiter is valid in Formatted SQL, XML, YAML, and JSON changelogs. The default value is ; (semicolon). Your custom delimiter can be a combination of one or more letters, symbols, and/or numbers, or the empty string.

If your SQL only contains one semicolon at the end of every statement (or only one statement with no semicolon), you don't have to specify a custom delimiter. However, if your SQL embeds stored logic containing one or more semicolons, Liquibase incorrectly parses your SQL as multiple statements, causing an error. You can set a different delimiter to prevent Liquibase from processing incomplete SQL statements.

Tip: It is a best practice not to use endDelimiter on changesets you are running with a native executor.

Also, when running SQL with the execute-sql command, you can specify a delimiter with the --delimiter argument.

You can also use the rollbackEndDelimiter attribute on sql and sqlFile Change Types in your changelog. This lets you specify a delimiter for rollback SQL. It is only valid in Formatted SQL changelogs.

Uses

The following examples demonstrate use of the endDelimiters SQL attribute:

Use endDelimiter in SQL for PROCEDURE and FUNCTION

An endDelimiter can be used when the changeset contains SQL to create a stored procedure or function that contains the default ';' end delimiter. To avoid incomplete statements being sent to the database, the changeset must be marked to have a different endDelimiter.

Use endDelimiter for some DBMS systems to run multiple statements

The endDelimiter must be specified for some dbms systems to run multiple statements.

Syntax

Note: All changelog attributes use the camelCase format.

Escaping an endDelimiter

When setting an endDelimiter, note that certain DBMS and operating systems require delimiter values to be escaped. For example, a $$ endDelimiter with mysql requires escaping as: endDelimiter="\$\$". A Liquibase migration error indicates the delimiter that needs to be escaped would be:

Unexpected error running Liquibase: Migration failed for change set <changelog>::<id>::<author>:
 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 '$$$