1818package org .apache .spark .sql .catalyst .parser
1919
2020import org .apache .spark .SparkFunSuite
21- import org .apache .spark .sql .catalyst .expressions .{Alias , EqualTo , Expression , In , Literal , ScalarSubquery }
21+ import org .apache .spark .sql .catalyst .expressions .{In , Literal , ScalarSubquery }
2222import org .apache .spark .sql .catalyst .plans .SQLHelper
23- import org .apache .spark .sql .catalyst .plans .logical .{CaseStatement , CompoundBody , CreateVariable , ExceptionHandler , ForStatement , IfElseStatement , IterateStatement , LeaveStatement , LoopStatement , Project , RepeatStatement , SetVariable , SingleStatement , WhileStatement }
23+ import org .apache .spark .sql .catalyst .plans .logical .{CompoundBody , CreateVariable , ExceptionHandler , ForStatement , IfElseStatement , IterateStatement , LeaveStatement , LoopStatement , Project , RepeatStatement , SearchedCaseStatement , SetVariable , SimpleCaseStatement , SingleStatement , WhileStatement }
2424import org .apache .spark .sql .errors .DataTypeErrors .toSQLId
2525import org .apache .spark .sql .exceptions .SqlScriptingException
2626import org .apache .spark .sql .internal .SQLConf
@@ -1462,8 +1462,8 @@ class SqlScriptingParserSuite extends SparkFunSuite with SQLHelper {
14621462 |""" .stripMargin
14631463 val tree = parsePlan(sqlScriptText).asInstanceOf [CompoundBody ]
14641464 assert(tree.collection.length == 1 )
1465- assert(tree.collection.head.isInstanceOf [CaseStatement ])
1466- val caseStmt = tree.collection.head.asInstanceOf [CaseStatement ]
1465+ assert(tree.collection.head.isInstanceOf [SearchedCaseStatement ])
1466+ val caseStmt = tree.collection.head.asInstanceOf [SearchedCaseStatement ]
14671467 assert(caseStmt.conditions.length == 1 )
14681468 assert(caseStmt.conditions.head.isInstanceOf [SingleStatement ])
14691469 assert(caseStmt.conditions.head.getText == " 1 = 1" )
@@ -1502,9 +1502,9 @@ class SqlScriptingParserSuite extends SparkFunSuite with SQLHelper {
15021502 val tree = parsePlan(sqlScriptText).asInstanceOf [CompoundBody ]
15031503
15041504 assert(tree.collection.length == 1 )
1505- assert(tree.collection.head.isInstanceOf [CaseStatement ])
1505+ assert(tree.collection.head.isInstanceOf [SearchedCaseStatement ])
15061506
1507- val caseStmt = tree.collection.head.asInstanceOf [CaseStatement ]
1507+ val caseStmt = tree.collection.head.asInstanceOf [SearchedCaseStatement ]
15081508 assert(caseStmt.conditions.length == 3 )
15091509 assert(caseStmt.conditionalBodies.length == 3 )
15101510 assert(caseStmt.elseBody.isEmpty)
@@ -1545,8 +1545,8 @@ class SqlScriptingParserSuite extends SparkFunSuite with SQLHelper {
15451545 |""" .stripMargin
15461546 val tree = parsePlan(sqlScriptText).asInstanceOf [CompoundBody ]
15471547 assert(tree.collection.length == 1 )
1548- assert(tree.collection.head.isInstanceOf [CaseStatement ])
1549- val caseStmt = tree.collection.head.asInstanceOf [CaseStatement ]
1548+ assert(tree.collection.head.isInstanceOf [SearchedCaseStatement ])
1549+ val caseStmt = tree.collection.head.asInstanceOf [SearchedCaseStatement ]
15501550 assert(caseStmt.elseBody.isDefined)
15511551 assert(caseStmt.conditions.length == 1 )
15521552 assert(caseStmt.conditions.head.isInstanceOf [SingleStatement ])
@@ -1574,19 +1574,19 @@ class SqlScriptingParserSuite extends SparkFunSuite with SQLHelper {
15741574 |""" .stripMargin
15751575 val tree = parsePlan(sqlScriptText).asInstanceOf [CompoundBody ]
15761576 assert(tree.collection.length == 1 )
1577- assert(tree.collection.head.isInstanceOf [CaseStatement ])
1577+ assert(tree.collection.head.isInstanceOf [SearchedCaseStatement ])
15781578
1579- val caseStmt = tree.collection.head.asInstanceOf [CaseStatement ]
1579+ val caseStmt = tree.collection.head.asInstanceOf [SearchedCaseStatement ]
15801580 assert(caseStmt.conditions.length == 1 )
15811581 assert(caseStmt.conditionalBodies.length == 1 )
15821582 assert(caseStmt.elseBody.isEmpty)
15831583
15841584 assert(caseStmt.conditions.head.isInstanceOf [SingleStatement ])
15851585 assert(caseStmt.conditions.head.getText == " 1 = 1" )
15861586
1587- assert(caseStmt.conditionalBodies.head.collection.head.isInstanceOf [CaseStatement ])
1587+ assert(caseStmt.conditionalBodies.head.collection.head.isInstanceOf [SearchedCaseStatement ])
15881588 val nestedCaseStmt =
1589- caseStmt.conditionalBodies.head.collection.head.asInstanceOf [CaseStatement ]
1589+ caseStmt.conditionalBodies.head.collection.head.asInstanceOf [SearchedCaseStatement ]
15901590
15911591 assert(nestedCaseStmt.conditions.length == 1 )
15921592 assert(nestedCaseStmt.conditionalBodies.length == 1 )
@@ -1616,11 +1616,15 @@ class SqlScriptingParserSuite extends SparkFunSuite with SQLHelper {
16161616 |""" .stripMargin
16171617 val tree = parsePlan(sqlScriptText).asInstanceOf [CompoundBody ]
16181618 assert(tree.collection.length == 1 )
1619- assert(tree.collection.head.isInstanceOf [CaseStatement ])
1620- val caseStmt = tree.collection.head.asInstanceOf [CaseStatement ]
1621- assert(caseStmt.conditions.length == 1 )
1622- assert(caseStmt.conditions.head.isInstanceOf [SingleStatement ])
1623- checkSimpleCaseStatementCondition(caseStmt.conditions.head, _ == Literal (1 ), _ == Literal (1 ))
1619+ assert(tree.collection.head.isInstanceOf [SimpleCaseStatement ])
1620+ val caseStmt = tree.collection.head.asInstanceOf [SimpleCaseStatement ]
1621+ assert(caseStmt.caseVariableExpression == Literal (1 ))
1622+ assert(caseStmt.conditionExpressions.length == 1 )
1623+ assert(caseStmt.conditionExpressions.head == Literal (1 ))
1624+
1625+ assert(caseStmt.conditionalBodies.length == 1 )
1626+ assert(caseStmt.conditionalBodies.head.collection.head.asInstanceOf [SingleStatement ]
1627+ .getText == " SELECT 1" )
16241628 }
16251629
16261630 test(" simple case statement with empty body" ) {
@@ -1656,31 +1660,27 @@ class SqlScriptingParserSuite extends SparkFunSuite with SQLHelper {
16561660 val tree = parsePlan(sqlScriptText).asInstanceOf [CompoundBody ]
16571661
16581662 assert(tree.collection.length == 1 )
1659- assert(tree.collection.head.isInstanceOf [CaseStatement ])
1663+ assert(tree.collection.head.isInstanceOf [SimpleCaseStatement ])
16601664
1661- val caseStmt = tree.collection.head.asInstanceOf [CaseStatement ]
1662- assert(caseStmt.conditions.length == 3 )
1665+ val caseStmt = tree.collection.head.asInstanceOf [SimpleCaseStatement ]
1666+ assert(caseStmt.caseVariableExpression == Literal (1 ))
1667+ assert(caseStmt.conditionExpressions.length == 3 )
16631668 assert(caseStmt.conditionalBodies.length == 3 )
16641669 assert(caseStmt.elseBody.isEmpty)
16651670
1666- assert(caseStmt.conditions.head.isInstanceOf [SingleStatement ])
1667- checkSimpleCaseStatementCondition(caseStmt.conditions.head, _ == Literal (1 ), _ == Literal (1 ))
1671+ assert(caseStmt.conditionExpressions.head == Literal (1 ))
16681672
16691673 assert(caseStmt.conditionalBodies.head.collection.head.isInstanceOf [SingleStatement ])
16701674 assert(caseStmt.conditionalBodies.head.collection.head.asInstanceOf [SingleStatement ]
16711675 .getText == " SELECT 1" )
16721676
1673- assert(caseStmt.conditions(1 ).isInstanceOf [SingleStatement ])
1674- checkSimpleCaseStatementCondition(
1675- caseStmt.conditions(1 ), _ == Literal (1 ), _.isInstanceOf [ScalarSubquery ])
1677+ assert(caseStmt.conditionExpressions(1 ).isInstanceOf [ScalarSubquery ])
16761678
16771679 assert(caseStmt.conditionalBodies(1 ).collection.head.isInstanceOf [SingleStatement ])
16781680 assert(caseStmt.conditionalBodies(1 ).collection.head.asInstanceOf [SingleStatement ]
16791681 .getText == " SELECT * FROM b" )
16801682
1681- assert(caseStmt.conditions(2 ).isInstanceOf [SingleStatement ])
1682- checkSimpleCaseStatementCondition(
1683- caseStmt.conditions(2 ), _ == Literal (1 ), _.isInstanceOf [In ])
1683+ assert(caseStmt.conditionExpressions(2 ).isInstanceOf [In ])
16841684
16851685 assert(caseStmt.conditionalBodies(2 ).collection.head.isInstanceOf [SingleStatement ])
16861686 assert(caseStmt.conditionalBodies(2 ).collection.head.asInstanceOf [SingleStatement ]
@@ -1701,12 +1701,17 @@ class SqlScriptingParserSuite extends SparkFunSuite with SQLHelper {
17011701 |""" .stripMargin
17021702 val tree = parsePlan(sqlScriptText).asInstanceOf [CompoundBody ]
17031703 assert(tree.collection.length == 1 )
1704- assert(tree.collection.head.isInstanceOf [CaseStatement ])
1705- val caseStmt = tree.collection.head.asInstanceOf [CaseStatement ]
1704+ assert(tree.collection.head.isInstanceOf [SimpleCaseStatement ])
1705+ val caseStmt = tree.collection.head.asInstanceOf [SimpleCaseStatement ]
1706+
1707+ assert(caseStmt.caseVariableExpression == Literal (1 ))
17061708 assert(caseStmt.elseBody.isDefined)
1707- assert(caseStmt.conditions.length == 1 )
1708- assert(caseStmt.conditions.head.isInstanceOf [SingleStatement ])
1709- checkSimpleCaseStatementCondition(caseStmt.conditions.head, _ == Literal (1 ), _ == Literal (1 ))
1709+ assert(caseStmt.conditionExpressions.length == 1 )
1710+ assert(caseStmt.conditionExpressions.head == Literal (1 ))
1711+
1712+ assert(caseStmt.conditionalBodies.length == 1 )
1713+ assert(caseStmt.conditionalBodies.head.collection.head.asInstanceOf [SingleStatement ]
1714+ .getText == " SELECT 42" )
17101715
17111716 assert(caseStmt.elseBody.get.collection.head.isInstanceOf [SingleStatement ])
17121717 assert(caseStmt.elseBody.get.collection.head.asInstanceOf [SingleStatement ]
@@ -1730,28 +1735,27 @@ class SqlScriptingParserSuite extends SparkFunSuite with SQLHelper {
17301735 |""" .stripMargin
17311736 val tree = parsePlan(sqlScriptText).asInstanceOf [CompoundBody ]
17321737 assert(tree.collection.length == 1 )
1733- assert(tree.collection.head.isInstanceOf [CaseStatement ])
1738+ assert(tree.collection.head.isInstanceOf [SimpleCaseStatement ])
17341739
1735- val caseStmt = tree.collection.head.asInstanceOf [CaseStatement ]
1736- assert(caseStmt.conditions.length == 1 )
1740+ val caseStmt = tree.collection.head.asInstanceOf [SimpleCaseStatement ]
1741+
1742+ assert(caseStmt.caseVariableExpression.isInstanceOf [ScalarSubquery ])
1743+ assert(caseStmt.conditionExpressions.length == 1 )
17371744 assert(caseStmt.conditionalBodies.length == 1 )
17381745 assert(caseStmt.elseBody.isEmpty)
17391746
1740- assert(caseStmt.conditions.head.isInstanceOf [SingleStatement ])
1741- checkSimpleCaseStatementCondition(
1742- caseStmt.conditions.head, _.isInstanceOf [ScalarSubquery ], _ == Literal (1 ))
1747+ assert(caseStmt.conditionExpressions.head == Literal (1 ))
17431748
1744- assert(caseStmt.conditionalBodies.head.collection.head.isInstanceOf [CaseStatement ])
1749+ assert(caseStmt.conditionalBodies.head.collection.head.isInstanceOf [SimpleCaseStatement ])
17451750 val nestedCaseStmt =
1746- caseStmt.conditionalBodies.head.collection.head.asInstanceOf [CaseStatement ]
1751+ caseStmt.conditionalBodies.head.collection.head.asInstanceOf [SimpleCaseStatement ]
17471752
1748- assert(nestedCaseStmt.conditions.length == 1 )
1753+ assert(nestedCaseStmt.caseVariableExpression == Literal (2 ))
1754+ assert(nestedCaseStmt.conditionExpressions.length == 1 )
17491755 assert(nestedCaseStmt.conditionalBodies.length == 1 )
17501756 assert(nestedCaseStmt.elseBody.isDefined)
17511757
1752- assert(nestedCaseStmt.conditions.head.isInstanceOf [SingleStatement ])
1753- checkSimpleCaseStatementCondition(
1754- nestedCaseStmt.conditions.head, _ == Literal (2 ), _ == Literal (2 ))
1758+ assert(nestedCaseStmt.conditionExpressions.head == Literal (2 ))
17551759
17561760 assert(nestedCaseStmt.conditionalBodies.head.collection.head.isInstanceOf [SingleStatement ])
17571761 assert(nestedCaseStmt.conditionalBodies.head.collection.head.asInstanceOf [SingleStatement ]
@@ -2910,17 +2914,4 @@ class SqlScriptingParserSuite extends SparkFunSuite with SQLHelper {
29102914 .replace(" END" , " " )
29112915 .trim
29122916 }
2913-
2914- private def checkSimpleCaseStatementCondition (
2915- conditionStatement : SingleStatement ,
2916- predicateLeft : Expression => Boolean ,
2917- predicateRight : Expression => Boolean ): Unit = {
2918- assert(conditionStatement.parsedPlan.isInstanceOf [Project ])
2919- val project = conditionStatement.parsedPlan.asInstanceOf [Project ]
2920- assert(project.projectList.head.isInstanceOf [Alias ])
2921- assert(project.projectList.head.asInstanceOf [Alias ].child.isInstanceOf [EqualTo ])
2922- val equalTo = project.projectList.head.asInstanceOf [Alias ].child.asInstanceOf [EqualTo ]
2923- assert(predicateLeft(equalTo.left))
2924- assert(predicateRight(equalTo.right))
2925- }
29262917}
0 commit comments