This is an automated email from the ASF dual-hosted git repository.

cloud-fan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/master by this push:
     new 6d35bbbff6b6 [SPARK-57089][SQL] Preserve collation name as `COLLATE` 
expression origin
6d35bbbff6b6 is described below

commit 6d35bbbff6b6868208257157a8eb0757414e6be9
Author: Mihailo Aleksic <[email protected]>
AuthorDate: Thu May 28 02:32:54 2026 +0800

    [SPARK-57089][SQL] Preserve collation name as `COLLATE` expression origin
    
    ### What changes were proposed in this pull request?
    In this issue I propose to preserve collation name as `COLLATE` expression 
origin. This would lead to better observability (e.g. for error messages).
    
    ### Why are the changes needed?
    To improve `COLLATE` expression observability.
    
    ### Does this PR introduce _any_ user-facing change?
    COLLATE expression origin improves.
    
    ### How was this patch tested?
    Added + existing tests.
    
    ### Was this patch authored or co-authored using generative AI tooling?
    Yes.
    
    Closes #56131 from mihailoale-db/collationoriginfix.
    
    Authored-by: Mihailo Aleksic <[email protected]>
    Signed-off-by: Wenchen Fan <[email protected]>
---
 .../spark/sql/catalyst/parser/AstBuilder.scala     |    6 +-
 .../catalyst/parser/ExpressionParserSuite.scala    |   11 +
 .../analyzer-results/collations-basic.sql.out      | 1145 ++++++++++++++++++
 .../sql-tests/inputs/collations-basic.sql          |  229 ++++
 .../sql-tests/results/collations-basic.sql.out     | 1252 ++++++++++++++++++++
 5 files changed, 2641 insertions(+), 2 deletions(-)

diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
index ff69be1956c6..a2c3cbfec758 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
@@ -3594,8 +3594,10 @@ class AstBuilder extends DataTypeAstBuilder
    */
   override def visitCollate(ctx: CollateContext): Expression = withOrigin(ctx) 
{
     val collationName = visitCollateClause(ctx.collateClause())
-
-    Collate(expression(ctx.primaryExpression), 
UnresolvedCollation(collationName))
+    val unresolvedCollation = withOrigin(ctx.collateClause().collationName) {
+      UnresolvedCollation(collationName)
+    }
+    Collate(expression(ctx.primaryExpression), unresolvedCollation)
   }
 
   override def visitCollateClause(ctx: CollateClauseContext): Seq[String] = 
withOrigin(ctx) {
diff --git 
a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala
 
b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala
index d2b4345072f8..828e184fdb88 100644
--- 
a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala
+++ 
b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala
@@ -1255,4 +1255,15 @@ class ExpressionParserSuite extends AnalysisTest {
         start = 0,
         stop = 14))
   }
+
+  test("collate expression origin") {
+    val sql = "a COLLATE utf8_lcase"
+    val parsed = defaultParser.parseExpression(sql)
+    val collation = parsed.collect { case u: UnresolvedCollation => u }
+    assert(collation.length == 1)
+    val origin = collation.head.origin
+    assert(origin.startIndex.isDefined)
+    assert(origin.stopIndex.isDefined)
+    assert(sql.substring(origin.startIndex.get, origin.stopIndex.get + 1) == 
"utf8_lcase")
+  }
 }
diff --git 
a/sql/core/src/test/resources/sql-tests/analyzer-results/collations-basic.sql.out
 
b/sql/core/src/test/resources/sql-tests/analyzer-results/collations-basic.sql.out
index 944ec8037a9d..84cc75aa10c0 100644
--- 
a/sql/core/src/test/resources/sql-tests/analyzer-results/collations-basic.sql.out
+++ 
b/sql/core/src/test/resources/sql-tests/analyzer-results/collations-basic.sql.out
@@ -1185,3 +1185,1148 @@ drop table t4
 -- !query analysis
 DropTable false, false
 +- ResolvedIdentifier V2SessionCatalog(spark_catalog), default.t4
+
+
+-- !query
+select 'aaa' collate utf8_binary
+-- !query analysis
+Project [collate(aaa, utf8_binary) AS collate(aaa, utf8_binary)#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_lcase
+-- !query analysis
+Project [collate(aaa, utf8_lcase) AS collate(aaa, utf8_lcase)#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode
+-- !query analysis
+Project [collate(aaa, unicode) AS collate(aaa, unicode)#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_ci
+-- !query analysis
+Project [collate(aaa, unicode_ci) AS collate(aaa, unicode_ci)#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate uTf8_BiNaRy
+-- !query analysis
+Project [collate(aaa, uTf8_BiNaRy) AS collate(aaa, uTf8_BiNaRy)#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate uNicOde
+-- !query analysis
+Project [collate(aaa, uNicOde) AS collate(aaa, uNicOde)#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate UNICODE_ci
+-- !query analysis
+Project [collate(aaa, UNICODE_ci) AS collate(aaa, UNICODE_ci)#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate UtF8_lCaSE_rtRIM
+-- !query analysis
+Project [collate(aaa, UtF8_lCaSE_rtRIM) AS collate(aaa, UtF8_lCaSE_rtRIM)#x]
++- OneRowRelation
+
+
+-- !query
+select collation('aaa' collate utf8_binary)
+-- !query analysis
+Project [collation(collate(aaa, utf8_binary)) AS collation(collate(aaa, 
utf8_binary))#x]
++- OneRowRelation
+
+
+-- !query
+select collation('aaa' collate utf8_lcase)
+-- !query analysis
+Project [collation(collate(aaa, utf8_lcase)) AS collation(collate(aaa, 
utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select collation('aaa' collate unicode)
+-- !query analysis
+Project [collation(collate(aaa, unicode)) AS collation(collate(aaa, 
unicode))#x]
++- OneRowRelation
+
+
+-- !query
+select collation('aaa' collate unicode_ci)
+-- !query analysis
+Project [collation(collate(aaa, unicode_ci)) AS collation(collate(aaa, 
unicode_ci))#x]
++- OneRowRelation
+
+
+-- !query
+select collation('aaa' collate unicode_ci_rtrim)
+-- !query analysis
+Project [collation(collate(aaa, unicode_ci_rtrim)) AS collation(collate(aaa, 
unicode_ci_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select collation('aaa' collate utf8_lcase_rtrim)
+-- !query analysis
+Project [collation(collate(aaa, utf8_lcase_rtrim)) AS collation(collate(aaa, 
utf8_lcase_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select collation('aaa' collate utf8_binary_rtrim)
+-- !query analysis
+Project [collation(collate(aaa, utf8_binary_rtrim)) AS collation(collate(aaa, 
utf8_binary_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select collation('aaa')
+-- !query analysis
+Project [collation(aaa) AS collation(aaa)#x]
++- OneRowRelation
+
+
+-- !query
+select collate('aaa', 'utf8_binary')
+-- !query analysis
+Project [collate(aaa, utf8_binary) AS collate(aaa, utf8_binary)#x]
++- OneRowRelation
+
+
+-- !query
+select collate('aaa', 'utf8_lcase')
+-- !query analysis
+Project [collate(aaa, utf8_lcase) AS collate(aaa, utf8_lcase)#x]
++- OneRowRelation
+
+
+-- !query
+select collate('aaa', 'utf8_binary_rtrim')
+-- !query analysis
+Project [collate(aaa, utf8_binary_rtrim) AS collate(aaa, utf8_binary_rtrim)#x]
++- OneRowRelation
+
+
+-- !query
+select collate('aaa', 'utf8_lcase_rtrim')
+-- !query analysis
+Project [collate(aaa, utf8_lcase_rtrim) AS collate(aaa, utf8_lcase_rtrim)#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_binary = 'AAA' collate utf8_binary
+-- !query analysis
+Project [(collate(aaa, utf8_binary) = collate(AAA, utf8_binary)) AS 
(collate(aaa, utf8_binary) = collate(AAA, utf8_binary))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_binary = 'aaa' collate utf8_binary
+-- !query analysis
+Project [(collate(aaa, utf8_binary) = collate(aaa, utf8_binary)) AS 
(collate(aaa, utf8_binary) = collate(aaa, utf8_binary))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_binary_rtrim = 'AAA' collate utf8_binary_rtrim
+-- !query analysis
+Project [(collate(aaa, utf8_binary_rtrim) = collate(AAA, utf8_binary_rtrim)) 
AS (collate(aaa, utf8_binary_rtrim) = collate(AAA, utf8_binary_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_binary_rtrim = 'aaa  ' collate utf8_binary_rtrim
+-- !query analysis
+Project [(collate(aaa, utf8_binary_rtrim) = collate(aaa  , utf8_binary_rtrim)) 
AS (collate(aaa, utf8_binary_rtrim) = collate(aaa  , utf8_binary_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_lcase = 'aaa' collate utf8_lcase
+-- !query analysis
+Project [(collate(aaa, utf8_lcase) = collate(aaa, utf8_lcase)) AS 
(collate(aaa, utf8_lcase) = collate(aaa, utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_lcase = 'AAA' collate utf8_lcase
+-- !query analysis
+Project [(collate(aaa, utf8_lcase) = collate(AAA, utf8_lcase)) AS 
(collate(aaa, utf8_lcase) = collate(AAA, utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_lcase = 'bbb' collate utf8_lcase
+-- !query analysis
+Project [(collate(aaa, utf8_lcase) = collate(bbb, utf8_lcase)) AS 
(collate(aaa, utf8_lcase) = collate(bbb, utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_lcase_rtrim = 'AAA  ' collate utf8_lcase_rtrim
+-- !query analysis
+Project [(collate(aaa, utf8_lcase_rtrim) = collate(AAA  , utf8_lcase_rtrim)) 
AS (collate(aaa, utf8_lcase_rtrim) = collate(AAA  , utf8_lcase_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_lcase_rtrim = 'bbb' collate utf8_lcase_rtrim
+-- !query analysis
+Project [(collate(aaa, utf8_lcase_rtrim) = collate(bbb, utf8_lcase_rtrim)) AS 
(collate(aaa, utf8_lcase_rtrim) = collate(bbb, utf8_lcase_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode = 'aaa' collate unicode
+-- !query analysis
+Project [(collate(aaa, unicode) = collate(aaa, unicode)) AS (collate(aaa, 
unicode) = collate(aaa, unicode))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode = 'AAA' collate unicode
+-- !query analysis
+Project [(collate(aaa, unicode) = collate(AAA, unicode)) AS (collate(aaa, 
unicode) = collate(AAA, unicode))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa  ' collate unicode_rtrim = 'aaa ' collate unicode_rtrim
+-- !query analysis
+Project [(collate(aaa  , unicode_rtrim) = collate(aaa , unicode_rtrim)) AS 
(collate(aaa  , unicode_rtrim) = collate(aaa , unicode_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_rtrim = 'AAA' collate unicode_rtrim
+-- !query analysis
+Project [(collate(aaa, unicode_rtrim) = collate(AAA, unicode_rtrim)) AS 
(collate(aaa, unicode_rtrim) = collate(AAA, unicode_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_CI = 'aaa' collate unicode_CI
+-- !query analysis
+Project [(collate(aaa, unicode_CI) = collate(aaa, unicode_CI)) AS 
(collate(aaa, unicode_CI) = collate(aaa, unicode_CI))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_CI = 'AAA' collate unicode_CI
+-- !query analysis
+Project [(collate(aaa, unicode_CI) = collate(AAA, unicode_CI)) AS 
(collate(aaa, unicode_CI) = collate(AAA, unicode_CI))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_CI = 'bbb' collate unicode_CI
+-- !query analysis
+Project [(collate(aaa, unicode_CI) = collate(bbb, unicode_CI)) AS 
(collate(aaa, unicode_CI) = collate(bbb, unicode_CI))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_CI_rtrim = 'aaa' collate unicode_CI_rtrim
+-- !query analysis
+Project [(collate(aaa, unicode_CI_rtrim) = collate(aaa, unicode_CI_rtrim)) AS 
(collate(aaa, unicode_CI_rtrim) = collate(aaa, unicode_CI_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa ' collate unicode_CI_rtrim = 'AAA  ' collate unicode_CI_rtrim
+-- !query analysis
+Project [(collate(aaa , unicode_CI_rtrim) = collate(AAA  , unicode_CI_rtrim)) 
AS (collate(aaa , unicode_CI_rtrim) = collate(AAA  , unicode_CI_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_CI_rtrim = 'bbb' collate unicode_CI_rtrim
+-- !query analysis
+Project [(collate(aaa, unicode_CI_rtrim) = collate(bbb, unicode_CI_rtrim)) AS 
(collate(aaa, unicode_CI_rtrim) = collate(bbb, unicode_CI_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select collate('aaa', 'utf8_binary') = collate('AAA', 'utf8_binary')
+-- !query analysis
+Project [(collate(aaa, utf8_binary) = collate(AAA, utf8_binary)) AS 
(collate(aaa, utf8_binary) = collate(AAA, utf8_binary))#x]
++- OneRowRelation
+
+
+-- !query
+select collate('aaa', 'utf8_lcase') = collate('AAA', 'utf8_lcase')
+-- !query analysis
+Project [(collate(aaa, utf8_lcase) = collate(AAA, utf8_lcase)) AS 
(collate(aaa, utf8_lcase) = collate(AAA, utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select collate('aaa', 'unicode_CI') = collate('bbb', 'unicode_CI')
+-- !query analysis
+Project [(collate(aaa, unicode_CI) = collate(bbb, unicode_CI)) AS 
(collate(aaa, unicode_CI) = collate(bbb, unicode_CI))#x]
++- OneRowRelation
+
+
+-- !query
+select 'AAA' collate utf8_binary < 'aaa' collate utf8_binary
+-- !query analysis
+Project [(collate(AAA, utf8_binary) < collate(aaa, utf8_binary)) AS 
(collate(AAA, utf8_binary) < collate(aaa, utf8_binary))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_binary < 'aaa' collate utf8_binary
+-- !query analysis
+Project [(collate(aaa, utf8_binary) < collate(aaa, utf8_binary)) AS 
(collate(aaa, utf8_binary) < collate(aaa, utf8_binary))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_binary < 'BBB' collate utf8_binary
+-- !query analysis
+Project [(collate(aaa, utf8_binary) < collate(BBB, utf8_binary)) AS 
(collate(aaa, utf8_binary) < collate(BBB, utf8_binary))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa ' collate utf8_binary_rtrim < 'aaa  ' collate utf8_binary_rtrim
+-- !query analysis
+Project [(collate(aaa , utf8_binary_rtrim) < collate(aaa  , 
utf8_binary_rtrim)) AS (collate(aaa , utf8_binary_rtrim) < collate(aaa  , 
utf8_binary_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_lcase < 'aaa' collate utf8_lcase
+-- !query analysis
+Project [(collate(aaa, utf8_lcase) < collate(aaa, utf8_lcase)) AS 
(collate(aaa, utf8_lcase) < collate(aaa, utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select 'AAA' collate utf8_lcase < 'aaa' collate utf8_lcase
+-- !query analysis
+Project [(collate(AAA, utf8_lcase) < collate(aaa, utf8_lcase)) AS 
(collate(AAA, utf8_lcase) < collate(aaa, utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate utf8_lcase < 'bbb' collate utf8_lcase
+-- !query analysis
+Project [(collate(aaa, utf8_lcase) < collate(bbb, utf8_lcase)) AS 
(collate(aaa, utf8_lcase) < collate(bbb, utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select 'AAA  ' collate utf8_lcase_rtrim < 'aaa' collate utf8_lcase_rtrim
+-- !query analysis
+Project [(collate(AAA  , utf8_lcase_rtrim) < collate(aaa, utf8_lcase_rtrim)) 
AS (collate(AAA  , utf8_lcase_rtrim) < collate(aaa, utf8_lcase_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode < 'aaa' collate unicode
+-- !query analysis
+Project [(collate(aaa, unicode) < collate(aaa, unicode)) AS (collate(aaa, 
unicode) < collate(aaa, unicode))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode < 'AAA' collate unicode
+-- !query analysis
+Project [(collate(aaa, unicode) < collate(AAA, unicode)) AS (collate(aaa, 
unicode) < collate(AAA, unicode))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode < 'BBB' collate unicode
+-- !query analysis
+Project [(collate(aaa, unicode) < collate(BBB, unicode)) AS (collate(aaa, 
unicode) < collate(BBB, unicode))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa ' collate unicode_rtrim < 'aaa' collate unicode_rtrim
+-- !query analysis
+Project [(collate(aaa , unicode_rtrim) < collate(aaa, unicode_rtrim)) AS 
(collate(aaa , unicode_rtrim) < collate(aaa, unicode_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_CI < 'aaa' collate unicode_CI
+-- !query analysis
+Project [(collate(aaa, unicode_CI) < collate(aaa, unicode_CI)) AS 
(collate(aaa, unicode_CI) < collate(aaa, unicode_CI))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_CI < 'AAA' collate unicode_CI
+-- !query analysis
+Project [(collate(aaa, unicode_CI) < collate(AAA, unicode_CI)) AS 
(collate(aaa, unicode_CI) < collate(AAA, unicode_CI))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate unicode_CI < 'bbb' collate unicode_CI
+-- !query analysis
+Project [(collate(aaa, unicode_CI) < collate(bbb, unicode_CI)) AS 
(collate(aaa, unicode_CI) < collate(bbb, unicode_CI))#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa ' collate unicode_CI_rtrim < 'aaa' collate unicode_CI_rtrim
+-- !query analysis
+Project [(collate(aaa , unicode_CI_rtrim) < collate(aaa, unicode_CI_rtrim)) AS 
(collate(aaa , unicode_CI_rtrim) < collate(aaa, unicode_CI_rtrim))#x]
++- OneRowRelation
+
+
+-- !query
+select collate('AAA', 'utf8_binary') < collate('aaa', 'utf8_binary')
+-- !query analysis
+Project [(collate(AAA, utf8_binary) < collate(aaa, utf8_binary)) AS 
(collate(AAA, utf8_binary) < collate(aaa, utf8_binary))#x]
++- OneRowRelation
+
+
+-- !query
+select collate('aaa', 'utf8_lcase') < collate('bbb', 'utf8_lcase')
+-- !query analysis
+Project [(collate(aaa, utf8_lcase) < collate(bbb, utf8_lcase)) AS 
(collate(aaa, utf8_lcase) < collate(bbb, utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_binary') as c from values 
('AAA'), ('aaa')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, utf8_binary) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_binary') as c from values 
('aaa'), ('aaa')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, utf8_binary) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_binary') as c from values 
('aaa'), ('bbb')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, utf8_binary) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_binary_rtrim') as c from 
values ('aaa'), ('aaa ')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, utf8_binary_rtrim) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_lcase') as c from values 
('aaa'), ('aaa')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, utf8_lcase) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_lcase') as c from values 
('AAA'), ('aaa')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, utf8_lcase) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_lcase') as c from values 
('aaa'), ('bbb')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, utf8_lcase) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_lcase_rtrim') as c from 
values ('aaa'), ('AAA  ')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, utf8_lcase_rtrim) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode') as c from values 
('AAA'), ('aaa')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, unicode) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode') as c from values 
('aaa'), ('aaa')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, unicode) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode') as c from values 
('aaa'), ('bbb')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, unicode) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_rtrim') as c from 
values ('aaa'), ('aaa ')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, unicode_rtrim) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_CI') as c from values 
('aaa'), ('aaa')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, unicode_CI) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_CI') as c from values 
('AAA'), ('aaa')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, unicode_CI) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_CI') as c from values 
('aaa'), ('bbb')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, unicode_CI) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_CI_rtrim') as c from 
values ('aaa'), ('AAA ')) t group by c order by c
+-- !query analysis
+Sort [c#x ASC NULLS FIRST], true
++- Aggregate [c#x], [count(1) AS count(1)#xL, c#x]
+   +- SubqueryAlias t
+      +- Project [collate(col1#x, unicode_CI_rtrim) AS c#x]
+         +- LocalRelation [col1#x]
+
+
+-- !query
+SELECT collation(cast('a' as string collate utf8_lcase))
+-- !query analysis
+Project [collation(cast(a as string collate UTF8_LCASE)) AS collation(CAST(a 
AS STRING COLLATE UTF8_LCASE))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT collation('a' :: string collate utf8_lcase)
+-- !query analysis
+Project [collation(cast(a as string collate UTF8_LCASE)) AS collation(CAST(a 
AS STRING COLLATE UTF8_LCASE))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT cast(1 as string)
+-- !query analysis
+Project [cast(1 as string) AS CAST(1 AS STRING)#x]
++- OneRowRelation
+
+
+-- !query
+SELECT cast('A' as string)
+-- !query analysis
+Project [cast(A as string) AS CAST(A AS STRING)#x]
++- OneRowRelation
+
+
+-- !query
+select reverse('abc' collate utf8_lcase)
+-- !query analysis
+Project [reverse(collate(abc, utf8_lcase)) AS reverse(collate(abc, 
utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select reverse(array('a' collate utf8_lcase, 'b' collate utf8_lcase))
+-- !query analysis
+Project [reverse(array(collate(a, utf8_lcase), collate(b, utf8_lcase))) AS 
reverse(array(collate(a, utf8_lcase), collate(b, utf8_lcase)))#x]
++- OneRowRelation
+
+
+-- !query
+select array_join(array('a' collate utf8_lcase, 'b' collate utf8_lcase), ', ' 
collate utf8_lcase)
+-- !query analysis
+Project [array_join(array(collate(a, utf8_lcase), collate(b, utf8_lcase)), 
collate(, , utf8_lcase), None) AS array_join(array(collate(a, utf8_lcase), 
collate(b, utf8_lcase)), collate(, , utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select array_join(array('a' collate utf8_lcase, 'b' collate utf8_lcase, null), 
', ' collate utf8_lcase, 'c' collate utf8_lcase)
+-- !query analysis
+Project [array_join(array(collate(a, utf8_lcase), collate(b, utf8_lcase), 
cast(null as string collate UTF8_LCASE)), collate(, , utf8_lcase), 
Some(collate(c, utf8_lcase))) AS array_join(array(collate(a, utf8_lcase), 
collate(b, utf8_lcase), NULL), collate(, , utf8_lcase), collate(c, 
utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select concat('a' collate utf8_lcase, 'b' collate utf8_lcase)
+-- !query analysis
+Project [concat(collate(a, utf8_lcase), collate(b, utf8_lcase)) AS 
concat(collate(a, utf8_lcase), collate(b, utf8_lcase))#x]
++- OneRowRelation
+
+
+-- !query
+select concat(array('a' collate utf8_lcase, 'b' collate utf8_lcase))
+-- !query analysis
+Project [concat(array(collate(a, utf8_lcase), collate(b, utf8_lcase))) AS 
concat(array(collate(a, utf8_lcase), collate(b, utf8_lcase)))#x]
++- OneRowRelation
+
+
+-- !query
+select map('a' collate utf8_lcase, 1, 'b' collate utf8_lcase, 2)['A' collate 
utf8_lcase]
+-- !query analysis
+Project [map(collate(a, utf8_lcase), 1, collate(b, utf8_lcase), 2)[collate(A, 
utf8_lcase)] AS map(collate(a, utf8_lcase), 1, collate(b, utf8_lcase), 
2)[collate(A, utf8_lcase)]#x]
++- OneRowRelation
+
+
+-- !query
+select map('a' collate utf8_lcase, 1, 'b' collate utf8_lcase, 2)['A']
+-- !query analysis
+Project [map(collate(a, utf8_lcase), 1, collate(b, utf8_lcase), 2)[cast(A as 
string collate UTF8_LCASE)] AS map(collate(a, utf8_lcase), 1, collate(b, 
utf8_lcase), 2)[A]#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 'c' = 'ć' COLLATE SR_Latn_AI
+-- !query analysis
+Project [(c = collate(ć, SR_Latn_AI)) AS ('c' collate sr_Latn_AI = collate(ć, 
SR_Latn_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 'c' = 'ć' COLLATE SR_AI
+-- !query analysis
+Project [(c = collate(ć, SR_AI)) AS ('c' collate sr_AI = collate(ć, SR_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 'ć' = 'č' COLLATE SR_Latn_AI
+-- !query analysis
+Project [(ć = collate(č, SR_Latn_AI)) AS ('ć' collate sr_Latn_AI = collate(č, 
SR_Latn_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 'ć' = 'č' COLLATE SR_AI
+-- !query analysis
+Project [(ć = collate(č, SR_AI)) AS ('ć' collate sr_AI = collate(č, SR_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 'C' = 'Ć' COLLATE SR_Latn_AI
+-- !query analysis
+Project [(C = collate(Ć, SR_Latn_AI)) AS ('C' collate sr_Latn_AI = collate(Ć, 
SR_Latn_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 'C' = 'Ć' COLLATE SR_AI
+-- !query analysis
+Project [(C = collate(Ć, SR_AI)) AS ('C' collate sr_AI = collate(Ć, SR_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 's' = 'š' COLLATE SR_Latn_AI
+-- !query analysis
+Project [(s = collate(š, SR_Latn_AI)) AS ('s' collate sr_Latn_AI = collate(š, 
SR_Latn_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 's' = 'š' COLLATE SR_AI
+-- !query analysis
+Project [(s = collate(š, SR_AI)) AS ('s' collate sr_AI = collate(š, SR_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 'z' = 'ž' COLLATE SR_Latn_AI
+-- !query analysis
+Project [(z = collate(ž, SR_Latn_AI)) AS ('z' collate sr_Latn_AI = collate(ž, 
SR_Latn_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 'z' = 'ž' COLLATE SR_AI
+-- !query analysis
+Project [(z = collate(ž, SR_AI)) AS ('z' collate sr_AI = collate(ž, SR_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT collation('a' collate system.builtin.UTF8_BINARY)
+-- !query analysis
+Project [collation(collate(a, UTF8_BINARY)) AS collation(collate(a, 
UTF8_BINARY))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT collation('a' collate system.builtin.UTF8_LCASE)
+-- !query analysis
+Project [collation(collate(a, UTF8_LCASE)) AS collation(collate(a, 
UTF8_LCASE))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT collation('a' collate system.builtin.UNICODE)
+-- !query analysis
+Project [collation(collate(a, UNICODE)) AS collation(collate(a, UNICODE))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT collation('a' collate system.builtin.UNICODE_CI_AI)
+-- !query analysis
+Project [collation(collate(a, UNICODE_CI_AI)) AS collation(collate(a, 
UNICODE_CI_AI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT 'a' collate sYstEm.bUiltIn.utf8_lCAse = 'A'
+-- !query analysis
+Project [(collate(a, utf8_lCAse) = A) AS (collate(a, utf8_lCAse) = 'A' collate 
UTF8_LCASE)#x]
++- OneRowRelation
+
+
+-- !query
+SELECT contains('a' collate system.builtin.UTF8_LCASE, 'A' collate UTF8_LCASE)
+-- !query analysis
+Project [Contains(collate(a, UTF8_LCASE), collate(A, UTF8_LCASE)) AS 
contains(collate(a, UTF8_LCASE), collate(A, UTF8_LCASE))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT startswith('a' collate system.builtin.UNICODE_CI, 'A' collate 
UNICODE_CI)
+-- !query analysis
+Project [StartsWith(collate(a, UNICODE_CI), collate(A, UNICODE_CI)) AS 
startswith(collate(a, UNICODE_CI), collate(A, UNICODE_CI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT endswith('abc' collate system.builtin.UNICODE_CI, 'C' collate 
UNICODE_CI)
+-- !query analysis
+Project [EndsWith(collate(abc, UNICODE_CI), collate(C, UNICODE_CI)) AS 
endswith(collate(abc, UNICODE_CI), collate(C, UNICODE_CI))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT array_append(array('a', 'b'), 'c' COLLATE UNICODE)
+-- !query analysis
+Project [array_append(cast(array(a, b) as array<string collate UNICODE>), 
collate(c, UNICODE)) AS array_append(array(a, b), collate(c, UNICODE))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT typeof(array('a' COLLATE UNICODE, 'b')[1])
+-- !query analysis
+Project [typeof(array(collate(a, UNICODE), b)[1]) AS typeof(array(collate(a, 
UNICODE), 'b' collate UNICODE)[1])#x]
++- OneRowRelation
+
+
+-- !query
+select map('a' COLLATE UTF8_LCASE, 'b', 'c', 'c')
+-- !query analysis
+Project [map(collate(a, UTF8_LCASE), b, c, c) AS map(collate(a, UTF8_LCASE), 
b, 'c' collate UTF8_LCASE, c)#x]
++- OneRowRelation
+
+
+-- !query
+select 'aaa' collate UTF8_BS
+-- !query analysis
+org.apache.spark.SparkException
+{
+  "errorClass" : "COLLATION_INVALID_NAME",
+  "sqlState" : "42704",
+  "messageParameters" : {
+    "collationName" : "UTF8_BS",
+    "proposals" : "UTF8_LCASE"
+  }
+}
+
+
+-- !query
+select collate('aaa', 'a', 'b')
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION",
+  "sqlState" : "42605",
+  "messageParameters" : {
+    "actualNum" : "3",
+    "docroot" : "https://spark.apache.org/docs/latest";,
+    "expectedNum" : "2",
+    "functionName" : "`collate`"
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 31,
+    "fragment" : "collate('aaa', 'a', 'b')"
+  } ]
+}
+
+
+-- !query
+select collate('aaa')
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION",
+  "sqlState" : "42605",
+  "messageParameters" : {
+    "actualNum" : "1",
+    "docroot" : "https://spark.apache.org/docs/latest";,
+    "expectedNum" : "2",
+    "functionName" : "`collate`"
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 21,
+    "fragment" : "collate('aaa')"
+  } ]
+}
+
+
+-- !query
+select collate()
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION",
+  "sqlState" : "42605",
+  "messageParameters" : {
+    "actualNum" : "0",
+    "docroot" : "https://spark.apache.org/docs/latest";,
+    "expectedNum" : "2",
+    "functionName" : "`collate`"
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 16,
+    "fragment" : "collate()"
+  } ]
+}
+
+
+-- !query
+select collate('abc', 123)
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "UNEXPECTED_INPUT_TYPE",
+  "sqlState" : "42K09",
+  "messageParameters" : {
+    "functionName" : "`collate`",
+    "inputSql" : "\"123\"",
+    "inputType" : "\"INT\"",
+    "paramIndex" : "first",
+    "requiredType" : "\"STRING\""
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 26,
+    "fragment" : "collate('abc', 123)"
+  } ]
+}
+
+
+-- !query
+select collate('abc', cast(null as string))
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_NULL",
+  "sqlState" : "42K09",
+  "messageParameters" : {
+    "exprName" : "`collation`",
+    "sqlExpr" : "\"CAST(NULL AS STRING)\""
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 43,
+    "fragment" : "collate('abc', cast(null as string))"
+  } ]
+}
+
+
+-- !query
+select collate(1, 'UTF8_BINARY')
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+  "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+  "sqlState" : "42K09",
+  "messageParameters" : {
+    "inputSql" : "\"1\"",
+    "inputType" : "\"INT\"",
+    "paramIndex" : "first",
+    "requiredType" : "\"STRING\"",
+    "sqlExpr" : "\"collate(1, UTF8_BINARY)\""
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 32,
+    "fragment" : "collate(1, 'UTF8_BINARY')"
+  } ]
+}
+
+
+-- !query
+SELECT contains(collate('abc', 'UNICODE_CI'), collate('b', 'UNICODE'))
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE_CI\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+SELECT startsWith(collate('abc', 'UNICODE_CI'), collate('a', 'UNICODE'))
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE_CI\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+SELECT endsWith(collate('abc', 'UNICODE_CI'), collate('c', 'UNICODE'))
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE_CI\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+SELECT COLLATE('a', 'UTF8_BINARY') = COLLATE('a', 'UNICODE')
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UTF8_BINARY\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+SELECT array('A', 'a' COLLATE UNICODE) == array('b' COLLATE UNICODE_CI)
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE\", \"STRING COLLATE 
UNICODE_CI\""
+  }
+}
+
+
+-- !query
+SELECT array('A', 'a' COLLATE UNICODE) == array('b' COLLATE UNICODE_CI_RTRIM)
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE\", \"STRING COLLATE 
UNICODE_CI_RTRIM\""
+  }
+}
+
+
+-- !query
+SELECT array_join(array('a', 'b' collate UNICODE), 'c' collate UNICODE_CI)
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE\", \"STRING COLLATE 
UNICODE_CI\""
+  }
+}
+
+
+-- !query
+SELECT 'a' COLLATE system.builtin2.UTF8_BINARY
+-- !query analysis
+org.apache.spark.SparkException
+{
+  "errorClass" : "COLLATION_INVALID_NAME",
+  "sqlState" : "42704",
+  "messageParameters" : {
+    "collationName" : "UTF8_BINARY",
+    "proposals" : "UTF8_BINARY"
+  }
+}
+
+
+-- !query
+SELECT 'a' COLLATE system.UTF8_BINARY
+-- !query analysis
+org.apache.spark.SparkException
+{
+  "errorClass" : "COLLATION_INVALID_NAME",
+  "sqlState" : "42704",
+  "messageParameters" : {
+    "collationName" : "UTF8_BINARY",
+    "proposals" : "UTF8_BINARY"
+  }
+}
+
+
+-- !query
+SELECT 'a' COLLATE builtin.UTF8_LCASE
+-- !query analysis
+org.apache.spark.SparkException
+{
+  "errorClass" : "COLLATION_INVALID_NAME",
+  "sqlState" : "42704",
+  "messageParameters" : {
+    "collationName" : "UTF8_LCASE",
+    "proposals" : "UTF8_LCASE"
+  }
+}
+
+
+-- !query
+SELECT * FROM VALUES ('a' COLLATE UTF8_LCASE), ('b' COLLATE UNICODE) AS T(c1)
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "INVALID_INLINE_TABLE.INCOMPATIBLE_TYPES_IN_INLINE_TABLE",
+  "sqlState" : "42000",
+  "messageParameters" : {
+    "colName" : "`c1`"
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 15,
+    "stopIndex" : 77,
+    "fragment" : "VALUES ('a' COLLATE UTF8_LCASE), ('b' COLLATE UNICODE) AS 
T(c1)"
+  } ]
+}
+
+
+-- !query
+select map('a' COLLATE UTF8_LCASE, 'b', 'c' COLLATE UNICODE, 'c')
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UTF8_LCASE\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+select map('a' COLLATE UTF8_LCASE, 'b', 'c')
+-- !query analysis
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION",
+  "sqlState" : "42605",
+  "messageParameters" : {
+    "actualNum" : "3",
+    "docroot" : "https://spark.apache.org/docs/latest";,
+    "expectedNum" : "2n (n > 0)",
+    "functionName" : "`map`"
+  }
+}
diff --git a/sql/core/src/test/resources/sql-tests/inputs/collations-basic.sql 
b/sql/core/src/test/resources/sql-tests/inputs/collations-basic.sql
index bd94b1729684..d23905f82012 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/collations-basic.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/collations-basic.sql
@@ -217,3 +217,232 @@ drop table t1;
 drop table t2;
 drop table t3;
 drop table t4;
+
+-- ============================================================================
+-- Collate returns proper type
+-- ============================================================================
+select 'aaa' collate utf8_binary;
+select 'aaa' collate utf8_lcase;
+select 'aaa' collate unicode;
+select 'aaa' collate unicode_ci;
+
+-- collation name is case insensitive
+select 'aaa' collate uTf8_BiNaRy;
+select 'aaa' collate uNicOde;
+select 'aaa' collate UNICODE_ci;
+select 'aaa' collate UtF8_lCaSE_rtRIM;
+
+-- ============================================================================
+-- Collation expression returns name of collation
+-- ============================================================================
+select collation('aaa' collate utf8_binary);
+select collation('aaa' collate utf8_lcase);
+select collation('aaa' collate unicode);
+select collation('aaa' collate unicode_ci);
+select collation('aaa' collate unicode_ci_rtrim);
+select collation('aaa' collate utf8_lcase_rtrim);
+select collation('aaa' collate utf8_binary_rtrim);
+
+-- collation expression returns default collation
+select collation('aaa');
+
+-- ============================================================================
+-- Collate function syntax
+-- ============================================================================
+select collate('aaa', 'utf8_binary');
+select collate('aaa', 'utf8_lcase');
+select collate('aaa', 'utf8_binary_rtrim');
+select collate('aaa', 'utf8_lcase_rtrim');
+
+-- ============================================================================
+-- Equality check respects collation
+-- ============================================================================
+select 'aaa' collate utf8_binary = 'AAA' collate utf8_binary;
+select 'aaa' collate utf8_binary = 'aaa' collate utf8_binary;
+select 'aaa' collate utf8_binary_rtrim = 'AAA' collate utf8_binary_rtrim;
+select 'aaa' collate utf8_binary_rtrim = 'aaa  ' collate utf8_binary_rtrim;
+select 'aaa' collate utf8_lcase = 'aaa' collate utf8_lcase;
+select 'aaa' collate utf8_lcase = 'AAA' collate utf8_lcase;
+select 'aaa' collate utf8_lcase = 'bbb' collate utf8_lcase;
+select 'aaa' collate utf8_lcase_rtrim = 'AAA  ' collate utf8_lcase_rtrim;
+select 'aaa' collate utf8_lcase_rtrim = 'bbb' collate utf8_lcase_rtrim;
+select 'aaa' collate unicode = 'aaa' collate unicode;
+select 'aaa' collate unicode = 'AAA' collate unicode;
+select 'aaa  ' collate unicode_rtrim = 'aaa ' collate unicode_rtrim;
+select 'aaa' collate unicode_rtrim = 'AAA' collate unicode_rtrim;
+select 'aaa' collate unicode_CI = 'aaa' collate unicode_CI;
+select 'aaa' collate unicode_CI = 'AAA' collate unicode_CI;
+select 'aaa' collate unicode_CI = 'bbb' collate unicode_CI;
+select 'aaa' collate unicode_CI_rtrim = 'aaa' collate unicode_CI_rtrim;
+select 'aaa ' collate unicode_CI_rtrim = 'AAA  ' collate unicode_CI_rtrim;
+select 'aaa' collate unicode_CI_rtrim = 'bbb' collate unicode_CI_rtrim;
+-- equality with collate function syntax
+select collate('aaa', 'utf8_binary') = collate('AAA', 'utf8_binary');
+select collate('aaa', 'utf8_lcase') = collate('AAA', 'utf8_lcase');
+select collate('aaa', 'unicode_CI') = collate('bbb', 'unicode_CI');
+
+-- ============================================================================
+-- Comparisons respect collation
+-- ============================================================================
+select 'AAA' collate utf8_binary < 'aaa' collate utf8_binary;
+select 'aaa' collate utf8_binary < 'aaa' collate utf8_binary;
+select 'aaa' collate utf8_binary < 'BBB' collate utf8_binary;
+select 'aaa ' collate utf8_binary_rtrim < 'aaa  ' collate utf8_binary_rtrim;
+select 'aaa' collate utf8_lcase < 'aaa' collate utf8_lcase;
+select 'AAA' collate utf8_lcase < 'aaa' collate utf8_lcase;
+select 'aaa' collate utf8_lcase < 'bbb' collate utf8_lcase;
+select 'AAA  ' collate utf8_lcase_rtrim < 'aaa' collate utf8_lcase_rtrim;
+select 'aaa' collate unicode < 'aaa' collate unicode;
+select 'aaa' collate unicode < 'AAA' collate unicode;
+select 'aaa' collate unicode < 'BBB' collate unicode;
+select 'aaa ' collate unicode_rtrim < 'aaa' collate unicode_rtrim;
+select 'aaa' collate unicode_CI < 'aaa' collate unicode_CI;
+select 'aaa' collate unicode_CI < 'AAA' collate unicode_CI;
+select 'aaa' collate unicode_CI < 'bbb' collate unicode_CI;
+select 'aaa ' collate unicode_CI_rtrim < 'aaa' collate unicode_CI_rtrim;
+-- comparisons with collate function syntax
+select collate('AAA', 'utf8_binary') < collate('aaa', 'utf8_binary');
+select collate('aaa', 'utf8_lcase') < collate('bbb', 'utf8_lcase');
+
+-- ============================================================================
+-- Aggregates count respects collation
+-- ============================================================================
+select count(*), c from (select collate(col1, 'utf8_binary') as c from values 
('AAA'), ('aaa')) t group by c order by c;
+select count(*), c from (select collate(col1, 'utf8_binary') as c from values 
('aaa'), ('aaa')) t group by c order by c;
+select count(*), c from (select collate(col1, 'utf8_binary') as c from values 
('aaa'), ('bbb')) t group by c order by c;
+select count(*), c from (select collate(col1, 'utf8_binary_rtrim') as c from 
values ('aaa'), ('aaa ')) t group by c order by c;
+select count(*), c from (select collate(col1, 'utf8_lcase') as c from values 
('aaa'), ('aaa')) t group by c order by c;
+select count(*), c from (select collate(col1, 'utf8_lcase') as c from values 
('AAA'), ('aaa')) t group by c order by c;
+select count(*), c from (select collate(col1, 'utf8_lcase') as c from values 
('aaa'), ('bbb')) t group by c order by c;
+select count(*), c from (select collate(col1, 'utf8_lcase_rtrim') as c from 
values ('aaa'), ('AAA  ')) t group by c order by c;
+select count(*), c from (select collate(col1, 'unicode') as c from values 
('AAA'), ('aaa')) t group by c order by c;
+select count(*), c from (select collate(col1, 'unicode') as c from values 
('aaa'), ('aaa')) t group by c order by c;
+select count(*), c from (select collate(col1, 'unicode') as c from values 
('aaa'), ('bbb')) t group by c order by c;
+select count(*), c from (select collate(col1, 'unicode_rtrim') as c from 
values ('aaa'), ('aaa ')) t group by c order by c;
+select count(*), c from (select collate(col1, 'unicode_CI') as c from values 
('aaa'), ('aaa')) t group by c order by c;
+select count(*), c from (select collate(col1, 'unicode_CI') as c from values 
('AAA'), ('aaa')) t group by c order by c;
+select count(*), c from (select collate(col1, 'unicode_CI') as c from values 
('aaa'), ('bbb')) t group by c order by c;
+select count(*), c from (select collate(col1, 'unicode_CI_rtrim') as c from 
values ('aaa'), ('AAA ')) t group by c order by c;
+
+-- ============================================================================
+-- Cast expressions for collations
+-- ============================================================================
+SELECT collation(cast('a' as string collate utf8_lcase));
+SELECT collation('a' :: string collate utf8_lcase);
+SELECT cast(1 as string);
+SELECT cast('A' as string);
+
+-- ============================================================================
+-- Operations on complex types containing collated strings
+-- ============================================================================
+select reverse('abc' collate utf8_lcase);
+select reverse(array('a' collate utf8_lcase, 'b' collate utf8_lcase));
+select array_join(array('a' collate utf8_lcase, 'b' collate utf8_lcase), ', ' 
collate utf8_lcase);
+select array_join(array('a' collate utf8_lcase, 'b' collate utf8_lcase, null), 
', ' collate utf8_lcase, 'c' collate utf8_lcase);
+select concat('a' collate utf8_lcase, 'b' collate utf8_lcase);
+select concat(array('a' collate utf8_lcase, 'b' collate utf8_lcase));
+select map('a' collate utf8_lcase, 1, 'b' collate utf8_lcase, 2)['A' collate 
utf8_lcase];
+select map('a' collate utf8_lcase, 1, 'b' collate utf8_lcase, 2)['A'];
+
+-- ============================================================================
+-- SR_AI vs SR_Latn_AI collation differences
+-- ============================================================================
+-- scalastyle:off nonascii
+SELECT 'c' = 'ć' COLLATE SR_Latn_AI;
+SELECT 'c' = 'ć' COLLATE SR_AI;
+SELECT 'ć' = 'č' COLLATE SR_Latn_AI;
+SELECT 'ć' = 'č' COLLATE SR_AI;
+SELECT 'C' = 'Ć' COLLATE SR_Latn_AI;
+SELECT 'C' = 'Ć' COLLATE SR_AI;
+SELECT 's' = 'š' COLLATE SR_Latn_AI;
+SELECT 's' = 'š' COLLATE SR_AI;
+SELECT 'z' = 'ž' COLLATE SR_Latn_AI;
+SELECT 'z' = 'ž' COLLATE SR_AI;
+-- scalastyle:on nonascii
+
+-- ============================================================================
+-- Fully qualified collation names
+-- ============================================================================
+SELECT collation('a' collate system.builtin.UTF8_BINARY);
+SELECT collation('a' collate system.builtin.UTF8_LCASE);
+SELECT collation('a' collate system.builtin.UNICODE);
+SELECT collation('a' collate system.builtin.UNICODE_CI_AI);
+SELECT 'a' collate sYstEm.bUiltIn.utf8_lCAse = 'A';
+SELECT contains('a' collate system.builtin.UTF8_LCASE, 'A' collate UTF8_LCASE);
+SELECT startswith('a' collate system.builtin.UNICODE_CI, 'A' collate 
UNICODE_CI);
+SELECT endswith('abc' collate system.builtin.UNICODE_CI, 'C' collate 
UNICODE_CI);
+
+-- ============================================================================
+-- ArrayAppend and CreateMap coercion
+-- ============================================================================
+SELECT array_append(array('a', 'b'), 'c' COLLATE UNICODE);
+SELECT typeof(array('a' COLLATE UNICODE, 'b')[1]);
+select map('a' COLLATE UTF8_LCASE, 'b', 'c', 'c');
+
+-- ============================================================================
+-- Error: invalid collation name
+-- ============================================================================
+select 'aaa' collate UTF8_BS;
+
+-- ============================================================================
+-- Error: collate function syntax invalid arg count
+-- ============================================================================
+select collate('aaa', 'a', 'b');
+select collate('aaa');
+select collate();
+
+-- ============================================================================
+-- Error: collate function invalid collation data type
+-- ============================================================================
+select collate('abc', 123);
+
+-- ============================================================================
+-- Error: NULL as collation name
+-- ============================================================================
+select collate('abc', cast(null as string));
+
+-- ============================================================================
+-- Error: collate function invalid input data type
+-- ============================================================================
+select collate(1, 'UTF8_BINARY');
+
+-- ============================================================================
+-- Error: collation mismatch for string functions
+-- ============================================================================
+SELECT contains(collate('abc', 'UNICODE_CI'), collate('b', 'UNICODE'));
+SELECT startsWith(collate('abc', 'UNICODE_CI'), collate('a', 'UNICODE'));
+SELECT endsWith(collate('abc', 'UNICODE_CI'), collate('c', 'UNICODE'));
+
+-- ============================================================================
+-- Error: explicit collation mismatch
+-- ============================================================================
+SELECT COLLATE('a', 'UTF8_BINARY') = COLLATE('a', 'UNICODE');
+
+-- ============================================================================
+-- Error: array collation mismatch
+-- ============================================================================
+SELECT array('A', 'a' COLLATE UNICODE) == array('b' COLLATE UNICODE_CI);
+SELECT array('A', 'a' COLLATE UNICODE) == array('b' COLLATE UNICODE_CI_RTRIM);
+SELECT array_join(array('a', 'b' collate UNICODE), 'c' collate UNICODE_CI);
+
+-- ============================================================================
+-- Error: invalid fully qualified collation names
+-- ============================================================================
+SELECT 'a' COLLATE system.builtin2.UTF8_BINARY;
+SELECT 'a' COLLATE system.UTF8_BINARY;
+SELECT 'a' COLLATE builtin.UTF8_LCASE;
+
+-- ============================================================================
+-- Error: conflicting collations in inline table
+-- ============================================================================
+SELECT * FROM VALUES ('a' COLLATE UTF8_LCASE), ('b' COLLATE UNICODE) AS T(c1);
+
+-- ============================================================================
+-- Error: map creation with collation mismatch
+-- ============================================================================
+select map('a' COLLATE UTF8_LCASE, 'b', 'c' COLLATE UNICODE, 'c');
+
+-- ============================================================================
+-- Error: map creation with wrong number of args
+-- ============================================================================
+select map('a' COLLATE UTF8_LCASE, 'b', 'c');
diff --git 
a/sql/core/src/test/resources/sql-tests/results/collations-basic.sql.out 
b/sql/core/src/test/resources/sql-tests/results/collations-basic.sql.out
index 77c79539ed0f..a971a10a253b 100644
--- a/sql/core/src/test/resources/sql-tests/results/collations-basic.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/collations-basic.sql.out
@@ -1784,3 +1784,1255 @@ drop table t4
 struct<>
 -- !query output
 
+
+
+-- !query
+select 'aaa' collate utf8_binary
+-- !query schema
+struct<collate(aaa, utf8_binary):string collate UTF8_BINARY>
+-- !query output
+aaa
+
+
+-- !query
+select 'aaa' collate utf8_lcase
+-- !query schema
+struct<collate(aaa, utf8_lcase):string collate UTF8_LCASE>
+-- !query output
+aaa
+
+
+-- !query
+select 'aaa' collate unicode
+-- !query schema
+struct<collate(aaa, unicode):string collate UNICODE>
+-- !query output
+aaa
+
+
+-- !query
+select 'aaa' collate unicode_ci
+-- !query schema
+struct<collate(aaa, unicode_ci):string collate UNICODE_CI>
+-- !query output
+aaa
+
+
+-- !query
+select 'aaa' collate uTf8_BiNaRy
+-- !query schema
+struct<collate(aaa, uTf8_BiNaRy):string collate UTF8_BINARY>
+-- !query output
+aaa
+
+
+-- !query
+select 'aaa' collate uNicOde
+-- !query schema
+struct<collate(aaa, uNicOde):string collate UNICODE>
+-- !query output
+aaa
+
+
+-- !query
+select 'aaa' collate UNICODE_ci
+-- !query schema
+struct<collate(aaa, UNICODE_ci):string collate UNICODE_CI>
+-- !query output
+aaa
+
+
+-- !query
+select 'aaa' collate UtF8_lCaSE_rtRIM
+-- !query schema
+struct<collate(aaa, UtF8_lCaSE_rtRIM):string collate UTF8_LCASE_RTRIM>
+-- !query output
+aaa
+
+
+-- !query
+select collation('aaa' collate utf8_binary)
+-- !query schema
+struct<collation(collate(aaa, utf8_binary)):string>
+-- !query output
+SYSTEM.BUILTIN.UTF8_BINARY
+
+
+-- !query
+select collation('aaa' collate utf8_lcase)
+-- !query schema
+struct<collation(collate(aaa, utf8_lcase)):string>
+-- !query output
+SYSTEM.BUILTIN.UTF8_LCASE
+
+
+-- !query
+select collation('aaa' collate unicode)
+-- !query schema
+struct<collation(collate(aaa, unicode)):string>
+-- !query output
+SYSTEM.BUILTIN.UNICODE
+
+
+-- !query
+select collation('aaa' collate unicode_ci)
+-- !query schema
+struct<collation(collate(aaa, unicode_ci)):string>
+-- !query output
+SYSTEM.BUILTIN.UNICODE_CI
+
+
+-- !query
+select collation('aaa' collate unicode_ci_rtrim)
+-- !query schema
+struct<collation(collate(aaa, unicode_ci_rtrim)):string>
+-- !query output
+SYSTEM.BUILTIN.UNICODE_CI_RTRIM
+
+
+-- !query
+select collation('aaa' collate utf8_lcase_rtrim)
+-- !query schema
+struct<collation(collate(aaa, utf8_lcase_rtrim)):string>
+-- !query output
+SYSTEM.BUILTIN.UTF8_LCASE_RTRIM
+
+
+-- !query
+select collation('aaa' collate utf8_binary_rtrim)
+-- !query schema
+struct<collation(collate(aaa, utf8_binary_rtrim)):string>
+-- !query output
+SYSTEM.BUILTIN.UTF8_BINARY_RTRIM
+
+
+-- !query
+select collation('aaa')
+-- !query schema
+struct<collation(aaa):string>
+-- !query output
+SYSTEM.BUILTIN.UTF8_BINARY
+
+
+-- !query
+select collate('aaa', 'utf8_binary')
+-- !query schema
+struct<collate(aaa, utf8_binary):string collate UTF8_BINARY>
+-- !query output
+aaa
+
+
+-- !query
+select collate('aaa', 'utf8_lcase')
+-- !query schema
+struct<collate(aaa, utf8_lcase):string collate UTF8_LCASE>
+-- !query output
+aaa
+
+
+-- !query
+select collate('aaa', 'utf8_binary_rtrim')
+-- !query schema
+struct<collate(aaa, utf8_binary_rtrim):string collate UTF8_BINARY_RTRIM>
+-- !query output
+aaa
+
+
+-- !query
+select collate('aaa', 'utf8_lcase_rtrim')
+-- !query schema
+struct<collate(aaa, utf8_lcase_rtrim):string collate UTF8_LCASE_RTRIM>
+-- !query output
+aaa
+
+
+-- !query
+select 'aaa' collate utf8_binary = 'AAA' collate utf8_binary
+-- !query schema
+struct<(collate(aaa, utf8_binary) = collate(AAA, utf8_binary)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate utf8_binary = 'aaa' collate utf8_binary
+-- !query schema
+struct<(collate(aaa, utf8_binary) = collate(aaa, utf8_binary)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate utf8_binary_rtrim = 'AAA' collate utf8_binary_rtrim
+-- !query schema
+struct<(collate(aaa, utf8_binary_rtrim) = collate(AAA, 
utf8_binary_rtrim)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate utf8_binary_rtrim = 'aaa  ' collate utf8_binary_rtrim
+-- !query schema
+struct<(collate(aaa, utf8_binary_rtrim) = collate(aaa  , 
utf8_binary_rtrim)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate utf8_lcase = 'aaa' collate utf8_lcase
+-- !query schema
+struct<(collate(aaa, utf8_lcase) = collate(aaa, utf8_lcase)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate utf8_lcase = 'AAA' collate utf8_lcase
+-- !query schema
+struct<(collate(aaa, utf8_lcase) = collate(AAA, utf8_lcase)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate utf8_lcase = 'bbb' collate utf8_lcase
+-- !query schema
+struct<(collate(aaa, utf8_lcase) = collate(bbb, utf8_lcase)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate utf8_lcase_rtrim = 'AAA  ' collate utf8_lcase_rtrim
+-- !query schema
+struct<(collate(aaa, utf8_lcase_rtrim) = collate(AAA  , 
utf8_lcase_rtrim)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate utf8_lcase_rtrim = 'bbb' collate utf8_lcase_rtrim
+-- !query schema
+struct<(collate(aaa, utf8_lcase_rtrim) = collate(bbb, 
utf8_lcase_rtrim)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate unicode = 'aaa' collate unicode
+-- !query schema
+struct<(collate(aaa, unicode) = collate(aaa, unicode)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate unicode = 'AAA' collate unicode
+-- !query schema
+struct<(collate(aaa, unicode) = collate(AAA, unicode)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa  ' collate unicode_rtrim = 'aaa ' collate unicode_rtrim
+-- !query schema
+struct<(collate(aaa  , unicode_rtrim) = collate(aaa , unicode_rtrim)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate unicode_rtrim = 'AAA' collate unicode_rtrim
+-- !query schema
+struct<(collate(aaa, unicode_rtrim) = collate(AAA, unicode_rtrim)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate unicode_CI = 'aaa' collate unicode_CI
+-- !query schema
+struct<(collate(aaa, unicode_CI) = collate(aaa, unicode_CI)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate unicode_CI = 'AAA' collate unicode_CI
+-- !query schema
+struct<(collate(aaa, unicode_CI) = collate(AAA, unicode_CI)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate unicode_CI = 'bbb' collate unicode_CI
+-- !query schema
+struct<(collate(aaa, unicode_CI) = collate(bbb, unicode_CI)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate unicode_CI_rtrim = 'aaa' collate unicode_CI_rtrim
+-- !query schema
+struct<(collate(aaa, unicode_CI_rtrim) = collate(aaa, 
unicode_CI_rtrim)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa ' collate unicode_CI_rtrim = 'AAA  ' collate unicode_CI_rtrim
+-- !query schema
+struct<(collate(aaa , unicode_CI_rtrim) = collate(AAA  , 
unicode_CI_rtrim)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate unicode_CI_rtrim = 'bbb' collate unicode_CI_rtrim
+-- !query schema
+struct<(collate(aaa, unicode_CI_rtrim) = collate(bbb, 
unicode_CI_rtrim)):boolean>
+-- !query output
+false
+
+
+-- !query
+select collate('aaa', 'utf8_binary') = collate('AAA', 'utf8_binary')
+-- !query schema
+struct<(collate(aaa, utf8_binary) = collate(AAA, utf8_binary)):boolean>
+-- !query output
+false
+
+
+-- !query
+select collate('aaa', 'utf8_lcase') = collate('AAA', 'utf8_lcase')
+-- !query schema
+struct<(collate(aaa, utf8_lcase) = collate(AAA, utf8_lcase)):boolean>
+-- !query output
+true
+
+
+-- !query
+select collate('aaa', 'unicode_CI') = collate('bbb', 'unicode_CI')
+-- !query schema
+struct<(collate(aaa, unicode_CI) = collate(bbb, unicode_CI)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'AAA' collate utf8_binary < 'aaa' collate utf8_binary
+-- !query schema
+struct<(collate(AAA, utf8_binary) < collate(aaa, utf8_binary)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate utf8_binary < 'aaa' collate utf8_binary
+-- !query schema
+struct<(collate(aaa, utf8_binary) < collate(aaa, utf8_binary)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate utf8_binary < 'BBB' collate utf8_binary
+-- !query schema
+struct<(collate(aaa, utf8_binary) < collate(BBB, utf8_binary)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa ' collate utf8_binary_rtrim < 'aaa  ' collate utf8_binary_rtrim
+-- !query schema
+struct<(collate(aaa , utf8_binary_rtrim) < collate(aaa  , 
utf8_binary_rtrim)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate utf8_lcase < 'aaa' collate utf8_lcase
+-- !query schema
+struct<(collate(aaa, utf8_lcase) < collate(aaa, utf8_lcase)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'AAA' collate utf8_lcase < 'aaa' collate utf8_lcase
+-- !query schema
+struct<(collate(AAA, utf8_lcase) < collate(aaa, utf8_lcase)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate utf8_lcase < 'bbb' collate utf8_lcase
+-- !query schema
+struct<(collate(aaa, utf8_lcase) < collate(bbb, utf8_lcase)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'AAA  ' collate utf8_lcase_rtrim < 'aaa' collate utf8_lcase_rtrim
+-- !query schema
+struct<(collate(AAA  , utf8_lcase_rtrim) < collate(aaa, 
utf8_lcase_rtrim)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate unicode < 'aaa' collate unicode
+-- !query schema
+struct<(collate(aaa, unicode) < collate(aaa, unicode)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate unicode < 'AAA' collate unicode
+-- !query schema
+struct<(collate(aaa, unicode) < collate(AAA, unicode)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa' collate unicode < 'BBB' collate unicode
+-- !query schema
+struct<(collate(aaa, unicode) < collate(BBB, unicode)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa ' collate unicode_rtrim < 'aaa' collate unicode_rtrim
+-- !query schema
+struct<(collate(aaa , unicode_rtrim) < collate(aaa, unicode_rtrim)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate unicode_CI < 'aaa' collate unicode_CI
+-- !query schema
+struct<(collate(aaa, unicode_CI) < collate(aaa, unicode_CI)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate unicode_CI < 'AAA' collate unicode_CI
+-- !query schema
+struct<(collate(aaa, unicode_CI) < collate(AAA, unicode_CI)):boolean>
+-- !query output
+false
+
+
+-- !query
+select 'aaa' collate unicode_CI < 'bbb' collate unicode_CI
+-- !query schema
+struct<(collate(aaa, unicode_CI) < collate(bbb, unicode_CI)):boolean>
+-- !query output
+true
+
+
+-- !query
+select 'aaa ' collate unicode_CI_rtrim < 'aaa' collate unicode_CI_rtrim
+-- !query schema
+struct<(collate(aaa , unicode_CI_rtrim) < collate(aaa, 
unicode_CI_rtrim)):boolean>
+-- !query output
+false
+
+
+-- !query
+select collate('AAA', 'utf8_binary') < collate('aaa', 'utf8_binary')
+-- !query schema
+struct<(collate(AAA, utf8_binary) < collate(aaa, utf8_binary)):boolean>
+-- !query output
+true
+
+
+-- !query
+select collate('aaa', 'utf8_lcase') < collate('bbb', 'utf8_lcase')
+-- !query schema
+struct<(collate(aaa, utf8_lcase) < collate(bbb, utf8_lcase)):boolean>
+-- !query output
+true
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_binary') as c from values 
('AAA'), ('aaa')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UTF8_BINARY>
+-- !query output
+1      AAA
+1      aaa
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_binary') as c from values 
('aaa'), ('aaa')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UTF8_BINARY>
+-- !query output
+2      aaa
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_binary') as c from values 
('aaa'), ('bbb')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UTF8_BINARY>
+-- !query output
+1      aaa
+1      bbb
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_binary_rtrim') as c from 
values ('aaa'), ('aaa ')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UTF8_BINARY_RTRIM>
+-- !query output
+2      aaa
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_lcase') as c from values 
('aaa'), ('aaa')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UTF8_LCASE>
+-- !query output
+2      aaa
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_lcase') as c from values 
('AAA'), ('aaa')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UTF8_LCASE>
+-- !query output
+2      AAA
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_lcase') as c from values 
('aaa'), ('bbb')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UTF8_LCASE>
+-- !query output
+1      aaa
+1      bbb
+
+
+-- !query
+select count(*), c from (select collate(col1, 'utf8_lcase_rtrim') as c from 
values ('aaa'), ('AAA  ')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UTF8_LCASE_RTRIM>
+-- !query output
+2      aaa
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode') as c from values 
('AAA'), ('aaa')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UNICODE>
+-- !query output
+1      aaa
+1      AAA
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode') as c from values 
('aaa'), ('aaa')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UNICODE>
+-- !query output
+2      aaa
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode') as c from values 
('aaa'), ('bbb')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UNICODE>
+-- !query output
+1      aaa
+1      bbb
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_rtrim') as c from 
values ('aaa'), ('aaa ')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UNICODE_RTRIM>
+-- !query output
+2      aaa
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_CI') as c from values 
('aaa'), ('aaa')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UNICODE_CI>
+-- !query output
+2      aaa
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_CI') as c from values 
('AAA'), ('aaa')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UNICODE_CI>
+-- !query output
+2      AAA
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_CI') as c from values 
('aaa'), ('bbb')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UNICODE_CI>
+-- !query output
+1      aaa
+1      bbb
+
+
+-- !query
+select count(*), c from (select collate(col1, 'unicode_CI_rtrim') as c from 
values ('aaa'), ('AAA ')) t group by c order by c
+-- !query schema
+struct<count(1):bigint,c:string collate UNICODE_CI_RTRIM>
+-- !query output
+2      aaa
+
+
+-- !query
+SELECT collation(cast('a' as string collate utf8_lcase))
+-- !query schema
+struct<collation(CAST(a AS STRING COLLATE UTF8_LCASE)):string>
+-- !query output
+SYSTEM.BUILTIN.UTF8_LCASE
+
+
+-- !query
+SELECT collation('a' :: string collate utf8_lcase)
+-- !query schema
+struct<collation(CAST(a AS STRING COLLATE UTF8_LCASE)):string>
+-- !query output
+SYSTEM.BUILTIN.UTF8_LCASE
+
+
+-- !query
+SELECT cast(1 as string)
+-- !query schema
+struct<CAST(1 AS STRING):string>
+-- !query output
+1
+
+
+-- !query
+SELECT cast('A' as string)
+-- !query schema
+struct<CAST(A AS STRING):string>
+-- !query output
+A
+
+
+-- !query
+select reverse('abc' collate utf8_lcase)
+-- !query schema
+struct<reverse(collate(abc, utf8_lcase)):string collate UTF8_LCASE>
+-- !query output
+cba
+
+
+-- !query
+select reverse(array('a' collate utf8_lcase, 'b' collate utf8_lcase))
+-- !query schema
+struct<reverse(array(collate(a, utf8_lcase), collate(b, 
utf8_lcase))):array<string collate UTF8_LCASE>>
+-- !query output
+["b","a"]
+
+
+-- !query
+select array_join(array('a' collate utf8_lcase, 'b' collate utf8_lcase), ', ' 
collate utf8_lcase)
+-- !query schema
+struct<array_join(array(collate(a, utf8_lcase), collate(b, utf8_lcase)), 
collate(, , utf8_lcase)):string collate UTF8_LCASE>
+-- !query output
+a, b
+
+
+-- !query
+select array_join(array('a' collate utf8_lcase, 'b' collate utf8_lcase, null), 
', ' collate utf8_lcase, 'c' collate utf8_lcase)
+-- !query schema
+struct<array_join(array(collate(a, utf8_lcase), collate(b, utf8_lcase), NULL), 
collate(, , utf8_lcase), collate(c, utf8_lcase)):string collate UTF8_LCASE>
+-- !query output
+a, b, c
+
+
+-- !query
+select concat('a' collate utf8_lcase, 'b' collate utf8_lcase)
+-- !query schema
+struct<concat(collate(a, utf8_lcase), collate(b, utf8_lcase)):string collate 
UTF8_LCASE>
+-- !query output
+ab
+
+
+-- !query
+select concat(array('a' collate utf8_lcase, 'b' collate utf8_lcase))
+-- !query schema
+struct<concat(array(collate(a, utf8_lcase), collate(b, 
utf8_lcase))):array<string collate UTF8_LCASE>>
+-- !query output
+["a","b"]
+
+
+-- !query
+select map('a' collate utf8_lcase, 1, 'b' collate utf8_lcase, 2)['A' collate 
utf8_lcase]
+-- !query schema
+struct<map(collate(a, utf8_lcase), 1, collate(b, utf8_lcase), 2)[collate(A, 
utf8_lcase)]:int>
+-- !query output
+1
+
+
+-- !query
+select map('a' collate utf8_lcase, 1, 'b' collate utf8_lcase, 2)['A']
+-- !query schema
+struct<map(collate(a, utf8_lcase), 1, collate(b, utf8_lcase), 2)[A]:int>
+-- !query output
+1
+
+
+-- !query
+SELECT 'c' = 'ć' COLLATE SR_Latn_AI
+-- !query schema
+struct<('c' collate sr_Latn_AI = collate(ć, SR_Latn_AI)):boolean>
+-- !query output
+false
+
+
+-- !query
+SELECT 'c' = 'ć' COLLATE SR_AI
+-- !query schema
+struct<('c' collate sr_AI = collate(ć, SR_AI)):boolean>
+-- !query output
+true
+
+
+-- !query
+SELECT 'ć' = 'č' COLLATE SR_Latn_AI
+-- !query schema
+struct<('ć' collate sr_Latn_AI = collate(č, SR_Latn_AI)):boolean>
+-- !query output
+false
+
+
+-- !query
+SELECT 'ć' = 'č' COLLATE SR_AI
+-- !query schema
+struct<('ć' collate sr_AI = collate(č, SR_AI)):boolean>
+-- !query output
+true
+
+
+-- !query
+SELECT 'C' = 'Ć' COLLATE SR_Latn_AI
+-- !query schema
+struct<('C' collate sr_Latn_AI = collate(Ć, SR_Latn_AI)):boolean>
+-- !query output
+false
+
+
+-- !query
+SELECT 'C' = 'Ć' COLLATE SR_AI
+-- !query schema
+struct<('C' collate sr_AI = collate(Ć, SR_AI)):boolean>
+-- !query output
+true
+
+
+-- !query
+SELECT 's' = 'š' COLLATE SR_Latn_AI
+-- !query schema
+struct<('s' collate sr_Latn_AI = collate(š, SR_Latn_AI)):boolean>
+-- !query output
+false
+
+
+-- !query
+SELECT 's' = 'š' COLLATE SR_AI
+-- !query schema
+struct<('s' collate sr_AI = collate(š, SR_AI)):boolean>
+-- !query output
+true
+
+
+-- !query
+SELECT 'z' = 'ž' COLLATE SR_Latn_AI
+-- !query schema
+struct<('z' collate sr_Latn_AI = collate(ž, SR_Latn_AI)):boolean>
+-- !query output
+false
+
+
+-- !query
+SELECT 'z' = 'ž' COLLATE SR_AI
+-- !query schema
+struct<('z' collate sr_AI = collate(ž, SR_AI)):boolean>
+-- !query output
+true
+
+
+-- !query
+SELECT collation('a' collate system.builtin.UTF8_BINARY)
+-- !query schema
+struct<collation(collate(a, UTF8_BINARY)):string>
+-- !query output
+SYSTEM.BUILTIN.UTF8_BINARY
+
+
+-- !query
+SELECT collation('a' collate system.builtin.UTF8_LCASE)
+-- !query schema
+struct<collation(collate(a, UTF8_LCASE)):string>
+-- !query output
+SYSTEM.BUILTIN.UTF8_LCASE
+
+
+-- !query
+SELECT collation('a' collate system.builtin.UNICODE)
+-- !query schema
+struct<collation(collate(a, UNICODE)):string>
+-- !query output
+SYSTEM.BUILTIN.UNICODE
+
+
+-- !query
+SELECT collation('a' collate system.builtin.UNICODE_CI_AI)
+-- !query schema
+struct<collation(collate(a, UNICODE_CI_AI)):string>
+-- !query output
+SYSTEM.BUILTIN.UNICODE_CI_AI
+
+
+-- !query
+SELECT 'a' collate sYstEm.bUiltIn.utf8_lCAse = 'A'
+-- !query schema
+struct<(collate(a, utf8_lCAse) = 'A' collate UTF8_LCASE):boolean>
+-- !query output
+true
+
+
+-- !query
+SELECT contains('a' collate system.builtin.UTF8_LCASE, 'A' collate UTF8_LCASE)
+-- !query schema
+struct<contains(collate(a, UTF8_LCASE), collate(A, UTF8_LCASE)):boolean>
+-- !query output
+true
+
+
+-- !query
+SELECT startswith('a' collate system.builtin.UNICODE_CI, 'A' collate 
UNICODE_CI)
+-- !query schema
+struct<startswith(collate(a, UNICODE_CI), collate(A, UNICODE_CI)):boolean>
+-- !query output
+true
+
+
+-- !query
+SELECT endswith('abc' collate system.builtin.UNICODE_CI, 'C' collate 
UNICODE_CI)
+-- !query schema
+struct<endswith(collate(abc, UNICODE_CI), collate(C, UNICODE_CI)):boolean>
+-- !query output
+true
+
+
+-- !query
+SELECT array_append(array('a', 'b'), 'c' COLLATE UNICODE)
+-- !query schema
+struct<array_append(array(a, b), collate(c, UNICODE)):array<string collate 
UNICODE>>
+-- !query output
+["a","b","c"]
+
+
+-- !query
+SELECT typeof(array('a' COLLATE UNICODE, 'b')[1])
+-- !query schema
+struct<typeof(array(collate(a, UNICODE), 'b' collate UNICODE)[1]):string>
+-- !query output
+string collate UNICODE
+
+
+-- !query
+select map('a' COLLATE UTF8_LCASE, 'b', 'c', 'c')
+-- !query schema
+struct<map(collate(a, UTF8_LCASE), b, 'c' collate UTF8_LCASE, c):map<string 
collate UTF8_LCASE,string>>
+-- !query output
+{"a":"b","c":"c"}
+
+
+-- !query
+select 'aaa' collate UTF8_BS
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkException
+{
+  "errorClass" : "COLLATION_INVALID_NAME",
+  "sqlState" : "42704",
+  "messageParameters" : {
+    "collationName" : "UTF8_BS",
+    "proposals" : "UTF8_LCASE"
+  }
+}
+
+
+-- !query
+select collate('aaa', 'a', 'b')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION",
+  "sqlState" : "42605",
+  "messageParameters" : {
+    "actualNum" : "3",
+    "docroot" : "https://spark.apache.org/docs/latest";,
+    "expectedNum" : "2",
+    "functionName" : "`collate`"
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 31,
+    "fragment" : "collate('aaa', 'a', 'b')"
+  } ]
+}
+
+
+-- !query
+select collate('aaa')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION",
+  "sqlState" : "42605",
+  "messageParameters" : {
+    "actualNum" : "1",
+    "docroot" : "https://spark.apache.org/docs/latest";,
+    "expectedNum" : "2",
+    "functionName" : "`collate`"
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 21,
+    "fragment" : "collate('aaa')"
+  } ]
+}
+
+
+-- !query
+select collate()
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION",
+  "sqlState" : "42605",
+  "messageParameters" : {
+    "actualNum" : "0",
+    "docroot" : "https://spark.apache.org/docs/latest";,
+    "expectedNum" : "2",
+    "functionName" : "`collate`"
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 16,
+    "fragment" : "collate()"
+  } ]
+}
+
+
+-- !query
+select collate('abc', 123)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "UNEXPECTED_INPUT_TYPE",
+  "sqlState" : "42K09",
+  "messageParameters" : {
+    "functionName" : "`collate`",
+    "inputSql" : "\"123\"",
+    "inputType" : "\"INT\"",
+    "paramIndex" : "first",
+    "requiredType" : "\"STRING\""
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 26,
+    "fragment" : "collate('abc', 123)"
+  } ]
+}
+
+
+-- !query
+select collate('abc', cast(null as string))
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_NULL",
+  "sqlState" : "42K09",
+  "messageParameters" : {
+    "exprName" : "`collation`",
+    "sqlExpr" : "\"CAST(NULL AS STRING)\""
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 43,
+    "fragment" : "collate('abc', cast(null as string))"
+  } ]
+}
+
+
+-- !query
+select collate(1, 'UTF8_BINARY')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+  "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+  "sqlState" : "42K09",
+  "messageParameters" : {
+    "inputSql" : "\"1\"",
+    "inputType" : "\"INT\"",
+    "paramIndex" : "first",
+    "requiredType" : "\"STRING\"",
+    "sqlExpr" : "\"collate(1, UTF8_BINARY)\""
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 8,
+    "stopIndex" : 32,
+    "fragment" : "collate(1, 'UTF8_BINARY')"
+  } ]
+}
+
+
+-- !query
+SELECT contains(collate('abc', 'UNICODE_CI'), collate('b', 'UNICODE'))
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE_CI\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+SELECT startsWith(collate('abc', 'UNICODE_CI'), collate('a', 'UNICODE'))
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE_CI\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+SELECT endsWith(collate('abc', 'UNICODE_CI'), collate('c', 'UNICODE'))
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE_CI\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+SELECT COLLATE('a', 'UTF8_BINARY') = COLLATE('a', 'UNICODE')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UTF8_BINARY\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+SELECT array('A', 'a' COLLATE UNICODE) == array('b' COLLATE UNICODE_CI)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE\", \"STRING COLLATE 
UNICODE_CI\""
+  }
+}
+
+
+-- !query
+SELECT array('A', 'a' COLLATE UNICODE) == array('b' COLLATE UNICODE_CI_RTRIM)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE\", \"STRING COLLATE 
UNICODE_CI_RTRIM\""
+  }
+}
+
+
+-- !query
+SELECT array_join(array('a', 'b' collate UNICODE), 'c' collate UNICODE_CI)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UNICODE\", \"STRING COLLATE 
UNICODE_CI\""
+  }
+}
+
+
+-- !query
+SELECT 'a' COLLATE system.builtin2.UTF8_BINARY
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkException
+{
+  "errorClass" : "COLLATION_INVALID_NAME",
+  "sqlState" : "42704",
+  "messageParameters" : {
+    "collationName" : "UTF8_BINARY",
+    "proposals" : "UTF8_BINARY"
+  }
+}
+
+
+-- !query
+SELECT 'a' COLLATE system.UTF8_BINARY
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkException
+{
+  "errorClass" : "COLLATION_INVALID_NAME",
+  "sqlState" : "42704",
+  "messageParameters" : {
+    "collationName" : "UTF8_BINARY",
+    "proposals" : "UTF8_BINARY"
+  }
+}
+
+
+-- !query
+SELECT 'a' COLLATE builtin.UTF8_LCASE
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkException
+{
+  "errorClass" : "COLLATION_INVALID_NAME",
+  "sqlState" : "42704",
+  "messageParameters" : {
+    "collationName" : "UTF8_LCASE",
+    "proposals" : "UTF8_LCASE"
+  }
+}
+
+
+-- !query
+SELECT * FROM VALUES ('a' COLLATE UTF8_LCASE), ('b' COLLATE UNICODE) AS T(c1)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "INVALID_INLINE_TABLE.INCOMPATIBLE_TYPES_IN_INLINE_TABLE",
+  "sqlState" : "42000",
+  "messageParameters" : {
+    "colName" : "`c1`"
+  },
+  "queryContext" : [ {
+    "objectType" : "",
+    "objectName" : "",
+    "startIndex" : 15,
+    "stopIndex" : 77,
+    "fragment" : "VALUES ('a' COLLATE UTF8_LCASE), ('b' COLLATE UNICODE) AS 
T(c1)"
+  } ]
+}
+
+
+-- !query
+select map('a' COLLATE UTF8_LCASE, 'b', 'c' COLLATE UNICODE, 'c')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "COLLATION_MISMATCH.EXPLICIT",
+  "sqlState" : "42P21",
+  "messageParameters" : {
+    "explicitTypes" : "\"STRING COLLATE UTF8_LCASE\", \"STRING COLLATE 
UNICODE\""
+  }
+}
+
+
+-- !query
+select map('a' COLLATE UTF8_LCASE, 'b', 'c')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.AnalysisException
+{
+  "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION",
+  "sqlState" : "42605",
+  "messageParameters" : {
+    "actualNum" : "3",
+    "docroot" : "https://spark.apache.org/docs/latest";,
+    "expectedNum" : "2n (n > 0)",
+    "functionName" : "`map`"
+  }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to