aboutsummaryrefslogtreecommitdiff
path: root/sql/catalyst
diff options
context:
space:
mode:
authorWenchen Fan <wenchen@databricks.com>2016-06-02 18:13:04 -0700
committerCheng Lian <lian@databricks.com>2016-06-02 18:13:04 -0700
commit6323e4bd763eafe23c619a89552c00e1244e4690 (patch)
tree91c95f96698a38e2811a1326d29da54cdb2cec13 /sql/catalyst
parentd1c1fbc345a704a2c8210960683f33f945660d5a (diff)
downloadspark-6323e4bd763eafe23c619a89552c00e1244e4690.tar.gz
spark-6323e4bd763eafe23c619a89552c00e1244e4690.tar.bz2
spark-6323e4bd763eafe23c619a89552c00e1244e4690.zip
[SPARK-15732][SQL] better error message when use java reserved keyword as field name
## What changes were proposed in this pull request? When users create a case class and use java reserved keyword as field name, spark sql will generate illegal java code and throw exception at runtime. This PR checks the field names when building the encoder, and if illegal field names are used, throw exception immediately with a good error message. ## How was this patch tested? new test in DatasetSuite Author: Wenchen Fan <wenchen@databricks.com> Closes #13485 from cloud-fan/java.
Diffstat (limited to 'sql/catalyst')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala11
1 files changed, 11 insertions, 0 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala
index 052cc486e8..4750861817 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala
@@ -582,6 +582,11 @@ object ScalaReflection extends ScalaReflection {
case t if definedByConstructorParams(t) =>
val params = getConstructorParameters(t)
val nonNullOutput = CreateNamedStruct(params.flatMap { case (fieldName, fieldType) =>
+ if (javaKeywords.contains(fieldName)) {
+ throw new UnsupportedOperationException(s"`$fieldName` is a reserved keyword and " +
+ "cannot be used as field name\n" + walkedTypePath.mkString("\n"))
+ }
+
val fieldValue = Invoke(inputObject, fieldName, dataTypeFor(fieldType))
val clsName = getClassNameFromType(fieldType)
val newPath = s"""- field (class: "$clsName", name: "$fieldName")""" +: walkedTypePath
@@ -720,6 +725,12 @@ object ScalaReflection extends ScalaReflection {
tpe <:< localTypeOf[Product] || tpe <:< localTypeOf[DefinedByConstructorParams]
}
+ private val javaKeywords = Set("abstract", "assert", "boolean", "break", "byte", "case", "catch",
+ "char", "class", "const", "continue", "default", "do", "double", "else", "extends", "false",
+ "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int",
+ "interface", "long", "native", "new", "null", "package", "private", "protected", "public",
+ "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw",
+ "throws", "transient", "true", "try", "void", "volatile", "while")
}
/**