[ https://issues.apache.org/jira/browse/DRILL-3623?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15014506#comment-15014506 ]
ASF GitHub Bot commented on DRILL-3623: --------------------------------------- Github user sudheeshkatkam commented on a diff in the pull request: https://github.com/apache/drill/pull/193#discussion_r45408655 --- Diff: exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/FindLimit0Visitor.java --- @@ -36,16 +48,62 @@ * executing a schema-only query. */ public class FindLimit0Visitor extends RelShuttleImpl { - private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(FindLimit0Visitor.class); +// private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(FindLimit0Visitor.class); + + /** + * Values in the {@link DrillConstExecutor#DRILL_TO_CALCITE_TYPE_MAPPING} map. + * + without {@link SqlTypeName#ANY} (avoid late binding) + * + without {@link SqlTypeName#VARBINARY} ({@link DrillValuesRel values} does not support this) + * + with {@link SqlTypeName#CHAR} ({@link DrillValuesRel values} supports this, but the above mapping does not + * contain this type. + */ + private static final ImmutableSet<SqlTypeName> TYPES = ImmutableSet.<SqlTypeName>builder() + .add(SqlTypeName.INTEGER, SqlTypeName.BIGINT, SqlTypeName.FLOAT, SqlTypeName.DOUBLE, SqlTypeName.VARCHAR, + SqlTypeName.BOOLEAN, SqlTypeName.DATE, SqlTypeName.DECIMAL, SqlTypeName.TIME, SqlTypeName.TIMESTAMP, + SqlTypeName.INTERVAL_YEAR_MONTH, SqlTypeName.INTERVAL_DAY_TIME, SqlTypeName.MAP, SqlTypeName.ARRAY, + SqlTypeName.TINYINT, SqlTypeName.SMALLINT, SqlTypeName.CHAR) + .build(); private boolean contains = false; + /** + * Checks if the root portion of the RelNode tree contains a limit 0 pattern. + */ public static boolean containsLimit0(RelNode rel) { FindLimit0Visitor visitor = new FindLimit0Visitor(); rel.accept(visitor); return visitor.isContains(); } + /** + * If all field types of the given node are {@link #TYPES recognized types}, then this method returns the tree: + * DrillLimitRel(0) + * \ + * DrillValuesRel(field types) + * Otherwise, the method returns null. + */ + public static DrillRel getValuesRelIfFullySchemaed(final RelNode rel) { + final List<RelDataTypeField> fieldList = rel.getRowType().getFieldList(); + final ImmutableList.Builder<RexLiteral> tupleBuilder = new ImmutableList.Builder<>(); + final RexBuilder literalBuilder = new RexBuilder(rel.getCluster().getTypeFactory()); + for (final RelDataTypeField field : fieldList) { + if (!TYPES.contains(field.getType().getSqlTypeName())) { + return null; + } else { + tupleBuilder.add((RexLiteral) literalBuilder.makeLiteral(null, field.getType(), false)); + } + } + + final ImmutableList<ImmutableList<RexLiteral>> tuples = new ImmutableList.Builder<ImmutableList<RexLiteral>>() + .add(tupleBuilder.build()) + .build(); + final RelTraitSet traits = rel.getTraitSet().plus(DrillRel.DRILL_LOGICAL); + // TODO: ideally, we want the limit to be pushed into values + final DrillValuesRel values = new DrillValuesRel(rel.getCluster(), rel.getRowType(), tuples, traits); --- End diff -- I did this to avoid logical transformation completely, as this is an exceptional case. LogicalValues [allows an empty list of tuples](https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/rel/logical/LogicalValues.java#L101) but as Jacques pointed out Drill does not handle that well (we use data to encode types). > Hive query hangs with limit 0 clause > ------------------------------------ > > Key: DRILL-3623 > URL: https://issues.apache.org/jira/browse/DRILL-3623 > Project: Apache Drill > Issue Type: Bug > Components: Storage - Hive > Affects Versions: 1.1.0 > Environment: MapR cluster > Reporter: Andries Engelbrecht > Assignee: Sudheesh Katkam > Fix For: Future > > > Running a select * from hive.table limit 0 does not return (hangs). > Select * from hive.table limit 1 works fine > Hive table is about 6GB with 330 files with parquet using snappy compression. > Data types are int, bigint, string and double. > Querying directory with parquet files through the DFS plugin works fine > select * from dfs.root.`/user/hive/warehouse/database/table` limit 0; -- This message was sent by Atlassian JIRA (v6.3.4#6332)