10

PlayFramework2.1を使用

私の進化では、次のSQLが定義されています。

CREATE OR REPLACE FUNCTION idx(myArray anyarray, myElement anyelement) RETURNS int AS $$
 SELECT i FROM (
  SELECT generate_series(array_lower(myArray,1),array_upper(myArray,1))
 ) g(i)
 WHERE myArray[i] = anyElement
 LIMIT 1; $$ LANGUAGE sql IMMUTABLE;

エボリューションを実行すると、次のエラーが発生します。

We got the following error: ERROR: unterminated dollar-quoted string at or near 
"$$ SELECT i FROM ( SELECT generate_series(array_lower(myArray,1),
 array_upper(myArray,1)) ) g(i) WHERE myArray[i] = anyElement LIMIT 1" Position:
 87 [ERROR:0, SQLSTATE:42601], while trying to run this SQL script:

PostgreSQLドライバーバージョン9.1-901.jdbc4を使用しています。

postgresクエリログを調べたところ、Playが次のことを実行しようとしていることがわかりました。

LOG:  execute <unnamed>: insert into play_evolutions values($1, $2, $3, $4, $5, $6, $7)
PST DETAIL:  parameters: $1 = '1',
                         $2 = 'c834d463ebd9916b0a3388040300a0926514faef',
                         $3 = '2013-03-05 00:00:00',
                         $4 = '-- THE EVOLUTION UP STATEMENTS GO HERE',
                         $5 = '-- THE EVOLUTION DOWN STATEMENTS GO HERE',
                         $6 = 'applying_up',
                         $7 = ''

そのため、何らかの理由で、Playは適切にエスケープせずにSQLをテキスト列に挿入しようとしています。他の誰かがこれの回避策を見つけましたか?これはJDBCの問題であり、Playの問題ではないと思いますか?また、誰かがLiquibaseをPlay 2.1で動作させていますか?

また、$$を'に変更するだけでも機能しません。その場合、別のエラーが発生しますが、それでも進化を実行することはできません。

編集:新しいプレイプロジェクトの例を追加しました。http://elijah.zupancic.name/files/play_evolution_problem.tar.gzからダウンロードしてください。

この例を機能させるには、evolution1.sqlの最初のコメントに示されているように新しいデータベースを作成する必要があります。次に、正しいポートと正しいユーザーでpostgresに接続するようにconf/application.confを構成する必要があります。

Playフレームワークの完全に外部にcreate関数sqlを挿入しようとする実験を行ったところです。例はここにあります:http://elijah.zupancic.name/files/PgCreateFunction.tar.gz <

非常に再現性が高いことがわかります。

編集:Javaで再現できないことがわかりました。

4

1 に答える 1

20

これは、Playが進化を解析する方法のアーティファクトです。セミコロンで各ステートメントを解析するため、ストアドプロシージャの定義を処理できません。この問題は、Play 2.1で、埋め込まれたセミコロンを2倍にして指定できるようにすることで解決されました。たとえば、https://github.com/playframework/Play20/pull/649を参照してください。

Play 2.1を使用して、を使用;;して同様の問題を解決しました。次のように進化を再定義して、再試行することをお勧めします。

CREATE OR REPLACE FUNCTION idx(myArray anyarray, myElement anyelement) RETURNS int AS $$
 SELECT i FROM (
  SELECT generate_series(array_lower(myArray,1),array_upper(myArray,1))
 ) g(i)
 WHERE myArray[i] = anyElement
 LIMIT 1;; $$ LANGUAGE sql IMMUTABLE;
于 2013-03-25T13:56:27.650 に答える