Skip to content

Commit 3b18e1a

Browse files
authored
chore: show line of error sql (#3390)
1 parent c8b5fce commit 3b18e1a

2 files changed

Lines changed: 47 additions & 23 deletions

File tree

spark/src/test/scala/org/apache/comet/CometSqlFileTestSuite.scala

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,25 +77,31 @@ class CometSqlFileTestSuite extends CometTestBase with AdaptiveSparkPlanHelper {
7777
"spark.sql.optimizer.excludedRules" ->
7878
"org.apache.spark.sql.catalyst.optimizer.ConstantFolding")
7979

80-
private def runTestFile(file: SqlTestFile): Unit = {
80+
private def runTestFile(relativePath: String, file: SqlTestFile): Unit = {
8181
val allConfigs = file.configs ++ constantFoldingExcluded
8282
withSQLConf(allConfigs: _*) {
8383
withTable(file.tables: _*) {
8484
file.records.foreach {
85-
case SqlStatement(sql) =>
86-
spark.sql(sql)
87-
case SqlQuery(sql, mode) =>
88-
mode match {
89-
case CheckCoverageAndAnswer =>
90-
checkSparkAnswerAndOperator(sql)
91-
case SparkAnswerOnly =>
92-
checkSparkAnswer(sql)
93-
case WithTolerance(tol) =>
94-
checkSparkAnswerWithTolerance(sql, tol)
95-
case ExpectFallback(reason) =>
96-
checkSparkAnswerAndFallbackReason(sql, reason)
97-
case Ignore(reason) =>
98-
logInfo(s"IGNORED query (${reason}): $sql")
85+
case SqlStatement(sql, line) =>
86+
val location = if (line > 0) s"$relativePath:$line" else relativePath
87+
withClue(s"In SQL file $location, executing statement:\n$sql\n") {
88+
spark.sql(sql)
89+
}
90+
case SqlQuery(sql, mode, line) =>
91+
val location = if (line > 0) s"$relativePath:$line" else relativePath
92+
withClue(s"In SQL file $location, executing query:\n$sql\n") {
93+
mode match {
94+
case CheckCoverageAndAnswer =>
95+
checkSparkAnswerAndOperator(sql)
96+
case SparkAnswerOnly =>
97+
checkSparkAnswer(sql)
98+
case WithTolerance(tol) =>
99+
checkSparkAnswerWithTolerance(sql, tol)
100+
case ExpectFallback(reason) =>
101+
checkSparkAnswerAndFallbackReason(sql, reason)
102+
case Ignore(reason) =>
103+
logInfo(s"IGNORED query (${reason}): $sql")
104+
}
99105
}
100106
}
101107
}
@@ -118,7 +124,7 @@ class CometSqlFileTestSuite extends CometTestBase with AdaptiveSparkPlanHelper {
118124
logInfo(s"SKIPPED (requires Spark ${parsed.minSparkVersion.get}): $relativePath")
119125
} else {
120126
val effectiveConfigs = parsed.configs ++ combinations.headOption.getOrElse(Seq.empty)
121-
runTestFile(parsed.copy(configs = effectiveConfigs))
127+
runTestFile(relativePath, parsed.copy(configs = effectiveConfigs))
122128
}
123129
}
124130
} else {
@@ -129,7 +135,7 @@ class CometSqlFileTestSuite extends CometTestBase with AdaptiveSparkPlanHelper {
129135
if (skip) {
130136
logInfo(s"SKIPPED (requires Spark ${parsed.minSparkVersion.get}): $relativePath")
131137
} else {
132-
runTestFile(parsed.copy(configs = parsed.configs ++ matrixConfigs))
138+
runTestFile(relativePath, parsed.copy(configs = parsed.configs ++ matrixConfigs))
133139
}
134140
}
135141
}

spark/src/test/scala/org/apache/comet/SqlFileTestParser.scala

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,27 @@ import scala.io.Source
2626
/** A record in a SQL test file: either a statement (DDL/DML) or a query (SELECT). */
2727
sealed trait SqlTestRecord
2828

29-
/** A SQL statement to execute (CREATE TABLE, INSERT, etc.). */
30-
case class SqlStatement(sql: String) extends SqlTestRecord
29+
/**
30+
* A SQL statement to execute (CREATE TABLE, INSERT, etc.).
31+
*
32+
* @param sql
33+
* The SQL text.
34+
* @param line
35+
* 1-based line number in the original .sql file where the statement starts.
36+
*/
37+
case class SqlStatement(sql: String, line: Int) extends SqlTestRecord
3138

32-
/** A SQL query whose results are compared between Spark and Comet. */
33-
case class SqlQuery(sql: String, mode: QueryAssertionMode = CheckCoverageAndAnswer)
39+
/**
40+
* A SQL query whose results are compared between Spark and Comet.
41+
*
42+
* @param sql
43+
* The SQL text.
44+
* @param mode
45+
* How to validate the query.
46+
* @param line
47+
* 1-based line number in the original .sql file where the query starts.
48+
*/
49+
case class SqlQuery(sql: String, mode: QueryAssertionMode = CheckCoverageAndAnswer, line: Int)
3450
extends SqlTestRecord
3551

3652
sealed trait QueryAssertionMode
@@ -103,17 +119,19 @@ object SqlFileTestParser {
103119

104120
case "statement" =>
105121
lineIdx += 1
122+
val startLine = lineIdx + 1
106123
val (sql, nextIdx) = collectSql(lines, lineIdx)
107124
// Extract table names for cleanup
108125
CreateTablePattern.findFirstMatchIn(sql).foreach(m => tables += m.group(1))
109-
records += SqlStatement(sql)
126+
records += SqlStatement(sql, startLine)
110127
lineIdx = nextIdx
111128

112129
case s if s.startsWith("query") =>
113130
val mode = parseQueryAssertionMode(s)
114131
lineIdx += 1
132+
val startLine = lineIdx + 1
115133
val (sql, nextIdx) = collectSql(lines, lineIdx)
116-
records += SqlQuery(sql, mode)
134+
records += SqlQuery(sql, mode, startLine)
117135
lineIdx = nextIdx
118136

119137
case _ =>

0 commit comments

Comments
 (0)