@@ -19,14 +19,15 @@ package org.apache.spark.sql.catalyst.util
19
19
20
20
import scala .collection .mutable .ArrayBuffer
21
21
22
- import org .apache .spark .{SparkThrowable , SparkUnsupportedOperationException }
22
+ import org .apache .spark .{SparkException , SparkThrowable , SparkUnsupportedOperationException }
23
23
import org .apache .spark .internal .{Logging , MDC }
24
24
import org .apache .spark .internal .LogKeys ._
25
25
import org .apache .spark .sql .AnalysisException
26
26
import org .apache .spark .sql .catalyst .{InternalRow , SQLConfHelper }
27
27
import org .apache .spark .sql .catalyst .analysis ._
28
28
import org .apache .spark .sql .catalyst .catalog .{CatalogDatabase , InMemoryCatalog , SessionCatalog }
29
29
import org .apache .spark .sql .catalyst .expressions ._
30
+ import org .apache .spark .sql .catalyst .expressions .{Literal => ExprLiteral }
30
31
import org .apache .spark .sql .catalyst .optimizer .{ConstantFolding , Optimizer }
31
32
import org .apache .spark .sql .catalyst .parser .{CatalystSqlParser , ParseException }
32
33
import org .apache .spark .sql .catalyst .plans .logical ._
@@ -340,12 +341,35 @@ object ResolveDefaultColumns extends QueryErrorsBase
340
341
throw QueryCompilationErrors .defaultValuesMayNotContainSubQueryExpressions(
341
342
" " , field.name, defaultSQL)
342
343
}
343
- if (! expr.resolved) {
344
- throw QueryCompilationErrors .defaultValuesUnresolvedExprError(
345
- " " , field.name, defaultSQL, null )
344
+
345
+ val resolvedExpr = expr match {
346
+ case _ : ExprLiteral | _ : Cast => expr
347
+ case _ =>
348
+ // In most cases, column existsDefault should already be persisted as resolved sql
349
+ // statements but because they are fetched from external catalog, it is possible
350
+ // that this assumption does not hold so we fallback to full analysis if we encounter
351
+ // an unresolved existsDefault
352
+ val fallback = fallbackResolveExistenceDefaultValue(field)
353
+ if (! fallback.resolved) {
354
+ throw QueryCompilationErrors .defaultValuesUnresolvedExprError(
355
+ " " , field.name, defaultSQL, null )
356
+ }
357
+ fallback
346
358
}
347
359
348
- coerceDefaultValue(expr, field.dataType, " " , field.name, defaultSQL)
360
+ coerceDefaultValue(resolvedExpr, field.dataType, " " , field.name, defaultSQL)
361
+ }
362
+
363
+ private def fallbackResolveExistenceDefaultValue (field : StructField ): Expression = {
364
+ val defaultValue : Option [String ] = field.getExistenceDefaultValue()
365
+ defaultValue.map { text : String =>
366
+ val expr = analyze(field, " " , EXISTS_DEFAULT_COLUMN_METADATA_KEY )
367
+ expr match {
368
+ case _ : ExprLiteral | _ : Cast => expr
369
+ case _ => throw SparkException .internalError(s " parse existence default as literal err, " +
370
+ s " field name: ${field.name}, value: $text" )
371
+ }
372
+ }.orNull
349
373
}
350
374
351
375
/**
0 commit comments