[ 
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)

Reply via email to