diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/HiveOptiqUtil.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/HiveOptiqUtil.java
index dca1949..2ad5c34 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/HiveOptiqUtil.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/HiveOptiqUtil.java
@@ -27,6 +27,8 @@
import java.util.Map.Entry;
import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveJoinRel;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
import org.eigenbase.rel.RelFactories.ProjectFactory;
import org.eigenbase.rel.RelNode;
import org.eigenbase.relopt.RelOptUtil;
@@ -55,7 +57,7 @@
/**
* Get list of virtual columns from the given list of projections.
*
- *
+ *
* @param exps
* list of rex nodes representing projections
* @return List of Virtual Columns, will not be null.
@@ -72,6 +74,17 @@
return vCols;
}
+ public static boolean validateASTForCBO (ASTNode ast) {
+ String astTree = ast.toStringTree();
+ String [] tokens = {"TOK_CHARSETLITERAL"};
+ for (String token : tokens) {
+ if (astTree.contains(token)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
public static List getProjsFromBelowAsInputRef(final RelNode rel) {
List projectList = Lists.transform(rel.getRowType().getFieldList(),
new Function() {
@@ -98,7 +111,7 @@ public RexNode apply(RelDataTypeField field) {
/**
* Push any equi join conditions that are not column references as Projections
* on top of the children.
- *
+ *
* @param factory
* Project factory to use.
* @param inputRels
@@ -232,7 +245,7 @@ public static RexNode projectNonColumnEquiConditions(ProjectFactory factory, Rel
* of equi join keys; the indexes are both in child and Join node schema.
* 3. Keeps a map of projection indexes that are part of join keys to list of
* conjuctive elements(JoinLeafPredicateInfo) that uses them.
- *
+ *
*/
public static class JoinPredicateInfo {
private final ImmutableList nonEquiJoinPredicateElements;
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 6291ed1..a5bd8ad 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
@@ -9581,7 +9581,7 @@ public void analyzeInternal(ASTNode ast) throws SemanticException {
|| ast.getToken().getType() == HiveParser.TOK_EXPLAIN;
if (!tokenTypeIsQuery || createVwDesc != null
|| !HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_ENABLED)
- || !canHandleQuery(qb)) {
+ || !canHandleQuery(qb) || !HiveOptiqUtil.validateASTForCBO(ast)) {
runCBO = false;
}
@@ -12346,7 +12346,7 @@ private RelNode genTableLogicalPlan(String tableAlias, QB qb) throws SemanticExc
HiveTableScanRel tableRel = null;
try {
-
+
// 0. If the table has a Sample specified, bail from Optiq path.
if ( qb.getParseInfo().getTabSample(tableAlias) != null ||
SemanticAnalyzer.this.nameToSplitSample.containsKey(tableAlias)) {
@@ -12356,7 +12356,7 @@ private RelNode genTableLogicalPlan(String tableAlias, QB qb) throws SemanticExc
LOG.debug(msg);
throw new OptiqSemanticException(msg);
}
-
+
// 1. Get Table Alias
String alias_id = getAliasId(tableAlias, qb);