[ 
https://issues.apache.org/jira/browse/TAJO-1552?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14645704#comment-14645704
 ] 

ASF GitHub Bot commented on TAJO-1552:
--------------------------------------

Github user hyunsik commented on a diff in the pull request:

    https://github.com/apache/tajo/pull/655#discussion_r35738078
  
    --- Diff: 
tajo-core/src/test/java/org/apache/tajo/engine/planner/TestJoinOrderAlgorithm.java
 ---
    @@ -0,0 +1,184 @@
    +/**
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements.  See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership.  The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License.  You may obtain a copy of the License at
    + *
    + *     http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +
    +package org.apache.tajo.engine.planner;
    +
    +import org.apache.hadoop.fs.FileSystem;
    +import org.apache.hadoop.fs.Path;
    +import org.apache.tajo.LocalTajoTestingUtility;
    +import org.apache.tajo.TajoConstants;
    +import org.apache.tajo.TajoTestingCluster;
    +import org.apache.tajo.algebra.Expr;
    +import org.apache.tajo.catalog.*;
    +import org.apache.tajo.catalog.proto.CatalogProtos.StoreType;
    +import org.apache.tajo.catalog.statistics.TableStats;
    +import org.apache.tajo.common.TajoDataTypes.Type;
    +import org.apache.tajo.engine.function.FunctionLoader;
    +import org.apache.tajo.engine.parser.SQLAnalyzer;
    +import org.apache.tajo.engine.query.QueryContext;
    +import org.apache.tajo.plan.LogicalOptimizer;
    +import org.apache.tajo.plan.LogicalPlan;
    +import org.apache.tajo.plan.LogicalPlanner;
    +import org.apache.tajo.plan.logical.*;
    +import org.apache.tajo.plan.util.PlannerUtil;
    +import org.apache.tajo.storage.TablespaceManager;
    +import org.apache.tajo.util.CommonTestingUtil;
    +import org.apache.tajo.util.KeyValueSet;
    +import org.junit.AfterClass;
    +import org.junit.BeforeClass;
    +import org.junit.Test;
    +
    +import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
    +import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
    +import static org.junit.Assert.*;
    +
    +public class TestJoinOrderAlgorithm {
    +
    +  private static TajoTestingCluster util;
    +  private static CatalogService catalog;
    +  private static SQLAnalyzer sqlAnalyzer;
    +  private static LogicalPlanner planner;
    +  private static LogicalOptimizer optimizer;
    +  private static QueryContext defaultContext;
    +
    +  @BeforeClass
    +  public static void setUp() throws Exception {
    +    util = new TajoTestingCluster();
    +    util.startCatalogCluster();
    +    catalog = util.getMiniCatalogCluster().getCatalog();
    +    catalog.createTablespace(DEFAULT_TABLESPACE_NAME, 
"hdfs://localhost:1234/warehouse");
    +    catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
    +    for (FunctionDesc funcDesc : FunctionLoader.findLegacyFunctions()) {
    +      catalog.createFunction(funcDesc);
    +    }
    +
    +    Schema schema = new Schema();
    +    schema.addColumn("name", Type.TEXT);
    +    schema.addColumn("empid", Type.INT4);
    +    schema.addColumn("deptname", Type.TEXT);
    +
    +    Schema schema2 = new Schema();
    +    schema2.addColumn("deptname", Type.TEXT);
    +    schema2.addColumn("manager", Type.TEXT);
    +
    +    Schema schema3 = new Schema();
    +    schema3.addColumn("deptname", Type.TEXT);
    +    schema3.addColumn("score", Type.INT4);
    +    schema3.addColumn("phone", Type.INT4);
    +
    +    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
    +    TableDesc people = new TableDesc(
    +        CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, 
"employee"), schema, meta,
    +        CommonTestingUtil.getTestDir().toUri());
    +    catalog.createTable(people);
    +
    +    TableDesc student =
    +        new TableDesc(
    +            CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, "dept"), 
schema2, "TEXT", new KeyValueSet(),
    +            CommonTestingUtil.getTestDir().toUri());
    +    catalog.createTable(student);
    +
    +    TableDesc score =
    +        new TableDesc(
    +            CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, "score"), 
schema3, "TEXT", new KeyValueSet(),
    +            CommonTestingUtil.getTestDir().toUri());
    +    catalog.createTable(score);
    +
    +    
///////////////////////////////////////////////////////////////////////////
    +    // creating table for overflow in JoinOrderOptimizer.
    +    Schema schema4 = new Schema();
    +    schema4.addColumn("deptname", Type.TEXT);
    +    schema4.addColumn("manager", Type.TEXT);
    +    // Set store type as FAKEFILE to prevent auto update of physical 
information in LogicalPlanner.updatePhysicalInfo()
    +    TableMeta largeTableMeta = CatalogUtil.newTableMeta("FAKEFILE");
    +    TableDesc largeDept;
    +    TableStats largeTableStats;
    +    FileSystem fs = FileSystem.getLocal(util.getConfiguration());
    +    for (int i = 0; i < 6; i++) {
    +      Path tablePath = new Path(CommonTestingUtil.getTestDir(), "" + 
(i+1));
    +      fs.create(tablePath);
    +      largeDept =
    +          new TableDesc(
    +              CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, 
"large_dept"+(i+1)), schema4, largeTableMeta,
    +              tablePath.toUri());
    +      largeTableStats = new TableStats();
    +      largeTableStats.setNumBytes(1024L * 1024L * 1024L * 1024L *  1024L * 
(i+1));  //1 PB * i
    --- End diff --
    
    You may use StorageUnit.PB?


> NPE occurs when GreedyHeuristicJoinOrderAlgorithm.getCost() returns infinity.
> -----------------------------------------------------------------------------
>
>                 Key: TAJO-1552
>                 URL: https://issues.apache.org/jira/browse/TAJO-1552
>             Project: Tajo
>          Issue Type: Bug
>            Reporter: Hyoungjun Kim
>            Assignee: Hyoungjun Kim
>            Priority: Minor
>
> I tested TPC-DS Query28 but NPE occurs in GreedyHeuristicJoinOrderAlgorithm. 
> {code:sql}
> select *
> from (select avg(ss_list_price) B1_LP
>             ,count(ss_list_price) B1_CNT
>             ,count(distinct ss_list_price) B1_CNTD
>       from store_sales
>       where ss_quantity between 0 and 5
>         and (ss_list_price between 11 and 11+10
>              or ss_coupon_amt between 460 and 460+1000
>              or ss_wholesale_cost between 14 and 14+20)) B1,
>      (select avg(ss_list_price) B2_LP
>             ,count(ss_list_price) B2_CNT
>             ,count(distinct ss_list_price) B2_CNTD
>       from store_sales
>       where ss_quantity between 6 and 10
>         and (ss_list_price between 91 and 91+10
>           or ss_coupon_amt between 1430 and 1430+1000
>           or ss_wholesale_cost between 32 and 32+20)) B2,
>      (select avg(ss_list_price) B3_LP
>             ,count(ss_list_price) B3_CNT
>             ,count(distinct ss_list_price) B3_CNTD
>       from store_sales
>       where ss_quantity between 11 and 15
>         and (ss_list_price between 66 and 66+10
>           or ss_coupon_amt between 920 and 920+1000
>           or ss_wholesale_cost between 4 and 4+20)) B3,
>      (select avg(ss_list_price) B4_LP
>             ,count(ss_list_price) B4_CNT
>             ,count(distinct ss_list_price) B4_CNTD
>       from store_sales
>       where ss_quantity between 16 and 20
>         and (ss_list_price between 142 and 142+10
>           or ss_coupon_amt between 3054 and 3054+1000
>           or ss_wholesale_cost between 80 and 80+20)) B4,
>      (select avg(ss_list_price) B5_LP
>             ,count(ss_list_price) B5_CNT
>             ,count(distinct ss_list_price) B5_CNTD
>       from store_sales
>       where ss_quantity between 21 and 25
>         and (ss_list_price between 135 and 135+10
>           or ss_coupon_amt between 14180 and 14180+1000
>           or ss_wholesale_cost between 38 and 38+20)) B5,
>      (select avg(ss_list_price) B6_LP
>             ,count(ss_list_price) B6_CNT
>             ,count(distinct ss_list_price) B6_CNTD
>       from store_sales
>       where ss_quantity between 26 and 30
>         and (ss_list_price between 28 and 28+10
>           or ss_coupon_amt between 2513 and 2513+1000
>           or ss_wholesale_cost between 42 and 42+20)) B6
> limit 100;
> {code}
> {noformat}
> Stack Trace:
> java.lang.NullPointerException
>       at java.util.AbstractCollection.addAll(AbstractCollection.java:341)
>       at 
> org.apache.tajo.plan.joinorder.GreedyHeuristicJoinOrderAlgorithm.getBestPair(GreedyHeuristicJoinOrderAlgorithm.java:222)
>       at 
> org.apache.tajo.plan.joinorder.GreedyHeuristicJoinOrderAlgorithm.findBestOrder(GreedyHeuristicJoinOrderAlgorithm.java:109)
>       at 
> org.apache.tajo.plan.LogicalOptimizer.optimizeJoinOrder(LogicalOptimizer.java:117)
>       at 
> org.apache.tajo.plan.LogicalOptimizer.optimize(LogicalOptimizer.java:97)
>       at 
> org.apache.tajo.master.GlobalEngine.createLogicalPlan(GlobalEngine.java:278)
>       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}
> I researched GreedyHeuristicJoinOrderAlgorithm and found that NPE occurs when 
> getCost() returns infinity value.



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

Reply via email to