From f9e3a499b509413b721c6ce0d505cc072da930db Mon Sep 17 00:00:00 2001 From: Sergey Korotkov Date: Sat, 15 Feb 2025 18:55:09 +0700 Subject: [PATCH] IGNITE-24514 Get rid of performance drop --- .../processors/query/h2/H2Connection.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Connection.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Connection.java index 0bcfc4cf8f08c..411b829f786be 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Connection.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Connection.java @@ -29,10 +29,14 @@ import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import org.h2.engine.Session; +import org.h2.expression.ValueExpression; import org.h2.jdbc.JdbcConnection; import org.h2.jdbc.JdbcStatement; +import org.h2.table.RangeTable; import org.jetbrains.annotations.Nullable; +import static org.h2.engine.Constants.SCHEMA_MAIN; + /** * Wrapper to store connection with currently used schema and statement cache. */ @@ -61,6 +65,19 @@ public class H2Connection implements AutoCloseable { this.log = log; initStatementCache(); + + // Work around the H2 bug (NPE in Session#removeLocalTempTable). + // Make sure session always contains not-null list of temp tables. + Session sess = (Session)((JdbcConnection)conn).getSession(); + + RangeTable dummyTbl = new RangeTable( + sess.getDatabase().getSchema(SCHEMA_MAIN), + ValueExpression.getNull(), + ValueExpression.getNull(), + true); + + sess.addLocalTempTable(dummyTbl); + sess.removeLocalTempTable(dummyTbl); } /** @@ -195,11 +212,6 @@ PreparedStatement prepareStatementNoCache(String sql) { catch (SQLException e) { throw new IgniteSQLException("Failed to parse query. " + e.getMessage(), IgniteQueryErrorCode.PARSING, e); } - finally { - Session sess = (Session)((JdbcConnection)conn).getSession(); - - sess.getLocalTempTables().forEach(sess::removeLocalTempTable); - } } /** {@inheritDoc} */