Igor Sapego created IGNITE-4409:
-----------------------------------

             Summary: UUID fields of the key class deserialized in a wrong way 
on INSERT.
                 Key: IGNITE-4409
                 URL: https://issues.apache.org/jira/browse/IGNITE-4409
             Project: Ignite
          Issue Type: Bug
    Affects Versions: 1.8
            Reporter: Igor Sapego
             Fix For: 2.0


Consider the following case. There is a class which is used as Key on C++ side. 
It contains 3 fields: String, Timestamp and UUID. There is also a value of the 
type Integer. Record of the cache is being inserted with {{SqlFieldsQuery}}:
{noformat}
INSERT INTO Integer (str, ts, guid, _val) VALUES (?, ?, ?, ?)
{noformat}

String, Timestamp and Integer values serialized and desirialized just fine, but 
UUID value is passed further just like byte array of 17 bytes, first of which 
is 10 (UUID type header in  Binary format), so later it gets converted here:
{noformat}
"main@1" prio=5 tid=0x1 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
      at org.h2.value.ValueUuid.get(ValueUuid.java:68)
      at org.h2.value.Value.convertTo(Value.java:861)
      at 
org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.convert(DmlStatementsProcessor.java:637)
      at 
org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.rowToKeyValue(DmlStatementsProcessor.java:868)
      at 
org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.doInsert(DmlStatementsProcessor.java:745)
      at 
org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.executeUpdateStatement(DmlStatementsProcessor.java:286)
      at 
org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updateSqlFields(DmlStatementsProcessor.java:159)
      at 
org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updateSqlFieldsTwoStep(DmlStatementsProcessor.java:189)
      at 
org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryTwoStep(IgniteH2Indexing.java:1266)
      at 
org.apache.ignite.internal.processors.query.GridQueryProcessor$4.applyx(GridQueryProcessor.java:812)
      at 
org.apache.ignite.internal.processors.query.GridQueryProcessor$4.applyx(GridQueryProcessor.java:810)
      at 
org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36)
      at 
org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:1777)
      at 
org.apache.ignite.internal.processors.query.GridQueryProcessor.queryTwoStep(GridQueryProcessor.java:810)
      at 
org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:749)
      at 
org.apache.ignite.internal.processors.platform.cache.PlatformCache.runFieldsQuery(PlatformCache.java:1205)
      at 
org.apache.ignite.internal.processors.platform.cache.PlatformCache.processInStreamOutObject(PlatformCache.java:837)
      at 
org.apache.ignite.internal.processors.platform.PlatformAbstractTarget.inStreamOutObject(PlatformAbstractTarget.java:90)
{noformat}

Obviously enough, it gets deserialized wrong because of the header byte and as 
a result, we get wrong key instance in the cache.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to