liquibase-core/src/main/java/liquibase/sqlgenerator/core/CreateIndexGeneratorFirebird.java
private boolean applyIsComputedExpressionHeuristic(ColumnConfig column, Database database) {
        String expr = column.getName();

        /*
         * https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-structure-identifiers.html
         * says the following about what makes a valid identifier in Firebird:
         * - At most 31 chars
         * - Starts with a 7-bit character
         * - After that, letters, digits, underscores or dollar signs are valid characters
         */
        String regex = "^(?i)[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" // Starting character
                + "[ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$]{0,30}$"; // following characters
        if (!expr.matches(regex))
            return true;

        /* At this point, we know that expr at least has the form of an identifier. If it is a function, it must
         * be in the list of database functions.
         */
        if (database.isFunction(expr))
            return true;
        else
            return false;
    }
private boolean applyIsComputedExpressionHeuristic(ColumnConfig column, Database database) {
        String expr = column.getName();

        /*
         * https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-structure-identifiers.html
         * says the following about what makes a valid identifier in Firebird:
         * - At most 31 chars
         * - Starts with a 7-bit character
         * - After that, letters, digits, underscores or dollar signs are valid characters
         */
        String regex = "^(?i)[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" // Starting character
                + "[ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$]{0,30}$"; // following characters
        if (!expr.matches(regex))
            return true;

        /* At this point, we know that expr at least has the form of an identifier. If it is a function, it must
         * be in the list of database functions.
         */
        if (database.isFunction(expr))
            return true;
        else
            return false;
    }
An imperfect heuristic to determine if an expression is more likely a column name or a computed expression.
@return true if it is more likely an expression, false if it is more likely a column name (identifier).