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
1=== modified file 'pom.xml'
2--- pom.xml 2013-07-30 18:46:57 +0000
3+++ pom.xml 2013-07-31 20:57:25 +0000
4@@ -100,7 +100,7 @@
5 <dependency>
6 <groupId>com.akiban</groupId>
7 <artifactId>akiban-sql-parser</artifactId>
8- <version>1.0.15-SNAPSHOT</version>
9+ <version>1.0.16-SNAPSHOT</version>
10 </dependency>
11 <dependency>
12 <groupId>org.slf4j</groupId>
13
14=== modified file 'src/main/java/com/akiban/sql/optimizer/rule/ASTStatementLoader.java'
15--- src/main/java/com/akiban/sql/optimizer/rule/ASTStatementLoader.java 2013-03-22 20:05:57 +0000
16+++ src/main/java/com/akiban/sql/optimizer/rule/ASTStatementLoader.java 2013-07-31 20:57:25 +0000
17@@ -1545,6 +1545,24 @@
18 toExpression(cond.getElseNode(), projects),
19 cond.getType(), cond);
20 }
21+ else if (valueNode instanceof SimpleCaseNode) {
22+ SimpleCaseNode caseNode = (SimpleCaseNode)valueNode;
23+ ExpressionNode operand = toExpression(caseNode.getOperand(), projects);
24+ int ncases = caseNode.getNumberOfCases();
25+ ExpressionNode expr;
26+ if (caseNode.getElseValue() != null)
27+ expr = toExpression(caseNode.getElseValue(), projects);
28+ else
29+ expr = new ConstantExpression(null, AkType.NULL);
30+ for (int i = ncases - 1; i >= 0; i--) {
31+ ConditionList conds = new ConditionList(1);
32+ conds.add(new ComparisonCondition(Comparison.EQ, operand, toExpression(caseNode.getCaseOperand(i), projects), caseNode.getType(), caseNode));
33+ expr = new IfElseExpression(conds,
34+ toExpression(caseNode.getResultValue(i), projects),
35+ expr, caseNode.getType(), caseNode);
36+ }
37+ return expr;
38+ }
39 else if (valueNode instanceof NextSequenceNode) {
40 NextSequenceNode seqNode = (NextSequenceNode)valueNode;
41 List<ExpressionNode> params = new ArrayList<>(2);
42
43=== modified file 'src/test/resources/com/akiban/sql/optimizer/rule/parse/README.txt'
44--- src/test/resources/com/akiban/sql/optimizer/rule/parse/README.txt 2012-09-18 22:33:15 +0000
45+++ src/test/resources/com/akiban/sql/optimizer/rule/parse/README.txt 2013-07-31 20:57:25 +0000
46@@ -18,7 +18,9 @@
47
48 between-3: NOT BETWEEN condition
49
50-case-1: CASE statement
51+case-1: search CASE statement
52+
53+case-2: simple CASE statement
54
55 cast-1: explicit CAST
56
57
58=== added file 'src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.expected'
59--- src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.expected 1970-01-01 00:00:00 +0000
60+++ src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.expected 2013-07-31 20:57:25 +0000
61@@ -0,0 +1,5 @@
62+SelectQuery@1290b1e8
63+ ResultSet@598fffdd[_SQL_COL_1]
64+ Project@7ce7341a[IF([items.sku == 1234], apples, IF([items.sku == 9876], oranges, unknown))]
65+ Select@116db99a[]
66+ TableSource@3ab43666(items)
67\ No newline at end of file
68
69=== added file 'src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.sql'
70--- src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.sql 1970-01-01 00:00:00 +0000
71+++ src/test/resources/com/akiban/sql/optimizer/rule/parse/case-2.sql 2013-07-31 20:57:25 +0000
72@@ -0,0 +1,5 @@
73+SELECT CASE sku
74+ WHEN '1234' THEN 'apples'
75+ WHEN '9876' THEN 'oranges'
76+ ELSE 'unknown' END
77+ FROM items

Subscribers

People subscribed via source and target branches