[SPARK-3371][SQL] Renaming a function expression with group by gives error
The following code gives error. ``` sqlContext.registerFunction("len", (s: String) => s.length) sqlContext.sql("select len(foo) as a, count(1) from t1 group by len(foo)").collect() ``` Because SQl parser creates the aliases to the functions in grouping expressions with generated alias names. So if user gives the alias names to the functions inside projection then it does not match the generated alias name of grouping expression. This kind of queries are working in Hive. So the fix I have given that if user provides alias to the function in projection then don't generate alias in grouping expression,use the same alias. Author: ravipesala <ravindra.pesala@huawei.com> Closes #2511 from ravipesala/SPARK-3371 and squashes the following commits: 9fb973f [ravipesala] Removed aliases to grouping expressions. f8ace79 [ravipesala] Fixed the testcase issue bad2fd0 [ravipesala] SPARK-3371 : Fixed Renaming a function expression with group by gives error
This commit is contained in:
parent
f341e1c8a2
commit
bbdf1de84f
|
@ -166,7 +166,7 @@ class SqlParser extends StandardTokenParsers with PackratParsers {
|
|||
val withFilter = f.map(f => Filter(f, base)).getOrElse(base)
|
||||
val withProjection =
|
||||
g.map {g =>
|
||||
Aggregate(assignAliases(g), assignAliases(p), withFilter)
|
||||
Aggregate(g, assignAliases(p), withFilter)
|
||||
}.getOrElse(Project(assignAliases(p), withFilter))
|
||||
val withDistinct = d.map(_ => Distinct(withProjection)).getOrElse(withProjection)
|
||||
val withHaving = h.map(h => Filter(h, withDistinct)).getOrElse(withDistinct)
|
||||
|
|
|
@ -680,4 +680,9 @@ class SQLQuerySuite extends QueryTest with BeforeAndAfterAll {
|
|||
sql("SELECT CAST(TRUE AS STRING), CAST(FALSE AS STRING) FROM testData LIMIT 1"),
|
||||
("true", "false") :: Nil)
|
||||
}
|
||||
|
||||
test("SPARK-3371 Renaming a function expression with group by gives error") {
|
||||
registerFunction("len", (s: String) => s.length)
|
||||
checkAnswer(
|
||||
sql("SELECT len(value) as temp FROM testData WHERE key = 1 group by len(value)"), 1)}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue