You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Ilya Korol (Jira)" <ji...@apache.org> on 2022/07/20 08:04:00 UTC

[jira] [Created] (IGNITE-17396) NPE during SQL query preparation when distributedJoins enabled

Ilya Korol created IGNITE-17396:
-----------------------------------

             Summary: NPE during SQL query preparation when distributedJoins enabled 
                 Key: IGNITE-17396
                 URL: https://issues.apache.org/jira/browse/IGNITE-17396
             Project: Ignite
          Issue Type: Bug
          Components: sql
    Affects Versions: 2.13
            Reporter: Ilya Korol


Strange NPE when distributedJoins enabled:

{code:java}
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteException;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.query.SqlFieldsQuery;
import org.apache.ignite.configuration.IgniteConfiguration;
import java.util.List;

public class DistributedJoinsNPEReproducer {

    public static void main(String[] args) throws IgniteException {
        try (Ignite ignite = Ignition.start(new IgniteConfiguration())) {
            ignite.getOrCreateCache("tmp").query(new SqlFieldsQuery("CREATE TABLE IF NOT EXISTS FOO (" +
                    "  HOUR DECIMAL," +
                    "  MINUTE DECIMAL," +
                    "  DATE VARCHAR(8)," +
                    "  PART_DATE VARCHAR(8)," +
                    "  PART_KEY VARCHAR(2)," +
                    "  FILLER INTEGER," +
                    "  CONSTRAINT Foo_PK PRIMARY KEY (" +
                    "    HOUR," +
                    "    MINUTE," +
                    "    DATE," +
                    "    PART_DATE," +
                    "    PART_KEY" +
                    "  )" +
                    ") WITH \"" +
                    "  CACHE_NAME=foo," +
                    "  KEY_TYPE=FooKey," +
                    "  VALUE_TYPE=FooValue" +
                    "\"")).getAll();

            ignite.getOrCreateCache("tmp").query(new SqlFieldsQuery("INSERT INTO FOO (HOUR, MINUTE, DATE, PART_KEY, PART_DATE, FILLER) VALUES (1, 1, '20220501', '01', '20220501', 1)")).getAll();
            List<List<?>> result = ignite.getOrCreateCache("tmp").query(new SqlFieldsQuery(QUERY).setDistributedJoins(true)).getAll();

            System.out.println(result.get(0));
        }
    }

    static final String QUERY = "WITH param AS (" +
            "  SELECT CAST('20220501' AS varchar) AS pd" +
            ")" +
            "SELECT B.pd " +
            "FROM FOO, param B " +
            "WHERE part_date=B.pd " +
            "  AND date=B.pd " +
            "  AND hour >=1 " +
            "LIMIT 10";

}
{code}

Error:
{code:java}
Exception in thread "main" javax.cache.CacheException: Failed to parse query. Внутренняя ошибка: "java.lang.NullPointerException"
General error: "java.lang.NullPointerException" [50000-197]
	at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:859)
	at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:792)
	at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.query(GatewayProtectedCacheProxy.java:432)
	at org.solveme.playground.ignite.examples.DistributedJoinsNPEReproducer.main(DistributedJoinsNPEReproducer.java:37)
Caused by: class org.apache.ignite.internal.processors.query.IgniteSQLException: Failed to parse query. Внутренняя ошибка: "java.lang.NullPointerException"
General error: "java.lang.NullPointerException" [50000-197]
	at org.apache.ignite.internal.processors.query.h2.H2Connection.prepareStatementNoCache(H2Connection.java:194)
	at org.apache.ignite.internal.processors.query.h2.H2Connection.prepareStatement(H2Connection.java:141)
	at org.apache.ignite.internal.processors.query.h2.H2PooledConnection.prepareStatement(H2PooledConnection.java:86)
	at org.apache.ignite.internal.processors.query.h2.sql.GridSqlQuerySplitter.prepare(GridSqlQuerySplitter.java:1803)
	at org.apache.ignite.internal.processors.query.h2.sql.GridSqlQuerySplitter.split0(GridSqlQuerySplitter.java:303)
	at org.apache.ignite.internal.processors.query.h2.sql.GridSqlQuerySplitter.split(GridSqlQuerySplitter.java:222)
	at org.apache.ignite.internal.processors.query.h2.QueryParser.parseH2(QueryParser.java:551)
	at org.apache.ignite.internal.processors.query.h2.QueryParser.parse0(QueryParser.java:228)
	at org.apache.ignite.internal.processors.query.h2.QueryParser.parse(QueryParser.java:141)
	at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.querySqlFields(IgniteH2Indexing.java:1142)
	at org.apache.ignite.internal.processors.query.GridQueryProcessor$2.applyx(GridQueryProcessor.java:3016)
	at org.apache.ignite.internal.processors.query.GridQueryProcessor$2.applyx(GridQueryProcessor.java:2989)
	at org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36)
	at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:3661)
	at org.apache.ignite.internal.processors.query.GridQueryProcessor.lambda$querySqlFields$3(GridQueryProcessor.java:3033)
	at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuerySafe(GridQueryProcessor.java:3105)
	at org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:2983)
	at org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:2910)
	at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:844)
	... 3 more
Caused by: org.h2.jdbc.JdbcSQLException: Внутренняя ошибка: "java.lang.NullPointerException"
General error: "java.lang.NullPointerException" [50000-197]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
	at org.h2.message.DbException.get(DbException.java:168)
	at org.h2.message.DbException.convert(DbException.java:307)
	at org.h2.message.DbException.toSQLException(DbException.java:280)
	at org.h2.message.TraceObject.logAndConvert(TraceObject.java:357)
	at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:697)
	at org.apache.ignite.internal.processors.query.h2.H2Connection.prepareStatementNoCache(H2Connection.java:191)
	... 21 more
Caused by: java.lang.NullPointerException
	at org.apache.ignite.internal.processors.query.h2.opt.join.CollocationModel.calculate(CollocationModel.java:248)
	at org.apache.ignite.internal.processors.query.h2.opt.join.CollocationModel.type(CollocationModel.java:549)
	at org.apache.ignite.internal.processors.query.h2.opt.join.CollocationModel.isPartitionedTableBeforeExists(CollocationModel.java:343)
	at org.apache.ignite.internal.processors.query.h2.opt.join.CollocationModel.calculate(CollocationModel.java:295)
	at org.apache.ignite.internal.processors.query.h2.opt.join.CollocationModel.multiplier(CollocationModel.java:522)
	at org.apache.ignite.internal.processors.query.h2.opt.join.CollocationModel.distributedMultiplier(CollocationModel.java:650)
	at org.apache.ignite.internal.processors.query.h2.opt.GridH2IndexBase.getDistributedMultiplier(GridH2IndexBase.java:116)
	at org.apache.ignite.internal.processors.query.h2.opt.H2TableScanIndex.getCost(H2TableScanIndex.java:76)
	at org.h2.table.Table.getBestPlanItem(Table.java:714)
	at org.h2.table.TableFilter.getBestPlanItem(TableFilter.java:224)
	at org.h2.table.Plan.calculateCost(Plan.java:121)
	at org.h2.command.dml.Optimizer.testPlan(Optimizer.java:180)
	at org.h2.command.dml.Optimizer.calculateBruteForceAll(Optimizer.java:109)
	at org.h2.command.dml.Optimizer.calculateBestPlan(Optimizer.java:85)
	at org.h2.command.dml.Optimizer.optimize(Optimizer.java:239)
	at org.h2.command.dml.Select.preparePlan(Select.java:1018)
	at org.h2.command.dml.Select.prepare(Select.java:884)
	at org.h2.command.Parser.prepareCommand(Parser.java:283)
	at org.h2.engine.Session.prepareLocal(Session.java:611)
	at org.h2.engine.Session.prepareCommand(Session.java:549)
	at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1247)
	at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76)
	at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:694)
	... 22 more
{code}

Table definition and query may seem a bit strange and ugly but this definitely should not produce error like this. Without distributedJoins=true it works fine



--
This message was sent by Atlassian Jira
(v8.20.10#820010)