Repository: tajo
Updated Branches:
  refs/heads/master 4a9628858 -> 5a1558613


http://git-wip-us.apache.org/repos/asf/tajo/blob/5a155861/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
----------------------------------------------------------------------
diff --git 
a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
 
b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
index d90f1b0..608fa4c 100644
--- 
a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
+++ 
b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
@@ -510,13 +510,15 @@ public class LogicalNodeDeserializer {
       createTable.setPartitionMethod(new 
PartitionMethodDesc(storeTableNodeSpec.getPartitionMethod()));
     }
 
-    
createTable.setTableSchema(convertSchema(storeTableNodeSpec.getTableSchema()));
+    if (storeTableNodeSpec.hasTableSchema()) {
+      
createTable.setTableSchema(convertSchema(storeTableNodeSpec.getTableSchema()));
+    }
 
     if (createTableNodeSpec.hasTablespaceName()) {
      createTable.setTableSpaceName(createTableNodeSpec.getTablespaceName());
     }
     createTable.setExternal(createTableNodeSpec.getExternal());
-    if (createTableNodeSpec.getExternal() && storeTableNodeSpec.hasUri()) {
+    if (storeTableNodeSpec.hasUri()) {
       createTable.setUri(URI.create(storeTableNodeSpec.getUri()));
     }
     createTable.setIfNotExists(createTableNodeSpec.getIfNotExists());

http://git-wip-us.apache.org/repos/asf/tajo/blob/5a155861/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
----------------------------------------------------------------------
diff --git 
a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
 
b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
index 7e61f30..a0f1fcc 100644
--- 
a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
+++ 
b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
@@ -711,7 +711,10 @@ public class LogicalNodeSerializer extends 
BasicLogicalPlanVisitor<LogicalNodeSe
     if (node.hasUri()) {
       storeTableBuilder.setUri(node.getUri().toString());
     }
-    storeTableBuilder.setTableSchema(node.getTableSchema().getProto());
+
+    if (node.hasTableSchema()) {
+      storeTableBuilder.setTableSchema(node.getTableSchema().getProto());
+    }
 
     if (node.hasPartition()) {
       
storeTableBuilder.setPartitionMethod(node.getPartitionMethod().getProto());

http://git-wip-us.apache.org/repos/asf/tajo/blob/5a155861/tajo-plan/src/main/java/org/apache/tajo/plan/util/ExprFinder.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/ExprFinder.java 
b/tajo-plan/src/main/java/org/apache/tajo/plan/util/ExprFinder.java
index 461ffd6..57a7644 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/ExprFinder.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/ExprFinder.java
@@ -34,8 +34,8 @@ import java.util.Stack;
 
 public class ExprFinder extends SimpleAlgebraVisitor<ExprFinder.Context, 
Object> {
 
-  static class Context {
-    List<Expr> set = TUtil.newList();
+  static class Context<T> {
+    List<T> set = TUtil.newList();
     OpType targetType;
 
     Context(OpType type) {
@@ -44,18 +44,18 @@ public class ExprFinder extends 
SimpleAlgebraVisitor<ExprFinder.Context, Object>
   }
 
   public static <T extends Expr> Set<T> finds(Expr expr, OpType type) {
-    return (Set<T>) new HashSet<Expr>(findsInOrder(expr, type));
+    return (Set<T>) new HashSet<>(findsInOrder(expr, type));
   }
 
   public static <T extends Expr> List<T> findsInOrder(Expr expr, OpType type) {
-    Context context = new Context(type);
+    Context<T> context = new Context<>(type);
     ExprFinder finder = new ExprFinder();
     try {
       finder.visit(context, new Stack<Expr>(), expr);
     } catch (TajoException e) {
       throw new TajoInternalError(e);
     }
-    return (List<T>) context.set;
+    return context.set;
   }
 
   public Object visit(Context ctx, Stack<Expr> stack, Expr expr) throws 
TajoException {
@@ -71,7 +71,7 @@ public class ExprFinder extends 
SimpleAlgebraVisitor<ExprFinder.Context, Object>
       super.visit(ctx, stack, expr);
     }
 
-    if (ctx.targetType == expr.getType()) {
+    if (expr != null && ctx.targetType == expr.getType()) {
       ctx.set.add(expr);
     }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/5a155861/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java 
b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
index 0210865..7ba31bc 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
@@ -992,4 +992,13 @@ public class PlannerUtil {
     finder.visit(null, qual, new Stack<EvalNode>());
     return finder.getEvalNodes();
   }
+
+  public static boolean hasAsterisk(NamedExpr [] namedExprs) {
+    for (NamedExpr eachTarget : namedExprs) {
+      if (eachTarget.getExpr().getType() == OpType.Asterisk) {
+        return true;
+      }
+    }
+    return false;
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5a155861/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java
----------------------------------------------------------------------
diff --git 
a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java
 
b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java
index f40548c..2c7feac 100644
--- 
a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java
+++ 
b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.verifier;
 
 import com.google.common.base.Preconditions;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.OverridableConf;
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.TajoConstants;
@@ -249,6 +250,24 @@ public class PreLogicalPlanVerifier extends 
BaseAlgebraVisitor<PreLogicalPlanVer
 
     if (expr.hasTableElements()) {
       assertRelationSchema(context, expr);
+    } else {
+      if (expr.getStorageType() != null) {
+        if (expr.hasSelfDescSchema()) {
+          // TODO: support other types like Parquet and ORC.
+          if (!expr.getStorageType().equalsIgnoreCase(BuiltinStorages.JSON)) {
+            if 
(expr.getStorageType().equalsIgnoreCase(BuiltinStorages.PARQUET) ||
+                expr.getStorageType().equalsIgnoreCase(BuiltinStorages.ORC)) {
+              throw new NotImplementedException(expr.getStorageType());
+            } else {
+              throw new UnsupportedException(expr.getStorageType());
+            }
+          }
+        } else {
+          if (expr.getLikeParentTableName() == null && expr.getSubQuery() == 
null) {
+            throw new TajoInternalError(expr.getTableName() + " does not have 
pre-defined or self-describing schema");
+          }
+        }
+      }
     }
 
     if (expr.hasStorageType()) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/5a155861/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/SimpleAlgebraVisitor.java
----------------------------------------------------------------------
diff --git 
a/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/SimpleAlgebraVisitor.java
 
b/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/SimpleAlgebraVisitor.java
index ab1f74d..6d43a69 100644
--- 
a/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/SimpleAlgebraVisitor.java
+++ 
b/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/SimpleAlgebraVisitor.java
@@ -30,6 +30,9 @@ import java.util.Stack;
 public abstract class SimpleAlgebraVisitor<CONTEXT, RESULT> extends 
BaseAlgebraVisitor<CONTEXT, RESULT> {
 
   public RESULT visit(CONTEXT ctx, Stack<Expr> stack, Expr expr) throws 
TajoException {
+    if (expr == null) {
+      return null;
+    }
     RESULT result = null;
     if (expr instanceof UnaryOperator) {
       preHook(ctx, stack, expr);

http://git-wip-us.apache.org/repos/asf/tajo/blob/5a155861/tajo-plan/src/main/proto/Plan.proto
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/proto/Plan.proto 
b/tajo-plan/src/main/proto/Plan.proto
index 7815cac..8a8ecb1 100644
--- a/tajo-plan/src/main/proto/Plan.proto
+++ b/tajo-plan/src/main/proto/Plan.proto
@@ -244,7 +244,7 @@ message PersistentStoreNode {
 message StoreTableNodeSpec { // required PersistentStoreNode
   optional string tableName = 1; // 'INSERT INTO LOCATION' does not require 
'table name'.
   optional string uri = 2;
-  required SchemaProto table_schema = 3;
+  optional SchemaProto table_schema = 3; // optional for self-describing 
formats
   optional PartitionMethodProto partitionMethod = 4;
 }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/5a155861/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4
----------------------------------------------------------------------
diff --git 
a/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4 
b/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4
index 87b897d..c125352 100644
--- a/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4
+++ b/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4
@@ -117,6 +117,7 @@ create_table_statement
 
 table_elements
   : LEFT_PAREN field_element (COMMA field_element)* RIGHT_PAREN
+  | LEFT_PAREN asterisk RIGHT_PAREN
   ;
 
 field_element
@@ -1312,7 +1313,11 @@ derived_column
   ;
 
 qualified_asterisk
-  : (tb_name=identifier DOT)? MULTIPLY
+  : (tb_name=identifier DOT)? asterisk
+  ;
+
+asterisk
+  : MULTIPLY
   ;
 
 set_qualifier

Reply via email to