aboutsummaryrefslogtreecommitdiff
path: root/exec/java-exec/src/main/codegen/includes/parserImpls.ftl
diff options
context:
space:
mode:
authorvkorukanti <venki.korukanti@gmail.com>2014-04-30 16:46:59 -0700
committerJacques Nadeau <jacques@apache.org>2014-05-09 18:30:44 -0700
commite19606593f3173d8f82ca3074186e9ca7a960ce2 (patch)
tree77818d8515414c41c8ed4ab5f80cc6129c6ea22d /exec/java-exec/src/main/codegen/includes/parserImpls.ftl
parent379f1f387c2b35f4eec8ea02a64188b3fbeed5b0 (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.ftl63
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);
+ }
+}