You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2011/11/16 02:27:27 UTC
svn commit: r1202499 - in /lucene/dev/trunk/solr: CHANGES.txt
core/src/java/org/apache/solr/analysis/TrieTokenizerFactory.java
core/src/test/org/apache/solr/BasicFunctionalityTest.java
Author: hossman
Date: Wed Nov 16 01:27:26 2011
New Revision: 1202499
URL: http://svn.apache.org/viewvc?rev=1202499&view=rev
Log:
SOLR-2813: Fix HTTP error codes returned when requests contain strings that can not be parsed as numbers for Trie fields
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/TrieTokenizerFactory.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1202499&r1=1202498&r2=1202499&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Wed Nov 16 01:27:26 2011
@@ -428,6 +428,8 @@ Bug Fixes
* SOLR-2861: Fix extremely rare race condition on commit that can result
in a NPE (yonik)
+* SOLR-2813: Fix HTTP error codes returned when requests contain strings that
+ can not be parsed as numbers for Trie fields. (Jeff Crump and hossman)
Other Changes
----------------------
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/TrieTokenizerFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/TrieTokenizerFactory.java?rev=1202499&r1=1202498&r2=1202499&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/TrieTokenizerFactory.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/TrieTokenizerFactory.java Wed Nov 16 01:27:26 2011
@@ -89,24 +89,29 @@ final class TrieTokenizer extends Tokeni
this.startOfs = correctOffset(0);
this.endOfs = correctOffset(len);
String v = new String(buf, 0, len);
- switch (type) {
- case INTEGER:
- ts.setIntValue(Integer.parseInt(v));
- break;
- case FLOAT:
- ts.setFloatValue(Float.parseFloat(v));
- break;
- case LONG:
- ts.setLongValue(Long.parseLong(v));
- break;
- case DOUBLE:
- ts.setDoubleValue(Double.parseDouble(v));
- break;
- case DATE:
- ts.setLongValue(dateField.parseMath(null, v).getTime());
- break;
- default:
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field");
+ try {
+ switch (type) {
+ case INTEGER:
+ ts.setIntValue(Integer.parseInt(v));
+ break;
+ case FLOAT:
+ ts.setFloatValue(Float.parseFloat(v));
+ break;
+ case LONG:
+ ts.setLongValue(Long.parseLong(v));
+ break;
+ case DOUBLE:
+ ts.setDoubleValue(Double.parseDouble(v));
+ break;
+ case DATE:
+ ts.setLongValue(dateField.parseMath(null, v).getTime());
+ break;
+ default:
+ throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field");
+ }
+ } catch (NumberFormatException nfe) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+ "Invalid Number: " + v);
}
} catch (IOException e) {
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unable to create TrieIndexTokenizer", e);
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java?rev=1202499&r1=1202498&r2=1202499&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java Wed Nov 16 01:27:26 2011
@@ -22,6 +22,8 @@ import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
+import java.util.List;
+import java.util.LinkedList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -222,6 +224,43 @@ public class BasicFunctionalityTest exte
);
}
+
+ @Test
+ public void testClientErrorOnMalformedNumbers() throws Exception {
+
+ final String BAD_VALUE = "NOT_A_NUMBER";
+ ignoreException(BAD_VALUE);
+
+ final List<String> FIELDS = new LinkedList<String>();
+ for (String type : new String[] { "ti", "tf", "td", "tl" }) {
+ FIELDS.add("malformed_" + type);
+ }
+
+ // test that malformed numerics cause client error not server error
+ for (String field : FIELDS) {
+ try {
+ h.update(add( doc("id","100", field, BAD_VALUE)));
+ fail("Didn't encounter an error trying to add a non-number: " + field);
+ } catch (SolrException e) {
+ String msg = e.toString();
+ assertTrue("not an (update) client error on field: " + field +" : "+ msg,
+ 400 <= e.code() && e.code() < 500);
+ assertTrue("(update) client error does not mention bad value: " + msg,
+ msg.contains(BAD_VALUE));
+ }
+ try {
+ h.query(req("q",field + ":" + BAD_VALUE));
+ fail("Didn't encounter an error trying to query a non-number: " + field);
+ } catch (SolrException e) {
+ String msg = e.toString();
+ assertTrue("not a (search) client error on field: " + field +" : "+ msg,
+ 400 <= e.code() && e.code() < 500);
+ assertTrue("(search) client error does not mention bad value: " + msg,
+ msg.contains(BAD_VALUE));
+ }
+ }
+ }
+
@Test
public void testRequestHandlerBaseException() {
final String tmp = "BOO! ignore_exception";