You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2015/04/16 16:32:28 UTC

[47/50] [abbrv] phoenix git commit: PHOENIX-1814 Exponential notation parsing and tests

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/d1474231
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/d1474231
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/d1474231

Branch: refs/heads/calcite
Commit: d147423137af487c0582234c12cc00b0e8f6be98
Parents: 007361b
Author: Brian <be...@salesforce.com>
Authored: Tue Apr 14 13:49:24 2015 -0700
Committer: Thomas D'Silva <tw...@gmail.com>
Committed: Wed Apr 15 11:09:12 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/d1474231/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/d1474231/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 9f60424..f57c5cc 100644
--- a/phoenix-core/src/main/antlr3/PhoenixSQL.g
+++ b/phoenix-core/src/main/antlr3/PhoenixSQL.g
@@ -903,6 +903,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);}
@@ -967,9 +970,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