Something wrong happened with a custom function after upgrade from 1.4.189

38 views
Skip to first unread message

Wojciech Marciniak

unread,
May 11, 2017, 11:30:20 PM5/11/17
to H2 Database
After upgrade from 1.4.189 my custom function (defined as alias) stopped working. NPE is reported as a "General error". This applies to all versions above and including 1.4.191.
Version 1.4.190 behaves somewhat randomly and strange (does not throw an exception but sometimes causes my web app to page reload).

1.4.189 works well

This is my function, which returns a Resultset:

import org.h2.tools.SimpleResultSet;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class CustomQuery {

 
private final static String membersString =
 
"select distinct p.*, case when p.team_id = ? then true else false end as main from person_team_relation pt join person p on pt.person_id = p.id where pt.team_id = ?";

   
private final static String childrenString = "select * from team where parent = ?";

   
public static ResultSet getMembers(Connection con, Long teamId) throws SQLException {
     
SimpleResultSet srs = new SimpleResultSet();
     srs
.addColumn("ID", Types.BIGINT, 19, 0);
     srs
.addColumn("FIRST_NAME", Types.VARCHAR, 512, 0);
     srs
.addColumn("LAST_NAME", Types.VARCHAR, 512, 0);
     srs
.addColumn("POSITION", Types.VARCHAR, 256, 0);
     srs
.addColumn("PERSONAL_NUMBER", Types.VARCHAR, 256, 0);
     srs
.addColumn("MAIN", Types.BOOLEAN, 0, 0);
     
List<Object[]> children = getChildren(con, teamId);
       
for (Object[] row: children) {
         srs
.addRow(row);
       
}
     
PreparedStatement membersStatement = con.prepareStatement(membersString);
     membersStatement
.setLong(1, teamId);
     membersStatement
.setLong(2, teamId);
     
ResultSet members = membersStatement.executeQuery();
     
while (members.next()) {
       srs
.addRow(members.getLong("ID"), members.getString("FIRST_NAME"), members.getString("LAST_NAME"),
       members
.getString("POSITION"), members.getString("PERSONAL_NUMBER"), members.getBoolean("MAIN"));
     
}
     
return srs;
   
}

   
private static List<Object[]> getChildren(Connection con, Long teamId) throws SQLException {
     
PreparedStatement children = con.prepareStatement(childrenString);
     children
.setLong(1, teamId);
     
ResultSet childrenResult = children.executeQuery();
     
ArrayList<Object[]> extraMembers = new ArrayList<>();
     
while (childrenResult.next()) {
       extraMembers
.addAll(getChildren(con, childrenResult.getLong("ID")));
       
PreparedStatement membersPerTeam = con.prepareStatement(membersString);
       membersPerTeam
.setLong(1, -1L);
       membersPerTeam
.setLong(2, childrenResult.getLong("ID"));
       
ResultSet extraMembersResult = membersPerTeam.executeQuery();
       
while (extraMembersResult.next()) {
         
Object[] member = new Object[]{
           extraMembersResult
.getLong("ID"),
           extraMembersResult
.getString("FIRST_NAME"), extraMembersResult.getString("LAST_NAME"),
           extraMembersResult
.getString("POSITION"), extraMembersResult.getString("PERSONAL_NUMBER"), Boolean.FALSE
         
};
         extraMembers
.add(member);
       
}
     
}
     
return extraMembers;
   
}
}

After upgrade, suddenly an NPE appeared in line: 
ResultSet childrenResult = children.executeQuery();

 in the getChildren(...) method 

The error stacks trace looks like that:

Internal Exception: org.h2.jdbc.JdbcSQLException: Błąd ogólny: "java.lang.NullPointerException"
General error: "java.lang.NullPointerException"; SQL statement:
select * from team where parent = ? [50000-191]
Error Code: 50000
Call:  SELECT count(*) FROM (select * from(select distinct * from MEMBERS(18)))
Query: DataReadQuery(sql=" SELECT count(*) FROM (select * from(select distinct * from MEMBERS(18)))")
 at org
.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340)
 at org
.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:684)
 at org
.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:560)
 at org
.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2056)
 at org
.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:570)
 at org
.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:258)
 at org
.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242)
 at org
.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
 at org
.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:299)
 at org
.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelect(DatasourceCallQueryMechanism.java:281)
 at org
.eclipse.persistence.queries.DataReadQuery.executeNonCursor(DataReadQuery.java:197)
 at org
.eclipse.persistence.queries.DataReadQuery.executeDatabaseQuery(DataReadQuery.java:152)
 at org
.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:904)
 at org
.eclipse.persistence.queries.DataReadQuery.execute(DataReadQuery.java:137)
 at org
.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:803)
 at org
.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
 at org
.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1857)
 at org
.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1839)
 at org
.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804)
 at org
.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258)
 
... 62 more
Caused by: org.h2.jdbc.JdbcSQLException: Błąd ogólny: "java.lang.NullPointerException"
General error: "java.lang.NullPointerException"; SQL statement:
select * from team where parent = ? [50000-191]
 at org
.h2.message.DbException.getJdbcSQLException(DbException.java:345)
 at org
.h2.message.DbException.get(DbException.java:168)
 at org
.h2.message.DbException.convert(DbException.java:295)
 at org
.h2.command.Command.executeQuery(Command.java:213)
 at org
.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:110)
 at com
.profacilis.abi3.data.query.CustomQuery.getChildren(CustomQuery.java:44)
 at com
.profacilis.abi3.data.query.CustomQuery.getMembers(CustomQuery.java:26)
 at sun
.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun
.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java
.lang.reflect.Method.invoke(Method.java:497)
 at org
.h2.engine.FunctionAlias$JavaMethod.getValue(FunctionAlias.java:481)
 at org
.h2.expression.JavaFunction.getValueForColumnList(JavaFunction.java:126)
 at org
.h2.table.FunctionTable.<init>(FunctionTable.java:66)
 at org
.h2.command.Parser.readTableFilter(Parser.java:1237)
 at org
.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1884)
 at org
.h2.command.Parser.parseSelectSimple(Parser.java:2032)
 at org
.h2.command.Parser.parseSelectSub(Parser.java:1878)
 at org
.h2.command.Parser.parseSelectUnion(Parser.java:1699)
 at org
.h2.command.Parser.parseSelect(Parser.java:1687)
 at org
.h2.command.Parser.parsePrepared(Parser.java:443)
 at org
.h2.command.Parser.parse(Parser.java:315)
 at org
.h2.command.Parser.parse(Parser.java:287)
 at org
.h2.command.Parser.prepare(Parser.java:236)
 at org
.h2.engine.Session.prepare(Session.java:525)
 at org
.h2.engine.Session.prepare(Session.java:512)
 at org
.h2.table.TableView.compileViewQuery(TableView.java:105)
 at org
.h2.table.TableView.initColumnsAndTables(TableView.java:156)
 at org
.h2.table.TableView.init(TableView.java:98)
 at org
.h2.table.TableView.<init>(TableView.java:65)
 at org
.h2.table.TableView.createTempView(TableView.java:528)
 at org
.h2.command.Parser.readTableFilter(Parser.java:1180)
 at org
.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1884)
 at org
.h2.command.Parser.parseSelectSimple(Parser.java:2032)
 at org
.h2.command.Parser.parseSelectSub(Parser.java:1878)
 at org
.h2.command.Parser.parseSelectUnion(Parser.java:1699)
 at org
.h2.command.Parser.readTableFilter(Parser.java:1169)
 at org
.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1884)
 at org
.h2.command.Parser.parseSelectSimple(Parser.java:2032)
 at org
.h2.command.Parser.parseSelectSub(Parser.java:1878)
 at org
.h2.command.Parser.parseSelectUnion(Parser.java:1699)
 at org
.h2.command.Parser.parseSelect(Parser.java:1687)
 at org
.h2.command.Parser.parsePrepared(Parser.java:443)
 at org
.h2.command.Parser.parse(Parser.java:315)
 at org
.h2.command.Parser.parse(Parser.java:287)
 at org
.h2.command.Parser.prepareCommand(Parser.java:252)
 at org
.h2.engine.Session.prepareLocal(Session.java:560)
 at org
.h2.engine.Session.prepareCommand(Session.java:501)
 at org
.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
 at org
.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73)
 at org
.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:276)
 at org
.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1565)
 at org
.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1514)
 at org
.eclipse.persistence.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:778)
 at org
.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:621)
 
... 80 more
Caused by: java.lang.NullPointerException
 at org
.h2.index.IndexCursor.prepare(IndexCursor.java:115)
 at org
.h2.index.IndexCursor.find(IndexCursor.java:160)
 at org
.h2.table.TableFilter.next(TableFilter.java:460)
 at org
.h2.command.dml.Select.queryFlat(Select.java:541)
 at org
.h2.command.dml.Select.queryWithoutCache(Select.java:654)
 at org
.h2.command.dml.Query.query(Query.java:341)
 at org
.h2.command.dml.Query.query(Query.java:309)
 at org
.h2.command.dml.Query.query(Query.java:36)
 at org
.h2.command.CommandContainer.query(CommandContainer.java:110)
 at org
.h2.command.Command.executeQuery(Command.java:201)
 
... 131 more





Noel Grandin

unread,
May 12, 2017, 3:57:40 AM5/12/17
to h2-da...@googlegroups.com
Can you create a standalone test case for this? Something is definitely wrong, but it's hard to see what exactly.​
Reply all
Reply to author
Forward
0 new messages