[ https://issues.apache.org/jira/browse/IGNITE-24898?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Maksim Zhuravkov updated IGNITE-24898: -------------------------------------- Description: Reproducer (both thin client and embedded clients are affected). {code:java} // Table VARCHAR, Pojo bigift public static class Kv { private long val; public long getVal() { return val; } public void setVal(long val) { this.val = val; } } @Test public void test() { sql("CREATE TABLE t (k int, val varchar, primary key (k))"); sql("INSERT INTO t VALUES (1, 'abcd')"); TypeConverter<Object, Object> converter = new TypeConverter<>() { @Override public Object toColumnType(Object obj) throws Exception { return obj; } @Override public Object toObjectType(Object data) throws Exception { return data; } }; Table table = client.tables().table("T"); Mapper<Kv> val = Mapper.builder(Kv.class).map("val", "val", converter).build(); KeyValueView<Integer, Kv> v = table.keyValueView(Mapper.of(Integer.class), val); Kv kv = v.get(null, 1); assertEquals(1684234849L, kv.val); } {code} When a value stored in the varchar column does not fit INT64, we get an error (Invalid length for a tuple element: 7). If we flip types (Table BIGINT, Pojo STRING) there is a class cast exception instead: {code:java} public static class Kvs { private String val; public String getVal() { return val; } public void setVal(String val) { this.val = val; } } @Test public void test2() { sql("CREATE TABLE t (k int, val bigint, primary key (k))"); sql("INSERT INTO t VALUES (1, 1684234849)"); TypeConverter<Object, Object> converter = new TypeConverter<>() { @Override public Object toColumnType(Object obj) throws Exception { return obj; } @Override public Object toObjectType(Object data) throws Exception { return data; } }; Table table = CLUSTER.node(0).tables().table("T"); Mapper<Kvs> val = Mapper.builder(Kvs.class).map("val", "val", converter).build(); KeyValueView<Integer, Kvs> v = table.keyValueView(Mapper.of(Integer.class), val); Kvs kv = v.get(null, 1); assertEquals("abcd", kv.val); } {code} Error: {noformat} Caused by: org.apache.ignite.lang.MarshallerException: IGN-MARSHALLING-1 TraceId:e688f43a-24ac-497b-b448-c4b8af1e9e1c java.lang.ClassCastException: Cannot cast java.lang.Long to java.lang.String at org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:404) at org.apache.ignite.internal.marshaller.Marshaller$PojoMarshaller.readObject(Marshaller.java:284) at org.apache.ignite.internal.schema.marshaller.reflection.KvMarshallerImpl.unmarshalValue(KvMarshallerImpl.java:148) at org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalNullableValue(KeyValueViewImpl.java:739) at org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalValue(KeyValueViewImpl.java:782) at org.apache.ignite.internal.table.KeyValueViewImpl.lambda$doGet$1(KeyValueViewImpl.java:138) 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:2168) at org.apache.ignite.internal.table.KeyValueViewImpl.lambda$doGet$2(KeyValueViewImpl.java:138) at org.apache.ignite.internal.table.AbstractTableView.lambda$withSchemaSync$1(AbstractTableView.java:144) at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309) at org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:144) at org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:134) at org.apache.ignite.internal.table.AbstractTableView.doOperation(AbstractTableView.java:112) at org.apache.ignite.internal.table.KeyValueViewImpl.doGet(KeyValueViewImpl.java:135) ... 15 more Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException: Cannot cast java.lang.Long to java.lang.String at org.apache.ignite.internal.marshaller.FieldAccessor$ReferenceFieldAccessor.read0(FieldAccessor.java:799) at org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:402) ... 31 more Caused by: java.lang.ClassCastException: Cannot cast java.lang.Long to java.lang.String at java.base/java.lang.Class.cast(Class.java:3889) at java.base/java.lang.invoke.VarHandleReferences$FieldInstanceReadWrite.set(VarHandleReferences.java:150) at org.apache.ignite.internal.marshaller.FieldAccessor$VarHandleAccessor.set(FieldAccessor.java:535) at org.apache.ignite.internal.marshaller.FieldAccessor$ReferenceFieldAccessor.read0(FieldAccessor.java:797) {noformat} was: Reproducer (both thin client and embedded clients are affected). {code:java} // Table VARCHAR, Pojo bigift public static class Kv { private long val; public long getVal() { return val; } public void setVal(long val) { this.val = val; } } @Test public void ddd() { sql("CREATE TABLE t (k int, val varchar, primary key (k))"); sql("INSERT INTO t VALUES (1, 'abcd')"); TypeConverter<Object, Object> converter = new TypeConverter<>() { @Override public Object toColumnType(Object obj) throws Exception { return obj; } @Override public Object toObjectType(Object data) throws Exception { return data; } }; Table table = client.tables().table("T"); Mapper<Kv> val = Mapper.builder(Kv.class).map("val", "val", converter).build(); KeyValueView<Integer, Kv> v = table.keyValueView(Mapper.of(Integer.class), val); Kv kv = v.get(null, 1); assertEquals(1684234849L, kv.val); } {code} When a value stored in the varchar column does not fit INT64, we get an error (Invalid length for a tuple element: 7). If we flip types (Table BIGINT, Pojo STRING) there is a class cast exception instead: {code:java} public static class Kvs { private String val; public String getVal() { return val; } public void setVal(String val) { this.val = val; } } @Test public void ddd2() { sql("CREATE TABLE t (k int, val bigint, primary key (k))"); sql("INSERT INTO t VALUES (1, 1684234849)"); TypeConverter<Object, Object> converter = new TypeConverter<>() { @Override public Object toColumnType(Object obj) throws Exception { return obj; } @Override public Object toObjectType(Object data) throws Exception { return data; } }; Table table = CLUSTER.node(0).tables().table("T"); Mapper<Kvs> val = Mapper.builder(Kvs.class).map("val", "val", converter).build(); KeyValueView<Integer, Kvs> v = table.keyValueView(Mapper.of(Integer.class), val); Kvs kv = v.get(null, 1); assertEquals("abcd", kv.val); } {code} Error: {noformat} Caused by: org.apache.ignite.lang.MarshallerException: IGN-MARSHALLING-1 TraceId:e688f43a-24ac-497b-b448-c4b8af1e9e1c java.lang.ClassCastException: Cannot cast java.lang.Long to java.lang.String at org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:404) at org.apache.ignite.internal.marshaller.Marshaller$PojoMarshaller.readObject(Marshaller.java:284) at org.apache.ignite.internal.schema.marshaller.reflection.KvMarshallerImpl.unmarshalValue(KvMarshallerImpl.java:148) at org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalNullableValue(KeyValueViewImpl.java:739) at org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalValue(KeyValueViewImpl.java:782) at org.apache.ignite.internal.table.KeyValueViewImpl.lambda$doGet$1(KeyValueViewImpl.java:138) 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:2168) at org.apache.ignite.internal.table.KeyValueViewImpl.lambda$doGet$2(KeyValueViewImpl.java:138) at org.apache.ignite.internal.table.AbstractTableView.lambda$withSchemaSync$1(AbstractTableView.java:144) at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309) at org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:144) at org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:134) at org.apache.ignite.internal.table.AbstractTableView.doOperation(AbstractTableView.java:112) at org.apache.ignite.internal.table.KeyValueViewImpl.doGet(KeyValueViewImpl.java:135) ... 15 more Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException: Cannot cast java.lang.Long to java.lang.String at org.apache.ignite.internal.marshaller.FieldAccessor$ReferenceFieldAccessor.read0(FieldAccessor.java:799) at org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:402) ... 31 more Caused by: java.lang.ClassCastException: Cannot cast java.lang.Long to java.lang.String at java.base/java.lang.Class.cast(Class.java:3889) at java.base/java.lang.invoke.VarHandleReferences$FieldInstanceReadWrite.set(VarHandleReferences.java:150) at org.apache.ignite.internal.marshaller.FieldAccessor$VarHandleAccessor.set(FieldAccessor.java:535) at org.apache.ignite.internal.marshaller.FieldAccessor$ReferenceFieldAccessor.read0(FieldAccessor.java:797) {noformat} > KeyValueView Mapper. No type mismatch when TypeConverter is present > ------------------------------------------------------------------- > > Key: IGNITE-24898 > URL: https://issues.apache.org/jira/browse/IGNITE-24898 > Project: Ignite > Issue Type: Improvement > Reporter: Maksim Zhuravkov > Priority: Major > Labels: ignite-3 > > Reproducer (both thin client and embedded clients are affected). > {code:java} > // Table VARCHAR, Pojo bigift > public static class Kv { > private long val; > public long getVal() { > return val; > } > public void setVal(long val) { > this.val = val; > } > } > @Test > public void test() { > sql("CREATE TABLE t (k int, val varchar, primary key (k))"); > sql("INSERT INTO t VALUES (1, 'abcd')"); > TypeConverter<Object, Object> converter = new TypeConverter<>() { > @Override > public Object toColumnType(Object obj) throws Exception { > return obj; > } > @Override > public Object toObjectType(Object data) throws Exception { > return data; > } > }; > Table table = client.tables().table("T"); > Mapper<Kv> val = Mapper.builder(Kv.class).map("val", "val", > converter).build(); > KeyValueView<Integer, Kv> v = > table.keyValueView(Mapper.of(Integer.class), val); > Kv kv = v.get(null, 1); > assertEquals(1684234849L, kv.val); > } > {code} > When a value stored in the varchar column does not fit INT64, we get an error > (Invalid length for a tuple element: 7). > If we flip types (Table BIGINT, Pojo STRING) there is a class cast exception > instead: > {code:java} > public static class Kvs { > private String val; > public String getVal() { > return val; > } > public void setVal(String val) { > this.val = val; > } > } > @Test > public void test2() { > sql("CREATE TABLE t (k int, val bigint, primary key (k))"); > sql("INSERT INTO t VALUES (1, 1684234849)"); > TypeConverter<Object, Object> converter = new TypeConverter<>() { > @Override > public Object toColumnType(Object obj) throws Exception { > return obj; > } > @Override > public Object toObjectType(Object data) throws Exception { > return data; > } > }; > Table table = CLUSTER.node(0).tables().table("T"); > Mapper<Kvs> val = Mapper.builder(Kvs.class).map("val", "val", > converter).build(); > KeyValueView<Integer, Kvs> v = > table.keyValueView(Mapper.of(Integer.class), val); > Kvs kv = v.get(null, 1); > assertEquals("abcd", kv.val); > } > {code} > Error: > {noformat} > Caused by: org.apache.ignite.lang.MarshallerException: IGN-MARSHALLING-1 > TraceId:e688f43a-24ac-497b-b448-c4b8af1e9e1c java.lang.ClassCastException: > Cannot cast java.lang.Long to java.lang.String > at > org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:404) > at > org.apache.ignite.internal.marshaller.Marshaller$PojoMarshaller.readObject(Marshaller.java:284) > at > org.apache.ignite.internal.schema.marshaller.reflection.KvMarshallerImpl.unmarshalValue(KvMarshallerImpl.java:148) > at > org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalNullableValue(KeyValueViewImpl.java:739) > at > org.apache.ignite.internal.table.KeyValueViewImpl.unmarshalValue(KeyValueViewImpl.java:782) > at > org.apache.ignite.internal.table.KeyValueViewImpl.lambda$doGet$1(KeyValueViewImpl.java:138) > 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:2168) > at > org.apache.ignite.internal.table.KeyValueViewImpl.lambda$doGet$2(KeyValueViewImpl.java:138) > at > org.apache.ignite.internal.table.AbstractTableView.lambda$withSchemaSync$1(AbstractTableView.java:144) > at > java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) > at > java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309) > at > org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:144) > at > org.apache.ignite.internal.table.AbstractTableView.withSchemaSync(AbstractTableView.java:134) > at > org.apache.ignite.internal.table.AbstractTableView.doOperation(AbstractTableView.java:112) > at > org.apache.ignite.internal.table.KeyValueViewImpl.doGet(KeyValueViewImpl.java:135) > ... 15 more > Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException: > Cannot cast java.lang.Long to java.lang.String > at > org.apache.ignite.internal.marshaller.FieldAccessor$ReferenceFieldAccessor.read0(FieldAccessor.java:799) > at > org.apache.ignite.internal.marshaller.FieldAccessor.read(FieldAccessor.java:402) > ... 31 more > Caused by: java.lang.ClassCastException: Cannot cast java.lang.Long to > java.lang.String > at java.base/java.lang.Class.cast(Class.java:3889) > at > java.base/java.lang.invoke.VarHandleReferences$FieldInstanceReadWrite.set(VarHandleReferences.java:150) > at > org.apache.ignite.internal.marshaller.FieldAccessor$VarHandleAccessor.set(FieldAccessor.java:535) > at > org.apache.ignite.internal.marshaller.FieldAccessor$ReferenceFieldAccessor.read0(FieldAccessor.java:797) > {noformat} -- This message was sent by Atlassian Jira (v8.20.10#820010)