2015-12-30 3 views
2

Первый фон.Firebird CHAR_TO_UUID, не удалось исключить GDS. 335544606

Я кодирую настольное приложение с Java как Eclipse RCP (efxclipse). Моя конфигурация:

  • Затмение Mars
  • efxclipse 2.0.0
  • JDK 1.8_66
  • Equinox OSGi рамки
  • Firebird 2.5.5.26952
  • Jaybird 2.2.9
  • HicariCP 2,4 .1 в качестве решения объединения пулов

База данных таблицы Пример:

CREATE TABLE MYTABLE (
    ID CHAR(16) CHARACTER SET OCTETS COLLATE OCTETS NOT NULL CONSTRAINT PK_MY_INDEX PRIMARY KEY, 
    DATA VARCHAR(100) 
); 

установки HikariCP в

HikariConfig config = new HikariConfig(); 
config.setMaximumPoolSize(100); 
config.setDataSourceClassName("org.firebirdsql.pool.FBSimpleDataSource"); 
config.addDataSourceProperty("databaseName", cfg.getDbConnection()); 
config.addDataSourceProperty("user", cfg.getDbUser()); 
config.addDataSourceProperty("password", cfg.getDbPassword()); 
config.addDataSourceProperty("encoding", "UTF8"); 
//config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?"); 
config.setMaximumPoolSize(cfg.getDbPoolSizeMax()); 

HikariDataSource ds = new HikariDataSource(config); 
ds.setConnectionTimeout(5000);  

// Я использую UUID в качестве первичных ключей и ПОЛУЧИТЬ строки Я использую подобный код

Connection con = ds.getConnection(); 
query = "SELECT DATA FROM MYTABLE WHERE ID=char_to_uuid(?)"; 
PreparedStatement p = con.prepareStatement(query); 
p.setString(1, id); 

где находится «идентификатор "представляет собой строку со значением типа 57F2B8C7-E1D8-4B61-9086-C66D1794F2D9 '

До последней недели я использовал Firebird 2.5.2xxx и Jaybird 2.2.8 на своем компьютере, и с этой настройкой абсолютно никаких проблем. Затем я обновил установку Firebird до версии 2.5.5.26952 и возникла проблема.

Проблема:

После обновления до Firebird 2.5.5 часть кода, где я строка для выборки известного «ID» выбрасывает исключение

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544606. expression evaluation not supported 
Human readable UUID argument for CHAR_TO_UUID must be of exact length 36 
    at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:782) ~[na:na] 
    at org.firebirdsql.jdbc.AbstractPreparedStatement.executeQuery(AbstractPreparedStatement.java:177) ~[na:na] 
    at com.zaxxer.hikari.proxy.PreparedStatementProxy.executeQuery(PreparedStatementProxy.java:52) ~[na:na] 
    at com.zaxxer.hikari.proxy.HikariPreparedStatementProxy.executeQuery(HikariPreparedStatementProxy.java) ~[na:na] 
... 
Caused by: org.firebirdsql.gds.GDSException: expression evaluation not supported 
Human readable UUID argument for CHAR_TO_UUID must be of exact length 36 
    at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.readStatusVector(AbstractJavaGDSImpl.java:2092) ~[na:na] 
    at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.receiveResponse(AbstractJavaGDSImpl.java:2042) ~[na:na] 
    at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.iscDsqlExecute2(AbstractJavaGDSImpl.java:1149) ~[na:na] 
    at org.firebirdsql.gds.impl.GDSHelper.executeStatement(GDSHelper.java:232) ~[na:na] 
    at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:774) ~[na:na] 

Значение «ИД» является строка длины при 36 полукокса (Я проверил, и это работало до последней недели). Я уже перешел на Jaybird 2.2.9. Насколько я понимаю, это связано с чем-то вроде отправки значения параметров, как UTF8 строки (длина х 4), так что я изменил мой код выглядит следующим образом:

p.setObject(1, id.getBytes(StandardCharsets.US_ASCII)); 

Опять же, нет результата, тот же вопрос.

Также это может быть связано с параметром соединения Jaybird октетовAsBytes, но я не смог применить его правильно (через HikariCP). Я попытался

config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?"); 

при установке HikariCP, но результат не изменился.

Заранее спасибо.

+0

Это работает для меня через простой JDBC (не используя DataSource или пул соединений) с использованием Firebird WI-V2.5.5.26952 и Jaybird 2.2.9. –

+0

Проблема возникла при обновлении Firebird или при обновлении jaybird? Обратите внимание, что для 'nonStandardProperty' вы не должны включать эти вопросительные знаки, хотя это свойство не повлияло бы на поведение здесь. –

+0

Что произойдет, если вы попробуете это с помощью кодирования одного байтового соединения, например win1252? –

ответ

1

Я могу воспроизвести это в Firebird 2.5.4, 2.5.5, а недавний снимок Firebird 3 (2.5.3 и ранее, похоже, не затронут). Я смог воспроизвести это, и проблема, кажется, в самой Firebird.

Как прокомментировал ранее, обходной путь является приведение параметра к явному набора символов:

char_to_uuid(cast(? as char(36) character set utf8)) 

Я создал билет в Firebird трекера чтобы сообщить об этом: CORE-5062, и это будет исправлено в Firebird 2.5.6 и Firebird 3 RC2