Author: xuefu
Date: Mon Dec 16 15:03:45 2013
New Revision: 1551221
URL: http://svn.apache.org/r1551221
Log:
HIVE-6022: Load statements with incorrect order of partitions put input files
to unreadable places (Teruyoshi Zenmyo via Xuefu)
Added:
hive/trunk/ql/src/test/queries/clientpositive/loadpart2.q
hive/trunk/ql/src/test/results/clientpositive/loadpart2.q.out
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
hive/trunk/ql/src/test/results/clientnegative/dyn_part4.q.out
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java?rev=1551221&r1=1551220&r2=1551221&view=diff
==============================================================================
---
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
(original)
+++
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
Mon Dec 16 15:03:45 2013
@@ -750,7 +750,7 @@ public abstract class BaseSemanticAnalyz
ASTNode partspec = (ASTNode) ast.getChild(1);
partitions = new ArrayList<Partition>();
// partSpec is a mapping from partition column name to its value.
- partSpec = new LinkedHashMap<String, String>(partspec.getChildCount());
+ Map<String, String> tmpPartSpec = new HashMap<String,
String>(partspec.getChildCount());
for (int i = 0; i < partspec.getChildCount(); ++i) {
ASTNode partspec_val = (ASTNode) partspec.getChild(i);
String val = null;
@@ -765,15 +765,21 @@ public abstract class BaseSemanticAnalyz
} else { // in the form of T partition (ds="2010-03-03")
val = stripQuotes(partspec_val.getChild(1).getText());
}
- partSpec.put(colName, val);
+ tmpPartSpec.put(colName, val);
}
// check if the columns, as well as value types in the partition()
clause are valid
- validatePartSpec(tableHandle, partSpec, ast, conf);
+ validatePartSpec(tableHandle, tmpPartSpec, ast, conf);
+
+ List<FieldSchema> parts = tableHandle.getPartitionKeys();
+ partSpec = new LinkedHashMap<String, String>(partspec.getChildCount());
+ for (FieldSchema fs : parts) {
+ String partKey = fs.getName();
+ partSpec.put(partKey, tmpPartSpec.get(partKey));
+ }
// check if the partition spec is valid
if (numDynParts > 0) {
- List<FieldSchema> parts = tableHandle.getPartitionKeys();
int numStaPart = parts.size() - numDynParts;
if (numStaPart == 0 &&
conf.getVar(HiveConf.ConfVars.DYNAMICPARTITIONINGMODE).equalsIgnoreCase("strict"))
{
Added: hive/trunk/ql/src/test/queries/clientpositive/loadpart2.q
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/loadpart2.q?rev=1551221&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/loadpart2.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/loadpart2.q Mon Dec 16
15:03:45 2013
@@ -0,0 +1,9 @@
+
+create table hive_test ( col1 string ) partitioned by ( pcol1 string , pcol2
string) stored as textfile;
+load data local inpath '../../data/files/test.dat' overwrite into table
hive_test partition (pcol1='part1',pcol2='part1') ;
+load data local inpath '../../data/files/test.dat' overwrite into table
hive_test partition (pcol2='part2',pcol1='part2') ;
+select * from hive_test where pcol1='part1' and pcol2='part1';
+select * from hive_test where pcol1='part2' and pcol2='part2';
+
+
+
Modified: hive/trunk/ql/src/test/results/clientnegative/dyn_part4.q.out
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/dyn_part4.q.out?rev=1551221&r1=1551220&r2=1551221&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/dyn_part4.q.out (original)
+++ hive/trunk/ql/src/test/results/clientnegative/dyn_part4.q.out Mon Dec 16
15:03:45 2013
@@ -3,4 +3,4 @@ PREHOOK: type: CREATETABLE
POSTHOOK: query: create table nzhang_part4 (key string) partitioned by (ds
string, hr string, value string)
POSTHOOK: type: CREATETABLE
POSTHOOK: Output: default@nzhang_part4
-FAILED: SemanticException [Error 10125]: Partition columns in partition
specification are not the same as that defined in the table schema. The names
and orders have to be exactly the same. Partition columns in the table schema
are: (ds, hr, value), while the partitions specified in the query are: (value,
ds, hr).
+FAILED: SemanticException [Error 10094]: Line 3:46 Dynamic partition cannot be
the parent of a static partition 'hr'
Added: hive/trunk/ql/src/test/results/clientpositive/loadpart2.q.out
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/loadpart2.q.out?rev=1551221&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/loadpart2.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/loadpart2.q.out Mon Dec 16
15:03:45 2013
@@ -0,0 +1,51 @@
+PREHOOK: query: create table hive_test ( col1 string ) partitioned by ( pcol1
string , pcol2 string) stored as textfile
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table hive_test ( col1 string ) partitioned by ( pcol1
string , pcol2 string) stored as textfile
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@hive_test
+PREHOOK: query: load data local inpath '../../data/files/test.dat' overwrite
into table hive_test partition (pcol1='part1',pcol2='part1')
+PREHOOK: type: LOAD
+PREHOOK: Output: default@hive_test
+POSTHOOK: query: load data local inpath '../../data/files/test.dat' overwrite
into table hive_test partition (pcol1='part1',pcol2='part1')
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@hive_test
+POSTHOOK: Output: default@hive_test@pcol1=part1/pcol2=part1
+PREHOOK: query: load data local inpath '../../data/files/test.dat' overwrite
into table hive_test partition (pcol2='part2',pcol1='part2')
+PREHOOK: type: LOAD
+PREHOOK: Output: default@hive_test
+POSTHOOK: query: load data local inpath '../../data/files/test.dat' overwrite
into table hive_test partition (pcol2='part2',pcol1='part2')
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@hive_test
+POSTHOOK: Output: default@hive_test@pcol1=part2/pcol2=part2
+PREHOOK: query: select * from hive_test where pcol1='part1' and pcol2='part1'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@hive_test
+PREHOOK: Input: default@hive_test@pcol1=part1/pcol2=part1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from hive_test where pcol1='part1' and pcol2='part1'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@hive_test
+POSTHOOK: Input: default@hive_test@pcol1=part1/pcol2=part1
+#### A masked pattern was here ####
+1 part1 part1
+2 part1 part1
+3 part1 part1
+4 part1 part1
+5 part1 part1
+6 part1 part1
+PREHOOK: query: select * from hive_test where pcol1='part2' and pcol2='part2'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@hive_test
+PREHOOK: Input: default@hive_test@pcol1=part2/pcol2=part2
+#### A masked pattern was here ####
+POSTHOOK: query: select * from hive_test where pcol1='part2' and pcol2='part2'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@hive_test
+POSTHOOK: Input: default@hive_test@pcol1=part2/pcol2=part2
+#### A masked pattern was here ####
+1 part2 part2
+2 part2 part2
+3 part2 part2
+4 part2 part2
+5 part2 part2
+6 part2 part2