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で再現できないことがわかりました。