You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2016/08/31 06:33:06 UTC

[16/38] ignite git commit: IGNITE-3745: ODBC: Implemented date/time/timestamp escape sequence parsing. This closes #991.

IGNITE-3745: ODBC: Implemented date/time/timestamp escape sequence parsing. This closes #991.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/92f18bf3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/92f18bf3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/92f18bf3

Branch: refs/heads/ignite-3443
Commit: 92f18bf353cc8c3821c6500ce9f1cd397a7cf17c
Parents: 87a1928
Author: Andrey V. Mashenkov <an...@gmail.com>
Authored: Fri Aug 26 15:31:30 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Fri Aug 26 15:31:30 2016 +0300

----------------------------------------------------------------------
 .../processors/odbc/escape/OdbcEscapeUtils.java |  30 ++-
 .../odbc/OdbcEscapeSequenceSelfTest.java        | 191 +++++++++++++++++--
 2 files changed, 203 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/92f18bf3/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/escape/OdbcEscapeUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/escape/OdbcEscapeUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/escape/OdbcEscapeUtils.java
index 83ec9d8..4c1deb6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/escape/OdbcEscapeUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/escape/OdbcEscapeUtils.java
@@ -26,10 +26,17 @@ import java.util.regex.Pattern;
  * ODBC escape sequence parse.
  */
 public class OdbcEscapeUtils {
+    /** Odbc date regexp pattern: '2016-08-23' */
+    private static final Pattern DATE_PATTERN = Pattern.compile("^'\\d{4}-\\d{2}-\\d{2}'$");
 
-    /**
-     * GUID regexp pattern: '12345678-9abc-def0-1234-123456789abc'
-     */
+    /** Odbc time regexp pattern: '14:33:44' */
+    private static final Pattern TIME_PATTERN = Pattern.compile("^'\\d{2}:\\d{2}:\\d{2}'$");
+
+    /** Odbc timestamp regexp pattern: '2016-08-23 14:33:44.12345' */
+    private static final Pattern TIMESTAMP_PATTERN =
+        Pattern.compile("^'\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(\\.\\d+)?'$");
+
+    /** GUID regexp pattern: '12345678-9abc-def0-1234-123456789abc' */
     private static final Pattern GUID_PATTERN =
         Pattern.compile("^'\\p{XDigit}{8}-\\p{XDigit}{4}-\\p{XDigit}{4}-\\p{XDigit}{4}-\\p{XDigit}{12}'$");
 
@@ -241,7 +248,16 @@ public class OdbcEscapeUtils {
                 return parseScalarExpression(text, startPos0, len0);
 
             case GUID:
-                return parseGuidExpression(text, startPos0, len0);
+                return parseExpression(text, startPos0, len0, token.type(), GUID_PATTERN);
+
+            case DATE:
+                return parseExpression(text, startPos0, len0, token.type(), DATE_PATTERN);
+
+            case TIME:
+                return parseExpression(text, startPos0, len0, token.type(), TIME_PATTERN);
+
+            case TIMESTAMP:
+                return parseExpression(text, startPos0, len0, token.type(), TIMESTAMP_PATTERN);
 
             default:
                 throw new IgniteException("Unsupported escape sequence token [text=" +
@@ -269,11 +285,11 @@ public class OdbcEscapeUtils {
      * @param len Length.
      * @return Parsed expression.
      */
-    private static String parseGuidExpression(String text, int startPos, int len) {
+    private static String parseExpression(String text, int startPos, int len, OdbcEscapeType type, Pattern pattern) {
         String val = substring(text, startPos, len).trim();
 
-        if (!GUID_PATTERN.matcher(val).matches())
-            throw new IgniteException("Invalid GUID escape sequence: " + substring(text, startPos, len));
+        if (!pattern.matcher(val).matches())
+            throw new IgniteException("Invalid " + type + " escape sequence: " + substring(text, startPos, len));
 
         return val;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/92f18bf3/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcEscapeSequenceSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcEscapeSequenceSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcEscapeSequenceSelfTest.java
index 7225c1a..1aa90fd 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcEscapeSequenceSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcEscapeSequenceSelfTest.java
@@ -142,12 +142,14 @@ public class OdbcEscapeSequenceSelfTest extends GridCommonAbstractTest {
      * Test invalid escape sequence.
      */
     public void testFailedOnInvalidFunctionSequence() {
+        checkFail("{fnfunc1()}");
+
         checkFail("select {fn func1(field1, {fn func2(field2), field3)} from SomeTable;");
 
         checkFail("select {fn func1(field1, fn func2(field2)}, field3)} from SomeTable;");
     }
 
-     /**
+    /**
      * Test escape sequences with additional whitespace characters
      */
     public void testFunctionEscapeSequenceWithWhitespaces() throws Exception {
@@ -155,7 +157,7 @@ public class OdbcEscapeSequenceSelfTest extends GridCommonAbstractTest {
 
         check("func1()", "{    fn  func1()}");
 
-        check("func1()", "{ \n fn  func1()}");
+        check("func1()", "{ \n fn\nfunc1()}");
 
         checkFail("{ \n func1()}");
     }
@@ -178,6 +180,21 @@ public class OdbcEscapeSequenceSelfTest extends GridCommonAbstractTest {
             "select '12345678-9abc-def0-1234-123456789abc'",
             "select {guid '12345678-9abc-def0-1234-123456789abc'}"
         );
+    }
+
+    /**
+     * Test invalid escape sequence.
+     */
+    public void testFailedOnInvalidGuidSequence() {
+        checkFail("select {guid'12345678-9abc-def0-1234-123456789abc'}");
+
+        checkFail("select {guid 12345678-9abc-def0-1234-123456789abc'}");
+
+        checkFail("select {guid '12345678-9abc-def0-1234-123456789abc}");
+
+        checkFail("select {guid '12345678-9abc-def0-1234-123456789abc' from SomeTable;");
+
+        checkFail("select guid '12345678-9abc-def0-1234-123456789abc'} from SomeTable;");
 
         checkFail("select {guid '1234567-1234-1234-1234-123456789abc'}");
 
@@ -191,15 +208,6 @@ public class OdbcEscapeSequenceSelfTest extends GridCommonAbstractTest {
     }
 
     /**
-     * Test invalid escape sequence.
-     */
-    public void testFailedOnInvalidGuidSequence() {
-        checkFail("select {guid '12345678-9abc-def0-1234-123456789abc' from SomeTable;");
-
-        checkFail("select guid '12345678-9abc-def0-1234-123456789abc'} from SomeTable;");
-    }
-
-    /**
      * Test escape sequences with additional whitespace characters
      */
     public void testGuidEscapeSequenceWithWhitespaces() throws Exception {
@@ -220,6 +228,167 @@ public class OdbcEscapeSequenceSelfTest extends GridCommonAbstractTest {
     }
 
     /**
+     * Test date escape sequences
+     */
+    public void testDateEscapeSequence() throws Exception {
+        check(
+            "'2016-08-26'",
+            "{d '2016-08-26'}"
+        );
+
+        check(
+            "select '2016-08-26'",
+            "select {d '2016-08-26'}"
+        );
+
+        check(
+            "select '2016-08-26' from table;",
+            "select {d '2016-08-26'} from table;"
+        );
+    }
+
+    /**
+     * Test date escape sequences with additional whitespace characters
+     */
+    public void testDateEscapeSequenceWithWhitespaces() throws Exception {
+        check("'2016-08-26'", "{ d '2016-08-26'}");
+
+        check("'2016-08-26'", "{   d  '2016-08-26'}");
+
+        check("'2016-08-26'", "{ \n d\n'2016-08-26'}");
+    }
+
+    /**
+     * Test invalid escape sequence.
+     */
+    public void testFailedOnInvalidDateSequence() {
+        checkFail("{d'2016-08-26'}");
+
+        checkFail("{d 2016-08-26'}");
+
+        checkFail("{d '2016-08-26}");
+
+        checkFail("{d '16-08-26'}");
+
+        checkFail("{d '2016/08/02'}");
+
+        checkFail("select {d '2016-08-26' from table;");
+
+        checkFail("select {}d '2016-08-26'} from table;");
+    }
+
+    /**
+     * Test date escape sequences
+     */
+    public void testTimeEscapeSequence() throws Exception {
+        check("'13:15:08'", "{t '13:15:08'}");
+
+        check("select '13:15:08'", "select {t '13:15:08'}");
+
+        check("select '13:15:08' from table;", "select {t '13:15:08'} from table;"
+        );
+    }
+
+    /**
+     * Test date escape sequences with additional whitespace characters
+     */
+    public void testTimeEscapeSequenceWithWhitespaces() throws Exception {
+        check("'13:15:08'", "{ t '13:15:08'}");
+
+        check("'13:15:08'", "{   t  '13:15:08'}");
+
+        check("'13:15:08'", "{ \n t\n'13:15:08'}");
+    }
+
+    /**
+     * Test invalid escape sequence.
+     */
+    public void testFailedOnInvalidTimeSequence() {
+        checkFail("{t'13:15:08'}");
+
+        checkFail("{t 13:15:08'}");
+
+        checkFail("{t '13:15:08}");
+
+        checkFail("{t '13 15:08'}");
+
+        checkFail("{t '3:15:08'}");
+
+        checkFail("select {t '13:15:08' from table;");
+
+        checkFail("select {}t '13:15:08'} from table;");
+    }
+
+    /**
+     * Test timestamp escape sequences
+     */
+    public void testTimestampEscapeSequence() throws Exception {
+        check(
+            "'2016-08-26 13:15:08'",
+            "{ts '2016-08-26 13:15:08'}"
+        );
+
+        check(
+            "'2016-08-26 13:15:08.123456'",
+            "{ts '2016-08-26 13:15:08.123456'}"
+        );
+
+        check(
+            "select '2016-08-26 13:15:08'",
+            "select {ts '2016-08-26 13:15:08'}"
+        );
+
+        check(
+            "select '2016-08-26 13:15:08' from table;",
+            "select {ts '2016-08-26 13:15:08'} from table;"
+        );
+    }
+
+    /**
+     * Test timestamp escape sequences with additional whitespace characters
+     */
+    public void testTimestampEscapeSequenceWithWhitespaces() throws Exception {
+        check("'2016-08-26 13:15:08'",
+            "{ ts '2016-08-26 13:15:08'}"
+        );
+
+        check("'2016-08-26 13:15:08'",
+            "{   ts  '2016-08-26 13:15:08'}"
+        );
+
+        check("'2016-08-26 13:15:08'",
+            "{ \n ts\n'2016-08-26 13:15:08'}"
+        );
+    }
+
+    /**
+     * Test invalid escape sequence.
+     */
+    public void testFailedOnInvalidTimestampSequence() {
+        checkFail("{ts '2016-08-26 13:15:08,12345'}");
+
+        checkFail("{ts'2016-08-26 13:15:08'}");
+
+        checkFail("{ts 2016-08-26 13:15:08'}");
+
+        checkFail("{ts '2016-08-26 13:15:08}");
+
+        checkFail("{ts '16-08-26 13:15:08'}");
+
+        checkFail("{ts '2016-08-26 3:25:08'}");
+
+        checkFail("{ts '2016-08 26 03:25:08'}");
+
+        checkFail("{ts '2016-08-26 03 25:08'}");
+
+        checkFail("{t s '2016-08-26 13:15:08''}");
+
+        checkFail("select {ts '2016-08-26 13:15:08' from table;");
+
+        checkFail("select {}ts '2016-08-26 13:15:08'} from table;");
+    }
+
+    /**
      * Check parsing logic.
      *
      * @param exp Expected result.