2016-05-03 21 views
1

Wenn Sie jemals etwas ähnliches hatten und riss Ihre Haare aus, um das Problem zu finden - kurz gesagt :Sehr seltsame Spalte Zeichenfolge "single-quote-comment-brace-time-char" -Bug Substitutionen in Postgres wählt - vielleicht nur mit JDBC verwandt

--' 
select '{t'::text 

text 
----- 
TIME 

???

+1

Hinweis: funktioniert wie erwartet in psql, also muss dies eine JDBC-Störung sein. BTW: der einzeilige Kommentar ist formal '-' (zwei Bindestriche und ein Leerzeichen) – joop

+0

@joop: Thx für den Test und den Hinweis. Ich lege fast immer den formell empfohlenen Raum zur besseren Lesbarkeit dahinter, aber er ändert den Parser nicht und wird ihn auch nicht ändern, da das Gewinn-Kosten-Verhältnis viel zu schlecht ist. Ich wollte hier nur ein minimales Syntaxbeispiel schreiben. In meinem ursprünglichen Beispiel hatte ich etwas wie '- es wird nicht foo bar bla '- was durchaus allgemeine Englisch kommentieren kann: -/ –

+0

Es sieht aus wie die JDBC Escape-Parser-Implementierung in PostgreSQL funktioniert nicht richtig. –

Antwort

1

Was für ein böser Fehler und interessant, wie dies zu wirklich vermasselten Daten führen kann! Es seems to be known since 9.1 kann auch mit unserem 9.3 nur und geschah mit den JDBC-Treiber verwendet wird !:

Hier sind einige weitere Details I (für die Unterstützung fand heraus zu finden und zu beheben diesen Ad-hoc in Ihrem Code oder schließlich durch die „Quelle Hacker“;)) bisher mit Beispiel-Code unten:

  • ein Apostroph irgendwo in einem einzeiligen oder mehrzeiligen Kommentar über die Auswahl (zB --', erscheinen /*'*/, -- foo's cool)
  • explizit gegeben Strings müssen {t oder {d werden substituiert durch TIME oder DATE jeweils
  • eine der Zeichenketten enthalten müssen (auch implizit vielleicht) explizit sein vom Typ text
  • eine schließenden Klammer in der die gleiche oder eine andere Zeichenfolge irgendwo ist notwendig, um diese Substitution fortzusetzen (z. B. select 'foo } bar')
  • eine schließende Klammer in einem Kommentar sperrt wieder das Verhalten (z.B. --})

.

--' 
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}