Author: yonik
Date: Wed Dec 2 14:28:38 2009
New Revision: 886155
URL: http://svn.apache.org/viewvc?rev=886155&view=rev
Log:
SOLR-1615: fix StrParser quoted string backslash escaping, add java-style
unicode escaping
Modified:
lucene/solr/trunk/CHANGES.txt
lucene/solr/trunk/src/java/org/apache/solr/search/QueryParsing.java
lucene/solr/trunk/src/test/org/apache/solr/search/TestQueryTypes.java
Modified: lucene/solr/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=886155&r1=886154&r2=886155&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Wed Dec 2 14:28:38 2009
@@ -104,6 +104,10 @@
* SOLR-1601: Schema browser does not indicate presence of charFilter. (koji)
+* SOLR-1615: Backslash escaping did not work in quoted strings
+ for local param arguments. (Wojtek Piaseczny, yonik)
+
+
Other Changes
----------------------
Modified: lucene/solr/trunk/src/java/org/apache/solr/search/QueryParsing.java
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/QueryParsing.java?rev=886155&r1=886154&r2=886155&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/QueryParsing.java
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/QueryParsing.java Wed Dec
2 14:28:38 2009
@@ -625,14 +625,32 @@
}
char ch = val.charAt(pos);
if (ch=='\\') {
- ch = pos<end ? val.charAt(pos++) : 0;
- } else if (ch==delim) {
pos++;
- return sb.toString();
+ if (pos>=end) break;
+ ch = val.charAt(pos);
+ switch(ch) {
+ case 'n' : ch='\n'; break;
+ case 't' : ch='\t'; break;
+ case 'r' : ch='\r'; break;
+ case 'b' : ch='\b'; break;
+ case 'f' : ch='\f'; break;
+ case 'u' :
+ if (pos+4 >= end) {
+ throw new ParseException("bad unicode escape \\uxxxx at pos" +
(val_start-1) + " str='"+val+"'");
+ }
+ ch = (char)Integer.parseInt(val.substring(pos+1, pos+5), 16);
+ pos += 4;
+ break;
+ }
+ } else if (ch==delim) {
+ pos++; // skip over the quote
+ break;
}
sb.append(ch);
pos++;
}
+
+ return sb.toString();
}
// next non-whitespace char
Modified: lucene/solr/trunk/src/test/org/apache/solr/search/TestQueryTypes.java
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/search/TestQueryTypes.java?rev=886155&r1=886154&r2=886155&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/search/TestQueryTypes.java
(original)
+++ lucene/solr/trunk/src/test/org/apache/solr/search/TestQueryTypes.java Wed
Dec 2 14:28:38 2009
@@ -46,6 +46,7 @@
assertU(adoc("id","6", "v_f","8983"));
assertU(adoc("id","7", "v_f","1.5"));
assertU(adoc("id","8", "v_ti","5"));
+ assertU(adoc("id","9", "v_s","internal\"quote"));
Object[] arr = new Object[] {
"id",999.0
@@ -125,6 +126,34 @@
,"//resu...@numfound='0']"
);
+ //
+ // test escapes in quoted strings
+ //
+
+ // the control... unescaped queries looking for internal"quote
+ assertQ(req("q","{!raw f=v_s}internal\"quote")
+ ,"//resu...@numfound='1']"
+ );
+
+ // test that single quoted string needs no escape
+ assertQ(req("q","{!raw f=v_s v='internal\"quote'}")
+ ,"//resu...@numfound='1']"
+ );
+
+ // but it's OK if the escape is done
+ assertQ(req("q","{!raw f=v_s v='internal\\\"quote'}")
+ ,"//resu...@numfound='1']"
+ );
+
+ // test unicode escape
+ assertQ(req("q","{!raw f=v_s v=\"internal\\u0022quote\"}")
+ ,"//resu...@numfound='1']"
+ );
+
+ // inside a quoted string, internal"quote needs to be escaped
+ assertQ(req("q","{!raw f=v_s v=\"internal\\\"quote\"}")
+ ,"//resu...@numfound='1']"
+ );
assertQ("test custom plugin query",
req("q","{!foo f=v_t}hello")