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

Maksim Zhuravkov updated IGNITE-27729:
--------------------------------------
    Description: 
Apache Ignite incorrectly converts 'i' character when locale tr_TR is used (it 
converts 'i' to 'İ' instead of 'I'. This issue is most likely caused by calls 
to `toUpperCase` w/o proper locale parameters inside the `IgniteNameUtils`.

Reproducer with a key value view:

{noformat}
import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.sql.IgniteSql;
import org.apache.ignite.table.KeyValueView;
import org.apache.ignite.table.Table;
import org.apache.ignite.table.Tuple;

import java.util.Locale;
import java.util.Map;

public class LocalProblem {

    public static void main(String[] args) throws Exception {
        Locale.setDefault(new Locale("tr", "TR")); // Remove this or set to non 
Turkish locale and everything works.
        
        try (var client = IgniteClient.builder()
                .addresses("localhost:10801")
                .build()
        ) {
            IgniteSql sql = client.sql();

            try (var rs = sql.execute(null, "DROP TABLE IF EXISTS kv")) {
                System.err.println(rs.affectedRows());
            }

            try (var rs = sql.execute(null, "CREATE TABLE kv (key INT, val INT, 
iloc VARCHAR, PRIMARY KEY (key) )")) {
                System.err.println(rs.affectedRows());
            }

            // Insert
            try (var rs = sql.execute(null, "INSERT INTO kv VALUES(1, 1, 
'0:1')")) {
                System.err.println(rs.affectedRows());
            }
            
            Table table = client.tables().table("kv");

            KeyValueView<Tuple, Tuple> view = table.keyValueView();
            Tuple key = Tuple.create(Map.of("key", 2));
            Tuple value = Tuple.create(Map.of("val", 2, "iloc", "0:1"));
            
            view.put(null, key, value);
        }
    }
}
{noformat}

Error:

{noformat}
Şub 03, 2026 6:08:31 ÖS org.apache.ignite.internal.logger.IgniteLoggerImpl warn
WARNING: Failed to send request sync [id=8, op=10, 
remoteAddress=localhost:10801]: Failed to serialize tuple for table PUBLIC.KV: 
Value tuple doesn't match schema: schemaVersion=1, extraColumns=[İLOC]
org.apache.ignite.lang.MarshallerException: IGN-MARSHALLING-1 Failed to 
serialize tuple for table PUBLIC.KV: Value tuple doesn't match schema: 
schemaVersion=1, extraColumns=[İLOC] TraceId:4b2ced51
        at 
org.apache.ignite.internal.client.table.ClientTupleSerializer.throwSchemaMismatchException(ClientTupleSerializer.java:563)
        at 
org.apache.ignite.internal.client.table.ClientTupleSerializer.writeKvTuple(ClientTupleSerializer.java:258)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.lambda$putAsync$16(ClientKeyValueBinaryView.java:249)
        at 
org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$7(ClientTable.java:682)
        at 
org.apache.ignite.internal.client.TcpClientChannel.send(TcpClientChannel.java:392)
        at 
org.apache.ignite.internal.client.TcpClientChannel.serviceAsync(TcpClientChannel.java:347)
        at 
org.apache.ignite.internal.client.ReliableChannel.serviceAsyncInternal(ReliableChannel.java:386)
        at 
org.apache.ignite.internal.client.ReliableChannel.lambda$serviceAsync$4(ReliableChannel.java:322)
        at 
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at 
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
        at 
org.apache.ignite.internal.client.ReliableChannel.lambda$serviceAsync$5(ReliableChannel.java:322)
        at 
org.apache.ignite.internal.client.ClientFutureUtils.doWithRetryAsync(ClientFutureUtils.java:46)
        at 
org.apache.ignite.internal.client.ClientFutureUtils.doWithRetryAsync(ClientFutureUtils.java:36)
        at 
org.apache.ignite.internal.client.ReliableChannel.serviceAsync(ReliableChannel.java:320)
        at 
org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$15(ClientTable.java:680)
        at 
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at 
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
        at 
org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$16(ClientTable.java:679)
        at 
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at 
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
        at 
org.apache.ignite.internal.client.table.ClientTable.doSchemaOutInOpAsync(ClientTable.java:656)
        at 
org.apache.ignite.internal.client.table.ClientTable.doSchemaOutOpAsync(ClientTable.java:521)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.putAsync(ClientKeyValueBinaryView.java:247)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.put(ClientKeyValueBinaryView.java:238)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.put(ClientKeyValueBinaryView.java:69)
        at 
org.apache.ignite.internal.client.table.api.PublicApiClientKeyValueView.lambda$put$12(PublicApiClientKeyValueView.java:108)
        at 
org.apache.ignite.internal.thread.PublicApiThreading.lambda$execUserSyncOperation$1(PublicApiThreading.java:108)
        at 
org.apache.ignite.internal.thread.PublicApiThreading.executeWithRole(PublicApiThreading.java:136)
        at 
org.apache.ignite.internal.thread.PublicApiThreading.execUserSyncOperation(PublicApiThreading.java:94)
        at 
org.apache.ignite.internal.thread.PublicApiThreading.execUserSyncOperation(PublicApiThreading.java:107)
        at 
org.apache.ignite.internal.client.table.api.PublicApiClientViewBase.executeSyncOp(PublicApiClientViewBase.java:97)
        at 
org.apache.ignite.internal.client.table.api.PublicApiClientKeyValueView.put(PublicApiClientKeyValueView.java:108)
        at 
org.apache.ignite.internal.table.CloseableKeyValueView.put(CloseableKeyValueView.java:152)
        at LocalProblem.main(LocalProblem.java:40)
Caused by: org.apache.ignite.internal.marshaller.UnmappedColumnsException
        ... 34 more
{noformat}



  was:
Apache Ignite incorrectly converts 'i' character when locale tr_TR is used (it 
converts 'i' to 'İ' instead of 'I'. This issue is most likely caused by calls 
to `toUpperCase` w/o proper locale parameters inside the `IgniteNameUtils`.

Reproducer with a key value view:

{noformat}
import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.sql.IgniteSql;
import org.apache.ignite.table.KeyValueView;
import org.apache.ignite.table.Table;
import org.apache.ignite.table.Tuple;

import java.util.Locale;
import java.util.Map;

public class LocalProblem {

    public static void main(String[] args) throws Exception {
        Locale.setDefault(new Locale("tr", "TR"));
        
        try (var client = IgniteClient.builder()
                .addresses("localhost:10801")
                .build()
        ) {
            IgniteSql sql = client.sql();

            try (var rs = sql.execute(null, "DROP TABLE IF EXISTS kv")) {
                System.err.println(rs.affectedRows());
            }

            try (var rs = sql.execute(null, "CREATE TABLE kv (key INT, val INT, 
iloc VARCHAR, PRIMARY KEY (key) )")) {
                System.err.println(rs.affectedRows());
            }

            // Insert
            try (var rs = sql.execute(null, "INSERT INTO kv VALUES(1, 1, 
'0:1')")) {
                System.err.println(rs.affectedRows());
            }
            
            Table table = client.tables().table("kv");

            KeyValueView<Tuple, Tuple> view = table.keyValueView();
            Tuple key = Tuple.create(Map.of("key", 2));
            Tuple value = Tuple.create(Map.of("val", 2, "iloc", "0:1"));
            
            view.put(null, key, value);
        }
    }
}
{noformat}

Error:

{noformat}
Şub 03, 2026 6:08:31 ÖS org.apache.ignite.internal.logger.IgniteLoggerImpl warn
WARNING: Failed to send request sync [id=8, op=10, 
remoteAddress=localhost:10801]: Failed to serialize tuple for table PUBLIC.KV: 
Value tuple doesn't match schema: schemaVersion=1, extraColumns=[İLOC]
org.apache.ignite.lang.MarshallerException: IGN-MARSHALLING-1 Failed to 
serialize tuple for table PUBLIC.KV: Value tuple doesn't match schema: 
schemaVersion=1, extraColumns=[İLOC] TraceId:4b2ced51
        at 
org.apache.ignite.internal.client.table.ClientTupleSerializer.throwSchemaMismatchException(ClientTupleSerializer.java:563)
        at 
org.apache.ignite.internal.client.table.ClientTupleSerializer.writeKvTuple(ClientTupleSerializer.java:258)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.lambda$putAsync$16(ClientKeyValueBinaryView.java:249)
        at 
org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$7(ClientTable.java:682)
        at 
org.apache.ignite.internal.client.TcpClientChannel.send(TcpClientChannel.java:392)
        at 
org.apache.ignite.internal.client.TcpClientChannel.serviceAsync(TcpClientChannel.java:347)
        at 
org.apache.ignite.internal.client.ReliableChannel.serviceAsyncInternal(ReliableChannel.java:386)
        at 
org.apache.ignite.internal.client.ReliableChannel.lambda$serviceAsync$4(ReliableChannel.java:322)
        at 
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at 
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
        at 
org.apache.ignite.internal.client.ReliableChannel.lambda$serviceAsync$5(ReliableChannel.java:322)
        at 
org.apache.ignite.internal.client.ClientFutureUtils.doWithRetryAsync(ClientFutureUtils.java:46)
        at 
org.apache.ignite.internal.client.ClientFutureUtils.doWithRetryAsync(ClientFutureUtils.java:36)
        at 
org.apache.ignite.internal.client.ReliableChannel.serviceAsync(ReliableChannel.java:320)
        at 
org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$15(ClientTable.java:680)
        at 
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at 
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
        at 
org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$16(ClientTable.java:679)
        at 
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at 
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
        at 
org.apache.ignite.internal.client.table.ClientTable.doSchemaOutInOpAsync(ClientTable.java:656)
        at 
org.apache.ignite.internal.client.table.ClientTable.doSchemaOutOpAsync(ClientTable.java:521)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.putAsync(ClientKeyValueBinaryView.java:247)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.put(ClientKeyValueBinaryView.java:238)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.put(ClientKeyValueBinaryView.java:69)
        at 
org.apache.ignite.internal.client.table.api.PublicApiClientKeyValueView.lambda$put$12(PublicApiClientKeyValueView.java:108)
        at 
org.apache.ignite.internal.thread.PublicApiThreading.lambda$execUserSyncOperation$1(PublicApiThreading.java:108)
        at 
org.apache.ignite.internal.thread.PublicApiThreading.executeWithRole(PublicApiThreading.java:136)
        at 
org.apache.ignite.internal.thread.PublicApiThreading.execUserSyncOperation(PublicApiThreading.java:94)
        at 
org.apache.ignite.internal.thread.PublicApiThreading.execUserSyncOperation(PublicApiThreading.java:107)
        at 
org.apache.ignite.internal.client.table.api.PublicApiClientViewBase.executeSyncOp(PublicApiClientViewBase.java:97)
        at 
org.apache.ignite.internal.client.table.api.PublicApiClientKeyValueView.put(PublicApiClientKeyValueView.java:108)
        at 
org.apache.ignite.internal.table.CloseableKeyValueView.put(CloseableKeyValueView.java:152)
        at LocalProblem.main(LocalProblem.java:40)
Caused by: org.apache.ignite.internal.marshaller.UnmappedColumnsException
        ... 34 more
{noformat}




> Failed to serialize tuple for table PUBLIC.KV: Value tuple doesn't match 
> schema
> -------------------------------------------------------------------------------
>
>                 Key: IGNITE-27729
>                 URL: https://issues.apache.org/jira/browse/IGNITE-27729
>             Project: Ignite
>          Issue Type: Bug
>          Components: sql ai3, thin clients ai3
>    Affects Versions: 3.1
>            Reporter: Maksim Zhuravkov
>            Priority: Major
>              Labels: ignite-3
>
> Apache Ignite incorrectly converts 'i' character when locale tr_TR is used 
> (it converts 'i' to 'İ' instead of 'I'. This issue is most likely caused by 
> calls to `toUpperCase` w/o proper locale parameters inside the 
> `IgniteNameUtils`.
> Reproducer with a key value view:
> {noformat}
> import org.apache.ignite.client.IgniteClient;
> import org.apache.ignite.sql.IgniteSql;
> import org.apache.ignite.table.KeyValueView;
> import org.apache.ignite.table.Table;
> import org.apache.ignite.table.Tuple;
> import java.util.Locale;
> import java.util.Map;
> public class LocalProblem {
>     public static void main(String[] args) throws Exception {
>         Locale.setDefault(new Locale("tr", "TR")); // Remove this or set to 
> non Turkish locale and everything works.
>         
>         try (var client = IgniteClient.builder()
>                 .addresses("localhost:10801")
>                 .build()
>         ) {
>             IgniteSql sql = client.sql();
>             try (var rs = sql.execute(null, "DROP TABLE IF EXISTS kv")) {
>                 System.err.println(rs.affectedRows());
>             }
>             try (var rs = sql.execute(null, "CREATE TABLE kv (key INT, val 
> INT, iloc VARCHAR, PRIMARY KEY (key) )")) {
>                 System.err.println(rs.affectedRows());
>             }
>             // Insert
>             try (var rs = sql.execute(null, "INSERT INTO kv VALUES(1, 1, 
> '0:1')")) {
>                 System.err.println(rs.affectedRows());
>             }
>             
>             Table table = client.tables().table("kv");
>             KeyValueView<Tuple, Tuple> view = table.keyValueView();
>             Tuple key = Tuple.create(Map.of("key", 2));
>             Tuple value = Tuple.create(Map.of("val", 2, "iloc", "0:1"));
>             
>             view.put(null, key, value);
>         }
>     }
> }
> {noformat}
> Error:
> {noformat}
> Şub 03, 2026 6:08:31 ÖS org.apache.ignite.internal.logger.IgniteLoggerImpl 
> warn
> WARNING: Failed to send request sync [id=8, op=10, 
> remoteAddress=localhost:10801]: Failed to serialize tuple for table 
> PUBLIC.KV: Value tuple doesn't match schema: schemaVersion=1, 
> extraColumns=[İLOC]
> org.apache.ignite.lang.MarshallerException: IGN-MARSHALLING-1 Failed to 
> serialize tuple for table PUBLIC.KV: Value tuple doesn't match schema: 
> schemaVersion=1, extraColumns=[İLOC] TraceId:4b2ced51
>       at 
> org.apache.ignite.internal.client.table.ClientTupleSerializer.throwSchemaMismatchException(ClientTupleSerializer.java:563)
>       at 
> org.apache.ignite.internal.client.table.ClientTupleSerializer.writeKvTuple(ClientTupleSerializer.java:258)
>       at 
> org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.lambda$putAsync$16(ClientKeyValueBinaryView.java:249)
>       at 
> org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$7(ClientTable.java:682)
>       at 
> org.apache.ignite.internal.client.TcpClientChannel.send(TcpClientChannel.java:392)
>       at 
> org.apache.ignite.internal.client.TcpClientChannel.serviceAsync(TcpClientChannel.java:347)
>       at 
> org.apache.ignite.internal.client.ReliableChannel.serviceAsyncInternal(ReliableChannel.java:386)
>       at 
> org.apache.ignite.internal.client.ReliableChannel.lambda$serviceAsync$4(ReliableChannel.java:322)
>       at 
> java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
>       at 
> java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
>       at 
> org.apache.ignite.internal.client.ReliableChannel.lambda$serviceAsync$5(ReliableChannel.java:322)
>       at 
> org.apache.ignite.internal.client.ClientFutureUtils.doWithRetryAsync(ClientFutureUtils.java:46)
>       at 
> org.apache.ignite.internal.client.ClientFutureUtils.doWithRetryAsync(ClientFutureUtils.java:36)
>       at 
> org.apache.ignite.internal.client.ReliableChannel.serviceAsync(ReliableChannel.java:320)
>       at 
> org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$15(ClientTable.java:680)
>       at 
> java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
>       at 
> java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
>       at 
> org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$16(ClientTable.java:679)
>       at 
> java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
>       at 
> java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
>       at 
> org.apache.ignite.internal.client.table.ClientTable.doSchemaOutInOpAsync(ClientTable.java:656)
>       at 
> org.apache.ignite.internal.client.table.ClientTable.doSchemaOutOpAsync(ClientTable.java:521)
>       at 
> org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.putAsync(ClientKeyValueBinaryView.java:247)
>       at 
> org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.put(ClientKeyValueBinaryView.java:238)
>       at 
> org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.put(ClientKeyValueBinaryView.java:69)
>       at 
> org.apache.ignite.internal.client.table.api.PublicApiClientKeyValueView.lambda$put$12(PublicApiClientKeyValueView.java:108)
>       at 
> org.apache.ignite.internal.thread.PublicApiThreading.lambda$execUserSyncOperation$1(PublicApiThreading.java:108)
>       at 
> org.apache.ignite.internal.thread.PublicApiThreading.executeWithRole(PublicApiThreading.java:136)
>       at 
> org.apache.ignite.internal.thread.PublicApiThreading.execUserSyncOperation(PublicApiThreading.java:94)
>       at 
> org.apache.ignite.internal.thread.PublicApiThreading.execUserSyncOperation(PublicApiThreading.java:107)
>       at 
> org.apache.ignite.internal.client.table.api.PublicApiClientViewBase.executeSyncOp(PublicApiClientViewBase.java:97)
>       at 
> org.apache.ignite.internal.client.table.api.PublicApiClientKeyValueView.put(PublicApiClientKeyValueView.java:108)
>       at 
> org.apache.ignite.internal.table.CloseableKeyValueView.put(CloseableKeyValueView.java:152)
>       at LocalProblem.main(LocalProblem.java:40)
> Caused by: org.apache.ignite.internal.marshaller.UnmappedColumnsException
>       ... 34 more
> {noformat}



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

Reply via email to