diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java index a5dcffb..73a67a8 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java @@ -106,6 +106,26 @@ private static RexNode simplifyNot(RexBuilder rexBuilder, RexCall call) { return simplify(rexBuilder, rexBuilder.makeCall(op(negateKind2), ((RexCall) a).getOperands())); } + if (a.getKind() == SqlKind.AND) { + // NOT distributivity for AND + final List newOperands = new ArrayList<>(); + for (RexNode operand : ((RexCall) a).getOperands()) { + newOperands.add(simplify(rexBuilder, + rexBuilder.makeCall(SqlStdOperatorTable.NOT, operand))); + } + return simplify(rexBuilder, + rexBuilder.makeCall(SqlStdOperatorTable.OR, newOperands)); + } + if (a.getKind() == SqlKind.OR) { + // NOT distributivity for OR + final List newOperands = new ArrayList<>(); + for (RexNode operand : ((RexCall) a).getOperands()) { + newOperands.add(simplify(rexBuilder, + rexBuilder.makeCall(SqlStdOperatorTable.NOT, operand))); + } + return simplify(rexBuilder, + rexBuilder.makeCall(SqlStdOperatorTable.AND, newOperands)); + } return call; } diff --git ql/src/test/results/clientpositive/folder_predicate.q.out ql/src/test/results/clientpositive/folder_predicate.q.out index 48a4889..7fcc172 100644 --- ql/src/test/results/clientpositive/folder_predicate.q.out +++ ql/src/test/results/clientpositive/folder_predicate.q.out @@ -37,15 +37,15 @@ STAGE PLANS: alias: predicate_fold_tb Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (not (value is not null and (value = 3))) (type: boolean) - Statistics: Num rows: 3 Data size: 3 Basic stats: COMPLETE Column stats: NONE + predicate: (value is null or (value <> 3)) (type: boolean) + Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: value (type: int) outputColumnNames: _col0 - Statistics: Num rows: 3 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 3 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat @@ -88,15 +88,15 @@ STAGE PLANS: alias: predicate_fold_tb Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (not (value is not null and (value >= 3))) (type: boolean) - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + predicate: (value is null or (value < 3)) (type: boolean) + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: value (type: int) outputColumnNames: _col0 - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat @@ -137,15 +137,15 @@ STAGE PLANS: alias: predicate_fold_tb Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (not (value is not null and (value <= 3))) (type: boolean) - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + predicate: (value is null or (value > 3)) (type: boolean) + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: value (type: int) outputColumnNames: _col0 - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat @@ -186,15 +186,15 @@ STAGE PLANS: alias: predicate_fold_tb Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (not (value is not null and (value > 3))) (type: boolean) - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + predicate: (value is null or (value <= 3)) (type: boolean) + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: value (type: int) outputColumnNames: _col0 - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat @@ -236,15 +236,15 @@ STAGE PLANS: alias: predicate_fold_tb Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (not (value is not null and (value < 3))) (type: boolean) - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + predicate: (value is null or (value >= 3)) (type: boolean) + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: value (type: int) outputColumnNames: _col0 - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 4 Data size: 4 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 5 Data size: 5 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat @@ -286,15 +286,15 @@ STAGE PLANS: alias: predicate_fold_tb Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (not (value is not null and (value <> 3))) (type: boolean) - Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: NONE + predicate: (value is null or (value = 3)) (type: boolean) + Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: value (type: int) outputColumnNames: _col0 - Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat @@ -334,7 +334,7 @@ STAGE PLANS: alias: predicate_fold_tb Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (not (value is not null and (value > 1) and (value <= 3))) (type: boolean) + predicate: (value is null or (value <= 1) or (value > 3)) (type: boolean) Statistics: Num rows: 6 Data size: 7 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: value (type: int)