diff options
author | vkorukanti <venki.korukanti@gmail.com> | 2014-04-30 16:46:59 -0700 |
---|---|---|
committer | Jacques Nadeau <jacques@apache.org> | 2014-05-09 18:30:44 -0700 |
commit | e19606593f3173d8f82ca3074186e9ca7a960ce2 (patch) | |
tree | 77818d8515414c41c8ed4ab5f80cc6129c6ea22d /exec/java-exec/src/main/codegen/includes/parserImpls.ftl | |
parent | 379f1f387c2b35f4eec8ea02a64188b3fbeed5b0 (diff) |
DRILL-679: Support create table as query (CTAS).
Diffstat (limited to 'exec/java-exec/src/main/codegen/includes/parserImpls.ftl')
-rw-r--r-- | exec/java-exec/src/main/codegen/includes/parserImpls.ftl | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/exec/java-exec/src/main/codegen/includes/parserImpls.ftl b/exec/java-exec/src/main/codegen/includes/parserImpls.ftl index 71afdc395..5e53ea6d0 100644 --- a/exec/java-exec/src/main/codegen/includes/parserImpls.ftl +++ b/exec/java-exec/src/main/codegen/includes/parserImpls.ftl @@ -133,9 +133,32 @@ SqlNode SqlUseSchema(): } } +/** Parses an optional field list and makes sure no field is a "*". */ +SqlNodeList ParseFieldList(String relType) : +{ + SqlNodeList fieldList; +} +{ + <LPAREN> + fieldList = SimpleIdentifierCommaList() + <RPAREN> + { + for(SqlNode node : fieldList) + { + if (((SqlIdentifier)node).isStar()) + throw new ParseException(String.format("%s's field list has a '*', which is invalid.", relType)); + } + return fieldList; + } + | + { + return null; + } +} + /** * Parses a create view or replace existing view statement. - * CREATE [OR REPLACE] VIEW view_name AS select_statement + * CREATE [OR REPLACE] VIEW view_name [ (field1, field2 ...) ] AS select_statement */ SqlNode SqlCreateOrReplaceView() : { @@ -143,25 +166,14 @@ SqlNode SqlCreateOrReplaceView() : boolean replaceView = false; SqlIdentifier viewName; SqlNode query; - SqlNodeList fieldList = null; + SqlNodeList fieldList; } { <CREATE> { pos = getPos(); } [ <OR> <REPLACE> { replaceView = true; } ] <VIEW> viewName = CompoundIdentifier() - [ - <LPAREN> - fieldList = SimpleIdentifierCommaList() - <RPAREN> - { - for(SqlNode node : fieldList) - { - if (((SqlIdentifier)node).isStar()) - throw new ParseException("View's field list has a '*', which is invalid."); - } - } - ] + fieldList = ParseFieldList("View") <AS> query = OrderedQueryOrExpr(ExprContext.ACCEPT_QUERY) { @@ -184,3 +196,26 @@ SqlNode SqlDropView() : return new SqlDropView(pos, CompoundIdentifier()); } } + +/** + * Parses a CTAS statement. + * CREATE TABLE tblname [ (field1, field2, ...) ] AS select_statement. + */ +SqlNode SqlCreateTable() : +{ + SqlParserPos pos; + SqlIdentifier tblName; + SqlNodeList fieldList; + SqlNode query; +} +{ + <CREATE> { pos = getPos(); } + <TABLE> + tblName = CompoundIdentifier() + fieldList = ParseFieldList("Table") + <AS> + query = OrderedQueryOrExpr(ExprContext.ACCEPT_QUERY) + { + return new SqlCreateTable(pos, tblName, fieldList, query); + } +} |