2016-05-03 5 views
1

これまでに何か類似していて、 :postgresの非常に奇妙な列文字列 "single-quote-comment-brace-time-char" -bugの置換は、おそらくJDBCにのみ関連します

--' 
select '{t'::text 

text 
----- 
TIME 

???

+1

注:psqlで期待どおりに動作するため、これはJDBCのグリッチでなければなりません。 BTW:一行コメントは正式に ' - '(2つのハイフンとスペース)です。 – joop

+0

@joop:テストとヒントのためのThx。私はほとんどの場合、読みやすさのために正式に推奨されるスペースを置いていますが、いつでもパーサーを変更することはありません。なぜなら、利益とコストの比率があまりにも悪いからです。私はちょうどここにいくつかの最小構文サンプルを書いてみたかった。私の元の例では、私は '' bar bla''を実行しませんでした。これはかなり一般的な英語のコメントです: -/ –

+0

PostgreSQLのJDBC Escapeパーサの実装が正しく動作していないようです。 –

答えて

1

これはどのように厄介なバグで、これが本当に混乱したデータにつながるのか興味深いです! それにseems to be known since 9.1、唯一のJDBCドライバに関連している可能性がありそしてここに私たちの9.3だけでなく!:

で起きたあなたのコードでは、このアドホックを見つけて修正するために助けるため、私が見つけたいくつかの詳細は(またはしています最終的には「元ハッカー」によって、これまでに以下のサンプルコード付き)):単一引用符を選択上記単一行または複数行のコメントのどこかに表示される必要があり

  • (例えば--'/*'*/-- foo's cool
  • 明示的 文字列がストリングの一方が明示的(多分も暗黙的に)タイプtext
  • ので閉じ括弧でなければならないそれぞれTIME又はDATEによって置換される{t又は{d
  • を含んでいなければならない所与
  • このサブディションを続けるにはどこか同じか別の文字列が必要です。 select 'foo } bar'
  • コメントで閉じ括弧再び動作を無効(例えば--}

--' 
select '{t'::text 

union all select '{ta}' 
union all select '{tfoo bar' 

-- these are untouched 
union all select '{ t}' 
union all select 'foo { t}' 

-- there seems to be an opening/closing "{" "}" match behaviour behind 
-- it since the 2nd row below 
union all select '{t' 
union all select '{ta}' 
union all select '{tfoo bar' 

-- also "d" seems to be a "trigger" 
union all select '}{d}' 

-- a closing brace in a comment seems to disable it completely again 
union all select '{d' 
union all select '{d' 
-- } 
union all select 'a}{d}' 

text 
------------ 
TIME 
{ta 
TIME foo bar 
{ t 
foo { t} 
TIME 
{ta 
TIME foo bar 
DATE 
DATE 
{d 
a}{d} 
関連する問題