cloud-fan commented on a change in pull request #35404:
URL: https://github.com/apache/spark/pull/35404#discussion_r804381525



##########
File path: sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
##########
@@ -4281,6 +4281,54 @@ class SQLQuerySuite extends QueryTest with 
SharedSparkSession with AdaptiveSpark
         Row(2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22) :: Nil)
     }
   }
+
+  test("SPARK-38118: Func(wrong_type) in the HAVING clause should throw data 
mismatch error") {
+    val e1 = intercept[AnalysisException](
+      sql(
+        """
+          |WITH t as (SELECT true c)
+          |SELECT t.c
+          |FROM t
+          |GROUP BY t.c
+          |HAVING mean(t.c) > 0d""".stripMargin))
+    assert(e1.message.contains("cannot resolve 'mean(t.c)' due to data type " +
+      "mismatch: function average requires numeric or interval types, not 
boolean"))
+
+    val e2 = intercept[AnalysisException](
+      sql(
+        """
+          |WITH t as (SELECT true c, false d)
+          |SELECT (t.c AND t.d) c
+          |FROM t
+          |GROUP BY t.c
+          |HAVING mean(c) > 0d""".stripMargin))
+    assert(e2.message.contains("cannot resolve 'mean(t.c)' due to data type 
mismatch: function " +
+      "average requires numeric or interval types, not boolean"))
+
+    val e3 = intercept[AnalysisException](
+      sql(
+        """
+          |WITH t as (SELECT true c, false d)
+          |SELECT (t.c AND t.d) c
+          |FROM t
+          |GROUP BY t.c
+          |HAVING abs(c) > 0d""".stripMargin))
+    assert(e3.message.contains("cannot resolve 'abs(t.c)' due to data type " +
+      "mismatch: argument 1 requires (numeric or interval day to second or 
interval year to " +
+      "month) type, however, 't.c' is of boolean type."))
+
+    val e4 = intercept[AnalysisException](
+      sql(
+        """
+          |WITH t as (SELECT true c)
+          |SELECT t.c
+          |FROM t
+          |GROUP BY t.c
+          |HAVING abs(t.c) > 0d""".stripMargin))

Review comment:
       seems the only difference between this test and the first one is we 
replace `mean` with `abs`. How about
   ```
   Seq("mean", "abs").foreach {  func =>
     val e1 = intercept...
       ...
       |HAVING $func(t.c) ...
       ...
   
     val e2 = ...
   }
   ```




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to