0

H2 1.3.173 を使用しています。

次の表があります。

CREATE TABLE Flights (
  FlightId INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY HASH,
  AircraftId INTEGER NOT NULL,
  DepartureDate TIMESTAMP NOT NULL,
  DepartureAirport VARCHAR(3) NOT NULL,
  ArrivalDate TIMESTAMP NOT NULL,
  ArrivalAirport VARCHAR(3) NOT NULL,
);
CREATE HASH INDEX idxFlightAircraftId ON Flights (AircraftId);

次のクエリを使用して、各航空機の最初の出発空港を探しています。

SELECT * FROM Flights A INNER JOIN (SELECT AircraftId, 
    MIN(DepartureDate) AS DepDate FROM Flights 
    GROUP BY AircraftId) B 
ON A.AircraftId = B.AircraftId 
AND A.DepartureDate = B.DepDate 
ORDER BY A.AircraftId ASC;

クエリはファイル モードで正しく実行されます。つまり、次の URL を使用します。

jdbc:h2:file:~/db

ただし、メモリ モードではありません。つまり、次の URL を使用します。

jdbc:h2:mem:db

この場合、次の例外が発生します。

org.h2.jdbc.JdbcSQLException: General error: 
    "java.lang.RuntimeException: Unexpected code path"

編集:例外メッセージとエラーコード:

org.h2.jdbc.JdbcSQLException: General error: "java.lang.RuntimeException: Unexpected code path"; SQL statement:
SELECT * FROM Flights A INNER JOIN (SELECT AircraftId, MIN(DepartureDate) AS DepDate FROM Flights GROUP BY AircraftId) B ON A.AircraftId = B.AircraftId AND A.DepartureDate = B.DepDate ORDER BY A.AircraftId ASC [50000-173]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:331) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.message.DbException.get(DbException.java:160) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.message.DbException.convert(DbException.java:283) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.Command.executeQuery(Command.java:199) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:78) ~[h2-1.3.173.jar:1.3.173]
    ...
Caused by: java.lang.RuntimeException: Unexpected code path
    at org.h2.message.DbException.throwInternalError(DbException.java:230) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.message.DbException.throwInternalError(DbException.java:243) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.index.NonUniqueHashIndex.find(NonUniqueHashIndex.java:80) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.index.BaseIndex.find(BaseIndex.java:126) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.index.IndexCursor.find(IndexCursor.java:155) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.table.TableFilter.next(TableFilter.java:328) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.dml.Select.queryGroupSorted(Select.java:164) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.dml.Select.queryWithoutCache(Select.java:618) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.dml.Query.query(Query.java:314) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.dml.Query.query(Query.java:284) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.index.ViewIndex.find(ViewIndex.java:253) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.index.BaseIndex.find(BaseIndex.java:126) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.index.IndexCursor.find(IndexCursor.java:155) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.table.TableFilter.next(TableFilter.java:328) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.dml.Select.queryFlat(Select.java:518) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.dml.Select.queryWithoutCache(Select.java:625) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.dml.Query.query(Query.java:314) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.dml.Query.query(Query.java:284) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.dml.Query.query(Query.java:36) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.CommandContainer.query(CommandContainer.java:91) ~[h2-1.3.173.jar:1.3.173]
    at org.h2.command.Command.executeQuery(Command.java:195) ~[h2-1.3.173.jar:1.3.173]

何か案が?ありがとう。ローラン

4

1 に答える 1

2

これは、H2 データベースのバグです。同じ問題が次の場合に発生します。

create table test(x int);
create hash index on test(x);
select 1 from test group by x;

これは、次のリリースで修正される予定です。

于 2013-10-11T17:37:32.500 に答える