Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 8ED15200B76 for ; Mon, 25 Jul 2016 11:36:48 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 8D90B160A97; Mon, 25 Jul 2016 09:36:48 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 90AA6160A9A for ; Mon, 25 Jul 2016 11:36:47 +0200 (CEST) Received: (qmail 37693 invoked by uid 500); 25 Jul 2016 09:36:46 -0000 Mailing-List: contact commits-help@eagle.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@eagle.incubator.apache.org Delivered-To: mailing list commits@eagle.incubator.apache.org Received: (qmail 37629 invoked by uid 99); 25 Jul 2016 09:36:46 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 25 Jul 2016 09:36:46 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 59875C04FD for ; Mon, 25 Jul 2016 09:36:46 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -4.646 X-Spam-Level: X-Spam-Status: No, score=-4.646 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-1.426] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id Ux1gBv3-X83r for ; Mon, 25 Jul 2016 09:36:44 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id AE25260E53 for ; Mon, 25 Jul 2016 09:36:40 +0000 (UTC) Received: (qmail 36537 invoked by uid 99); 25 Jul 2016 09:36:39 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 25 Jul 2016 09:36:39 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 728B0E78B2; Mon, 25 Jul 2016 09:36:39 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: mw@apache.org To: commits@eagle.incubator.apache.org Date: Mon, 25 Jul 2016 09:37:06 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [29/47] incubator-eagle git commit: EAGLE-330 Fix Hive ql.Parser Hive ql.Parser cant parser a hive query sql with keywords https://issues.apache.org/jira/browse/EAGLE-330 archived-at: Mon, 25 Jul 2016 09:36:48 -0000 EAGLE-330 Fix Hive ql.Parser Hive ql.Parser cant parser a hive query sql with keywords https://issues.apache.org/jira/browse/EAGLE-330 Author: @wgyumg Reviewer: @pkuwm Closes: #228 Project: http://git-wip-us.apache.org/repos/asf/incubator-eagle/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-eagle/commit/cbf3c76c Tree: http://git-wip-us.apache.org/repos/asf/incubator-eagle/tree/cbf3c76c Diff: http://git-wip-us.apache.org/repos/asf/incubator-eagle/diff/cbf3c76c Branch: refs/heads/master Commit: cbf3c76ce148b73379698d9626df6e1baa5162ab Parents: f51474d Author: yonzhang Authored: Tue Jun 7 16:01:41 2016 -0700 Committer: yonzhang Committed: Tue Jun 7 16:01:41 2016 -0700 ---------------------------------------------------------------------- .../apache/eagle/security/hive/ql/Parser.java | 46 ++++++++++++++++++-- .../eagle/security/hive/ql/TestParser.java | 30 ++++++++++++- 2 files changed, 70 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/cbf3c76c/eagle-security/eagle-security-hive/src/main/java/org/apache/eagle/security/hive/ql/Parser.java ---------------------------------------------------------------------- diff --git a/eagle-security/eagle-security-hive/src/main/java/org/apache/eagle/security/hive/ql/Parser.java b/eagle-security/eagle-security-hive/src/main/java/org/apache/eagle/security/hive/ql/Parser.java index 5ab0f4b..19ce003 100644 --- a/eagle-security/eagle-security-hive/src/main/java/org/apache/eagle/security/hive/ql/Parser.java +++ b/eagle-security/eagle-security-hive/src/main/java/org/apache/eagle/security/hive/ql/Parser.java @@ -16,11 +16,19 @@ */ package org.apache.eagle.security.hive.ql; +import org.antlr.runtime.RecognitionException; +import org.antlr.runtime.Token; +import org.antlr.runtime.TokenRewriteStream; +import org.antlr.runtime.TokenStream; +import org.antlr.runtime.tree.CommonTree; +import org.antlr.runtime.tree.CommonTreeAdaptor; +import org.antlr.runtime.tree.TreeAdaptor; +import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.lib.Node; +import org.apache.hadoop.hive.ql.parse.ASTErrorNode; import org.apache.hadoop.hive.ql.parse.ASTNode; import org.apache.hadoop.hive.ql.parse.HiveParser; import org.apache.hadoop.hive.ql.parse.ParseDriver; -import org.apache.hadoop.hive.ql.parse.ParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +41,21 @@ import java.util.Set; public class Parser { private static final Logger LOG = LoggerFactory.getLogger(Parser.class); + static final TreeAdaptor adaptor = new CommonTreeAdaptor() { + @Override + public Object create(Token payload) { + return new ASTNode(payload); + } + @Override + public Object dupNode(Object t) { + return create(((CommonTree)t).token); + } + @Override + public Object errorNode(TokenStream input, Token start, Token stop, RecognitionException e) { + return new ASTErrorNode(input, start, stop, e); + } + }; + private Set tableSet; private Set columnSet; private Map columnAliasMap; @@ -66,11 +89,26 @@ public class Parser { * Parse an Hive QL into an Abstract Syntax Tree(AST). * @param query * @return - * @throws ParseException + * @throws RecognitionException */ - public ASTNode generateAST(String query) throws ParseException { + public ASTNode generateAST(String query) throws RecognitionException { + // https://issues.apache.org/jira/browse/HIVE-10731 + // https://issues.apache.org/jira/browse/HIVE-6617 + HiveConf hiveConf = new HiveConf(); + hiveConf.setBoolVar(HiveConf.ConfVars.HIVE_SUPPORT_SQL11_RESERVED_KEYWORDS, false); + ParseDriver pd = new ParseDriver(); - return pd.parse(query); + ParseDriver.ANTLRNoCaseStringStream antlrStream = pd.new ANTLRNoCaseStringStream(query); + ParseDriver.HiveLexerX lexer = pd.new HiveLexerX(antlrStream); + lexer.setHiveConf(hiveConf); + TokenRewriteStream tokens = new TokenRewriteStream(lexer); + + HiveParser parser = new HiveParser(tokens); + parser.setHiveConf(hiveConf); + parser.setTreeAdaptor(adaptor); + HiveParser.statement_return r = parser.statement(); + + return (ASTNode)r.getTree(); } private void parseQL(ASTNode ast) { http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/cbf3c76c/eagle-security/eagle-security-hive/src/test/java/org/apache/eagle/security/hive/ql/TestParser.java ---------------------------------------------------------------------- diff --git a/eagle-security/eagle-security-hive/src/test/java/org/apache/eagle/security/hive/ql/TestParser.java b/eagle-security/eagle-security-hive/src/test/java/org/apache/eagle/security/hive/ql/TestParser.java index a5f5f82..0bd994f 100644 --- a/eagle-security/eagle-security-hive/src/test/java/org/apache/eagle/security/hive/ql/TestParser.java +++ b/eagle-security/eagle-security-hive/src/test/java/org/apache/eagle/security/hive/ql/TestParser.java @@ -22,7 +22,7 @@ import java.util.Map; import java.util.Set; import org.apache.hadoop.hive.ql.parse.ASTNode; -import org.apache.hadoop.hive.ql.parse.ParseException; +import org.antlr.runtime.RecognitionException; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -67,7 +67,7 @@ public class TestParser { } } - public void printQueryAST(String query) throws ParseException { + public void printQueryAST(String query) throws RecognitionException { ASTNode root = parser.generateAST(query); printTree(root, 0); } @@ -209,6 +209,32 @@ public class TestParser { } @Test + public void testQueryWithKeyWords() throws Exception { + String query = "SELECT id, user FROM db.table1"; + String expectedOperation = "SELECT"; + String expectedInsertTable = null; + Map> expectedTableColumn = new HashMap>(); + Set set = new HashSet(); + set.add("id"); + set.add("user"); + expectedTableColumn.put("db.table1", set); + _testParsingQuery(query, expectedOperation, expectedInsertTable, expectedTableColumn); + } + + @Test + public void testInsertTableWithKeyWords() throws Exception { + String query = "INSERT OVERWRITE TABLE table2 SELECT id, user FROM db.table1"; + String expectedOperation = "SELECT"; + String expectedInsertTable = "table2"; + Map> expectedTableColumn = new HashMap>(); + Set set = new HashSet(); + set.add("id"); + set.add("user"); + expectedTableColumn.put("db.table1", set); + _testParsingQuery(query, expectedOperation, expectedInsertTable, expectedTableColumn); + } + + @Test public void testCreateTable() throws Exception { String query = "CREATE TABLE page_view(viewTime INT, userid BIGINT,\n" + " page_url STRING, referrer_url STRING,\n" +