From 56a02eaaa63f297d3dbaf0ca183e4248d4882834 Mon Sep 17 00:00:00 2001 From: Yuming Wang Date: Wed, 14 Nov 2018 10:55:25 +0800 Subject: [PATCH] Enhance LikeSimplification --- .../sql/catalyst/optimizer/expressions.scala | 13 +++++++++++ .../optimizer/LikeSimplificationSuite.scala | 23 +++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/expressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/expressions.scala index 2b29b49d00ab9..da705046c8c42 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/expressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/expressions.scala @@ -504,6 +504,19 @@ object LikeSimplification extends Rule[LogicalPlan] { Like(input, Literal.create(pattern, StringType)) } } + + case Like(Literal(pattern, StringType), input) => + if (pattern == null) { + // If pattern is null, return null value directly, since "null like col" == null. + Literal(null, BooleanType) + } else { + pattern.toString match { + case equalTo(str) => + EqualTo(Literal(str), input) + case _ => + Like(Literal.create(pattern, StringType), input) + } + } } } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/LikeSimplificationSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/LikeSimplificationSuite.scala index f64d10357ce2f..763b0c6ea2497 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/LikeSimplificationSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/LikeSimplificationSuite.scala @@ -88,7 +88,7 @@ class LikeSimplificationSuite extends PlanTest { comparePlans(optimized, correctAnswer) } - test("simplify Like into EqualTo") { + test("simplify Like into EqualTo (Like(input, literal) case)") { val originalQuery = testRelation .where(('a like "") || ('a like "abc")) @@ -101,9 +101,28 @@ class LikeSimplificationSuite extends PlanTest { comparePlans(optimized, correctAnswer) } - test("null pattern") { + test("simplify Like into EqualTo (Like(literal, input) case)") { + val originalQuery = + testRelation + .where(("" like 'a) || ("abc" like 'a)) + + val optimized = Optimize.execute(originalQuery.analyze) + val correctAnswer = testRelation + .where(("" === 'a) || ("abc" === 'a)) + .analyze + + comparePlans(optimized, correctAnswer) + } + + test("null pattern (Like(input, literal) case)") { val originalQuery = testRelation.where('a like Literal(null, StringType)).analyze val optimized = Optimize.execute(originalQuery) comparePlans(optimized, testRelation.where(Literal(null, BooleanType)).analyze) } + + test("null pattern (Like(literal, input) case)") { + val originalQuery = testRelation.where(Literal(null, StringType) like 'a).analyze + val optimized = Optimize.execute(originalQuery) + comparePlans(optimized, testRelation.where(Literal(null, BooleanType)).analyze) + } }