[ 
https://issues.apache.org/jira/browse/IGNITE-21836?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Maksim Zhuravkov updated IGNITE-21836:
--------------------------------------
    Description: 
GetNullable method of KeyValueView produces confusing error for a PoJo when a 
field is primitive but underlying column is nullable:
{code:java}
at 
org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalNullableValue(KeyValueViewImpl.java:638)
  at 
org.apache.ignite.internal.table.KeyValueViewImpl.lambda$getNullableAsync$5(KeyValueViewImpl.java:146)
       at 
java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:684)
     at 
java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:662)
   at 
java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2200)
      at 
org.apache.ignite.internal.table.KeyValueViewImpl.lambda$getNullableAsync$6(KeyValueViewImpl.java:146)
       at 
org.apache.ignite.internal.table.AbstractTableView.lambda$withSchemaSync$1(AbstractTableView.java:181)
       at 
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
        at 
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341)
    at 
org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:181)
        at 
org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:172)
        at 
org.apache.ignite.internal.table.AbstractTableView.doOperation(AbstractTableView.java:148)
   at 
org.apache.ignite.internal.table.KeyValueViewImpl.getNullableAsync(KeyValueViewImpl.java:142)
        at 
org.apache.ignite.internal.table.KeyValueViewImpl.lambda$getNullable$4(KeyValueViewImpl.java:134)
    at 
org.apache.ignite.internal.table.AbstractTableView.sync(AbstractTableView.java:125)
  at 
org.apache.ignite.internal.table.KeyValueViewImpl.getNullable(KeyValueViewImpl.java:134)
     at 
org.apache.ignite.internal.sql.api.ItKvViewsTest.testNotNullableGetSimple(ItKvViewsTest.java:202)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)   at 
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
  at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722)
     at 
java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
        at 
java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
  at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024)
   at 
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) 
     at 
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
       at 
java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
      at 
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at 
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
     at 
java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
     at 
java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
  at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  at 
java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
     at 
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) 
     at 
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
       at 
java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
      at 
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at 
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
     at 
java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
     at 
java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
  at 
java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
     at 
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) 
     at 
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
       at 
java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
      at 
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at 
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
     at 
java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
     at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)   at 
java.base/java.util.ArrayList.forEach(ArrayList.java:1596)Caused by: 
org.apache.ignite.internal.marshaller.MarshallerException: IGN-CMN-65535 
TraceId:93597482-0b87-4eac-8520-847d314e4100 Failed to read field [id=0]       
at 
org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:439)
     at 
org.apache.ignite.internal.marshaller.Marshaller$PojoMarshaller.readValue(Marshaller.java:350)
       at 
org.apache.ignite.internal.schema.marshaller.reflection.KvMarshallerImpl.unmarshalValue(KvMarshallerImpl.java:138)
   at 
org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalNullableValue(KeyValueViewImpl.java:636)
  ... 61 moreCaused by: 
org.apache.ignite.internal.binarytuple.BinaryTupleFormatException: 
IGN-CMN-65535 TraceId:93597482-0b87-4eac-8520-847d314e4100 Invalid length for a 
tuple element: 0       at 
org.apache.ignite.internal.binarytuple.BinaryTupleParser.booleanValue(BinaryTupleParser.java:175)
    at 
org.apache.ignite.internal.binarytuple.BinaryTupleReader.booleanValue(BinaryTupleReader.java:91)
     at 
org.apache.ignite.internal.schema.marshaller.reflection.RowReader.readBoolean(RowReader.java:67)
     at 
org.apache.ignite.internal.marshaller.FieldAccessor$BooleanPrimitiveAccessor.read0(FieldAccessor.java:607)
   at 
org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:437)
     ... 64 more {code}

  was:
GetNullable method of KeyValueView always returns an error when reads a PoJo 
with primitive fields, because instead of a value, it reads 0 length.

Fix unmarshalling of java objects with primitve fields, so that getNullable 
method does not return an error.



> KeyValueView. GetNullable produces confusing error for a PoJo with primitive 
> fields when column is nullable
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-21836
>                 URL: https://issues.apache.org/jira/browse/IGNITE-21836
>             Project: Ignite
>          Issue Type: Bug
>          Components: sql
>            Reporter: Maksim Zhuravkov
>            Priority: Major
>              Labels: ignite-3
>
> GetNullable method of KeyValueView produces confusing error for a PoJo when a 
> field is primitive but underlying column is nullable:
> {code:java}
> at 
> org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalNullableValue(KeyValueViewImpl.java:638)
>         at 
> org.apache.ignite.internal.table.KeyValueViewImpl.lambda$getNullableAsync$5(KeyValueViewImpl.java:146)
>        at 
> java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:684)
>      at 
> java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:662)
>    at 
> java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2200)
>       at 
> org.apache.ignite.internal.table.KeyValueViewImpl.lambda$getNullableAsync$6(KeyValueViewImpl.java:146)
>        at 
> org.apache.ignite.internal.table.AbstractTableView.lambda$withSchemaSync$1(AbstractTableView.java:181)
>        at 
> java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
>         at 
> java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341)
>     at 
> org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:181)
>         at 
> org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:172)
>         at 
> org.apache.ignite.internal.table.AbstractTableView.doOperation(AbstractTableView.java:148)
>    at 
> org.apache.ignite.internal.table.KeyValueViewImpl.getNullableAsync(KeyValueViewImpl.java:142)
>         at 
> org.apache.ignite.internal.table.KeyValueViewImpl.lambda$getNullable$4(KeyValueViewImpl.java:134)
>     at 
> org.apache.ignite.internal.table.AbstractTableView.sync(AbstractTableView.java:125)
>   at 
> org.apache.ignite.internal.table.KeyValueViewImpl.getNullable(KeyValueViewImpl.java:134)
>      at 
> org.apache.ignite.internal.sql.api.ItKvViewsTest.testNotNullableGetSimple(ItKvViewsTest.java:202)
>     at java.base/java.lang.reflect.Method.invoke(Method.java:580)   at 
> java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
>     at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
>   at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
>     at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
>     at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722)
>      at 
> java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
>         at 
> java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
>   at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024)
>    at 
> java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
>       at 
> java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
>        at 
> java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
>       at 
> java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
>         at 
> java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>       at 
> java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
>      at 
> java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
>   at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
>   at 
> java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
>      at 
> java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
>       at 
> java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
>        at 
> java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
>       at 
> java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
>         at 
> java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>       at 
> java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
>      at 
> java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
>   at 
> java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
>      at 
> java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
>       at 
> java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
>        at 
> java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
>       at 
> java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
>         at 
> java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>       at 
> java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
>      at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)   at 
> java.base/java.util.ArrayList.forEach(ArrayList.java:1596)Caused by: 
> org.apache.ignite.internal.marshaller.MarshallerException: IGN-CMN-65535 
> TraceId:93597482-0b87-4eac-8520-847d314e4100 Failed to read field [id=0]      
>  at 
> org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:439)
>      at 
> org.apache.ignite.internal.marshaller.Marshaller$PojoMarshaller.readValue(Marshaller.java:350)
>        at 
> org.apache.ignite.internal.schema.marshaller.reflection.KvMarshallerImpl.unmarshalValue(KvMarshallerImpl.java:138)
>    at 
> org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalNullableValue(KeyValueViewImpl.java:636)
>   ... 61 moreCaused by: 
> org.apache.ignite.internal.binarytuple.BinaryTupleFormatException: 
> IGN-CMN-65535 TraceId:93597482-0b87-4eac-8520-847d314e4100 Invalid length for 
> a tuple element: 0       at 
> org.apache.ignite.internal.binarytuple.BinaryTupleParser.booleanValue(BinaryTupleParser.java:175)
>     at 
> org.apache.ignite.internal.binarytuple.BinaryTupleReader.booleanValue(BinaryTupleReader.java:91)
>      at 
> org.apache.ignite.internal.schema.marshaller.reflection.RowReader.readBoolean(RowReader.java:67)
>      at 
> org.apache.ignite.internal.marshaller.FieldAccessor$BooleanPrimitiveAccessor.read0(FieldAccessor.java:607)
>    at 
> org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:437)
>      ... 64 more {code}



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

Reply via email to