Merge lp:~mmcm/akiban-server/simple-case into lp:~akiban-technologies/akiban-server/trunk

Proposed by Mike McMahon
Status: Merged
Approved by: Mike McMahon
Approved revision: 2728
Merged at revision: 2729
Proposed branch: lp:~mmcm/akiban-server/simple-case
Merge into: lp:~akiban-technologies/akiban-server/trunk
Diff against target: 77 lines (+32/-2)
5 files modified
pom.xml (+1/-1)
src/main/java/com/akiban/sql/optimizer/rule/ASTStatementLoader.java (+18/-0)
src/test/resources/com/akiban/sql/optimizer/rule/parse/README.txt (+3/-1)
src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.expected (+5/-0)
src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.sql (+5/-0)
To merge this branch: bzr merge lp:~mmcm/akiban-server/simple-case
Reviewer Review Type Date Requested Status
Mike McMahon Approve
Thomas Jones-Low Needs Fixing
Review via email: mp+177937@code.launchpad.net

Description of the change

Handle simple CASE added by lp:~mmcm/akiban-sql-parser/simple-case.

Note that this just turns it into the corresponding search case: it does each comparison as a separate expression.

It would be reasonable to have an expression that took a single value and matched it against a list of clauses, possibly with special handling for the common case of constants, which it could hash or binary search. But, in my opinion, the right way to introduce that is from suitable nested IfElseExpression's _after_ constant folding. That way either syntax gets the desired improvements. I didn't do any of this because it might interfere with ripping types2 out, which is enough of a big deal already.

To post a comment you must log in.
Revision history for this message
Thomas Jones-Low (tjoneslo) wrote :

As described

review: Approve
Revision history for this message
Thomas Jones-Low (tjoneslo) wrote :

There were 2 failures during build/test:

* job server-build failed at build number 4162: http://sneezy.softstart.com:8080/job/server-build/4162/

* view must-pass failed: server-build is red

review: Needs Fixing
Revision history for this message
Mike McMahon (mmcm) wrote :

Needed to wait for parser.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'pom.xml'
--- pom.xml 2013-07-30 18:46:57 +0000
+++ pom.xml 2013-07-31 20:57:25 +0000
@@ -100,7 +100,7 @@
100 <dependency>100 <dependency>
101 <groupId>com.akiban</groupId>101 <groupId>com.akiban</groupId>
102 <artifactId>akiban-sql-parser</artifactId>102 <artifactId>akiban-sql-parser</artifactId>
103 <version>1.0.15-SNAPSHOT</version>103 <version>1.0.16-SNAPSHOT</version>
104 </dependency>104 </dependency>
105 <dependency>105 <dependency>
106 <groupId>org.slf4j</groupId>106 <groupId>org.slf4j</groupId>
107107
=== modified file 'src/main/java/com/akiban/sql/optimizer/rule/ASTStatementLoader.java'
--- src/main/java/com/akiban/sql/optimizer/rule/ASTStatementLoader.java 2013-03-22 20:05:57 +0000
+++ src/main/java/com/akiban/sql/optimizer/rule/ASTStatementLoader.java 2013-07-31 20:57:25 +0000
@@ -1545,6 +1545,24 @@
1545 toExpression(cond.getElseNode(), projects),1545 toExpression(cond.getElseNode(), projects),
1546 cond.getType(), cond);1546 cond.getType(), cond);
1547 }1547 }
1548 else if (valueNode instanceof SimpleCaseNode) {
1549 SimpleCaseNode caseNode = (SimpleCaseNode)valueNode;
1550 ExpressionNode operand = toExpression(caseNode.getOperand(), projects);
1551 int ncases = caseNode.getNumberOfCases();
1552 ExpressionNode expr;
1553 if (caseNode.getElseValue() != null)
1554 expr = toExpression(caseNode.getElseValue(), projects);
1555 else
1556 expr = new ConstantExpression(null, AkType.NULL);
1557 for (int i = ncases - 1; i >= 0; i--) {
1558 ConditionList conds = new ConditionList(1);
1559 conds.add(new ComparisonCondition(Comparison.EQ, operand, toExpression(caseNode.getCaseOperand(i), projects), caseNode.getType(), caseNode));
1560 expr = new IfElseExpression(conds,
1561 toExpression(caseNode.getResultValue(i), projects),
1562 expr, caseNode.getType(), caseNode);
1563 }
1564 return expr;
1565 }
1548 else if (valueNode instanceof NextSequenceNode) {1566 else if (valueNode instanceof NextSequenceNode) {
1549 NextSequenceNode seqNode = (NextSequenceNode)valueNode;1567 NextSequenceNode seqNode = (NextSequenceNode)valueNode;
1550 List<ExpressionNode> params = new ArrayList<>(2);1568 List<ExpressionNode> params = new ArrayList<>(2);
15511569
=== modified file 'src/test/resources/com/akiban/sql/optimizer/rule/parse/README.txt'
--- src/test/resources/com/akiban/sql/optimizer/rule/parse/README.txt 2012-09-18 22:33:15 +0000
+++ src/test/resources/com/akiban/sql/optimizer/rule/parse/README.txt 2013-07-31 20:57:25 +0000
@@ -18,7 +18,9 @@
1818
19between-3: NOT BETWEEN condition19between-3: NOT BETWEEN condition
2020
21case-1: CASE statement21case-1: search CASE statement
22
23case-2: simple CASE statement
2224
23cast-1: explicit CAST25cast-1: explicit CAST
2426
2527
=== added file 'src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.expected'
--- src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.expected 1970-01-01 00:00:00 +0000
+++ src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.expected 2013-07-31 20:57:25 +0000
@@ -0,0 +1,5 @@
1SelectQuery@1290b1e8
2 ResultSet@598fffdd[_SQL_COL_1]
3 Project@7ce7341a[IF([items.sku == 1234], apples, IF([items.sku == 9876], oranges, unknown))]
4 Select@116db99a[]
5 TableSource@3ab43666(items)
0\ No newline at end of file6\ No newline at end of file
17
=== added file 'src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.sql'
--- src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.sql 1970-01-01 00:00:00 +0000
+++ src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.sql 2013-07-31 20:57:25 +0000
@@ -0,0 +1,5 @@
1SELECT CASE sku
2 WHEN '1234' THEN 'apples'
3 WHEN '9876' THEN 'oranges'
4 ELSE 'unknown' END
5 FROM items

Subscribers

People subscribed via source and target branches