diff --git a/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java b/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java index 3ba2ad278c..d5f0e70a2d 100644 --- a/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java +++ b/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java @@ -137,12 +137,11 @@ private void addIfExists( } } - // Transform = NULL into IsNull expr; = '' into IsNull expr and - // = 'String Value' into lower case. + // Transform = NULL into IsNull expr; = '' into IsNull expr. // The reason is that COL = NULL is allowed for selecting the NULL // partition, but a COL = NULL predicate can never be true, so we // need to transform such predicates before feeding them into the - // partition pruner. Same logic goes to String transformation. + // partition pruner. private List transformPartitionConjuncts(Analyzer analyzer, List conjuncts) throws AnalysisException { List transformedConjuncts = Lists.newArrayList(); @@ -162,9 +161,6 @@ private List transformPartitionConjuncts(Analyzer analyzer, List con } else if (leftChild != null && stringChild != null) { if (stringChild.getStringValue().isEmpty()) { result = new IsNullPredicate(leftChild, false); - } else { - stringChild = new StringLiteral(stringChild.getStringValue().toLowerCase()); - result.setChild(1, stringChild); } } } diff --git a/fe/src/main/java/org/apache/impala/catalog/HdfsTable.java b/fe/src/main/java/org/apache/impala/catalog/HdfsTable.java index c2c569fdc7..904c90ff4a 100644 --- a/fe/src/main/java/org/apache/impala/catalog/HdfsTable.java +++ b/fe/src/main/java/org/apache/impala/catalog/HdfsTable.java @@ -570,7 +570,7 @@ public HdfsPartition getPartitionFromThriftPartitionSpec( for (FieldSchema fs: getMetaStoreTable().getPartitionKeys()) { for (TPartitionKeyValue kv: partitionSpec) { if (fs.getName().toLowerCase().equals(kv.getName().toLowerCase())) { - targetValues.add(kv.getValue().toLowerCase()); + targetValues.add(kv.getValue()); // Same key was specified twice if (!keys.add(kv.getName().toLowerCase())) { return null; @@ -604,7 +604,7 @@ public HdfsPartition getPartitionFromThriftPartitionSpec( // backwards compatibility with Hive, and is clearly broken. if (value.isEmpty()) value = getNullPartitionKeyValue(); } - if (!targetValues.get(i).equals(value.toLowerCase())) { + if (!targetValues.get(i).equals(value)) { matchFound = false; break; } diff --git a/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java b/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java index 935edc52b0..5a08f98cf6 100644 --- a/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java +++ b/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java @@ -424,7 +424,7 @@ public void TestAlterTableSet() throws AnalysisException { AnalyzesOk("alter table functional.stringpartitionkey PARTITION " + "(string_col='partition1') set fileformat parquet"); AnalyzesOk("alter table functional.stringpartitionkey PARTITION " + - "(string_col='PaRtiTion1') set location '/a/b/c'"); + "(string_col='partition1') set location '/a/b/c'"); AnalyzesOk("alter table functional.alltypes PARTITION (year=2010, month=11) " + "set tblproperties('a'='1')"); AnalyzesOk("alter table functional.alltypes PARTITION (year<=2010, month=11) " + diff --git a/testdata/workloads/functional-query/queries/QueryTest/partition-ddl-predicates-all-fs.test b/testdata/workloads/functional-query/queries/QueryTest/partition-ddl-predicates-all-fs.test index 36104c3894..1aa5c5136a 100644 --- a/testdata/workloads/functional-query/queries/QueryTest/partition-ddl-predicates-all-fs.test +++ b/testdata/workloads/functional-query/queries/QueryTest/partition-ddl-predicates-all-fs.test @@ -133,3 +133,23 @@ show partitions p1 ---- TYPES STRING, STRING, BIGINT, BIGINT, STRING, STRING, STRING, STRING, STRING, STRING ==== +---- QUERY +# Tests case-sensitivity of string-typed partition columns. +alter table p1 add partition (j=2,k="D"); +alter table p1 add partition (j=2,k="E"); +alter table p1 add partition (j=2,k="F"); +==== +---- QUERY +show partitions p1 +---- RESULTS +'NULL','g',-1,0,regex:.+,regex:.+,regex:.+,regex:.+,regex:.+,regex:.*/test-warehouse/.+/p1/j=__HIVE_DEFAULT_PARTITION__/k=g +'2','D',-1,0,regex:.+,regex:.+,regex:.+,'TEXT',regex:.+,regex:.*/test-warehouse/.+/p1/j=2/k=D +'2','E',-1,0,regex:.+,regex:.+,regex:.+,'TEXT',regex:.+,regex:.*/test-warehouse/.+/p1/j=2/k=E +'2','F',-1,0,regex:.+,regex:.+,regex:.+,'TEXT',regex:.+,regex:.*/test-warehouse/.+/p1/j=2/k=F +'2','d',-1,0,regex:.+,regex:.+,regex:.+,'PARQUET',regex:.+,regex:.*/test-warehouse/.+/p1/j=2/k=d +'2','e',-1,0,regex:.+,regex:.+,regex:.+,'PARQUET',regex:.+,regex:.*/test-warehouse/.+/p1/j=2/k=e +'2','f',-1,0,regex:.+,regex:.+,regex:.+,'PARQUET',regex:.+,regex:.*/test-warehouse/.+/p1/j=2/k=f +'Total','',0,0,regex:.+,regex:.+,'','','','' +---- TYPES +STRING, STRING, BIGINT, BIGINT, STRING, STRING, STRING, STRING, STRING, STRING +====