Index: lucene/src/test/org/apache/lucene/search/spans/TestNearSpansOrdered.java
===================================================================
--- lucene/src/test/org/apache/lucene/search/spans/TestNearSpansOrdered.java	(révision 1138399)
+++ lucene/src/test/org/apache/lucene/search/spans/TestNearSpansOrdered.java	(copie de travail)
@@ -82,6 +82,21 @@
        slop,
        inOrder);
   }
+
+  protected SpanNearQuery makeOverlapedQuery() {
+      return new SpanNearQuery(
+              new SpanQuery[] {
+                new SpanNearQuery( new SpanQuery[] {
+                                    new SpanTermQuery(new Term(FIELD, "w3")),
+                                    new SpanTermQuery(new Term(FIELD, "w5")) },
+                                    1,
+                                    true
+                                ),
+                new SpanTermQuery(new Term(FIELD, "w4")) },
+                0,
+                true);
+  }
+
   protected SpanNearQuery makeQuery() {
     return makeQuery("w1","w2","w3",1,true);
   }
@@ -182,5 +197,10 @@
                + e.toString(),
                0.0f < e.getValue());
   }
-  
+
+  public void testOverlapedOrderedSpan()  throws Exception {
+    SpanNearQuery q = makeOverlapedQuery();
+    CheckHits.checkHits(random, q, FIELD, searcher, new int[] {});
+  }
+
 }
Index: lucene/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java
===================================================================
--- lucene/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java	(révision 1138398)
+++ lucene/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java	(copie de travail)
@@ -226,14 +226,15 @@
     int start1 = spans1.start();
     int start2 = spans2.start();
     /* Do not call docSpansOrdered(int,int,int,int) to avoid invoking .end() : */
-    return (start1 == start2) ? (spans1.end() < spans2.end()) : (start1 < start2);
+    int end1 = spans1.end();
+    return (start1 == start2) ? (end1 < spans2.end()) : (start1 < start2 && end1 <= start2);
   }
 
   /** Like {@link #docSpansOrdered(Spans,Spans)}, but use the spans
    * starts and ends as parameters.
    */
   private static final boolean docSpansOrdered(int start1, int end1, int start2, int end2) {
-    return (start1 == start2) ? (end1 < end2) : (start1 < start2);
+    return (start1 == start2) ? (end1 < end2) : (start1 < start2 && end1 <= start2);
   }
 
   /** Order the subSpans within the same document by advancing all later spans
Index: lucene/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java
===================================================================
--- lucene/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java	(révision 1083707)
+++ lucene/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java	(copie de travail)
@@ -59,7 +59,7 @@
     @Override
     protected final boolean lessThan(SpansCell spans1, SpansCell spans2) {
       if (spans1.doc() == spans2.doc()) {
-        return NearSpansOrdered.docSpansOrdered(spans1, spans2);
+        return docSpansOrdered(spans1, spans2);
       } else {
         return spans1.doc() < spans2.doc();
       }
@@ -224,6 +224,21 @@
     return more && (atMatch() ||  next());
   }
 
+  /** Check whether two Spans in the same document are ordered.
+   * @param spans1
+   * @param spans2
+   * @return true iff spans1 starts before spans2
+   *              or the spans start at the same position,
+   *              and spans1 ends before spans2.
+   */
+  static final boolean docSpansOrdered(Spans spans1, Spans spans2) {
+    assert spans1.doc() == spans2.doc() : "doc1 " + spans1.doc() + " != doc2 " + spans2.doc();
+    int start1 = spans1.start();
+    int start2 = spans2.start();
+    /* Do not call docSpansOrdered(int,int,int,int) to avoid invoking .end() : */
+    return (start1 == start2) ? (spans1.end() < spans2.end()) : (start1 < start2);
+  }
+
   private SpansCell min() { return queue.top(); }
 
   @Override
