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
