Pavel Tupitsyn created IGNITE-24621:
---------------------------------------

             Summary: .NET: LINQ: field names not distinct exception
                 Key: IGNITE-24621
                 URL: https://issues.apache.org/jira/browse/IGNITE-24621
             Project: Ignite
          Issue Type: Bug
          Components: platforms, thin client
    Affects Versions: 3.0
            Reporter: Pavel Tupitsyn
            Assignee: Pavel Tupitsyn


{code}
await client.Sql.ExecuteAsync(null, "CREATE TABLE IF NOT EXISTS FOO (ID INT 
PRIMARY KEY, NAME VARCHAR)");
var table = await client.Tables.GetTableAsync("FOO");
var view = table!.GetRecordView<Rec>();
await view.UpsertAsync(null, new Rec(1, "X"));

var query = view.AsQueryable()
    .Join(
        view.AsQueryable(),
        x => x.Id,
        y => y.Id,
        (x, y) => new { Id1 = x.Id, Id2 = y.Id, Name3 = x.Name + "_" + y.Name })
    .OrderBy(x => x.Name3);

Console.WriteLine(query);
Console.WriteLine(query.First());
{code}

Exception:
{code}
Apache.Ignite.Sql.SqlException : field names not distinct: RecordType(INTEGER 
ID, INTEGER ID, VARCHAR NAME3)
  ----> Apache.Ignite.IgniteException : org.apache.ignite.sql.SqlException: 
IGN-CMN-65535 TraceId:3ef89464-183f-4820-a5bb-63ef21c91983 field names not 
distinct: RecordType(INTEGER ID, INTEGER ID, VARCHAR NAME3)
        at 
org.apache.ignite.internal.lang.SqlExceptionMapperUtil.mapToPublicSqlException(SqlExceptionMapperUtil.java:73)
        at 
org.apache.ignite.internal.sql.engine.prepare.PrepareServiceImpl.lambda$prepareAsync$0(PrepareServiceImpl.java:260)
        at 
java.base/java.util.concurrent.CompletableFuture.uniExceptionally(CompletableFuture.java:990)
        at 
java.base/java.util.concurrent.CompletableFuture$UniExceptionally.tryFire(CompletableFuture.java:974)
        at 
java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
        at 
java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: org.apache.ignite.lang.IgniteException: IGN-CMN-65535 
TraceId:3ef89464-183f-4820-a5bb-63ef21c91983 field names not distinct: 
RecordType(INTEGER ID, INTEGER ID, VARCHAR NAME3)
        at 
org.apache.ignite.internal.lang.IgniteExceptionMapperUtil.lambda$mapToPublicException$2(IgniteExceptionMapperUtil.java:88)
        at 
org.apache.ignite.internal.lang.IgniteExceptionMapperUtil.mapCheckingResultIsPublic(IgniteExceptionMapperUtil.java:141)
        at 
org.apache.ignite.internal.lang.IgniteExceptionMapperUtil.mapToPublicException(IgniteExceptionMapperUtil.java:110)
        at 
org.apache.ignite.internal.lang.IgniteExceptionMapperUtil.mapToPublicException(IgniteExceptionMapperUtil.java:88)
        at 
org.apache.ignite.internal.lang.SqlExceptionMapperUtil.mapToPublicSqlException(SqlExceptionMapperUtil.java:63)
        ... 8 more
Caused by: java.lang.AssertionError: field names not distinct: 
RecordType(INTEGER ID, INTEGER ID, VARCHAR NAME3)
        at org.apache.calcite.util.Litmus.lambda$static$0(Litmus.java:31)
        at org.apache.calcite.rel.core.Project.isValid(Project.java:267)
        at org.apache.calcite.rel.core.Project.<init>(Project.java:106)
        at org.apache.calcite.rel.core.Project.<init>(Project.java:117)
        at 
org.apache.ignite.internal.sql.engine.rel.IgniteProject.<init>(IgniteProject.java:75)
        at 
org.apache.ignite.internal.sql.engine.prepare.PlannerHelper.optimize(PlannerHelper.java:200)
        at 
org.apache.ignite.internal.sql.engine.prepare.PrepareServiceImpl.doOptimize(PrepareServiceImpl.java:764)
        at 
org.apache.ignite.internal.sql.engine.prepare.PrepareServiceImpl.lambda$prepareQuery$5(PrepareServiceImpl.java:418)
        at 
java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
        ... 3 more

   at Apache.Ignite.Internal.ClientSocket.DoOutInOpAsyncInternal(ClientOp 
clientOp, PooledArrayBuffer request, Boolean expectNotifications) in 
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/ClientSocket.cs:line
 665
   at 
Apache.Ignite.Internal.ClientFailoverSocket.DoOutInOpAndGetSocketAsync(ClientOp 
clientOp, Transaction tx, PooledArrayBuffer request, PreferredNode 
preferredNode, IRetryPolicy retryPolicyOverride, Boolean expectNotifications) 
in 
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/ClientFailoverSocket.cs:line
 219
   at Apache.Ignite.Internal.Sql.Sql.ExecuteAsyncInternal[T](ITransaction 
transaction, SqlStatement statement, RowReaderFactory`1 rowReaderFactory, 
ICollection`1 args) in 
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs:line
 167
   at 
Apache.Ignite.Internal.Linq.IgniteQueryExecutor.ExecuteResultSetInternalAsync[T](QueryModel
 queryModel) in 
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs:line
 132
   at 
Apache.Ignite.Internal.Linq.IgniteQueryExecutor.ExecuteSingleInternalAsync[T](QueryModel
 queryModel, ExecutionOptions options) in 
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs:line
 152
   at 
Apache.Ignite.Internal.Linq.IgniteQueryExecutor.ExecuteSingle[T](QueryModel 
queryModel, Boolean returnDefaultWhenEmpty) in 
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs:line
 72
   at 
Remotion.Linq.Clauses.StreamedData.StreamedSingleValueInfo.ExecuteSingleQueryModel[T](QueryModel
 queryModel, IQueryExecutor executor)
   at 
Remotion.Linq.Clauses.StreamedData.StreamedSingleValueInfo.ExecuteQueryModel(QueryModel
 queryModel, IQueryExecutor executor)
   at Remotion.Linq.QueryModel.Execute(IQueryExecutor executor)
   at Apache.Ignite.Internal.Linq.IgniteQueryProvider.Execute(Expression 
expression) in 
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryProvider.cs:line
 162
   at 
Apache.Ignite.Internal.Linq.IgniteQueryProvider.Execute[TResult](Expression 
expression) in 
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryProvider.cs:line
 91
{code}

Generated SQL:
{code}
IgniteQueryable`1[<>f__AnonymousType26`3[Int32, Int32, String]] { Query = 
select _T0.ID, _T1.ID, concat(concat(_T0.NAME, ?), _T1.NAME) as NAME3 from 
PUBLIC.FOO as _T0 inner join PUBLIC.FOO as _T1 on (_T1.ID = _T0.ID) order by 
concat(concat(_T0.NAME, ?), _T1.NAME) asc, Parameters = [ _, _ ] }
{code}

The query works if you remove *OrderBy*, produces correct SQL with aliases:
{code}
IgniteQueryable`1[<>f__AnonymousType26`3[Int32, Int32, String]] { Query = 
select _T0.ID, _T1.ID, concat(concat(_T0.NAME, ?), _T1.NAME) as NAME3 from 
PUBLIC.FOO as _T0 inner join PUBLIC.FOO as _T1 on (_T1.ID = _T0.ID), Parameters 
= [ _ ] }

{ Id1 = 1, Id2 = 1, Name3 = X_X }
{code}



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

Reply via email to