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