diff --git a/src/main/java/org/z3950/zing/cql/CQLGenerator.java b/src/main/java/org/z3950/zing/cql/CQLGenerator.java index 2f21563..f22a7af 100644 --- a/src/main/java/org/z3950/zing/cql/CQLGenerator.java +++ b/src/main/java/org/z3950/zing/cql/CQLGenerator.java @@ -204,7 +204,7 @@ private String generate_base_relation() throws MissingParameterException { private String generate_term() { switch (rnd.nextInt(10)) { case 0: return "cat"; - case 1: return "\"cat\""; + case 1: return "\"cat\\\""; // A term with both bare quotes and escaped quotes case 2: return "comp.os.linux"; case 3: return "xml:element"; case 4: return ""; diff --git a/src/main/java/org/z3950/zing/cql/CQLLexer.java b/src/main/java/org/z3950/zing/cql/CQLLexer.java index 4294b6f..ff5aee3 100644 --- a/src/main/java/org/z3950/zing/cql/CQLLexer.java +++ b/src/main/java/org/z3950/zing/cql/CQLLexer.java @@ -69,19 +69,15 @@ else if (comp.equals("<>")) { //remember quote char char mark = c; qi++; - boolean escaped = false; buf.setLength(0); //reset buffer - while (qi < ql) { - if (!escaped && qs.charAt(qi) == mark) //terminator - break; - if (escaped && strchr("*?^\\", qs.charAt(qi))) //no escaping for d-quote - buf.append("\\"); - if (!escaped && qs.charAt(qi) == '\\') { //escape-char - escaped = true; + while (qi < ql && qs.charAt(qi) != mark) { + if (qs.charAt(qi) == '\\') { //escape-char + if (qi == ql - 1) { + break; //unterminated + } + buf.append(qs.charAt(qi)); qi++; - continue; } - escaped = false; //reset escape buf.append(qs.charAt(qi)); qi++; } diff --git a/src/main/java/org/z3950/zing/cql/CQLTermNode.java b/src/main/java/org/z3950/zing/cql/CQLTermNode.java index 02a8229..6fa042d 100644 --- a/src/main/java/org/z3950/zing/cql/CQLTermNode.java +++ b/src/main/java/org/z3950/zing/cql/CQLTermNode.java @@ -229,7 +229,7 @@ static String maybeQuote(String str) { str.indexOf('/') != -1 || str.indexOf('(') != -1 || str.indexOf(')') != -1) { - str = '"' + str.replace("\"", "\\\"") + '"'; + str = '"' + str.replaceAll("(? = - ^cat says "fish" + ^cat says \"fish\" diff --git a/src/test/resources/regression/06/06.xcql b/src/test/resources/regression/06/06.xcql index 9d38695..2a0cd96 100644 --- a/src/test/resources/regression/06/06.xcql +++ b/src/test/resources/regression/06/06.xcql @@ -3,5 +3,5 @@ = - ^cat*fishdog"horse? + ^cat*fishdog\"horse? diff --git a/src/test/resources/regression/12/01.xcql b/src/test/resources/regression/12/01.xcql index c9fc4b6..b826cba 100644 --- a/src/test/resources/regression/12/01.xcql +++ b/src/test/resources/regression/12/01.xcql @@ -3,5 +3,5 @@ = - term\*\?\^ + te\rm\*\?\^