viirya commented on a change in pull request #25745: [SPARK-29033][SQL][WIP] Always use UnsafeRow-based version of CreateNamedStruct URL: https://github.com/apache/spark/pull/25745#discussion_r324481472
########## File path: sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/complexTypeCreator.scala ########## @@ -348,69 +360,13 @@ trait CreateNamedStructLike extends Expression { override def eval(input: InternalRow): Any = { InternalRow(valExprs.map(_.eval(input)): _*) } -} - -/** - * Creates a struct with the given field names and values - * - * @param children Seq(name1, val1, name2, val2, ...) - */ -// scalastyle:off line.size.limit -@ExpressionDescription( - usage = "_FUNC_(name1, val1, name2, val2, ...) - Creates a struct with the given field names and values.", - examples = """ - Examples: - > SELECT _FUNC_("a", 1, "b", 2, "c", 3); - {"a":1,"b":2,"c":3} - """) -// scalastyle:on line.size.limit -case class CreateNamedStruct(children: Seq[Expression]) extends CreateNamedStructLike { - - override def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = { - val rowClass = classOf[GenericInternalRow].getName - val values = ctx.freshName("values") - val valCodes = valExprs.zipWithIndex.map { case (e, i) => - val eval = e.genCode(ctx) - s""" - |${eval.code} - |if (${eval.isNull}) { - | $values[$i] = null; - |} else { - | $values[$i] = ${eval.value}; - |} - """.stripMargin - } - val valuesCode = ctx.splitExpressionsWithCurrentInputs( - expressions = valCodes, - funcName = "createNamedStruct", - extraArguments = "Object[]" -> values :: Nil) - - ev.copy(code = - code""" - |Object[] $values = new Object[${valExprs.size}]; - |$valuesCode - |final InternalRow ${ev.value} = new $rowClass($values); - |$values = null; - """.stripMargin, isNull = FalseLiteral) - } - - override def prettyName: String = "named_struct" -} -/** - * Creates a struct with the given field names and values. This is a variant that returns - * UnsafeRow directly. The unsafe projection operator replaces [[CreateStruct]] with - * this expression automatically at runtime. - * - * @param children Seq(name1, val1, name2, val2, ...) - */ -case class CreateNamedStructUnsafe(children: Seq[Expression]) extends CreateNamedStructLike { override def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = { val eval = GenerateUnsafeProjection.createCode(ctx, valExprs) Review comment: Is there any types GenerateUnsafeProjection doesn't support? From GenerateUnsafeProjection.canSupport, looks no. ---------------------------------------------------------------- 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. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services --------------------------------------------------------------------- To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org For additional commands, e-mail: reviews-h...@spark.apache.org