Skip to content

Commit 6dc3204

Browse files
committed
Remove various analysis exceptions
1 parent 0332063 commit 6dc3204

File tree

27 files changed

+275
-279
lines changed

27 files changed

+275
-279
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/AnalysisException.scala

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.spark.sql
1919

2020
import org.apache.spark.annotation.InterfaceStability
21+
import org.apache.spark.sql.catalyst.catalog.CatalogTypes.TablePartitionSpec
2122
import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
2223

2324

@@ -27,7 +28,7 @@ import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
2728
* @since 1.3.0
2829
*/
2930
@InterfaceStability.Stable
30-
class AnalysisException protected[sql] (
31+
class AnalysisException(
3132
val message: String,
3233
val line: Option[Int] = None,
3334
val startPosition: Option[Int] = None,
@@ -55,3 +56,113 @@ class AnalysisException protected[sql] (
5556
s"$message;$lineAnnotation$positionAnnotation"
5657
}
5758
}
59+
60+
object AnalysisException {
61+
/**
62+
* Create a no such database analysis exception.
63+
*/
64+
def noSuchDatabase(db: String): AnalysisException = {
65+
new AnalysisException(s"Database '$db' not found")
66+
}
67+
68+
/**
69+
* Create a database already exists analysis exception.
70+
*/
71+
def databaseAlreadyExists(db: String): AnalysisException = {
72+
new AnalysisException(s"Database '$db' already exists")
73+
}
74+
75+
/**
76+
* Create a no such table analysis exception.
77+
*/
78+
def noSuchTable(db: String, table: String): AnalysisException = {
79+
new AnalysisException(s"Table or view '$table' not found in database '$db'")
80+
}
81+
82+
/**
83+
* Create a table already exists analysis exception.
84+
*/
85+
def tableAlreadyExists(db: String, table: String): AnalysisException = {
86+
new AnalysisException(s"Table or view '$table' already exists in database '$db'")
87+
}
88+
89+
/**
90+
* Create a temporary table already exists analysis exception.
91+
*/
92+
def tempTableAlreadyExists(table: String): AnalysisException = {
93+
new AnalysisException(s"Temporary table '$table' already exists")
94+
}
95+
96+
/**
97+
* Create a no such partition analysis exception.
98+
*/
99+
def noSuchPartition(db: String, table: String, spec: TablePartitionSpec): AnalysisException = {
100+
new AnalysisException(
101+
s"Partition not found in table '$table' database '$db':\n" + spec.mkString("\n"))
102+
}
103+
104+
/**
105+
* Create a partition already exists analysis exception.
106+
*/
107+
def partitionAlreadyExists(
108+
db: String,
109+
table: String,
110+
spec: TablePartitionSpec): AnalysisException = {
111+
new AnalysisException(
112+
s"Partition already exists in table '$table' database '$db':\n" + spec.mkString("\n"))
113+
}
114+
115+
/**
116+
* Create a no such partitions analysis exception.
117+
*/
118+
def noSuchPartitions(
119+
db: String,
120+
table: String,
121+
specs: Seq[TablePartitionSpec]): AnalysisException = {
122+
new AnalysisException(
123+
s"The following partitions not found in table '$table' database '$db':\n"
124+
+ specs.mkString("\n===\n"))
125+
}
126+
127+
/**
128+
* Create a partitions already exists analysis exception.
129+
*/
130+
def partitionsAlreadyExists(
131+
db: String,
132+
table: String,
133+
specs: Seq[TablePartitionSpec]): AnalysisException = {
134+
new AnalysisException(
135+
s"The following partitions already exists in table '$table' database '$db':\n"
136+
+ specs.mkString("\n===\n"))
137+
}
138+
139+
/**
140+
* Create a no such function exception.
141+
*/
142+
def noSuchFunction(db: String, func: String): AnalysisException = {
143+
new AnalysisException(
144+
s"Undefined function: '$func'. This function is neither a registered temporary " +
145+
s"function nor a permanent function registered in the database '$db'.")
146+
}
147+
148+
/**
149+
* Create a function already exists analysis exception.
150+
*/
151+
def functionAlreadyExists(db: String, func: String): AnalysisException = {
152+
new AnalysisException(s"Function '$func' already exists in database '$db'")
153+
}
154+
155+
/**
156+
* Create a no such permanent function exception.
157+
*/
158+
def noSuchPermanentFunction(db: String, func: String): AnalysisException = {
159+
new AnalysisException(s"Function '$func' not found in database '$db'")
160+
}
161+
162+
/**
163+
* Create a no such temporary function exception.
164+
*/
165+
def noSuchTempFunction(func: String): AnalysisException = {
166+
new AnalysisException(s"Temporary function '$func' not found")
167+
}
168+
}

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AlreadyExistException.scala

Lines changed: 0 additions & 46 deletions
This file was deleted.

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -636,17 +636,16 @@ class Analyzer(
636636
defaultDatabase: Option[String] = None): LogicalPlan = {
637637
val tableIdentWithDb = u.tableIdentifier.copy(
638638
database = u.tableIdentifier.database.orElse(defaultDatabase))
639-
try {
640-
catalog.lookupRelation(tableIdentWithDb)
641-
} catch {
642-
case _: NoSuchTableException =>
643-
u.failAnalysis(s"Table or view not found: ${tableIdentWithDb.unquotedString}")
644-
// If the database is defined and that database is not found, throw an AnalysisException.
639+
if (!tableIdentWithDb.database.exists(catalog.databaseExists)) {
645640
// Note that if the database is not defined, it is possible we are looking up a temp view.
646-
case e: NoSuchDatabaseException =>
647-
u.failAnalysis(s"Table or view not found: ${tableIdentWithDb.unquotedString}, the " +
648-
s"database ${e.db} doesn't exsits.")
641+
u.failAnalysis(s"Table or view not found: ${tableIdentWithDb.unquotedString}, the " +
642+
s"database doesn't exsits.")
643+
}
644+
if (!catalog.tableExists(tableIdentWithDb)) {
645+
// If the database is defined and that database is not found, throw an AnalysisException.
646+
u.failAnalysis(s"Table or view not found: ${tableIdentWithDb.unquotedString}")
649647
}
648+
catalog.lookupRelation(tableIdentWithDb)
650649
}
651650

652651
// If the database part is specified, and we support running SQL directly on files, and
@@ -1122,7 +1121,9 @@ class Analyzer(
11221121
override def apply(plan: LogicalPlan): LogicalPlan = plan.transformAllExpressions {
11231122
case f: UnresolvedFunction if !catalog.functionExists(f.name) =>
11241123
withPosition(f) {
1125-
throw new NoSuchFunctionException(f.name.database.getOrElse("default"), f.name.funcName)
1124+
throw AnalysisException.noSuchFunction(
1125+
f.name.database.getOrElse("default"),
1126+
f.name.funcName)
11261127
}
11271128
}
11281129
}

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/NoSuchItemException.scala

Lines changed: 0 additions & 54 deletions
This file was deleted.

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/ExternalCatalog.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
package org.apache.spark.sql.catalyst.catalog
1919

20-
import org.apache.spark.sql.catalyst.analysis.{FunctionAlreadyExistsException, NoSuchDatabaseException, NoSuchFunctionException, NoSuchTableException}
20+
import org.apache.spark.sql.AnalysisException
2121
import org.apache.spark.sql.catalyst.expressions.Expression
2222
import org.apache.spark.sql.types.StructType
2323

@@ -28,32 +28,32 @@ import org.apache.spark.sql.types.StructType
2828
* can be accessed in multiple threads. This is an external catalog because it is expected to
2929
* interact with external systems.
3030
*
31-
* Implementations should throw [[NoSuchDatabaseException]] when databases don't exist.
31+
* Implementations should throw an [[AnalysisException]] when databases don't exist.
3232
*/
3333
abstract class ExternalCatalog {
3434
import CatalogTypes.TablePartitionSpec
3535

3636
protected def requireDbExists(db: String): Unit = {
3737
if (!databaseExists(db)) {
38-
throw new NoSuchDatabaseException(db)
38+
throw AnalysisException.noSuchDatabase(db)
3939
}
4040
}
4141

4242
protected def requireTableExists(db: String, table: String): Unit = {
4343
if (!tableExists(db, table)) {
44-
throw new NoSuchTableException(db = db, table = table)
44+
throw AnalysisException.noSuchTable(db, table)
4545
}
4646
}
4747

4848
protected def requireFunctionExists(db: String, funcName: String): Unit = {
4949
if (!functionExists(db, funcName)) {
50-
throw new NoSuchFunctionException(db = db, func = funcName)
50+
throw AnalysisException.noSuchFunction(db, funcName)
5151
}
5252
}
5353

5454
protected def requireFunctionNotExists(db: String, funcName: String): Unit = {
5555
if (functionExists(db, funcName)) {
56-
throw new FunctionAlreadyExistsException(db = db, func = funcName)
56+
throw AnalysisException.functionAlreadyExists(db, funcName)
5757
}
5858
}
5959

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/GlobalTempViewManager.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import javax.annotation.concurrent.GuardedBy
2222
import scala.collection.mutable
2323

2424
import org.apache.spark.sql.AnalysisException
25-
import org.apache.spark.sql.catalyst.analysis.TempTableAlreadyExistsException
2625
import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
2726
import org.apache.spark.sql.catalyst.util.StringUtils
2827

@@ -58,7 +57,7 @@ class GlobalTempViewManager(val database: String) {
5857
viewDefinition: LogicalPlan,
5958
overrideIfExists: Boolean): Unit = synchronized {
6059
if (!overrideIfExists && viewDefinitions.contains(name)) {
61-
throw new TempTableAlreadyExistsException(name)
60+
throw AnalysisException.tempTableAlreadyExists(name)
6261
}
6362
viewDefinitions.put(name, viewDefinition)
6463
}

0 commit comments

Comments
 (0)