Skip to content

Commit 4e83f9f

Browse files
committed
insert assertion
add test case
1 parent acf7ef3 commit 4e83f9f

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/CodeGenerator.scala

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,18 @@ class CodegenContext {
217217
splitExpressions(expressions = initCodes, funcName = "init", arguments = Nil)
218218
}
219219

220+
/**
221+
* Return true if a given variable has been described as a global variable
222+
*/
223+
def isDeclaredMutableState(varName: String): Boolean = {
224+
val j = varName.indexOf("[")
225+
val qualifiedName = if (j < 0) varName else varName.substring(0, j)
226+
mutableStates.find { s =>
227+
val i = s._2.indexOf("[")
228+
qualifiedName == (if (i < 0) s._2 else s._2.substring(0, i))
229+
}.isDefined
230+
}
231+
220232
/**
221233
* Code statements to initialize states that depend on the partition index.
222234
* An integer `partitionIndex` will be made available within the scope.
@@ -842,7 +854,10 @@ class CodegenContext {
842854
blocks.head
843855
} else {
844856
val func = freshName(funcName)
845-
val argString = arguments.map { case (t, name) => s"$t $name" }.mkString(", ")
857+
val argString = arguments.map { case (t, name) =>
858+
assert(!isDeclaredMutableState(name),
859+
s"$name in arguments should not be declared as a global variable")
860+
s"$t $name" }.mkString(", ")
846861
val functions = blocks.zipWithIndex.map { case (body, i) =>
847862
val name = s"${func}_$i"
848863
val code = s"""

sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CodeGenerationSuite.scala

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,4 +394,23 @@ class CodeGenerationSuite extends SparkFunSuite with ExpressionEvalHelper {
394394
Map("add" -> Literal(1))).genCode(ctx)
395395
assert(ctx.mutableStates.isEmpty)
396396
}
397+
398+
test("SPARK-22668: ensure no global variables in split method arguments") {
399+
val ctx = new CodegenContext
400+
ctx.addMutableState(ctx.JAVA_INT, "ij")
401+
ctx.addMutableState("int[]", "array")
402+
ctx.addMutableState("int[][]", "b")
403+
404+
assert(ctx.isDeclaredMutableState("ij"))
405+
assert(ctx.isDeclaredMutableState("array"))
406+
assert(ctx.isDeclaredMutableState("array[1]"))
407+
assert(ctx.isDeclaredMutableState("b[]"))
408+
assert(ctx.isDeclaredMutableState("b[1][]"))
409+
410+
assert(!ctx.isDeclaredMutableState("i"))
411+
assert(!ctx.isDeclaredMutableState("j"))
412+
assert(!ctx.isDeclaredMutableState("ij1"))
413+
assert(!ctx.isDeclaredMutableState("arr"))
414+
assert(!ctx.isDeclaredMutableState("bb[]"))
415+
}
397416
}

0 commit comments

Comments
 (0)