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

Pavel Pereslegin updated IGNITE-24588:
--------------------------------------
    Description: 
Consider the following example which uses a valid quoted identifier, {{"_KEY"}}.

{code:java}
    IgniteClient client = IgniteClient.builder()
            .addresses("127.0.0.1:" + 
unwrapIgniteImpl(CLUSTER.node(0)).clientAddress().port())
            .build();
    
    sql("CREATE TABLE T (\"_KEY\" INT PRIMARY KEY, val INT)");
    
    KeyValueView<Tuple, Tuple> kvView = 
client.tables().table("t").keyValueView();
    
    Tuple key = Tuple.create().set("\"_KEY\"", 0);
    
    NullableValue<Tuple> nullable = kvView.getNullable(null, key); // Error: 
Malformed identifier [identifier=_KEY, pos=0]
    
    assertNull(nullable);
{code}

fails with the following

{noformat}
Caused by: java.lang.IllegalArgumentException: Malformed identifier 
[identifier=_KEY, pos=0]
        at 
org.apache.ignite.lang.util.IgniteNameUtils$Tokenizer.throwMalformedIdentifierException(IgniteNameUtils.java:278)
        at 
org.apache.ignite.lang.util.IgniteNameUtils$Tokenizer.nextToken(IgniteNameUtils.java:204)
        at 
org.apache.ignite.lang.util.IgniteNameUtils.parseIdentifier(IgniteNameUtils.java:45)
        at org.apache.ignite.table.TupleImpl.columnIndex(TupleImpl.java:131)
        at org.apache.ignite.table.TupleImpl.valueOrDefault(TupleImpl.java:145)
        at 
org.apache.ignite.internal.client.table.ClientTupleSerializer.getColocationHash(ClientTupleSerializer.java:450)
        at 
org.apache.ignite.internal.client.table.ClientTupleSerializer.lambda$getPartitionAwarenessProvider$0(ClientTupleSerializer.java:423)
        at 
org.apache.ignite.internal.client.table.PartitionAwarenessProvider.getObjectHashCode(PartitionAwarenessProvider.java:68)
        at 
org.apache.ignite.internal.client.table.ClientTable.getPreferredNodeName(ClientTable.java:713)
        at 
org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$8(ClientTable.java:466)
        at 
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at 
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2237)
        at 
org.apache.ignite.internal.client.table.ClientTable.doSchemaOutInOpAsync(ClientTable.java:464)
        at 
org.apache.ignite.internal.client.table.ClientTable.doSchemaOutInOpAsync(ClientTable.java:425)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.getNullableAsync(ClientKeyValueBinaryView.java:132)
        ... 11 more
{noformat}

At first glance, this issue is related to the ClientTupleSerializer, and we 
should quote the identifier ({{quoteIfNeeded(name)}}) before passing it to the 
tuple's valueOrDefault method (at least in the getColocationHash() and 
writeTupleRaw() methods).

p.s. we need to add more tests for such cases (for kv and record views).

  was:
Consider the following example which uses a valid quoted identifier, {{"_KEY"}}.

{code:java}
    IgniteClient client = IgniteClient.builder()
            .addresses("127.0.0.1:" + 
unwrapIgniteImpl(CLUSTER.node(0)).clientAddress().port())
            .build();
    
    sql("CREATE TABLE T (\"_KEY\" INT PRIMARY KEY, val INT)");
    
    KeyValueView<Tuple, Tuple> kvView = 
client.tables().table("t").keyValueView();
    
    Tuple key = Tuple.create().set("\"_KEY\"", 0);
    
    NullableValue<Tuple> nullable = kvView.getNullable(null, key); // Error: 
Malformed identifier [identifier=_KEY, pos=0]
    
    assertNull(nullable);
{code}

fails with the following

{noformat}
Caused by: java.lang.IllegalArgumentException: Malformed identifier 
[identifier=_KEY, pos=0]
        at 
org.apache.ignite.lang.util.IgniteNameUtils$Tokenizer.throwMalformedIdentifierException(IgniteNameUtils.java:278)
        at 
org.apache.ignite.lang.util.IgniteNameUtils$Tokenizer.nextToken(IgniteNameUtils.java:204)
        at 
org.apache.ignite.lang.util.IgniteNameUtils.parseIdentifier(IgniteNameUtils.java:45)
        at org.apache.ignite.table.TupleImpl.columnIndex(TupleImpl.java:131)
        at org.apache.ignite.table.TupleImpl.valueOrDefault(TupleImpl.java:145)
        at 
org.apache.ignite.internal.client.table.ClientTupleSerializer.getColocationHash(ClientTupleSerializer.java:450)
        at 
org.apache.ignite.internal.client.table.ClientTupleSerializer.lambda$getPartitionAwarenessProvider$0(ClientTupleSerializer.java:423)
        at 
org.apache.ignite.internal.client.table.PartitionAwarenessProvider.getObjectHashCode(PartitionAwarenessProvider.java:68)
        at 
org.apache.ignite.internal.client.table.ClientTable.getPreferredNodeName(ClientTable.java:713)
        at 
org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$8(ClientTable.java:466)
        at 
java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at 
java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2237)
        at 
org.apache.ignite.internal.client.table.ClientTable.doSchemaOutInOpAsync(ClientTable.java:464)
        at 
org.apache.ignite.internal.client.table.ClientTable.doSchemaOutInOpAsync(ClientTable.java:425)
        at 
org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.getNullableAsync(ClientKeyValueBinaryView.java:132)
        ... 11 more
{noformat}

At first glance, this issue is related to the ClientTupleSerializer, and we 
should quote the identifier ({{quoteIfNeeded(name)}}) before passing it to the 
tuple's valueOrDefault method (at least in the getColocationHash() and 
writeTupleRaw() methods).

p.s. we need to add tests for such cases (for kv and record views).


> Sql. Fail to read column with quoted identifier using client kv view.
> ---------------------------------------------------------------------
>
>                 Key: IGNITE-24588
>                 URL: https://issues.apache.org/jira/browse/IGNITE-24588
>             Project: Ignite
>          Issue Type: Bug
>          Components: sql
>            Reporter: Pavel Pereslegin
>            Priority: Major
>
> Consider the following example which uses a valid quoted identifier, 
> {{"_KEY"}}.
> {code:java}
>     IgniteClient client = IgniteClient.builder()
>             .addresses("127.0.0.1:" + 
> unwrapIgniteImpl(CLUSTER.node(0)).clientAddress().port())
>             .build();
>     
>     sql("CREATE TABLE T (\"_KEY\" INT PRIMARY KEY, val INT)");
>     
>     KeyValueView<Tuple, Tuple> kvView = 
> client.tables().table("t").keyValueView();
>     
>     Tuple key = Tuple.create().set("\"_KEY\"", 0);
>     
>     NullableValue<Tuple> nullable = kvView.getNullable(null, key); // Error: 
> Malformed identifier [identifier=_KEY, pos=0]
>     
>     assertNull(nullable);
> {code}
> fails with the following
> {noformat}
> Caused by: java.lang.IllegalArgumentException: Malformed identifier 
> [identifier=_KEY, pos=0]
>       at 
> org.apache.ignite.lang.util.IgniteNameUtils$Tokenizer.throwMalformedIdentifierException(IgniteNameUtils.java:278)
>       at 
> org.apache.ignite.lang.util.IgniteNameUtils$Tokenizer.nextToken(IgniteNameUtils.java:204)
>       at 
> org.apache.ignite.lang.util.IgniteNameUtils.parseIdentifier(IgniteNameUtils.java:45)
>       at org.apache.ignite.table.TupleImpl.columnIndex(TupleImpl.java:131)
>       at org.apache.ignite.table.TupleImpl.valueOrDefault(TupleImpl.java:145)
>       at 
> org.apache.ignite.internal.client.table.ClientTupleSerializer.getColocationHash(ClientTupleSerializer.java:450)
>       at 
> org.apache.ignite.internal.client.table.ClientTupleSerializer.lambda$getPartitionAwarenessProvider$0(ClientTupleSerializer.java:423)
>       at 
> org.apache.ignite.internal.client.table.PartitionAwarenessProvider.getObjectHashCode(PartitionAwarenessProvider.java:68)
>       at 
> org.apache.ignite.internal.client.table.ClientTable.getPreferredNodeName(ClientTable.java:713)
>       at 
> org.apache.ignite.internal.client.table.ClientTable.lambda$doSchemaOutInOpAsync$8(ClientTable.java:466)
>       at 
> java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
>       at 
> java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2237)
>       at 
> org.apache.ignite.internal.client.table.ClientTable.doSchemaOutInOpAsync(ClientTable.java:464)
>       at 
> org.apache.ignite.internal.client.table.ClientTable.doSchemaOutInOpAsync(ClientTable.java:425)
>       at 
> org.apache.ignite.internal.client.table.ClientKeyValueBinaryView.getNullableAsync(ClientKeyValueBinaryView.java:132)
>       ... 11 more
> {noformat}
> At first glance, this issue is related to the ClientTupleSerializer, and we 
> should quote the identifier ({{quoteIfNeeded(name)}}) before passing it to 
> the tuple's valueOrDefault method (at least in the getColocationHash() and 
> writeTupleRaw() methods).
> p.s. we need to add more tests for such cases (for kv and record views).



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

Reply via email to