diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g index 8bf9cc0ad6..e05bc23500 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g @@ -25,11 +25,17 @@ import org.apache.hadoop.hive.conf.HiveConf; @lexer::members { private Configuration hiveConf; - + + private boolean retainBackQuote = false; + public void setHiveConf(Configuration hiveConf) { this.hiveConf = hiveConf; } - + + public void setRetainBackQuote(boolean retainBackQuote) { + this.retainBackQuote = retainBackQuote; + } + protected boolean allowQuotedId() { if(hiveConf == null){ return false; @@ -515,7 +521,10 @@ Identifier fragment QuotedIdentifier : - '`' ( '``' | ~('`') )* '`' { setText(getText().substring(1, getText().length() -1 ).replaceAll("``", "`")); } + '`' ( '``' | ~('`') )* '`' { +if(!retainBackQuote) + setText(getText().substring(1, getText().length() - 1).replaceAll("``", "`")); +} ; CharSetName diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 6a6e6c3639..85842809a1 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -60,6 +60,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.tuple.Pair; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; @@ -12074,6 +12075,8 @@ protected static ASTNode rewriteASTWithMaskAndFilter(TableMask tableMask, ASTNod } // 2. rewrite the AST, replace TABREF with masking/filtering if (tableMask.needsRewrite()) { + //back quote has been lost in tokenRewriteStream, make them up + makeUpBackQuote(ctx.getCmd(), ctx.getTokenRewriteStream(), ctx.getConf()); tableMask.applyTranslations(tokenRewriteStream); String rewrittenQuery = tokenRewriteStream.toString( ast.getTokenStartIndex(), ast.getTokenStopIndex()); @@ -12092,6 +12095,44 @@ protected static ASTNode rewriteASTWithMaskAndFilter(TableMask tableMask, ASTNod } } + protected static void makeUpBackQuote(String cmd, TokenRewriteStream tokenRewriteStream, Configuration conf){ + ParseDriver pd = new ParseDriver(); + ParseDriver.ANTLRNoCaseStringStream stringStream = pd.new ANTLRNoCaseStringStream(cmd); + ParseDriver.HiveLexerX rawLexer = pd.new HiveLexerX(stringStream); + rawLexer.setRetainBackQuote(true); + TokenRewriteStream rawTokenRewriteStream = new TokenRewriteStream(rawLexer); + rawLexer.setHiveConf(conf); + //the operations are done lazily at toString-time + rawTokenRewriteStream.toString(); + + //find out back quoted words + Map backQuotedWords = new HashMap<>(); + for(int i=rawTokenRewriteStream.MIN_TOKEN_INDEX; i