HSQLDB ЛЮБАЯ функция массива не работает - PullRequest
0 голосов
/ 03 июня 2018

У меня есть такая таблица

CREATE TABLE inlist_test_table (
    id  NUMERIC(5) NOT NULL PRIMARY KEY,
    val VARCHAR(50) NOT NULL
);

Я выполняю следующий запрос

SELECT val
FROM inlist_test_table
WHERE id = ANY(?)
ORDER BY id

Используя этот код

try (var connection = this.dataSource.getConnection();
     var preparedStatement = connection.prepareStatement(this.getQuery())) {
  var array = connection.createArrayOf("smallint", new Object[] {3, 5});
  try {
    preparedStatement.setArray(1, array);

    List<String> values = new ArrayList<>(2);
    try (var resultSet = preparedStatement.executeQuery()) {
      while (resultSet.next()) {
        values.add(resultSet.getString(1));
      }
    }
    assertEquals(Arrays.asList("Value_00003", "Value_00005"), values);
  } finally {
    array.free();
  }
}

Я ожидаю строки с3 и 5 должны быть возвращены.Вместо этого я получаю следующее исключение:

java.sql.SQLSyntaxErrorException: invalid ORDER BY expression in statement [SELECT val FROM inlist_test_table WHERE id = ANY(?) ORDER BY id]
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
    at com.github.marschall.jdbcinlists.AbstractInListTest.plainJdbc(AbstractInListTest.java:43)
    ...
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: org.hsqldb.HsqlException: invalid ORDER BY expression
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.QuerySpecification.resolveColumnReferencesInOrderBy(Unknown Source)
    at org.hsqldb.QuerySpecification.resolveColumnReferences(Unknown Source)
    at org.hsqldb.QuerySpecification.resolveReferences(Unknown Source)
    at org.hsqldb.QueryExpression.resolve(Unknown Source)
    at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
    at org.hsqldb.Session.compileStatement(Unknown Source)
    at org.hsqldb.StatementManager.compile(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
... 59 more

Я использую HSQLDB 2.4.1.Тот же код работает для Postgres и H2.

Редактировать 1

SELECT val
FROM inlist_test_table
WHERE id IN ( UNNEST(?) )
ORDER BY id

Не работает только как строка с идентификатором 3 (первый элемент в массиве) и строка с идентификатором 5 (вторым элементом в массиве) не совпадает.

Изменить 2

Изменение типа столбца с NUMERIC(5) на int заставляет код UNNEST работать, даже если тип элемента массива равен smallint.

1 Ответ

0 голосов
/ 04 июня 2018

В HSQLDB вам нужно использовать

... WHERE id IN ( UNNEST(?) ) ...

Начиная с версии 2.4.1, возникает проблема, когда столбец равен NUMERIC(5), а массив - smallint.Это, вероятно, будет исправлено в следующем выпуске HSQLDB.

...