diff --git a/contrib/storage-hive/hive-exec-shade/pom.xml b/contrib/storage-hive/hive-exec-shade/pom.xml index 30472e5b7ab..de9e0551760 100644 --- a/contrib/storage-hive/hive-exec-shade/pom.xml +++ b/contrib/storage-hive/hive-exec-shade/pom.xml @@ -42,6 +42,10 @@ commons-codec commons-codec + + calcite-avatica + org.apache.calcite + @@ -71,7 +75,7 @@ com.twitter:parquet-encoding com.twitter:parquet-generator org.apache.calcite:calcite-core - org.apache.calcite:calcite-avatica + org.apache.calcite.avatica:avatica-core false diff --git a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcExpressionCheck.java b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcExpressionCheck.java index 2015a7754f2..e0b01b3889b 100644 --- a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcExpressionCheck.java +++ b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcExpressionCheck.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -27,7 +27,10 @@ import org.apache.calcite.rex.RexLocalRef; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexOver; +import org.apache.calcite.rex.RexPatternFieldRef; import org.apache.calcite.rex.RexRangeRef; +import org.apache.calcite.rex.RexSubQuery; +import org.apache.calcite.rex.RexTableInputRef; import org.apache.calcite.rex.RexVisitor; import org.apache.calcite.rex.RexWindow; import org.apache.drill.exec.planner.sql.DrillSqlOperator; @@ -116,4 +119,19 @@ public Boolean visitFieldAccess(RexFieldAccess paramRexFieldAccess) { return paramRexFieldAccess.getReferenceExpr().accept(this); } + @Override + public Boolean visitSubQuery(RexSubQuery subQuery) { + return null; + } + + @Override + public Boolean visitTableInputRef(RexTableInputRef fieldRef) { + return false; + } + + @Override + public Boolean visitPatternFieldRef(RexPatternFieldRef fieldRef) { + return false; + } + } diff --git a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcPrel.java b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcPrel.java index 58549db7625..e335c08138d 100644 --- a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcPrel.java +++ b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcPrel.java @@ -62,7 +62,7 @@ public JdbcPrel(RelOptCluster cluster, RelTraitSet traitSet, JdbcIntermediatePre (JavaTypeFactory) getCluster().getTypeFactory()); final JdbcImplementor.Result result = jdbcImplementor.visitChild(0, input.accept(new SubsetRemover())); - sql = result.asQuery().toSqlString(dialect).getSql(); + sql = result.asSelect().toSqlString(dialect).getSql(); rowType = input.getRowType(); } diff --git a/exec/java-exec/pom.xml b/exec/java-exec/pom.xml index 728477b1d3b..8e64224e502 100644 --- a/exec/java-exec/pom.xml +++ b/exec/java-exec/pom.xml @@ -211,6 +211,10 @@ org.apache.calcite calcite-core + + org.apache.calcite.avatica + avatica + net.sf.jpam jpam diff --git a/exec/java-exec/src/main/codegen/data/Parser.tdd b/exec/java-exec/src/main/codegen/data/Parser.tdd index 6c23808fc3a..507d6924e38 100644 --- a/exec/java-exec/src/main/codegen/data/Parser.tdd +++ b/exec/java-exec/src/main/codegen/data/Parser.tdd @@ -29,15 +29,12 @@ # List of keywords. keywords: [ "DATABASES", - "REPLACE", "SCHEMAS", - "SHOW", "TABLES", "USE", "FILES", "REFRESH", "METADATA", - "DATABASE", "IF", "JAR" ] @@ -75,6 +72,26 @@ implementationFiles: [ "parserImpls.ftl" ] + + # List of methods for parsing extensions to "CREATE [OR REPLACE]" calls. + # Each must accept arguments "(SqlParserPos pos, boolean replace)". + createStatementParserMethods: [ + ] + + # List of methods for parsing extensions to "ALTER " calls. + # Each must accept arguments "(SqlParserPos pos, String scope)". + alterStatementParserMethods: [ + ] + + # List of methods for parsing extensions to "DROP" calls. + # Each must accept arguments "(SqlParserPos pos)". + dropStatementParserMethods: [ + ] + + # List of keywords from "keywords" section that are not reserved. + nonReservedKeywords: [ + ] + includeCompoundIdentifier: false, includeBraces: true, diff --git a/exec/java-exec/src/main/codegen/includes/parserImpls.ftl b/exec/java-exec/src/main/codegen/includes/parserImpls.ftl index 67d15015efc..502c5b3e75e 100644 --- a/exec/java-exec/src/main/codegen/includes/parserImpls.ftl +++ b/exec/java-exec/src/main/codegen/includes/parserImpls.ftl @@ -118,7 +118,7 @@ SqlNode SqlDescribeTable() : E() ) { - return new SqlDescribeTable(pos, table, column, columnPattern); + return new DrillSqlDescribeTable(pos, table, column, columnPattern); } } @@ -158,7 +158,7 @@ SqlNodeList ParseRequiredFieldList(String relType) : } { - fieldList = SimpleIdentifierCommaList() + fieldList = ParenthesizedCompoundIdentifierList() { for(SqlNode node : fieldList) @@ -351,4 +351,23 @@ SqlNode SqlDropFunction() : { return new SqlDropFunction(pos, jar); } -} \ No newline at end of file +} + +<#if !parser.includeCompoundIdentifier > +/** +* Parses a comma-separated list of simple identifiers. +*/ +SqlNodeList ParenthesizedCompoundIdentifierList() : +{ + List list = new ArrayList(); + SqlIdentifier id; +} +{ + id = SimpleIdentifier() {list.add(id);} + ( + id = SimpleIdentifier() {list.add(id);}) * + { + return new SqlNodeList(list, getPos()); + } +} + \ No newline at end of file diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/dotdrill/View.java b/exec/java-exec/src/main/java/org/apache/drill/exec/dotdrill/View.java index 97be73d3c63..2b69f00083c 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/dotdrill/View.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/dotdrill/View.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -106,8 +106,19 @@ public FieldType(String name, RelDataType dataType) { p = dataType.getPrecision(); s = dataType.getScale(); break; + case INTERVAL_YEAR: case INTERVAL_YEAR_MONTH: - case INTERVAL_DAY_TIME: + case INTERVAL_MONTH: + case INTERVAL_DAY: + case INTERVAL_DAY_HOUR: + case INTERVAL_DAY_MINUTE: + case INTERVAL_DAY_SECOND: + case INTERVAL_HOUR: + case INTERVAL_HOUR_MINUTE: + case INTERVAL_HOUR_SECOND: + case INTERVAL_MINUTE: + case INTERVAL_MINUTE_SECOND: + case INTERVAL_SECOND: p = dataType.getIntervalQualifier().getStartPrecisionPreservingDefault(); default: break; diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/FileSystemPartitionDescriptor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/FileSystemPartitionDescriptor.java index a04f34d7025..49c9726e9d0 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/FileSystemPartitionDescriptor.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/FileSystemPartitionDescriptor.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -28,6 +28,7 @@ import com.google.common.base.Charsets; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -259,7 +260,8 @@ private TableScan createNewTableScanFromSelection(EnumerableTableScan oldScan, L new DynamicDrillTable(table.getPlugin(), table.getStorageEngineName(), table.getUserName(), newFormatSelection)); - final RelOptTableImpl newOptTableImpl = RelOptTableImpl.create(t.getRelOptSchema(), t.getRowType(), newTable); + final RelOptTableImpl newOptTableImpl = RelOptTableImpl.create(t.getRelOptSchema(), t.getRowType(), newTable, + ImmutableList.of()); // return an EnumerableTableScan with fileSelection being part of digest of TableScan node. return DirPrunedEnumerableTableScan.create(oldScan.getCluster(), newOptTableImpl, newFileSelection.toString()); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillStoreRelBase.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillStoreRelBase.java index d61f271f221..2781564bb64 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillStoreRelBase.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillStoreRelBase.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -26,6 +26,7 @@ import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.plan.RelTraitSet; +import org.apache.calcite.rex.RexNode; /** * Base class for logical and physical Store implemented in Drill @@ -33,9 +34,9 @@ public abstract class DrillStoreRelBase extends TableModify implements DrillRelNode { static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillStoreRelBase.class); - protected DrillStoreRelBase(RelOptCluster cluster, RelTraitSet traits, RelOptTable table, CatalogReader catalogReader, - RelNode child, Operation operation, List updateColumnList, boolean flattened) { - super(cluster, traits, table, catalogReader, child, operation, updateColumnList, flattened); + protected DrillStoreRelBase(RelOptCluster cluster, RelTraitSet traits, RelOptTable table, CatalogReader catalogReader, RelNode child, + Operation operation, List updateColumnList, List sourceExpressionList, boolean flattened) { + super(cluster, traits, table, catalogReader, child, operation, updateColumnList, sourceExpressionList, flattened); } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillValuesRelBase.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillValuesRelBase.java index 4d54fce85a3..a182d356cec 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillValuesRelBase.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillValuesRelBase.java @@ -216,7 +216,9 @@ private static void writeLiteral(RexLiteral literal, JsonOutput out) throws IOEx } return; + case INTERVAL_YEAR: case INTERVAL_YEAR_MONTH: + case INTERVAL_MONTH: if (isLiteralNull(literal)) { out.writeIntervalNull(); } else { @@ -225,7 +227,16 @@ private static void writeLiteral(RexLiteral literal, JsonOutput out) throws IOEx } return; - case INTERVAL_DAY_TIME: + case INTERVAL_DAY: + case INTERVAL_DAY_HOUR: + case INTERVAL_DAY_MINUTE: + case INTERVAL_DAY_SECOND: + case INTERVAL_HOUR: + case INTERVAL_HOUR_MINUTE: + case INTERVAL_HOUR_SECOND: + case INTERVAL_MINUTE: + case INTERVAL_MINUTE_SECOND: + case INTERVAL_SECOND: if (isLiteralNull(literal)) { out.writeIntervalNull(); } else { diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillAggregateRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillAggregateRule.java index 0ca4447a328..cbb5aee009a 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillAggregateRule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillAggregateRule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -17,9 +17,6 @@ */ package org.apache.drill.exec.planner.logical; -import java.util.logging.Logger; - -import org.apache.calcite.rel.core.Aggregate; import org.apache.calcite.rel.InvalidRelException; import org.apache.calcite.rel.RelNode; import org.apache.calcite.plan.Convention; @@ -28,6 +25,7 @@ import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.logical.LogicalAggregate; import org.apache.calcite.util.trace.CalciteTrace; +import org.slf4j.Logger; /** * Rule that converts an {@link LogicalAggregate} to a {@link DrillAggregateRel}, implemented by a Drill "segment" operation @@ -43,7 +41,7 @@ private DrillAggregateRule() { @Override public void onMatch(RelOptRuleCall call) { - final LogicalAggregate aggregate = (LogicalAggregate) call.rel(0); + final LogicalAggregate aggregate = call.rel(0); final RelNode input = call.rel(1); if (aggregate.containsDistinctCall()) { @@ -57,7 +55,7 @@ public void onMatch(RelOptRuleCall call) { call.transformTo(new DrillAggregateRel(aggregate.getCluster(), traits, convertedInput, aggregate.indicator, aggregate.getGroupSet(), aggregate.getGroupSets(), aggregate.getAggCallList())); } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConditions.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConditions.java index f68007d044c..266ce64b356 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConditions.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConditions.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -24,6 +24,12 @@ public final class DrillConditions { public static PushProjector.ExprCondition PRESERVE_ITEM = new PushProjector.ExprCondition() { + + @Override + public boolean apply(RexNode rexNode) { + return false; + } + @Override public boolean test(RexNode expr) { if (expr instanceof RexCall) { diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConstExecutor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConstExecutor.java index 19c75240e09..cdba8b8bde2 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConstExecutor.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConstExecutor.java @@ -20,6 +20,10 @@ import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import io.netty.buffer.DrillBuf; +import org.apache.calcite.rex.RexExecutor; +import org.apache.calcite.util.DateString; +import org.apache.calcite.util.TimeString; +import org.apache.calcite.util.TimestampString; import org.apache.calcite.rel.RelNode; import org.apache.drill.common.exceptions.UserException; import org.apache.drill.common.expression.ErrorCollectorImpl; @@ -79,7 +83,7 @@ import java.util.Calendar; import java.util.List; -public class DrillConstExecutor implements RelOptPlanner.Executor { +public class DrillConstExecutor implements RexExecutor { private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillConstExecutor.class); private final PlannerSettings plannerSettings; @@ -203,7 +207,7 @@ public RexNode apply(ValueHolder output) { Calendar value = (materializedExpr.getMajorType().getMode() == TypeProtos.DataMode.OPTIONAL) ? new DateTime(((NullableDateHolder) output).value, DateTimeZone.UTC).toCalendar(null) : new DateTime(((DateHolder) output).value, DateTimeZone.UTC).toCalendar(null); - return rexBuilder.makeLiteral(value, + return rexBuilder.makeLiteral(DateString.fromCalendarFields(value), TypeInferenceUtils.createCalciteTypeWithNullability(typeFactory, SqlTypeName.DATE, newCall.getType().isNullable()), false); } case DECIMAL9: { @@ -282,14 +286,14 @@ public RexNode apply(ValueHolder output) { Calendar value = (materializedExpr.getMajorType().getMode() == TypeProtos.DataMode.OPTIONAL) ? new DateTime(((NullableTimeHolder) output).value, DateTimeZone.UTC).toCalendar(null) : new DateTime(((TimeHolder) output).value, DateTimeZone.UTC).toCalendar(null); - return rexBuilder.makeLiteral(value, + return rexBuilder.makeLiteral(TimeString.fromCalendarFields(value), TypeInferenceUtils.createCalciteTypeWithNullability(typeFactory, SqlTypeName.TIME, newCall.getType().isNullable()), false); } case TIMESTAMP: { Calendar value = (materializedExpr.getMajorType().getMode() == TypeProtos.DataMode.OPTIONAL) ? new DateTime(((NullableTimeStampHolder) output).value, DateTimeZone.UTC).toCalendar(null) : new DateTime(((TimeStampHolder) output).value, DateTimeZone.UTC).toCalendar(null); - return rexBuilder.makeLiteral(value, + return rexBuilder.makeLiteral(TimestampString.fromCalendarFields(value), TypeInferenceUtils.createCalciteTypeWithNullability(typeFactory, SqlTypeName.TIMESTAMP, newCall.getType().isNullable()), false); } case INTERVALYEAR: { @@ -313,7 +317,7 @@ public RexNode apply(ValueHolder output) { } return rexBuilder.makeLiteral( new BigDecimal(days * DateUtility.daysToStandardMillis + milliseconds), - TypeInferenceUtils.createCalciteTypeWithNullability(typeFactory, SqlTypeName.INTERVAL_DAY_TIME, newCall.getType().isNullable()), + TypeInferenceUtils.createCalciteTypeWithNullability(typeFactory, SqlTypeName.INTERVAL_DAY, newCall.getType().isNullable()), false); } // The list of known unsupported types is used to trigger this behavior of re-using the input expression diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillJoinRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillJoinRule.java index d41ae7218b2..deb8acef7e8 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillJoinRule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillJoinRule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -18,7 +18,6 @@ package org.apache.drill.exec.planner.logical; import java.util.List; -import java.util.logging.Logger; import org.apache.calcite.rel.InvalidRelException; import org.apache.calcite.rel.core.JoinRelType; @@ -37,6 +36,7 @@ import org.apache.calcite.util.trace.CalciteTrace; import com.google.common.collect.Lists; +import org.slf4j.Logger; /** * Rule that converts a {@link org.apache.calcite.rel.logical.LogicalJoin} to a {@link DrillJoinRel}, which is implemented by Drill "join" operation. @@ -53,7 +53,7 @@ private DrillJoinRule() { @Override public void onMatch(RelOptRuleCall call) { - final LogicalJoin join = (LogicalJoin) call.rel(0); + final LogicalJoin join = call.rel(0); final RelNode left = join.getLeft(); final RelNode right = join.getRight(); final RelTraitSet traits = join.getTraitSet().plus(DrillRel.DRILL_LOGICAL); @@ -97,7 +97,7 @@ public void onMatch(RelOptRuleCall call) { call.transformTo(new DrillFilterRel(join.getCluster(), traits, joinRel, remaining)); } } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } @@ -109,8 +109,8 @@ private RexNode buildJoinCondition(RelNode convertedLeft, RelNode convertedRight List rightTypes = convertedRight.getRowType().getFieldList(); for (int i=0; i < leftKeys.size(); i++) { - int leftKeyOrdinal = leftKeys.get(i).intValue(); - int rightKeyOrdinal = rightKeys.get(i).intValue(); + int leftKeyOrdinal = leftKeys.get(i); + int rightKeyOrdinal = rightKeys.get(i); equijoinList.add(builder.makeCall( filterNulls.get(i) ? SqlStdOperatorTable.EQUALS : SqlStdOperatorTable.IS_NOT_DISTINCT_FROM, diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java index 0d8efd56743..7dc205015ed 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java @@ -226,6 +226,10 @@ public LogicalExpression visitCall(RexCall call) { return doFunction(call, "+"); } + if (call.getOperator() == SqlStdOperatorTable.MINUS_DATE) { + return doFunction(call, "-"); + } + // fall through default: throw new AssertionError("todo: implement syntax " + syntax + "(" + call + ")"); @@ -325,8 +329,19 @@ private LogicalExpression getDrillCastFunctionFromOptiq(RexCall call){ } break; - case "INTERVAL_YEAR_MONTH": castType = Types.required(MinorType.INTERVALYEAR); break; - case "INTERVAL_DAY_TIME": castType = Types.required(MinorType.INTERVALDAY); break; + case "INTERVAL_YEAR": + case "INTERVAL_YEAR_MONTH": + case "INTERVAL_MONTH": castType = Types.required(MinorType.INTERVALYEAR); break; + case "INTERVAL_DAY": + case "INTERVAL_DAY_HOUR": + case "INTERVAL_DAY_MINUTE": + case "INTERVAL_DAY_SECOND": + case "INTERVAL_HOUR": + case "INTERVAL_HOUR_MINUTE": + case "INTERVAL_HOUR_SECOND": + case "INTERVAL_MINUTE": + case "INTERVAL_MINUTE_SECOND": + case "INTERVAL_SECOND": castType = Types.required(MinorType.INTERVALDAY); break; case "BOOLEAN": castType = Types.required(MinorType.BIT); break; case "BINARY": castType = Types.required(MinorType.VARBINARY); break; case "ANY": return arg; // Type will be same as argument. @@ -574,11 +589,22 @@ public LogicalExpression visitLiteral(RexLiteral literal) { } return (ValueExpressions.getTimeStamp((GregorianCalendar) literal.getValue())); case INTERVAL_YEAR_MONTH: + case INTERVAL_YEAR: + case INTERVAL_MONTH: if (isLiteralNull(literal)) { return createNullExpr(MinorType.INTERVALYEAR); } return (ValueExpressions.getIntervalYear(((BigDecimal) (literal.getValue())).intValue())); - case INTERVAL_DAY_TIME: + case INTERVAL_DAY: + case INTERVAL_DAY_HOUR: + case INTERVAL_DAY_MINUTE: + case INTERVAL_DAY_SECOND: + case INTERVAL_HOUR: + case INTERVAL_HOUR_MINUTE: + case INTERVAL_HOUR_SECOND: + case INTERVAL_MINUTE: + case INTERVAL_MINUTE_SECOND: + case INTERVAL_SECOND: if (isLiteralNull(literal)) { return createNullExpr(MinorType.INTERVALDAY); } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillProjectSetOpTransposeRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillProjectSetOpTransposeRule.java index bde82e7fe69..baff3b723d4 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillProjectSetOpTransposeRule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillProjectSetOpTransposeRule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -19,6 +19,7 @@ package org.apache.drill.exec.planner.logical; import org.apache.calcite.plan.RelOptRule; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.rules.ProjectSetOpTransposeRule; import org.apache.calcite.rel.rules.PushProjector; @@ -26,6 +27,6 @@ public class DrillProjectSetOpTransposeRule extends ProjectSetOpTransposeRule { public final static RelOptRule INSTANCE = new DrillProjectSetOpTransposeRule(DrillConditions.PRESERVE_ITEM); protected DrillProjectSetOpTransposeRule(PushProjector.ExprCondition preserveExprCondition) { - super(preserveExprCondition); + super(preserveExprCondition, RelFactories.LOGICAL_BUILDER); } } \ No newline at end of file diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjectPastFilterRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjectPastFilterRule.java index 4f950d3d3ea..e5c40b91870 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjectPastFilterRule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjectPastFilterRule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -17,6 +17,9 @@ */ package org.apache.drill.exec.planner.logical; +import org.apache.calcite.rel.core.RelFactories; +import org.apache.calcite.rel.logical.LogicalFilter; +import org.apache.calcite.rel.logical.LogicalProject; import org.apache.calcite.rel.rules.ProjectFilterTransposeRule; import org.apache.calcite.rel.rules.PushProjector; import org.apache.calcite.plan.RelOptRule; @@ -26,7 +29,7 @@ public class DrillPushProjectPastFilterRule extends ProjectFilterTransposeRule { public final static RelOptRule INSTANCE = new DrillPushProjectPastFilterRule(DrillConditions.PRESERVE_ITEM); protected DrillPushProjectPastFilterRule(PushProjector.ExprCondition preserveExprCondition) { - super(preserveExprCondition); + super(LogicalProject.class, LogicalFilter.class, RelFactories.LOGICAL_BUILDER, preserveExprCondition); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjectPastJoinRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjectPastJoinRule.java index e27360f4f19..269f6d51c87 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjectPastJoinRule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushProjectPastJoinRule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -17,6 +17,7 @@ */ package org.apache.drill.exec.planner.logical; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.rules.ProjectJoinTransposeRule; import org.apache.calcite.rel.rules.PushProjector; import org.apache.calcite.plan.RelOptRule; @@ -26,7 +27,7 @@ public class DrillPushProjectPastJoinRule extends ProjectJoinTransposeRule { public static final RelOptRule INSTANCE = new DrillPushProjectPastJoinRule(DrillConditions.PRESERVE_ITEM); protected DrillPushProjectPastJoinRule(PushProjector.ExprCondition preserveExprCondition) { - super(preserveExprCondition); + super(preserveExprCondition, RelFactories.LOGICAL_BUILDER); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillReduceAggregatesRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillReduceAggregatesRule.java index 9f8d0623629..bb972d0602a 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillReduceAggregatesRule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillReduceAggregatesRule.java @@ -25,7 +25,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.Logger; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -66,6 +65,7 @@ import com.google.common.collect.ImmutableList; import org.apache.drill.exec.planner.sql.TypeInferenceUtils; import org.apache.drill.exec.planner.sql.parser.DrillCalciteWrapperUtility; +import org.slf4j.Logger; /** * Rule to reduce aggregates to simpler forms. Currently only AVG(x) to @@ -718,7 +718,7 @@ public void onMatch(RelOptRuleCall call) { oldAggRel.getGroupSets(), newAggregateCalls)); } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } } @@ -760,7 +760,8 @@ public void onMatch(RelOptRuleCall call) { sumZeroAgg, sumType, rexWinAggCall.operands, - rexWinAggCall.ordinal); + rexWinAggCall.ordinal, + rexWinAggCall.distinct); aggCalls.add(sumZeroCall); } else { aggCalls.add(rexWinAggCall); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillReduceExpressionsRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillReduceExpressionsRule.java index 2b658316cb1..96bcf026927 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillReduceExpressionsRule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillReduceExpressionsRule.java @@ -1,4 +1,4 @@ -/******************************************************************************* +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -14,17 +14,18 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - ******************************************************************************/ + */ package org.apache.drill.exec.planner.logical; +import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.rel.RelCollations; import org.apache.calcite.rel.core.Calc; -import org.apache.calcite.rel.logical.LogicalCalc; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Filter; -import org.apache.calcite.rel.RelCollationImpl; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.SingleRel; -import org.apache.calcite.rel.core.Sort; +import org.apache.calcite.rel.logical.LogicalCalc; +import org.apache.calcite.rel.logical.LogicalFilter; import org.apache.calcite.rel.logical.LogicalSort; import org.apache.calcite.rel.rules.ReduceExpressionsRule; @@ -38,10 +39,10 @@ public class DrillReduceExpressionsRule { public static final DrillReduceCalcRule CALC_INSTANCE_DRILL = new DrillReduceCalcRule(); - private static class DrillReduceFilterRule extends ReduceExpressionsRule.ReduceFilterRule { + private static class DrillReduceFilterRule extends ReduceExpressionsRule.FilterReduceExpressionsRule { DrillReduceFilterRule() { - super("DrillReduceExpressionsRule(Filter)"); + super(DrillFilterRel.class, RelFactories.LOGICAL_BUILDER); } /** @@ -51,16 +52,16 @@ private static class DrillReduceFilterRule extends ReduceExpressionsRule.ReduceF * expose the planning time known schema. Instead we have to insert a limit 0. */ @Override - protected RelNode createEmptyRelOrEquivalent(Filter filter) { + protected RelNode createEmptyRelOrEquivalent(RelOptRuleCall call, Filter filter) { return createEmptyEmptyRelHelper(filter); } } - private static class DrillReduceCalcRule extends ReduceExpressionsRule.ReduceCalcRule { + private static class DrillReduceCalcRule extends ReduceExpressionsRule.CalcReduceExpressionsRule { DrillReduceCalcRule() { - super("DrillReduceExpressionsRule(Calc)"); + super(Calc.class, RelFactories.LOGICAL_BUILDER); } /** @@ -70,8 +71,8 @@ private static class DrillReduceCalcRule extends ReduceExpressionsRule.ReduceCal * expose the planning time known schema. Instead we have to insert a limit 0. */ @Override - protected RelNode createEmptyRelOrEquivalent(Calc calc) { - return createEmptyEmptyRelHelper(calc); + protected RelNode createEmptyRelOrEquivalent(RelOptRuleCall call, Calc input) { + return createEmptyEmptyRelHelper(input); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRelFactories.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRelFactories.java index 0348a5b3a09..487da4d6393 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRelFactories.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRelFactories.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -20,6 +20,7 @@ import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalFilter; @@ -79,6 +80,14 @@ public RelNode createFilter(RelNode child, RexNode condition) { * {@link org.apache.calcite.rel.logical.LogicalJoin}. */ private static class DrillJoinFactoryImpl implements RelFactories.JoinFactory { + + @Override + public RelNode createJoin(RelNode left, RelNode right, + RexNode condition, Set variablesSet, + JoinRelType joinType, boolean semiJoinDone) { + return new DrillJoinRel(left.getCluster(), left.getTraitSet(), left, right, condition, joinType); + } + @Override public RelNode createJoin(RelNode left, RelNode right, RexNode condition, JoinRelType joinType, diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillStoreRel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillStoreRel.java index 7c498f395d9..9872f950a8f 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillStoreRel.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillStoreRel.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -21,6 +21,7 @@ import org.apache.calcite.prepare.Prepare.CatalogReader; +import org.apache.calcite.rex.RexNode; import org.apache.drill.common.logical.data.LogicalOperator; import org.apache.drill.exec.planner.common.DrillStoreRelBase; import org.apache.calcite.rel.RelNode; @@ -31,9 +32,9 @@ public class DrillStoreRel extends DrillStoreRelBase implements DrillRel{ static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillStoreRel.class); - protected DrillStoreRel(RelOptCluster cluster, RelTraitSet traits, RelOptTable table, CatalogReader catalogReader, - RelNode child, Operation operation, List updateColumnList, boolean flattened) { - super(cluster, traits, table, catalogReader, child, operation, updateColumnList, flattened); + protected DrillStoreRel(RelOptCluster cluster, RelTraitSet traits, RelOptTable table, CatalogReader catalogReader, RelNode child, + Operation operation, List updateColumnList, List sourceExpressionList, boolean flattened) { + super(cluster, traits, table, catalogReader, child, operation, updateColumnList, sourceExpressionList, flattened); } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillUnionAllRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillUnionAllRule.java index 10c0118f8ba..a0749527c0f 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillUnionAllRule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillUnionAllRule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.logging.Logger; import org.apache.drill.exec.planner.common.DrillUnionRelBase; import org.apache.calcite.rel.InvalidRelException; @@ -30,6 +29,7 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.util.trace.CalciteTrace; +import org.slf4j.Logger; /** * Rule that converts a {@link LogicalUnion} to a {@link DrillUnionRelBase}, implemented by a "union" operation. @@ -44,7 +44,7 @@ private DrillUnionAllRule() { @Override public void onMatch(RelOptRuleCall call) { - final LogicalUnion union = (LogicalUnion) call.rel(0); + final LogicalUnion union = call.rel(0); // This rule applies to Union-All only if(!union.all) { @@ -61,7 +61,7 @@ public void onMatch(RelOptRuleCall call) { call.transformTo(new DrillUnionRel(union.getCluster(), traits, convertedInputs, union.all, true /* check compatibility */)); } catch (InvalidRelException e) { - tracer.warning(e.toString()) ; + tracer.warn(e.toString()) ; } } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillViewTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillViewTable.java index d2e1ace93bb..0f0278edd63 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillViewTable.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillViewTable.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -17,8 +17,7 @@ */ package org.apache.drill.exec.planner.logical; -import java.util.List; - +import com.google.common.collect.ImmutableList; import org.apache.calcite.schema.Schema.TableType; import org.apache.calcite.schema.Statistic; import org.apache.calcite.schema.Statistics; @@ -65,9 +64,9 @@ public RelNode toRel(ToRelContext context, RelOptTable relOptTable) { if (viewExpansionContext.isImpersonationEnabled()) { token = viewExpansionContext.reserveViewExpansionToken(viewOwner); - rel = context.expandView(rowType, view.getSql(), token.getSchemaTree(), view.getWorkspaceSchemaPath()); + rel = context.expandView(rowType, view.getSql(), token.getSchemaTree(), view.getWorkspaceSchemaPath()).rel; } else { - rel = context.expandView(rowType, view.getSql(), view.getWorkspaceSchemaPath()); + rel = context.expandView(rowType, view.getSql(), view.getWorkspaceSchemaPath(), ImmutableList.of()).rel; } // If the View's field list is not "*", create a cast. diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashAggPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashAggPrel.java index 09d33fd8a6b..b647279a3e8 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashAggPrel.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashAggPrel.java @@ -21,13 +21,8 @@ import java.util.List; import org.apache.calcite.util.ImmutableBitSet; -import org.apache.drill.common.logical.data.NamedExpression; -import org.apache.drill.exec.ExecConstants; -import org.apache.drill.exec.expr.holders.IntHolder; import org.apache.drill.exec.physical.base.PhysicalOperator; import org.apache.drill.exec.physical.config.HashAggregate; -import org.apache.drill.exec.planner.cost.DrillCostBase; -import org.apache.drill.exec.planner.cost.DrillCostBase.DrillCostFactory; import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode; import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.core.Aggregate; diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashAggPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashAggPrule.java index e16593bae00..f4cdf6270e2 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashAggPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashAggPrule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -17,8 +17,6 @@ */ package org.apache.drill.exec.planner.physical; -import java.util.logging.Logger; - import org.apache.drill.exec.planner.logical.DrillAggregateRel; import org.apache.drill.exec.planner.logical.RelOptHelper; import org.apache.drill.exec.planner.physical.AggPrelBase.OperatorPhase; @@ -31,6 +29,7 @@ import org.apache.calcite.util.trace.CalciteTrace; import com.google.common.collect.ImmutableList; +import org.slf4j.Logger; public class HashAggPrule extends AggPruleBase { public static final RelOptRule INSTANCE = new HashAggPrule(); @@ -94,7 +93,7 @@ public void onMatch(RelOptRuleCall call) { } } } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashJoinPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashJoinPrel.java index 1795bf1857a..31b777296e2 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashJoinPrel.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashJoinPrel.java @@ -27,7 +27,6 @@ import org.apache.drill.exec.physical.config.HashJoinPOP; import org.apache.drill.exec.physical.impl.join.JoinUtils; import org.apache.drill.exec.physical.impl.join.JoinUtils.JoinCategory; -import org.apache.drill.exec.planner.cost.DrillCostBase.DrillCostFactory; import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode; import org.apache.calcite.rel.InvalidRelException; import org.apache.calcite.rel.core.JoinRelType; diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashJoinPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashJoinPrule.java index 1fd0e51f842..d07cf51d3c1 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashJoinPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashJoinPrule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -17,8 +17,6 @@ */ package org.apache.drill.exec.planner.physical; -import java.util.logging.Logger; - import org.apache.drill.exec.planner.logical.DrillJoinRel; import org.apache.drill.exec.planner.logical.RelOptHelper; import org.apache.calcite.rel.InvalidRelException; @@ -27,6 +25,7 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelOptRuleOperand; import org.apache.calcite.util.trace.CalciteTrace; +import org.slf4j.Logger; public class HashJoinPrule extends JoinPruleBase { public static final RelOptRule DIST_INSTANCE = new HashJoinPrule("Prel.HashJoinDistPrule", RelOptHelper.any(DrillJoinRel.class), true); @@ -53,7 +52,7 @@ public void onMatch(RelOptRuleCall call) { return; } - final DrillJoinRel join = (DrillJoinRel) call.rel(0); + final DrillJoinRel join = call.rel(0); final RelNode left = join.getLeft(); final RelNode right = join.getRight(); @@ -77,7 +76,7 @@ public void onMatch(RelOptRuleCall call) { } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/MergeJoinPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/MergeJoinPrule.java index dd587b8750f..3f40720fe43 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/MergeJoinPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/MergeJoinPrule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -18,7 +18,6 @@ package org.apache.drill.exec.planner.physical; import java.util.List; -import java.util.logging.Logger; import org.apache.drill.exec.planner.logical.DrillJoinRel; import org.apache.drill.exec.planner.logical.RelOptHelper; @@ -33,6 +32,7 @@ import org.apache.calcite.util.trace.CalciteTrace; import com.google.common.collect.Lists; +import org.slf4j.Logger; public class MergeJoinPrule extends JoinPruleBase { public static final RelOptRule DIST_INSTANCE = new MergeJoinPrule("Prel.MergeJoinDistPrule", RelOptHelper.any(DrillJoinRel.class), true); @@ -78,7 +78,7 @@ public void onMatch(RelOptRuleCall call) { } } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/NestedLoopJoinPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/NestedLoopJoinPrule.java index b98976b9138..26e1b73c8be 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/NestedLoopJoinPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/NestedLoopJoinPrule.java @@ -18,7 +18,6 @@ package org.apache.drill.exec.planner.physical; import java.util.List; -import java.util.logging.Logger; import org.apache.drill.exec.physical.impl.join.JoinUtils; import org.apache.drill.exec.physical.impl.join.JoinUtils.JoinCategory; @@ -33,6 +32,7 @@ import org.apache.calcite.util.trace.CalciteTrace; import com.google.common.collect.Lists; +import org.slf4j.Logger; public class NestedLoopJoinPrule extends JoinPruleBase { @@ -81,7 +81,7 @@ public void onMatch(RelOptRuleCall call) { return; } - final DrillJoinRel join = (DrillJoinRel) call.rel(0); + final DrillJoinRel join = call.rel(0); final RelNode left = join.getLeft(); final RelNode right = join.getRight(); @@ -97,7 +97,7 @@ public void onMatch(RelOptRuleCall call) { } } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/StreamAggPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/StreamAggPrule.java index ea7927ccbe4..a6a8f2883e3 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/StreamAggPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/StreamAggPrule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -18,7 +18,6 @@ package org.apache.drill.exec.planner.physical; import java.util.List; -import java.util.logging.Logger; import org.apache.calcite.util.BitSets; @@ -37,6 +36,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import org.slf4j.Logger; public class StreamAggPrule extends AggPruleBase { public static final RelOptRule INSTANCE = new StreamAggPrule(); @@ -174,7 +174,7 @@ public RelNode convertChild(final DrillAggregateRel aggregate, final RelNode rel } } } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnionAllPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnionAllPrule.java index 9d9322025d2..336ab3a96b1 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnionAllPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnionAllPrule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -18,7 +18,6 @@ package org.apache.drill.exec.planner.physical; import java.util.List; -import java.util.logging.Logger; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; @@ -34,6 +33,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import org.slf4j.Logger; public class UnionAllPrule extends Prule { public static final RelOptRule INSTANCE = new UnionAllPrule(); @@ -46,20 +46,19 @@ private UnionAllPrule() { @Override public boolean matches(RelOptRuleCall call) { - DrillUnionRel union = (DrillUnionRel) call.rel(0); + DrillUnionRel union = call.rel(0); return (! union.isDistinct()); } @Override public void onMatch(RelOptRuleCall call) { - final DrillUnionRel union = (DrillUnionRel) call.rel(0); + final DrillUnionRel union = call.rel(0); final List inputs = union.getInputs(); List convertedInputList = Lists.newArrayList(); PlannerSettings settings = PrelUtil.getPlannerSettings(call.getPlanner()); boolean allHashDistributed = true; - for (int i = 0; i < inputs.size(); i++) { - RelNode child = inputs.get(i); + for (RelNode child : inputs) { List childDistFields = Lists.newArrayList(); RelNode convertedChild; @@ -110,7 +109,7 @@ public void onMatch(RelOptRuleCall call) { call.transformTo(left); } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnionDistinctPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnionDistinctPrule.java index 8b4d62dce7d..f353802b00f 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnionDistinctPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnionDistinctPrule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -18,7 +18,6 @@ package org.apache.drill.exec.planner.physical; import java.util.List; -import java.util.logging.Logger; import org.apache.drill.exec.planner.logical.DrillUnionRel; import org.apache.drill.exec.planner.logical.RelOptHelper; @@ -30,6 +29,7 @@ import org.apache.calcite.util.trace.CalciteTrace; import com.google.common.collect.Lists; +import org.slf4j.Logger; public class UnionDistinctPrule extends Prule { public static final RelOptRule INSTANCE = new UnionDistinctPrule(); @@ -42,20 +42,20 @@ private UnionDistinctPrule() { @Override public boolean matches(RelOptRuleCall call) { - DrillUnionRel union = (DrillUnionRel) call.rel(0); + DrillUnionRel union = call.rel(0); return (union.isDistinct() && union.isHomogeneous(false /* don't compare names */)); } @Override public void onMatch(RelOptRuleCall call) { - final DrillUnionRel union = (DrillUnionRel) call.rel(0); + final DrillUnionRel union = call.rel(0); final List inputs = union.getInputs(); List convertedInputList = Lists.newArrayList(); RelTraitSet traits = call.getPlanner().emptyTraitSet().plus(Prel.DRILL_PHYSICAL); try { - for (int i = 0; i < inputs.size(); i++) { - RelNode convertedInput = convert(inputs.get(i), PrelUtil.fixTraits(call, traits)); + for (RelNode input : inputs) { + RelNode convertedInput = convert(input, PrelUtil.fixTraits(call, traits)); convertedInputList.add(convertedInput); } @@ -67,7 +67,7 @@ public void onMatch(RelOptRuleCall call) { call.transformTo(unionDistinct); } catch (InvalidRelException e) { - tracer.warning(e.toString()); + tracer.warn(e.toString()); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/WindowPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/WindowPrule.java index 1980335607e..4fdb3b90776 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/WindowPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/WindowPrule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -154,15 +154,15 @@ public boolean apply(RelDataTypeField relDataTypeField) { newOperandsOfWindowFunction.add(operand); } - aggCall = new Window.RexWinAggCall( (SqlAggFunction) aggCall.getOperator(), aggCall.getType(), newOperandsOfWindowFunction, - aggCall.ordinal); + aggCall.ordinal, + aggCall.distinct); newWinAggCalls.add(new Window.RexWinAggCall( - (SqlAggFunction)aggCall.getOperator(), aggCall.getType(), aggCall.getOperands(), aggOrd.i) + (SqlAggFunction)aggCall.getOperator(), aggCall.getType(), aggCall.getOperands(), aggOrd.i, aggCall.distinct) ); } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/TopProjectVisitor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/TopProjectVisitor.java index 08bd9e71998..6b81b70b3b4 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/TopProjectVisitor.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/TopProjectVisitor.java @@ -129,7 +129,7 @@ private Prel addTopProjectPrel(Prel prel, RelDataType validatedRowType) { List fieldNames = SqlValidatorUtil.uniquify( validatedRowType.getFieldNames(), - SqlValidatorUtil.F_SUGGESTER2, + SqlValidatorUtil.EXPR_SUGGESTER, prel.getCluster().getTypeFactory().getTypeSystem().isSchemaCaseSensitive()); RelDataType newRowType = RexUtil.createStructType(prel.getCluster().getTypeFactory(), projections, fieldNames, null); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlAggFunctionWrapper.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlAggFunctionWrapper.java index 3795dd4651b..a87247b9a33 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlAggFunctionWrapper.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlAggFunctionWrapper.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -29,6 +29,7 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; +import org.apache.calcite.util.Litmus; import org.apache.drill.exec.expr.fn.DrillFuncHolder; import java.util.List; @@ -84,7 +85,7 @@ public RelDataType inferReturnType(SqlOperatorBinding opBinding) { } @Override - public boolean validRexOperands(int count, boolean fail) { + public boolean validRexOperands(int count, Litmus litmus) { return true; } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlFunctionWrapper.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlFunctionWrapper.java index 1c61d085ff7..cf3b8662f4b 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlFunctionWrapper.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlFunctionWrapper.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -29,6 +29,7 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; +import org.apache.calcite.util.Litmus; import org.apache.drill.exec.expr.fn.DrillFuncHolder; import java.util.List; @@ -65,7 +66,7 @@ public SqlOperator getOperator() { } @Override - public boolean validRexOperands(int count, boolean fail) { + public boolean validRexOperands(int count, Litmus litmus) { return true; } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlOperatorWrapper.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlOperatorWrapper.java index 825812059bc..2bf04b91e81 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlOperatorWrapper.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillCalciteSqlOperatorWrapper.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -28,6 +28,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.validate.SqlMonotonicity; import org.apache.calcite.sql.validate.SqlValidator; +import org.apache.calcite.util.Litmus; import org.apache.drill.exec.expr.fn.DrillFuncHolder; import java.util.List; @@ -88,7 +89,7 @@ public boolean checkOperandTypes( } @Override - public boolean validRexOperands(int count, boolean fail) { + public boolean validRexOperands(int count, Litmus litmus) { return true; } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillParserConfig.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillParserConfig.java index d8441aeaa97..1f67c5e1611 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillParserConfig.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillParserConfig.java @@ -21,6 +21,8 @@ import org.apache.calcite.avatica.util.Quoting; import org.apache.calcite.sql.parser.SqlParser; import org.apache.calcite.sql.parser.SqlParserImplFactory; +import org.apache.calcite.sql.validate.SqlConformance; +import org.apache.calcite.sql.validate.SqlConformanceEnum; import org.apache.drill.exec.planner.physical.PlannerSettings; import org.apache.drill.exec.planner.sql.parser.impl.DrillParserWithCompoundIdConverter; @@ -59,6 +61,16 @@ public boolean caseSensitive() { return false; } + @Override + public SqlConformance conformance() { + return SqlConformanceEnum.DEFAULT; + } + + @Override + public boolean allowBangEqual() { + return conformance().isBangEqualAllowed(); + } + @Override public SqlParserImplFactory parserFactory() { return DrillParserWithCompoundIdConverter.FACTORY; diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java index 3bc09229ede..345e4b72767 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java @@ -19,6 +19,8 @@ import java.io.IOException; +import org.apache.calcite.sql.SqlDescribeSchema; +import org.apache.calcite.sql.SqlDescribeTable; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.tools.RelConversionException; @@ -28,10 +30,13 @@ import org.apache.drill.exec.physical.PhysicalPlan; import org.apache.drill.exec.planner.sql.handlers.AbstractSqlHandler; import org.apache.drill.exec.planner.sql.handlers.DefaultSqlHandler; +import org.apache.drill.exec.planner.sql.handlers.DescribeSchemaHandler; +import org.apache.drill.exec.planner.sql.handlers.DescribeTableHandler; import org.apache.drill.exec.planner.sql.handlers.ExplainHandler; import org.apache.drill.exec.planner.sql.handlers.SetOptionHandler; import org.apache.drill.exec.planner.sql.handlers.SqlHandlerConfig; import org.apache.drill.exec.planner.sql.parser.DrillSqlCall; +import org.apache.drill.exec.planner.sql.parser.DrillSqlDescribeTable; import org.apache.drill.exec.planner.sql.parser.SqlCreateTable; import org.apache.drill.exec.testing.ControlsInjector; import org.apache.drill.exec.testing.ControlsInjectorFactory; @@ -112,6 +117,16 @@ private static PhysicalPlan getQueryPlan(QueryContext context, String sql, Point case SET_OPTION: handler = new SetOptionHandler(context); break; + case DESCRIBE_TABLE: + if (sqlNode instanceof DrillSqlDescribeTable) { + handler = new DescribeTableHandler(config); + break; + } + case DESCRIBE_SCHEMA: + if (sqlNode instanceof SqlDescribeSchema) { + handler = new DescribeSchemaHandler(config); + break; + } case OTHER: if(sqlNode instanceof SqlCreateTable) { handler = ((DrillSqlCall)sqlNode).getSqlHandler(config, textPlan); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java index dbe16bd5904..6f59fcf7e00 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java @@ -22,9 +22,12 @@ import java.util.Set; import com.google.common.base.Strings; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import org.apache.calcite.adapter.java.JavaTypeFactory; +import org.apache.calcite.avatica.util.Casing; +import org.apache.calcite.avatica.util.Quoting; import org.apache.calcite.jdbc.CalciteSchema; -import org.apache.calcite.jdbc.CalciteSchemaImpl; import org.apache.calcite.jdbc.JavaTypeFactoryImpl; import org.apache.calcite.plan.ConventionTraitDef; import org.apache.calcite.plan.RelOptCluster; @@ -32,9 +35,10 @@ import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.plan.volcano.VolcanoPlanner; import org.apache.calcite.prepare.CalciteCatalogReader; +import org.apache.calcite.prepare.Prepare; import org.apache.calcite.prepare.RelOptTableImpl; import org.apache.calcite.rel.RelCollationTraitDef; -import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.RelRoot; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeSystemImpl; @@ -45,10 +49,12 @@ import org.apache.calcite.sql.SqlOperatorTable; import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.sql.parser.SqlParser; +import org.apache.calcite.sql.parser.SqlParserImplFactory; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.sql.util.ChainedSqlOperatorTable; import org.apache.calcite.sql.validate.SqlConformance; +import org.apache.calcite.sql.validate.SqlConformanceEnum; import org.apache.calcite.sql.validate.SqlValidatorCatalogReader; import org.apache.calcite.sql.validate.SqlValidatorImpl; import org.apache.calcite.sql.validate.SqlValidatorScope; @@ -67,11 +73,10 @@ import org.apache.drill.exec.planner.logical.DrillConstExecutor; import org.apache.drill.exec.planner.physical.DrillDistributionTraitDef; import org.apache.drill.exec.planner.physical.PlannerSettings; +import org.apache.drill.exec.planner.sql.parser.impl.DrillParserWithCompoundIdConverter; import org.apache.drill.exec.rpc.user.UserSession; import com.google.common.base.Joiner; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; /** * Class responsible for managing parsing, validation and toRel conversion for sql statements. @@ -119,7 +124,7 @@ public SqlConverter(QueryContext context) { this.catalog = new DrillCalciteCatalogReader( this.rootSchema, parserConfig.caseSensitive(), - CalciteSchemaImpl.from(defaultSchema).path(null), + CalciteSchema.from(defaultSchema).path(null), typeFactory, drillConfig, session); @@ -253,8 +258,7 @@ public boolean isSchemaCaseSensitive() { } } - public RelNode toRel( - final SqlNode validatedNode) { + public RelRoot toRel(final SqlNode validatedNode) { final RexBuilder rexBuilder = new DrillRexBuilder(typeFactory); if (planner == null) { planner = new VolcanoPlanner(costFactory, settings); @@ -269,9 +273,10 @@ public RelNode toRel( final SqlToRelConverter sqlToRelConverter = new SqlToRelConverter(new Expander(), validator, catalog, cluster, DrillConvertletTable.INSTANCE, sqlToRelConverterConfig); - final RelNode rel = sqlToRelConverter.convertQuery(validatedNode, false, !isInnerQuery); - final RelNode rel2 = sqlToRelConverter.flattenTypes(rel, true); - final RelNode rel3 = RelDecorrelator.decorrelateQuery(rel2); + //To avoid unexpected column errors set a value of top to false + final RelRoot rel = sqlToRelConverter.convertQuery(validatedNode, false, false); + final RelRoot rel2 = rel.withRel(sqlToRelConverter.flattenTypes(rel.rel, true)); + final RelRoot rel3 = rel2.withRel(RelDecorrelator.decorrelateQuery(rel2.rel)); return rel3; } @@ -282,7 +287,7 @@ public Expander() { } @Override - public RelNode expandView(RelDataType rowType, String queryString, List schemaPath) { + public RelRoot expandView(RelDataType rowType, String queryString, List schemaPath, List viewPath) { final DrillCalciteCatalogReader catalogReader = new DrillCalciteCatalogReader( rootSchema, parserConfig.caseSensitive(), @@ -295,7 +300,7 @@ public RelNode expandView(RelDataType rowType, String queryString, List } @Override - public RelNode expandView(RelDataType rowType, String queryString, SchemaPlus rootSchema, List schemaPath) { + public RelRoot expandView(RelDataType rowType, String queryString, SchemaPlus rootSchema, List schemaPath) { final DrillCalciteCatalogReader catalogReader = new DrillCalciteCatalogReader( rootSchema, // new root schema parserConfig.caseSensitive(), @@ -324,7 +329,7 @@ public RelNode expandView(RelDataType rowType, String queryString, SchemaPlus ro return expandView(queryString, parser); } - private RelNode expandView(String queryString, SqlConverter converter) { + private RelRoot expandView(String queryString, SqlConverter converter) { converter.disallowTemporaryTables(); final SqlNode parsedNode = converter.parse(queryString); final SqlNode validatedNode = converter.validate(parsedNode); @@ -368,7 +373,7 @@ public boolean isExpand() { } @Override - public int getInSubqueryThreshold() { + public int getInSubQueryThreshold() { return inSubqueryThreshold; } } @@ -446,7 +451,7 @@ private class DrillCalciteCatalogReader extends CalciteCatalogReader { JavaTypeFactory typeFactory, DrillConfig drillConfig, UserSession session) { - super(CalciteSchemaImpl.from(rootSchema), caseSensitive, defaultSchema, typeFactory); + super(CalciteSchema.from(rootSchema), caseSensitive, defaultSchema, typeFactory); this.drillConfig = drillConfig; this.session = session; this.allowTemporaryTables = true; @@ -471,8 +476,8 @@ public void disallowTemporaryTables() { * @throws UserException if temporary tables usage is disallowed */ @Override - public RelOptTableImpl getTable(final List names) { - RelOptTableImpl temporaryTable = null; + public Prepare.PreparingTable getTable(final List names) { + Prepare.PreparingTable temporaryTable = null; if (mightBeTemporaryTable(names, session.getDefaultSchemaPath(), drillConfig)) { String temporaryTableName = session.resolveTemporaryTableName(names.get(names.size() - 1)); @@ -491,7 +496,7 @@ public RelOptTableImpl getTable(final List names) { .build(logger); } - RelOptTableImpl table = super.getTable(names); + Prepare.PreparingTable table = super.getTable(names); // Check the schema and throw a valid SchemaNotFound exception instead of TableNotFound exception. if (table == null) { diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/TypeInferenceUtils.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/TypeInferenceUtils.java index 523b72196a5..ddf48ede8e4 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/TypeInferenceUtils.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/TypeInferenceUtils.java @@ -35,6 +35,7 @@ import org.apache.calcite.sql.fun.SqlAvgAggFunction; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.type.SqlReturnTypeInference; +import org.apache.calcite.sql.type.SqlTypeFamily; import org.apache.calcite.sql.type.SqlTypeName; import org.apache.drill.common.expression.ExpressionPosition; @@ -73,7 +74,7 @@ public class TypeInferenceUtils { .put(TypeProtos.MinorType.TIMESTAMP, SqlTypeName.TIMESTAMP) .put(TypeProtos.MinorType.VARBINARY, SqlTypeName.VARBINARY) .put(TypeProtos.MinorType.INTERVALYEAR, SqlTypeName.INTERVAL_YEAR_MONTH) - .put(TypeProtos.MinorType.INTERVALDAY, SqlTypeName.INTERVAL_DAY_TIME) + .put(TypeProtos.MinorType.INTERVALDAY, SqlTypeName.INTERVAL_DAY) .put(TypeProtos.MinorType.MAP, SqlTypeName.MAP) .put(TypeProtos.MinorType.LIST, SqlTypeName.ARRAY) .put(TypeProtos.MinorType.LATE, SqlTypeName.ANY) @@ -97,8 +98,19 @@ public class TypeInferenceUtils { .put(SqlTypeName.TIME, TypeProtos.MinorType.TIME) .put(SqlTypeName.TIMESTAMP, TypeProtos.MinorType.TIMESTAMP) .put(SqlTypeName.VARBINARY, TypeProtos.MinorType.VARBINARY) + .put(SqlTypeName.INTERVAL_YEAR, TypeProtos.MinorType.INTERVALYEAR) .put(SqlTypeName.INTERVAL_YEAR_MONTH, TypeProtos.MinorType.INTERVALYEAR) - .put(SqlTypeName.INTERVAL_DAY_TIME, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_MONTH, TypeProtos.MinorType.INTERVALYEAR) + .put(SqlTypeName.INTERVAL_DAY, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_DAY_HOUR, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_DAY_MINUTE, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_DAY_SECOND, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_HOUR, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_HOUR_MINUTE, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_HOUR_SECOND, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_MINUTE, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_MINUTE_SECOND, TypeProtos.MinorType.INTERVALDAY) + .put(SqlTypeName.INTERVAL_SECOND, TypeProtos.MinorType.INTERVALDAY) // SqlTypeName.CHAR is the type for Literals in Calcite, Drill treats Literals as VARCHAR also .put(SqlTypeName.CHAR, TypeProtos.MinorType.VARCHAR) @@ -734,13 +746,13 @@ public static RelDataType createCalciteTypeWithNullability(RelDataTypeFactory ty SqlTypeName sqlTypeName, boolean isNullable) { RelDataType type; - if (sqlTypeName == SqlTypeName.INTERVAL_DAY_TIME) { + if (sqlTypeName.getFamily() == SqlTypeFamily.INTERVAL_DAY_TIME) { type = typeFactory.createSqlIntervalType( new SqlIntervalQualifier( TimeUnit.DAY, TimeUnit.MINUTE, SqlParserPos.ZERO)); - } else if (sqlTypeName == SqlTypeName.INTERVAL_YEAR_MONTH) { + } else if (sqlTypeName.getFamily() == SqlTypeFamily.INTERVAL_YEAR_MONTH) { type = typeFactory.createSqlIntervalType( new SqlIntervalQualifier( TimeUnit.YEAR, diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java index 9515b3b357b..93113cb8294 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java @@ -23,6 +23,10 @@ import java.util.List; import java.util.concurrent.TimeUnit; +import com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptCostImpl; +import org.apache.calcite.plan.RelOptLattice; +import org.apache.calcite.plan.RelOptMaterialization; import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptUtil; @@ -37,6 +41,8 @@ import org.apache.calcite.rel.core.TableFunctionScan; import org.apache.calcite.rel.core.TableScan; import org.apache.calcite.rel.logical.LogicalValues; +import org.apache.calcite.rel.metadata.CachingRelMetadataProvider; +import org.apache.calcite.rel.metadata.ChainedRelMetadataProvider; import org.apache.calcite.rel.metadata.JaninoRelMetadataProvider; import org.apache.calcite.rel.metadata.RelMetadataProvider; import org.apache.calcite.rel.metadata.RelMetadataQuery; @@ -46,13 +52,13 @@ import org.apache.calcite.rex.RexUtil; import org.apache.calcite.sql.SqlExplainLevel; import org.apache.calcite.sql.SqlNode; -import org.apache.calcite.sql.TypedSqlNode; import org.apache.calcite.sql.validate.SqlValidatorUtil; import org.apache.calcite.tools.Program; import org.apache.calcite.tools.Programs; import org.apache.calcite.tools.RelConversionException; import org.apache.calcite.tools.RuleSet; import org.apache.calcite.tools.ValidationException; +import org.apache.calcite.util.Pair; import org.apache.drill.common.JSONOptions; import org.apache.drill.common.logical.PlanProperties; import org.apache.drill.common.logical.PlanProperties.Generator.ResultMode; @@ -189,13 +195,13 @@ protected SqlNode rewrite(SqlNode node) throws RelConversionException, ForemanSe protected ConvertedRelNode validateAndConvert(SqlNode sqlNode) throws ForemanSetupException, RelConversionException, ValidationException { final SqlNode rewrittenSqlNode = rewrite(sqlNode); - final TypedSqlNode validatedTypedSqlNode = validateNode(rewrittenSqlNode); - final SqlNode validated = validatedTypedSqlNode.getSqlNode(); + final Pair validatedTypedSqlNode = validateNode(rewrittenSqlNode); + final SqlNode validated = validatedTypedSqlNode.getKey(); RelNode rel = convertToRel(validated); rel = preprocessNode(rel); - return new ConvertedRelNode(rel, validatedTypedSqlNode.getType()); + return new ConvertedRelNode(rel, validatedTypedSqlNode.getValue()); } /** @@ -375,7 +381,9 @@ protected RelNode transform(PlannerType plannerType, PlannerPhase phase, RelNode hepPgmBldr.addRuleInstance(rule); } - final HepPlanner planner = new HepPlanner(hepPgmBldr.build(), context.getPlannerSettings()); + // Set noDAG = true to avoid caching problems which lead to incorrect Drill work. + final HepPlanner planner = new HepPlanner(hepPgmBldr.build(), context.getPlannerSettings(), true, null, + RelOptCostImpl.FACTORY); JaninoRelMetadataProvider relMetadataProvider = JaninoRelMetadataProvider.of(DrillDefaultRelMetadataProvider.INSTANCE); RelMetadataQuery.THREAD_PROVIDERS.set(relMetadataProvider); @@ -397,7 +405,8 @@ protected RelNode transform(PlannerType plannerType, PlannerPhase phase, RelNode Preconditions.checkArgument(planner instanceof VolcanoPlanner, "Cluster is expected to be constructed using VolcanoPlanner. Was actually of type %s.", planner.getClass() .getName()); - output = program.run(planner, input, toTraits); + output = program.run(planner, input, toTraits, + ImmutableList.of(), ImmutableList.of()); break; } @@ -613,9 +622,9 @@ public Void visitOp(PhysicalOperator op, Collection collection } - private TypedSqlNode validateNode(SqlNode sqlNode) throws ValidationException, RelConversionException, ForemanSetupException { + private Pair validateNode(SqlNode sqlNode) throws ValidationException, RelConversionException, ForemanSetupException { final SqlNode sqlNodeValidated = config.getConverter().validate(sqlNode); - final TypedSqlNode typedSqlNode = new TypedSqlNode(sqlNodeValidated, config.getConverter().getOutputType( + final Pair typedSqlNode = new Pair<>(sqlNodeValidated, config.getConverter().getOutputType( sqlNodeValidated)); // Check if the unsupported functionality is used @@ -634,7 +643,7 @@ private TypedSqlNode validateNode(SqlNode sqlNode) throws ValidationException, R } private RelNode convertToRel(SqlNode node) throws RelConversionException { - final RelNode convertedNode = config.getConverter().toRel(node); + final RelNode convertedNode = config.getConverter().toRel(node).rel; log("INITIAL", convertedNode, logger, null); return transform(PlannerType.HEP, PlannerPhase.WINDOW_REWRITE, convertedNode); } @@ -674,7 +683,7 @@ protected DrillRel addRenamedProject(DrillRel rel, RelDataType validatedRowType) final List fieldNames2 = SqlValidatorUtil.uniquify( validatedRowType.getFieldNames(), - SqlValidatorUtil.F_SUGGESTER2, + SqlValidatorUtil.EXPR_SUGGESTER, rel.getCluster().getTypeFactory().getTypeSystem().isSchemaCaseSensitive()); RelDataType newRowType = RexUtil.createStructType(rel.getCluster().getTypeFactory(), projections, fieldNames2); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeSchemaHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeSchemaHandler.java index 869829a98a2..b41f880acc1 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeSchemaHandler.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeSchemaHandler.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Joiner; import org.apache.calcite.schema.SchemaPlus; +import org.apache.calcite.sql.SqlDescribeSchema; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlNode; import org.apache.drill.common.exceptions.DrillRuntimeException; @@ -31,7 +32,6 @@ import org.apache.drill.exec.physical.PhysicalPlan; import org.apache.drill.exec.planner.sql.DirectPlan; import org.apache.drill.exec.planner.sql.SchemaUtilites; -import org.apache.drill.exec.planner.sql.parser.SqlDescribeSchema; import org.apache.drill.exec.store.StoragePlugin; import org.apache.drill.exec.store.dfs.FileSystemPlugin; import org.apache.drill.exec.store.dfs.FileSystemSchemaFactory; diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeTableHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeTableHandler.java index 72b1aef2aee..0311dfc4083 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeTableHandler.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeTableHandler.java @@ -29,6 +29,7 @@ import java.util.List; import org.apache.calcite.schema.SchemaPlus; +import org.apache.calcite.sql.SqlDescribeTable; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; @@ -41,7 +42,7 @@ import org.apache.drill.common.exceptions.UserException; import org.apache.drill.exec.planner.sql.SchemaUtilites; import org.apache.drill.exec.planner.sql.parser.DrillParserUtil; -import org.apache.drill.exec.planner.sql.parser.SqlDescribeTable; +import org.apache.drill.exec.planner.sql.parser.DrillSqlDescribeTable; import org.apache.drill.exec.work.foreman.ForemanSetupException; import com.google.common.collect.ImmutableList; @@ -54,7 +55,7 @@ public class DescribeTableHandler extends DefaultSqlHandler { /** Rewrite the parse tree as SELECT ... FROM INFORMATION_SCHEMA.COLUMNS ... */ @Override public SqlNode rewrite(SqlNode sqlNode) throws RelConversionException, ForemanSetupException { - SqlDescribeTable node = unwrap(sqlNode, SqlDescribeTable.class); + DrillSqlDescribeTable node = unwrap(sqlNode, DrillSqlDescribeTable.class); try { List selectList = diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/FindLimit0Visitor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/FindLimit0Visitor.java index d5216e735a5..166c350931c 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/FindLimit0Visitor.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/FindLimit0Visitor.java @@ -49,6 +49,7 @@ import org.apache.drill.exec.store.AbstractRecordReader; import org.apache.drill.exec.store.direct.DirectGroupScan; +import java.util.ArrayList; import java.util.List; /** @@ -71,8 +72,11 @@ public class FindLimit0Visitor extends RelShuttleImpl { ImmutableSet.builder() .add(SqlTypeName.INTEGER, SqlTypeName.BIGINT, SqlTypeName.FLOAT, SqlTypeName.DOUBLE, SqlTypeName.VARCHAR, SqlTypeName.BOOLEAN, SqlTypeName.DATE, SqlTypeName.TIME, - SqlTypeName.TIMESTAMP, SqlTypeName.INTERVAL_YEAR_MONTH, SqlTypeName.INTERVAL_DAY_TIME, - SqlTypeName.CHAR) + SqlTypeName.TIMESTAMP, SqlTypeName.INTERVAL_YEAR, SqlTypeName.INTERVAL_YEAR_MONTH, + SqlTypeName.INTERVAL_MONTH, SqlTypeName.INTERVAL_DAY, SqlTypeName.INTERVAL_DAY_HOUR, + SqlTypeName.INTERVAL_DAY_MINUTE, SqlTypeName.INTERVAL_DAY_SECOND, SqlTypeName.INTERVAL_HOUR, + SqlTypeName.INTERVAL_HOUR_MINUTE, SqlTypeName.INTERVAL_HOUR_SECOND, SqlTypeName.INTERVAL_MINUTE, + SqlTypeName.INTERVAL_MINUTE_SECOND, SqlTypeName.INTERVAL_SECOND, SqlTypeName.CHAR) .build(); /** @@ -231,5 +235,26 @@ public int next() { @Override public void close() throws Exception { } + + /** + * Represents RelDataTypeReader content as string, used in query plan json. + * Example: RelDataTypeReader{columnNames=[col1], columnTypes=[INTERVALYEAR-OPTIONAL]} + * + * @return string representation of RelDataTypeReader content + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("RelDataTypeReader{columnNames="); + builder.append(columnNames).append(", columnTypes="); + List columnTypesList = new ArrayList<>(columnTypes.size()); + for (TypeProtos.MajorType columnType : columnTypes) { + columnTypesList.add(columnType.getMinorType().toString() + "-" + columnType.getMode().toString()); + } + builder.append(columnTypesList); + builder.append("}"); + + return builder.toString(); + } } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/CompoundIdentifierConverter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/CompoundIdentifierConverter.java index e9d0dca71eb..4d0f34c0892 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/CompoundIdentifierConverter.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/CompoundIdentifierConverter.java @@ -163,7 +163,7 @@ RewriteType[] should be R(D, E, D, D). rules.put(SqlSelect.class, R(D, E, D, E, E, E, E, E, D, D)); rules.put(SqlCreateTable.class, R(D, D, D, E, D, D)); rules.put(SqlCreateView.class, R(D, E, E, D)); - rules.put(SqlDescribeTable.class, R(D, D, E)); + rules.put(DrillSqlDescribeTable.class, R(D, D, E)); rules.put(SqlDropView.class, R(D, D)); rules.put(SqlShowFiles.class, R(D)); rules.put(SqlShowSchemas.class, R(D, D)); @@ -173,7 +173,6 @@ RewriteType[] should be R(D, E, D, D). rules.put(SqlDropTable.class, R(D, D)); rules.put(SqlRefreshMetadata.class, R(D)); rules.put(SqlSetOption.class, R(D, D, D)); - rules.put(SqlDescribeSchema.class, R(D)); rules.put(SqlCreateFunction.class, R(D)); rules.put(SqlDropFunction.class, R(D)); REWRITE_RULES = ImmutableMap.copyOf(rules); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/DrillSqlDescribeTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/DrillSqlDescribeTable.java new file mode 100644 index 00000000000..c97d8c31bd2 --- /dev/null +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/DrillSqlDescribeTable.java @@ -0,0 +1,73 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to you under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.drill.exec.planner.sql.parser; + +import org.apache.calcite.sql.SqlCall; +import org.apache.calcite.sql.SqlDescribeTable; +import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; +import org.apache.calcite.sql.SqlWriter; +import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.calcite.util.ImmutableNullableList; + +import java.util.List; + +/** + * Sql parser tree node to represent statement: + * { DESCRIBE | DESC } tblname [col_name | wildcard ] + */ +public class DrillSqlDescribeTable extends SqlDescribeTable { + + private final SqlNode columnQualifier; + + public static final SqlSpecialOperator OPERATOR = + new SqlSpecialOperator("DESCRIBE_TABLE", SqlKind.DESCRIBE_TABLE) { + @Override + public SqlCall createCall(SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new DrillSqlDescribeTable(pos, (SqlIdentifier) operands[0], (SqlIdentifier) operands[1], operands[2]); + } + }; + + public DrillSqlDescribeTable(SqlParserPos pos, SqlIdentifier table, SqlIdentifier column, SqlNode columnQualifier) { + super(pos, table, column); + this.columnQualifier = columnQualifier; + } + + @Override + public List getOperandList() { + return ImmutableNullableList.of(getTable(), getColumn(), columnQualifier); + } + + @Override + public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { + super.unparse(writer, leftPrec, rightPrec); + if (columnQualifier != null) { + columnQualifier.unparse(writer, leftPrec, rightPrec); + } + } + + public SqlNode getColumnQualifier() { return columnQualifier; } + + @Override public SqlOperator getOperator() { + return OPERATOR; + } + +} diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDescribeSchema.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDescribeSchema.java deleted file mode 100644 index 7ea694057ae..00000000000 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDescribeSchema.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.drill.exec.planner.sql.parser; - -import org.apache.calcite.sql.SqlCall; -import org.apache.calcite.sql.SqlIdentifier; -import org.apache.calcite.sql.SqlKind; -import org.apache.calcite.sql.SqlLiteral; -import org.apache.calcite.sql.SqlNode; -import org.apache.calcite.sql.SqlOperator; -import org.apache.calcite.sql.SqlSpecialOperator; -import org.apache.calcite.sql.SqlWriter; -import org.apache.calcite.sql.parser.SqlParserPos; -import org.apache.drill.exec.planner.sql.handlers.AbstractSqlHandler; -import org.apache.drill.exec.planner.sql.handlers.DescribeSchemaHandler; -import org.apache.drill.exec.planner.sql.handlers.SqlHandlerConfig; - -import java.util.Collections; -import java.util.List; - -/** - * Sql parse tree node to represent statement: - * DESCRIBE {SCHEMA | DATABASE} schema_name - */ -public class SqlDescribeSchema extends DrillSqlCall { - - private final SqlIdentifier schema; - - public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DESCRIBE_SCHEMA", SqlKind.OTHER) { - @Override - public SqlCall createCall(SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { - return new SqlDescribeSchema(pos, (SqlIdentifier) operands[0]); - } - }; - - public SqlDescribeSchema(SqlParserPos pos, SqlIdentifier schema) { - super(pos); - this.schema = schema; - } - - @Override - public SqlOperator getOperator() { - return OPERATOR; - } - - @Override - public List getOperandList() { - return Collections.singletonList((SqlNode) schema); - } - - @Override - public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { - writer.keyword("DESCRIBE"); - writer.keyword("SCHEMA"); - schema.unparse(writer, leftPrec, rightPrec); - } - - @Override - public AbstractSqlHandler getSqlHandler(SqlHandlerConfig config) { - return new DescribeSchemaHandler(config); - } - - public SqlIdentifier getSchema() { return schema; } - -} diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDescribeTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDescribeTable.java deleted file mode 100644 index 3a09aeaf525..00000000000 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDescribeTable.java +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.drill.exec.planner.sql.parser; - -import java.util.List; - -import org.apache.calcite.tools.Planner; - -import org.apache.drill.exec.ops.QueryContext; -import org.apache.drill.exec.planner.sql.handlers.AbstractSqlHandler; -import org.apache.drill.exec.planner.sql.handlers.DescribeTableHandler; -import org.apache.drill.exec.planner.sql.handlers.SqlHandlerConfig; -import org.apache.calcite.plan.hep.HepPlanner; -import org.apache.calcite.sql.SqlCall; -import org.apache.calcite.sql.SqlIdentifier; -import org.apache.calcite.sql.SqlKind; -import org.apache.calcite.sql.SqlLiteral; -import org.apache.calcite.sql.SqlNode; -import org.apache.calcite.sql.SqlOperator; -import org.apache.calcite.sql.SqlSpecialOperator; -import org.apache.calcite.sql.SqlWriter; -import org.apache.calcite.sql.parser.SqlParserPos; - -import com.google.common.collect.Lists; - -/** - * Sql parser tree node to represent statement: - * { DESCRIBE | DESC } tblname [col_name | wildcard ] - */ -public class SqlDescribeTable extends DrillSqlCall { - - private final SqlIdentifier table; - private final SqlIdentifier column; - private final SqlNode columnQualifier; - - public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DESCRIBE_TABLE", SqlKind.OTHER) { - @Override - public SqlCall createCall(SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { - return new SqlDescribeTable(pos, (SqlIdentifier) operands[0], (SqlIdentifier) operands[1], operands[2]); - } - }; - - public SqlDescribeTable(SqlParserPos pos, SqlIdentifier table, SqlIdentifier column, SqlNode columnQualifier) { - super(pos); - this.table = table; - this.column = column; - this.columnQualifier = columnQualifier; - } - - @Override - public SqlOperator getOperator() { - return OPERATOR; - } - - @Override - public List getOperandList() { - List opList = Lists.newArrayList(); - opList.add(table); - opList.add(column); - opList.add(columnQualifier); - return opList; - } - - @Override - public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { - writer.keyword("DESCRIBE"); - writer.keyword("TABLE"); - table.unparse(writer, leftPrec, rightPrec); - if (column != null) { - column.unparse(writer, leftPrec, rightPrec); - } - if (columnQualifier != null) { - columnQualifier.unparse(writer, leftPrec, rightPrec); - } - } - - @Override - public AbstractSqlHandler getSqlHandler(SqlHandlerConfig config) { - return new DescribeTableHandler(config); - } - - public SqlIdentifier getTable() { return table; } - public SqlIdentifier getColumn() { return column; } - public SqlNode getColumnQualifier() { return columnQualifier; } - -} diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/torel/ConversionContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/torel/ConversionContext.java index a88f5237551..e4b966861e1 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/torel/ConversionContext.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/torel/ConversionContext.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -22,6 +22,7 @@ import org.apache.calcite.prepare.Prepare; +import org.apache.calcite.rel.RelRoot; import org.apache.drill.common.expression.LogicalExpression; import org.apache.drill.common.logical.LogicalPlan; import org.apache.drill.common.logical.data.Filter; @@ -111,12 +112,12 @@ public RelOptTable getTable(Scan scan){ } @Override - public RelNode expandView(RelDataType rowType, String queryString, List schemaPath) { + public RelRoot expandView(RelDataType rowType, String queryString, List schemaPath, List viewPath) { throw new UnsupportedOperationException(); } @Override - public RelNode expandView(RelDataType rowType, String queryString, SchemaPlus rootSchema, List schemaPath) { + public RelRoot expandView(RelDataType rowType, String queryString, SchemaPlus rootSchema, List schemaPath) { throw new UnsupportedOperationException(); } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/types/RelDataTypeDrillImpl.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/types/RelDataTypeDrillImpl.java index 04c35c14964..d3324345dbd 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/types/RelDataTypeDrillImpl.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/types/RelDataTypeDrillImpl.java @@ -20,21 +20,21 @@ import java.util.Collections; import java.util.List; +import org.apache.calcite.rel.type.DynamicRecordType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeFamily; import org.apache.calcite.rel.type.RelDataTypeField; -import org.apache.calcite.rel.type.RelDataTypeImpl; import org.apache.calcite.rel.type.RelDataTypePrecedenceList; import org.apache.calcite.sql.type.SqlTypeExplicitPrecedenceList; import org.apache.calcite.sql.type.SqlTypeName; -/* We use an instance of this class as the row type for +/* We use an instance of this class as the dynamic row type for * Drill table. Since we don't know the schema before hand * whenever optiq requires us to validate that a field exists * we always return true and indicate that the type of that * field is 'ANY' */ -public class RelDataTypeDrillImpl extends RelDataTypeImpl { +public class RelDataTypeDrillImpl extends DynamicRecordType { private final RelDataTypeFactory typeFactory; private final RelDataTypeHolder holder; diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/types/RelDataTypeHolder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/types/RelDataTypeHolder.java index 483b2776f98..aa3542cacfd 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/types/RelDataTypeHolder.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/types/RelDataTypeHolder.java @@ -19,12 +19,15 @@ import java.util.List; +import org.apache.calcite.rel.type.DynamicRecordType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.rel.type.RelDataTypeFieldImpl; import org.apache.calcite.sql.type.SqlTypeName; import com.google.common.collect.Lists; +import org.apache.calcite.util.Pair; +import org.apache.calcite.util.Util; public class RelDataTypeHolder { static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(RelDataTypeHolder.class); @@ -59,7 +62,14 @@ public RelDataTypeField getField(RelDataTypeFactory typeFactory, String fieldNam } /* This field does not exist in our field list add it */ - RelDataTypeField newField = new RelDataTypeFieldImpl(fieldName, fields.size(), typeFactory.createTypeWithNullability(typeFactory.createSqlType(SqlTypeName.ANY), true)); + final SqlTypeName typeName = DynamicRecordType.isDynamicStarColName(fieldName) + ? SqlTypeName.DYNAMIC_STAR : SqlTypeName.ANY; + + // This field does not exist in our field list add it + RelDataTypeField newField = new RelDataTypeFieldImpl( + fieldName, + fields.size(), + typeFactory.createTypeWithNullability(typeFactory.createSqlType(typeName), true)); /* Add the name to our list of field names */ fields.add(newField); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractSchema.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractSchema.java index 7d6bfe35ef3..c4586ef3d19 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractSchema.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractSchema.java @@ -206,6 +206,11 @@ public void close() throws Exception { // no-op: default implementation for most implementations. } + @Override + public Schema snapshot(long now) { + return this; + } + public void dropTable(String tableName) { throw UserException.unsupportedError() .message("Dropping tables is not supported in schema [%s]", getSchemaPath()) diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaTreeProvider.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaTreeProvider.java index 23441bd49d8..21ab39f4f2e 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaTreeProvider.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaTreeProvider.java @@ -20,7 +20,7 @@ import java.io.IOException; import java.util.List; -import org.apache.calcite.jdbc.SimpleCalciteSchema; +import org.apache.calcite.jdbc.CalciteSchema; import org.apache.calcite.schema.SchemaPlus; import org.apache.drill.common.AutoCloseables; import org.apache.drill.common.exceptions.UserException; @@ -106,7 +106,7 @@ public SchemaPlus createRootSchema(final String userName, final SchemaConfigInfo */ public SchemaPlus createRootSchema(SchemaConfig schemaConfig) { try { - final SchemaPlus rootSchema = SimpleCalciteSchema.createRootSchema(false); + final SchemaPlus rootSchema = CalciteSchema.createRootSchema(false, false).plus(); dContext.getSchemaFactory().registerSchemas(schemaConfig, rootSchema); schemaTreesToClose.add(rootSchema); return rootSchema; diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/Records.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/Records.java index 49d142379bd..81ac8b61095 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/Records.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/Records.java @@ -134,8 +134,19 @@ public Column(String catalog, String schemaName, String tableName, RelDataTypeFi case CHAR: this.DATA_TYPE = "CHARACTER"; break; case VARCHAR: this.DATA_TYPE = "CHARACTER VARYING"; break; case VARBINARY: this.DATA_TYPE = "BINARY VARYING"; break; - case INTERVAL_YEAR_MONTH: this.DATA_TYPE = "INTERVAL"; break; - case INTERVAL_DAY_TIME: this.DATA_TYPE = "INTERVAL"; break; + case INTERVAL_YEAR: + case INTERVAL_YEAR_MONTH: + case INTERVAL_MONTH: + case INTERVAL_DAY: + case INTERVAL_DAY_HOUR: + case INTERVAL_DAY_MINUTE: + case INTERVAL_DAY_SECOND: + case INTERVAL_HOUR: + case INTERVAL_HOUR_MINUTE: + case INTERVAL_HOUR_SECOND: + case INTERVAL_MINUTE: + case INTERVAL_MINUTE_SECOND: + case INTERVAL_SECOND: this.DATA_TYPE = "INTERVAL"; break; // 3: SqlTypeName enumerators not yet seen and confirmed or handled. default: logger.warn( "Type not handled explicitly (code needs review): " @@ -292,21 +303,43 @@ public Column(String catalog, String schemaName, String tableName, RelDataTypeFi } break; + case INTERVAL_YEAR: case INTERVAL_YEAR_MONTH: - case INTERVAL_DAY_TIME: + case INTERVAL_MONTH: + case INTERVAL_DAY: + case INTERVAL_DAY_HOUR: + case INTERVAL_DAY_MINUTE: + case INTERVAL_DAY_SECOND: + case INTERVAL_HOUR: + case INTERVAL_HOUR_MINUTE: + case INTERVAL_HOUR_SECOND: + case INTERVAL_MINUTE: + case INTERVAL_MINUTE_SECOND: + case INTERVAL_SECOND: this.CHARACTER_MAXIMUM_LENGTH = null; this.CHARACTER_OCTET_LENGTH = null; this.NUMERIC_PRECISION = null; this.NUMERIC_PRECISION_RADIX = null; this.NUMERIC_SCALE = null; switch ( sqlTypeName ) { + case INTERVAL_YEAR: case INTERVAL_YEAR_MONTH: + case INTERVAL_MONTH: // NOTE: Apparently can't get use RelDataType, etc.; it seems to // apply a default fractional seconds precision of 6 for SECOND, // even though SECOND does not exist for this case. this.DATETIME_PRECISION = 0; break; - case INTERVAL_DAY_TIME: + case INTERVAL_DAY: + case INTERVAL_DAY_HOUR: + case INTERVAL_DAY_MINUTE: + case INTERVAL_DAY_SECOND: + case INTERVAL_HOUR: + case INTERVAL_HOUR_MINUTE: + case INTERVAL_HOUR_SECOND: + case INTERVAL_MINUTE: + case INTERVAL_MINUTE_SECOND: + case INTERVAL_SECOND: this.DATETIME_PRECISION = relDataType .getIntervalQualifier() diff --git a/exec/java-exec/src/test/java/org/apache/drill/PlanningBase.java b/exec/java-exec/src/test/java/org/apache/drill/PlanningBase.java index ca643f5da9d..8a8e8d23458 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/PlanningBase.java +++ b/exec/java-exec/src/test/java/org/apache/drill/PlanningBase.java @@ -23,7 +23,7 @@ import mockit.Mocked; import mockit.NonStrictExpectations; -import org.apache.calcite.jdbc.SimpleCalciteSchema; +import org.apache.calcite.jdbc.CalciteSchema; import org.apache.calcite.schema.SchemaPlus; import org.apache.drill.common.config.DrillConfig; import org.apache.drill.common.config.LogicalPlanPersistence; @@ -111,7 +111,7 @@ protected void testSqlPlan(String sqlCommands) throws Exception { registry.init(); final FunctionImplementationRegistry functionRegistry = new FunctionImplementationRegistry(config); final DrillOperatorTable table = new DrillOperatorTable(functionRegistry, systemOptions); - final SchemaPlus root = SimpleCalciteSchema.createRootSchema(false); + final SchemaPlus root = CalciteSchema.createRootSchema(false, false).plus(); registry.getSchemaFactory().registerSchemas(SchemaConfig.newBuilder("foo", context).build(), root); new NonStrictExpectations() { diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/planner/logical/DrillOptiqTest.java b/exec/java-exec/src/test/java/org/apache/drill/exec/planner/logical/DrillOptiqTest.java index e4496028044..57b74669145 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/planner/logical/DrillOptiqTest.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/planner/logical/DrillOptiqTest.java @@ -56,7 +56,7 @@ public void testUnsupportedRexNode() { // create a dummy RexOver object. RexNode window = rex.makeOver(anyType, SqlStdOperatorTable.AVG, emptyList, emptyList, e, null, null, true, - false, false); + false, false, false); DrillOptiq.toDrill(null, (RelNode) null, window); } catch (UserException e) { if (e.getMessage().contains(DrillOptiq.UNSUPPORTED_REX_NODE_ERROR)) { diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestSqlBracketlessSyntax.java b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestSqlBracketlessSyntax.java index f94c40e5a5b..57ca0c1304f 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestSqlBracketlessSyntax.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestSqlBracketlessSyntax.java @@ -18,7 +18,7 @@ package org.apache.drill.exec.sql; import org.apache.calcite.config.Lex; -import org.apache.calcite.jdbc.SimpleCalciteSchema; +import org.apache.calcite.jdbc.CalciteSchema; import org.apache.calcite.tools.FrameworkConfig; import org.apache.calcite.tools.Frameworks; import org.apache.calcite.tools.Planner; @@ -46,7 +46,7 @@ public void checkComplexExpressionParsing() throws Exception{ .setIdentifierMaxLength(PlannerSettings.DEFAULT_IDENTIFIER_MAX_LENGTH) .setParserFactory(DrillParserImpl.FACTORY) .build()) // - .defaultSchema(SimpleCalciteSchema.createRootSchema(false)) // + .defaultSchema(CalciteSchema.createRootSchema(false, false).plus()) // .convertletTable(DrillConvertletTable.INSTANCE) // .build(); Planner planner = Frameworks.getPlanner(config); diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetGroupScan.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetGroupScan.java index d7ccea43688..6dd2e66362d 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetGroupScan.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetGroupScan.java @@ -85,7 +85,7 @@ public void testWildCardEmptyNoCache() throws Exception { runSQL("SELECT COUNT(*) AS `count` FROM dfs.tmp.`4376_3/604*`"); fail("Query should've failed!"); } catch (UserRemoteException uex) { - final String expectedMsg = "Table 'dfs.tmp.4376_3/604*' not found"; + final String expectedMsg = "Object '4376_3/604*' not found within 'dfs.tmp'"; assertTrue(String.format("Error message should contain \"%s\" but was instead \"%s\"", expectedMsg, uex.getMessage()), uex.getMessage().contains(expectedMsg)); } @@ -112,7 +112,7 @@ public void testSelectEmptyNoCache() throws Exception { runSQL("SELECT COUNT(*) AS `count` FROM dfs.tmp.`4376_5/6041`"); fail("Query should've failed!"); } catch (UserRemoteException uex) { - final String expectedMsg = "Table 'dfs.tmp.4376_5/6041' not found"; + final String expectedMsg = "Object '4376_5/6041' not found within 'dfs.tmp'"; assertTrue(String.format("Error message should contain \"%s\" but was instead \"%s\"", expectedMsg, uex.getMessage()), uex.getMessage().contains(expectedMsg)); } diff --git a/exec/jdbc-all/pom.xml b/exec/jdbc-all/pom.xml index 9db9c581d69..f59780d5584 100644 --- a/exec/jdbc-all/pom.xml +++ b/exec/jdbc-all/pom.xml @@ -509,7 +509,7 @@ This is likely due to you adding new dependencies to a java-exec and not updating the excludes in this module. This is important as it minimizes the size of the dependency of Drill application users. - 32000000 + 35000000 15000000 ${project.build.directory}/drill-jdbc-all-${project.version}.jar @@ -569,7 +569,7 @@ This is likely due to you adding new dependencies to a java-exec and not updating the excludes in this module. This is important as it minimizes the size of the dependency of Drill application users. - 29000000 + 31000000 15000000 ${project.build.directory}/drill-jdbc-all-${project.version}.jar diff --git a/exec/jdbc/pom.xml b/exec/jdbc/pom.xml index dfeaf827f33..d7087f402cf 100644 --- a/exec/jdbc/pom.xml +++ b/exec/jdbc/pom.xml @@ -21,9 +21,8 @@ - org.apache.calcite - calcite-avatica - ${calcite.version} + org.apache.calcite.avatica + avatica jackson-core diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillConnectionImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillConnectionImpl.java index a2b9211467e..689041c57f1 100644 --- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillConnectionImpl.java +++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillConnectionImpl.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -46,6 +46,8 @@ import org.apache.calcite.avatica.AvaticaStatement; import org.apache.calcite.avatica.Meta.ExecuteResult; import org.apache.calcite.avatica.Meta.MetaResultSet; +import org.apache.calcite.avatica.NoSuchStatementException; +import org.apache.calcite.avatica.QueryState; import org.apache.calcite.avatica.UnregisteredDriver; import org.apache.drill.common.config.DrillConfig; import org.apache.drill.common.exceptions.DrillRuntimeException; @@ -180,16 +182,16 @@ protected DrillConnectionImpl(DriverImpl driver, AvaticaFactory factory, @Override - protected ResultSet createResultSet(MetaResultSet metaResultSet) throws SQLException { - return super.createResultSet(metaResultSet); + protected ResultSet createResultSet(MetaResultSet metaResultSet, QueryState state) throws SQLException { + return super.createResultSet(metaResultSet, state); } @Override protected ExecuteResult prepareAndExecuteInternal(AvaticaStatement statement, String sql, long maxRowCount) - throws SQLException { + throws SQLException, NoSuchStatementException { try { return super.prepareAndExecuteInternal(statement, sql, maxRowCount); - } catch(RuntimeException e) { + } catch (RuntimeException e) { Throwables.propagateIfInstanceOf(e.getCause(), SQLException.class); throw e; } diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillJdbc41Factory.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillJdbc41Factory.java index 629e47be336..38715e991da 100644 --- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillJdbc41Factory.java +++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillJdbc41Factory.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -34,6 +34,7 @@ import org.apache.calcite.avatica.Helper; import org.apache.calcite.avatica.Meta; import org.apache.calcite.avatica.Meta.StatementHandle; +import org.apache.calcite.avatica.QueryState; import org.apache.drill.exec.client.DrillClient; import org.apache.drill.exec.client.ServerMethod; import org.apache.drill.exec.proto.UserProtos.CreatePreparedStatementResp; @@ -170,12 +171,13 @@ private DrillJdbc41PreparedStatement newServerPreparedStatement(DrillConnectionI @Override public DrillResultSetImpl newResultSet(AvaticaStatement statement, + QueryState state, Meta.Signature signature, TimeZone timeZone, Meta.Frame firstFrame) { final ResultSetMetaData metaData = newResultSetMetaData(statement, signature); - return new DrillResultSetImpl(statement, signature, metaData, timeZone, firstFrame); + return new DrillResultSetImpl(statement, state, signature, metaData, timeZone, firstFrame); } @Override diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillMetaImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillMetaImpl.java index b78e93a5591..810ffef8cd8 100644 --- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillMetaImpl.java +++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillMetaImpl.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -38,6 +38,10 @@ import org.apache.calcite.avatica.ColumnMetaData.StructType; import org.apache.calcite.avatica.Meta; import org.apache.calcite.avatica.MetaImpl; +import org.apache.calcite.avatica.MissingResultsException; +import org.apache.calcite.avatica.NoSuchStatementException; +import org.apache.calcite.avatica.QueryState; +import org.apache.calcite.avatica.remote.TypedValue; import org.apache.drill.common.exceptions.DrillRuntimeException; import org.apache.drill.common.util.DrillStringUtils; import org.apache.drill.exec.client.ServerMethod; @@ -92,8 +96,8 @@ private static Signature newSignature(String sql) { sql, Collections. emptyList(), Collections.emptyMap(), - null // CursorFactory set to null, as SQL requests use DrillCursor - ); + null, // CursorFactory set to null, as SQL requests use DrillCursor + Meta.StatementType.SELECT); } private MetaResultSet s(String s) { @@ -322,7 +326,7 @@ public Object apply(ResponseValue input) { StructType fieldMetaData = drillFieldMetaData(clazz); Meta.Signature signature = Meta.Signature.create( fieldMetaData.columns, "", - Collections.emptyList(), CursorFactory.record(clazz)); + Collections.emptyList(), CursorFactory.record(clazz), Meta.StatementType.SELECT); AvaticaStatement statement = connection.createStatement(); return MetaResultSet.create(connection.id, statement.getId(), true, @@ -419,8 +423,11 @@ protected MetaImpl.MetaTable adapt(TableMetadata protoValue) { * Implements {@link DatabaseMetaData#getTables}. */ @Override - public MetaResultSet getTables(String catalog, final Pat schemaPattern, final Pat tableNamePattern, - final List typeList) { + public MetaResultSet getTables(ConnectionHandle ch, + String catalog, + Pat schemaPattern, + Pat tableNamePattern, + List typeList) { if (connection.getConfig().isServerMetadataDisabled() || ! connection.getClient().getSupportedMethods().contains(ServerMethod.GET_TABLES)) { return clientGetTables(catalog, schemaPattern, tableNamePattern, typeList); } @@ -962,8 +969,7 @@ protected MetaColumn adapt(ColumnMetadata value) { * Implements {@link DatabaseMetaData#getColumns}. */ @Override - public MetaResultSet getColumns(String catalog, Pat schemaPattern, - Pat tableNamePattern, Pat columnNamePattern) { + public MetaResultSet getColumns(ConnectionHandle ch, String catalog, Pat schemaPattern, Pat tableNamePattern, Pat columnNamePattern) { if (connection.getConfig().isServerMetadataDisabled() || ! connection.getClient().getSupportedMethods().contains(ServerMethod.GET_COLUMNS)) { return clientGetColumns(catalog, schemaPattern, tableNamePattern, columnNamePattern); } @@ -1022,7 +1028,7 @@ private MetaResultSet clientGetSchemas(String catalog, Pat schemaPattern) { * Implements {@link DatabaseMetaData#getSchemas}. */ @Override - public MetaResultSet getSchemas(String catalog, Pat schemaPattern) { + public MetaResultSet getSchemas(ConnectionHandle ch, String catalog, Pat schemaPattern) { if (connection.getConfig().isServerMetadataDisabled() || ! connection.getClient().getSupportedMethods().contains(ServerMethod.GET_SCHEMAS)) { return clientGetSchemas(catalog, schemaPattern); } @@ -1069,7 +1075,7 @@ private MetaResultSet clientGetCatalogs() { * Implements {@link DatabaseMetaData#getCatalogs}. */ @Override - public MetaResultSet getCatalogs() { + public MetaResultSet getCatalogs(ConnectionHandle ch) { if (connection.getConfig().isServerMetadataDisabled() || ! connection.getClient().getSupportedMethods().contains(ServerMethod.GET_CATALOGS)) { return clientGetCatalogs(); } @@ -1105,8 +1111,55 @@ public ExecuteResult prepareAndExecute(StatementHandle h, String sql, long maxRo } } + @Override + public ExecuteResult prepareAndExecute(final StatementHandle handle, final String sql, final long maxRowCount, + int maxRowsInFirstFrame, final PrepareCallback callback) throws NoSuchStatementException { + return prepareAndExecute(handle, sql, maxRowCount, callback); + } + + @Override + public ExecuteBatchResult prepareAndExecuteBatch(StatementHandle statementHandle, List list) throws NoSuchStatementException { + throw new UnsupportedOperationException(this.getClass().getSimpleName()); + } + + @Override + public ExecuteBatchResult executeBatch(StatementHandle statementHandle, List> list) throws NoSuchStatementException { + throw new UnsupportedOperationException(this.getClass().getSimpleName()); + } + + @Override + public Frame fetch(StatementHandle statementHandle, long l, int i) throws NoSuchStatementException, MissingResultsException { + throw new UnsupportedOperationException(this.getClass().getSimpleName()); + } + + @Override + public ExecuteResult execute(StatementHandle statementHandle, List list, long l) throws NoSuchStatementException { + throw new UnsupportedOperationException(this.getClass().getSimpleName()); + } + + @Override + public ExecuteResult execute(StatementHandle statementHandle, List list, int i) throws NoSuchStatementException { + return null; + } + @Override public void closeStatement(StatementHandle h) { // Nothing } + + @Override + public boolean syncResults(StatementHandle statementHandle, QueryState queryState, long l) throws NoSuchStatementException { + throw new UnsupportedOperationException(this.getClass().getSimpleName()); + } + + @Override + public void commit(ConnectionHandle connectionHandle) { + throw new UnsupportedOperationException(this.getClass().getSimpleName()); + } + + @Override + public void rollback(ConnectionHandle connectionHandle) { + throw new UnsupportedOperationException(this.getClass().getSimpleName()); + } + } diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillPreparedStatementImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillPreparedStatementImpl.java index f1ba4c1acee..a45412f1c52 100644 --- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillPreparedStatementImpl.java +++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillPreparedStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -58,13 +58,9 @@ protected DrillPreparedStatementImpl(DrillConnectionImpl connection, resultSetType, resultSetConcurrency, resultSetHoldability); connection.openStatementsRegistry.addStatement(this); this.preparedStatementHandle = preparedStatementHandle; - if (preparedStatementHandle != null) { - ((DrillColumnMetaDataList) signature.columns).updateColumnMetaData(preparedStatementHandle.getColumnsList()); - } + ((DrillColumnMetaDataList) signature.columns).updateColumnMetaData(preparedStatementHandle.getColumnsList()); } - - /** * Throws AlreadyClosedSqlException iff this PreparedStatement is closed. * @@ -333,13 +329,17 @@ public void addBatch(String sql) throws SQLException { } @Override - public void clearBatch() throws SQLException { - throwIfClosed(); + public void clearBatch() throws RuntimeException { + try { + throwIfClosed(); + } catch (AlreadyClosedSqlException e) { + throw new RuntimeException(e); + } try { super.clearBatch(); } catch (UnsupportedOperationException e) { - throw new SQLFeatureNotSupportedException(e.getMessage(), e); + throw new RuntimeException(new SQLFeatureNotSupportedException(e.getMessage(), e)); } } diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillResultSetImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillResultSetImpl.java index c8b4e3d5516..f4fc588c6ff 100644 --- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillResultSetImpl.java +++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillResultSetImpl.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -48,6 +48,7 @@ import org.apache.calcite.avatica.AvaticaStatement; import org.apache.calcite.avatica.ColumnMetaData; import org.apache.calcite.avatica.Meta; +import org.apache.calcite.avatica.QueryState; import org.apache.calcite.avatica.util.Cursor; import org.apache.calcite.avatica.util.Cursor.Accessor; import org.apache.drill.jdbc.AlreadyClosedSqlException; @@ -66,10 +67,10 @@ class DrillResultSetImpl extends AvaticaResultSet implements DrillResultSet { private final DrillConnectionImpl connection; private volatile boolean hasPendingCancelationNotification = false; - DrillResultSetImpl(AvaticaStatement statement, Meta.Signature signature, + DrillResultSetImpl(AvaticaStatement statement, QueryState state, Meta.Signature signature, ResultSetMetaData resultSetMetaData, TimeZone timeZone, Meta.Frame firstFrame) { - super(statement, signature, resultSetMetaData, timeZone, firstFrame); + super(statement, state, signature, resultSetMetaData, timeZone, firstFrame); connection = (DrillConnectionImpl) statement.getConnection(); } diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java index ed95162258f..ac848441c2d 100644 --- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java +++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java @@ -128,7 +128,7 @@ public class DatabaseMetaDataGetColumnsTest extends JdbcTestBase { private static ResultSet mdrReqCHAR_5; // No NCHAR, etc., in Drill (?). private static ResultSet mdrOptVARBINARY_16; - private static ResultSet mdrOptBINARY_1048576; + private static ResultSet mdrOptBINARY_65536; private static ResultSet mdrReqDATE; private static ResultSet mdrReqTIME; @@ -256,7 +256,7 @@ protected static void setUpMetadataToCheck() throws Exception { + "\n CAST( NULL AS VARCHAR ) AS mdrOptVARCHAR, " + "\n CAST( '55' AS CHAR(5) ) AS mdrReqCHAR_5, " + "\n CAST( NULL AS VARBINARY(16) ) AS mdrOptVARBINARY_16, " - + "\n CAST( NULL AS VARBINARY(1048576) ) AS mdrOptBINARY_1048576, " + + "\n CAST( NULL AS VARBINARY(65536) ) AS mdrOptBINARY_65536, " + "\n CAST( NULL AS BINARY(8) ) AS mdrOptBINARY_8, " + "\n " + "\n DATE '2015-01-01' AS mdrReqDATE, " @@ -307,7 +307,7 @@ protected static void setUpMetadataToCheck() throws Exception { mdrOptVARCHAR = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrOptVARCHAR" ); mdrReqCHAR_5 = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrReqCHAR_5" ); mdrOptVARBINARY_16 = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrOptVARBINARY_16" ); - mdrOptBINARY_1048576 = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrOptBINARY_1048576" ); + mdrOptBINARY_65536 = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrOptBINARY_65536" ); mdrReqDATE = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrReqDATE" ); mdrReqTIME = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrReqTIME" ); @@ -671,7 +671,7 @@ public void test_DATA_TYPE_hasRightValue_mdrOptVARBINARY_16() throws SQLExceptio @Test public void test_DATA_TYPE_hasRightValue_mdrOptBINARY_1048576CHECK() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "DATA_TYPE" ), equalTo( Types.VARBINARY ) ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "DATA_TYPE" ), equalTo( Types.VARBINARY ) ); } @Test @@ -849,7 +849,7 @@ public void test_TYPE_NAME_hasRightValue_mdrOptVARBINARY_16() throws SQLExceptio @Test public void test_TYPE_NAME_hasRightValue_mdrOptBINARY_1048576CHECK() throws SQLException { - assertThat( mdrOptBINARY_1048576.getString( "TYPE_NAME" ), + assertThat( mdrOptBINARY_65536.getString( "TYPE_NAME" ), equalTo( "BINARY VARYING" ) ); } @@ -1039,7 +1039,7 @@ public void test_COLUMN_SIZE_hasRightValue_mdrOptVARBINARY_16() throws SQLExcept @Test public void test_COLUMN_SIZE_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "COLUMN_SIZE" ), equalTo( 1048576 ) ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "COLUMN_SIZE" ), equalTo( 65536 ) ); } @Test @@ -1109,13 +1109,16 @@ public void test_COLUMN_SIZE_hasRightValue_mdrReqINTERVAL_3D_Mi() throws SQLExce equalTo( 12 ) ); // "P123DT12H12M" } - @Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) + //Fixed with Calcite update + //@Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) @Test public void test_COLUMN_SIZE_hasRightValue_mdrReqINTERVAL_2D_S5() throws SQLException { assertThat( getIntOrNull( mdrReqINTERVAL_2D_S5, "COLUMN_SIZE" ), equalTo( 20 ) ); // "P12DT12H12M12.12345S" } + @Ignore( "Ignored after Calcite update" ) + @Test public void test_COLUMN_SIZE_hasINTERIMValue_mdrReqINTERVAL_2D_S5() throws SQLException { assertThat( "When DRILL-3244 fixed, un-ignore above method and purge this.", getIntOrNull( mdrReqINTERVAL_2D_S5, "COLUMN_SIZE" ), @@ -1134,13 +1137,15 @@ public void test_COLUMN_SIZE_hasRightValue_mdrReqINTERVAL_4H_Mi() throws SQLExce equalTo( 7 ) ); // "PT1H12M" } - @Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) + //Fixed with Calcite update + //@Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) @Test public void test_COLUMN_SIZE_hasRightValue_mdrReqINTERVAL_3H_S1() throws SQLException { assertThat( getIntOrNull( mdrReqINTERVAL_3H_S1, "COLUMN_SIZE" ), equalTo( 14 ) ); // "PT123H12M12.1S" } + @Ignore( "Ignored after Calcite update" ) @Test public void test_COLUMN_SIZE_hasINTERIMValue_mdrReqINTERVAL_3H_S1() throws SQLException { assertThat( "When DRILL-3244 fixed, un-ignore above method and purge this.", @@ -1172,13 +1177,15 @@ public void test_COLUMN_SIZE_hasRightValue_mdrReqINTERVAL_3S() throws SQLExcepti equalTo( 13 ) ); // "PT123.123456S" } - @Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) + //Fixed with Calcite update + //@Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) @Test public void test_COLUMN_SIZE_hasRightValue_mdrReqINTERVAL_3S1() throws SQLException { assertThat( getIntOrNull( mdrReqINTERVAL_3S1, "COLUMN_SIZE" ), equalTo( 8 ) ); // "PT123.1S" } + @Ignore( "Ignored after Calcite update" ) @Test public void test_COLUMN_SIZE_hasINTERIMValue_mdrReqINTERVAL_3S1() throws SQLException { assertThat( "When DRILL-3244 fixed, un-ignore above method and purge this.", @@ -1342,7 +1349,7 @@ public void test_DECIMAL_DIGITS_hasRightValue_mdrOptVARBINARY_16() throws SQLExc @Test public void test_DECIMAL_DIGITS_hasRightValue_mdrOptBINARY_1048576CHECK() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "DECIMAL_DIGITS" ), nullValue() ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "DECIMAL_DIGITS" ), nullValue() ); } @Test @@ -1420,12 +1427,14 @@ public void test_DECIMAL_DIGITS_hasRightValue_mdrReqINTERVAL_3D_Mi() throws SQLE assertThat( getIntOrNull( mdrReqINTERVAL_3D_Mi, "DECIMAL_DIGITS" ), equalTo( 6 ) ); } - @Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) + //Fixed with Calcite update + //@Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) @Test public void test_DECIMAL_DIGITS_hasRightValue_mdrReqINTERVAL_2D_S5() throws SQLException { assertThat( getIntOrNull( mdrReqINTERVAL_2D_S5, "DECIMAL_DIGITS" ), equalTo( 5 ) ); } + @Ignore( "Ignored after Calcite update" ) @Test public void test_DECIMAL_DIGITS_hasINTERIMValue_mdrReqINTERVAL_2D_S5() throws SQLException { assertThat( "When DRILL-3244 fixed, un-ignore above method and purge this.", @@ -1450,12 +1459,14 @@ public void test_DECIMAL_DIGITS_hasRightValue_mdrReqINTERVAL_1H_Mi() throws SQLE assertThat( getIntOrNull( mdrReqINTERVAL_1H_Mi, "DECIMAL_DIGITS" ), equalTo( 6 ) ); } - @Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) + //Fixed with Calcite update + //@Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) @Test public void test_DECIMAL_DIGITS_hasRightValue_mdrReqINTERVAL_3H_S1() throws SQLException { assertThat( getIntOrNull( mdrReqINTERVAL_3H_S1, "DECIMAL_DIGITS" ), equalTo( 1 ) ); } + @Ignore( "Ignored after Calcite update" ) @Test public void test_DECIMAL_DIGITS_hasINTERIMValue_mdrReqINTERVAL_3H_S1() throws SQLException { assertThat( "When DRILL-3244 fixed, un-ignore above method and purge this.", @@ -1640,7 +1651,7 @@ public void test_NUM_PREC_RADIX_hasRightValue_mdrOptVARBINARY_16() throws SQLExc @Test public void test_NUM_PREC_RADIX_hasRightValue_mdrOptBINARY_1048576CHECK() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "NUM_PREC_RADIX" ), nullValue() ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "NUM_PREC_RADIX" ), nullValue() ); } @Test @@ -1824,7 +1835,7 @@ public void test_NULLABLE_hasRightValue_mdrOptVARBINARY_16() throws SQLException @Test public void test_NULLABLE_hasRightValue_mdrOptBINARY_1048576() throws SQLException { assertThat( "ResultSetMetaData.column...Null... nullability code:", - getIntOrNull( mdrOptBINARY_1048576, "NULLABLE" ), equalTo( columnNullable ) ); + getIntOrNull(mdrOptBINARY_65536, "NULLABLE" ), equalTo( columnNullable ) ); } @Test @@ -2186,7 +2197,7 @@ public void test_CHAR_OCTET_LENGTH_hasRightValue_mdrOptVARBINARY_16() throws SQL @Test public void test_CHAR_OCTET_LENGTH_hasRightValue_mdrOptBINARY_1048576CHECK() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "CHAR_OCTET_LENGTH" ), nullValue() ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "CHAR_OCTET_LENGTH" ), nullValue() ); } @Test @@ -2443,7 +2454,7 @@ public void test_IS_NULLABLE_hasRightValue_mdrOptVARBINARY_16() throws SQLExcept @Test public void test_IS_NULLABLE_hasRightValue_mdrOptBINARY_1048576CHECK() throws SQLException { - assertThat( mdrOptBINARY_1048576.getString( "IS_NULLABLE" ), equalTo( "YES" ) ); + assertThat( mdrOptBINARY_65536.getString( "IS_NULLABLE" ), equalTo( "YES" ) ); } @Test diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestInformationSchemaColumns.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestInformationSchemaColumns.java index 7e0934c07bb..214b7caf9c2 100644 --- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestInformationSchemaColumns.java +++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestInformationSchemaColumns.java @@ -99,7 +99,7 @@ public class TestInformationSchemaColumns extends JdbcTestBase { private static ResultSet mdrReqCHAR_5; // No NCHAR, etc., in Drill (?). private static ResultSet mdrOptVARBINARY_16; - private static ResultSet mdrOptBINARY_1048576; + private static ResultSet mdrOptBINARY_65536; private static ResultSet mdrReqDATE; private static ResultSet mdrReqTIME; @@ -236,7 +236,7 @@ public static void setUpConnectionAndMetadataToCheck() throws Exception { + "\n CAST( NULL AS VARCHAR ) AS mdrOptVARCHAR, " + "\n CAST( '55' AS CHAR(5) ) AS mdrReqCHAR_5, " + "\n CAST( NULL AS VARBINARY(16) ) AS mdrOptVARBINARY_16, " - + "\n CAST( NULL AS VARBINARY(1048576) ) AS mdrOptBINARY_1048576, " + + "\n CAST( NULL AS VARBINARY(65536) ) AS mdrOptBINARY_65536, " + "\n CAST( NULL AS BINARY(8) ) AS mdrOptBINARY_8, " + "\n " + "\n DATE '2015-01-01' AS mdrReqDATE, " @@ -287,7 +287,7 @@ public static void setUpConnectionAndMetadataToCheck() throws Exception { mdrOptVARCHAR = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrOptVARCHAR" ); mdrReqCHAR_5 = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrReqCHAR_5" ); mdrOptVARBINARY_16 = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrOptVARBINARY_16" ); - mdrOptBINARY_1048576 = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrOptBINARY_1048576" ); + mdrOptBINARY_65536 = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrOptBINARY_65536" ); mdrReqDATE = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrReqDATE" ); mdrReqTIME = setUpRow( DFS_TMP_SCHEMA, VIEW_NAME, "mdrReqTIME" ); @@ -829,7 +829,7 @@ public void test_IS_NULLABLE_hasRightValue_mdrOptVARBINARY_16() throws SQLExcept @Test public void test_IS_NULLABLE_hasRightValue_mdrOptBINARY_1048576() throws SQLException { assertThat( "ResultSetMetaData.column...Null... nullability code:", - mdrOptBINARY_1048576.getString( "IS_NULLABLE" ), equalTo( "YES" ) ); + mdrOptBINARY_65536.getString( "IS_NULLABLE" ), equalTo( "YES" ) ); } @Test @@ -1006,8 +1006,8 @@ public void test_DATA_TYPE_hasRightValue_mdrOptVARBINARY_16() throws SQLExceptio @Ignore( "TODO(DRILL-3368): unignore when BINARY is implemented enough" ) @Test public void test_DATA_TYPE_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( mdrOptBINARY_1048576.getString( "DATA_TYPE" ), equalTo( "BINARY VARYING" ) ); // ?? current - assertThat( mdrOptBINARY_1048576.getString( "DATA_TYPE" ), equalTo( "BINARY" ) ); // ?? should be + assertThat( mdrOptBINARY_65536.getString( "DATA_TYPE" ), equalTo( "BINARY VARYING" ) ); // ?? current + assertThat( mdrOptBINARY_65536.getString( "DATA_TYPE" ), equalTo( "BINARY" ) ); // ?? should be } @Test @@ -1172,7 +1172,7 @@ public void test_CHARACTER_MAXIMUM_LENGTH_hasRightValue_mdrOptVARBINARY_16() thr @Test public void test_CHARACTER_MAXIMUM_LENGTH_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "CHARACTER_MAXIMUM_LENGTH" ), equalTo( 1048576 ) ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "CHARACTER_MAXIMUM_LENGTH" ), equalTo( 65536 ) ); } @Test @@ -1339,7 +1339,7 @@ public void test_CHARACTER_OCTET_LENGTH_hasRightValue_mdrOptVARBINARY_16() throw @Test public void test_CHARACTER_OCTET_LENGTH_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "CHARACTER_OCTET_LENGTH" ), equalTo( 1048576 )); + assertThat( getIntOrNull(mdrOptBINARY_65536, "CHARACTER_OCTET_LENGTH" ), equalTo( 65536 )); } @Test @@ -1499,7 +1499,7 @@ public void test_NUMERIC_PRECISION_hasRightValue_mdrOptVARBINARY_16() throws SQL @Test public void test_NUMERIC_PRECISION_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "NUMERIC_PRECISION" ), nullValue() ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "NUMERIC_PRECISION" ), nullValue() ); } @Test @@ -1659,7 +1659,7 @@ public void test_NUMERIC_PRECISION_RADIX_hasRightValue_mdrOptVARBINARY_16() thro @Test public void test_NUMERIC_PRECISION_RADIX_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "NUMERIC_PRECISION_RADIX" ), nullValue() ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "NUMERIC_PRECISION_RADIX" ), nullValue() ); } @Test @@ -1819,7 +1819,7 @@ public void test_NUMERIC_SCALE_hasRightValue_mdrOptVARBINARY_16() throws SQLExce @Test public void test_NUMERIC_SCALE_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "NUMERIC_SCALE" ), nullValue() ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "NUMERIC_SCALE" ), nullValue() ); } @Test @@ -1979,7 +1979,7 @@ public void test_DATETIME_PRECISION_hasRightValue_mdrOptVARBINARY_16() throws SQ @Test public void test_DATETIME_PRECISION_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "DATETIME_PRECISION" ), nullValue() ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "DATETIME_PRECISION" ), nullValue() ); } @Test @@ -2050,12 +2050,14 @@ public void test_DATETIME_PRECISION_hasRightValue_mdrReqINTERVAL_3D_Mi() throws assertThat( getIntOrNull( mdrReqINTERVAL_3D_Mi, "DATETIME_PRECISION" ), equalTo( 6 ) ); } - @Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) + //Fixed with Calcite update + //@Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) @Test public void test_DATETIME_PRECISION_hasRightValue_mdrReqINTERVAL_2D_S5() throws SQLException { assertThat( getIntOrNull( mdrReqINTERVAL_2D_S5, "DATETIME_PRECISION" ), equalTo( 5 ) ); } + @Ignore( "Ignored after Calcite update" ) @Test public void test_DATETIME_PRECISION_hasINTERIMValue_mdrReqINTERVAL_2D_S5() throws SQLException { assertThat( "When DRILL-3244 fixed, un-ignore above method and purge this.", @@ -2080,12 +2082,14 @@ public void test_DATETIME_PRECISION_hasRightValue_mdrReqINTERVAL_1H_Mi() throws assertThat( getIntOrNull( mdrReqINTERVAL_1H_Mi, "DATETIME_PRECISION" ), equalTo( 6 ) ); } - @Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) + //Fixed with Calcite update + //@Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) @Test public void test_DATETIME_PRECISION_hasRightValue_mdrReqINTERVAL_H_S3() throws SQLException { assertThat( getIntOrNull( mdrReqINTERVAL_3H_S1, "DATETIME_PRECISION" ), equalTo( 1 ) ); } + @Ignore( "Ignored after Calcite update" ) @Test public void test_DATETIME_PRECISION_hasINTERIMValue_mdrReqINTERVAL_H_S3() throws SQLException { assertThat( "When DRILL-3244 fixed, un-ignore above method and purge this.", @@ -2119,12 +2123,14 @@ public void test_DATETIME_PRECISION_hasRightValue_mdrReqINTERVAL_3S() throws SQL assertThat( getIntOrNull( mdrReqINTERVAL_3S, "DATETIME_PRECISION" ), equalTo( 6 ) ); } - @Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) + //Fixed with Calcite update + //@Ignore( "TODO(DRILL-3244): unignore when fractional secs. prec. is right" ) @Test public void test_DATETIME_PRECISION_hasRightValue_mdrReqINTERVAL_3S1() throws SQLException { assertThat( getIntOrNull( mdrReqINTERVAL_3S1, "DATETIME_PRECISION" ), equalTo( 1 ) ); } + @Ignore( "Ignored after Calcite update" ) @Test public void test_DATETIME_PRECISION_hasINTERIMValue_mdrReqINTERVAL_3S1() throws SQLException { assertThat( "When DRILL-3244 fixed, un-ignore above method and purge this.", @@ -2258,7 +2264,7 @@ public void test_INTERVAL_TYPE_hasRightValue_mdrOptVARBINARY_16() throws SQLExce @Test public void test_INTERVAL_TYPE_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( mdrOptBINARY_1048576.getString( "INTERVAL_TYPE" ), nullValue() ); + assertThat( mdrOptBINARY_65536.getString( "INTERVAL_TYPE" ), nullValue() ); } @Test @@ -2491,7 +2497,7 @@ public void test_INTERVAL_PRECISION_hasRightValue_mdrOptVARBINARY_16() throws SQ @Test public void test_INTERVAL_PRECISION_hasRightValue_mdrOptBINARY_1048576() throws SQLException { - assertThat( getIntOrNull( mdrOptBINARY_1048576, "INTERVAL_PRECISION" ), nullValue() ); + assertThat( getIntOrNull(mdrOptBINARY_65536, "INTERVAL_PRECISION" ), nullValue() ); } @Test diff --git a/pom.xml b/pom.xml index 6189cf2f7f8..ce64591eb17 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,8 @@ 18.0 2 1.8.1-drill-r0 - 1.4.0-drill-r23 + 1.13.0-drill-r0 + 1.10.0 2.7.6 1.1.9-drill-r7 2.7.9 @@ -57,7 +58,7 @@ 1.2.1 2.7.1 1.1.3 - 0.9.15 + 1.0 2.3.26-incubating 3.16.1-GA 0.6.6 @@ -716,6 +717,25 @@ + + org.apache.calcite.avatica + avatica + ${avatica.version} + + + org.apache.calcite.avatica + avatica-core + + + commons-logging + commons-logging + + + protobuf-java + com.google.protobuf + + + org.msgpack msgpack @@ -1722,6 +1742,10 @@ calcite-core ${calcite.version} + + org.apache.calcite.avatica + avatica-core + org.jgrapht jgrapht-jdk1.5 diff --git a/tools/fmpp/pom.xml b/tools/fmpp/pom.xml index 91e686c3602..4f4b7e9b146 100644 --- a/tools/fmpp/pom.xml +++ b/tools/fmpp/pom.xml @@ -45,9 +45,19 @@ 3.3.3 - net.sourceforge.fmpp - fmpp + com.googlecode.fmpp-maven-plugin + fmpp-maven-plugin ${fmpp.version} + + + log4j + log4j + + + commons-logging-api + commons-logging + + org.freemarker