Repository: phoenix
Updated Branches:
  refs/heads/4.x-HBase-0.98 5555e80e3 -> 74dd80b5c


PHOENIX-1814 Exponential notation parsing and tests


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/74dd80b5
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/74dd80b5
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/74dd80b5

Branch: refs/heads/4.x-HBase-0.98
Commit: 74dd80b5c227a847a8a0415e603804612c8d3e69
Parents: 5555e80
Author: Brian <besserl...@salesforce.com>
Authored: Tue Apr 14 13:49:24 2015 -0700
Committer: Thomas D'Silva <twdsi...@gmail.com>
Committed: Wed Apr 15 11:06:36 2015 -0700

----------------------------------------------------------------------
 .../phoenix/end2end/ArithmeticQueryIT.java      | 60 ++++++++++++++++++++
 phoenix-core/src/main/antlr3/PhoenixSQL.g       | 16 +++++-
 2 files changed, 74 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/74dd80b5/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArithmeticQueryIT.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArithmeticQueryIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArithmeticQueryIT.java
index 72eb016..f56c965 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArithmeticQueryIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArithmeticQueryIT.java
@@ -985,4 +985,64 @@ public class ArithmeticQueryIT extends 
BaseHBaseManagedTimeIT {
         assertTrue(rs.next());
         assertEquals(-1.0f, rs.getFloat(1), 0.001);
     }
+    
+    @Test
+    public void testSystemTableHasDoubleForExponentialNumber() throws 
Exception {
+        Connection conn = DriverManager.getConnection(getUrl());
+        String ddl = "CREATE TABLE test (id VARCHAR not null primary key, num 
FLOAT)";
+        conn.createStatement().execute(ddl);
+        String dml = "UPSERT INTO test(id,num) VALUES ('testid', 1.2E3)";
+        conn.createStatement().execute(dml);
+        conn.commit();
+
+        ResultSet rs = conn.createStatement().executeQuery("SELECT 1.2E3 FROM 
SYSTEM.CATALOG LIMIT 1");
+        assertTrue(rs.next());
+        assertTrue(rs.getObject(1) instanceof Double);
+    }
+    
+    @Test
+    public void testFloatingPointWithExponentialNotation() throws Exception {
+       Float[] expected = {1.5E7f, 1.5E-7f, -1.5E-7f, 12E-5f, -.12E+34f};
+       String[] values = {"1.5e7", "1.5e-7", "-1.5e-7", "12E-5", "-.12E+34"};
+        ResultSet rs = createTableWithValues(values, "FLOAT");
+        for (int i = 0; i < expected.length; i++) {
+               assertEquals(expected[i], rs.getFloat(i+1), 0.001);
+        }
+    }
+    
+    @Test
+    public void testDoubleWithExponentialNotation() throws Exception {
+       Double[] expected = {1.5E7d, 1.5E-7d, -1.5E-7d, 12E-5d, -.654E-321d, 
.1234E+56d};
+       String[] values = {"1.5e7", "1.5e-7", "-1.5e-7", "12E-5", "-.654E-321", 
".1234E+56"};
+       ResultSet rs = createTableWithValues(values, "DOUBLE");
+        for (int i = 0; i < expected.length; i++) {
+               assertEquals(expected[i], rs.getDouble(i+1), 0.001);
+        }
+    }
+    
+    private ResultSet createTableWithValues(String[] values, String valueType) 
throws SQLException {
+       Connection conn = DriverManager.getConnection(getUrl());
+        StringBuilder ddl = new StringBuilder("CREATE TABLE test (id VARCHAR 
not null primary key");
+        StringBuilder dmll = new StringBuilder("UPSERT INTO test(id,");
+        StringBuilder dmlr = new StringBuilder(") VALUES ('testid'");
+        StringBuilder select = new StringBuilder("SELECT");
+        for(int i = 0; i < values.length; i++) {
+               ddl.append(", num").append(i).append(" ").append(valueType);
+               dmll.append("num").append(i).append(",");
+               dmlr.append(", ").append(values[i]);
+               select.append(" num").append(i).append(",");
+        }
+        ddl.append(")");
+        dmlr.append(")");
+        dmll.deleteCharAt(dmll.length()-1);
+        select.deleteCharAt(select.length()-1);
+        select.append(" FROM test");
+        conn.createStatement().execute(ddl.toString());
+        conn.createStatement().execute(dmll.toString() + dmlr.toString());
+        conn.commit();
+
+        ResultSet rs = conn.createStatement().executeQuery(select.toString());
+        rs.next();
+        return rs;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/74dd80b5/phoenix-core/src/main/antlr3/PhoenixSQL.g
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/antlr3/PhoenixSQL.g 
b/phoenix-core/src/main/antlr3/PhoenixSQL.g
index 97b7122..9837019 100644
--- a/phoenix-core/src/main/antlr3/PhoenixSQL.g
+++ b/phoenix-core/src/main/antlr3/PhoenixSQL.g
@@ -895,6 +895,9 @@ literal returns [LiteralParseNode ret]
     |   d=DECIMAL  {
             ret = factory.realNumber(d.getText());
         }
+    |   dbl=DOUBLE  {
+            ret = factory.literal(Double.valueOf(dbl.getText()));
+        }    
     |   NULL {ret = factory.literal(null);}
     |   TRUE {ret = factory.literal(Boolean.TRUE);} 
     |   FALSE {ret = factory.literal(Boolean.FALSE);}
@@ -959,9 +962,18 @@ NUMBER
     :   POSINTEGER
     ;
 
-// Exponential format is not supported.
 DECIMAL
-    :   POSINTEGER? '.' POSINTEGER
+       :       POSINTEGER? '.' POSINTEGER
+       ;
+       
+DOUBLE
+    :   '.' POSINTEGER Exponent
+    |   POSINTEGER '.' Exponent
+    |   POSINTEGER ('.' (POSINTEGER (Exponent)?)? | Exponent)
+    ;
+
+Exponent
+    :    ('e' | 'E') ( PLUS | MINUS )? POSINTEGER
     ;
 
 DOUBLE_QUOTE

Reply via email to