You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by ja...@apache.org on 2014/06/06 04:52:18 UTC

[01/23] git commit: Allow disabling of memory leak query termination using -Ddrill.exec.debug.error_on_leak=false

Repository: incubator-drill
Updated Branches:
  refs/heads/master 8490d7433 -> 3db1d5a32


Allow disabling of memory leak query termination using -Ddrill.exec.debug.error_on_leak=false


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/65b36e83
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/65b36e83
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/65b36e83

Branch: refs/heads/master
Commit: 65b36e83168507e9bd2ee62320deef08f6fb585c
Parents: 8490d74
Author: Jacques Nadeau <ja...@apache.org>
Authored: Tue Jun 3 17:02:38 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Tue Jun 3 17:04:41 2014 -0700

----------------------------------------------------------------------
 .../templates/StringOutputRecordWriter.java     |  9 ++-
 .../org/apache/drill/exec/ExecConstants.java    |  3 +-
 .../drill/exec/cache/local/LocalCache.java      |  2 +-
 .../apache/drill/exec/client/DrillClient.java   |  2 +-
 .../exec/client/PrintingResultsListener.java    |  6 +-
 .../drill/exec/client/QuerySubmitter.java       |  2 +-
 .../org/apache/drill/exec/memory/Accountor.java | 19 ++++--
 .../drill/exec/memory/AtomicRemainder.java      | 15 +++--
 .../drill/exec/memory/TopLevelAllocator.java    | 65 ++++++++++++--------
 .../drill/exec/physical/impl/ScanBatch.java     | 27 ++++----
 .../drill/exec/server/BootStrapContext.java     |  8 +--
 .../exec/store/easy/text/TextFormatPlugin.java  |  2 +-
 .../exec/store/text/DrillTextRecordWriter.java  | 18 ++++--
 .../src/main/resources/drill-module.conf        |  3 +-
 .../apache/drill/jdbc/DrillConnectionImpl.java  |  7 ++-
 15 files changed, 118 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java b/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java
index 506cace..7357246 100644
--- a/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java
+++ b/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java
@@ -26,6 +26,7 @@ import com.google.common.collect.Lists;
 import org.apache.drill.exec.expr.TypeHelper;
 import org.apache.drill.exec.expr.holders.*;
 import org.apache.drill.exec.memory.TopLevelAllocator;
+import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.record.BatchSchema;
 import org.apache.drill.exec.vector.*;
 
@@ -45,7 +46,11 @@ import java.util.Map;
 public abstract class StringOutputRecordWriter implements RecordWriter {
 
   private ValueVector[] columnVectors;
-
+  private final BufferAllocator allocator;
+  protected StringOutputRecordWriter(BufferAllocator allocator){
+    this.allocator = allocator;
+  }
+  
   public void updateSchema(BatchSchema schema) throws IOException {
     columnVectors = new ValueVector[schema.getFieldCount()];
 
@@ -57,7 +62,7 @@ public abstract class StringOutputRecordWriter implements RecordWriter {
     startNewSchema(columnNames);
 
     for (int i=0; i<columnVectors.length; i++) {
-      columnVectors[i] = TypeHelper.getNewVector(schema.getColumn(i), new TopLevelAllocator());
+      columnVectors[i] = TypeHelper.getNewVector(schema.getColumn(i), allocator);
       AllocationHelper.allocate(columnVectors[i], 1, TypeHelper.getSize(schema.getColumn(i).getType()));
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java
index e66e93c..1ece198 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java
@@ -74,6 +74,5 @@ public interface ExecConstants {
   public static final OptionValidator PARQUET_BLOCK_SIZE_VALIDATOR = new LongValidator(PARQUET_BLOCK_SIZE, 512*1024*1024);
   public static final String HTTP_ENABLE = "drill.exec.http.enabled";
   public static final String HTTP_PORT = "drill.exec.http.port";
-
-
+  public static final String ERROR_ON_MEMORY_LEAK = "drill.exec.debug.error_on_leak";
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/cache/local/LocalCache.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/cache/local/LocalCache.java b/exec/java-exec/src/main/java/org/apache/drill/exec/cache/local/LocalCache.java
index 1b44c6b..2f41c26 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/cache/local/LocalCache.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/cache/local/LocalCache.java
@@ -61,7 +61,7 @@ public class LocalCache implements DistributedCache {
   private volatile ConcurrentMap<Class<?>, DistributedMap<?>> maps;
   private volatile ConcurrentMap<Class<?>, DistributedMultiMap<?>> multiMaps;
   private volatile ConcurrentMap<String, Counter> counters;
-  private static final BufferAllocator allocator = new TopLevelAllocator();
+  private static final BufferAllocator allocator = new TopLevelAllocator(DrillConfig.create());
 
   private static final ObjectMapper mapper = DrillConfig.create().getMapper();
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java b/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
index 4755d32..9cd2cdd 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
@@ -94,7 +94,7 @@ public class DrillClient implements Closeable, ConnectionThrottle{
   public DrillClient(DrillConfig config, ClusterCoordinator coordinator, BufferAllocator allocator){
     this.ownsZkConnection = coordinator == null;
     this.ownsAllocator = allocator == null;
-    this.allocator = allocator == null ? new TopLevelAllocator(Long.MAX_VALUE) : allocator;
+    this.allocator = allocator == null ? new TopLevelAllocator(config) : allocator;
     this.config = config;
     this.clusterCoordinator = coordinator;
     this.reconnectTimes = config.getInt(ExecConstants.BIT_RETRY_TIMES);

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/client/PrintingResultsListener.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/client/PrintingResultsListener.java b/exec/java-exec/src/main/java/org/apache/drill/exec/client/PrintingResultsListener.java
index 0dfc45a..4a18149 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/client/PrintingResultsListener.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/client/PrintingResultsListener.java
@@ -20,6 +20,7 @@ package org.apache.drill.exec.client;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.drill.common.config.DrillConfig;
 import org.apache.drill.exec.client.QuerySubmitter.Format;
 import org.apache.drill.exec.exception.SchemaChangeException;
 import org.apache.drill.exec.memory.BufferAllocator;
@@ -38,10 +39,11 @@ public class PrintingResultsListener implements UserResultsListener {
   RecordBatchLoader loader;
   Format format;
   int    columnWidth;
-  BufferAllocator allocator = new TopLevelAllocator();
+  BufferAllocator allocator;
   volatile Exception exception;
 
-  public PrintingResultsListener(Format format, int columnWidth) {
+  public PrintingResultsListener(DrillConfig config, Format format, int columnWidth) {
+    this.allocator = new TopLevelAllocator(config);
     loader = new RecordBatchLoader(allocator);
     this.format = format;
     this.columnWidth = columnWidth;

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/client/QuerySubmitter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/client/QuerySubmitter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/client/QuerySubmitter.java
index 99e0c80..4153a24 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/client/QuerySubmitter.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/client/QuerySubmitter.java
@@ -187,7 +187,7 @@ public class QuerySubmitter {
     }
     Stopwatch watch = new Stopwatch();
     for (String query : queries) {
-      listener = new PrintingResultsListener(outputFormat, width);
+      listener = new PrintingResultsListener(client.getConfig(), outputFormat, width);
       watch.start();
       client.runQuery(queryType, query, listener);
       int rows = listener.await();

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java
index 624042e..257f6fc 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java
@@ -40,12 +40,14 @@ public class Accountor {
   private ConcurrentMap<ByteBuf, DebugStackTrace> buffers = Maps.newConcurrentMap();
   private final FragmentHandle handle;
   private Accountor parent;
+  private final boolean errorOnLeak;
 
-  public Accountor(FragmentHandle handle, Accountor parent, long max, long preAllocated) {
+  public Accountor(boolean errorOnLeak, FragmentHandle handle, Accountor parent, long max, long preAllocated) {
     // TODO: fix preallocation stuff
+    this.errorOnLeak = errorOnLeak;
     AtomicRemainder parentRemainder = parent != null ? parent.remainder : null;
     this.parent = parent;
-    this.remainder = new AtomicRemainder(parentRemainder, max, preAllocated);
+    this.remainder = new AtomicRemainder(errorOnLeak, parentRemainder, max, preAllocated);
     this.total = max;
     this.handle = handle;
     if (ENABLE_ACCOUNTING) {
@@ -103,7 +105,7 @@ public class Accountor {
       }
     }
   }
-  
+
   public void release(AccountingByteBuf buf, long size) {
     remainder.returnAllocation(size);
     if (ENABLE_ACCOUNTING) {
@@ -112,7 +114,7 @@ public class Accountor {
   }
 
   public void close() {
-     
+
     if (ENABLE_ACCOUNTING && !buffers.isEmpty()) {
       StringBuffer sb = new StringBuffer();
       sb.append("Attempted to close accountor with ");
@@ -148,13 +150,18 @@ public class Accountor {
         sb.append("at stack location:\n");
         entry.addToString(sb);
       }
+      IllegalStateException e = new IllegalStateException(sb.toString());
+      if(errorOnLeak){
+        throw e;
+      }else{
+        logger.warn("Memory leaked.", e);
+      }
 
-      throw new IllegalStateException(sb.toString());
 
     }
 
     remainder.close();
-    
+
   }
 
   public class DebugStackTrace {

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/memory/AtomicRemainder.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/AtomicRemainder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/AtomicRemainder.java
index 74849c2..1ae1e4c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/AtomicRemainder.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/AtomicRemainder.java
@@ -39,8 +39,10 @@ public class AtomicRemainder {
   private final long initShared;
   private final long initPrivate;
   private boolean closed = false;
+  private final boolean errorOnLeak;
 
-  public AtomicRemainder(AtomicRemainder parent, long max, long pre) {
+  public AtomicRemainder(boolean errorOnLeak, AtomicRemainder parent, long max, long pre) {
+    this.errorOnLeak = errorOnLeak;
     this.parent = parent;
     this.availableShared = new AtomicLong(max - pre);
     this.availablePrivate = new AtomicLong(pre);
@@ -160,11 +162,16 @@ public class AtomicRemainder {
       logger.warn("Tried to close remainder, but it has already been closed", new Exception());
       return;
     }
-    if (availablePrivate.get() != initPrivate || availableShared.get() != initShared)
-      throw new IllegalStateException(
+    if (availablePrivate.get() != initPrivate || availableShared.get() != initShared){
+      IllegalStateException e = new IllegalStateException(
           String
               .format(ERROR, initPrivate, availablePrivate.get(), initPrivate - availablePrivate.get(), initShared, availableShared.get(), initShared - availableShared.get()));
-    
+      if(errorOnLeak){
+        throw e;
+      }else{
+        logger.warn("Memory leaked during query.", e);
+      }
+    }
     if(parent != null) parent.returnAllocation(initPrivate);
     closed = true;
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java
index 836f593..6c4d44f 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java
@@ -39,18 +39,28 @@ public class TopLevelAllocator implements BufferAllocator {
   private final Set<ChildAllocator> children;
   private final PooledByteBufAllocatorL innerAllocator = PooledByteBufAllocatorL.DEFAULT;
   private final Accountor acct;
+  private final boolean errorOnLeak;
 
+  @Deprecated
   public TopLevelAllocator() {
     this(DrillConfig.getMaxDirectMemory());
   }
 
-  public TopLevelAllocator(DrillConfig config) {
-    this(Math.min(DrillConfig.getMaxDirectMemory(), config.getLong(ExecConstants.TOP_LEVEL_MAX_ALLOC)));
-  }
-  
+  @Deprecated
   public TopLevelAllocator(long maximumAllocation) {
-    this.acct = new Accountor(null, null, maximumAllocation, 0);
-    this.children = ENABLE_ACCOUNTING ? new HashSet<ChildAllocator>() : null; 
+    this(maximumAllocation, true);
+  }
+
+  private TopLevelAllocator(long maximumAllocation, boolean errorOnLeak){
+    this.errorOnLeak = errorOnLeak;
+    this.acct = new Accountor(errorOnLeak, null, null, maximumAllocation, 0);
+    this.children = ENABLE_ACCOUNTING ? new HashSet<ChildAllocator>() : null;
+  }
+
+  public TopLevelAllocator(DrillConfig config) {
+    this(Math.min(DrillConfig.getMaxDirectMemory(), config.getLong(ExecConstants.TOP_LEVEL_MAX_ALLOC)),
+        config.getBoolean(ExecConstants.ERROR_ON_MEMORY_LEAK)
+        );
   }
 
   public AccountingByteBuf buffer(int min, int max) {
@@ -60,7 +70,7 @@ public class TopLevelAllocator implements BufferAllocator {
     acct.reserved(min, wrapped);
     return wrapped;
   }
-  
+
   @Override
   public AccountingByteBuf buffer(int size) {
     return buffer(size, size);
@@ -98,7 +108,7 @@ public class TopLevelAllocator implements BufferAllocator {
     acct.close();
   }
 
-  
+
   private class ChildAllocator implements BufferAllocator{
 
     private Accountor childAcct;
@@ -108,23 +118,23 @@ public class TopLevelAllocator implements BufferAllocator {
 
     public ChildAllocator(FragmentHandle handle, Accountor parentAccountor, long max, long pre) throws OutOfMemoryException{
       assert max >= pre;
-      childAcct = new Accountor(handle, parentAccountor, max, pre);
+      childAcct = new Accountor(errorOnLeak, handle, parentAccountor, max, pre);
       this.handle = handle;
     }
-    
+
     @Override
     public AccountingByteBuf buffer(int size, int max) {
       if(!childAcct.reserve(size)){
         logger.warn("Unable to allocate buffer of size {} due to memory limit. Current allocation: {}", size, getAllocatedMemory());
         return null;
       };
-      
+
       ByteBuf buffer = innerAllocator.directBuffer(size, max);
       AccountingByteBuf wrapped = new AccountingByteBuf(childAcct, (PooledUnsafeDirectByteBufL) buffer);
       childAcct.reserved(buffer.capacity(), wrapped);
       return wrapped;
     }
-    
+
     public AccountingByteBuf buffer(int size) {
       return buffer(size, size);
     }
@@ -146,7 +156,7 @@ public class TopLevelAllocator implements BufferAllocator {
     }
 
     public PreAllocator getNewPreAllocator(){
-      return new PreAlloc(this.childAcct); 
+      return new PreAlloc(this.childAcct);
     }
 
     @Override
@@ -161,9 +171,16 @@ public class TopLevelAllocator implements BufferAllocator {
               sb.append(elements[i]);
               sb.append("\n");
             }
-            throw new IllegalStateException(String.format(
+
+
+            IllegalStateException e = new IllegalStateException(String.format(
                     "Failure while trying to close child allocator: Child level allocators not closed. Fragment %d:%d. Stack trace: \n %s",
                     handle.getMajorFragmentId(), handle.getMinorFragmentId(), sb.toString()));
+            if(errorOnLeak){
+              throw e;
+            }else{
+              logger.warn("Memory leak.", e);
+            }
           }
         }
       }
@@ -179,34 +196,34 @@ public class TopLevelAllocator implements BufferAllocator {
     public long getAllocatedMemory() {
       return childAcct.getAllocation();
     }
-    
+
   }
-  
+
   public PreAllocator getNewPreAllocator(){
-    return new PreAlloc(this.acct); 
+    return new PreAlloc(this.acct);
   }
-  
+
   public class PreAlloc implements PreAllocator{
     int bytes = 0;
     final Accountor acct;
     private PreAlloc(Accountor acct){
       this.acct = acct;
     }
-    
+
     /**
-     * 
+     *
      */
     public boolean preAllocate(int bytes){
-      
+
       if(!acct.reserve(bytes)){
         return false;
       }
       this.bytes += bytes;
       return true;
-   
+
     }
-    
-    
+
+
     public AccountingByteBuf getAllocation(){
       AccountingByteBuf b = new AccountingByteBuf(acct, (PooledUnsafeDirectByteBufL) innerAllocator.buffer(bytes));
       acct.reserved(bytes, b);

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java
index 7febb10..2914b67 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java
@@ -17,6 +17,8 @@
  */
 package org.apache.drill.exec.physical.impl;
 
+import io.netty.buffer.Unpooled;
+
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -30,6 +32,7 @@ import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.ExecConstants;
 import org.apache.drill.exec.exception.SchemaChangeException;
 import org.apache.drill.exec.expr.TypeHelper;
+import org.apache.drill.exec.expr.holders.NullableVarCharHolder;
 import org.apache.drill.exec.ops.FragmentContext;
 import org.apache.drill.exec.ops.OperatorContext;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
@@ -47,7 +50,6 @@ import org.apache.drill.exec.store.RecordReader;
 import org.apache.drill.exec.vector.AllocationHelper;
 import org.apache.drill.exec.vector.NullableVarCharVector;
 import org.apache.drill.exec.vector.ValueVector;
-import org.apache.drill.exec.vector.VarCharVector;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -160,15 +162,8 @@ public class ScanBatch implements RecordBatch {
     try {
       partitionVectors = Lists.newArrayList();
       for (int i : selectedPartitionColumns) {
-        MaterializedField field;
-        ValueVector v;
-        if (partitionValues.length > i) {
-          field = MaterializedField.create(SchemaPath.getSimplePath(partitionColumnDesignator + i), Types.required(MinorType.VARCHAR));
-          v = mutator.addField(field, VarCharVector.class);
-        } else {
-          field = MaterializedField.create(SchemaPath.getSimplePath(partitionColumnDesignator + i), Types.optional(MinorType.VARCHAR));
-          v = mutator.addField(field, NullableVarCharVector.class);
-        }
+        MaterializedField field = MaterializedField.create(SchemaPath.getSimplePath(partitionColumnDesignator + i), Types.optional(MinorType.VARCHAR));
+        ValueVector v = mutator.addField(field, NullableVarCharVector.class);
         partitionVectors.add(v);
       }
     } catch(SchemaChangeException e) {
@@ -179,12 +174,18 @@ public class ScanBatch implements RecordBatch {
   private void populatePartitionVectors() {
     for (int i : selectedPartitionColumns) {
       if (partitionValues.length > i) {
-        VarCharVector v = (VarCharVector) partitionVectors.get(i);
+        NullableVarCharVector v = (NullableVarCharVector) partitionVectors.get(i);
         String val = partitionValues[i];
-        byte[] bytes = val.getBytes();
         AllocationHelper.allocate(v, recordCount, val.length());
+        NullableVarCharHolder h = new NullableVarCharHolder();
+        byte[] bytes = val.getBytes();
+        h.buffer = Unpooled.buffer(bytes.length);
+        h.buffer.writeBytes(bytes);
+        h.start = 0;
+        h.isSet = 1;
+        h.end = bytes.length;
         for (int j = 0; j < recordCount; j++) {
-          v.getMutator().setSafe(j, bytes);
+          v.getMutator().setSafe(j, h);
         }
         v.getMutator().setValueCount(recordCount);
       } else {

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java
index 016d328..4261885 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java
@@ -31,20 +31,20 @@ import com.codahale.metrics.MetricRegistry;
 
 public class BootStrapContext implements Closeable{
   static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(BootStrapContext.class);
-  
+
   private final DrillConfig config;
   private final NioEventLoopGroup loop;
   private final NioEventLoopGroup loop2;
   private final MetricRegistry metrics;
   private final BufferAllocator allocator;
-  
+
   public BootStrapContext(DrillConfig config) {
     super();
     this.config = config;
     this.loop = new NioEventLoopGroup(config.getInt(ExecConstants.BIT_SERVER_RPC_THREADS), new NamedThreadFactory("BitServer-"));
     this.loop2 = new NioEventLoopGroup(config.getInt(ExecConstants.BIT_SERVER_RPC_THREADS), new NamedThreadFactory("BitClient-"));
     this.metrics = new MetricRegistry();
-    this.allocator = new TopLevelAllocator();
+    this.allocator = new TopLevelAllocator(config);
   }
 
   public DrillConfig getConfig() {
@@ -71,5 +71,5 @@ public class BootStrapContext implements Closeable{
     loop.shutdownGracefully();
     allocator.close();
   }
-  
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
index cd28d30..15d2e37 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
@@ -90,7 +90,7 @@ public class TextFormatPlugin extends EasyFormatPlugin<TextFormatPlugin.TextForm
 
     options.put("extension", ((TextFormatConfig)getConfig()).getExtensions().get(0));
 
-    RecordWriter recordWriter = new DrillTextRecordWriter();
+    RecordWriter recordWriter = new DrillTextRecordWriter(context.getAllocator());
     recordWriter.init(options);
 
     return recordWriter;

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordWriter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordWriter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordWriter.java
index b6840f8..55f2b72 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordWriter.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordWriter.java
@@ -17,18 +17,20 @@
  */
 package org.apache.drill.exec.store.text;
 
-import com.google.common.base.Joiner;
-import org.apache.drill.exec.store.StringOutputRecordWriter;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.drill.exec.memory.BufferAllocator;
+import org.apache.drill.exec.store.StringOutputRecordWriter;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+
+import com.google.common.base.Joiner;
+
 public class DrillTextRecordWriter extends StringOutputRecordWriter {
   static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillTextRecordWriter.class);
 
@@ -47,6 +49,10 @@ public class DrillTextRecordWriter extends StringOutputRecordWriter {
   private boolean fRecordStarted = false; // true once the startRecord() is called until endRecord() is called
   private StringBuilder currentRecord; // contains the current record separated by field delimiter
 
+  public DrillTextRecordWriter(BufferAllocator allocator){
+    super(allocator);
+  }
+
   @Override
   public void init(Map<String, String> writerOptions) throws IOException {
     this.location = writerOptions.get("location");

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/java-exec/src/main/resources/drill-module.conf
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/resources/drill-module.conf b/exec/java-exec/src/main/resources/drill-module.conf
index f8396bb..982f43f 100644
--- a/exec/java-exec/src/main/resources/drill-module.conf
+++ b/exec/java-exec/src/main/resources/drill-module.conf
@@ -134,5 +134,6 @@ drill.exec: {
       max: 20000000000,
       initial: 20000000
     }
-  }
+  },
+  debug.error_on_leak: true
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/65b36e83/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
index 337477e..224d59f 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
@@ -60,11 +60,12 @@ abstract class DrillConnectionImpl extends AvaticaConnection implements org.apac
     super(driver, factory, url, info);
     this.config = new DrillConnectionConfig(info);
 
-  this.allocator = new TopLevelAllocator();
+
 
     try{
       if(config.isLocal()){
         DrillConfig dConfig = DrillConfig.create();
+        this.allocator = new TopLevelAllocator(dConfig);
         RemoteServiceSet set = GlobalServiceSetReference.SETS.get();
         if(set == null){
           // we're embedded, start a local drill bit.
@@ -83,7 +84,9 @@ abstract class DrillConnectionImpl extends AvaticaConnection implements org.apac
         this.client = new DrillClient(dConfig, set.getCoordinator());
         this.client.connect(null, info);
       }else{
-        this.client = new DrillClient(DrillConfig.createClient());
+        DrillConfig dConfig = DrillConfig.createClient();
+        this.allocator = new TopLevelAllocator(dConfig);
+        this.client = new DrillClient();
         this.client.connect(config.getZookeeperConnectionString(), info);
       }
     }catch(RpcException e){


[11/23] git commit: Disable TPCH13 due to flapping ioob

Posted by ja...@apache.org.
Disable TPCH13 due to flapping ioob


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/2f098639
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/2f098639
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/2f098639

Branch: refs/heads/master
Commit: 2f098639e73c6cddbc31f9fc1867281c409938a8
Parents: 61dea89
Author: Jacques Nadeau <ja...@apache.org>
Authored: Wed Jun 4 21:29:27 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 21:29:27 2014 -0700

----------------------------------------------------------------------
 .../src/test/java/org/apache/drill/TestTpchDistributed.java         | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/2f098639/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java b/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
index c388b3b..4b1cf2a 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
@@ -92,6 +92,7 @@ public class TestTpchDistributed extends BaseTestQuery{
   }
 
   @Test
+  @Ignore // flapping ioob
   public void tpch13() throws Exception{
     testDistributed("queries/tpch/13.sql");
   }


[23/23] git commit: disable failing time stamp conversion on linux

Posted by ja...@apache.org.
disable failing time stamp conversion on linux


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/3db1d5a3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/3db1d5a3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/3db1d5a3

Branch: refs/heads/master
Commit: 3db1d5a320ab089b27ac189e114ff87a7d4492e5
Parents: 56a34fd
Author: Jacques Nadeau <ja...@apache.org>
Authored: Thu Jun 5 19:19:10 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 19:19:10 2014 -0700

----------------------------------------------------------------------
 .../drill/jdbc/test/TestFunctionsQuery.java     | 24 ++------------------
 1 file changed, 2 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/3db1d5a3/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
index b5ca0b5..082aca4 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
@@ -17,35 +17,14 @@
  */
 package org.apache.drill.jdbc.test;
 
-import java.lang.Exception;
 import java.nio.file.Paths;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.Statement;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.drill.common.util.TestTools;
-import org.apache.drill.exec.expr.fn.impl.DateUtility;
-import org.apache.drill.exec.store.hive.HiveTestDataGenerator;
+
 import org.apache.drill.jdbc.Driver;
-import org.apache.drill.jdbc.JdbcTest;
 import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
-import org.joda.time.format.DateTimeFormatterBuilder;
-import org.joda.time.format.DateTimeParser;
-import org.junit.Assert;
-import org.junit.BeforeClass;
 import org.junit.Ignore;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
-
-import com.google.common.base.Function;
-import com.google.common.base.Stopwatch;
 
 public class TestFunctionsQuery {
 
@@ -488,6 +467,7 @@ public class TestFunctionsQuery {
   }
 
   @Test
+  @Ignore
   public void testToTimeStamp() throws Exception {
     String query = "select to_timestamp(cast('800120400.12312' as decimal(38, 5))) as DEC38_TS, to_timestamp(200120400) as INT_TS " +
         "from cp.`employee.json` where employee_id < 2";


[20/23] git commit: Turn off invalid project push down tests until DRILL-912 is fixed.

Posted by ja...@apache.org.
Turn off invalid project push down tests until DRILL-912 is fixed.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/9601d833
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/9601d833
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/9601d833

Branch: refs/heads/master
Commit: 9601d8334970dbc873edf3b13c419ae10f804410
Parents: 163219c
Author: Jacques Nadeau <ja...@apache.org>
Authored: Thu Jun 5 11:09:35 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 11:09:35 2014 -0700

----------------------------------------------------------------------
 .../src/test/java/org/apache/drill/TestProjectPushDown.java      | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/9601d833/exec/java-exec/src/test/java/org/apache/drill/TestProjectPushDown.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestProjectPushDown.java b/exec/java-exec/src/test/java/org/apache/drill/TestProjectPushDown.java
index 13bb1ac..d6c92e0 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestProjectPushDown.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestProjectPushDown.java
@@ -31,6 +31,7 @@ public class TestProjectPushDown extends PlanTestBase {
       .getLogger(TestProjectPushDown.class);
 
   @Test
+  @Ignore
   public void testGroupBy() throws Exception {
     String expectedColNames = " \"columns\" : [ \"`marital_status`\" ]";
     testPhysicalPlan(
@@ -39,6 +40,7 @@ public class TestProjectPushDown extends PlanTestBase {
   }
 
   @Test
+  @Ignore
   public void testOrderBy() throws Exception {
     String expectedColNames = "\"columns\" : [ \"`employee_id`\", \"`full_name`\", \"`first_name`\", \"`last_name`\" ]";
     testPhysicalPlan("select employee_id , full_name, first_name , last_name "
@@ -47,6 +49,7 @@ public class TestProjectPushDown extends PlanTestBase {
   }
 
   @Test
+  @Ignore
   public void testExprInSelect() throws Exception {
     String expectedColNames = "\"columns\" : [ \"`employee_id`\", \"`full_name`\", \"`first_name`\", \"`last_name`\" ]";
     testPhysicalPlan(
@@ -56,6 +59,7 @@ public class TestProjectPushDown extends PlanTestBase {
   }
 
   @Test
+  @Ignore
   public void testExprInWhere() throws Exception {
     String expectedColNames = "\"columns\" : [ \"`employee_id`\", \"`full_name`\", \"`first_name`\", \"`last_name`\" ]";
     testPhysicalPlan(


[08/23] git commit: Small fix to date casting function. Make cartesian join infinite cost (not supported yet). Enable additional running TPCH queries.

Posted by ja...@apache.org.
Small fix to date casting function.  Make cartesian join infinite cost (not supported yet).  Enable additional running TPCH queries.


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

Branch: refs/heads/master
Commit: c7bdf57e5fb5ae09acb653265427bdac80d55ed4
Parents: 9d3f95d
Author: Jacques Nadeau <ja...@apache.org>
Authored: Wed Jun 4 18:50:28 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 18:57:51 2014 -0700

----------------------------------------------------------------------
 .../drill/exec/expr/fn/impl/DateUtility.java    |  9 ++++---
 .../exec/planner/common/DrillJoinRelBase.java   | 26 +++++++++++---------
 .../org/apache/drill/TestTpchDistributed.java   | 12 +++------
 .../java/org/apache/drill/TestTpchExplain.java  |  8 ++----
 .../org/apache/drill/TestTpchSingleMode.java    |  9 ++-----
 .../src/test/resources/queries/tpch/15.sql      |  2 +-
 6 files changed, 30 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/c7bdf57e/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/DateUtility.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/DateUtility.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/DateUtility.java
index 0967fb8..d668df2 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/DateUtility.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/DateUtility.java
@@ -19,10 +19,13 @@
 package org.apache.drill.exec.expr.fn.impl;
 
 import java.util.HashMap;
-import org.joda.time.format.DateTimeFormatter;
+
 import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeParser;
+import org.joda.time.format.DateTimeFormatter;
 import org.joda.time.format.DateTimeFormatterBuilder;
+import org.joda.time.format.DateTimeParser;
+
+import com.carrotsearch.hppc.ObjectIntOpenHashMap;
 
 // Utility class for Date, DateTime, TimeStamp, Interval data types
 public class DateUtility {
@@ -33,7 +36,7 @@ public class DateUtility {
      * reconstruct the timestamp, we use this index to index through the array timezoneList
      * and get the corresponding timezone and pass it to joda-time
      */
-    public static HashMap<String, Integer> timezoneMap = new HashMap<String, Integer>();
+    public static ObjectIntOpenHashMap<String> timezoneMap = new ObjectIntOpenHashMap<String>();
 
     public static String[] timezoneList =  {"Africa/Abidjan",
                                             "Africa/Accra",

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/c7bdf57e/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillJoinRelBase.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillJoinRelBase.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillJoinRelBase.java
index b9c112d..80f767c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillJoinRelBase.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillJoinRelBase.java
@@ -17,27 +17,21 @@
  */
 package org.apache.drill.exec.planner.common;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
-import org.apache.drill.common.expression.LogicalExpression;
-import org.apache.drill.common.logical.data.NamedExpression;
-import org.apache.drill.exec.planner.logical.DrillOptiq;
-import org.apache.drill.exec.planner.logical.DrillParseContext;
+import org.apache.drill.exec.planner.cost.DrillCostBase.DrillCostFactory;
 import org.eigenbase.rel.InvalidRelException;
 import org.eigenbase.rel.JoinRelBase;
 import org.eigenbase.rel.JoinRelType;
 import org.eigenbase.rel.RelNode;
-import org.eigenbase.relopt.Convention;
 import org.eigenbase.relopt.RelOptCluster;
 import org.eigenbase.relopt.RelOptCost;
 import org.eigenbase.relopt.RelOptPlanner;
 import org.eigenbase.relopt.RelTraitSet;
 import org.eigenbase.reltype.RelDataType;
 import org.eigenbase.rex.RexNode;
-import org.eigenbase.util.Pair;
 
 import com.google.common.collect.Lists;
 
@@ -52,8 +46,18 @@ public abstract class DrillJoinRelBase extends JoinRelBase implements DrillRelNo
       JoinRelType joinType) throws InvalidRelException {
     super(cluster, traits, left, right, condition, joinType, Collections.<String> emptySet());
   }
-  
-  
+
+  @Override
+  public RelOptCost computeSelfCost(RelOptPlanner planner) {
+    if(condition.isAlwaysTrue()){
+      return ((DrillCostFactory)planner.getCostFactory()).makeInfiniteCost();
+    }
+    return super.computeSelfCost(planner);
+  }
+
+
+
+
   /**
    * Returns whether there are any elements in common between left and right.
    */
@@ -68,11 +72,11 @@ public abstract class DrillJoinRelBase extends JoinRelBase implements DrillRelNo
   protected static <T> boolean isUnique(List<T> list) {
     return new HashSet<>(list).size() == list.size();
   }
-  
+
   public List<Integer> getLeftKeys() {
     return this.leftKeys;
   }
-  
+
   public List<Integer> getRightKeys() {
     return this.rightKeys;
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/c7bdf57e/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java b/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
index 5f33f51..c388b3b 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
@@ -45,7 +45,7 @@ public class TestTpchDistributed extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-534
+  @Ignore
   public void tpch04() throws Exception{
     testDistributed("queries/tpch/04.sql");
   }
@@ -66,13 +66,11 @@ public class TestTpchDistributed extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-516
   public void tpch08() throws Exception{
     testDistributed("queries/tpch/08.sql");
   }
 
   @Test
-  @Ignore // DRILL-516
   public void tpch09() throws Exception{
     testDistributed("queries/tpch/09.sql");
   }
@@ -94,7 +92,6 @@ public class TestTpchDistributed extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-548 flapping test: issues with writerIndex.
   public void tpch13() throws Exception{
     testDistributed("queries/tpch/13.sql");
   }
@@ -105,7 +102,7 @@ public class TestTpchDistributed extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // requires views.
+  @Ignore // non-equality join
   public void tpch15() throws Exception{
     testDistributed("queries/tpch/15.sql");
   }
@@ -116,7 +113,7 @@ public class TestTpchDistributed extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-517
+  @Ignore // non-equality join
   public void tpch17() throws Exception{
     testDistributed("queries/tpch/17.sql");
   }
@@ -127,13 +124,12 @@ public class TestTpchDistributed extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-519
+  @Ignore // non-equality join
   public void tpch19() throws Exception{
     testDistributed("queries/tpch/19.sql");
   }
 
   @Test
-  @Ignore // DRILL-517
   public void tpch20() throws Exception{
     testDistributed("queries/tpch/20.sql");
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/c7bdf57e/exec/java-exec/src/test/java/org/apache/drill/TestTpchExplain.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestTpchExplain.java b/exec/java-exec/src/test/java/org/apache/drill/TestTpchExplain.java
index c64f330..68b65e9 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestTpchExplain.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestTpchExplain.java
@@ -64,19 +64,16 @@ public class TestTpchExplain extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-516
   public void tpch07() throws Exception{
     doExplain("queries/tpch/07.sql");
   }
 
   @Test
-  @Ignore // DRILL-516
   public void tpch08() throws Exception{
     doExplain("queries/tpch/08.sql");
   }
 
   @Test
-  @Ignore // DRILL-516
   public void tpch09() throws Exception{
     doExplain("queries/tpch/09.sql");
   }
@@ -108,7 +105,7 @@ public class TestTpchExplain extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // requires views.
+  @Ignore // non equality join
   public void tpch15() throws Exception{
     doExplain("queries/tpch/15.sql");
   }
@@ -119,7 +116,7 @@ public class TestTpchExplain extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-517
+  @Ignore // non-equality join
   public void tpch17() throws Exception{
     doExplain("queries/tpch/17.sql");
   }
@@ -136,7 +133,6 @@ public class TestTpchExplain extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-517
   public void tpch20() throws Exception{
     doExplain("queries/tpch/20.sql");
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/c7bdf57e/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java b/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java
index d1ea910..edada65 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java
@@ -49,7 +49,6 @@ public class TestTpchSingleMode extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-534
   public void tpch04() throws Exception{
     testSingleMode("queries/tpch/04.sql");
   }
@@ -70,13 +69,11 @@ public class TestTpchSingleMode extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-516
   public void tpch08() throws Exception{
     testSingleMode("queries/tpch/08.sql");
   }
 
   @Test
-  @Ignore // DRILL-516
   public void tpch09() throws Exception{
     testSingleMode("queries/tpch/09.sql");
   }
@@ -98,7 +95,6 @@ public class TestTpchSingleMode extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-548 flapping test: issues with writerIndex.
   public void tpch13() throws Exception{
     testSingleMode("queries/tpch/13.sql");
   }
@@ -109,7 +105,7 @@ public class TestTpchSingleMode extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // Fails with CannotPlanException
+  @Ignore //
   public void tpch15() throws Exception{
     testSingleMode("queries/tpch/15.sql");
   }
@@ -120,7 +116,7 @@ public class TestTpchSingleMode extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-517
+  @Ignore //
   public void tpch17() throws Exception{
     testSingleMode("queries/tpch/17.sql");
   }
@@ -137,7 +133,6 @@ public class TestTpchSingleMode extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-517
   public void tpch20() throws Exception{
     testSingleMode("queries/tpch/20.sql");
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/c7bdf57e/exec/java-exec/src/test/resources/queries/tpch/15.sql
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/queries/tpch/15.sql b/exec/java-exec/src/test/resources/queries/tpch/15.sql
index 0ffa896..dff842d 100644
--- a/exec/java-exec/src/test/resources/queries/tpch/15.sql
+++ b/exec/java-exec/src/test/resources/queries/tpch/15.sql
@@ -1,5 +1,5 @@
 -- tpch15 using 1395599672 as a seed to the RNG
-use dfs.`default`; -- views can only be created in dfs schema
+use dfs.tmp; -- views can only be created in dfs schema
 
 create view revenue0 (supplier_no, total_revenue) as
   select


[03/23] git commit: Update projection pushdown so that it rewrites row type of scan.

Posted by ja...@apache.org.
Update projection pushdown so that it rewrites row type of scan.


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

Branch: refs/heads/master
Commit: cec3fa559bab9a1378fc17b96294373325db72c1
Parents: 69e5d68
Author: Jacques Nadeau <ja...@apache.org>
Authored: Wed Jun 4 15:43:29 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 16:38:42 2014 -0700

----------------------------------------------------------------------
 .../exec/store/hbase/HBaseStoragePlugin.java    |   4 +-
 .../planner/logical/DrillPushProjIntoScan.java  |  27 ++-
 .../drill/exec/planner/physical/PrelUtil.java   | 172 +++++++++++++++++--
 .../planner/physical/visitor/RelUniqifier.java  |   4 +-
 .../exec/store/dfs/easy/EasyFormatPlugin.java   |   2 +
 .../exec/store/dfs/easy/EasyGroupScan.java      |   3 +-
 .../exec/store/direct/DirectGroupScan.java      |   2 +-
 .../exec/store/easy/json/JSONFormatPlugin.java  |   5 +
 .../exec/store/easy/text/TextFormatPlugin.java  |   5 +
 .../apache/drill/exec/store/hive/HiveScan.java  |   2 +-
 .../java/org/apache/drill/PlanTestBase.java     |   2 +-
 .../exec/cache/TestCacheSerialization.java      |   2 +-
 .../exec/physical/impl/writer/TestWriter.java   |  17 +-
 13 files changed, 206 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
----------------------------------------------------------------------
diff --git a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
index 7bc7c4b..e105836 100644
--- a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
+++ b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
@@ -76,7 +76,9 @@ public class HBaseStoragePlugin extends AbstractStoragePlugin {
   }
 
   public Set<StoragePluginOptimizerRule> getOptimizerRules() {
-    return ImmutableSet.of(HBasePushFilterIntoScan.INSTANCE);
+    return ImmutableSet.of();
+//     reenable once DRILL-904 is fixed
+//    return ImmutableSet.of(HBasePushFilterIntoScan.INSTANCE);
   }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjIntoScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjIntoScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjIntoScan.java
index 0dd9b9e..829eb14 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjIntoScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjIntoScan.java
@@ -24,12 +24,15 @@ import java.util.List;
 import net.hydromatic.optiq.rules.java.JavaRules.EnumerableTableAccessRel;
 
 import org.apache.drill.common.exceptions.DrillRuntimeException;
-import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.exec.planner.physical.PrelUtil;
+import org.apache.drill.exec.planner.physical.PrelUtil.ProjectPushInfo;
 import org.eigenbase.rel.ProjectRel;
 import org.eigenbase.rel.rules.RemoveTrivialProjectRule;
 import org.eigenbase.relopt.RelOptRule;
 import org.eigenbase.relopt.RelOptRuleCall;
+import org.eigenbase.rex.RexNode;
+
+import com.google.common.collect.Lists;
 
 public class DrillPushProjIntoScan extends RelOptRule {
   public static final RelOptRule INSTANCE = new DrillPushProjIntoScan();
@@ -38,31 +41,37 @@ public class DrillPushProjIntoScan extends RelOptRule {
     super(RelOptHelper.some(ProjectRel.class, RelOptHelper.any(EnumerableTableAccessRel.class)), "DrillPushProjIntoScan");
   }
 
+
   @Override
   public void onMatch(RelOptRuleCall call) {
     final ProjectRel proj = (ProjectRel) call.rel(0);
     final EnumerableTableAccessRel scan = (EnumerableTableAccessRel) call.rel(1);
 
     try {
-      List<SchemaPath> columns = PrelUtil.getColumns(scan.getRowType(), proj.getProjects());
+      ProjectPushInfo columnInfo = PrelUtil.getColumns(scan.getRowType(), proj.getProjects());
 
-      if (columns.isEmpty() || !scan.getTable().unwrap(DrillTable.class)
-          .getGroupScan().canPushdownProjects(columns)) {
-        return;
-      }
+      if(columnInfo == null || columnInfo.isStarQuery() //
+          || !scan.getTable().unwrap(DrillTable.class) //
+          .getGroupScan().canPushdownProjects(columnInfo.columns)) return;
 
       final DrillScanRel newScan =
           new DrillScanRel(scan.getCluster(),
               scan.getTraitSet().plus(DrillRel.DRILL_LOGICAL),
               scan.getTable(),
-              scan.getRowType(),
-              columns);
+              columnInfo.createNewRowType(proj.getChild().getCluster().getTypeFactory()),
+              columnInfo.columns);
+
+
+      List<RexNode> newProjects = Lists.newArrayList();
+      for(RexNode n : proj.getChildExps()){
+        newProjects.add(n.accept(columnInfo.getInputRewriter()));
+      }
 
       final DrillProjectRel newProj =
           new DrillProjectRel(proj.getCluster(),
               proj.getTraitSet().plus(DrillRel.DRILL_LOGICAL),
               newScan,
-              proj.getChildExps(),
+              newProjects,
               proj.getRowType());
 
       if (RemoveTrivialProjectRule.isTrivial(newProj)) {

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PrelUtil.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PrelUtil.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PrelUtil.java
index 1de2db3..d982647 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PrelUtil.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PrelUtil.java
@@ -31,8 +31,6 @@ import org.apache.drill.common.expression.PathSegment.ArraySegment;
 import org.apache.drill.common.expression.PathSegment.NameSegment;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.data.Order.Ordering;
-import org.apache.drill.exec.physical.base.PhysicalOperator;
-import org.apache.drill.exec.physical.config.SelectionVectorRemover;
 import org.apache.drill.exec.planner.physical.DrillDistributionTrait.DistributionField;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 import org.eigenbase.rel.RelCollation;
@@ -43,14 +41,19 @@ import org.eigenbase.relopt.RelOptPlanner;
 import org.eigenbase.relopt.RelOptRuleCall;
 import org.eigenbase.relopt.RelTraitSet;
 import org.eigenbase.reltype.RelDataType;
+import org.eigenbase.reltype.RelDataTypeFactory;
+import org.eigenbase.reltype.RelDataTypeField;
 import org.eigenbase.rex.RexCall;
 import org.eigenbase.rex.RexInputRef;
 import org.eigenbase.rex.RexLiteral;
+import org.eigenbase.rex.RexLocalRef;
 import org.eigenbase.rex.RexNode;
+import org.eigenbase.rex.RexShuttle;
 import org.eigenbase.rex.RexVisitorImpl;
 
-import com.google.common.collect.Lists;
+import com.carrotsearch.hppc.IntIntOpenHashMap;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
 public class PrelUtil {
@@ -109,34 +112,124 @@ public class PrelUtil {
     return new SelectionVectorRemoverPrel(prel);
   }
 
-  public static List<SchemaPath> getColumns(RelDataType rowType, List<RexNode> projects) {
+  public static ProjectPushInfo getColumns(RelDataType rowType, List<RexNode> projects) {
     final List<String> fieldNames = rowType.getFieldNames();
-    if (fieldNames.isEmpty()) return ImmutableList.of();
+    if (fieldNames.isEmpty()) return null;
 
-    RefFieldsVisitor v = new RefFieldsVisitor(fieldNames);
+    RefFieldsVisitor v = new RefFieldsVisitor(rowType);
     for (RexNode exp : projects) {
       PathSegment segment = exp.accept(v);
       v.addColumn(segment);
     }
 
-    List<SchemaPath> columns = v.getColumns();
-    for (SchemaPath column : columns) {
-      if (column.getRootSegment().getPath().startsWith("*")) {
-        return ImmutableList.of();
+    return v.getInfo();
+
+  }
+
+  public static class DesiredField {
+    public final int origIndex;
+    public final String name;
+    public final RelDataTypeField field;
+
+    public DesiredField(int origIndex, String name, RelDataTypeField field) {
+      super();
+      this.origIndex = origIndex;
+      this.name = name;
+      this.field = field;
+    }
+
+    @Override
+    public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((field == null) ? 0 : field.hashCode());
+      result = prime * result + ((name == null) ? 0 : name.hashCode());
+      result = prime * result + origIndex;
+      return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (this == obj)
+        return true;
+      if (obj == null)
+        return false;
+      if (getClass() != obj.getClass())
+        return false;
+      DesiredField other = (DesiredField) obj;
+      if (field == null) {
+        if (other.field != null)
+          return false;
+      } else if (!field.equals(other.field))
+        return false;
+      if (name == null) {
+        if (other.name != null)
+          return false;
+      } else if (!name.equals(other.name))
+        return false;
+      if (origIndex != other.origIndex)
+        return false;
+      return true;
+    }
+
+  }
+
+
+  public static class ProjectPushInfo {
+    public final List<SchemaPath> columns;
+    public final List<DesiredField> desiredFields;
+    public final InputRewriter rewriter;
+    private final List<String> fieldNames;
+    private final List<RelDataType> types;
+
+    public ProjectPushInfo(List<SchemaPath> columns, ImmutableList<DesiredField> desiredFields) {
+      super();
+      this.columns = columns;
+      this.desiredFields = desiredFields;
+
+      this.fieldNames = Lists.newArrayListWithCapacity(desiredFields.size());
+      this.types = Lists.newArrayListWithCapacity(desiredFields.size());
+      IntIntOpenHashMap oldToNewIds = new IntIntOpenHashMap();
+
+      int i =0;
+      for(DesiredField f : desiredFields){
+        fieldNames.add(f.name);
+        types.add(f.field.getType());
+        oldToNewIds.put(f.origIndex, i);
+        i++;
+      }
+      this.rewriter = new InputRewriter(oldToNewIds);
+    }
+
+    public InputRewriter getInputRewriter(){
+      return rewriter;
+    }
+
+    public boolean isStarQuery() {
+      for (SchemaPath column : columns) {
+        if (column.getRootSegment().getPath().startsWith("*")) {
+          return true;
+        }
       }
+      return false;
     }
 
-    return columns;
+    public RelDataType createNewRowType(RelDataTypeFactory factory) {
+      return factory.createStructType(types, fieldNames);
+    }
   }
 
   /** Visitor that finds the set of inputs that are used. */
   private static class RefFieldsVisitor extends RexVisitorImpl<PathSegment> {
     final Set<SchemaPath> columns = Sets.newLinkedHashSet();
     final private List<String> fieldNames;
+    final private List<RelDataTypeField> fields;
+    final private Set<DesiredField> desiredFields = Sets.newHashSet();
 
-    public RefFieldsVisitor(List<String> fieldNames) {
+    public RefFieldsVisitor(RelDataType rowType) {
       super(true);
-      this.fieldNames = fieldNames;
+      this.fieldNames = rowType.getFieldNames();
+      this.fields = rowType.getFieldList();
     }
 
     public void addColumn(PathSegment segment) {
@@ -145,13 +238,19 @@ public class PrelUtil {
       }
     }
 
-    public List<SchemaPath> getColumns() {
-      return ImmutableList.copyOf(columns);
+    public ProjectPushInfo getInfo(){
+      return new ProjectPushInfo(ImmutableList.copyOf(columns), ImmutableList.copyOf(desiredFields));
     }
 
+
     @Override
     public PathSegment visitInputRef(RexInputRef inputRef) {
-      return new NameSegment(fieldNames.get(inputRef.getIndex()));
+      int index = inputRef.getIndex();
+      String name = fieldNames.get(index);
+      RelDataTypeField field = fields.get(index);
+      DesiredField f = new DesiredField(index, name, field);
+      desiredFields.add(f);
+      return new NameSegment(name);
     }
 
     @Override
@@ -196,4 +295,45 @@ public class PrelUtil {
       return set;
     }
   }
+
+  public static class InputRefRemap {
+    private int oldIndex;
+    private int newIndex;
+
+    public InputRefRemap(int oldIndex, int newIndex) {
+      super();
+      this.oldIndex = oldIndex;
+      this.newIndex = newIndex;
+    }
+    public int getOldIndex() {
+      return oldIndex;
+    }
+    public int getNewIndex() {
+      return newIndex;
+    }
+
+
+  }
+
+
+  public static class InputRewriter extends RexShuttle {
+
+    final IntIntOpenHashMap map;
+
+    public InputRewriter(IntIntOpenHashMap map) {
+      super();
+      this.map = map;
+    }
+
+    @Override
+    public RexNode visitInputRef(RexInputRef inputRef) {
+      return new RexInputRef(map.get(inputRef.getIndex()), inputRef.getType());
+    }
+
+    @Override
+    public RexNode visitLocalRef(RexLocalRef localRef) {
+      return new RexInputRef(map.get(localRef.getIndex()), localRef.getType());
+    }
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RelUniqifier.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RelUniqifier.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RelUniqifier.java
index 7b84edc..c5bf293 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RelUniqifier.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RelUniqifier.java
@@ -23,8 +23,8 @@ import java.util.Set;
 import org.apache.drill.exec.planner.physical.Prel;
 import org.eigenbase.rel.RelNode;
 
-import com.google.hive12.hive12.common.collect.Sets;
-import com.google.hive12.hive12.hive12.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Lists;
 
 public class RelUniqifier extends BasePrelVisitor<Prel, Set<Prel>, RuntimeException>{
   static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(RelUniqifier.class);

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyFormatPlugin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyFormatPlugin.java
index e702c9c..bdab07f 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyFormatPlugin.java
@@ -97,6 +97,8 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
     return name;
   }
 
+  public abstract boolean supportsPushDown();
+
   /**
    * Whether or not you can split the format based on blocks within file boundaries. If not, the simple format engine will
    * only split on file boundaries.

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
index 2b63601..fa219e7 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
@@ -224,6 +224,7 @@ public class EasyGroupScan extends AbstractGroupScan{
 
   @Override
   public GroupScan clone(List<SchemaPath> columns) {
+    if(!formatPlugin.supportsPushDown()) throw new IllegalStateException(String.format("%s doesn't support pushdown.", this.getClass().getSimpleName()));
     EasyGroupScan newScan = new EasyGroupScan(this);
     newScan.columns = columns;
     return newScan;
@@ -231,7 +232,7 @@ public class EasyGroupScan extends AbstractGroupScan{
 
   @JsonIgnore
   public boolean canPushdownProjects(List<SchemaPath> columns) {
-    return true;
+    return this.formatPlugin.supportsPushDown();
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java
index 138a024..bcf5984 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java
@@ -72,7 +72,7 @@ public class DirectGroupScan extends AbstractGroupScan{
   @Override
   public PhysicalOperator getNewWithChildren(List<PhysicalOperator> children) throws ExecutionSetupException {
     assert children == null || children.isEmpty();
-    return new DirectSubScan(reader);
+    return new DirectGroupScan(reader);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONFormatPlugin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONFormatPlugin.java
index e410306..7fbb9c7 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONFormatPlugin.java
@@ -93,5 +93,10 @@ public class JSONFormatPlugin extends EasyFormatPlugin<JSONFormatConfig> {
     throw new UnsupportedOperationException();
   }
 
+  @Override
+  public boolean supportsPushDown() {
+    return false;
+  }
+
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
index 15d2e37..3935008 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
@@ -140,4 +140,9 @@ public class TextFormatPlugin extends EasyFormatPlugin<TextFormatPlugin.TextForm
   public int getWriterOperatorType() {
     return CoreOperatorType.TEXT_WRITER_VALUE;
   }
+
+  @Override
+  public boolean supportsPushDown() {
+    return true;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/main/java/org/apache/drill/exec/store/hive/HiveScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/hive/HiveScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/hive/HiveScan.java
index c6105ec..504348d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/hive/HiveScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/hive/HiveScan.java
@@ -268,7 +268,7 @@ public class HiveScan extends AbstractGroupScan {
 
   @Override
   public PhysicalOperator getNewWithChildren(List<PhysicalOperator> children) throws ExecutionSetupException {
-    return new HiveScan(hiveReadEntry, storagePlugin, columns);
+    return new HiveScan(this);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java b/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java
index 89452a1..6331116 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java
@@ -52,7 +52,7 @@ public class PlanTestBase extends BaseTestQuery {
     String planStr = getPlanInString(sql, JSON_FORMAT);
 
     for (String colNames : expectedSubstrs) {
-      assertTrue(planStr.contains(colNames));
+      assertTrue(String.format("Unable to find expected string %s in plan: %s!", colNames, planStr), planStr.contains(colNames));
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestCacheSerialization.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestCacheSerialization.java b/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestCacheSerialization.java
index 6375d66..fec3417 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestCacheSerialization.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestCacheSerialization.java
@@ -55,7 +55,7 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 import com.google.common.collect.Lists;
-import com.google.hive12.common.collect.Maps;
+import com.google.common.collect.Maps;
 
 public class TestCacheSerialization extends ExecTest {
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/cec3fa55/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java
index 8d9a74d..2a6eb39 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java
@@ -17,14 +17,15 @@
  */
 package org.apache.drill.exec.physical.impl.writer;
 
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
 import org.apache.drill.BaseTestQuery;
-import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.util.FileUtils;
 import org.apache.drill.exec.ExecConstants;
 import org.apache.drill.exec.record.RecordBatchLoader;
-import org.apache.drill.exec.record.TypedFieldId;
 import org.apache.drill.exec.rpc.user.QueryResultBatch;
 import org.apache.drill.exec.vector.BigIntVector;
 import org.apache.drill.exec.vector.VarCharVector;
@@ -33,12 +34,11 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
 
 public class TestWriter extends BaseTestQuery {
 
@@ -53,6 +53,7 @@ public class TestWriter extends BaseTestQuery {
     fs = FileSystem.get(conf);
   }
 
+  @Ignore("DRILL-903")
   @Test
   public void simpleCsv() throws Exception {
     // before executing the test deleting the existing CSV files in /tmp/csvtest


[21/23] git commit: disable multiphase aggregate by default

Posted by ja...@apache.org.
disable multiphase aggregate by default


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/188aeed7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/188aeed7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/188aeed7

Branch: refs/heads/master
Commit: 188aeed7261597d1ed091ee4284f06117bad0333
Parents: 9601d83
Author: Jacques Nadeau <ja...@apache.org>
Authored: Thu Jun 5 15:45:06 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 15:45:06 2014 -0700

----------------------------------------------------------------------
 .../org/apache/drill/exec/planner/physical/PlannerSettings.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/188aeed7/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java
index ad9fa90..2325e2f 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java
@@ -30,14 +30,14 @@ public class PlannerSettings implements FrameworkContext{
   private int numEndPoints = 0;
   private boolean useDefaultCosting = false; // True: use default Optiq costing, False: use Drill costing
 
-  public static final int MAX_BROADCAST_THRESHOLD = Integer.MAX_VALUE; 
+  public static final int MAX_BROADCAST_THRESHOLD = Integer.MAX_VALUE;
 
   public static final OptionValidator EXCHANGE = new BooleanValidator("planner.disable_exchanges", false);
   public static final OptionValidator HASHAGG = new BooleanValidator("planner.enable_hashagg", true);
   public static final OptionValidator STREAMAGG = new BooleanValidator("planner.enable_streamagg", true);
   public static final OptionValidator HASHJOIN = new BooleanValidator("planner.enable_hashjoin", true);
   public static final OptionValidator MERGEJOIN = new BooleanValidator("planner.enable_mergejoin", true);
-  public static final OptionValidator MULTIPHASE = new BooleanValidator("planner.enable_multiphase_agg", true);
+  public static final OptionValidator MULTIPHASE = new BooleanValidator("planner.enable_multiphase_agg", false);
   public static final OptionValidator BROADCAST = new BooleanValidator("planner.enable_broadcast_join", true);
   public static final OptionValidator BROADCAST_THRESHOLD = new PositiveLongValidator("planner.broadcast_threshold", MAX_BROADCAST_THRESHOLD, 10000);
 


[04/23] git commit: DRILL-575: Modify rpad, lpad functions in DrillOptiq to add default padding parameter if one isn't specified.

Posted by ja...@apache.org.
DRILL-575: Modify rpad, lpad functions in DrillOptiq to add default padding parameter if one isn't specified.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/9d3f95df
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/9d3f95df
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/9d3f95df

Branch: refs/heads/master
Commit: 9d3f95dfe2d227e9dc60e79bf7065d443e19cb3a
Parents: 3168986
Author: Mehant Baid <me...@gmail.com>
Authored: Wed Jun 4 13:09:58 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 16:39:22 2014 -0700

----------------------------------------------------------------------
 .../apache/drill/exec/planner/logical/DrillOptiq.java |  7 +++++++
 .../apache/drill/jdbc/test/TestFunctionsQuery.java    | 14 ++++++++++++++
 2 files changed, 21 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/9d3f95df/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java
index 8966f18..3576622 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java
@@ -329,6 +329,13 @@ public class DrillOptiq {
       } else if ((functionName.equals("convert_from") || functionName.equals("convert_to"))
                     && args.get(1) instanceof QuotedString) {
         return FunctionCallFactory.createConvert(functionName, ((QuotedString)args.get(1)).value, args.get(0), ExpressionPosition.UNKNOWN);
+      } else if ((functionName.equalsIgnoreCase("rpad")) || functionName.equalsIgnoreCase("lpad")) {
+        // If we have only two arguments for rpad/lpad append a default QuotedExpression as an argument which will be used to pad the string
+        if (args.size() == 2) {
+          String spaceFill = " ";
+          LogicalExpression fill = ValueExpressions.getChar(spaceFill);
+          args.add(fill);
+        }
       }
 
       return FunctionCallFactory.createExpression(functionName, args);

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/9d3f95df/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
index ac1b289..c8f0d85 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
@@ -501,4 +501,18 @@ public class TestFunctionsQuery {
             "DEC38_TS=" + f.print(result1)+ "; " +
             "INT_TS=" + f.print(result2) + "\n");
   }
+
+  @Test
+  public void testPadFunctions() throws Exception {
+    String query = "select rpad(first_name, 10) as RPAD_DEF, rpad(first_name, 10, '*') as RPAD_STAR, lpad(first_name, 10) as LPAD_DEF, lpad(first_name, 10, '*') as LPAD_STAR " +
+        "from cp.`employee.json` where employee_id = 1";
+
+    JdbcAssert.withNoDefaultSchema()
+        .sql(query)
+        .returns(
+            "RPAD_DEF=Sheri     ; " +
+            "RPAD_STAR=Sheri*****; " +
+            "LPAD_DEF=     Sheri; " +
+            "LPAD_STAR=*****Sheri\n");
+  }
 }


[18/23] git commit: DRILL-574: Fix RPAD to truncate from right, when desired length is smaller than input length.

Posted by ja...@apache.org.
DRILL-574: Fix RPAD to truncate from right, when desired length is smaller than input length.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/393adee7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/393adee7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/393adee7

Branch: refs/heads/master
Commit: 393adee7e441cb5b03b4489e1497282c68ffbf52
Parents: 1726d73
Author: Mehant Baid <me...@gmail.com>
Authored: Thu Jun 5 00:22:42 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 09:37:04 2014 -0700

----------------------------------------------------------------------
 .../org/apache/drill/exec/expr/fn/impl/StringFunctions.java   | 6 +++---
 .../apache/drill/exec/physical/impl/TestStringFunctions.java  | 2 +-
 .../java/org/apache/drill/jdbc/test/TestFunctionsQuery.java   | 7 +++++--
 3 files changed, 9 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/393adee7/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StringFunctions.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StringFunctions.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StringFunctions.java
index cebe491..8d792fa 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StringFunctions.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/StringFunctions.java
@@ -627,10 +627,10 @@ public class StringFunctions{
         out.start = text.start;
         out.end = text.end;
       } else if (length.value < textCharCount) {
-        //case 3: truncate text on left side, by (textCharCount - length.value) chars. 
+        //case 3: truncate text on the right side. It's same as substring(text, 1, length).
         out.buffer = text.buffer;
-        out.start = org.apache.drill.exec.expr.fn.impl.StringFunctionUtil.getUTF8CharPosition(text.buffer, text.start, text.end, (int) (textCharCount - length.value));
-        out.end = text.end;
+        out.start = text.start;
+        out.end = org.apache.drill.exec.expr.fn.impl.StringFunctionUtil.getUTF8CharPosition(text.buffer, text.start, text.end, (int)length.value);
       } else if (length.value > textCharCount) {        
         //case 4: copy "text" into "out", then copy "fill" on the right.
         out.buffer = buffer;

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/393adee7/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestStringFunctions.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestStringFunctions.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestStringFunctions.java
index cd310b2..51aa633 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestStringFunctions.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestStringFunctions.java
@@ -222,7 +222,7 @@ public class TestStringFunctions extends ExecTest {
   @Test
   public void testRpad(@Injectable final DrillbitContext bitContext,
                            @Injectable UserServer.UserClientConnection connection) throws Throwable{
-    Object [] expected = new Object[] {"", "", "abcdef", "ef", "ef", "abcdef", "abcdefAAAA", "abcdefABAB", "abcdefABCA", "abcdefABCD"};
+    Object [] expected = new Object[] {"", "", "abcdef", "ab", "ab", "abcdef", "abcdefAAAA", "abcdefABAB", "abcdefABCA", "abcdefABCD"};
 
     runTest(bitContext, connection, expected, "functions/string/testRpad.json");
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/393adee7/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
index c8f0d85..b5ca0b5 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
@@ -504,7 +504,8 @@ public class TestFunctionsQuery {
 
   @Test
   public void testPadFunctions() throws Exception {
-    String query = "select rpad(first_name, 10) as RPAD_DEF, rpad(first_name, 10, '*') as RPAD_STAR, lpad(first_name, 10) as LPAD_DEF, lpad(first_name, 10, '*') as LPAD_STAR " +
+    String query = "select rpad(first_name, 10) as RPAD_DEF, rpad(first_name, 10, '*') as RPAD_STAR, lpad(first_name, 10) as LPAD_DEF, lpad(first_name, 10, '*') as LPAD_STAR, " +
+        "lpad(first_name, 2) as LPAD_TRUNC, rpad(first_name, 2) as RPAD_TRUNC " +
         "from cp.`employee.json` where employee_id = 1";
 
     JdbcAssert.withNoDefaultSchema()
@@ -513,6 +514,8 @@ public class TestFunctionsQuery {
             "RPAD_DEF=Sheri     ; " +
             "RPAD_STAR=Sheri*****; " +
             "LPAD_DEF=     Sheri; " +
-            "LPAD_STAR=*****Sheri\n");
+            "LPAD_STAR=*****Sheri; " +
+            "LPAD_TRUNC=Sh; " +
+            "RPAD_TRUNC=Sh\n");
   }
 }


[16/23] git commit: Enable FragmentExecutor to catch assertion errors and return to client.

Posted by ja...@apache.org.
Enable FragmentExecutor to catch assertion errors and return to client.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/3f21451e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/3f21451e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/3f21451e

Branch: refs/heads/master
Commit: 3f21451e9cb9d9303afc933a7767a1c774234991
Parents: e62c365
Author: Jacques Nadeau <ja...@apache.org>
Authored: Thu Jun 5 09:36:21 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 09:36:21 2014 -0700

----------------------------------------------------------------------
 .../java/org/apache/drill/exec/work/fragment/FragmentExecutor.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/3f21451e/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java
index 11685c0..4474f3f 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java
@@ -113,7 +113,7 @@ public class FragmentExecutor implements Runnable, CancelableQuery, StatusProvid
       closed = true;
 
       context.close();
-    }catch(Exception ex){
+    }catch(AssertionError | Exception ex){
       logger.debug("Caught exception while running fragment", ex);
       internalFail(ex);
     }finally{


[14/23] git commit: DRILL-869: ExprParser fails when operators have space in name.

Posted by ja...@apache.org.
DRILL-869: ExprParser fails when operators have space in name.


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

Branch: refs/heads/master
Commit: c6c3cd581f7ec845bf8b21ce1c776e2fecbab291
Parents: 21a3283
Author: vkorukanti <ve...@gmail.com>
Authored: Fri May 30 10:31:38 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 09:35:02 2014 -0700

----------------------------------------------------------------------
 .../org/apache/drill/common/expression/FunctionCallFactory.java  | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/c6c3cd58/common/src/main/java/org/apache/drill/common/expression/FunctionCallFactory.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/drill/common/expression/FunctionCallFactory.java b/common/src/main/java/org/apache/drill/common/expression/FunctionCallFactory.java
index 6e8e0f4..b619fd8 100644
--- a/common/src/main/java/org/apache/drill/common/expression/FunctionCallFactory.java
+++ b/common/src/main/java/org/apache/drill/common/expression/FunctionCallFactory.java
@@ -58,8 +58,12 @@ public class FunctionCallFactory {
     opToFuncTable.put("<>", "not_equal");
     opToFuncTable.put(">=", "greater_than_or_equal_to");
     opToFuncTable.put("<=", "less_than_or_equal_to");
+    opToFuncTable.put("is null", "isnull");
     opToFuncTable.put("is not null", "isnotnull");
     opToFuncTable.put("is true", "istrue");
+    opToFuncTable.put("is not true", "isnottrue");
+    opToFuncTable.put("is false", "isfalse");
+    opToFuncTable.put("is not false", "isnotfalse");
     
     opToFuncTable.put("!", "not");
     opToFuncTable.put("u-", "negative");


[12/23] git commit: DRILL-904: Fixes in project push down are causing HBase Filter pushdown to plan indefinitely.

Posted by ja...@apache.org.
DRILL-904: Fixes in project push down are causing HBase Filter pushdown to plan indefinitely.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/6c8ce4f3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/6c8ce4f3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/6c8ce4f3

Branch: refs/heads/master
Commit: 6c8ce4f3642db2d29a10a3c0ca29e2a1e266b2da
Parents: 2f09863
Author: Aditya Kishore <ad...@maprtech.com>
Authored: Thu Jun 5 02:50:01 2014 -0700
Committer: Aditya Kishore <ad...@maprtech.com>
Committed: Thu Jun 5 02:50:01 2014 -0700

----------------------------------------------------------------------
 .../java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java   | 1 +
 .../org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java    | 4 +---
 2 files changed, 2 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/6c8ce4f3/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java
----------------------------------------------------------------------
diff --git a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java
index c7187ba..e5a5fcc 100644
--- a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java
+++ b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java
@@ -123,6 +123,7 @@ public class HBaseGroupScan extends AbstractGroupScan implements DrillHBaseConst
     this.storagePlugin = that.storagePlugin;
     this.storagePluginConfig = that.storagePluginConfig;
     this.hTableDesc = that.hTableDesc;
+    this.filterPushedDown = that.filterPushedDown;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/6c8ce4f3/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
----------------------------------------------------------------------
diff --git a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
index e105836..7bc7c4b 100644
--- a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
+++ b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
@@ -76,9 +76,7 @@ public class HBaseStoragePlugin extends AbstractStoragePlugin {
   }
 
   public Set<StoragePluginOptimizerRule> getOptimizerRules() {
-    return ImmutableSet.of();
-//     reenable once DRILL-904 is fixed
-//    return ImmutableSet.of(HBasePushFilterIntoScan.INSTANCE);
+    return ImmutableSet.of(HBasePushFilterIntoScan.INSTANCE);
   }
 
 }
\ No newline at end of file


[05/23] git commit: DRILL-758: Implement to_timestamp that accepts seconds from epoch as input.

Posted by ja...@apache.org.
DRILL-758: Implement to_timestamp that accepts seconds from epoch as input.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/3168986b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/3168986b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/3168986b

Branch: refs/heads/master
Commit: 3168986b77504daf91018f654db9f5e065e755f6
Parents: 61fc5ea
Author: Mehant Baid <me...@gmail.com>
Authored: Wed Jun 4 11:11:07 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 16:39:22 2014 -0700

----------------------------------------------------------------------
 .../ToTimeStampFunction.java                    | 76 ++++++++++++++++++++
 .../drill/jdbc/test/TestFunctionsQuery.java     | 21 ++++++
 2 files changed, 97 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/3168986b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/ToTimeStampFunction.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/ToTimeStampFunction.java b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/ToTimeStampFunction.java
new file mode 100644
index 0000000..9195891
--- /dev/null
+++ b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/ToTimeStampFunction.java
@@ -0,0 +1,76 @@
+/**
+ * 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.
+ */
+
+import org.apache.drill.exec.expr.annotations.Workspace;
+
+<@pp.dropOutputFile />
+
+<#list numericTypes.numeric as numerics>
+
+<@pp.changeOutputFile name="/org/apache/drill/exec/expr/fn/impl/G${numerics}ToTimeStamp.java" />
+
+<#include "/@includes/license.ftl" />
+
+package org.apache.drill.exec.expr.fn.impl;
+
+import org.apache.drill.exec.expr.DrillSimpleFunc;
+import org.apache.drill.exec.expr.annotations.FunctionTemplate;
+import org.apache.drill.exec.expr.annotations.FunctionTemplate.NullHandling;
+import org.apache.drill.exec.expr.annotations.Output;
+import org.apache.drill.exec.expr.annotations.Workspace;
+import org.apache.drill.exec.expr.annotations.Param;
+import org.apache.drill.exec.expr.holders.*;
+import org.apache.drill.exec.record.RecordBatch;
+
+// This class is generated using freemarker template ToTimeStampFunction.java
+
+@FunctionTemplate(name = "to_timestamp" , scope = FunctionTemplate.FunctionScope.SIMPLE, nulls = NullHandling.NULL_IF_NULL)
+public class G${numerics}ToTimeStamp implements DrillSimpleFunc {
+
+
+    @Param  ${numerics}Holder left;
+    <#if numerics.startsWith("Decimal")>
+    @Workspace java.math.BigInteger millisConstant;
+    </#if>
+    @Output TimeStampHolder out;
+
+    public void setup(RecordBatch b) {
+      <#if numerics.startsWith("Decimal")>
+      millisConstant = java.math.BigInteger.valueOf(1000);
+      </#if>
+    }
+
+    public void eval() {
+        long inputMillis = 0;
+
+        <#if (numerics.startsWith("Decimal"))>
+        <#if (numerics == "Decimal9") || (numerics == "Decimal18")>
+        java.math.BigInteger value = java.math.BigInteger.valueOf(left.value);
+        value = value.multiply(millisConstant);
+        inputMillis = (new java.math.BigDecimal(value, left.scale)).longValue();
+        <#elseif (numerics == "Decimal28Sparse") || (numerics == "Decimal38Sparse")>
+        java.math.BigDecimal input = org.apache.drill.common.util.DecimalUtility.getBigDecimalFromSparse(left.buffer, left.start, left.nDecimalDigits, left.scale);
+        inputMillis = input.multiply(new java.math.BigDecimal(1000)).longValue();
+        </#if>
+        <#else>
+        inputMillis = (long) (left.value * 1000l);
+        </#if>
+        out.value = new org.joda.time.DateTime(inputMillis).withZoneRetainFields(org.joda.time.DateTimeZone.UTC).getMillis();
+    }
+}
+</#list>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/3168986b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
index 0dacfa3..ac1b289 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
@@ -27,9 +27,16 @@ import java.sql.Statement;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.drill.common.util.TestTools;
+import org.apache.drill.exec.expr.fn.impl.DateUtility;
 import org.apache.drill.exec.store.hive.HiveTestDataGenerator;
 import org.apache.drill.jdbc.Driver;
 import org.apache.drill.jdbc.JdbcTest;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.DateTimeFormatterBuilder;
+import org.joda.time.format.DateTimeParser;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
@@ -480,4 +487,18 @@ public class TestFunctionsQuery {
             "SIGN_INT=1\n");
   }
 
+  @Test
+  public void testToTimeStamp() throws Exception {
+    String query = "select to_timestamp(cast('800120400.12312' as decimal(38, 5))) as DEC38_TS, to_timestamp(200120400) as INT_TS " +
+        "from cp.`employee.json` where employee_id < 2";
+
+    DateTime result1 = new DateTime(800120400123l);
+    DateTime result2 = new DateTime(200120400000l);
+    DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ");
+    JdbcAssert.withNoDefaultSchema()
+        .sql(query)
+        .returns(
+            "DEC38_TS=" + f.print(result1)+ "; " +
+            "INT_TS=" + f.print(result2) + "\n");
+  }
 }


[13/23] git commit: DRILL-903: Cleanup exising ValueVectors before allocating new ones in StringOutputRecordWriter.updateSchema.

Posted by ja...@apache.org.
DRILL-903: Cleanup exising ValueVectors before allocating new ones in StringOutputRecordWriter.updateSchema.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/21a32838
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/21a32838
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/21a32838

Branch: refs/heads/master
Commit: 21a32838af08480ac470745f2e73e9d1041f4b74
Parents: 6c8ce4f
Author: vkorukanti <ve...@gmail.com>
Authored: Thu Jun 5 09:05:10 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 09:34:54 2014 -0700

----------------------------------------------------------------------
 .../codegen/templates/StringOutputRecordWriter.java     | 12 ++++++++++--
 .../drill/exec/physical/impl/writer/TestWriter.java     |  1 -
 2 files changed, 10 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/21a32838/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java b/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java
index 7357246..9f0d701 100644
--- a/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java
+++ b/exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java
@@ -52,6 +52,7 @@ public abstract class StringOutputRecordWriter implements RecordWriter {
   }
   
   public void updateSchema(BatchSchema schema) throws IOException {
+    cleanupColumnVectors();
     columnVectors = new ValueVector[schema.getFieldCount()];
 
     List<String> columnNames = Lists.newArrayList();
@@ -129,9 +130,16 @@ public abstract class StringOutputRecordWriter implements RecordWriter {
 </#list>
 
   public void cleanup() throws IOException {
+    cleanupColumnVectors();
+  }
+
+  private void cleanupColumnVectors() {
     if (columnVectors != null){
-      for(ValueVector vector : columnVectors)
-        if (vector != null) vector.clear();
+      for(ValueVector vector : columnVectors){
+        if(vector!=null){
+          vector.clear();
+        }
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/21a32838/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java
index 2a6eb39..65843a6 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java
@@ -53,7 +53,6 @@ public class TestWriter extends BaseTestQuery {
     fs = FileSystem.get(conf);
   }
 
-  @Ignore("DRILL-903")
   @Test
   public void simpleCsv() throws Exception {
     // before executing the test deleting the existing CSV files in /tmp/csvtest


[17/23] git commit: Support multiple output batches for hash aggr.

Posted by ja...@apache.org.
Support multiple output batches for hash aggr.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/1726d734
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/1726d734
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/1726d734

Branch: refs/heads/master
Commit: 1726d734a8e7e90cdb12ad092c0b79eb6e4f3cb2
Parents: 3f21451
Author: Aman Sinha <as...@maprtech.com>
Authored: Thu May 15 16:41:24 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 09:36:38 2014 -0700

----------------------------------------------------------------------
 .../physical/impl/aggregate/HashAggBatch.java   |  24 +--
 .../impl/aggregate/HashAggTemplate.java         | 173 +++++++++++++++----
 .../physical/impl/aggregate/HashAggregator.java |   5 +
 .../exec/physical/impl/common/HashTable.java    |   2 +-
 .../physical/impl/common/HashTableTemplate.java |  16 ++
 .../apache/drill/exec/record/RecordBatch.java   |   4 +-
 6 files changed, 174 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1726d734/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java
index d2800bd..4478938 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java
@@ -18,18 +18,13 @@
 package org.apache.drill.exec.physical.impl.aggregate;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
 import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.common.expression.ErrorCollector;
 import org.apache.drill.common.expression.ErrorCollectorImpl;
-import org.apache.drill.common.expression.ExpressionPosition;
-import org.apache.drill.common.expression.FunctionCall;
 import org.apache.drill.common.expression.LogicalExpression;
 import org.apache.drill.common.logical.data.NamedExpression;
-import org.apache.drill.common.types.TypeProtos;
 import org.apache.drill.exec.compile.sig.GeneratorMapping;
 import org.apache.drill.exec.compile.sig.MappingSet;
 import org.apache.drill.exec.exception.ClassTransformationException;
@@ -39,11 +34,8 @@ import org.apache.drill.exec.expr.ClassGenerator;
 import org.apache.drill.exec.expr.ClassGenerator.BlockType;
 import org.apache.drill.exec.expr.ClassGenerator.HoldingContainer;
 import org.apache.drill.exec.expr.ExpressionTreeMaterializer;
-import org.apache.drill.exec.expr.HoldingContainerExpression;
 import org.apache.drill.exec.expr.TypeHelper;
 import org.apache.drill.exec.expr.ValueVectorWriteExpression;
-import org.apache.drill.exec.expr.holders.IntHolder;
-import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.ops.FragmentContext;
 import org.apache.drill.exec.physical.config.HashAggregate;
 import org.apache.drill.exec.record.AbstractRecordBatch;
@@ -51,17 +43,12 @@ import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 import org.apache.drill.exec.record.MaterializedField;
 import org.apache.drill.exec.record.RecordBatch;
 import org.apache.drill.exec.record.TypedFieldId;
-import org.apache.drill.exec.record.VectorContainer;
 import org.apache.drill.exec.record.selection.SelectionVector2;
 import org.apache.drill.exec.record.selection.SelectionVector4;
 import org.apache.drill.exec.vector.ValueVector;
 import org.apache.drill.exec.vector.allocator.VectorAllocator;
 import org.apache.drill.exec.physical.impl.aggregate.HashAggregator.AggOutcome;
-import org.apache.drill.exec.physical.impl.common.ChainedHashTable;
-import org.apache.drill.exec.physical.impl.common.HashTable;
-import org.apache.drill.exec.record.VectorWrapper;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.sun.codemodel.JExpr;
 import com.sun.codemodel.JVar;
@@ -124,12 +111,16 @@ public class HashAggBatch extends AbstractRecordBatch<HashAggregate> {
         }
       }
 
-
       if (aggregator.allFlushed()) {
         return IterOutcome.NONE;
       }
 
-      logger.debug("Starting aggregator doWork; incoming record count = {} ", incoming.getRecordCount());
+    if (aggregator.buildComplete() && ! aggregator.allFlushed()) {
+      // aggregation is complete and not all records have been output yet
+      return aggregator.outputCurrentBatch();    
+    }
+
+    logger.debug("Starting aggregator doWork; incoming record count = {} ", incoming.getRecordCount());   
 
       while(true){
         AggOutcome out = aggregator.doWork();
@@ -284,6 +275,9 @@ public class HashAggBatch extends AbstractRecordBatch<HashAggregate> {
 
   @Override
   public void cleanup() {
+    if (aggregator != null) {
+      aggregator.cleanup();
+    }
     super.cleanup();
     incoming.cleanup();
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1726d734/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java
index 039445b..b65acb0 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java
@@ -73,6 +73,7 @@ public abstract class HashAggTemplate implements HashAggregator {
   private IterOutcome outcome;
   private int outputCount = 0;
   private int numGroupedRecords = 0;
+  private int outBatchIndex = 0;
   private RecordBatch incoming;
   private BatchSchema schema;
   private RecordBatch outgoing;
@@ -91,11 +92,13 @@ public abstract class HashAggTemplate implements HashAggregator {
 
   private MaterializedField[] materializedValueFields;
   private boolean allFlushed = false;
+  private boolean  buildComplete = false;
 
   public class BatchHolder {
 
     private VectorContainer aggrValuesContainer; // container for aggr values (workspace variables)
     int maxOccupiedIdx = -1;
+    int batchOutputCount = 0;
 
     private BatchHolder() {
 
@@ -120,15 +123,15 @@ public abstract class HashAggTemplate implements HashAggregator {
       return true;
     }
 
-    private void setup(int idx) {
+    private void setup() {
       setupInterior(incoming, outgoing, aggrValuesContainer);
     }
 
     private boolean outputValues() {
       for (int i = 0; i <= maxOccupiedIdx; i++) {
-        if (outputRecordValues(i, outputCount) ) {
-          if (EXTRA_DEBUG_2) logger.debug("Outputting values to {}", outputCount) ;
-          outputCount++;
+        if (outputRecordValues(i, batchOutputCount) ) {
+          if (EXTRA_DEBUG_2) logger.debug("Outputting values to batch index: {} output index: {}", batchOutputCount) ;
+          batchOutputCount++;
         } else {
           return false;
         }
@@ -139,7 +142,15 @@ public abstract class HashAggTemplate implements HashAggregator {
     private void clear() {
       aggrValuesContainer.clear();
     }
+    
+    private int getNumGroups() {
+      return maxOccupiedIdx + 1;
+    }
 
+    private int getOutputCount() {
+      return batchOutputCount;
+    }
+    
     // Code-generated methods (implemented in HashAggBatch)
 
     @RuntimeOverridden
@@ -260,16 +271,29 @@ public abstract class HashAggTemplate implements HashAggregator {
               }
 
             case NONE:
-              outcome = out;
-              outputKeysAndValues() ;
-
-              // cleanup my internal state since there is nothing more to return
-              this.cleanup();
+              // outcome = out;
+              
+              buildComplete = true;
+              
+              // outputKeysAndValues() ;
+
+              // output the first batch; remaining batches will be output 
+              // in response to each next() call by a downstream operator
+              
+              // outputKeysAndValues(outBatchIndex);
+              outputCurrentBatch();
+
+              //if (isLastBatchOutput()) {
+                // cleanup my internal state since there is nothing more to return
+              //  this.cleanup();
+              // }
+              
               // cleanup incoming batch since output of aggregation does not need
               // any references to the incoming
 
               incoming.cleanup();
-              return setOkAndReturn();
+              // return setOkAndReturn();
+              return AggOutcome.RETURN_OUTCOME;
 
             case STOP:
             default:
@@ -286,24 +310,19 @@ public abstract class HashAggTemplate implements HashAggregator {
       if(first) first = !first;
     }
   }
-
-  private void allocateOutgoing() {
-
-    // At present, since we output all records at once, we create the outgoing batch
-    // with a size of numGroupedRecords..however this has to be restricted to max of 64K right
-    // now otherwise downstream operators will break.
-    // TODO: allow outputting arbitrarily large number of records in batches
-    assert (numGroupedRecords < Character.MAX_VALUE);
+  
+  private void allocateOutgoing(int numOutputRecords) {
 
     for (VectorAllocator a : keyAllocators) {
-      if(EXTRA_DEBUG_2) logger.debug("Outgoing batch: Allocating {} with {} records.", a, numGroupedRecords);
-      a.alloc(numGroupedRecords);
+      if(EXTRA_DEBUG_2) logger.debug("Outgoing batch: Allocating {} with {} records.", a, numOutputRecords);
+      a.alloc(numOutputRecords);
     }
 
     for (VectorAllocator a : valueAllocators) {
-      if(EXTRA_DEBUG_2) logger.debug("Outgoing batch: Allocating {} with {} records.", a, numGroupedRecords);
-      a.alloc(numGroupedRecords);
+      if(EXTRA_DEBUG_2) logger.debug("Outgoing batch: Allocating {} with {} records.", a, numOutputRecords);
+      a.alloc(numOutputRecords);
     }
+    
   }
 
   @Override
@@ -314,20 +333,25 @@ public abstract class HashAggTemplate implements HashAggregator {
   @Override
   public int getOutputCount() {
     return outputCount;
+    // return batchHolders.get(outBatchIndex).getOutputCount();
   }
 
   @Override
   public void cleanup(){
-    htable.clear();
-    htable = null;
+    if (htable != null) {
+      htable.clear();
+      htable = null;
+    }
     htIdxHolder = null;
     materializedValueFields = null;
 
-    for (BatchHolder bh : batchHolders) {
-      bh.clear();
+    if (batchHolders != null) {
+      for (BatchHolder bh : batchHolders) {
+        bh.clear();
+      }
+      batchHolders.clear();
+      batchHolders = null;
     }
-    batchHolders.clear();
-    batchHolders = null;
   }
 
   private AggOutcome tooBigFailure(){
@@ -368,29 +392,114 @@ public abstract class HashAggTemplate implements HashAggregator {
 
     if (EXTRA_DEBUG_1) logger.debug("HashAggregate: Added new batch; num batches = {}.", batchHolders.size());
 
-    int batchIdx = batchHolders.size() - 1;
-    bh.setup(batchIdx);
+    bh.setup();
   }
 
+  /*
   private boolean outputKeysAndValues() {
 
     allocateOutgoing();
 
-    this.htable.outputKeys();
+    int batchIdx = 0;
+    for (BatchHolder bh : batchHolders) {
+      if (! this.htable.outputKeys(batchIdx++)) {
+        return false;
+      }
+    }
 
     for (BatchHolder bh : batchHolders) {
       if (! bh.outputValues() ) {
         return false;
       }
     }
-
+    
     allFlushed = true ;
     return true;
   }
+*/
+  
+  // output the keys and values for a particular batch holder
+  private boolean outputKeysAndValues(int batchIdx) {
+    
+    allocateOutgoing(batchIdx);
+    
+    if (! this.htable.outputKeys(batchIdx)) {
+      return false;
+    }
+    if (! batchHolders.get(batchIdx).outputValues()) {
+      return false;
+    }
+
+    outBatchIndex = batchIdx+1;
+    
+    if (outBatchIndex == batchHolders.size()) {
+      allFlushed = true;
+    }
+    
+    return true;
+  }
+  
+  public IterOutcome outputCurrentBatch() {
+    if (outBatchIndex >= batchHolders.size()) {
+      this.outcome = IterOutcome.NONE;
+      return outcome;
+    }
 
+    // get the number of groups in the batch holder corresponding to this batch index
+    int batchOutputRecords = batchHolders.get(outBatchIndex).getNumGroups();
+    
+    if (batchOutputRecords == 0) {
+      this.outcome = IterOutcome.NONE;
+      return outcome;
+    }
+    
+    allocateOutgoing(batchOutputRecords);
+    
+    if (this.htable.outputKeys(outBatchIndex) 
+        && batchHolders.get(outBatchIndex).outputValues()) {
+      
+      // set the value count for outgoing batch value vectors
+      for(VectorWrapper<?> v : outgoing) {
+        v.getValueVector().getMutator().setValueCount(batchOutputRecords);
+      }
+      
+      outputCount += batchOutputRecords;
+      
+      if(first){
+        this.outcome = IterOutcome.OK_NEW_SCHEMA;
+      }else{
+        this.outcome = IterOutcome.OK;
+      }
+      
+      logger.debug("HashAggregate: Output current batch index {} with {} records.", outBatchIndex, batchOutputRecords);
+      
+      outBatchIndex++;
+      if (outBatchIndex == batchHolders.size()) {
+        allFlushed = true;
+        
+        logger.debug("HashAggregate: All batches flushed.");
+        
+        // cleanup my internal state since there is nothing more to return
+        this.cleanup();
+      }
+    } else {
+      this.outcome = IterOutcome.STOP;
+    }
+    
+    return this.outcome;
+  }
+  
   public boolean allFlushed() {
     return allFlushed;
   }
+  
+  public boolean buildComplete() {
+    return buildComplete;
+  }
+  
+  public int numGroupedRecords() {
+    return numGroupedRecords;
+  }
 
   // Check if a group is present in the hash table; if not, insert it in the hash table.
   // The htIdxHolder contains the index of the group in the hash table container; this same

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1726d734/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggregator.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggregator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggregator.java
index 9032f2a..9e6cdb9 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggregator.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggregator.java
@@ -57,4 +57,9 @@ public interface HashAggregator {
   public abstract void cleanup();
 
   public abstract boolean allFlushed();
+  
+  public abstract boolean buildComplete();
+  
+  public abstract IterOutcome outputCurrentBatch();
+  
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1726d734/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTable.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTable.java
index e5959f2..46cb47d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTable.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTable.java
@@ -58,7 +58,7 @@ public interface HashTable {
 
   public void clear();
 
-  public boolean outputKeys();
+  public boolean outputKeys(int batchIdx);
 }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1726d734/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
index 3a8e609..f2844ac 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
@@ -157,6 +157,12 @@ public abstract class HashTableTemplate implements HashTable {
       int currentIdxWithinBatch = currentIdxHolder.value & BATCH_MASK;
       boolean match = false;
 
+      if (currentIdxWithinBatch >= HashTable.BATCH_SIZE) {
+        logger.debug("Batch size = {}, incomingRowIdx = {}, currentIdxWithinBatch = {}.", HashTable.BATCH_SIZE, incomingRowIdx, currentIdxWithinBatch);
+      }
+      assert (currentIdxWithinBatch < HashTable.BATCH_SIZE);
+      assert (incomingRowIdx < HashTable.BATCH_SIZE);
+      
       if (isProbe)
         match = isKeyMatchInternalProbe(incomingRowIdx, currentIdxWithinBatch);
       else
@@ -599,6 +605,7 @@ public abstract class HashTableTemplate implements HashTable {
     }
   }
 
+  /* 
   public boolean outputKeys() {
     for (BatchHolder bh : batchHolders) {
       if ( ! bh.outputKeys()) {
@@ -607,7 +614,16 @@ public abstract class HashTableTemplate implements HashTable {
     }
     return true;
   }
+  */
 
+  public boolean outputKeys(int batchIdx) {
+    assert batchIdx < batchHolders.size();
+    if (! batchHolders.get(batchIdx).outputKeys()) {
+      return false;
+    }
+    return true;
+  }
+  
   private IntVector allocMetadataVector(int size, int initialValue) {
     IntVector vector = (IntVector) TypeHelper.getNewVector(dummyIntField, allocator);
     vector.allocateNew(size);

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1726d734/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatch.java
index 60fdd4d..662deb6 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatch.java
@@ -33,8 +33,8 @@ import org.apache.drill.exec.vector.ValueVector;
  */
 public interface RecordBatch extends VectorAccessible {
 
-  /* max batch size, limited by 2-byte-lentgh in SV2 : 65535 = 2^16 -1 */
-  public static final int MAX_BATCH_SIZE = 65535;
+  /* max batch size, limited by 2-byte-lentgh in SV2 : 65536 = 2^16 */
+  public static final int MAX_BATCH_SIZE = 65536;
 
   /**
    * Describes the outcome of a RecordBatch being incremented forward.


[22/23] git commit: DRILL-894: Update Dependency of com.googlecode.maven-download-plugin:download-maven-plugin:jar:1.2.0-SNAPSHOT to com.googlecode.maven-download-plugin:download-maven-plugin:jar:1.2.0

Posted by ja...@apache.org.
DRILL-894: Update Dependency of com.googlecode.maven-download-plugin:download-maven-plugin:jar:1.2.0-SNAPSHOT to com.googlecode.maven-download-plugin:download-maven-plugin:jar:1.2.0


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/56a34fda
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/56a34fda
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/56a34fda

Branch: refs/heads/master
Commit: 56a34fda6a837da597333d16b8d2c96afb830528
Parents: 188aeed
Author: Harold Dost <ha...@gmail.com>
Authored: Tue Jun 3 09:50:24 2014 -0400
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 16:00:13 2014 -0700

----------------------------------------------------------------------
 contrib/data/tpch-sample-data/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/56a34fda/contrib/data/tpch-sample-data/pom.xml
----------------------------------------------------------------------
diff --git a/contrib/data/tpch-sample-data/pom.xml b/contrib/data/tpch-sample-data/pom.xml
index ab968f2..67fc62c 100644
--- a/contrib/data/tpch-sample-data/pom.xml
+++ b/contrib/data/tpch-sample-data/pom.xml
@@ -29,7 +29,7 @@
       <plugin>
         <groupId>com.googlecode.maven-download-plugin</groupId>
         <artifactId>download-maven-plugin</artifactId>
-        <version>1.2.0-SNAPSHOT</version>
+        <version>1.2.0</version>
         <executions>
           <execution>
             <id>install-tgz</id>


[10/23] git commit: DRILL-322 - drill_dumpcat script works more like the other scripts now

Posted by ja...@apache.org.
DRILL-322 - drill_dumpcat script works more like the other scripts now


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/61dea895
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/61dea895
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/61dea895

Branch: refs/heads/master
Commit: 61dea8957c3e2c08cffb9a8536dcc90095decfa6
Parents: ce007db
Author: Patrick Wong <pw...@maprtech.com>
Authored: Mon Jun 2 20:15:57 2014 +0000
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 19:25:44 2014 -0700

----------------------------------------------------------------------
 distribution/src/resources/drill_dumpcat | 31 ---------------------------
 1 file changed, 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/61dea895/distribution/src/resources/drill_dumpcat
----------------------------------------------------------------------
diff --git a/distribution/src/resources/drill_dumpcat b/distribution/src/resources/drill_dumpcat
index 1747c9a..a2ea4d3 100755
--- a/distribution/src/resources/drill_dumpcat
+++ b/distribution/src/resources/drill_dumpcat
@@ -20,37 +20,6 @@ bin=`cd "$bin">/dev/null; pwd`
 
 . "$bin"/drill-config.sh
 
-if [ -z $JAVA_HOME ]
-then
-  JAVA=`which java`
-else
-  JAVA=`find -L $JAVA_HOME -name java | head -n 1`
-fi
-
-if [ -e $JAVA ]; then
-  echo ""
-else
-  echo "Java not found."
-  exit 1
-fi
-
-$JAVA -version 2>&1 | grep "version" | egrep -e "1.7" > /dev/null
-if [ $? -ne 0 ]; then
-  echo "Java 1.7 is required to run Apache Drill."
-  exit 1
-fi
-
-# get log directory
-if [ "$DRILL_LOG_DIR" = "" ]; then
-  export DRILL_LOG_DIR=/var/log/drill
-fi
-
-CP=$DRILL_HOME/jars/*:$CP
-CP=$DRILL_HOME/lib/*:$CP
-
-CP=$DRILL_CONF_DIR:$CP
-CP=$HADOOP_CLASSPATH:$CP
-
 DRILL_SHELL_JAVA_OPTS="$DRILL_SHELL_JAVA_OPTS -Dlog.path=$DRILL_LOG_DIR/drill_dumpcat.log"
 
 exec $JAVA $DRILL_SHELL_JAVA_OPTS $DRILL_JAVA_OPTS -cp $CP org.apache.drill.exec.client.DumpCat $@


[06/23] git commit: DRILL-893: Remove unnecessary extract functions from time data type causing implicit cast errors. Enable tpch07.

Posted by ja...@apache.org.
DRILL-893: Remove unnecessary extract functions from time data type causing implicit cast errors.
Enable tpch07.


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

Branch: refs/heads/master
Commit: fd6cdf843b8629c5066dda147a8253525d613fca
Parents: cec3fa5
Author: Mehant Baid <me...@gmail.com>
Authored: Sun Jun 1 16:44:44 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 16:39:22 2014 -0700

----------------------------------------------------------------------
 .../codegen/templates/DateIntervalFunctionTemplates/Extract.java   | 2 ++
 .../src/test/java/org/apache/drill/TestTpchDistributed.java        | 1 -
 .../src/test/java/org/apache/drill/TestTpchSingleMode.java         | 1 -
 3 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fd6cdf84/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/Extract.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/Extract.java b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/Extract.java
index b8ff73b..3d3d2da 100644
--- a/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/Extract.java
+++ b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/Extract.java
@@ -34,6 +34,7 @@ public class ${className} {
 <#list extract.fromTypes as fromUnit>
 <#list extract.toTypes as toUnit>
 <#if fromUnit == "Date" || fromUnit == "Time" || fromUnit == "TimeStamp" || fromUnit == "TimeStampTZ">
+<#if !(fromUnit == "Time" && (toUnit == "Year" || toUnit == "Month" || toUnit == "Day"))>
   @FunctionTemplate(name = "extract${toUnit}", scope = FunctionTemplate.FunctionScope.SIMPLE,
       nulls = FunctionTemplate.NullHandling.NULL_IF_NULL)
   public static class ${toUnit}From${fromUnit} implements DrillSimpleFunc {
@@ -68,6 +69,7 @@ public class ${className} {
     </#if>
     }
   }
+</#if>
 <#else>
   @FunctionTemplate(name = "extract${toUnit}", scope = FunctionTemplate.FunctionScope.SIMPLE,
       nulls = FunctionTemplate.NullHandling.NULL_IF_NULL)

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fd6cdf84/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java b/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
index 7a6982d..5f33f51 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java
@@ -61,7 +61,6 @@ public class TestTpchDistributed extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-516
   public void tpch07() throws Exception{
     testDistributed("queries/tpch/07.sql");
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fd6cdf84/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java b/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java
index a11bea6..d1ea910 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestTpchSingleMode.java
@@ -65,7 +65,6 @@ public class TestTpchSingleMode extends BaseTestQuery{
   }
 
   @Test
-  @Ignore // DRILL-516
   public void tpch07() throws Exception{
     testSingleMode("queries/tpch/07.sql");
   }


[02/23] git commit: add digest of group scan to scan rel.

Posted by ja...@apache.org.
add digest of group scan to scan rel.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/69e5d686
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/69e5d686
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/69e5d686

Branch: refs/heads/master
Commit: 69e5d68640f45f60c1b47e187731c84eb9d90775
Parents: 65b36e8
Author: Jacques Nadeau <ja...@apache.org>
Authored: Wed Jun 4 09:31:55 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 11:18:30 2014 -0700

----------------------------------------------------------------------
 .../drill/exec/store/hbase/HBaseGroupScan.java  |  3 +-
 .../exec/planner/logical/DrillScanRel.java      | 45 +++++++++++-----
 .../drill/exec/planner/physical/ScanPrel.java   | 18 +++++--
 .../planner/physical/visitor/RelUniqifier.java  | 54 ++++++++++++++++++++
 .../planner/sql/handlers/DefaultSqlHandler.java |  4 ++
 .../exec/store/dfs/easy/EasyGroupScan.java      |  2 +-
 .../exec/store/direct/DirectGroupScan.java      |  2 +-
 .../exec/store/ischema/InfoSchemaGroupScan.java |  2 +-
 .../exec/store/parquet/ParquetGroupScan.java    |  3 +-
 .../drill/exec/store/sys/SystemTableScan.java   |  2 +-
 .../java/org/apache/drill/BaseTestQuery.java    |  2 +-
 .../java/org/apache/drill/TestBugFixes.java     | 51 ++++++++++++++++++
 12 files changed, 161 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java
----------------------------------------------------------------------
diff --git a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java
index f3ff64c..c7187ba 100644
--- a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java
+++ b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseGroupScan.java
@@ -360,8 +360,7 @@ public class HBaseGroupScan extends AbstractGroupScan implements DrillHBaseConst
   @JsonIgnore
   public PhysicalOperator getNewWithChildren(List<PhysicalOperator> children) {
     Preconditions.checkArgument(children.isEmpty());
-    //TODO return copy of self
-    return this;
+    return new HBaseGroupScan(this);
   }
 
   @JsonIgnore

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillScanRel.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillScanRel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillScanRel.java
index ae11564..586b0ec 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillScanRel.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillScanRel.java
@@ -18,19 +18,24 @@
 package org.apache.drill.exec.planner.logical;
 
 import java.io.IOException;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.drill.common.JSONOptions;
+import org.apache.drill.common.exceptions.DrillRuntimeException;
+import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.data.LogicalOperator;
 import org.apache.drill.common.logical.data.Scan;
 import org.apache.drill.exec.physical.OperatorCost;
 import org.apache.drill.exec.physical.base.GroupScan;
+import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.Size;
 import org.apache.drill.exec.planner.common.DrillScanRelBase;
 import org.apache.drill.exec.planner.cost.DrillCostBase.DrillCostFactory;
 import org.apache.drill.exec.planner.physical.PrelUtil;
 import org.apache.drill.exec.planner.torel.ConversionContext;
+import org.eigenbase.rel.RelWriter;
 import org.eigenbase.relopt.RelOptCluster;
 import org.eigenbase.relopt.RelOptCost;
 import org.eigenbase.relopt.RelOptPlanner;
@@ -61,17 +66,25 @@ public class DrillScanRel extends DrillScanRelBase implements DrillRel {
 
     try {
       if (columns == null || columns.isEmpty()) {
-        this.groupScan = this.drillTable.getGroupScan();
+        this.groupScan = (GroupScan) getCopy(this.drillTable.getGroupScan()) ;
       } else {
         this.groupScan = this.drillTable.getGroupScan().clone(columns);
       }
     } catch (IOException e) {
-      this.groupScan = null;
-      e.printStackTrace();
+      throw new DrillRuntimeException("Failure creating scan.", e);
     }
 
   }
 
+  private static GroupScan getCopy(GroupScan scan){
+    try {
+      return (GroupScan) scan.getNewWithChildren((List<PhysicalOperator>) (Object) Collections.emptyList());
+    } catch (ExecutionSetupException e) {
+      throw new DrillRuntimeException("Unexpected failure while coping node.", e);
+    }
+  }
+
+
   @Override
   public LogicalOperator implement(DrillImplementor implementor) {
     Scan.Builder builder = Scan.builder();
@@ -91,6 +104,10 @@ public class DrillScanRel extends DrillScanRelBase implements DrillRel {
     return this.rowType;
   }
 
+  @Override
+  public RelWriter explainTerms(RelWriter pw) {
+    return super.explainTerms(pw).item("groupscan", groupScan.getDigest());
+  }
 
   @Override
   public double getRows() {
@@ -103,27 +120,27 @@ public class DrillScanRel extends DrillScanRelBase implements DrillRel {
   @Override
   public RelOptCost computeSelfCost(RelOptPlanner planner) {
     Size scanSize = this.groupScan.getSize();
-    int columnCount = this.getRowType().getFieldCount();   
-    
+    int columnCount = this.getRowType().getFieldCount();
+
     if(PrelUtil.getSettings(getCluster()).useDefaultCosting()) {
       OperatorCost scanCost = this.groupScan.getCost();
       return planner.getCostFactory().makeCost(scanSize.getRecordCount() * columnCount, scanCost.getCpu(), scanCost.getDisk());
     }
-    
+
     // double rowCount = RelMetadataQuery.getRowCount(this);
     double rowCount = scanSize.getRecordCount();
-    
-    double cpuCost = rowCount * columnCount; // for now, assume cpu cost is proportional to row count. 
+
+    double cpuCost = rowCount * columnCount; // for now, assume cpu cost is proportional to row count.
     // Even though scan is reading from disk, in the currently generated plans all plans will
-    // need to read the same amount of data, so keeping the disk io cost 0 is ok for now.  
-    // In the future we might consider alternative scans that go against projections or 
+    // need to read the same amount of data, so keeping the disk io cost 0 is ok for now.
+    // In the future we might consider alternative scans that go against projections or
     // different compression schemes etc that affect the amount of data read. Such alternatives
-    // would affect both cpu and io cost. 
+    // would affect both cpu and io cost.
     double ioCost = 0;
     DrillCostFactory costFactory = (DrillCostFactory)planner.getCostFactory();
-    return costFactory.makeCost(rowCount, cpuCost, ioCost, 0);   
-  }  
-  
+    return costFactory.makeCost(rowCount, cpuCost, ioCost, 0);
+  }
+
   public GroupScan getGroupScan() {
     return groupScan;
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java
index 445ecd5..972e47a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java
@@ -22,6 +22,8 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.drill.common.exceptions.DrillRuntimeException;
+import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.exec.physical.OperatorCost;
 import org.apache.drill.exec.physical.base.GroupScan;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
@@ -55,22 +57,30 @@ public class ScanPrel extends AbstractRelNode implements DrillScanPrel {
   public ScanPrel(RelOptCluster cluster, RelTraitSet traits,
       GroupScan groupScan, RelDataType rowType) {
     super(cluster, traits);
-    this.groupScan = groupScan;
+    this.groupScan = getCopy(groupScan);
     this.rowType = rowType;
   }
 
   @Override
   public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) {
-    return new ScanPrel(this.getCluster(), traitSet, this.groupScan,
+    return new ScanPrel(this.getCluster(), traitSet, groupScan,
         this.rowType);
   }
 
   @Override
   protected Object clone() throws CloneNotSupportedException {
-    return new ScanPrel(this.getCluster(), this.getTraitSet(), this.groupScan,
+    return new ScanPrel(this.getCluster(), this.getTraitSet(), getCopy(groupScan),
         this.rowType);
   }
 
+  private static GroupScan getCopy(GroupScan scan){
+    try {
+      return (GroupScan) scan.getNewWithChildren((List<PhysicalOperator>) (Object) Collections.emptyList());
+    } catch (ExecutionSetupException e) {
+      throw new DrillRuntimeException("Unexpected failure while coping node.", e);
+    }
+  }
+
   @Override
   public PhysicalOperator getPhysicalOperator(PhysicalPlanCreator creator)
       throws IOException {
@@ -85,7 +95,7 @@ public class ScanPrel extends AbstractRelNode implements DrillScanPrel {
 
   public static ScanPrel create(RelNode old, RelTraitSet traitSets,
       GroupScan scan, RelDataType rowType) {
-    return new ScanPrel(old.getCluster(), traitSets, scan, rowType);
+    return new ScanPrel(old.getCluster(), traitSets, getCopy(scan), rowType);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RelUniqifier.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RelUniqifier.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RelUniqifier.java
new file mode 100644
index 0000000..7b84edc
--- /dev/null
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RelUniqifier.java
@@ -0,0 +1,54 @@
+/**
+ * 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.drill.exec.planner.physical.visitor;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.drill.exec.planner.physical.Prel;
+import org.eigenbase.rel.RelNode;
+
+import com.google.hive12.hive12.common.collect.Sets;
+import com.google.hive12.hive12.hive12.common.collect.Lists;
+
+public class RelUniqifier extends BasePrelVisitor<Prel, Set<Prel>, RuntimeException>{
+  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(RelUniqifier.class);
+
+  private static final RelUniqifier INSTANCE = new RelUniqifier();
+
+  public static Prel uniqifyGraph(Prel p){
+    Set<Prel> data = Sets.newIdentityHashSet();
+    return p.accept(INSTANCE, data);
+  }
+  @Override
+  public Prel visitPrel(Prel prel, Set<Prel> data) throws RuntimeException {
+    List<RelNode> children = Lists.newArrayList();
+    boolean childrenChanged = false;
+    for(Prel child : prel){
+      Prel newChild = visitPrel(child, data);
+      if(newChild != child) childrenChanged = true;
+      children.add(newChild);
+    }
+
+    if(data.contains(prel) || childrenChanged){
+      return (Prel) prel.copy(prel.getTraitSet(), children);
+    }else{
+      return prel;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java
index 29ed1ec..883b039 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java
@@ -43,6 +43,7 @@ import org.apache.drill.exec.planner.physical.Prel;
 import org.apache.drill.exec.planner.physical.explain.PrelSequencer;
 import org.apache.drill.exec.planner.physical.visitor.FinalColumnReorderer;
 import org.apache.drill.exec.planner.physical.visitor.JoinPrelRenameVisitor;
+import org.apache.drill.exec.planner.physical.visitor.RelUniqifier;
 import org.apache.drill.exec.planner.physical.visitor.SelectionVectorPrelVisitor;
 import org.apache.drill.exec.planner.sql.DrillSqlWorker;
 import org.apache.drill.exec.util.Pointer;
@@ -148,6 +149,9 @@ public class DefaultSqlHandler extends AbstractSqlHandler {
     // a trivial project to reorder columns prior to output.
     phyRelNode = FinalColumnReorderer.addFinalColumnOrdering(phyRelNode);
 
+    // Make sure that the no rels are repeats.  This could happen in the case of querying the same table twice as Optiq may canonicalize these.
+    phyRelNode = RelUniqifier.uniqifyGraph(phyRelNode);
+
     // the last thing we do is add any required selection vector removers given the supported encodings of each
     // operator. This will ultimately move to a new trait but we're managing here for now to avoid introducing new
     // issues in planning before the next release

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
index d0cd8cc..2b63601 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
@@ -161,7 +161,7 @@ public class EasyGroupScan extends AbstractGroupScan{
   @Override
   public PhysicalOperator getNewWithChildren(List<PhysicalOperator> children) throws ExecutionSetupException {
     assert children == null || children.isEmpty();
-    return this;
+    return new EasyGroupScan(this);
   }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java
index eed4f03..138a024 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectGroupScan.java
@@ -72,7 +72,7 @@ public class DirectGroupScan extends AbstractGroupScan{
   @Override
   public PhysicalOperator getNewWithChildren(List<PhysicalOperator> children) throws ExecutionSetupException {
     assert children == null || children.isEmpty();
-    return this;
+    return new DirectSubScan(reader);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaGroupScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaGroupScan.java
index 5014386..7337cea 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaGroupScan.java
@@ -92,7 +92,7 @@ public class InfoSchemaGroupScan extends AbstractGroupScan{
 
   @Override
   public PhysicalOperator getNewWithChildren(List<PhysicalOperator> children) throws ExecutionSetupException {
-    return this;
+    return new InfoSchemaGroupScan (this);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java
index f5c1ce7..e69f61c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java
@@ -385,8 +385,7 @@ public class ParquetGroupScan extends AbstractGroupScan {
   @JsonIgnore
   public PhysicalOperator getNewWithChildren(List<PhysicalOperator> children) {
     Preconditions.checkArgument(children.isEmpty());
-    // TODO return copy of self
-    return this;
+    return new ParquetGroupScan(this);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTableScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTableScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTableScan.java
index b0133f3..09aabb0 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTableScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTableScan.java
@@ -74,7 +74,7 @@ public class SystemTableScan extends AbstractGroupScan implements SubScan{
 
   @Override
   public PhysicalOperator getNewWithChildren(List<PhysicalOperator> children) throws ExecutionSetupException {
-    return this;
+    return new SystemTableScan(table, plugin);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java b/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java
index a47796c..5458adc 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java
@@ -130,7 +130,7 @@ public class BaseTestQuery extends ExecTest{
 
   private int testRunAndPrint(QueryType type, String query) throws Exception{
     query = query.replace("[WORKING_PATH]", TestTools.getWorkingPath());
-    PrintingResultsListener resultListener = new PrintingResultsListener(Format.TSV, VectorUtil.DEFAULT_COLUMN_WIDTH);
+    PrintingResultsListener resultListener = new PrintingResultsListener(client.getConfig(), Format.TSV, VectorUtil.DEFAULT_COLUMN_WIDTH);
     client.runQuery(type, query, resultListener);
     return resultListener.await();
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/69e5d686/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java b/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java
new file mode 100644
index 0000000..2aa0618
--- /dev/null
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java
@@ -0,0 +1,51 @@
+/**
+ * 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.drill;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class TestBugFixes extends BaseTestQuery {
+
+  @Test
+  public void leak1() throws Exception {
+    String select = "select count(*) \n" +
+        "    from cp.`tpch/part.parquet` p1, cp.`tpch/part.parquet` p2 \n" +
+        "    where p1.p_name = p2.p_name \n" +
+        "  and p1.p_mfgr = p2.p_mfgr";
+    test(select);
+  }
+
+  @Ignore
+  @Test
+  public void failingSmoke() throws Exception {
+    String select = "select count(*) \n" +
+        "  from (select l.l_orderkey as x, c.c_custkey as y \n" +
+        "  from cp.`tpch/lineitem.parquet` l \n" +
+        "    left outer join cp.`tpch/customer.parquet` c \n" +
+        "      on l.l_orderkey = c.c_custkey) as foo\n" +
+        "  where x < 10000";
+    test(select);
+  }
+
+
+  @Test
+  public void DRILL883() throws Exception {
+    test("select n1.n_regionkey from cp.`tpch/nation.parquet` n1, (select n_nationkey from cp.`tpch/nation.parquet`) as n2 where n1.n_nationkey = n2.n_nationkey");
+  }
+}


[15/23] git commit: DRILL-892: Send Batch is leaking memory when send fails to establish connection to remote fragment.

Posted by ja...@apache.org.
DRILL-892: Send Batch is leaking memory when send fails to establish connection to remote fragment.

Also:
1. Maitain one StatusHandler for all OutgoingRecordBatches in Partitioner.
2. In FragmentExecutor check for failures set in FragementContext.


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

Branch: refs/heads/master
Commit: e62c3650d2c882bd2cf354d7a0dbc506a58fc051
Parents: c6c3cd5
Author: vkorukanti <ve...@gmail.com>
Authored: Mon Jun 2 17:43:57 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 09:35:08 2014 -0700

----------------------------------------------------------------------
 .../partitionsender/PartitionSenderRootExec.java    |  9 ++++++++-
 .../physical/impl/partitionsender/Partitioner.java  |  3 ++-
 .../impl/partitionsender/PartitionerTemplate.java   | 16 ++++++++--------
 .../org/apache/drill/exec/rpc/data/DataTunnel.java  | 11 +++++++++--
 .../drill/exec/work/fragment/FragmentExecutor.java  | 16 ++++++++++++----
 5 files changed, 39 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e62c3650/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionSenderRootExec.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionSenderRootExec.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionSenderRootExec.java
index 74a3c90..ffb3780 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionSenderRootExec.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionSenderRootExec.java
@@ -61,6 +61,7 @@ public class PartitionSenderRootExec implements RootExec {
   private final OperatorStats stats;
   private final int outGoingBatchCount;
   private final HashPartitionSender popConfig;
+  private final StatusHandler statusHandler;
 
 
   public PartitionSenderRootExec(FragmentContext context,
@@ -74,6 +75,7 @@ public class PartitionSenderRootExec implements RootExec {
     this.stats = oContext.getStats();
     this.outGoingBatchCount = operator.getDestinations().size();
     this.popConfig = operator;
+    this.statusHandler = new StatusHandler(sendCount, context);
   }
 
   @Override
@@ -183,7 +185,7 @@ public class PartitionSenderRootExec implements RootExec {
       // compile and setup generated code
 //      partitioner = context.getImplementationClassMultipleOutput(cg);
       partitioner = context.getImplementationClass(cg);
-      partitioner.setup(context, incoming, popConfig, stats, sendCount, oContext);
+      partitioner.setup(context, incoming, popConfig, stats, sendCount, oContext, statusHandler);
 
     } catch (ClassTransformationException | IOException e) {
       throw new SchemaChangeException("Failure while attempting to load generated class", e);
@@ -197,6 +199,11 @@ public class PartitionSenderRootExec implements RootExec {
       partitioner.clear();
     }
     sendCount.waitForSendComplete();
+
+    if (!statusHandler.isOk()) {
+      context.fail(statusHandler.getException());
+    }
+
     oContext.close();
     incoming.cleanup();
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e62c3650/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/Partitioner.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/Partitioner.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/Partitioner.java
index 8d6c19a..6958403 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/Partitioner.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/Partitioner.java
@@ -35,7 +35,8 @@ public interface Partitioner {
                           HashPartitionSender popConfig,
                           OperatorStats stats,
                           SendingAccountor sendingAccountor,
-                          OperatorContext oContext) throws SchemaChangeException;
+                          OperatorContext oContext,
+                          StatusHandler statusHandler) throws SchemaChangeException;
 
   public abstract void partitionBatch(RecordBatch incoming) throws IOException;
   public abstract void flushOutgoingBatches(boolean isLastBatch, boolean schemaChanged) throws IOException;

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e62c3650/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionerTemplate.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionerTemplate.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionerTemplate.java
index 4a27262..510327a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionerTemplate.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionerTemplate.java
@@ -71,7 +71,8 @@ public abstract class PartitionerTemplate implements Partitioner {
                           HashPartitionSender popConfig,
                           OperatorStats stats,
                           SendingAccountor sendingAccountor,
-                          OperatorContext oContext) throws SchemaChangeException {
+                          OperatorContext oContext,
+                          StatusHandler statusHandler) throws SchemaChangeException {
 
     this.incoming = incoming;
     doSetup(context, incoming, null);
@@ -79,7 +80,8 @@ public abstract class PartitionerTemplate implements Partitioner {
     int fieldId = 0;
     for (DrillbitEndpoint endpoint : popConfig.getDestinations()) {
       FragmentHandle opposite = context.getHandle().toBuilder().setMajorFragmentId(popConfig.getOppositeMajorFragmentId()).setMinorFragmentId(fieldId).build();
-      outgoingBatches.add(new OutgoingRecordBatch(stats, sendingAccountor, popConfig, context.getDataTunnel(endpoint, opposite), context, oContext.getAllocator(), fieldId));
+      outgoingBatches.add(new OutgoingRecordBatch(stats, sendingAccountor, popConfig,
+          context.getDataTunnel(endpoint, opposite), context, oContext.getAllocator(), fieldId, statusHandler));
       fieldId++;
     }
 
@@ -204,10 +206,11 @@ public abstract class PartitionerTemplate implements Partitioner {
     private static final int DEFAULT_RECORD_BATCH_SIZE = 20000;
     private static final int DEFAULT_VARIABLE_WIDTH_SIZE = 200;
 
-    private StatusHandler statusHandler;
+    private final StatusHandler statusHandler;
 
     public OutgoingRecordBatch(OperatorStats stats, SendingAccountor sendCount, HashPartitionSender operator, DataTunnel tunnel,
-                               FragmentContext context, BufferAllocator allocator, int oppositeMinorFragmentId) {
+                               FragmentContext context, BufferAllocator allocator, int oppositeMinorFragmentId,
+                               StatusHandler statusHandler) {
       this.context = context;
       this.allocator = allocator;
       this.operator = operator;
@@ -215,7 +218,7 @@ public abstract class PartitionerTemplate implements Partitioner {
       this.sendCount = sendCount;
       this.stats = stats;
       this.oppositeMinorFragmentId = oppositeMinorFragmentId;
-      this.statusHandler = new StatusHandler(sendCount, context);
+      this.statusHandler = statusHandler;
     }
 
     protected boolean copy(int inIndex) throws IOException {
@@ -346,9 +349,6 @@ public abstract class PartitionerTemplate implements Partitioner {
       return WritableBatch.getBatchNoHVWrap(recordCount, this, false);
     }
 
-
-
-
     public void clear(){
       vectorContainer.clear();
     }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e62c3650/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/data/DataTunnel.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/data/DataTunnel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/data/DataTunnel.java
index 98bbeeb..3c2b9e3 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/data/DataTunnel.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/data/DataTunnel.java
@@ -17,6 +17,7 @@
  */
 package org.apache.drill.exec.rpc.data;
 
+import io.netty.buffer.ByteBuf;
 import org.apache.drill.exec.ops.FragmentContext;
 import org.apache.drill.exec.proto.BitData.RpcType;
 import org.apache.drill.exec.proto.GeneralRPCProtos.Ack;
@@ -66,8 +67,14 @@ public class DataTunnel {
     public String toString() {
       return "SendBatch [batch.header=" + batch.getHeader() + "]";
     }
-    
-    
+
+    @Override
+    public void connectionFailed(FailureType type, Throwable t) {
+      for(ByteBuf buffer : batch.getBuffers()) {
+        buffer.release();
+      }
+      super.connectionFailed(type, t);
+    }
   }
 
   private static class SendBatchAsyncFuture extends FutureBitCommand<Ack, DataClientConnection> {

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e62c3650/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java
index 70f5dd0..11685c0 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java
@@ -106,6 +106,9 @@ public class FragmentExecutor implements Runnable, CancelableQuery, StatusProvid
       }
 
       root.stop();
+      if(context.isFailed()) {
+        internalFail(context.getFailureCause());
+      }
 
       closed = true;
 
@@ -115,10 +118,15 @@ public class FragmentExecutor implements Runnable, CancelableQuery, StatusProvid
       internalFail(ex);
     }finally{
       Thread.currentThread().setName(originalThread);
-      if(!closed) try{
-        context.close();
-      }catch(RuntimeException e){
-        logger.warn("Failure while closing context in failed state.", e);
+      if(!closed) {
+        try {
+          if(context.isFailed()) {
+            internalFail(context.getFailureCause());
+          }
+          context.close();
+        } catch (RuntimeException e) {
+          logger.warn("Failure while closing context in failed state.", e);
+        }
       }
     }
     logger.debug("Fragment runner complete. {}:{}", context.getHandle().getMajorFragmentId(), context.getHandle().getMinorFragmentId());


[07/23] git commit: DRILL-710: Fix sign function to always return integer type.

Posted by ja...@apache.org.
DRILL-710: Fix sign function to always return integer type.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/61fc5ea8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/61fc5ea8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/61fc5ea8

Branch: refs/heads/master
Commit: 61fc5ea82ea32e327f5ce5f556826e615a71233c
Parents: fd6cdf8
Author: Mehant Baid <me...@gmail.com>
Authored: Tue Jun 3 22:15:31 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 16:39:22 2014 -0700

----------------------------------------------------------------------
 exec/java-exec/src/main/codegen/data/MathFunc.tdd | 18 +++++++++---------
 .../drill/jdbc/test/TestFunctionsQuery.java       | 13 +++++++++++++
 2 files changed, 22 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/61fc5ea8/exec/java-exec/src/main/codegen/data/MathFunc.tdd
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/data/MathFunc.tdd b/exec/java-exec/src/main/codegen/data/MathFunc.tdd
index 228d207..e287122 100644
--- a/exec/java-exec/src/main/codegen/data/MathFunc.tdd
+++ b/exec/java-exec/src/main/codegen/data/MathFunc.tdd
@@ -96,15 +96,15 @@
    	},
     {className: "Sign", funcName: "sign", javaFunc : "java.lang.Math.signum", types: [
       {input: "Int",  outputType: "Int", castType: "int"},
-      {input: "BigInt",  outputType: "BigInt", castType: "long"},
-      {input: "Float4", outputType: "Float4", castType: "float"},
-      {input: "Float8", outputType: "Float8", castType: "double"},
-      {input: "SmallInt",  outputType: "SmallInt", castType: "short"},
-      {input: "TinyInt",  outputType: "TinyInt", castType: "byte"},
-      {input: "UInt1", outputType: "UInt1", castType: "byte"},
-      {input: "UInt2", outputType: "UInt2", castType: "char"},
-      {input: "UInt4", outputType: "UInt4", castType: "int"},
-      {input: "UInt8", outputType: "UInt8", castType: "long"}
+      {input: "BigInt",  outputType: "Int", castType: "int"},
+      {input: "Float4", outputType: "Int", castType: "int"},
+      {input: "Float8", outputType: "Int", castType: "int"},
+      {input: "SmallInt",  outputType: "Int", castType: "int"},
+      {input: "TinyInt",  outputType: "Int", castType: "int"},
+      {input: "UInt1", outputType: "Int", castType: "int"},
+      {input: "UInt2", outputType: "Int", castType: "int"},
+      {input: "UInt4", outputType: "Int", castType: "int"},
+      {input: "UInt8", outputType: "Int", castType: "int"}
      ]
    	}      	   
   ],  

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/61fc5ea8/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
index 66ae477..0dacfa3 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
@@ -467,4 +467,17 @@ public class TestFunctionsQuery {
             "DEC_38=3.00000\n");
   }
 
+  @Test
+  public void testSignFunction() throws Exception {
+    String query = "select sign(cast('1.23' as float)) as SIGN_FLOAT, sign(-1234.4567) as SIGN_DOUBLE, sign(23) as SIGN_INT " +
+        "from cp.`employee.json` where employee_id < 2";
+
+    JdbcAssert.withNoDefaultSchema()
+        .sql(query)
+        .returns(
+            "SIGN_FLOAT=1; " +
+            "SIGN_DOUBLE=-1; " +
+            "SIGN_INT=1\n");
+  }
+
 }


[09/23] git commit: DRILL-908: NullableValueVector bug causes all values pulled out to be reported as non-null

Posted by ja...@apache.org.
DRILL-908: NullableValueVector bug causes all values pulled out to be reported as non-null


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

Branch: refs/heads/master
Commit: ce007db51d6bf57ad081d39d615c071ba8f4540c
Parents: c7bdf57
Author: Jason Altekruse <al...@gmail.com>
Authored: Wed Jun 4 18:28:38 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 4 19:01:41 2014 -0700

----------------------------------------------------------------------
 .../java-exec/src/main/codegen/templates/NullableValueVectors.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce007db5/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java b/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java
index fd15e79..ce17418 100644
--- a/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java
+++ b/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java
@@ -335,8 +335,8 @@ public final class ${className} extends BaseValueVector implements <#if type.maj
     }
     
     public void get(int index, Nullable${minor.class}Holder holder){
-      holder.isSet = bits.getAccessor().get(index);
       values.getAccessor().get(index, holder);
+      holder.isSet = bits.getAccessor().get(index);
 
       <#if minor.class.startsWith("Decimal")>
       holder.scale = getField().getScale();


[19/23] git commit: DRILL-901: Fix Parquet read bug with VarBinary.

Posted by ja...@apache.org.
DRILL-901: Fix Parquet read bug with VarBinary.

Also now throw an exception if parquet reader is not passed any columns found in the file. Previously a NPE was thrown as the setup method exited early, skipping an object initialization that manifested in the first call to the next method.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/163219c2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/163219c2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/163219c2

Branch: refs/heads/master
Commit: 163219c2a802481cbd90171912540250d4059ea8
Parents: 393adee
Author: Jason Altekruse <al...@gmail.com>
Authored: Wed Jun 4 11:21:32 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jun 5 09:41:39 2014 -0700

----------------------------------------------------------------------
 .../exec/store/parquet/PageReadStatus.java      |  2 +-
 .../exec/store/parquet/ParquetRecordReader.java |  2 +-
 .../store/parquet/ParquetRecordReaderTest.java  |  9 +++++++
 .../test/resources/parquet/par_writer_test.json | 26 ++++++++++++++++++++
 4 files changed, 37 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/163219c2/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/PageReadStatus.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/PageReadStatus.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/PageReadStatus.java
index ba98f3c..3ad1d6c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/PageReadStatus.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/PageReadStatus.java
@@ -110,6 +110,7 @@ final class PageReadStatus {
   public boolean next() throws IOException {
 
     currentPage = null;
+    valuesRead = 0;
 
     // TODO - the metatdata for total size appears to be incorrect for impala generated files, need to find cause
     // and submit a bug report
@@ -162,7 +163,6 @@ final class PageReadStatus {
     pageDataByteArray = currentPage.getBytes().toByteArray();
 
     readPosInBytes = 0;
-    valuesRead = 0;
     if (parentColumnReader.columnDescriptor.getMaxDefinitionLevel() != 0){
       parentColumnReader.currDefLevel = -1;
       if (!currentPage.getValueEncoding().usesDictionary()) {

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/163219c2/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetRecordReader.java
index 6754855..4c5f4bb 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetRecordReader.java
@@ -228,7 +228,7 @@ public class ParquetRecordReader implements RecordReader {
 
     // none of the columns in the parquet file matched the request columns from the query
     if (columnsToScan == 0){
-      return;
+      throw new ExecutionSetupException("Error reading from parquet file. No columns requested were found in the file.");
     }
     if (allFieldsFixedLength) {
       recordsPerBatch = (int) Math.min(Math.min(batchSize / bitWidthAllFixedFields,

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/163219c2/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetRecordReaderTest.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetRecordReaderTest.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetRecordReaderTest.java
index 82436a3..ad63dc9 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetRecordReaderTest.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetRecordReaderTest.java
@@ -352,6 +352,15 @@ public class ParquetRecordReaderTest extends BaseTestQuery{
         "/tmp/test.parquet", i, props);
   }
 
+  @Test
+  public void testReadError_Drill_901() throws Exception {
+    // select cast( L_COMMENT as varchar) from  dfs.`/tmp/drilltest/employee_parquet`
+    HashMap<String, FieldInfo> fields = new HashMap<>();
+    ParquetTestProperties props = new ParquetTestProperties(1, 120350, DEFAULT_BYTES_PER_PAGE, fields);
+    testParquetFullEngineEventBased(false, false, "/parquet/par_writer_test.json", null,
+        "unused, no file is generated", 1, props, false);
+  }
+
 
   @Ignore
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/163219c2/exec/java-exec/src/test/resources/parquet/par_writer_test.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/parquet/par_writer_test.json b/exec/java-exec/src/test/resources/parquet/par_writer_test.json
new file mode 100644
index 0000000..34f2ba6
--- /dev/null
+++ b/exec/java-exec/src/test/resources/parquet/par_writer_test.json
@@ -0,0 +1,26 @@
+  {
+    head : {
+      version : 1,
+          generator : {
+        type : "manual",
+            info : "na"
+      },
+      type : "APACHE_DRILL_PHYSICAL"
+    },
+    graph : [ {
+    pop : "parquet-scan",
+    @id : 1,
+        entries : [ {
+      path : "/tpch/lineitem.parquet"
+    } ],
+    storage : {
+      type : "file",
+      connection : "classpath:///"
+    },
+    columns: [ "L_COMMENT"]
+  }, {
+    pop : "screen",
+    @id : 2,
+        child : 1
+  } ]
+  }