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 3caa51f899..3920cfce29 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; @@ -514,7 +520,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 6d7e63ef88..ab385d5cbe 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -12069,6 +12069,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(),tokenRewriteStream); tableMask.applyTranslations(tokenRewriteStream); String rewrittenQuery = tokenRewriteStream.toString( ast.getTokenStartIndex(), ast.getTokenStopIndex()); @@ -12087,6 +12089,35 @@ protected static ASTNode rewriteASTWithMaskAndFilter(TableMask tableMask, ASTNod } } + protected static void makeUpBackQuote(String cmd, TokenRewriteStream tokenRewriteStream){ + 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); + //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