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)

Reply via email to