Merge lp:~mmcm/akiban-sql-parser/more-node-to-string into lp:~akiban-technologies/akiban-sql-parser/trunk

Proposed by Mike McMahon
Status: Merged
Approved by: Nathan Williams
Approved revision: 305
Merged at revision: 302
Proposed branch: lp:~mmcm/akiban-sql-parser/more-node-to-string
Merge into: lp:~akiban-technologies/akiban-sql-parser/trunk
Diff against target: 367 lines (+209/-4)
7 files modified
src/main/java/com/akiban/sql/parser/LeftRightFuncOperatorNode.java (+2/-2)
src/main/java/com/akiban/sql/parser/TrimOperatorNode.java (+1/-1)
src/main/java/com/akiban/sql/parser/UnaryArithmeticOperatorNode.java (+1/-1)
src/main/java/com/akiban/sql/unparser/NodeToString.java (+188/-0)
src/test/java/com/akiban/sql/unparser/NodeToStringTest.java (+3/-0)
src/test/resources/com/akiban/sql/unparser/select-15.expected (+1/-0)
src/test/resources/com/akiban/sql/unparser/select-15.sql (+13/-0)
To merge this branch: bzr merge lp:~mmcm/akiban-sql-parser/more-node-to-string
Reviewer Review Type Date Requested Status
Thomas Jones-Low Needs Fixing
Nathan Williams Approve
Review via email: mp+177704@code.launchpad.net

Description of the change

Add unparser support for missing Value-like nodes.

See switch additions for which node types these are and new test for how those manifest in the parser.

To post a comment you must log in.
Revision history for this message
Nathan Williams (nwilliams) wrote :

Looks good.

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

There were 2 failures during build/test:

* job sql-parser-build failed at build number 296: http://sneezy.softstart.com:8080/job/sql-parser-build/296/

* view must-pass failed: sql-parser-build is red

review: Needs Fixing

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/main/java/com/akiban/sql/parser/LeftRightFuncOperatorNode.java'
--- src/main/java/com/akiban/sql/parser/LeftRightFuncOperatorNode.java 2013-05-08 22:13:20 +0000
+++ src/main/java/com/akiban/sql/parser/LeftRightFuncOperatorNode.java 2013-07-30 22:21:25 +0000
@@ -36,11 +36,11 @@
36 switch(nodeType)36 switch(nodeType)
37 {37 {
38 case NodeTypes.LEFT_FN_NODE:38 case NodeTypes.LEFT_FN_NODE:
39 op = "getLeft";39 op = "LEFT";
40 method = "getLeft";40 method = "getLeft";
41 break;41 break;
42 case NodeTypes.RIGHT_FN_NODE:42 case NodeTypes.RIGHT_FN_NODE:
43 op = "getRight";43 op = "RIGHT";
44 method = "getRight";44 method = "getRight";
45 break;45 break;
46 default:46 default:
4747
=== modified file 'src/main/java/com/akiban/sql/parser/TrimOperatorNode.java'
--- src/main/java/com/akiban/sql/parser/TrimOperatorNode.java 2013-05-08 22:13:20 +0000
+++ src/main/java/com/akiban/sql/parser/TrimOperatorNode.java 2013-07-30 22:21:25 +0000
@@ -31,7 +31,7 @@
31 case TRIM:31 case TRIM:
32 case RTRIM: super.init(trimSource,32 case RTRIM: super.init(trimSource,
33 trimChar,33 trimChar,
34 "TRIM",34 optype.name(),
35 optype.name().toLowerCase(),35 optype.name().toLowerCase(),
36 ValueClassName.StringDataValue,36 ValueClassName.StringDataValue,
37 ValueClassName.StringDataValue);37 ValueClassName.StringDataValue);
3838
=== modified file 'src/main/java/com/akiban/sql/parser/UnaryArithmeticOperatorNode.java'
--- src/main/java/com/akiban/sql/parser/UnaryArithmeticOperatorNode.java 2013-05-08 22:13:20 +0000
+++ src/main/java/com/akiban/sql/parser/UnaryArithmeticOperatorNode.java 2013-07-30 22:21:25 +0000
@@ -52,7 +52,7 @@
52 PLUS("+", "plus"), 52 PLUS("+", "plus"),
53 MINUS("-", "minus"), 53 MINUS("-", "minus"),
54 SQRT("SQRT", "sqrt"), 54 SQRT("SQRT", "sqrt"),
55 ABSOLUTE("ABS/ABSVAL", "absolute");55 ABSOLUTE("ABS", "absolute");
5656
57 String operator, methodName;57 String operator, methodName;
58 OperatorType(String operator, String methodName) {58 OperatorType(String operator, String methodName) {
5959
=== modified file 'src/main/java/com/akiban/sql/unparser/NodeToString.java'
--- src/main/java/com/akiban/sql/unparser/NodeToString.java 2013-05-08 22:13:20 +0000
+++ src/main/java/com/akiban/sql/unparser/NodeToString.java 2013-07-30 22:21:25 +0000
@@ -131,7 +131,10 @@
131 case NodeTypes.BINARY_DIVIDE_OPERATOR_NODE:131 case NodeTypes.BINARY_DIVIDE_OPERATOR_NODE:
132 case NodeTypes.BINARY_DIV_OPERATOR_NODE:132 case NodeTypes.BINARY_DIV_OPERATOR_NODE:
133 case NodeTypes.BINARY_MINUS_OPERATOR_NODE:133 case NodeTypes.BINARY_MINUS_OPERATOR_NODE:
134 case NodeTypes.MOD_OPERATOR_NODE:
134 return binaryArithmeticOperatorNode((BinaryArithmeticOperatorNode)node);135 return binaryArithmeticOperatorNode((BinaryArithmeticOperatorNode)node);
136 case NodeTypes.BINARY_BIT_OPERATOR_NODE:
137 return binaryBitOperatorNode((BinaryBitOperatorNode)node);
135 case NodeTypes.CONCATENATION_OPERATOR_NODE:138 case NodeTypes.CONCATENATION_OPERATOR_NODE:
136 return concatenationOperatorNode((ConcatenationOperatorNode)node);139 return concatenationOperatorNode((ConcatenationOperatorNode)node);
137 case NodeTypes.NOT_NODE:140 case NodeTypes.NOT_NODE:
@@ -141,10 +144,39 @@
141 return isNullNode((IsNullNode)node);144 return isNullNode((IsNullNode)node);
142 case NodeTypes.IS_NODE:145 case NodeTypes.IS_NODE:
143 return isNode((IsNode)node);146 return isNode((IsNode)node);
147 case NodeTypes.ABSOLUTE_OPERATOR_NODE:
148 case NodeTypes.SQRT_OPERATOR_NODE:
149 return unaryArithmeticOperatorNode((UnaryArithmeticOperatorNode)node);
150 case NodeTypes.UNARY_PLUS_OPERATOR_NODE:
151 case NodeTypes.UNARY_MINUS_OPERATOR_NODE:
152 return unaryPrefixOperatorNode((UnaryArithmeticOperatorNode)node);
153 case NodeTypes.UNARY_BITNOT_OPERATOR_NODE:
154 return unaryBitOperatorNode((UnaryBitOperatorNode)node);
144 case NodeTypes.UNARY_DATE_TIMESTAMP_OPERATOR_NODE:155 case NodeTypes.UNARY_DATE_TIMESTAMP_OPERATOR_NODE:
145 return unaryDateTimestampOperatorNode((UnaryDateTimestampOperatorNode)node);156 return unaryDateTimestampOperatorNode((UnaryDateTimestampOperatorNode)node);
157 case NodeTypes.TIMESTAMP_OPERATOR_NODE:
158 return timestampOperatorNode((TimestampOperatorNode)node);
159 case NodeTypes.EXTRACT_OPERATOR_NODE:
160 return extractOperatorNode((ExtractOperatorNode)node);
161 case NodeTypes.CHAR_LENGTH_OPERATOR_NODE:
162 return lengthOperatorNode((LengthOperatorNode)node);
163 case NodeTypes.OCTET_LENGTH_OPERATOR_NODE:
164 return octetLengthOperatorNode((OctetLengthOperatorNode)node);
165 case NodeTypes.RIGHT_FN_NODE:
166 case NodeTypes.LEFT_FN_NODE:
167 return leftRightFuncOperatorNode((LeftRightFuncOperatorNode)node);
168 case NodeTypes.SIMPLE_STRING_OPERATOR_NODE:
169 return simpleStringOperatorNode((SimpleStringOperatorNode)node);
146 case NodeTypes.LIKE_OPERATOR_NODE:170 case NodeTypes.LIKE_OPERATOR_NODE:
147 return likeEscapeOperatorNode((LikeEscapeOperatorNode)node);171 return likeEscapeOperatorNode((LikeEscapeOperatorNode)node);
172 case NodeTypes.LOCATE_FUNCTION_NODE:
173 case NodeTypes.SUBSTRING_OPERATOR_NODE:
174 return ternaryOperatorNode((TernaryOperatorNode)node);
175 case NodeTypes.TIMESTAMP_ADD_FN_NODE:
176 case NodeTypes.TIMESTAMP_DIFF_FN_NODE:
177 return timestampFunctionNode((TernaryOperatorNode)node);
178 case NodeTypes.TRIM_OPERATOR_NODE:
179 return trimOperatorNode((TrimOperatorNode)node);
148 case NodeTypes.IN_LIST_OPERATOR_NODE:180 case NodeTypes.IN_LIST_OPERATOR_NODE:
149 return inListOperatorNode((InListOperatorNode)node);181 return inListOperatorNode((InListOperatorNode)node);
150 case NodeTypes.ROW_CTOR_NODE:182 case NodeTypes.ROW_CTOR_NODE:
@@ -180,6 +212,8 @@
180 return constantNode((ConstantNode)node);212 return constantNode((ConstantNode)node);
181 case NodeTypes.PARAMETER_NODE:213 case NodeTypes.PARAMETER_NODE:
182 return parameterNode((ParameterNode)node);214 return parameterNode((ParameterNode)node);
215 case NodeTypes.DEFAULT_NODE:
216 return "DEFAULT";
183 case NodeTypes.USER_NODE:217 case NodeTypes.USER_NODE:
184 return "USER";218 return "USER";
185 case NodeTypes.CURRENT_USER_NODE:219 case NodeTypes.CURRENT_USER_NODE:
@@ -200,6 +234,12 @@
200 return currentDatetimeOperatorNode((CurrentDatetimeOperatorNode)node);234 return currentDatetimeOperatorNode((CurrentDatetimeOperatorNode)node);
201 case NodeTypes.CAST_NODE:235 case NodeTypes.CAST_NODE:
202 return castNode((CastNode)node);236 return castNode((CastNode)node);
237 case NodeTypes.EXPLICIT_COLLATE_NODE:
238 return explicitCollateNode((ExplicitCollateNode)node);
239 case NodeTypes.NEXT_SEQUENCE_NODE:
240 return nextSequenceNode((NextSequenceNode)node);
241 case NodeTypes.CURRENT_SEQUENCE_NODE:
242 return currentSequenceNode((CurrentSequenceNode)node);
203 case NodeTypes.JAVA_TO_SQL_VALUE_NODE:243 case NodeTypes.JAVA_TO_SQL_VALUE_NODE:
204 return javaToSQLValueNode((JavaToSQLValueNode)node);244 return javaToSQLValueNode((JavaToSQLValueNode)node);
205 case NodeTypes.SQL_TO_JAVA_VALUE_NODE:245 case NodeTypes.SQL_TO_JAVA_VALUE_NODE:
@@ -747,11 +787,26 @@
747 return infixBinary(node);787 return infixBinary(node);
748 }788 }
749789
790 protected String binaryBitOperatorNode(BinaryBitOperatorNode node)
791 throws StandardException {
792 return infixBinary(node);
793 }
794
750 protected String concatenationOperatorNode(ConcatenationOperatorNode node)795 protected String concatenationOperatorNode(ConcatenationOperatorNode node)
751 throws StandardException {796 throws StandardException {
752 return infixBinary(node);797 return infixBinary(node);
753 }798 }
754799
800 protected String leftRightFuncOperatorNode(LeftRightFuncOperatorNode node)
801 throws StandardException {
802 return functionBinary(node);
803 }
804
805 protected String simpleStringOperatorNode(SimpleStringOperatorNode node)
806 throws StandardException {
807 return functionUnary(node);
808 }
809
755 protected String notNode(NotNode node) throws StandardException {810 protected String notNode(NotNode node) throws StandardException {
756 return prefixUnary(node);811 return prefixUnary(node);
757 }812 }
@@ -760,11 +815,47 @@
760 return suffixUnary(node);815 return suffixUnary(node);
761 }816 }
762817
818 protected String unaryArithmeticOperatorNode(UnaryArithmeticOperatorNode node)
819 throws StandardException {
820 return functionUnary(node);
821 }
822
823 protected String unaryPrefixOperatorNode(UnaryArithmeticOperatorNode node)
824 throws StandardException {
825 return prefixUnary(node);
826 }
827
828 protected String unaryBitOperatorNode(UnaryBitOperatorNode node)
829 throws StandardException {
830 return prefixUnary(node);
831 }
832
833 protected String extractOperatorNode(ExtractOperatorNode node)
834 throws StandardException {
835 return node.getOperator().substring("EXTRACT ".length()).toUpperCase() + "(" +
836 toString(node.getOperand()) + ")";
837 }
838
763 protected String unaryDateTimestampOperatorNode(UnaryDateTimestampOperatorNode node) 839 protected String unaryDateTimestampOperatorNode(UnaryDateTimestampOperatorNode node)
764 throws StandardException {840 throws StandardException {
765 return functionUnary(node);841 return functionUnary(node);
766 }842 }
767843
844 protected String timestampOperatorNode(TimestampOperatorNode node)
845 throws StandardException {
846 return functionBinary(node);
847 }
848
849 protected String lengthOperatorNode(LengthOperatorNode node)
850 throws StandardException {
851 return functionUnary(node);
852 }
853
854 protected String octetLengthOperatorNode(OctetLengthOperatorNode node)
855 throws StandardException {
856 return functionUnary(node);
857 }
858
768 protected String isNode(IsNode node) throws StandardException {859 protected String isNode(IsNode node) throws StandardException {
769 StringBuilder str = new StringBuilder(maybeParens(node.getLeftOperand()));860 StringBuilder str = new StringBuilder(maybeParens(node.getLeftOperand()));
770 str.append(" IS ");861 str.append(" IS ");
@@ -800,6 +891,81 @@
800 return like;891 return like;
801 }892 }
802893
894 protected String ternaryOperatorNode(TernaryOperatorNode node)
895 throws StandardException {
896 StringBuilder str = new StringBuilder(node.getOperator().toUpperCase());
897 str.append("(");
898 str.append(toString(node.getReceiver()));
899 str.append(", ");
900 str.append(toString(node.getLeftOperand()));
901 if (node.getRightOperand() != null) {
902 str.append(", ");
903 str.append(toString(node.getRightOperand()));
904 }
905 return str.toString();
906 }
907
908 protected String timestampFunctionNode(TernaryOperatorNode node)
909 throws StandardException {
910 String interval = toString(node.getReceiver());
911 switch ((Integer)((ConstantNode)node.getReceiver()).getValue()) {
912 case TernaryOperatorNode.YEAR_INTERVAL:
913 interval = "YEAR";
914 break;
915 case TernaryOperatorNode.QUARTER_INTERVAL:
916 interval = "QUARTER";
917 break;
918 case TernaryOperatorNode.MONTH_INTERVAL:
919 interval = "MONTH";
920 break;
921 case TernaryOperatorNode.WEEK_INTERVAL:
922 interval = "WEEK";
923 break;
924 case TernaryOperatorNode.DAY_INTERVAL:
925 interval = "DAY";
926 break;
927 case TernaryOperatorNode.HOUR_INTERVAL:
928 interval = "HOUR";
929 break;
930 case TernaryOperatorNode.MINUTE_INTERVAL:
931 interval = "MINUTE";
932 break;
933 case TernaryOperatorNode.SECOND_INTERVAL:
934 interval = "SECOND";
935 break;
936 case TernaryOperatorNode.FRAC_SECOND_INTERVAL:
937 interval = "MICROSECOND>";
938 break;
939 }
940 return node.getOperator().toUpperCase() + "(" +
941 interval + ", " +
942 toString(node.getLeftOperand()) + ", " +
943 toString(node.getRightOperand()) + ")";
944 }
945
946 protected String trimOperatorNode(TrimOperatorNode node)
947 throws StandardException {
948 if ((node.getRightOperand() instanceof ConstantNode) &&
949 " ".equals(((ConstantNode)node.getRightOperand()).getValue())) {
950 return node.getOperator().toUpperCase() + "(" +
951 toString(node.getLeftOperand()) + ")";
952 }
953 else {
954 StringBuilder str = new StringBuilder("TRIM(");
955 if ("LTRIM".equals(node.getOperator()))
956 str.append("LEADING");
957 else if ("RTRIM".equals(node.getOperator()))
958 str.append("TRAILING");
959 else
960 str.append("BOTH");
961 str.append(" ");
962 str.append(toString(node.getRightOperand()));
963 str.append(" FROM ");
964 str.append(toString(node.getLeftOperand()));
965 return str.toString();
966 }
967 }
968
803 protected String inListOperatorNode(InListOperatorNode node) throws StandardException {969 protected String inListOperatorNode(InListOperatorNode node) throws StandardException {
804 return maybeParens(node.getLeftOperand()) +970 return maybeParens(node.getLeftOperand()) +
805 " " + (node.isNegated() ? "NOT IN" : "IN") + 971 " " + (node.isNegated() ? "NOT IN" : "IN") +
@@ -880,6 +1046,12 @@
880 maybeParens(node.getRightOperand());1046 maybeParens(node.getRightOperand());
881 }1047 }
882 1048
1049 protected String functionBinary(BinaryOperatorNode node) throws StandardException {
1050 return node.getOperator().toUpperCase() + "(" +
1051 toString(node.getLeftOperand()) + ", " +
1052 toString(node.getRightOperand()) + ")";
1053 }
1054
883 protected String functionCall(String functionName, ValueNodeList args)1055 protected String functionCall(String functionName, ValueNodeList args)
884 throws StandardException {1056 throws StandardException {
885 return functionName + "(" + nodeList(args, true) + ")";1057 return functionName + "(" + nodeList(args, true) + ")";
@@ -946,6 +1118,22 @@
946 " AS " + node.getType().toString() + ")";1118 " AS " + node.getType().toString() + ")";
947 }1119 }
9481120
1121 protected String explicitCollateNode(ExplicitCollateNode node)
1122 throws StandardException {
1123 return maybeParens(node.getOperand()) +
1124 " COLLATE " + node.getCollation();
1125 }
1126
1127 protected String nextSequenceNode(NextSequenceNode node)
1128 throws StandardException {
1129 return "NEXT VALUE FOR " + toString(node.getSequenceName ());
1130 }
1131
1132 protected String currentSequenceNode(CurrentSequenceNode node)
1133 throws StandardException {
1134 return "CURRENT VALUE FOR " + toString(node.getSequenceName ());
1135 }
1136
949 protected String javaToSQLValueNode(JavaToSQLValueNode node) 1137 protected String javaToSQLValueNode(JavaToSQLValueNode node)
950 throws StandardException {1138 throws StandardException {
951 return toString(node.getJavaValueNode());1139 return toString(node.getJavaValueNode());
9521140
=== modified file 'src/test/java/com/akiban/sql/unparser/NodeToStringTest.java'
--- src/test/java/com/akiban/sql/unparser/NodeToStringTest.java 2013-05-08 22:13:20 +0000
+++ src/test/java/com/akiban/sql/unparser/NodeToStringTest.java 2013-07-30 22:21:25 +0000
@@ -19,6 +19,7 @@
19import com.akiban.sql.TestBase;19import com.akiban.sql.TestBase;
2020
21import com.akiban.sql.parser.SQLParser;21import com.akiban.sql.parser.SQLParser;
22import com.akiban.sql.parser.SQLParserFeature;
22import com.akiban.sql.parser.StatementNode;23import com.akiban.sql.parser.StatementNode;
2324
24import org.junit.Before;25import org.junit.Before;
@@ -30,6 +31,7 @@
3031
31import java.io.File;32import java.io.File;
32import java.util.Collection;33import java.util.Collection;
34import java.util.EnumSet;
3335
34@RunWith(Parameterized.class)36@RunWith(Parameterized.class)
35public class NodeToStringTest extends TestBase implements TestBase.GenerateAndCheckResult37public class NodeToStringTest extends TestBase implements TestBase.GenerateAndCheckResult
@@ -45,6 +47,7 @@
45 public void before() throws Exception {47 public void before() throws Exception {
46 parser = new SQLParser();48 parser = new SQLParser();
47 unparser = new NodeToString();49 unparser = new NodeToString();
50 parser.getFeatures().addAll(EnumSet.of(SQLParserFeature.INFIX_BIT_OPERATORS));
48 }51 }
4952
50 @Parameters53 @Parameters
5154
=== added file 'src/test/resources/com/akiban/sql/unparser/select-15.expected'
--- src/test/resources/com/akiban/sql/unparser/select-15.expected 1970-01-01 00:00:00 +0000
+++ src/test/resources/com/akiban/sql/unparser/select-15.expected 2013-07-30 22:21:25 +0000
@@ -0,0 +1,1 @@
1SELECT (ABS(- n)), (~ n), (n MOD 3), SQRT(n), CHAR_LENGTH(s), LENGTH(s), (LEFT(s, 3)), (RIGHT(s, 4)), UPPER(s), LOWER(s), (LOCATE(s, 'abc', 1), (LOCATE(s, 'xyz', 10), (SUBSTRING(s, 10), (SUBSTRING(s, 10, 3), LTRIM(s), (TRIM(TRAILING '!' FROM s), ((s || s) COLLATE en_us_ci), MONTH(d), (TIMESTAMP(d, '13:01:01')), (TIMESTAMPDIFF(DAY, d, CURRENT_TIMESTAMP)), (NEXT VALUE FOR seq), (CURRENT VALUE FOR seq) FROM t
0\ No newline at end of file2\ No newline at end of file
13
=== added file 'src/test/resources/com/akiban/sql/unparser/select-15.sql'
--- src/test/resources/com/akiban/sql/unparser/select-15.sql 1970-01-01 00:00:00 +0000
+++ src/test/resources/com/akiban/sql/unparser/select-15.sql 2013-07-30 22:21:25 +0000
@@ -0,0 +1,13 @@
1SELECT abs(- n), ~n,
2 mod(n, 3), sqrt(n),
3 char_length(s), octet_length(s),
4 left(s, 3), right(s, 4),
5 upper(s), lower(s),
6 locate(s, 'abc'), locate(s, 'xyz', 10),
7 substring(s, 10), substring(s, 10, 3),
8 ltrim(s), trim(trailing '!' from s),
9 s||s collate en_us_ci,
10 month(d), timestamp(d, '13:01:01'), timestampdiff(day, d, current_timestamp),
11 next value for seq, current value for seq
12FROM t
13
0\ No newline at end of file14\ No newline at end of file

Subscribers

People subscribed via source and target branches