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); }
