Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,12 @@

package org.apache.spark.sql.catalyst.analysis

import org.apache.spark.sql.AnalysisException
import org.apache.spark.sql.catalyst.{FunctionIdentifier, InternalRow, TableIdentifier}
import org.apache.spark.sql.catalyst.errors.TreeNodeException
import org.apache.spark.sql.catalyst.expressions._
import org.apache.spark.sql.catalyst.expressions.codegen.{CodegenContext, ExprCode}
import org.apache.spark.sql.catalyst.parser.ParserUtils
import org.apache.spark.sql.catalyst.plans.logical.{LeafNode, LogicalPlan, UnaryNode}
import org.apache.spark.sql.catalyst.trees.TreeNode
import org.apache.spark.sql.catalyst.util.quoteIdentifier
import org.apache.spark.sql.connector.catalog.{Identifier, TableCatalog}
import org.apache.spark.sql.errors.{QueryCompilationErrors, QueryExecutionErrors}
Expand All @@ -34,8 +33,8 @@ import org.apache.spark.sql.util.CaseInsensitiveStringMap
* Thrown when an invalid attempt is made to access a property of a tree that has yet to be fully
* resolved.
*/
class UnresolvedException[TreeType <: TreeNode[_]](tree: TreeType, function: String)
extends TreeNodeException(tree, s"Invalid call to $function on unresolved object", null)
class UnresolvedException(function: String)
extends AnalysisException(s"Invalid call to $function on unresolved object")

/**
* Holds the name of a relation that has yet to be looked up in a catalog.
Expand Down Expand Up @@ -145,10 +144,10 @@ case class UnresolvedAttribute(nameParts: Seq[String]) extends Attribute with Un
def name: String =
nameParts.map(n => if (n.contains(".")) s"`$n`" else n).mkString(".")

override def exprId: ExprId = throw new UnresolvedException(this, "exprId")
override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def qualifier: Seq[String] = throw new UnresolvedException(this, "qualifier")
override def exprId: ExprId = throw new UnresolvedException("exprId")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override def qualifier: Seq[String] = throw new UnresolvedException("qualifier")
override lazy val resolved = false

override def newInstance(): UnresolvedAttribute = this
Expand Down Expand Up @@ -235,10 +234,10 @@ object UnresolvedAttribute {
case class UnresolvedGenerator(name: FunctionIdentifier, children: Seq[Expression])
extends Generator {

override def elementSchema: StructType = throw new UnresolvedException(this, "elementTypes")
override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def foldable: Boolean = throw new UnresolvedException(this, "foldable")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def elementSchema: StructType = throw new UnresolvedException("elementTypes")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def foldable: Boolean = throw new UnresolvedException("foldable")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override lazy val resolved = false

override def prettyName: String = name.unquotedString
Expand All @@ -264,8 +263,8 @@ case class UnresolvedFunction(

override def children: Seq[Expression] = arguments ++ filter.toSeq

override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override lazy val resolved = false

override def prettyName: String = name.unquotedString
Expand All @@ -287,13 +286,13 @@ object UnresolvedFunction {
*/
abstract class Star extends LeafExpression with NamedExpression {

override def name: String = throw new UnresolvedException(this, "name")
override def exprId: ExprId = throw new UnresolvedException(this, "exprId")
override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def qualifier: Seq[String] = throw new UnresolvedException(this, "qualifier")
override def toAttribute: Attribute = throw new UnresolvedException(this, "toAttribute")
override def newInstance(): NamedExpression = throw new UnresolvedException(this, "newInstance")
override def name: String = throw new UnresolvedException("name")
override def exprId: ExprId = throw new UnresolvedException("exprId")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override def qualifier: Seq[String] = throw new UnresolvedException("qualifier")
override def toAttribute: Attribute = throw new UnresolvedException("toAttribute")
override def newInstance(): NamedExpression = throw new UnresolvedException("newInstance")
override lazy val resolved = false

def expand(input: LogicalPlan, resolver: Resolver): Seq[NamedExpression]
Expand Down Expand Up @@ -412,19 +411,19 @@ case class UnresolvedRegex(regexPattern: String, table: Option[String], caseSens
case class MultiAlias(child: Expression, names: Seq[String])
extends UnaryExpression with NamedExpression with Unevaluable {

override def name: String = throw new UnresolvedException(this, "name")
override def name: String = throw new UnresolvedException("name")

override def exprId: ExprId = throw new UnresolvedException(this, "exprId")
override def exprId: ExprId = throw new UnresolvedException("exprId")

override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def dataType: DataType = throw new UnresolvedException("dataType")

override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def nullable: Boolean = throw new UnresolvedException("nullable")

override def qualifier: Seq[String] = throw new UnresolvedException(this, "qualifier")
override def qualifier: Seq[String] = throw new UnresolvedException("qualifier")

override def toAttribute: Attribute = throw new UnresolvedException(this, "toAttribute")
override def toAttribute: Attribute = throw new UnresolvedException("toAttribute")

override def newInstance(): NamedExpression = throw new UnresolvedException(this, "newInstance")
override def newInstance(): NamedExpression = throw new UnresolvedException("newInstance")

override lazy val resolved = false

Expand All @@ -439,7 +438,7 @@ case class MultiAlias(child: Expression, names: Seq[String])
* @param expressions Expressions to expand.
*/
case class ResolvedStar(expressions: Seq[NamedExpression]) extends Star with Unevaluable {
override def newInstance(): NamedExpression = throw new UnresolvedException(this, "newInstance")
override def newInstance(): NamedExpression = throw new UnresolvedException("newInstance")
override def expand(input: LogicalPlan, resolver: Resolver): Seq[NamedExpression] = expressions
override def toString: String = expressions.mkString("ResolvedStar(", ", ", ")")
}
Expand All @@ -458,8 +457,8 @@ case class UnresolvedExtractValue(child: Expression, extraction: Expression)
override def left: Expression = child
override def right: Expression = extraction

override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override lazy val resolved = false

override def toString: String = s"$child[$extraction]"
Expand All @@ -479,13 +478,13 @@ case class UnresolvedAlias(
aliasFunc: Option[Expression => String] = None)
extends UnaryExpression with NamedExpression with Unevaluable {

override def toAttribute: Attribute = throw new UnresolvedException(this, "toAttribute")
override def qualifier: Seq[String] = throw new UnresolvedException(this, "qualifier")
override def exprId: ExprId = throw new UnresolvedException(this, "exprId")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def name: String = throw new UnresolvedException(this, "name")
override def newInstance(): NamedExpression = throw new UnresolvedException(this, "newInstance")
override def toAttribute: Attribute = throw new UnresolvedException("toAttribute")
override def qualifier: Seq[String] = throw new UnresolvedException("qualifier")
override def exprId: ExprId = throw new UnresolvedException("exprId")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def name: String = throw new UnresolvedException("name")
override def newInstance(): NamedExpression = throw new UnresolvedException("newInstance")

override lazy val resolved = false
}
Expand Down Expand Up @@ -527,14 +526,14 @@ case class UnresolvedDeserializer(deserializer: Expression, inputAttributes: Seq
require(inputAttributes.forall(_.resolved), "Input attributes must all be resolved.")

override def child: Expression = deserializer
override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override lazy val resolved = false
}

case class GetColumnByOrdinal(ordinal: Int, dataType: DataType) extends LeafExpression
with Unevaluable with NonSQLExpression {
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override lazy val resolved = false
}

Expand All @@ -550,8 +549,8 @@ case class GetColumnByOrdinal(ordinal: Int, dataType: DataType) extends LeafExpr
*/
case class UnresolvedOrdinal(ordinal: Int)
extends LeafExpression with Unevaluable with NonSQLExpression {
override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override lazy val resolved = false
}

Expand All @@ -571,7 +570,7 @@ case class UnresolvedHaving(
* A place holder expression used in random functions, will be replaced after analyze.
*/
case object UnresolvedSeed extends LeafExpression with Unevaluable {
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override def dataType: DataType = throw new UnresolvedException("dataType")
override lazy val resolved = false
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ package org.apache.spark.sql.catalyst.expressions

import org.apache.spark.internal.Logging
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.errors.attachTree
import org.apache.spark.sql.catalyst.expressions.codegen.{CodegenContext, CodeGenerator, ExprCode, FalseLiteral, JavaCode}
import org.apache.spark.sql.catalyst.expressions.codegen.Block._
import org.apache.spark.sql.types._
Expand Down Expand Up @@ -72,17 +71,16 @@ object BindReferences extends Logging {
input: AttributeSeq,
allowFailures: Boolean = false): A = {
expression.transform { case a: AttributeReference =>
attachTree(a, "Binding attribute") {
val ordinal = input.indexOf(a.exprId)
if (ordinal == -1) {
if (allowFailures) {
a
} else {
sys.error(s"Couldn't find $a in ${input.attrs.mkString("[", ",", "]")}")
}
val ordinal = input.indexOf(a.exprId)
if (ordinal == -1) {
if (allowFailures) {
a
} else {
BoundReference(ordinal, a.dataType, input(ordinal).nullable)
throw new IllegalStateException(
s"Couldn't find $a in ${input.attrs.mkString("[", ",", "]")}")
Comment on lines +79 to +80
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it supposed an internal error, correct? or end users might face to the error on some SQL queries?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess we should use internal error too. At that time, we didn't have this understanding yet.

}
} else {
BoundReference(ordinal, a.dataType, input(ordinal).nullable)
}
}.asInstanceOf[A] // Kind of a hack, but safe. TODO: Tighten return type when possible.
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ case class UnresolvedNamedLambdaVariable(nameParts: Seq[String])
override def name: String =
nameParts.map(n => if (n.contains(".")) s"`$n`" else n).mkString(".")

override def exprId: ExprId = throw new UnresolvedException(this, "exprId")
override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def qualifier: Seq[String] = throw new UnresolvedException(this, "qualifier")
override def toAttribute: Attribute = throw new UnresolvedException(this, "toAttribute")
override def newInstance(): NamedExpression = throw new UnresolvedException(this, "newInstance")
override def exprId: ExprId = throw new UnresolvedException("exprId")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override def qualifier: Seq[String] = throw new UnresolvedException("qualifier")
override def toAttribute: Attribute = throw new UnresolvedException("toAttribute")
override def newInstance(): NamedExpression = throw new UnresolvedException("newInstance")
override lazy val resolved = false

override def toString: String = s"lambda '$name"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,8 +272,8 @@ case class UnresolvedWindowExpression(
child: Expression,
windowSpec: WindowSpecReference) extends UnaryExpression with Unevaluable {

override def dataType: DataType = throw new UnresolvedException(this, "dataType")
override def nullable: Boolean = throw new UnresolvedException(this, "nullable")
override def dataType: DataType = throw new UnresolvedException("dataType")
override def nullable: Boolean = throw new UnresolvedException("nullable")
override lazy val resolved = false
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ case class MergeIntoTable(
sealed abstract class MergeAction extends Expression with Unevaluable {
def condition: Option[Expression]
override def nullable: Boolean = false
override def dataType: DataType = throw new UnresolvedException(this, "nullable")
override def dataType: DataType = throw new UnresolvedException("nullable")
override def children: Seq[Expression] = condition.toSeq
}

Expand All @@ -410,7 +410,7 @@ case class InsertAction(

case class Assignment(key: Expression, value: Expression) extends Expression with Unevaluable {
override def nullable: Boolean = false
override def dataType: DataType = throw new UnresolvedException(this, "nullable")
override def dataType: DataType = throw new UnresolvedException("nullable")
override def children: Seq[Expression] = key :: value :: Nil
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ package org.apache.spark.sql.catalyst.rules

import org.apache.spark.internal.Logging
import org.apache.spark.sql.catalyst.QueryPlanningTracker
import org.apache.spark.sql.catalyst.errors.TreeNodeException
import org.apache.spark.sql.catalyst.trees.TreeNode
import org.apache.spark.sql.catalyst.util.DateTimeConstants.NANOS_PER_SECOND
import org.apache.spark.sql.catalyst.util.sideBySide
Expand Down Expand Up @@ -169,7 +168,7 @@ abstract class RuleExecutor[TreeType <: TreeNode[_]] extends Logging {
|Once strategy's idempotence is broken for batch ${batch.name}
|${sideBySide(plan.treeString, reOptimized.treeString).mkString("\n")}
""".stripMargin
throw new TreeNodeException(reOptimized, message, null)
throw new RuntimeException(message)
}
}

Expand Down Expand Up @@ -199,7 +198,7 @@ abstract class RuleExecutor[TreeType <: TreeNode[_]] extends Logging {
if (!isPlanIntegral(plan)) {
val message = "The structural integrity of the input plan is broken in " +
s"${this.getClass.getName.stripSuffix("$")}."
throw new TreeNodeException(plan, message, null)
throw new RuntimeException(message)
}

batches.foreach { batch =>
Expand Down Expand Up @@ -232,7 +231,7 @@ abstract class RuleExecutor[TreeType <: TreeNode[_]] extends Logging {
if (effective && !isPlanIntegral(result)) {
val message = s"After applying rule ${rule.ruleName} in batch ${batch.name}, " +
"the structural integrity of the plan is broken."
throw new TreeNodeException(result, message, null)
throw new RuntimeException(message)
}

result
Expand All @@ -249,7 +248,7 @@ abstract class RuleExecutor[TreeType <: TreeNode[_]] extends Logging {
val message = s"Max iterations (${iteration - 1}) reached for batch ${batch.name}" +
s"$endingMsg"
if (Utils.isTesting || batch.strategy.errorOnExceed) {
throw new TreeNodeException(curPlan, message, null)
throw new RuntimeException(message)
} else {
logWarning(message)
}
Expand Down
Loading