diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java index 68f1153..b75f78c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/TaskCompiler.java @@ -132,6 +132,13 @@ public void compile(final ParseContext pCtx, final List " + fetchLimit + ". Doesn't qualify limit optimiztion."); globalLimitCtx.disableOpt(); + + } + if (qb.getParseInfo().getOuterQueryLimit() == 0) { + // Believe it or not, some tools do generate queries with limit 0 and than expect + // query to run quickly. Lets meet their requirement. + LOG.info("Limit 0. No query execution needed."); + return; } } else if (!isCStats) { for (LoadTableDesc ltd : loadTableWork) { diff --git ql/src/test/queries/clientpositive/limit0.q ql/src/test/queries/clientpositive/limit0.q new file mode 100644 index 0000000..b4f48a3 --- /dev/null +++ ql/src/test/queries/clientpositive/limit0.q @@ -0,0 +1,7 @@ +explain select * from src where key = '238' limit 0; +explain select src.key, count(src.value) from src group by src.key limit 0; +explain select * from ( select key from src limit 3) sq1 limit 0; + +select * from src where key = '238' limit 0; +select src.key, count(src.value) from src group by src.key limit 0; +select * from ( select key from src limit 3) sq1 limit 0; diff --git ql/src/test/results/clientpositive/limit0.q.out ql/src/test/results/clientpositive/limit0.q.out new file mode 100644 index 0000000..d047374 --- /dev/null +++ ql/src/test/results/clientpositive/limit0.q.out @@ -0,0 +1,60 @@ +PREHOOK: query: explain select * from src where key = '238' limit 0 +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from src where key = '238' limit 0 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: 0 + Processor Tree: + ListSink + +PREHOOK: query: explain select src.key, count(src.value) from src group by src.key limit 0 +PREHOOK: type: QUERY +POSTHOOK: query: explain select src.key, count(src.value) from src group by src.key limit 0 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: 0 + Processor Tree: + ListSink + +PREHOOK: query: explain select * from ( select key from src limit 3) sq1 limit 0 +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from ( select key from src limit 3) sq1 limit 0 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: 0 + Processor Tree: + ListSink + +PREHOOK: query: select * from src where key = '238' limit 0 +PREHOOK: type: QUERY +#### A masked pattern was here #### +POSTHOOK: query: select * from src where key = '238' limit 0 +POSTHOOK: type: QUERY +#### A masked pattern was here #### +PREHOOK: query: select src.key, count(src.value) from src group by src.key limit 0 +PREHOOK: type: QUERY +#### A masked pattern was here #### +POSTHOOK: query: select src.key, count(src.value) from src group by src.key limit 0 +POSTHOOK: type: QUERY +#### A masked pattern was here #### +PREHOOK: query: select * from ( select key from src limit 3) sq1 limit 0 +PREHOOK: type: QUERY +#### A masked pattern was here #### +POSTHOOK: query: select * from ( select key from src limit 3) sq1 limit 0 +POSTHOOK: type: QUERY +#### A masked pattern was here #### diff --git ql/src/test/results/clientpositive/limit_pushdown.q.out ql/src/test/results/clientpositive/limit_pushdown.q.out index 4a11e00..01571d0 100644 --- ql/src/test/results/clientpositive/limit_pushdown.q.out +++ ql/src/test/results/clientpositive/limit_pushdown.q.out @@ -616,41 +616,9 @@ explain select key,value from src order by key limit 0 POSTHOOK: type: QUERY STAGE DEPENDENCIES: - Stage-1 is a root stage - Stage-0 depends on stages: Stage-1 + Stage-0 is a root stage STAGE PLANS: - Stage: Stage-1 - Map Reduce - Map Operator Tree: - TableScan - alias: src - Statistics: Num rows: 29 Data size: 5812 Basic stats: COMPLETE Column stats: NONE - Select Operator - expressions: key (type: string), value (type: string) - outputColumnNames: _col0, _col1 - Statistics: Num rows: 29 Data size: 5812 Basic stats: COMPLETE Column stats: NONE - Reduce Output Operator - key expressions: _col0 (type: string) - sort order: + - Statistics: Num rows: 29 Data size: 5812 Basic stats: COMPLETE Column stats: NONE - value expressions: _col1 (type: string) - Reduce Operator Tree: - Select Operator - expressions: KEY.reducesinkkey0 (type: string), VALUE._col0 (type: string) - outputColumnNames: _col0, _col1 - Statistics: Num rows: 29 Data size: 5812 Basic stats: COMPLETE Column stats: NONE - Limit - Number of rows: 0 - Statistics: Num rows: 0 Data size: 0 Basic stats: NONE Column stats: NONE - File Output Operator - compressed: false - Statistics: Num rows: 0 Data size: 0 Basic stats: NONE Column stats: NONE - table: - input format: org.apache.hadoop.mapred.TextInputFormat - output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat - serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe - Stage: Stage-0 Fetch Operator limit: 0 @@ -659,11 +627,9 @@ STAGE PLANS: PREHOOK: query: select key,value from src order by key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: select key,value from src order by key limit 0 POSTHOOK: type: QUERY -POSTHOOK: Input: default@src #### A masked pattern was here #### PREHOOK: query: -- 2MR (applied to last RS) explain diff --git ql/src/test/results/clientpositive/query_properties.q.out ql/src/test/results/clientpositive/query_properties.q.out index 5684f0d..47f8d8c 100644 --- ql/src/test/results/clientpositive/query_properties.q.out +++ ql/src/test/results/clientpositive/query_properties.q.out @@ -1,6 +1,5 @@ PREHOOK: query: select * from src a join src b on a.key = b.key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: true Has Group By: false @@ -12,7 +11,6 @@ Has Distribute By: false Has Cluster By: false PREHOOK: query: select * from src group by src.key, src.value limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: false Has Group By: true @@ -24,7 +22,6 @@ Has Distribute By: false Has Cluster By: false PREHOOK: query: select * from src order by src.key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: false Has Group By: false @@ -36,7 +33,6 @@ Has Distribute By: false Has Cluster By: false PREHOOK: query: select * from src sort by src.key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: false Has Group By: false @@ -48,7 +44,6 @@ Has Distribute By: false Has Cluster By: false PREHOOK: query: select a.key, sum(b.value) from src a join src b on a.key = b.key group by a.key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: true Has Group By: true @@ -60,7 +55,6 @@ Has Distribute By: false Has Cluster By: false PREHOOK: query: select transform(*) using 'cat' from src limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: false Has Group By: false @@ -72,7 +66,6 @@ Has Distribute By: false Has Cluster By: false PREHOOK: query: select * from src distribute by src.key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: false Has Group By: false @@ -84,7 +77,6 @@ Has Distribute By: true Has Cluster By: false PREHOOK: query: select * from src cluster by src.key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: false Has Group By: false @@ -96,7 +88,6 @@ Has Distribute By: false Has Cluster By: true PREHOOK: query: select key, sum(value) from (select a.key as key, b.value as value from src a join src b on a.key = b.key) c group by key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: true Has Group By: true @@ -108,7 +99,6 @@ Has Distribute By: false Has Cluster By: false PREHOOK: query: select * from src a join src b on a.key = b.key order by a.key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: true Has Group By: false @@ -120,7 +110,6 @@ Has Distribute By: false Has Cluster By: false PREHOOK: query: select * from src a join src b on a.key = b.key distribute by a.key sort by a.key, b.value limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### Has Join: true Has Group By: false diff --git ql/src/test/results/clientpositive/tez/limit_pushdown.q.out ql/src/test/results/clientpositive/tez/limit_pushdown.q.out index 055b17f..d6406d2 100644 --- ql/src/test/results/clientpositive/tez/limit_pushdown.q.out +++ ql/src/test/results/clientpositive/tez/limit_pushdown.q.out @@ -658,47 +658,9 @@ explain select key,value from src order by key limit 0 POSTHOOK: type: QUERY STAGE DEPENDENCIES: - Stage-1 is a root stage - Stage-0 depends on stages: Stage-1 + Stage-0 is a root stage STAGE PLANS: - Stage: Stage-1 - Tez - Edges: - Reducer 2 <- Map 1 (SIMPLE_EDGE) -#### A masked pattern was here #### - Vertices: - Map 1 - Map Operator Tree: - TableScan - alias: src - Statistics: Num rows: 29 Data size: 5812 Basic stats: COMPLETE Column stats: NONE - Select Operator - expressions: key (type: string), value (type: string) - outputColumnNames: _col0, _col1 - Statistics: Num rows: 29 Data size: 5812 Basic stats: COMPLETE Column stats: NONE - Reduce Output Operator - key expressions: _col0 (type: string) - sort order: + - Statistics: Num rows: 29 Data size: 5812 Basic stats: COMPLETE Column stats: NONE - value expressions: _col1 (type: string) - Reducer 2 - Reduce Operator Tree: - Select Operator - expressions: KEY.reducesinkkey0 (type: string), VALUE._col0 (type: string) - outputColumnNames: _col0, _col1 - Statistics: Num rows: 29 Data size: 5812 Basic stats: COMPLETE Column stats: NONE - Limit - Number of rows: 0 - Statistics: Num rows: 0 Data size: 0 Basic stats: NONE Column stats: NONE - File Output Operator - compressed: false - Statistics: Num rows: 0 Data size: 0 Basic stats: NONE Column stats: NONE - table: - input format: org.apache.hadoop.mapred.TextInputFormat - output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat - serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe - Stage: Stage-0 Fetch Operator limit: 0 @@ -707,11 +669,9 @@ STAGE PLANS: PREHOOK: query: select key,value from src order by key limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: select key,value from src order by key limit 0 POSTHOOK: type: QUERY -POSTHOOK: Input: default@src #### A masked pattern was here #### PREHOOK: query: -- 2MR (applied to last RS) explain diff --git ql/src/test/results/clientpositive/vectorization_limit.q.out ql/src/test/results/clientpositive/vectorization_limit.q.out index 9bc95ac..cef59ba 100644 --- ql/src/test/results/clientpositive/vectorization_limit.q.out +++ ql/src/test/results/clientpositive/vectorization_limit.q.out @@ -422,42 +422,9 @@ explain select ctinyint,cdouble from alltypesorc order by ctinyint limit 0 POSTHOOK: type: QUERY STAGE DEPENDENCIES: - Stage-1 is a root stage - Stage-0 depends on stages: Stage-1 + Stage-0 is a root stage STAGE PLANS: - Stage: Stage-1 - Map Reduce - Map Operator Tree: - TableScan - alias: alltypesorc - Statistics: Num rows: 31436 Data size: 377237 Basic stats: COMPLETE Column stats: NONE - Select Operator - expressions: ctinyint (type: tinyint), cdouble (type: double) - outputColumnNames: _col0, _col1 - Statistics: Num rows: 31436 Data size: 377237 Basic stats: COMPLETE Column stats: NONE - Reduce Output Operator - key expressions: _col0 (type: tinyint) - sort order: + - Statistics: Num rows: 31436 Data size: 377237 Basic stats: COMPLETE Column stats: NONE - value expressions: _col1 (type: double) - Execution mode: vectorized - Reduce Operator Tree: - Select Operator - expressions: KEY.reducesinkkey0 (type: tinyint), VALUE._col0 (type: double) - outputColumnNames: _col0, _col1 - Statistics: Num rows: 31436 Data size: 377237 Basic stats: COMPLETE Column stats: NONE - Limit - Number of rows: 0 - Statistics: Num rows: 0 Data size: 0 Basic stats: NONE Column stats: NONE - File Output Operator - compressed: false - Statistics: Num rows: 0 Data size: 0 Basic stats: NONE Column stats: NONE - table: - input format: org.apache.hadoop.mapred.TextInputFormat - output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat - serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe - Stage: Stage-0 Fetch Operator limit: 0 @@ -466,11 +433,9 @@ STAGE PLANS: PREHOOK: query: select ctinyint,cdouble from alltypesorc order by ctinyint limit 0 PREHOOK: type: QUERY -PREHOOK: Input: default@alltypesorc #### A masked pattern was here #### POSTHOOK: query: select ctinyint,cdouble from alltypesorc order by ctinyint limit 0 POSTHOOK: type: QUERY -POSTHOOK: Input: default@alltypesorc #### A masked pattern was here #### PREHOOK: query: -- 2MR (applied to last RS) explain