Skip to content

NPE in convertToTimestampTimeZone on timestamp comparison #4152

@Kravuar

Description

@Kravuar

Version 2.3.232

Getting an NPE on select including some timestamp comparison:

Caused by: java.lang.NullPointerException: Cannot invoke "org.h2.engine.CastDataProvider.currentTimeZone()" because "<parameter2>" is null
	at org.h2.value.Value.convertToTimestampTimeZone(Value.java:2067) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.value.Value.convertTo(Value.java:1181) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.value.Value.convertTo(Value.java:1020) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.value.Value.compareToNotNullable(Value.java:2672) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.value.Value.compareTo(Value.java:2646) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.value.ValueRow.compareTypeSafe(ValueRow.java:128) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.value.Value.compareToNotNullable(Value.java:2675) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.value.Value.compareTo(Value.java:2646) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.value.CompareMode.compare(CompareMode.java:280) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.value.CompareMode.compare(CompareMode.java:20) ~[h2-2.3.232.jar:2.3.232]
	at java.base/java.util.TreeMap.getEntryUsingComparator(TreeMap.java:374) ~[na:na]
	at java.base/java.util.TreeMap.getEntry(TreeMap.java:344) ~[na:na]
	at java.base/java.util.TreeMap.get(TreeMap.java:279) ~[na:na]
	at org.h2.result.LocalResult.containsDistinct(LocalResult.java:249) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.expression.condition.ConditionInQuery.getValue(ConditionInQuery.java:95) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.expression.condition.ConditionInQuery.getValue(ConditionInQuery.java:55) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.expression.Expression.getBooleanValue(Expression.java:343) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.expression.SearchedCase.getValue(SearchedCase.java:30) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.command.query.Select$LazyResultQueryFlat.fetchNextRow(Select.java:1897) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.result.LazyResult.hasNext(LazyResult.java:78) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.result.FetchedResult.next(FetchedResult.java:34) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.command.query.Select.queryFlat(Select.java:767) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.command.query.Select.queryWithoutCache(Select.java:891) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.command.query.Query.queryWithoutCacheLazyCheck(Query.java:211) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.command.query.Query.query(Query.java:530) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.command.query.Query.query(Query.java:498) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.command.CommandContainer.query(CommandContainer.java:222) ~[h2-2.3.232.jar:2.3.232]
	at org.h2.command.Command.executeQuery(Command.java:196) ~[h2-2.3.232.jar:2.3.232]
	... 27 common frames omitted

The subject table:

CREATE TABLE TEST_ENTITY (
    ID VARCHAR(256) PRIMARY KEY,
    P15 TIMESTAMP(3) WITH TIME ZONE,
);

An NPE occures during the following select:

SELECT
  CASE
    WHEN t0.ts = ANY (
      SELECT ?::TIMESTAMP
    ) THEN TRUE
    ELSE FALSE
  END
FROM
  TEST_ENTITY t0

Java example to reproduce:

try (Connection connection = dataSource.getConnection()){
    // Table
    PreparedStatement ddl = connection.prepareStatement("CREATE TABLE TEST_ENTITY (id VARCHAR(256) PRIMARY KEY, ts TIMESTAMP(3) with time zone)");
    ddl.execute();

    // Insert
    PreparedStatement insert = connection.prepareStatement("INSERT INTO TEST_ENTITY (id, ts) VALUES (?, ?)");
    insert.setString(1, UUID.randomUUID().toString());
    insert.setObject(2, OffsetDateTime.now());
    insert.executeUpdate();

    // NPE Select
    PreparedStatement select = connection.prepareStatement("""
        SELECT
          CASE
            WHEN t0.ts = ANY (
              SELECT ?::TIMESTAMP
            ) THEN TRUE
            ELSE FALSE
          END
        FROM
          TEST_ENTITY t0
    """);
    select.setObject(1, LocalDateTime.now());
    select.executeQuery();
} catch (SQLException e) {
    throw new RuntimeException(e);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions