Index: solr/src/java/org/apache/solr/handler/AnalysisRequestHandlerBase.java =================================================================== --- solr/src/java/org/apache/solr/handler/AnalysisRequestHandlerBase.java (revision 1075520) +++ solr/src/java/org/apache/solr/handler/AnalysisRequestHandlerBase.java (working copy) @@ -143,10 +143,10 @@ final TermToBytesRefAttribute bytesAtt = tokenStream.getAttribute(TermToBytesRefAttribute.class); try { tokenStream.reset(); + BytesRef spare = new BytesRef(); while (tokenStream.incrementToken()) { - final BytesRef bytes = new BytesRef(); - bytesAtt.toBytesRef(bytes); - tokens.add(bytes); + bytesAtt.toBytesRef(spare); + tokens.add(new BytesRef(spare)); } } catch (IOException ioe) { throw new RuntimeException("Error occured while iterating over tokenstream", ioe); Index: solr/src/webapp/web/admin/analysis.jsp =================================================================== --- solr/src/webapp/web/admin/analysis.jsp (revision 1075520) +++ solr/src/webapp/web/admin/analysis.jsp (working copy) @@ -156,10 +156,10 @@ TermToBytesRefAttribute bytesAtt = tstream.getAttribute(TermToBytesRefAttribute.class); tstream.reset(); matches = new HashSet(); + final BytesRef spare = new BytesRef(); while (tstream.incrementToken()) { - final BytesRef bytes = new BytesRef(); - bytesAtt.toBytesRef(bytes); - matches.add(bytes); + bytesAtt.toBytesRef(spare); + matches.add(new BytesRef(spare)); } } Index: lucene/src/java/org/apache/lucene/queryParser/QueryParserBase.java =================================================================== --- lucene/src/java/org/apache/lucene/queryParser/QueryParserBase.java (revision 1075520) +++ lucene/src/java/org/apache/lucene/queryParser/QueryParserBase.java (working copy) @@ -532,18 +532,19 @@ // ignore } + BytesRef spare = new BytesRef(); + if (numTokens == 0) return null; else if (numTokens == 1) { - BytesRef term = new BytesRef(); try { boolean hasNext = buffer.incrementToken(); assert hasNext == true; - termAtt.toBytesRef(term); + termAtt.toBytesRef(spare); } catch (IOException e) { // safe to ignore, because we know the number of tokens } - return newTermQuery(new Term(field, term)); + return newTermQuery(new Term(field, new BytesRef(spare))); } else { if (severalTokensAtSamePosition || (!quoted && !autoGeneratePhraseQueries)) { if (positionCount == 1 || (!quoted && !autoGeneratePhraseQueries)) { @@ -554,17 +555,15 @@ BooleanClause.Occur.MUST : BooleanClause.Occur.SHOULD; for (int i = 0; i < numTokens; i++) { - BytesRef term = new BytesRef(); try { boolean hasNext = buffer.incrementToken(); assert hasNext == true; - termAtt.toBytesRef(term); + termAtt.toBytesRef(spare); } catch (IOException e) { // safe to ignore, because we know the number of tokens } - Query currentQuery = newTermQuery( - new Term(field, term)); + new Term(field, new BytesRef(spare))); q.add(currentQuery, occur); } return q; @@ -576,12 +575,11 @@ List multiTerms = new ArrayList(); int position = -1; for (int i = 0; i < numTokens; i++) { - BytesRef term = new BytesRef(); int positionIncrement = 1; try { boolean hasNext = buffer.incrementToken(); assert hasNext == true; - termAtt.toBytesRef(term); + termAtt.toBytesRef(spare); if (posIncrAtt != null) { positionIncrement = posIncrAtt.getPositionIncrement(); } @@ -598,7 +596,7 @@ multiTerms.clear(); } position += positionIncrement; - multiTerms.add(new Term(field, term)); + multiTerms.add(new Term(field, new BytesRef(spare))); } if (enablePositionIncrements) { mpq.add(multiTerms.toArray(new Term[0]),position); @@ -631,9 +629,9 @@ if (enablePositionIncrements) { position += positionIncrement; - pq.add(new Term(field, term),position); + pq.add(new Term(field, new BytesRef(term)),position); } else { - pq.add(new Term(field, term)); + pq.add(new Term(field, new BytesRef(term))); } } return pq; @@ -812,8 +810,9 @@ try { source.close(); } catch (IOException ignored) {} - - return result; + + // make a copy of the bytes, we might not "own" them and TermRangeQuery doesn't copy. + return new BytesRef(result); } /** Index: lucene/src/java/org/apache/lucene/search/QueryTermVector.java =================================================================== --- lucene/src/java/org/apache/lucene/search/QueryTermVector.java (revision 1075520) +++ lucene/src/java/org/apache/lucene/search/QueryTermVector.java (working copy) @@ -66,10 +66,10 @@ final TermToBytesRefAttribute termAtt = stream.getAttribute(TermToBytesRefAttribute.class); hasMoreTokens = stream.incrementToken(); + BytesRef spare = new BytesRef(); while (hasMoreTokens) { - BytesRef bytes = new BytesRef(); - termAtt.toBytesRef(bytes); - terms.add(bytes); + termAtt.toBytesRef(spare); + terms.add(new BytesRef(spare)); hasMoreTokens = stream.incrementToken(); } processTerms(terms.toArray(new BytesRef[terms.size()])); Index: lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/builders/TermsFilterBuilder.java =================================================================== --- lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/builders/TermsFilterBuilder.java (revision 1075520) +++ lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/builders/TermsFilterBuilder.java (working copy) @@ -63,16 +63,16 @@ try { Term term = null; + BytesRef spare = new BytesRef(); while (ts.incrementToken()) { - BytesRef bytes = new BytesRef(); - termAtt.toBytesRef(bytes); + termAtt.toBytesRef(spare); if (term == null) { - term = new Term(fieldName, bytes); + term = new Term(fieldName, new BytesRef(spare)); } else { // create from previous to save fieldName.intern overhead - term = term.createTerm(bytes); + term = term.createTerm(new BytesRef(spare)); } tf.addTerm(term); } Index: lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/builders/SpanOrTermsBuilder.java =================================================================== --- lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/builders/SpanOrTermsBuilder.java (revision 1075520) +++ lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/builders/SpanOrTermsBuilder.java (working copy) @@ -58,11 +58,10 @@ ArrayList clausesList=new ArrayList(); TokenStream ts=analyzer.tokenStream(fieldName,new StringReader(value)); TermToBytesRefAttribute termAtt = ts.addAttribute(TermToBytesRefAttribute.class); - + BytesRef spare = new BytesRef(); while (ts.incrementToken()) { - BytesRef term = new BytesRef(); - termAtt.toBytesRef(term); - SpanTermQuery stq=new SpanTermQuery(new Term(fieldName, term)); + termAtt.toBytesRef(spare); + SpanTermQuery stq=new SpanTermQuery(new Term(fieldName, new BytesRef(spare))); clausesList.add(stq); } SpanOrQuery soq=new SpanOrQuery(clausesList.toArray(new SpanQuery[clausesList.size()])); Index: lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/builders/TermsQueryBuilder.java =================================================================== --- lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/builders/TermsQueryBuilder.java (revision 1075520) +++ lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/builders/TermsQueryBuilder.java (working copy) @@ -60,16 +60,16 @@ { TermToBytesRefAttribute termAtt = ts.addAttribute(TermToBytesRefAttribute.class); Term term = null; + BytesRef spare = new BytesRef(); while (ts.incrementToken()) { - BytesRef bytes = new BytesRef(); - termAtt.toBytesRef(bytes); + termAtt.toBytesRef(spare); if (term == null) { - term = new Term(fieldName, bytes); + term = new Term(fieldName, new BytesRef(spare)); } else { // create from previous to save fieldName.intern overhead - term = term.createTerm(bytes); + term = term.createTerm(new BytesRef(spare)); } bq.add(new BooleanClause(new TermQuery(term),BooleanClause.Occur.SHOULD)); }