Repository: tajo
Updated Branches:
  refs/heads/master dfec6a07f -> cd01b739d


TAJO-1885: Simple query with projection should be supported.

Closes #782


Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/cd01b739
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/cd01b739
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/cd01b739

Branch: refs/heads/master
Commit: cd01b739dfd0fd616e7dc75efc132793a30fcfab
Parents: dfec6a0
Author: Hyunsik Choi <[email protected]>
Authored: Mon Sep 28 11:34:00 2015 -0700
Committer: Hyunsik Choi <[email protected]>
Committed: Mon Sep 28 11:34:00 2015 -0700

----------------------------------------------------------------------
 CHANGES                                         |  2 ++
 .../org/apache/tajo/client/QueryStatus.java     |  2 +-
 .../tajo/cli/tsql/TestTajoCliNegatives.java     | 13 +++++--
 .../org/apache/tajo/client/TestTajoClient.java  |  2 +-
 .../apache/tajo/client/v2/TestTajoClientV2.java |  4 +--
 .../TestTajoCli/testNonForwardQueryPause.result |  2 +-
 .../tajo/master/TajoMasterClientService.java    |  4 +--
 .../exec/NonForwardQueryResultFileScanner.java  | 23 ++++++------
 .../apache/tajo/master/exec/QueryExecutor.java  | 35 ++++++++++++------
 .../ws/rs/resources/QueryResultResource.java    |  2 +-
 .../java/org/apache/tajo/jdbc/TestTajoJdbc.java | 13 +------
 .../apache/tajo/jdbc/TestTajoJdbcNegative.java  |  3 +-
 .../org/apache/tajo/plan/util/PlannerUtil.java  | 38 ++++----------------
 13 files changed, 68 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 245e3ab..0048d37 100644
--- a/CHANGES
+++ b/CHANGES
@@ -56,6 +56,8 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1885: Simple query with projection should be supported. (hyunsik)
+
     TAJO-1890: Clean up debug and test modes and unhandled exceptions. 
     (hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-client/src/main/java/org/apache/tajo/client/QueryStatus.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/QueryStatus.java 
b/tajo-client/src/main/java/org/apache/tajo/client/QueryStatus.java
index 68d5638..ded9ade 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/QueryStatus.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/QueryStatus.java
@@ -45,7 +45,7 @@ public class QueryStatus {
     if (proto.hasErrorMessage()) {
       errorText = proto.getErrorMessage();
     } else {
-      errorText = "Internal error. Please check out log files in 
${tajo_install_dir}/logs files.";
+      errorText = "Internal error. Please check out log files in 
${tajo_install_dir}/logs directory.";
     }
     if (proto.hasErrorTrace()) {
       errorTrace = proto.getErrorTrace();

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java
 
b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java
index d1f1023..bf4ffcf 100644
--- 
a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java
+++ 
b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java
@@ -129,9 +129,18 @@ public class TestTajoCliNegatives extends 
QueryTestCaseBase {
   }
 
   @Test
+  public void testQueryFailureOfSimpleQuery() throws Exception {
+    setVar(tajoCli, SessionVars.CLI_FORMATTER_CLASS, 
TajoCliOutputTestFormatter.class.getName());
+    assertScriptFailure("select fail(3, l_orderkey, 
'testQueryFailureOfSimpleQuery') from default.lineitem" ,
+        "?fail\n" +
+            "-------------------------------\n" +
+            "ERROR: internal error: internal error: 
testQueryFailureOfSimpleQuery\n");
+  }
+
+  @Test
   public void testQueryFailure() throws Exception {
     setVar(tajoCli, SessionVars.CLI_FORMATTER_CLASS, 
TajoCliOutputTestFormatter.class.getName());
-    assertScriptFailure("select fail(3, l_orderkey, 'testQueryFailure') from 
default.lineitem" ,
-        "ERROR: Internal error. Please check out log files in 
${tajo_install_dir}/logs files.\n");
+    assertScriptFailure("select fail(3, l_orderkey, 'testQueryFailure') from 
default.lineitem where l_orderkey > 0" ,
+        "ERROR: Internal error. Please check out log files in 
${tajo_install_dir}/logs directory.\n");
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java 
b/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java
index 279e0a4..2752ed4 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java
@@ -218,7 +218,7 @@ public class TestTajoClient {
 
   @Test
   public final void testKillQuery() throws IOException, TajoException, 
InterruptedException {
-    ClientProtos.SubmitQueryResponse res = client.executeQuery("select 
sleep(1) from lineitem");
+    ClientProtos.SubmitQueryResponse res = client.executeQuery("select 
sleep(1) from lineitem where l_orderkey > 0");
     Thread.sleep(1000);
     QueryId queryId = new QueryId(res.getQueryId());
     client.killQuery(queryId);

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java 
b/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java
index 885d89b..f8a44d9 100644
--- 
a/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java
+++ 
b/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java
@@ -259,13 +259,13 @@ public class TestTajoClientV2 extends QueryTestCaseBase {
 
   @Test(expected = QueryFailedException.class)
   public void testFailedExecuteQuery() throws TajoException {
-    clientv2.executeQuery("select fail(3, l_orderkey, 'testQueryFailure') from 
default.lineitem");
+    clientv2.executeQuery("select fail(3, l_orderkey, 'testQueryFailure') from 
default.lineitem where l_orderkey > 0");
   }
 
   @Test(expected = QueryFailedException.class)
   public void testFailedExecuteQueryAsync() throws Throwable {
     QueryFuture future = clientv2.executeQueryAsync(
-            "select fail(3, l_orderkey, 'testQueryFailure') from 
default.lineitem");
+            "select fail(3, l_orderkey, 'testQueryFailure') from 
default.lineitem where l_orderkey > 0");
     try {
       future.get();
     } catch (ExecutionException e) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-core-tests/src/test/resources/results/TestTajoCli/testNonForwardQueryPause.result
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/resources/results/TestTajoCli/testNonForwardQueryPause.result
 
b/tajo-core-tests/src/test/resources/results/TestTajoCli/testNonForwardQueryPause.result
index d4ba604..90074e2 100644
--- 
a/tajo-core-tests/src/test/resources/results/TestTajoCli/testNonForwardQueryPause.result
+++ 
b/tajo-core-tests/src/test/resources/results/TestTajoCli/testNonForwardQueryPause.result
@@ -3,4 +3,4 @@ l_orderkey,  l_partkey,  l_suppkey,  l_linenumber,  l_quantity, 
 l_extendedprice
 1,  1,  7706,  1,  17.0,  21168.23,  0.04,  0.02,  N,  O,  1996-03-13,  
1996-02-12,  1996-03-22,  DELIVER IN PERSON,  TRUCK,  egular courts above the
 1,  1,  7311,  2,  36.0,  45983.16,  0.09,  0.06,  N,  O,  1996-04-12,  
1996-02-28,  1996-04-20,  TAKE BACK RETURN,  MAIL,  ly final dependencies: 
slyly bold 
 (2 rows, continue... 'q' is quit)
-(unknown row number, , 604 B selected)
\ No newline at end of file
+(unknown row number, , 0 B selected)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java 
b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
index ebd6e2b..017b17f 100644
--- 
a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
@@ -560,10 +560,10 @@ public class TajoMasterClientService extends 
AbstractService {
 
           if(request.hasCompressCodec()) {
             queryResultScanner = new 
NonForwardQueryResultFileScanner(context.getConf(), session.getSessionId(),
-                queryId, scanNode, resultTableDesc, Integer.MAX_VALUE, 
request.getCompressCodec());
+                queryId, scanNode, Integer.MAX_VALUE, 
request.getCompressCodec());
           } else {
             queryResultScanner = new 
NonForwardQueryResultFileScanner(context.getConf(),
-                session.getSessionId(), queryId, scanNode, resultTableDesc, 
Integer.MAX_VALUE);
+                session.getSessionId(), queryId, scanNode, Integer.MAX_VALUE);
           }
 
           queryResultScanner.init();

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
 
b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
index e520cdb..ce69270 100644
--- 
a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
@@ -38,6 +38,7 @@ import 
org.apache.tajo.engine.planner.physical.PartitionMergeScanExec;
 import org.apache.tajo.engine.planner.physical.ScanExec;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.exception.TajoInternalError;
 import org.apache.tajo.ipc.ClientProtos.SerializedResultSet;
 import org.apache.tajo.plan.logical.ScanNode;
 import org.apache.tajo.querymaster.Repartitioner;
@@ -81,19 +82,19 @@ public class NonForwardQueryResultFileScanner implements 
NonForwardQueryResultSc
   private Future<MemoryRowBlock> nextFetch;
 
   public NonForwardQueryResultFileScanner(TajoConf tajoConf, String sessionId, 
QueryId queryId, ScanNode scanNode,
-                                          TableDesc tableDesc, int maxRow) 
throws IOException {
-    this(tajoConf, sessionId, queryId, scanNode, tableDesc, maxRow, null);
+                                          int maxRow) throws IOException {
+    this(tajoConf, sessionId, queryId, scanNode, maxRow, null);
   }
 
   public NonForwardQueryResultFileScanner(TajoConf tajoConf, String sessionId, 
QueryId queryId, ScanNode scanNode,
-      TableDesc tableDesc, int maxRow, CodecType codecType) throws IOException 
{
+      int maxRow, CodecType codecType) throws IOException {
     this.tajoConf = tajoConf;
     this.sessionId = sessionId;
     this.queryId = queryId;
     this.scanNode = scanNode;
-    this.tableDesc = tableDesc;
+    this.tableDesc = scanNode.getTableDesc();
     this.maxRow = maxRow;
-    this.rowEncoder = RowStoreUtil.createEncoder(tableDesc.getLogicalSchema());
+    this.rowEncoder = RowStoreUtil.createEncoder(scanNode.getOutSchema());
     this.codecType = codecType;
   }
 
@@ -213,7 +214,7 @@ public class NonForwardQueryResultFileScanner implements 
NonForwardQueryResultSc
   public SerializedResultSet nextRowBlock(int fetchRowNum) throws IOException {
     try {
       final SerializedResultSet.Builder resultSetBuilder = 
SerializedResultSet.newBuilder();
-      resultSetBuilder.setSchema(getLogicalSchema().getProto());
+      resultSetBuilder.setSchema(scanNode.getOutSchema().getProto());
       resultSetBuilder.setRows(0);
 
       if (isStopped) return resultSetBuilder.build();
@@ -251,7 +252,7 @@ public class NonForwardQueryResultFileScanner implements 
NonForwardQueryResultSc
       }
       return resultSetBuilder.build();
     } catch (Throwable t) {
-      throw new IOException(t.getMessage(), t);
+      throw new TajoInternalError(t.getCause());
     }
   }
 
@@ -261,7 +262,7 @@ public class NonForwardQueryResultFileScanner implements 
NonForwardQueryResultSc
   private Future<MemoryRowBlock> fetchNextRowBlock(final int fetchRowNum) 
throws IOException {
     final SettableFuture<MemoryRowBlock> future = SettableFuture.create();
     if (rowBlock == null) {
-      rowBlock = new 
MemoryRowBlock(SchemaUtil.toDataTypes(tableDesc.getLogicalSchema()));
+      rowBlock = new 
MemoryRowBlock(SchemaUtil.toDataTypes(scanNode.getOutSchema()));
     }
 
     if (scanExec == null) {
@@ -300,8 +301,8 @@ public class NonForwardQueryResultFileScanner implements 
NonForwardQueryResultSc
           }
 
           future.set(rowBlock);
-        } catch (IOException e) {
-          future.setException(e);
+        } catch (Throwable t) {
+          future.setException(t);
         }
       }
     });
@@ -310,6 +311,6 @@ public class NonForwardQueryResultFileScanner implements 
NonForwardQueryResultSc
 
   @Override
   public Schema getLogicalSchema() {
-    return tableDesc.getLogicalSchema();
+    return scanNode.getOutSchema();
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java 
b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
index 6219e31..7939e97 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
@@ -64,6 +64,7 @@ import org.apache.tajo.session.Session;
 import org.apache.tajo.storage.*;
 import org.apache.tajo.tuple.memory.MemoryBlock;
 import org.apache.tajo.tuple.memory.MemoryRowBlock;
+import org.apache.tajo.util.KeyValueSet;
 import org.apache.tajo.util.ProtoUtil;
 import org.apache.tajo.worker.TaskAttemptContext;
 
@@ -72,6 +73,7 @@ import java.net.URI;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
 import static org.apache.tajo.exception.ReturnStateUtil.OK;
 import static org.apache.tajo.exception.ReturnStateUtil.errUndefinedDatabase;
@@ -280,37 +282,50 @@ public class QueryExecutor {
 
   public void execSimpleQuery(QueryContext queryContext, Session session, 
String query, LogicalPlan plan,
                               SubmitQueryResponse.Builder response) throws 
Exception {
-    ScanNode scanNode = plan.getRootBlock().getNode(NodeType.SCAN);
-    TableDesc desc = scanNode.getTableDesc();
 
-    if (desc.hasPartition()) {
+    ScanNode scanNode = plan.getRootBlock().getNode(NodeType.SCAN);
+    final TableDesc table = scanNode.getTableDesc();
+    if (table.hasPartition()) {
       scanNode = plan.getRootBlock().getNode(NodeType.PARTITIONS_SCAN);
     }
 
+    final TableDesc resultDesc = new TableDesc("", scanNode.getOutSchema(),
+        new TableMeta(BuiltinStorages.DRAW, table.getMeta().getOptions()), 
null);
+    resultDesc.setStats(new TableStats());
+
+    // push down limit
     int maxRow = Integer.MAX_VALUE;
     if (plan.getRootBlock().hasNode(NodeType.LIMIT)) {
       LimitNode limitNode = plan.getRootBlock().getNode(NodeType.LIMIT);
       maxRow = (int) limitNode.getFetchFirstNum();
       scanNode.setLimit(maxRow);
     }
-    if (desc.getStats().getNumRows() == 0) {
-      desc.getStats().setNumRows(TajoConstants.UNKNOWN_ROW_NUMBER);
+
+    // get the estimated number of rows
+    long estimatedRowNum;
+    if (table.getStats().getNumRows() == 0) {
+      estimatedRowNum = TajoConstants.UNKNOWN_ROW_NUMBER;
+    } else {
+      estimatedRowNum = table.getStats().getNumRows();
     }
+    estimatedRowNum = Math.min(estimatedRowNum, maxRow);
+    resultDesc.getStats().setNumRows(estimatedRowNum);
 
-    QueryInfo queryInfo = 
context.getQueryJobManager().createNewSimpleQuery(queryContext, session, query,
-        (LogicalRootNode) plan.getRootBlock().getRoot());
 
-    NonForwardQueryResultScanner queryResultScanner = new 
NonForwardQueryResultFileScanner(
-        context.getConf(), session.getSessionId(), queryInfo.getQueryId(), 
scanNode, desc, maxRow);
+    final QueryInfo queryInfo = 
context.getQueryJobManager().createNewSimpleQuery(queryContext, session, query,
+        plan.getRootBlock().getRoot());
 
+    final NonForwardQueryResultScanner queryResultScanner = new 
NonForwardQueryResultFileScanner(
+        context.getConf(), session.getSessionId(), queryInfo.getQueryId(), 
scanNode, maxRow);
     queryResultScanner.init();
+
     session.addNonForwardQueryResultScanner(queryResultScanner);
 
     response.setState(OK);
     response.setQueryId(queryInfo.getQueryId().getProto());
     response.setResultType(ResultType.ENCLOSED);
     response.setMaxRowNum(maxRow);
-    response.setTableDesc(desc.getProto());
+    response.setTableDesc(resultDesc.getProto());
   }
 
   public void execNonFromQuery(QueryContext queryContext, Session session, 
String query, LogicalPlan plan, SubmitQueryResponse.Builder responseBuilder)

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
 
b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
index 2efbfdd..029a9ac 100644
--- 
a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
@@ -134,7 +134,7 @@ public class QueryResultResource {
       }
 
       resultScanner = new 
NonForwardQueryResultFileScanner(masterContext.getConf(), 
session.getSessionId(), queryId,
-          scanNode, resultTableDesc, Integer.MAX_VALUE);
+          scanNode, Integer.MAX_VALUE);
       resultScanner.init();
       session.addNonForwardQueryResultScanner(resultScanner);
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java 
b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
index d29291e..c6d1fe3 100644
--- a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
+++ b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
@@ -19,32 +19,21 @@
 package org.apache.tajo.jdbc;
 
 import com.google.common.collect.Maps;
-import io.netty.channel.ConnectTimeoutException;
 import org.apache.tajo.*;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.client.QueryStatus;
-import org.apache.tajo.error.Errors;
-import org.apache.tajo.exception.SQLExceptionUtil;
-import org.apache.tajo.util.UriUtil;
 import org.junit.AfterClass;
-import org.junit.Assume;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
-import java.io.IOException;
 import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketTimeoutException;
 import java.sql.*;
 import java.util.*;
 
 import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
-import static 
org.apache.tajo.error.Errors.ResultCode.CLIENT_CONNECTION_EXCEPTION;
-import static 
org.apache.tajo.error.Errors.ResultCode.CLIENT_UNABLE_TO_ESTABLISH_CONNECTION;
 import static org.junit.Assert.*;
 
 @Category(IntegrationTest.class)
@@ -676,7 +665,7 @@ public class TestTajoJdbc extends QueryTestCaseBase {
     props.setProperty(SessionVars.BLOCK_ON_RESULT.keyname(), "false");
 
     Connection conn = new JdbcConnection(connUri, props);
-    PreparedStatement statement = conn.prepareStatement("select sleep(1) from 
lineitem");
+    PreparedStatement statement = conn.prepareStatement("select sleep(1) from 
lineitem where l_orderkey > 0");
     try {
       assertTrue("should have result set", statement.execute());
       TajoResultSetBase result = (TajoResultSetBase) statement.getResultSet();

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java
----------------------------------------------------------------------
diff --git 
a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java 
b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java
index 1050fc0..56755a5 100644
--- a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java
+++ b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java
@@ -191,7 +191,8 @@ public class TestTajoJdbcNegative extends QueryTestCaseBase 
{
 
     try (Statement stmt = conn.createStatement()) {
       try (ResultSet resultSet =
-               stmt.executeQuery("select fail(3, l_orderkey, 
'testQueryFailure') from default.lineitem")) {
+               stmt.executeQuery(
+                   "select fail(3, l_orderkey, 'testQueryFailure') from 
default.lineitem where l_orderkey > 0")) {
         fail("Failure must occur here.");
       } catch (SQLException s) {
         assertEquals(toSQLState(ResultCode.INTERNAL_ERROR), s.getSQLState());

http://git-wip-us.apache.org/repos/asf/tajo/blob/cd01b739/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java 
b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
index d722884..74cf546 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
@@ -98,7 +98,12 @@ public class PlannerUtil {
 
   /**
    * Checks whether the query is simple or not.
-   * The simple query can be defined as 'select * from tb_name [LIMIT X]'.
+   *
+   * The simple query can be as follows:
+   * <ul>
+   * <li><code>'select * from tb_name [LIMIT X]'</code></li>
+   * <li><code>'select length(name), name from tb_name [LIMIT X]'</code></li>
+   * </ul>
    *
    * @param plan The logical plan
    * @return True if the query is a simple query.
@@ -118,41 +123,12 @@ public class PlannerUtil {
         (plan.getRootBlock().hasNode(NodeType.SCAN) || 
plan.getRootBlock().hasNode(NodeType.PARTITIONS_SCAN)) &&
         PlannerUtil.getRelationLineage(plan.getRootBlock().getRoot()).length 
== 1;
 
-    boolean noComplexComputation = false;
     boolean partitionWhere = false;
     if (singleRelation) {
       ScanNode scanNode = plan.getRootBlock().getNode(NodeType.SCAN);
       if (scanNode == null) {
         scanNode = plan.getRootBlock().getNode(NodeType.PARTITIONS_SCAN);
       }
-      if (scanNode.hasTargets()) {
-        // If the number of columns in the select clause is s different from 
table schema,
-        // This query is not a simple query.
-        if (scanNode.getTableDesc().hasPartition()) {
-          // In the case of partitioned table, the actual number of columns is 
ScanNode.InSchema + partitioned columns
-          int numPartitionColumns = 
scanNode.getTableDesc().getPartitionMethod().getExpressionSchema().size();
-          if (scanNode.getTargets().length != scanNode.getInSchema().size() + 
numPartitionColumns) {
-            return false;
-          }
-        } else {
-          if (scanNode.getTargets().length != scanNode.getInSchema().size()) {
-            return false;
-          }
-        }
-        noComplexComputation = true;
-        for (int i = 0; i < scanNode.getTargets().length; i++) {
-          noComplexComputation =
-              noComplexComputation && 
scanNode.getTargets()[i].getEvalTree().getType() == EvalType.FIELD;
-          if (noComplexComputation) {
-            noComplexComputation = noComplexComputation &&
-                scanNode.getTargets()[i].getNamedColumn().equals(
-                    scanNode.getTableDesc().getLogicalSchema().getColumn(i));
-          }
-          if (!noComplexComputation) {
-            return noComplexComputation;
-          }
-        }
-      }
 
       if (!noWhere && scanNode.getTableDesc().hasPartition()) {
         EvalNode node = ((SelectionNode) 
plan.getRootBlock().getNode(NodeType.SELECTION)).getQual();
@@ -164,7 +140,7 @@ public class PlannerUtil {
     }
 
     return !checkIfDDLPlan(rootNode) &&
-        (simpleOperator && noComplexComputation && isOneQueryBlock &&
+        (simpleOperator && isOneQueryBlock &&
             noOrderBy && noGroupBy && (noWhere || partitionWhere) && noJoin && 
singleRelation);
   }
   

Reply via email to