【问题标题】:Vertica Function Creation issue with flywaydbflywaydb 的 Vertica 函数创建问题
【发布时间】:2015-10-27 23:15:27
【问题描述】:

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

.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)

有其他人发生过这种情况还是我错过了什么?

【问题讨论】:

  • 看起来它可能缺乏对“OR REPLACE”选项的支持,删除它并且它工作正常。
  • 您确定它需要进入public 架构吗?您是否尝试过在 Vertica 中手动运行它?
  • 这只是一个沙盒测试,使用数据库管理员帐户针对公共模式进行测试。该脚本在 vertica 中运行良好,但 flyway 目前似乎不支持“或替换”选项。
  • @blitzkriegva Flyway 将更改合并到 4.0 里程碑,当然您可以将补丁移植到当前版本。

标签: flyway vertica


【解决方案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。

【讨论】:

  • hahahahaha ,因为 Kermit 是个仇恨者而被否决,Kermit = downvote rain kkkkk
  • @Up_One 这并不容易......成为绿色。
  • @Up_One 请查看我的comment,了解我否决的答案。我还建议您查看guide 以了解如何回答。
  • @Kermit - 我真的很想认识你,你很有趣 :)。放松只是在开玩笑。但是你需要放松,不是我们所有人都阅读指南,我们只是凡人:)
  • @Up_One 我将在一月份在爱尔兰。那我们见面吧?
【解决方案2】:

你的函数有效,它是一些隐藏的字符或类似的东西。

  • 尝试在 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)

【讨论】:

  • 检查了两次没有隐藏字符,问题在于flyway无法识别“OR REPLACE”并解析代码错误。
【解决方案3】:

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

【讨论】:

  • 我对您的回答投了反对票,因为它不能解决问题。在这种情况下,您的回答应该是评论或提供替代解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多