Hyoungjun Kim created TAJO-1565:
-----------------------------------

             Summary: Simple column name in ORDER BY is failed with "Ambiguous 
Column Name ERROR".
                 Key: TAJO-1565
                 URL: https://issues.apache.org/jira/browse/TAJO-1565
             Project: Tajo
          Issue Type: Bug
            Reporter: Hyoungjun Kim


I ran the following query which contains self join and doesn't use a fully 
qualified column name in ORDER BY clause. The query failed with "Ambiguous 
Column Name ERROR".

{code:sql}
select n1.n_nationkey, n2.n_name
from nation n1, nation n2, nation n3
 where n1.n_nationkey = n2.n_nationkey
 and n1.n_nationkey = n3.n_nationkey
order by n_name;
{code}

{noformat}
org.apache.tajo.plan.algebra.AmbiguousFieldException: ERROR: column name 
Ambiguous Column Name: default.n1.n_name (TEXT), default.n2.n_name (TEXT), 
default.n3.n_name (TEXT) is ambiguous
        at 
org.apache.tajo.plan.nameresolver.NameResolver.ensureUniqueColumn(NameResolver.java:286)
        at 
org.apache.tajo.plan.nameresolver.NameResolver.resolveFromAllRelsInBlock(NameResolver.java:183)
        at 
org.apache.tajo.plan.nameresolver.ResolverByLegacy.resolveColumnWithoutQualifier(ResolverByLegacy.java:104)
        at 
org.apache.tajo.plan.nameresolver.ResolverByLegacy.resolve(ResolverByLegacy.java:44)
        at 
org.apache.tajo.plan.nameresolver.NameResolver.resolve(NameResolver.java:90)
        at 
org.apache.tajo.plan.ExprNormalizer.visitColumnReference(ExprNormalizer.java:344)
        at 
org.apache.tajo.plan.ExprNormalizer.visitColumnReference(ExprNormalizer.java:84)
        at 
org.apache.tajo.plan.algebra.BaseAlgebraVisitor.visit(BaseAlgebraVisitor.java:218)
        at 
org.apache.tajo.plan.visitor.SimpleAlgebraVisitor.visit(SimpleAlgebraVisitor.java:43)
        at 
org.apache.tajo.plan.ExprNormalizer.normalize(ExprNormalizer.java:122)
        at 
org.apache.tajo.plan.ExprNormalizer.normalize(ExprNormalizer.java:115)
        at 
org.apache.tajo.plan.LogicalPlanner.visitSort(LogicalPlanner.java:829)
        at org.apache.tajo.plan.LogicalPlanner.visitSort(LogicalPlanner.java:66)
        at 
org.apache.tajo.plan.algebra.BaseAlgebraVisitor.visit(BaseAlgebraVisitor.java:65)
        at 
org.apache.tajo.plan.LogicalPlanner.visitProjection(LogicalPlanner.java:238)
        at 
org.apache.tajo.plan.LogicalPlanner.visitProjection(LogicalPlanner.java:66)
        at 
org.apache.tajo.plan.algebra.BaseAlgebraVisitor.visit(BaseAlgebraVisitor.java:59)
        at 
org.apache.tajo.plan.LogicalPlanner.createPlan(LogicalPlanner.java:143)
        at 
org.apache.tajo.plan.LogicalPlanner.createPlan(LogicalPlanner.java:131)
        at 
org.apache.tajo.master.GlobalEngine.createLogicalPlan(GlobalEngine.java:271)
        at 
org.apache.tajo.master.GlobalEngine.executeQuery(GlobalEngine.java:188)
        at 
org.apache.tajo.master.TajoMasterClientService$TajoMasterClientProtocolServiceHandler.submitQuery(TajoMasterClientService.java:287)
        at 
org.apache.tajo.ipc.TajoMasterClientProtocol$TajoMasterClientProtocolService$2.callBlockingMethod(TajoMasterClientProtocol.java:543)
        at 
org.apache.tajo.rpc.BlockingRpcServer$ServerHandler.channelRead(BlockingRpcServer.java:113)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
        at 
io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
        at 
io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:182)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
        at 
io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
        at 
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:130)
        at 
io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
        at 
io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
        at 
io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
        at 
io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
        at java.lang.Thread.run(Thread.java:744)
{noformat}

This query run successfully on PostgreSQL.
{noformat}
babokim=# select n1.n_nationkey, n2.n_name
babokim-# from nation n1, nation n2, nation n3
babokim-#  where n1.n_nationkey = n2.n_nationkey
babokim-#  and n1.n_nationkey = n3.n_nationkey
babokim-# order by n_name;;
 n_nationkey |  n_name
-------------+-----------
           0 | ALGERIA
           1 | ARGENTINA
           2 | BRAZIL
(3 rows)
{noformat}

Also I found a strange code in NameResolver.ensureUniqueColumn().
I think "else if (candidates.size() > 2)" statement should be "else". I don't 
know why compare great than 2.
{code:java}
  static Column ensureUniqueColumn(List<Column> candidates) throws 
VerifyException {
    if (candidates.size() == 1) {
      return candidates.get(0);
    } else if (candidates.size() > 2) {
      StringBuilder sb = new StringBuilder();
      boolean first = true;
      for (Column column : candidates) {
        if (first) {
          first = false;
        } else {
          sb.append(", ");
        }
        sb.append(column);
      }
      throw new AmbiguousFieldException("Ambiguous Column Name: " + 
sb.toString());
    } else {
      return null;
    }
  }
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to