You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2014/12/15 11:38:59 UTC

svn commit: r1645616 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java

Author: thomasm
Date: Mon Dec 15 10:38:58 2014
New Revision: 1645616

URL: http://svn.apache.org/r1645616
Log:
OAK-2354 Support comments anywhere in a SQL-2 statement

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java?rev=1645616&r1=1645615&r2=1645616&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java Mon Dec 15 10:38:58 2014
@@ -63,7 +63,8 @@ public class SQL2Parser {
     private static final Logger LOG = LoggerFactory.getLogger(SQL2Parser.class);
 
     // Character types, used during the tokenizer phase
-    private static final int CHAR_END = -1, CHAR_VALUE = 2, CHAR_QUOTED = 3;
+    private static final int CHAR_END = -1, CHAR_IGNORE = 0;
+    private static final int CHAR_VALUE = 2, CHAR_QUOTED = 3;
     private static final int CHAR_NAME = 4, CHAR_SPECIAL_1 = 5, CHAR_SPECIAL_2 = 6;
     private static final int CHAR_STRING = 7, CHAR_DECIMAL = 8, CHAR_BRACKETED = 9;
 
@@ -155,7 +156,6 @@ public class SQL2Parser {
             read("BY");
             orderings = parseOrder();
         }
-        parseComment();
         if (!currentToken.isEmpty()) {
             throw getSyntaxError("<end>");
         }
@@ -920,18 +920,6 @@ public class SQL2Parser {
         }
     }
 
-    private void parseComment() throws ParseException {
-        if (readIf("/") && readIf("*")) {
-            //skip to the end directly
-            parseIndex = characterTypes.length - 3;
-            read();
-            boolean endComment = readIf("*") && readIf("/");
-            if (!endComment) {
-                throw getSyntaxError("end of comment");
-            }
-        }
-    }
-
     private boolean readIf(String token) throws ParseException {
         if (isToken(token)) {
             read();
@@ -987,7 +975,6 @@ public class SQL2Parser {
             char c = command[i];
             int type = 0;
             switch (c) {
-            case '/':
             case '-':
             case '(':
             case ')':
@@ -1013,6 +1000,21 @@ public class SQL2Parser {
             case '.':
                 type = CHAR_DECIMAL;
                 break;
+            case '/':
+                if (command[i + 1] != '*') {
+                    type = CHAR_SPECIAL_1;
+                    break;
+                }
+                types[i] = type = CHAR_IGNORE;                
+                startLoop = i;
+                i += 2;
+                checkRunOver(i, len, startLoop);
+                while (command[i] != '*' || command[i + 1] != '/') {
+                    i++;
+                    checkRunOver(i, len, startLoop);
+                }
+                i++;          
+                break;
             case '[':
                 types[i] = type = CHAR_BRACKETED;
                 startLoop = i;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java?rev=1645616&r1=1645615&r2=1645616&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java Mon Dec 15 10:38:58 2014
@@ -183,7 +183,9 @@ public class Statement {
         // leave original xpath string as a comment
         if (xpathQuery != null) {
             buff.append(" /* xpath: ");
-            buff.append(xpathQuery);
+            // the xpath query may not contain the "end comment" marker
+            String xpathEscaped = xpathQuery.replaceAll("\\*\\/", "* /");
+            buff.append(xpathEscaped);
             buff.append(" */");
         }
         

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java?rev=1645616&r1=1645615&r2=1645616&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java Mon Dec 15 10:38:58 2014
@@ -41,6 +41,9 @@ public class SQL2ParserTest {
     public void testIgnoreSqlComment() throws ParseException {
         p.parse("select * from [nt:unstructured] /* sql comment */");
         p.parse("select [jcr:path], [jcr:score], * from [nt:base] as a /* xpath: //* */");
+        p.parse("/* begin query */ select [jcr:path] /* this is the path */, " + 
+                "[jcr:score] /* the score */, * /* everything*/ " + 
+                "from [nt:base] /* all node types */ as a /* an identifier */");
     }
 
     @Test(expected = ParseException.class)