Hey,
I just checked and it doesn't seem as if any of the test cases use arrays
with more than 1 element in them.
It also gives the wrong results if I use an array with multiple values.


On Tue, 17 May 2022 at 09:56, Николай Ижиков <nizhi...@apache.org> wrote:

> Hello, Courtney.
>
> I’m able to reproduce your issue [1]
>
> Can you, please, confirm - Do you have use-case when memberIds contains
> more then one element?
> Is it return correct results?
>
> Before 2.11 SQL query with IN clause and array argument executed and
> return some results.
> But, in my reproducer results are wrong when I pass more then one element
> array.
>
> Anyway, I will continue investigation of the issue [1]
>
>         // This work as expected.        assertEquals(1, sql(
>             "SELECT IID FROM T1 WHERE ID IN (?) AND IID = ?",
>             new Object[] {Arrays.asList("1").toArray(), "1"}
>         ).size());
>
>         // And this works OK.        assertEquals(2, sql(
>             "SELECT IID FROM T1 WHERE ID IN ('1', '4') AND IID = ?",
>             new Object[] {"1"}
>         ).size());
>
>         // Executed without exception but return no results.
>
>       assertEquals(2, sql(
>             "SELECT IID FROM T1 WHERE ID IN (?) AND IID = ?",
>             new Object[] {Arrays.asList("1", "4").toArray(), "1"}).size()
>       );
>
>
> [1] https://issues.apache.org/jira/browse/IGNITE-16991
>
>
>
> 17 мая 2022 г., в 08:36, Courtney Robinson <court...@crlog.info>
> написал(а):
>
> Hey Николай,
>
> Java code:
>
> private FieldsQueryCursor<List<?>> doQuery(boolean isMutation, String sql, 
> Object... args) {
>   var timer = isMutation ? rawMutTimer : rawQryTimer;
>   return timer.record(() -> {
>     try {
>       var query = new SqlFieldsQuery(sql)
>         .setTimeout(5, SECONDS)
>         //.setDistributedJoins(true)
>         .setSchema(PUBLIC_SCHEMA_NAME);
>       if (args != null && args.length > 0) {
>         query.setArgs(args);
>       }
>       var res = cache.query(query);
>       if (isMutation) {
>         ctx.backup(sql, args);
>       }
>       return res;
>     } catch (Exception e) {
>       this.rawDBErrCntr.count();
>       if (e.getCause() instanceof CacheStoppedException) {
>         log.error("Ignite cache stopped unexpectedly. No further queries are 
> possible so must exit. Shutting down node");
>         System.exit(-1);
>       }
>       if (e instanceof DBException) {
>         throw e;
>       } else {
>         throw new DBException("Unexpected error whilst executing database 
> query", e);
>       }
>     }
>   });
> }
>
> The call that used to work is:
>
> var results = repo.query(false, "SELECT HYPI_INSTANCEID, COUNT(HYPI_ID) FROM 
> " +
>   TABLE_ACC + " WHERE HYPI_ID IN (?) AND HYPI_INSTANCEID=? GROUP BY 
> HYPI_INSTANCEID", memberIds.toArray(), instanceId);
>
>
> We had to change this to:
>
> List<Object> args = new ArrayList<>();
> String qs = memberIds.stream()
>   .peek(args::add)
>   .map(v -> "?")
>   .collect(Collectors.joining(","));
> args.add(instanceId);
> var results = repo.query(
>   false,
>   "SELECT HYPI_INSTANCEID, COUNT(HYPI_ID) FROM " +
>     TABLE_ACC + " WHERE HYPI_ID IN (" + qs + ") AND HYPI_INSTANCEID=? GROUP 
> BY HYPI_INSTANCEID",
>   args.toArray()
> );
>
>
> memberIds is a List<String>.
> repo.query is the public method that will eventually call doQuery after
> some internal stuff.
>
> The table here referred to as TABLE_ACC is
> *CREATE* *TABLE* PUBLIC.ACCOUNT (
> VERIFIED *BOOLEAN*,
> ENABLED *BOOLEAN*,
> HYPI_INSTANCEID *VARCHAR*,
> HYPI_ID *VARCHAR*,
> USERNAME *VARCHAR*,
> *CONSTRAINT* PK_PUBLIC_HYPI_01E8NPNFADNKECH7BR0K5FDE2C_ACCOUNT *PRIMARY*
> *KEY* (HYPI_INSTANCEID,HYPI_ID)
> );
>
> I removed most fields as they're not necessary to reproduce
>
>
> On Fri, 13 May 2022 at 15:24, Николай Ижиков <nizhi...@apache.org> wrote:
>
>> Hello, Courtney.
>>
>> Can, you, please, send SQL table definition and example of query (java
>> code and SQL) that worked on 2.8 and start failing on 2.13.
>>
>> > This seems like a regression, was this intentional?
>>
>> Looks like a bug to me.
>> Details of your schema and query can help in further investigation.
>>
>>
>> 10 мая 2022 г., в 10:14, Courtney Robinson <court...@crlog.info>
>> написал(а):
>>
>> Hi all,
>>
>> We're looking to do a major upgrade from 2.8.0 to 2.13.0
>> After the initial upgrade our test suite started failing (about 15% of
>> tests now fail).
>> No other change has been made other than the Ignite version number.
>>
>> org.apache.ignite.internal.processors.query.IgniteSQLException: General
>>> error: "class org.apache.ignite.IgniteException: Failed to wrap
>>> value[type=17, value=[Ljava.lang.Object;@667eb78]"; SQL statement:
>>> SELECT HYPI_INSTANCEID, COUNT(HYPI_ID) FROM
>>> hypi_01E8NPNFADNKECH7BR0K5FDE2C_Account WHERE HYPI_ID IN (?) AND
>>> HYPI_INSTANCEID=? GROUP BY HYPI_INSTANCEID [50000-197]
>>> at
>>> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.executeSqlQuery(IgniteH2Indexing.java:898)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.executeSqlQueryWithTimer(IgniteH2Indexing.java:985)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.onQueryRequest0(GridMapQueryExecutor.java:471)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.onQueryRequest(GridMapQueryExecutor.java:284)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.onMessage(IgniteH2Indexing.java:2219)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor$1.applyx(GridReduceQueryExecutor.java:157)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor$1.applyx(GridReduceQueryExecutor.java:152)
>>> at
>>> org.apache.ignite.internal.util.lang.IgniteInClosure2X.apply(IgniteInClosure2X.java:38)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.send(IgniteH2Indexing.java:2344)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.send(GridReduceQueryExecutor.java:1201)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.query(GridReduceQueryExecutor.java:463)
>>> at
>>> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$7.iterator(IgniteH2Indexing.java:1846)
>>> at
>>> org.apache.ignite.internal.processors.cache.QueryCursorImpl.iter(QueryCursorImpl.java:102)
>>> at
>>> org.apache.ignite.internal.processors.cache.query.RegisteredQueryCursor.iter(RegisteredQueryCursor.java:91)
>>> at
>>> org.apache.ignite.internal.processors.cache.QueryCursorImpl.getAll(QueryCursorImpl.java:124)
>>>
>>
>> Investigating this I found that IndexKeyFactory has since been added in a
>> release after 2.8.0.
>> It is the source of the exception
>>
>>> throw new IgniteException("Failed to wrap value[type=" + keyType + ",
>>> value=" + o + "]");
>>>
>>
>> The key type 17 is ARRAY, defined in `org.h2.value.Value` (ARRAY enum
>> value line 137)
>> Looking further I can see that IndexKeyFactory registers:
>>
>>> IndexKeyFactory.register(IndexKeyTypes.DATE, DateIndexKey::new);
>>> IndexKeyFactory.register(IndexKeyTypes.TIME, TimeIndexKey::new);
>>> IndexKeyFactory.register(IndexKeyTypes.TIMESTAMP,
>>> TimestampIndexKey::new);--
>>
>>
>> And these are the only additional key types registered anywhere in the
>> 2.13.0 code base.
>>
>> Looking further, I found that the problem is wherever we use the `IN`
>> clause
>> In 2.8.0 we had a query like this:
>>
>>> DELETE FROM permission_cause WHERE instanceId = ? AND policyId = ? AND
>>> rowId IN (?) AND accountId = ?
>>
>> And we would pass in a Java array as the 3rd argument
>>
>>> instanceId, policyId, toDelete.toArray(), accountId
>>
>>
>> This would work fine with the toDelete.toArray()
>> Now, we have to change it and expand from IN(?) to IN(?,?,?) putting in
>> as many ? as there are entries in the array and pass in the values
>> individually.
>>
>> This seems like a regression, was this intentional?
>>
>> Best,
>> Courtney
>>
>>
>>
>
> --
> Courtney Robinson
> court...@crlog.info
> http://zcourts.com
> 020 3287 0961
>
>
>

-- 
Courtney Robinson
court...@crlog.info
http://zcourts.com
020 3287 0961

Reply via email to