You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by na...@apache.org on 2009/12/04 03:21:40 UTC

svn commit: r887036 [1/3] - in /hadoop/hive/trunk: ./ common/src/java/org/apache/hadoop/hive/conf/ conf/ ql/src/java/org/apache/hadoop/hive/ql/ ql/src/java/org/apache/hadoop/hive/ql/exec/ ql/src/test/queries/clientpositive/ ql/src/test/results/clientpo...

Author: namit
Date: Fri Dec  4 02:21:39 2009
New Revision: 887036

URL: http://svn.apache.org/viewvc?rev=887036&view=rev
Log:
HIVE-549. Run independent tasks for a query in parallel.
(Chaitanya Mishra via namit)


Added:
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskResult.java
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskRunner.java
Modified:
    hadoop/hive/trunk/CHANGES.txt
    hadoop/hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
    hadoop/hive/trunk/conf/hive-default.xml
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExecDriver.java
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Task.java
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
    hadoop/hive/trunk/ql/src/test/queries/clientpositive/input41.q
    hadoop/hive/trunk/ql/src/test/queries/clientpositive/input42.q
    hadoop/hive/trunk/ql/src/test/queries/clientpositive/input_part9.q
    hadoop/hive/trunk/ql/src/test/results/clientpositive/input41.q.out
    hadoop/hive/trunk/ql/src/test/results/clientpositive/input42.q.out
    hadoop/hive/trunk/ql/src/test/results/clientpositive/input_part9.q.out

Modified: hadoop/hive/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/CHANGES.txt?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/CHANGES.txt (original)
+++ hadoop/hive/trunk/CHANGES.txt Fri Dec  4 02:21:39 2009
@@ -81,6 +81,9 @@
 
     HIVE-870. Add table functions. (Paul Yang via namit)
 
+    HIVE-549. Run independent tasks for a query in parallel.
+    (Chaitanya Mishra via namit)
+
   IMPROVEMENTS
 
     HIVE-760. Add version info to META-INF/MANIFEST.MF.

Modified: hadoop/hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (original)
+++ hadoop/hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java Fri Dec  4 02:21:39 2009
@@ -70,7 +70,8 @@
     MAXREDUCERS("hive.exec.reducers.max", 999),
     PREEXECHOOKS("hive.exec.pre.hooks", ""),
     POSTEXECHOOKS("hive.exec.post.hooks", ""),
-
+    EXECPARALLEL("hive.exec.parallel",false), // parallel query launching
+    
     // hadoop stuff
     HADOOPBIN("hadoop.bin.path", System.getenv("HADOOP_HOME") + "/bin/hadoop"),
     HADOOPCONF("hadoop.config.dir", System.getenv("HADOOP_HOME") + "/conf"),

Modified: hadoop/hive/trunk/conf/hive-default.xml
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/conf/hive-default.xml?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/conf/hive-default.xml (original)
+++ hadoop/hive/trunk/conf/hive-default.xml Fri Dec  4 02:21:39 2009
@@ -299,6 +299,12 @@
 </property>
 
 <property>
+  <name>hive.exec.parallel</name>
+  <value>false</value>
+  <description>Whether to execute jobs in parallel</description>
+</property>
+
+<property>
   <name>hive.hwi.listen.host</name>
   <value>0.0.0.0</value>
   <description>This is the host address the Hive Web Interface will listen on</description>

Modified: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/Driver.java?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/Driver.java (original)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/Driver.java Fri Dec  4 02:21:39 2009
@@ -40,6 +40,8 @@
 import org.apache.hadoop.hive.ql.session.SessionState.LogHelper;
 import org.apache.hadoop.hive.ql.exec.ExecDriver;
 import org.apache.hadoop.hive.ql.exec.Task;
+import org.apache.hadoop.hive.ql.exec.TaskRunner;
+import org.apache.hadoop.hive.ql.exec.TaskResult;
 import org.apache.hadoop.hive.ql.exec.FetchTask;
 import org.apache.hadoop.hive.ql.exec.TaskFactory;
 import org.apache.hadoop.hive.ql.exec.Utilities;
@@ -75,6 +77,10 @@
   private String errorMessage;
   private String SQLState;
 
+  // A limit on the number of threads that can be launched
+  private int maxthreads = 8;
+  private int sleeptime = 2000;
+
   public int countJobs(List<Task<? extends Serializable>> tasks) {
     return countJobs(tasks, new ArrayList<Task<? extends Serializable>>());
   }
@@ -389,6 +395,8 @@
         .getVar(HiveConf.ConfVars.HADOOPJOBNAME));
     int maxlen = conf.getIntVar(HiveConf.ConfVars.HIVEJOBNAMELENGTH);
 
+    int curJobNo=0;
+
     String queryId = plan.getQueryId();
     String queryStr = plan.getQueryStr();
 
@@ -426,62 +434,58 @@
       }
       String jobname = Utilities.abbreviate(queryStr, maxlen - 6);
 
-      int curJobNo = 0;
+      // A runtime that launches runnable tasks as separate Threads through TaskRunners
+      // As soon as a task isRunnable, it is put in a queue
+      // At any time, at most maxthreads tasks can be running
+      // The main thread polls the TaskRunners to check if they have finished.
 
-      // A very simple runtime that keeps putting runnable tasks on a list and
-      // when a job completes, it puts the children at the back of the list
-      // while taking the job to run from the front of the list
       Queue<Task<? extends Serializable>> runnable = new LinkedList<Task<? extends Serializable>>();
+      Map<TaskResult, TaskRunner> running = new HashMap<TaskResult, TaskRunner> ();
 
-      for (Task<? extends Serializable> rootTask : sem.getRootTasks()) {
-        if (runnable.offer(rootTask) == false) {
-          LOG.error("Could not insert the first task into the queue");
-          return (1);
-        }
+      //Add root Tasks to runnable
+
+      for (Task<? extends Serializable> tsk : sem.getRootTasks()) {
+        addToRunnable(runnable,tsk);
       }
 
-      while (runnable.peek() != null) {
-        Task<? extends Serializable> tsk = runnable.remove();
-        if (SessionState.get() != null) {
-          SessionState.get().getHiveHistory().startTask(queryId, tsk,
-              tsk.getClass().getName());
-        }
-        if (tsk.isMapRedTask()) {
-          curJobNo++;
-          if (noName) {
-            conf.setVar(HiveConf.ConfVars.HADOOPJOBNAME, jobname + "(" + curJobNo
-                        + "/" + jobs + ")");
-          }
-        }
+      // Loop while you either have tasks running, or tasks queued up
 
-        tsk.initialize(conf, plan);
-        int exitVal = tsk.executeTask();
-        if (SessionState.get() != null) {
-          SessionState.get().getHiveHistory().setTaskProperty(queryId,
-              tsk.getId(), Keys.TASK_RET_CODE, String.valueOf(exitVal));
-          SessionState.get().getHiveHistory().endTask(queryId, tsk);
+      while (running.size() != 0 || runnable.peek()!=null) {
+        // Launch upto maxthreads tasks
+        while(runnable.peek() != null && running.size() < maxthreads) {
+          Task<? extends Serializable> tsk = runnable.remove();
+          curJobNo = launchTask(tsk, queryId, noName,running, jobname, jobs, curJobNo);
         }
-        if (exitVal != 0) {
+
+        // poll the Tasks to see which one completed
+        TaskResult tskRes = pollTasks(running.keySet());
+        TaskRunner tskRun = running.remove(tskRes);
+        Task<? extends Serializable> tsk = tskRun.getTask();
+
+        int exitVal = tskRes.getExitVal();
+        if(exitVal != 0) {
           //TODO: This error messaging is not very informative. Fix that.
           errorMessage = "FAILED: Execution Error, return code " + exitVal
                          + " from " + tsk.getClass().getName();
           SQLState = "08S01";
           console.printError(errorMessage);
+          if(running.size() !=0) {
+            taskCleanup();
+          }
           return 9;
         }
 
-        if (tsk.getChildTasks() == null) {
-          continue;
+        if (SessionState.get() != null) {
+          SessionState.get().getHiveHistory().setTaskProperty(queryId,
+              tsk.getId(), Keys.TASK_RET_CODE, String.valueOf(exitVal));
+          SessionState.get().getHiveHistory().endTask(queryId, tsk);
         }
 
-        for (Task<? extends Serializable> child : tsk.getChildTasks()) {
-          // Check if the child is runnable
-          if (!child.isRunnable()) {
-            continue;
-          }
-
-          if (runnable.offer(child) == false) {
-            LOG.error("Could not add child task to queue");
+        if (tsk.getChildTasks() != null) {
+          for (Task<? extends Serializable> child : tsk.getChildTasks()) {
+            if(isLaunchable(child)) { 
+              addToRunnable(runnable,child);
+            }
           }
         }
       }
@@ -528,6 +532,114 @@
     return (0);
   }
 
+  /**
+   * Launches a new task
+   * 
+   * @param tsk      task being launched
+   * @param queryId  Id of the query containing the task
+   * @param noName   whether the task has a name set
+   * @param running map from taskresults to taskrunners
+   * @param jobname  name of the task, if it is a map-reduce job
+   * @param jobs     number of map-reduce jobs
+   * @param curJobNo the sequential number of the next map-reduce job
+   * @return         the updated number of last the map-reduce job launched
+   */
+
+
+
+  public int launchTask(Task<? extends Serializable> tsk, String queryId, 
+    boolean noName, Map<TaskResult,TaskRunner> running, String jobname, 
+    int jobs, int curJobNo) {
+    
+    if (SessionState.get() != null) {
+      SessionState.get().getHiveHistory().startTask(queryId, tsk,
+        tsk.getClass().getName());
+    }
+    if (tsk.isMapRedTask()) {
+      if (noName) {
+        conf.setVar(HiveConf.ConfVars.HADOOPJOBNAME, jobname + "(" 
+          + tsk.getId() + ")");
+      }
+      curJobNo++;
+      console.printInfo("Launching Job " + curJobNo + " out of "+jobs);
+    }
+    tsk.initialize(conf, plan);
+    TaskResult tskRes = new TaskResult();
+    TaskRunner tskRun = new TaskRunner(tsk,tskRes);
+
+    //Launch Task
+    if(HiveConf.getBoolVar(conf, HiveConf.ConfVars.EXECPARALLEL) && tsk.isMapRedTask()) {
+      // Launch it in the parallel mode, as a separate thread only for MR tasks
+      tskRun.start();
+    }
+    else
+    {
+      tskRun.runSequential();
+    }
+    running.put(tskRes,tskRun);        
+    return curJobNo;
+  }
+
+
+  /**
+   * Cleans up remaining tasks in case of failure
+   */
+   
+  public void taskCleanup() {
+    // The currently existing Shutdown hooks will be automatically called, 
+    // killing the map-reduce processes. 
+    // The non MR processes will be killed as well.
+    System.exit(9);
+  }
+
+  /**
+   * Polls running tasks to see if a task has ended.
+   * 
+   * @param results  Set of result objects for running tasks
+   * @return         The result object for any completed/failed task
+   */
+
+  public TaskResult pollTasks(Set<TaskResult> results) {
+    Iterator<TaskResult> resultIterator = results.iterator();
+    while(true) {
+      while(resultIterator.hasNext()) {
+        TaskResult tskRes = resultIterator.next();
+        if(tskRes.isRunning() == false) {
+          return tskRes;
+        }
+      }
+
+      // In this loop, nothing was found
+      // Sleep 10 seconds and restart
+      try {
+        Thread.sleep(sleeptime);
+      }
+      catch (InterruptedException ie) {
+        //Do Nothing
+        ;
+      }
+      resultIterator = results.iterator();
+    }
+  }
+
+  /**
+   * Checks if a task can be launched
+   * 
+   * @param tsk the task to be checked 
+   * @return    true if the task is launchable, false otherwise
+   */
+
+  public boolean isLaunchable(Task<? extends Serializable> tsk) {
+    // A launchable task is one that hasn't been queued, hasn't been initialized, and is runnable.
+    return !tsk.getQueued() && !tsk.getInitialized() && tsk.isRunnable();
+  }
+
+  public void addToRunnable(Queue<Task<? extends Serializable>> runnable,
+    Task<? extends Serializable> tsk) {
+    runnable.add(tsk);
+    tsk.setQueued();
+ }
+
   public boolean getResults(Vector<String> res) throws IOException {
     if (plan != null && plan.getPlan().getFetchTask() != null) {
       BaseSemanticAnalyzer sem = plan.getPlan();

Modified: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExecDriver.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExecDriver.java?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExecDriver.java (original)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExecDriver.java Fri Dec  4 02:21:39 2009
@@ -67,7 +67,8 @@
   transient protected JobConf job;
   transient protected int mapProgress = 0;
   transient protected int reduceProgress = 0;
-
+  
+  public static Random randGen = new Random();
   /**
    * Constructor when invoked from QL
    */
@@ -145,7 +146,8 @@
    * used to kill all running jobs in the event of an unexpected shutdown -
    * i.e., the JVM shuts down while there are still jobs running.
    */
-  public static HashMap<String, String> runningJobKillURIs = new HashMap<String, String>();
+  public static Map<String, String> runningJobKillURIs 
+    = Collections.synchronizedMap(new HashMap<String, String>());
 
   /**
    * In Hive, when the user control-c's the command line, any running jobs
@@ -160,22 +162,24 @@
         "webinterface.private.actions", false)) {
       Runtime.getRuntime().addShutdownHook(new Thread() {
         public void run() {
-          for (Iterator<String> elems = runningJobKillURIs.values().iterator(); elems
-              .hasNext();) {
-            String uri = elems.next();
-            try {
-              System.err.println("killing job with: " + uri);
-              java.net.HttpURLConnection conn = (java.net.HttpURLConnection) 
-                new java.net.URL(uri).openConnection();
-              conn.setRequestMethod("POST");
-              int retCode = conn.getResponseCode();
-              if (retCode != 200) {
-                System.err.println("Got an error trying to kill job with URI: "
-                    + uri + " = " + retCode);
+          synchronized(runningJobKillURIs) {
+            for (Iterator<String> elems = runningJobKillURIs.values().iterator(); elems
+                .hasNext();) {
+              String uri = elems.next();
+              try {
+                System.err.println("killing job with: " + uri);
+                java.net.HttpURLConnection conn = (java.net.HttpURLConnection) 
+                  new java.net.URL(uri).openConnection();
+                conn.setRequestMethod("POST");
+                int retCode = conn.getResponseCode();
+                if (retCode != 200) {
+                  System.err.println("Got an error trying to kill job with URI: "
+                      + uri + " = " + retCode);
+                }
+              } catch (Exception e) {
+                System.err.println("trying to kill job, caught: " + e);
+                // do nothing
               }
-            } catch (Exception e) {
-              System.err.println("trying to kill job, caught: " + e);
-              // do nothing
             }
           }
         }
@@ -247,7 +251,7 @@
       th.setRunningJob(jc.getJob(rj.getJobID()));
       updateCounters(th);
 
-      String report = " map = " + this.mapProgress + "%,  reduce = " + this.reduceProgress + "%";
+      String report = " "+getId()+" map = " + this.mapProgress + "%,  reduce = " + this.reduceProgress + "%";
 
       if (!report.equals(lastReport)
           || System.currentTimeMillis() >= reportTime + maxReportInterval) {
@@ -489,8 +493,17 @@
     RunningJob rj = null, orig_rj = null;
     boolean success = false;
 
+    boolean noName = StringUtils.isEmpty(HiveConf.
+      getVar(job,HiveConf.ConfVars.HADOOPJOBNAME));
+
+    if(noName) {
+      // This is for a special case to ensure unit tests pass
+      HiveConf.setVar(job,HiveConf.ConfVars.HADOOPJOBNAME, "JOB"+randGen.nextInt());
+    }
+
     try {
       addInputPaths(job, work, emptyScratchDirStr);
+
       Utilities.setMapRedWork(job, work);
 
       // remove the pwd from conf file so that job tracker doesn't show this logs
@@ -536,6 +549,7 @@
         console.printInfo(statusMesg);
       }
     } catch (Exception e) {
+      e.printStackTrace();
       String mesg = " with exception '" + Utilities.getNameMessage(e) + "'";
       if (rj != null) {
         mesg = "Ended Job = " + rj.getJobID() + mesg;

Modified: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Task.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Task.java?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Task.java (original)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Task.java Fri Dec  4 02:21:39 2009
@@ -40,7 +40,9 @@
 
   private static final long serialVersionUID = 1L;
   transient protected boolean started;
+  transient protected boolean initialized;
   transient protected boolean isdone;
+  transient protected boolean queued;
   transient protected HiveConf conf;
   transient protected Hive db;
   transient protected Log LOG;
@@ -57,6 +59,8 @@
   public Task() {
     isdone = false;
     started = false;
+    initialized = false;
+    queued = false;
     LOG = LogFactory.getLog(this.getClass().getName());
     this.taskCounters = new HashMap<String, Long>();
   }
@@ -65,6 +69,7 @@
     this.queryPlan = queryPlan;
     isdone = false;
     started = false;
+    setInitialized();
     this.conf = conf;
 
     try {
@@ -191,6 +196,22 @@
     isdone = true;
   }
 
+  public void setQueued() {
+    queued = true;
+  }
+
+  public boolean getQueued() {
+    return queued;
+  }
+
+  public void setInitialized() {
+    initialized = true;
+  }
+
+  public boolean getInitialized() {
+    return initialized;
+  }
+
   public boolean isRunnable() {
     boolean isrunnable = true;
     if (parentTasks != null) {

Added: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskResult.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskResult.java?rev=887036&view=auto
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskResult.java (added)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskResult.java Fri Dec  4 02:21:39 2009
@@ -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.hadoop.hive.ql.exec;
+
+import java.util.*;
+
+/**
+ * TaskResult implementation
+ **/
+
+public class TaskResult {
+  protected int exitVal;
+  protected boolean runStatus;
+  public TaskResult() {
+    exitVal = -1;
+    setRunning(true);
+  }
+
+  public void setExitVal(int exitVal) {
+    this.exitVal = exitVal;
+    setRunning(false);
+  }
+
+  public int getExitVal() {
+    return exitVal;
+  }
+
+  public boolean isRunning() {
+    return runStatus;
+  }
+
+  public void setRunning(boolean val) {
+    runStatus = val;
+  }
+}

Added: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskRunner.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskRunner.java?rev=887036&view=auto
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskRunner.java (added)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/TaskRunner.java Fri Dec  4 02:21:39 2009
@@ -0,0 +1,69 @@
+/**
+ * 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.hadoop.hive.ql.exec;
+
+import java.io.*;
+import java.util.*;
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.ql.QueryPlan;
+import org.apache.hadoop.hive.ql.metadata.Hive;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.session.SessionState;
+import org.apache.hadoop.hive.ql.session.SessionState.LogHelper;
+import org.apache.hadoop.util.StringUtils;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+/**
+ * TaskRunner implementation
+ **/
+
+public class TaskRunner extends Thread {
+  protected Task<? extends Serializable> tsk;
+  protected TaskResult result;
+  protected SessionState ss;
+
+  public TaskRunner(Task<? extends Serializable> tsk, TaskResult result) {
+    this.tsk = tsk;
+    this.result = result;
+    ss = SessionState.get();
+  }
+
+  public Task<? extends Serializable> getTask() {
+    return tsk;
+  }
+
+  public void run() {
+    SessionState.start(ss);
+    runSequential();
+  }
+
+  /**
+   * Launches a task, and sets its exit value in the result variable
+   */
+
+  public void runSequential() {
+    int exitVal = tsk.executeTask();
+    result.setExitVal(exitVal);
+  }
+
+
+}

Modified: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java (original)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java Fri Dec  4 02:21:39 2009
@@ -70,7 +70,8 @@
    */
 
   public static enum ReduceField { KEY, VALUE, ALIAS };
-  private static volatile mapredWork gWork = null;
+  private static Map<String, mapredWork> gWorkMap=
+    Collections.synchronizedMap(new HashMap<String, mapredWork>());
   static final private Log LOG = LogFactory.getLog(Utilities.class.getName());
 
   public static void clearMapRedWork (Configuration job) {
@@ -88,22 +89,31 @@
     } finally {
       // where a single process works with multiple plans - we must clear
       // the cache before working with the next plan.
-      gWork = null;
+      synchronized(gWorkMap) {
+        gWorkMap.remove(getJobName(job));
+      }
     }
   }
 
   public static mapredWork getMapRedWork (Configuration job) {
+    mapredWork gWork = null;
     try {
+      synchronized(gWorkMap) {
+        gWork = gWorkMap.get(getJobName(job));
+      }
       if(gWork == null) {
         synchronized (Utilities.class) {
           if(gWork != null)
             return (gWork);
-          InputStream in = new FileInputStream("HIVE_PLAN");
+          InputStream in = new FileInputStream("HIVE_PLAN"
+            +sanitizedJobId(job));
           mapredWork ret = deserializeMapRedWork(in, job);
           gWork = ret;
+          gWork.initialize();
+          gWorkMap.put(getJobName(job), gWork);
         }
-        gWork.initialize();
       }
+      
       return (gWork);
     } catch (Exception e) {
       e.printStackTrace();
@@ -151,12 +161,13 @@
       HiveConf.setVar(job, HiveConf.ConfVars.PLAN, planPath.toString());
       // Set up distributed cache
       DistributedCache.createSymlink(job);
-      String uriWithLink = planPath.toUri().toString() + "#HIVE_PLAN";
+      String uriWithLink = planPath.toUri().toString() + "#HIVE_PLAN"
+        +sanitizedJobId(job);
       DistributedCache.addCacheFile(new URI(uriWithLink), job);
       // Cache the object in this process too so lookups don't hit the file system
       synchronized (Utilities.class) {
-        gWork = w;
-        gWork.initialize();
+        w.initialize();
+        gWorkMap.put(getJobName(job),w);
       }
     } catch (Exception e) {
       e.printStackTrace();
@@ -164,6 +175,26 @@
     }
   }
 
+  public static String getJobName( Configuration job) {
+    String s = HiveConf.getVar(job, HiveConf.ConfVars.HADOOPJOBNAME);
+    // This is just a backup case. We would like Hive to always have jobnames.
+    if(s == null) {
+      // There is no job name => we set one
+      s = "JOB"+randGen.nextInt();
+      HiveConf.setVar(job, HiveConf.ConfVars.HADOOPJOBNAME, s);
+    }
+    return s;
+  }
+
+  /**
+   * Returns a unique ID for the job.
+   */
+
+  public static int sanitizedJobId(Configuration job) {
+    String s = getJobName(job);
+    return s.hashCode();
+  }
+
   public static void serializeTasks(Task<? extends Serializable> t, OutputStream out) {
     XMLEncoder e = new XMLEncoder(out);
     // workaround for java 1.5
@@ -785,6 +816,7 @@
     }
     return sb.toString();
   }
+  
   /**
    * Gets the default notification interval to send progress updates to the
    * tracker. Useful for operators that may not output data for a while.

Modified: hadoop/hive/trunk/ql/src/test/queries/clientpositive/input41.q
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/test/queries/clientpositive/input41.q?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/test/queries/clientpositive/input41.q (original)
+++ hadoop/hive/trunk/ql/src/test/queries/clientpositive/input41.q Fri Dec  4 02:21:39 2009
@@ -1,14 +1,27 @@
 set hive.mapred.mode=strict;
 
+create table dest_sp (cnt int);
+
+insert overwrite table dest_sp
 select * from 
-  (select count(1) from src 
+  (select count(1) as cnt from src 
     union all
-   select count(1) from srcpart where ds = '2009-08-09'
+   select count(1) as cnt from srcpart where ds = '2009-08-09'
   )x;
+
+select * from dest_sp x order by x.cnt limit 2;
+
+drop table dest_sp;
    
+create table dest_sp (key string, val string);
 
+insert overwrite table dest_sp
 select * from 
   (select * from src 
     union all
    select * from srcpart where ds = '2009-08-09'
   )x;
+
+select * from dest_sp x order by x.key limit 10000;
+
+drop table dest_sp;

Modified: hadoop/hive/trunk/ql/src/test/queries/clientpositive/input42.q
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/test/queries/clientpositive/input42.q?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/test/queries/clientpositive/input42.q (original)
+++ hadoop/hive/trunk/ql/src/test/queries/clientpositive/input42.q Fri Dec  4 02:21:39 2009
@@ -1,16 +1,16 @@
 explain extended
-select * from srcpart a where a.ds='2008-04-08';
+select * from srcpart a where a.ds='2008-04-08' order by a.key, a.hr;
 
-select * from srcpart a where a.ds='2008-04-08';
+select * from srcpart a where a.ds='2008-04-08' order by a.key, a.hr;
 
 
 explain extended
-select * from srcpart a where a.ds='2008-04-08' and key < 200;
+select * from srcpart a where a.ds='2008-04-08' and key < 200 order by a.key, a.hr;
 
-select * from srcpart a where a.ds='2008-04-08' and key < 200;
+select * from srcpart a where a.ds='2008-04-08' and key < 200 order by a.key, a.hr;
 
 
 explain extended
-select * from srcpart a where a.ds='2008-04-08' and rand(100) < 0.1;
+select * from srcpart a where a.ds='2008-04-08' and rand(100) < 0.1 order by a.key, a.hr;
 
-select * from srcpart a where a.ds='2008-04-08' and rand(100) < 0.1;
+select * from srcpart a where a.ds='2008-04-08' and rand(100) < 0.1 order by a.key, a.hr;

Modified: hadoop/hive/trunk/ql/src/test/queries/clientpositive/input_part9.q
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/test/queries/clientpositive/input_part9.q?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/test/queries/clientpositive/input_part9.q (original)
+++ hadoop/hive/trunk/ql/src/test/queries/clientpositive/input_part9.q Fri Dec  4 02:21:39 2009
@@ -1,5 +1,5 @@
 EXPLAIN EXTENDED
-SELECT x.* FROM SRCPART x WHERE key IS NOT NULL AND ds = '2008-04-08';
+SELECT x.* FROM SRCPART x WHERE key IS NOT NULL AND ds = '2008-04-08' order by x.key, x.hr;
 
-SELECT x.* FROM SRCPART x WHERE key IS NOT NULL AND ds = '2008-04-08';
+SELECT x.* FROM SRCPART x WHERE key IS NOT NULL AND ds = '2008-04-08' order by x.key, x.hr;
 

Modified: hadoop/hive/trunk/ql/src/test/results/clientpositive/input41.q.out
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/test/results/clientpositive/input41.q.out?rev=887036&r1=887035&r2=887036&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/test/results/clientpositive/input41.q.out (original)
+++ hadoop/hive/trunk/ql/src/test/results/clientpositive/input41.q.out Fri Dec  4 02:21:39 2009
@@ -1,534 +1,574 @@
-PREHOOK: query: select * from 
-  (select count(1) from src 
+PREHOOK: query: create table dest_sp (cnt int)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table dest_sp (cnt int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@dest_sp
+PREHOOK: query: insert overwrite table dest_sp
+select * from 
+  (select count(1) as cnt from src 
     union all
-   select count(1) from srcpart where ds = '2009-08-09'
+   select count(1) as cnt from srcpart where ds = '2009-08-09'
   )x
 PREHOOK: type: QUERY
 PREHOOK: Input: default@src
-PREHOOK: Output: file:/data/users/njain/hive5/hive5/build/ql/tmp/576939637/10000
-POSTHOOK: query: select * from 
-  (select count(1) from src 
+PREHOOK: Output: default@dest_sp
+POSTHOOK: query: insert overwrite table dest_sp
+select * from 
+  (select count(1) as cnt from src 
     union all
-   select count(1) from srcpart where ds = '2009-08-09'
+   select count(1) as cnt from srcpart where ds = '2009-08-09'
   )x
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@src
-POSTHOOK: Output: file:/data/users/njain/hive5/hive5/build/ql/tmp/576939637/10000
-500
+POSTHOOK: Output: default@dest_sp
+PREHOOK: query: select * from dest_sp x order by x.cnt limit 2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@dest_sp
+PREHOOK: Output: file:/data/users/cmishra/apachehive/hive-trunk/build/ql/tmp/1746002792/10000
+POSTHOOK: query: select * from dest_sp x order by x.cnt limit 2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@dest_sp
+POSTHOOK: Output: file:/data/users/cmishra/apachehive/hive-trunk/build/ql/tmp/1746002792/10000
 0
-PREHOOK: query: select * from 
+500
+PREHOOK: query: drop table dest_sp
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table dest_sp
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Output: default@dest_sp
+PREHOOK: query: create table dest_sp (key string, val string)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table dest_sp (key string, val string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@dest_sp
+PREHOOK: query: insert overwrite table dest_sp
+select * from 
   (select * from src 
     union all
    select * from srcpart where ds = '2009-08-09'
   )x
 PREHOOK: type: QUERY
 PREHOOK: Input: default@src
-PREHOOK: Output: file:/data/users/njain/hive5/hive5/build/ql/tmp/563082762/10000
-POSTHOOK: query: select * from 
+PREHOOK: Output: default@dest_sp
+POSTHOOK: query: insert overwrite table dest_sp
+select * from 
   (select * from src 
     union all
    select * from srcpart where ds = '2009-08-09'
   )x
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@src
-POSTHOOK: Output: file:/data/users/njain/hive5/hive5/build/ql/tmp/563082762/10000
-238	val_238
-86	val_86
-311	val_311
-27	val_27
-165	val_165
-409	val_409
-255	val_255
-278	val_278
-98	val_98
-484	val_484
-265	val_265
-193	val_193
-401	val_401
-150	val_150
-273	val_273
-224	val_224
-369	val_369
-66	val_66
+POSTHOOK: Output: default@dest_sp
+PREHOOK: query: select * from dest_sp x order by x.key limit 10000
+PREHOOK: type: QUERY
+PREHOOK: Input: default@dest_sp
+PREHOOK: Output: file:/data/users/cmishra/apachehive/hive-trunk/build/ql/tmp/379757919/10000
+POSTHOOK: query: select * from dest_sp x order by x.key limit 10000
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@dest_sp
+POSTHOOK: Output: file:/data/users/cmishra/apachehive/hive-trunk/build/ql/tmp/379757919/10000
+0	val_0
+0	val_0
+0	val_0
+10	val_10
+100	val_100
+100	val_100
+103	val_103
+103	val_103
+104	val_104
+104	val_104
+105	val_105
+11	val_11
+111	val_111
+113	val_113
+113	val_113
+114	val_114
+116	val_116
+118	val_118
+118	val_118
+119	val_119
+119	val_119
+119	val_119
+12	val_12
+12	val_12
+120	val_120
+120	val_120
+125	val_125
+125	val_125
+126	val_126
 128	val_128
-213	val_213
-146	val_146
-406	val_406
-429	val_429
-374	val_374
-152	val_152
-469	val_469
+128	val_128
+128	val_128
+129	val_129
+129	val_129
+131	val_131
+133	val_133
+134	val_134
+134	val_134
+136	val_136
+137	val_137
+137	val_137
+138	val_138
+138	val_138
+138	val_138
+138	val_138
+143	val_143
 145	val_145
-495	val_495
-37	val_37
-327	val_327
-281	val_281
-277	val_277
-209	val_209
+146	val_146
+146	val_146
+149	val_149
+149	val_149
 15	val_15
-82	val_82
-403	val_403
-166	val_166
-417	val_417
-430	val_430
-252	val_252
-292	val_292
-219	val_219
-287	val_287
+15	val_15
+150	val_150
+152	val_152
+152	val_152
 153	val_153
-193	val_193
-338	val_338
-446	val_446
-459	val_459
-394	val_394
-237	val_237
-482	val_482
-174	val_174
-413	val_413
-494	val_494
-207	val_207
-199	val_199
-466	val_466
-208	val_208
-174	val_174
-399	val_399
-396	val_396
-247	val_247
-417	val_417
-489	val_489
+155	val_155
+156	val_156
+157	val_157
+158	val_158
+160	val_160
 162	val_162
-377	val_377
-397	val_397
-309	val_309
-365	val_365
-266	val_266
-439	val_439
-342	val_342
-367	val_367
-325	val_325
+163	val_163
+164	val_164
+164	val_164
+165	val_165
+165	val_165
+166	val_166
 167	val_167
-195	val_195
-475	val_475
+167	val_167
+167	val_167
+168	val_168
+169	val_169
+169	val_169
+169	val_169
+169	val_169
 17	val_17
-113	val_113
-155	val_155
-203	val_203
-339	val_339
-0	val_0
-455	val_455
-128	val_128
-311	val_311
-316	val_316
-57	val_57
-302	val_302
-205	val_205
-149	val_149
-438	val_438
-345	val_345
-129	val_129
 170	val_170
-20	val_20
-489	val_489
-157	val_157
-378	val_378
-221	val_221
-92	val_92
-111	val_111
-47	val_47
-72	val_72
-4	val_4
-280	val_280
-35	val_35
-427	val_427
-277	val_277
-208	val_208
-356	val_356
-399	val_399
-169	val_169
-382	val_382
-498	val_498
-125	val_125
-386	val_386
-437	val_437
-469	val_469
-192	val_192
-286	val_286
-187	val_187
+172	val_172
+172	val_172
+174	val_174
+174	val_174
+175	val_175
+175	val_175
 176	val_176
-54	val_54
-459	val_459
-51	val_51
-138	val_138
-103	val_103
-239	val_239
-213	val_213
-216	val_216
-430	val_430
-278	val_278
 176	val_176
-289	val_289
-221	val_221
-65	val_65
-318	val_318
-332	val_332
-311	val_311
-275	val_275
-137	val_137
-241	val_241
-83	val_83
-333	val_333
+177	val_177
+178	val_178
+179	val_179
+179	val_179
+18	val_18
+18	val_18
 180	val_180
-284	val_284
-12	val_12
-230	val_230
 181	val_181
-67	val_67
-260	val_260
-404	val_404
-384	val_384
-489	val_489
-353	val_353
-373	val_373
-272	val_272
-138	val_138
-217	val_217
-84	val_84
-348	val_348
-466	val_466
-58	val_58
-8	val_8
-411	val_411
-230	val_230
-208	val_208
-348	val_348
-24	val_24
-463	val_463
-431	val_431
-179	val_179
-172	val_172
-42	val_42
-129	val_129
-158	val_158
-119	val_119
-496	val_496
-0	val_0
-322	val_322
-197	val_197
-468	val_468
-393	val_393
-454	val_454
-100	val_100
-298	val_298
-199	val_199
+183	val_183
+186	val_186
+187	val_187
+187	val_187
+187	val_187
+189	val_189
+19	val_19
+190	val_190
 191	val_191
-418	val_418
-96	val_96
-26	val_26
-165	val_165
-327	val_327
-230	val_230
-205	val_205
-120	val_120
-131	val_131
-51	val_51
-404	val_404
-43	val_43
-436	val_436
-156	val_156
-469	val_469
-468	val_468
-308	val_308
-95	val_95
+191	val_191
+192	val_192
+193	val_193
+193	val_193
+193	val_193
+194	val_194
+195	val_195
+195	val_195
 196	val_196
-288	val_288
-481	val_481
-457	val_457
-98	val_98
-282	val_282
 197	val_197
-187	val_187
-318	val_318
-318	val_318
-409	val_409
-470	val_470
-137	val_137
-369	val_369
-316	val_316
-169	val_169
-413	val_413
-85	val_85
-77	val_77
-0	val_0
-490	val_490
-87	val_87
-364	val_364
-179	val_179
-118	val_118
-134	val_134
-395	val_395
-282	val_282
-138	val_138
-238	val_238
-419	val_419
-15	val_15
-118	val_118
-72	val_72
-90	val_90
-307	val_307
-19	val_19
-435	val_435
-10	val_10
-277	val_277
-273	val_273
-306	val_306
+197	val_197
+199	val_199
+199	val_199
+199	val_199
+2	val_2
+20	val_20
+200	val_200
+200	val_200
+201	val_201
+202	val_202
+203	val_203
+203	val_203
+205	val_205
+205	val_205
+207	val_207
+207	val_207
+208	val_208
+208	val_208
+208	val_208
+209	val_209
+209	val_209
+213	val_213
+213	val_213
+214	val_214
+216	val_216
+216	val_216
+217	val_217
+217	val_217
+218	val_218
+219	val_219
+219	val_219
+221	val_221
+221	val_221
+222	val_222
+223	val_223
+223	val_223
+224	val_224
 224	val_224
-309	val_309
-389	val_389
-327	val_327
-242	val_242
-369	val_369
-392	val_392
-272	val_272
-331	val_331
-401	val_401
-242	val_242
-452	val_452
-177	val_177
 226	val_226
-5	val_5
-497	val_497
-402	val_402
-396	val_396
-317	val_317
-395	val_395
-58	val_58
-35	val_35
-336	val_336
-95	val_95
-11	val_11
-168	val_168
-34	val_34
-229	val_229
-233	val_233
-143	val_143
-472	val_472
-322	val_322
-498	val_498
-160	val_160
-195	val_195
-42	val_42
-321	val_321
-430	val_430
-119	val_119
-489	val_489
-458	val_458
-78	val_78
-76	val_76
-41	val_41
-223	val_223
-492	val_492
-149	val_149
-449	val_449
-218	val_218
 228	val_228
-138	val_138
-453	val_453
-30	val_30
-209	val_209
-64	val_64
-468	val_468
-76	val_76
-74	val_74
-342	val_342
-69	val_69
+229	val_229
+229	val_229
 230	val_230
-33	val_33
-368	val_368
-103	val_103
-296	val_296
-113	val_113
-216	val_216
-367	val_367
-344	val_344
-167	val_167
-274	val_274
-219	val_219
+230	val_230
+230	val_230
+230	val_230
+230	val_230
+233	val_233
+233	val_233
+235	val_235
+237	val_237
+237	val_237
+238	val_238
+238	val_238
 239	val_239
-485	val_485
-116	val_116
-223	val_223
+239	val_239
+24	val_24
+24	val_24
+241	val_241
+242	val_242
+242	val_242
+244	val_244
+247	val_247
+248	val_248
+249	val_249
+252	val_252
+255	val_255
+255	val_255
+256	val_256
 256	val_256
+257	val_257
+258	val_258
+26	val_26
+26	val_26
+260	val_260
+262	val_262
 263	val_263
-70	val_70
-487	val_487
-480	val_480
-401	val_401
-288	val_288
-191	val_191
-5	val_5
-244	val_244
-438	val_438
-128	val_128
-467	val_467
-432	val_432
-202	val_202
-316	val_316
-229	val_229
-469	val_469
-463	val_463
+265	val_265
+265	val_265
+266	val_266
+27	val_27
+272	val_272
+272	val_272
+273	val_273
+273	val_273
+273	val_273
+274	val_274
+275	val_275
+277	val_277
+277	val_277
+277	val_277
+277	val_277
+278	val_278
+278	val_278
+28	val_28
 280	val_280
-2	val_2
-35	val_35
+280	val_280
+281	val_281
+281	val_281
+282	val_282
+282	val_282
 283	val_283
-331	val_331
-235	val_235
-80	val_80
-44	val_44
-193	val_193
+284	val_284
+285	val_285
+286	val_286
+287	val_287
+288	val_288
+288	val_288
+289	val_289
+291	val_291
+292	val_292
+296	val_296
+298	val_298
+298	val_298
+298	val_298
+30	val_30
+302	val_302
+305	val_305
+306	val_306
+307	val_307
+307	val_307
+308	val_308
+309	val_309
+309	val_309
+310	val_310
+311	val_311
+311	val_311
+311	val_311
+315	val_315
+316	val_316
+316	val_316
+316	val_316
+317	val_317
+317	val_317
+318	val_318
+318	val_318
+318	val_318
+321	val_321
 321	val_321
+322	val_322
+322	val_322
+323	val_323
+325	val_325
+325	val_325
+327	val_327
+327	val_327
+327	val_327
+33	val_33
+331	val_331
+331	val_331
+332	val_332
+333	val_333
+333	val_333
 335	val_335
-104	val_104
-466	val_466
+336	val_336
+338	val_338
+339	val_339
+34	val_34
+341	val_341
+342	val_342
+342	val_342
+344	val_344
+344	val_344
+345	val_345
+348	val_348
+348	val_348
+348	val_348
+348	val_348
+348	val_348
+35	val_35
+35	val_35
+35	val_35
+351	val_351
+353	val_353
+353	val_353
+356	val_356
+360	val_360
+362	val_362
+364	val_364
+365	val_365
 366	val_366
-175	val_175
-403	val_403
-483	val_483
-53	val_53
-105	val_105
-257	val_257
-406	val_406
-409	val_409
-190	val_190
-406	val_406
+367	val_367
+367	val_367
+368	val_368
+369	val_369
+369	val_369
+369	val_369
+37	val_37
+37	val_37
+373	val_373
+374	val_374
+375	val_375
+377	val_377
+378	val_378
+379	val_379
+382	val_382
+382	val_382
+384	val_384
+384	val_384
+384	val_384
+386	val_386
+389	val_389
+392	val_392
+393	val_393
+394	val_394
+395	val_395
+395	val_395
+396	val_396
+396	val_396
+396	val_396
+397	val_397
+397	val_397
+399	val_399
+399	val_399
+4	val_4
+400	val_400
 401	val_401
-114	val_114
-258	val_258
-90	val_90
-203	val_203
-262	val_262
-348	val_348
+401	val_401
+401	val_401
+401	val_401
+401	val_401
+402	val_402
+403	val_403
+403	val_403
+403	val_403
+404	val_404
+404	val_404
+406	val_406
+406	val_406
+406	val_406
+406	val_406
+407	val_407
+409	val_409
+409	val_409
+409	val_409
+41	val_41
+411	val_411
+413	val_413
+413	val_413
+414	val_414
+414	val_414
+417	val_417
+417	val_417
+417	val_417
+418	val_418
+419	val_419
+42	val_42
+42	val_42
+421	val_421
 424	val_424
-12	val_12
-396	val_396
-201	val_201
-217	val_217
-164	val_164
+424	val_424
+427	val_427
+429	val_429
+429	val_429
+43	val_43
+430	val_430
+430	val_430
+430	val_430
 431	val_431
-454	val_454
-478	val_478
-298	val_298
-125	val_125
 431	val_431
-164	val_164
-424	val_424
-187	val_187
-382	val_382
-5	val_5
-70	val_70
-397	val_397
-480	val_480
-291	val_291
-24	val_24
-351	val_351
-255	val_255
-104	val_104
-70	val_70
-163	val_163
+431	val_431
+432	val_432
+435	val_435
+436	val_436
+437	val_437
+438	val_438
+438	val_438
 438	val_438
-119	val_119
-414	val_414
-200	val_200
-491	val_491
-237	val_237
 439	val_439
-360	val_360
-248	val_248
-479	val_479
-305	val_305
-417	val_417
-199	val_199
-444	val_444
-120	val_120
-429	val_429
-169	val_169
+439	val_439
+44	val_44
 443	val_443
-323	val_323
-325	val_325
-277	val_277
-230	val_230
-478	val_478
-178	val_178
-468	val_468
-310	val_310
-317	val_317
-333	val_333
-493	val_493
+444	val_444
+446	val_446
+448	val_448
+449	val_449
+452	val_452
+453	val_453
+454	val_454
+454	val_454
+454	val_454
+455	val_455
+457	val_457
+458	val_458
+458	val_458
+459	val_459
+459	val_459
 460	val_460
-207	val_207
-249	val_249
-265	val_265
-480	val_480
-83	val_83
-136	val_136
-353	val_353
-172	val_172
-214	val_214
 462	val_462
-233	val_233
-406	val_406
-133	val_133
-175	val_175
-189	val_189
-454	val_454
-375	val_375
-401	val_401
-421	val_421
-407	val_407
-384	val_384
-256	val_256
-26	val_26
-134	val_134
-67	val_67
-384	val_384
-379	val_379
-18	val_18
 462	val_462
+463	val_463
+463	val_463
+466	val_466
+466	val_466
+466	val_466
+467	val_467
+468	val_468
+468	val_468
+468	val_468
+468	val_468
+469	val_469
+469	val_469
+469	val_469
+469	val_469
+469	val_469
+47	val_47
+470	val_470
+472	val_472
+475	val_475
+477	val_477
+478	val_478
+478	val_478
+479	val_479
+480	val_480
+480	val_480
+480	val_480
+481	val_481
+482	val_482
+483	val_483
+484	val_484
+485	val_485
+487	val_487
+489	val_489
+489	val_489
+489	val_489
+489	val_489
+490	val_490
+491	val_491
 492	val_492
-100	val_100
-298	val_298
-9	val_9
-341	val_341
+492	val_492
+493	val_493
+494	val_494
+495	val_495
+496	val_496
+497	val_497
 498	val_498
-146	val_146
-458	val_458
-362	val_362
-186	val_186
-285	val_285
-348	val_348
-167	val_167
-18	val_18
-273	val_273
-183	val_183
-281	val_281
-344	val_344
-97	val_97
-469	val_469
-315	val_315
+498	val_498
+498	val_498
+5	val_5
+5	val_5
+5	val_5
+51	val_51
+51	val_51
+53	val_53
+54	val_54
+57	val_57
+58	val_58
+58	val_58
+64	val_64
+65	val_65
+66	val_66
+67	val_67
+67	val_67
+69	val_69
+70	val_70
+70	val_70
+70	val_70
+72	val_72
+72	val_72
+74	val_74
+76	val_76
+76	val_76
+77	val_77
+78	val_78
+8	val_8
+80	val_80
+82	val_82
+83	val_83
+83	val_83
 84	val_84
-28	val_28
-37	val_37
-448	val_448
-152	val_152
-348	val_348
-307	val_307
-194	val_194
-414	val_414
-477	val_477
-222	val_222
-126	val_126
+84	val_84
+85	val_85
+86	val_86
+87	val_87
+9	val_9
 90	val_90
-169	val_169
-403	val_403
-400	val_400
-200	val_200
+90	val_90
+90	val_90
+92	val_92
+95	val_95
+95	val_95
+96	val_96
+97	val_97
 97	val_97
+98	val_98
+98	val_98
+PREHOOK: query: drop table dest_sp
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table dest_sp
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Output: default@dest_sp