You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jv...@apache.org on 2011/09/07 20:13:09 UTC

svn commit: r1166293 - in /hive/trunk/ql/src: java/org/apache/hadoop/hive/ql/parse/UnparseTranslator.java test/queries/clientpositive/join_view.q test/results/clientpositive/join_view.q.out

Author: jvs
Date: Wed Sep  7 18:13:08 2011
New Revision: 1166293

URL: http://svn.apache.org/viewvc?rev=1166293&view=rev
Log:
HIVE-2426. Test that views with joins work properly.
(Charles Chen via jvs)


Added:
    hive/trunk/ql/src/test/queries/clientpositive/join_view.q
    hive/trunk/ql/src/test/results/clientpositive/join_view.q.out
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/UnparseTranslator.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/UnparseTranslator.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/UnparseTranslator.java?rev=1166293&r1=1166292&r2=1166293&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/UnparseTranslator.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/UnparseTranslator.java Wed Sep  7 18:13:08 2011
@@ -58,9 +58,12 @@ class UnparseTranslator {
 
   /**
    * Register a translation to be performed as part of unparse.
-   * The translation must not overlap with any previously
-   * registered translations (unless it is identical to an
-   * existing translation, in which case it is ignored).
+   * If the translation overlaps with any previously
+   * registered translation, then it must be either
+   * identical or a prefix (in which cases it is ignored),
+   * or else it must extend the existing translation (i.e.
+   * the existing translation must be a prefix of the new translation).
+   * All other overlap cases result in assertion failures.
    *
    * @param node
    *          target node whose subtree is to be replaced
@@ -87,10 +90,11 @@ class UnparseTranslator {
     translation.tokenStopIndex = tokenStopIndex;
     translation.replacementText = replacementText;
 
-    // Sanity check: no overlap with regions already being expanded
+    // Sanity check for overlap with regions already being expanded
     assert (tokenStopIndex >= tokenStartIndex);
     Map.Entry<Integer, Translation> existingEntry;
     existingEntry = translations.floorEntry(tokenStartIndex);
+    boolean prefix = false;
     if (existingEntry != null) {
       if (existingEntry.getKey().equals(tokenStartIndex)) {
         if (existingEntry.getValue().tokenStopIndex == tokenStopIndex) {
@@ -99,16 +103,32 @@ class UnparseTranslator {
             // redundant, but we'll let it pass
             return;
           }
+        } else if (tokenStopIndex > existingEntry.getValue().tokenStopIndex) {
+          // is existing mapping a prefix for new mapping? if so, that's also
+          // redundant, but in this case we need to expand it
+          prefix = replacementText.startsWith(
+            existingEntry.getValue().replacementText);
+          assert(prefix);
+        } else {
+          // new mapping is a prefix for existing mapping:  ignore it
+          prefix = existingEntry.getValue().replacementText.startsWith(
+            replacementText);
+          assert(prefix);
+          return;
         }
       }
-      assert (existingEntry.getValue().tokenStopIndex < tokenStartIndex);
+      if (!prefix) {
+        assert (existingEntry.getValue().tokenStopIndex < tokenStartIndex);
+      }
     }
-    existingEntry = translations.ceilingEntry(tokenStartIndex);
-    if (existingEntry != null) {
-      assert (existingEntry.getKey() > tokenStopIndex);
+    if (!prefix) {
+      existingEntry = translations.ceilingEntry(tokenStartIndex);
+      if (existingEntry != null) {
+        assert (existingEntry.getKey() > tokenStopIndex);
+      }
     }
 
-    // It's all good: create a new entry in the map
+    // It's all good: create a new entry in the map (or update existing one)
     translations.put(tokenStartIndex, translation);
   }
 

Added: hive/trunk/ql/src/test/queries/clientpositive/join_view.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/join_view.q?rev=1166293&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/join_view.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/join_view.q Wed Sep  7 18:13:08 2011
@@ -0,0 +1,16 @@
+drop table invites;
+drop table invites2;
+create table invites (foo int, bar string) partitioned by (ds string);
+create table invites2 (foo int, bar string) partitioned by (ds string);
+
+set hive.mapred.mode=strict;
+
+-- test join views: see HIVE-1989
+
+create view v as select invites.bar, invites2.foo, invites2.ds from invites join invites2 on invites.ds=invites2.ds;
+
+explain select * from v where ds='2011-09-01';
+
+drop view v;
+drop table invites;
+drop table invites2;
\ No newline at end of file

Added: hive/trunk/ql/src/test/results/clientpositive/join_view.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/join_view.q.out?rev=1166293&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/join_view.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/join_view.q.out Wed Sep  7 18:13:08 2011
@@ -0,0 +1,147 @@
+PREHOOK: query: drop table invites
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table invites
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: drop table invites2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table invites2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table invites (foo int, bar string) partitioned by (ds string)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table invites (foo int, bar string) partitioned by (ds string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@invites
+PREHOOK: query: create table invites2 (foo int, bar string) partitioned by (ds string)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table invites2 (foo int, bar string) partitioned by (ds string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@invites2
+PREHOOK: query: -- test join views: see HIVE-1989
+
+create view v as select invites.bar, invites2.foo, invites2.ds from invites join invites2 on invites.ds=invites2.ds
+PREHOOK: type: CREATEVIEW
+PREHOOK: Output: file:/var/folders/nt/ng21tg0n1jl4547lw0k8lg6hq_nw87/T/charleschen/hive_2011-09-01_22-51-19_156_3637363787057278672/-mr-10000
+POSTHOOK: query: -- test join views: see HIVE-1989
+
+create view v as select invites.bar, invites2.foo, invites2.ds from invites join invites2 on invites.ds=invites2.ds
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Output: default@v
+POSTHOOK: Output: file:/var/folders/nt/ng21tg0n1jl4547lw0k8lg6hq_nw87/T/charleschen/hive_2011-09-01_22-51-19_156_3637363787057278672/-mr-10000
+PREHOOK: query: explain select * from v where ds='2011-09-01'
+PREHOOK: type: QUERY
+POSTHOOK: query: explain select * from v where ds='2011-09-01'
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+  (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME v))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR TOK_ALLCOLREF)) (TOK_WHERE (= (TOK_TABLE_OR_COL ds) '2011-09-01'))))
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Alias -> Map Operator Tree:
+        v:invites 
+          TableScan
+            alias: invites
+            Filter Operator
+              predicate:
+                  expr: (ds = '2011-09-01')
+                  type: boolean
+              Reduce Output Operator
+                key expressions:
+                      expr: ds
+                      type: string
+                sort order: +
+                Map-reduce partition columns:
+                      expr: ds
+                      type: string
+                tag: 0
+                value expressions:
+                      expr: bar
+                      type: string
+        v:invites2 
+          TableScan
+            alias: invites2
+            Filter Operator
+              predicate:
+                  expr: (ds = '2011-09-01')
+                  type: boolean
+              Reduce Output Operator
+                key expressions:
+                      expr: ds
+                      type: string
+                sort order: +
+                Map-reduce partition columns:
+                      expr: ds
+                      type: string
+                tag: 1
+                value expressions:
+                      expr: foo
+                      type: int
+                      expr: ds
+                      type: string
+      Reduce Operator Tree:
+        Join Operator
+          condition map:
+               Inner Join 0 to 1
+          condition expressions:
+            0 {VALUE._col1}
+            1 {VALUE._col0} {VALUE._col2}
+          handleSkewJoin: false
+          outputColumnNames: _col1, _col5, _col7
+          Select Operator
+            expressions:
+                  expr: _col1
+                  type: string
+                  expr: _col5
+                  type: int
+                  expr: _col7
+                  type: string
+            outputColumnNames: _col0, _col1, _col2
+            Select Operator
+              expressions:
+                    expr: _col0
+                    type: string
+                    expr: _col1
+                    type: int
+                    expr: _col2
+                    type: string
+              outputColumnNames: _col0, _col1, _col2
+              File Output Operator
+                compressed: false
+                GlobalTableId: 0
+                table:
+                    input format: org.apache.hadoop.mapred.TextInputFormat
+                    output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+
+
+PREHOOK: query: drop view v
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@v
+PREHOOK: Output: default@v
+POSTHOOK: query: drop view v
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@v
+POSTHOOK: Output: default@v
+PREHOOK: query: drop table invites
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@invites
+PREHOOK: Output: default@invites
+POSTHOOK: query: drop table invites
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@invites
+POSTHOOK: Output: default@invites
+PREHOOK: query: drop table invites2
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@invites2
+PREHOOK: Output: default@invites2
+POSTHOOK: query: drop table invites2
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@invites2
+POSTHOOK: Output: default@invites2