Skip to content

Commit

Permalink
IMPALA-4033: Treat string-partition key values as case sensitive.
Browse files Browse the repository at this point in the history
This commit makes ADD PARTITION operations treat string partition-key
values as case sensitive in consistent with other related partition DDL
operations.

Change-Id: I6fbe67d99df8a50a16a18456fde85d03d622c7a1
Reviewed-on: http://gerrit.cloudera.org:8080/5535
Reviewed-by: Alex Behm <alex.behm@cloudera.com>
Tested-by: Internal Jenkins
  • Loading branch information
amosbird authored and Internal Jenkins committed Dec 22, 2016
1 parent 226a2e6 commit b3636c9
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 9 deletions.
8 changes: 2 additions & 6 deletions fe/src/main/java/org/apache/impala/analysis/PartitionSet.java
Expand Up @@ -137,12 +137,11 @@ private void addIfExists(
}
}

// Transform <COL> = NULL into IsNull expr; <String COL> = '' into IsNull expr and
// <String COL> = 'String Value' into lower case.
// Transform <COL> = NULL into IsNull expr; <String COL> = '' 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<Expr> transformPartitionConjuncts(Analyzer analyzer, List<Expr> conjuncts)
throws AnalysisException {
List<Expr> transformedConjuncts = Lists.newArrayList();
Expand All @@ -162,9 +161,6 @@ private List<Expr> transformPartitionConjuncts(Analyzer analyzer, List<Expr> 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);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions fe/src/main/java/org/apache/impala/catalog/HdfsTable.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
Expand Up @@ -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) " +
Expand Down
Expand Up @@ -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
====

0 comments on commit b3636c9

Please sign in to comment.