diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index 6a70a4a6bd..0ed846000a 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -435,6 +435,7 @@ minillap.query.files=acid_bucket_pruning.q,\ minillaplocal.query.files=\ dp_counter_non_mm.q,\ dp_counter_mm.q,\ + acid_export.q,\ acid_no_buckets.q, \ acid_globallimit.q,\ acid_vectorization_missing_cols.q,\ diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java index 7cb17241db..9aff0069fd 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java @@ -162,7 +162,7 @@ private StringBuilder genPartitionClause(Map partSpec) throws Se } else { whereClause.append(" and "); } - whereClause.append("`").append(partKey).append("` = ").append(genPartValueString(partKey, value)); + whereClause.append("`").append(partKey).append("` = ").append(genPartValueString(getColTypeOf(partKey), value)); } } @@ -179,33 +179,7 @@ private StringBuilder genPartitionClause(Map partSpec) throws Se return predPresent ? whereClause.append(groupByClause) : groupByClause; } - private String genPartValueString(String partKey, String partVal) throws SemanticException { - String returnVal = partVal; - String partColType = getColTypeOf(partKey); - if (partColType.equals(serdeConstants.STRING_TYPE_NAME) || - partColType.contains(serdeConstants.VARCHAR_TYPE_NAME) || - partColType.contains(serdeConstants.CHAR_TYPE_NAME)) { - returnVal = "'" + escapeSQLString(partVal) + "'"; - } else if (partColType.equals(serdeConstants.TINYINT_TYPE_NAME)) { - returnVal = partVal + "Y"; - } else if (partColType.equals(serdeConstants.SMALLINT_TYPE_NAME)) { - returnVal = partVal + "S"; - } else if (partColType.equals(serdeConstants.INT_TYPE_NAME)) { - returnVal = partVal; - } else if (partColType.equals(serdeConstants.BIGINT_TYPE_NAME)) { - returnVal = partVal + "L"; - } else if (partColType.contains(serdeConstants.DECIMAL_TYPE_NAME)) { - returnVal = partVal + "BD"; - } else if (partColType.equals(serdeConstants.DATE_TYPE_NAME) || - partColType.equals(serdeConstants.TIMESTAMP_TYPE_NAME)) { - returnVal = partColType + " '" + escapeSQLString(partVal) + "'"; - } else { - //for other usually not used types, just quote the value - returnVal = "'" + escapeSQLString(partVal) + "'"; - } - return returnVal; - } private String getColTypeOf(String partKey) throws SemanticException{ diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index d5ed581861..1524b3a0d8 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -533,6 +533,33 @@ public CompilationOpContext getOpContext() { return ctx.getOpContext(); } + public String genPartValueString(String partColType, String partVal) throws SemanticException { + String returnVal = partVal; + if (partColType.equals(serdeConstants.STRING_TYPE_NAME) || + partColType.contains(serdeConstants.VARCHAR_TYPE_NAME) || + partColType.contains(serdeConstants.CHAR_TYPE_NAME)) { + returnVal = "'" + escapeSQLString(partVal) + "'"; + } else if (partColType.equals(serdeConstants.TINYINT_TYPE_NAME)) { + returnVal = partVal + "Y"; + } else if (partColType.equals(serdeConstants.SMALLINT_TYPE_NAME)) { + returnVal = partVal + "S"; + } else if (partColType.equals(serdeConstants.INT_TYPE_NAME)) { + returnVal = partVal; + } else if (partColType.equals(serdeConstants.BIGINT_TYPE_NAME)) { + returnVal = partVal + "L"; + } else if (partColType.contains(serdeConstants.DECIMAL_TYPE_NAME)) { + returnVal = partVal + "BD"; + } else if (partColType.equals(serdeConstants.DATE_TYPE_NAME) || + partColType.equals(serdeConstants.TIMESTAMP_TYPE_NAME)) { + returnVal = partColType + " '" + escapeSQLString(partVal) + "'"; + } else { + //for other usually not used types, just quote the value + returnVal = "'" + escapeSQLString(partVal) + "'"; + } + + return returnVal; + } + public void doPhase1QBExpr(ASTNode ast, QBExpr qbexpr, String id, String alias) throws SemanticException { doPhase1QBExpr(ast, qbexpr, id, alias, false); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java index 512f1ff3da..8e5118b94e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java @@ -277,7 +277,9 @@ private StringBuilder generateExportQuery(List partCols, TableSpec exportTableSpec = new TableSpec(db, conf, tableTree, false, true); if(exportTableSpec.getPartSpec() != null) { StringBuilder whereClause = null; + int partColsIdx = -1; //keep track of corresponding col in partCols for(Map.Entry ent : exportTableSpec.getPartSpec().entrySet()) { + partColsIdx++; if(ent.getValue() == null) { continue; //partial spec } @@ -288,7 +290,7 @@ private StringBuilder generateExportQuery(List partCols, whereClause.append(" AND "); } whereClause.append(HiveUtils.unparseIdentifier(ent.getKey(), conf)) - .append(" = ").append(ent.getValue()); + .append(" = ").append(genPartValueString(partCols.get(partColsIdx).getType(), ent.getValue())); } if(whereClause != null) { rewrittenQueryStr.append(whereClause);