ScalarSubquery (ExecSubqueryExpression)¶
ScalarSubquery is an ExecSubqueryExpression that <null if no row were computed).
IMPORTANT: Spark SQL uses the name of ScalarSubquery twice to represent an ExecSubqueryExpression (this page) and a SubqueryExpression. It is confusing and you should not be anymore.
ScalarSubquery is <
[source, scala]¶
// FIXME DEMO import org.apache.spark.sql.execution.PlanSubqueries val spark = ... val planSubqueries = PlanSubqueries(spark) val plan = ... val executedPlan = planSubqueries(plan)
[[Unevaluable]] ScalarSubquery is an unevaluable expression.
[[dataType]] ScalarSubquery uses...FIXME...for the <
[[internal-registries]] .ScalarSubquery's Internal Properties (e.g. Registries, Counters and Flags) [cols="1,2",options="header",width="100%"] |=== | Name | Description
| result | [[result]] The value of the single column in a single row after collecting the rows from executing the <null if no rows were collected.
| updated | [[updated]] Flag that says whether ScalarSubquery was <
=== [[creating-instance]] Creating ScalarSubquery Instance
ScalarSubquery takes the following when created:
- [[plan]] SubqueryExec.md[SubqueryExec] plan
- [[exprId]] Expression ID (as
ExprId)
=== [[updateResult]] Updating ScalarSubquery With Collected Result -- updateResult Method
[source, scala]¶
updateResult(): Unit¶
NOTE: updateResult is part of spark-sql-Expression-ExecSubqueryExpression.md#updateResult[ExecSubqueryExpression Contract] to fill an Catalyst expression with a collected result from executing a subquery plan.
updateResult requests <
updateResult sets <null if no row were collected.
In the end, updateResult marks the ScalarSubquery instance as <
updateResult reports a RuntimeException when there are more than 1 rows in the result.
more than one row returned by a subquery used as an expression:
[plan]
updateResult reports an AssertionError when the number of fields is not exactly 1.
Expects 1 field, but got [numFields] something went wrong in analysis
=== [[eval]] Evaluating Expression -- eval Method
[source, scala]¶
eval(input: InternalRow): Any¶
eval is part of the Expression abstraction.
eval simply returns <
eval reports an IllegalArgumentException if the ScalarSubquery expression has not been <
=== [[doGenCode]] Generating Java Source Code (ExprCode) For Code-Generated Expression Evaluation -- doGenCode Method
[source, scala]¶
doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode¶
NOTE: doGenCode is part of <
doGenCode first makes sure that the <true). If not, doGenCode throws an IllegalArgumentException exception with the following message:
requirement failed: [this] has not finished
doGenCode then creates a <