flywaydb的Vertica函数创建问题

时间:2015-10-21 17:17:07

标签: flyway vertica

使用Vertica 7.1和flyway 3.2.1在创建函数时出错,甚至尝试了文档中的示例。几乎不会忽略第一个&#39 ;;' :

.sql文件中的

代码

CREATE or replace FUNCTION default_to_hello(x VARCHAR) RETURN VARCHAR
AS BEGIN
  -- The body of a SQL function in Vertica must be in the form 'RETURN expression'
  RETURN (CASE WHEN (x IS NOT NULL) THEN x ELSE 'Hello' END);
END;

报告错误:

Current version of schema "public": 2
Migrating schema "public" to version 3 - test
ERROR: Migration of schema "public" to version 3 failed! Please restore backups and roll back database and code!
ERROR: 
Migration V3__test.sql failed
-----------------------------
SQL State  : 42601
Error Code : 4856
Message    : [Vertica][VJDBC](4856) ERROR: Syntax error at or near "EOL"
Location   : /opt/flywaydb/sql/V3__test.sql (/opt/flywaydb/sql/V3__test.sql)
Line       : 1
Statement  : CREATE or replace FUNCTION default_to_hello(x VARCHAR) RETURN VARCHAR
AS BEGIN
  -- The body of a SQL function in Vertica must be in the form 'RETURN expression'
  RETURN (CASE WHEN (x IS NOT NULL) THEN x ELSE 'Hello' END)

是否有其他人发生过这种情况或者我遗失了什么?

3 个答案:

答案 0 :(得分:1)

Flyway' VerticaStatementBuilder不支持OR REPLACE。您可以看到code here的解析方式(它没有留下任何偏差的余地)。

    if (statementStart.startsWith("CREATE FUNCTION")) {
        if (line.startsWith("BEGIN") || line.endsWith("BEGIN")) {
            insideBeginEndBlock = true;
        }

        if (line.endsWith("END;")) {
            insideBeginEndBlock = false;
        }
    }

我提交了拉取请求,它已合并为Flyway 4.0。

答案 1 :(得分:0)

你的功能有效,它是一些隐藏的角色或类似的东西。

  • 我设法在尝试在DbVis中执行时重现错误。

但是在Vertica节点上的vsql客户端工作正常。

dbadmin=> CREATE or replace FUNCTION default_to_hello(x VARCHAR) RETURN VARCHAR
dbadmin-> AS BEGIN
dbadmin->   -- The body of a SQL function in Vertica must be in the form 'RETURN expression'
dbadmin->   RETURN (CASE WHEN (x IS NOT NULL) THEN x ELSE 'Hello' END);
dbadmin-> END;
CREATE FUNCTION
dbadmin=> select default_to_hello('Working');
 default_to_hello
------------------
 Working
(1 row)

dbadmin=> select default_to_hello(null);
 default_to_hello
------------------
 Hello
(1 row)

答案 2 :(得分:0)

这看起来像是一个解析错误。请在Flyway问题跟踪器中提交问题。拉请求也欢迎。