Ошибка запроса при использовании СУБД Firebird с ColdFusion 11

Итак, у меня установлен Adobe ColdFusion 11 Update 5 на сервере Windows 2012. Я добавил источник данных Firebird, используя драйвер JDBC Jaybird 2.2.5. Я создал запрос, используя этот источник данных, например:

<cfquery name="rawdata" datasource="RSReport">
    select * from rptpatientstudy 
    where statusorder >= 200 
    and issuer = 'RWHG' 
    and studydatetime >= '2015-01-01' 
    and studydatetime < '2015-04-01';       
</cfquery>

но когда я запускаю страницу, я получаю ошибку динамического SQL с упоминанием неизвестного токена.

Вот трассировка стека:

org.firebirdsql.gds.GDSException: Dynamic SQL Error 
SQL error code = -104 Token unknown - line 2, column 1 RETURNING
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.readStatusVector(AbstractJavaGDSImpl.java:2092)
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.receiveResponse(AbstractJavaGDSImpl.java:2042)
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.iscDsqlPrepare(AbstractJavaGDSImpl.java:1465)
at org.firebirdsql.gds.impl.GDSHelper.prepareStatement(GDSHelper.java:190)
at org.firebirdsql.jdbc.AbstractStatement.prepareFixedStatement(AbstractStatement.java:1441)
at org.firebirdsql.jdbc.AbstractStatement.internalExecute(AbstractStatement.java:1423)
at org.firebirdsql.jdbc.AbstractStatement.execute(AbstractStatement.java:867)
at org.firebirdsql.jdbc.AbstractStatement.execute(AbstractStatement.java:441)
at coldfusion.server.j2ee.sql.JRunStatement.execute(JRunStatement.java:359)
at coldfusion.sql.Executive.executeQuery(Executive.java:1479)
at coldfusion.sql.Executive.executeQuery(Executive.java:1229)
at coldfusion.sql.Executive.executeQuery(Executive.java:1159)
at coldfusion.sql.SqlImpl.execute(SqlImpl.java:406)
at coldfusion.tagext.sql.QueryTag.executeQuery(QueryTag.java:1185)
at coldfusion.tagext.sql.QueryTag.startQueryExecution(QueryTag.java:814)
at coldfusion.tagext.sql.QueryTag.doEndTag(QueryTag.java:767)
at cfmarla2ecfm1504149200.runPage(C:\inetpub\WebSites\intranet\marla.cfm:1)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:246)
at coldfusion.tagext.lang.IncludeTag.handlePageInvoke(IncludeTag.java:736)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:572)
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
at coldfusion.filter.IpFilter.invoke(IpFilter.java:45)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:466)
at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:142)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:94)
at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:58)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)
at coldfusion.CfmServlet.service(CfmServlet.java:219)
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:422)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:199)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)  

Вот список полей в таблице:

STUDYINSTANCEUID
PATIENTID
PATIENTNAME
STUDYDATETIME
STUDYDESCRIPTION
PRIORITY
READINGPHYSICIAN
REFERINGPHYSICIAN
PERFORMINGPHYSICIAN
TECHNOLOGIST
TRANSCRIPTIONIST
ACCESSIONNUMBER
INSTITUTIONNAME
STATUSORDER
SCHEDULEDBODYPARTEXAMINED
SCHEDULEDMODALITY
UTCOFFSET
HL7BILLED
SCHEDULEDEXAMROOM
PATIENTBIRTHDATE
MODALITIES
BODYPARTS
IMAGES
AGE
SEX
CONFLICT
STUDYID
FILESETID
ISSUER
SCHEDULEDLATERALITY
LOCATION
PROCEDURECODE
DATETIMEREAD
DURATION
FILM
BURNCD
MAIL
COURIER
AUTOFAXLIST
AUTOEMAILLIST
SCHEDULEDRESOURCE
ACCOUNTSTATUS
LANGUAGE
FINANCIALTYPE
STATE
INSURANCEPAYERS
INSURANCEEXPIRIES
COMMENTS
ALLERGIES
CANCELLATIONREASON
CELLPHONE
HOMEPHONE
AUTHORIZATIONNUMBER
DATEOFSURGERY
RECEIVEDTIME
INTERNALVISITID
SMOKINGSTATUS

Я действительно не уверен, откуда это могло взяться, и я не могу найти что-то непосредственно применимое в Google; большинство результатов там, кажется, имеют дело с использованием производных таблиц или SELECT * в запросе.


person Matt Gutting    schedule 20.04.2015    source источник
comment
Были ли у вас какие-либо успешные запросы к этому источнику данных? Также попробуйте убрать точку с запятой.   -  person Dan Bracuk    schedule 20.04.2015
comment
Какая у вас версия Firebird?   -  person Mark Rotteveel    schedule 20.04.2015
comment
@DanBracuk Нет; запрос, который я здесь представляю, на самом деле является упрощенной версией первого, который я пробовал, в котором использовалось ВНУТРЕННЕЕ СОЕДИНЕНИЕ.   -  person Matt Gutting    schedule 20.04.2015
comment
запустите очень простой запрос, чтобы исключить проблемы с драйверами. Что-то вроде select count(*) records from sometable where 1=2. Обратите внимание на отсутствие точки с запятой.   -  person Dan Bracuk    schedule 20.04.2015
comment
@MarkRotteveel Firebird 2.5   -  person Matt Gutting    schedule 20.04.2015
comment
@DanBracuk Пытался select count(*) from rptpatientstudy where 1 = 2. Получил ту же ошибку.   -  person Matt Gutting    schedule 20.04.2015
comment
Большинство результатов, по-видимому, связаны с использованием производных таблиц или SELECT * в запросе Я что-то упустил? Вы используете select * в запросе, который вы предоставили здесь, и пример Дэна тоже. Попробуйте выполнить простой запрос и указать имена столбцов, чтобы проверить, работает ли это.   -  person Miguel-F    schedule 20.04.2015
comment
@ Мигель-Ф Пойнт; не знаю, как я пропустил это. На этот раз я попробовал select accessionnumber from rptpatientstudy where 1 = 2. Та же ошибка.   -  person Matt Gutting    schedule 20.04.2015
comment
У вас есть полная трассировка стека? RETURNING, кажется, предполагает, что на самом деле это обновление или вставка, которая запрашивает сгенерированный идентификатор, но RETURNING поддерживается с версии 2.0. Каков диалект вашей базы данных? Каковы фактические столбцы в этой таблице?   -  person Mark Rotteveel    schedule 20.04.2015
comment
Я добавлю полную трассировку стека в вопрос.   -  person Matt Gutting    schedule 20.04.2015
comment
@MarkRotteveel Я добавил полную трассировку стека для ошибки, используя запрос select accessionnumber from rptpatientstudy where 1 = 2.   -  person Matt Gutting    schedule 20.04.2015
comment
[отредактировано] сотрите мой первоначальный комментарий, но все же посмотрите этот другой вопрос для возможной аналогичной проблемы - stackoverflow.com/ а/17834846/1636917   -  person Miguel-F    schedule 20.04.2015


Ответы (1)


TL;DR: это ошибка Jaybird. Я создал ошибку JDBC-391, и она была исправлена ​​в Jaybird 2.2.8.

В трассировке стека вызывается метод execute: execute(String, int), который обычно вызывается только для обновления/вставки, который должен возвращать сгенерированные ключи. Похоже, что Cold Fusion всегда называет это так (со значением Statement.RETURN_GENERATED_KEYS).

Реализация, которая обрабатывает сгенерированные ключи в Jaybird, предполагает, что его внутренний синтаксический анализатор выдает исключение при столкновении с оператором SELECT; если это произойдет, запрос должен быть обработан без изменений. К сожалению, это предположение не проверяется, и синтаксический анализатор на самом деле не выдает исключения, когда возникают ошибки во время синтаксического анализа (они сигнализируются другим способом). В результате запрос SELECT изменяется путем добавления предложения RETURNING, что является синтаксической ошибкой при отправке запроса на сервер.

Я не уверен, есть ли обходной путь для этого, за исключением, возможно, возврата к Jaybird 2.1.6, поскольку эта проблема существовала с момента первоначальной реализации в Jaybird 2.2.0. Вы также можете проверить, есть ли у Cold Fusion какая-либо конфигурация, которая изменит способ выполнения запросов.

Это было исправлено в Jaybird 2.2.8.

Раскрытие информации: я являюсь одним из разработчиков Jaybird.

person Mark Rotteveel    schedule 20.04.2015
comment
Спасибо! Потрясающий! Попробую откатить свою версию Jaybird. - person Matt Gutting; 20.04.2015
comment
@MattGutting Я не совсем уверен, что использование 2.1.6 исправит это, но с тем же успехом он может выдать FBDriverNotCapableException. Это зависит от того, проверяет ли Cold Fusion поддержку сгенерированных ключей перед вызовом этого метода. - person Mark Rotteveel; 20.04.2015
comment
@MattGutting Jaybird 2.2.8 был выпущен сегодня, для загрузки см. github.com/ FirebirdSQL/jaybird/релизы/тег/v2.2.8 - person Mark Rotteveel; 31.05.2015