2016-05-03 4 views
1

Если у вас когда-либо было что-то похожее и вырвали волосы, чтобы найти проблему - короче :Очень странная строка столбца «single-quote-comment-brace-time-char» -bug замены в postgres selects - возможно, связанная только с JDBC

--' 
select '{t'::text 

text 
----- 
TIME 

????

+1

Примечание: работает как ожидается в psql, поэтому это должно быть сбой JDBC. BTW: однострочный комментарий формально - '-' (два дефиса и пробел) – joop

+0

@joop: Thx для теста и подсказки. Я почти всегда размещал официально рекомендованное пространство за ним для удобочитаемости, но он делает и не будет менять парсер в любое время, так как соотношение прибыли и прибыли слишком плохое. Я просто хотел написать здесь небольшой пример синтаксиса. В моем первоначальном примере у меня было что-то вроде '- это не будет foo bar bla' - что может быть довольно общим английским комментарием: -/ –

+0

Похоже, что реализация парсера JDBC Escape в PostgreSQL работает некорректно. –

ответ

1

Какая неприятная ошибка и интересно, как это может привести к портированию данных! Это seems to be known since 9.1, может быть связано только с драйвером JDBC и произошло с нашим 9.3 а !:

Вот еще некоторые детали, я узнал (за помощь, чтобы найти и исправить это специальный в вашем коде или в конечном счете, от «источника хакеров»;)) до сих пор с примерами кода ниже:

  • апостроф должен появиться где-то в одной строке или многострочный комментарий выше выберите (например --', /*'*/, -- foo's cool)
  • явно указанные строк должны содержать {t или {d быть замещены TIME или DATE соответственно
  • один из строк должны быть явно (возможно, также неявным) типа text
  • закрывающей скобкой в такая же или другая строка где-то необходима для продолжения этой подстановки (например, 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} 

 Смежные вопросы

  • Нет связанных вопросов^_^