aboutsummaryrefslogtreecommitdiff
path: root/sql/catalyst
diff options
context:
space:
mode:
authorwangfei <wangfei1@huawei.com>2015-02-03 12:16:31 -0800
committerMichael Armbrust <michael@databricks.com>2015-02-03 12:16:31 -0800
commit5adbb39482631998dbfe4a1da88f6e75b30fb5ac (patch)
tree851a86986f171d0164e0741fb667656a0fdf9c67 /sql/catalyst
parentca7a6cdff004eb4605fd223e127b4a46a0a214e7 (diff)
downloadspark-5adbb39482631998dbfe4a1da88f6e75b30fb5ac.tar.gz
spark-5adbb39482631998dbfe4a1da88f6e75b30fb5ac.tar.bz2
spark-5adbb39482631998dbfe4a1da88f6e75b30fb5ac.zip
[SPARK-5383][SQL] Support alias for udtfs
Add support for alias of udtfs, such as ``` select stack(2, key, value, key, value) as (a, b) from src limit 5; select a, b from (select stack(2, key, value, key, value) as (a, b) from src) t limit 5 ``` Author: wangfei <wangfei1@huawei.com> Author: scwf <wangfei1@huawei.com> Author: Fei Wang <wangfei1@huawei.com> Closes #4186 from scwf/multi-alias-names and squashes the following commits: c35e922 [wangfei] fix conflicts adc8311 [wangfei] minor format fix 2783aed [wangfei] convert it to a Generate instead of leaving it inside of a Project clause a87668a [wangfei] minor improvement b25d9b3 [wangfei] resolve conflicts d38f041 [wangfei] style fix 8cfcebf [wangfei] minor improvement 12a239e [wangfei] fix test case 050177f [wangfei] added extendedCheckRules 3d69329 [wangfei] added CheckMultiAlias to analyzer 324150d [wangfei] added multi alias node 74f5a81 [Fei Wang] imports order fix 5bc3f59 [scwf] style fix 3daec28 [scwf] support alias for udfs with multi output columns
Diffstat (limited to 'sql/catalyst')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala5
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala38
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/namedExpressions.scala2
3 files changed, 42 insertions, 3 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala
index cefd70acf3..ae7f7b9feb 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala
@@ -69,8 +69,9 @@ class Analyzer(catalog: Catalog,
typeCoercionRules ++
extendedRules : _*),
Batch("Check Analysis", Once,
- CheckResolution,
- CheckAggregation),
+ CheckResolution ::
+ CheckAggregation ::
+ Nil: _*),
Batch("AnalysisOperators", fixedPoint,
EliminateAnalysisOperators)
)
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala
index 6606028918..f35921e2a7 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala
@@ -128,6 +128,44 @@ case class UnresolvedStar(table: Option[String]) extends Star {
override def toString = table.map(_ + ".").getOrElse("") + "*"
}
+/**
+ * Used to assign new names to Generator's output, such as hive udtf.
+ * For example the SQL expression "stack(2, key, value, key, value) as (a, b)" could be represented
+ * as follows:
+ * MultiAlias(stack_function, Seq(a, b))
+
+ * @param child the computation being performed
+ * @param names the names to be associated with each output of computing [[child]].
+ */
+case class MultiAlias(child: Expression, names: Seq[String])
+ extends Attribute with trees.UnaryNode[Expression] {
+
+ override def name = throw new UnresolvedException(this, "name")
+
+ override def exprId = throw new UnresolvedException(this, "exprId")
+
+ override def dataType = throw new UnresolvedException(this, "dataType")
+
+ override def nullable = throw new UnresolvedException(this, "nullable")
+
+ override def qualifiers = throw new UnresolvedException(this, "qualifiers")
+
+ override lazy val resolved = false
+
+ override def newInstance = this
+
+ override def withNullability(newNullability: Boolean) = this
+
+ override def withQualifiers(newQualifiers: Seq[String]) = this
+
+ override def withName(newName: String) = this
+
+ override def eval(input: Row = null): EvaluatedType =
+ throw new TreeNodeException(this, s"No function to evaluate expression. type: ${this.nodeName}")
+
+ override def toString: String = s"$child AS $names"
+
+}
/**
* Represents all the resolved input attributes to a given relational operator. This is used
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/namedExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/namedExpressions.scala
index f388cd5972..e6ab1fd8d7 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/namedExpressions.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/namedExpressions.scala
@@ -75,7 +75,7 @@ abstract class Attribute extends NamedExpression {
/**
* Used to assign a new name to a computation.
* For example the SQL expression "1 + 1 AS a" could be represented as follows:
- * Alias(Add(Literal(1), Literal(1), "a")()
+ * Alias(Add(Literal(1), Literal(1)), "a")()
*
* Note that exprId and qualifiers are in a separate parameter list because
* we only pattern match on child and name.