Index: src/test/org/apache/lucene/search/TestBoolean2.java
===================================================================
--- src/test/org/apache/lucene/search/TestBoolean2.java	(revision 465853)
+++ src/test/org/apache/lucene/search/TestBoolean2.java	(working copy)
@@ -62,7 +62,9 @@
   };
 
   public Query makeQuery(String queryText) throws ParseException {
-    return (new QueryParser(field, new WhitespaceAnalyzer())).parse(queryText);
+    Query q = (new QueryParser(field, new WhitespaceAnalyzer())).parse(queryText);
+    if (searcher!=null) QueryUtils.check(q,searcher);
+    return q;
   }
 
   public void queriesTest(String queryText, int[] expDocNrs) throws Exception {
@@ -167,6 +169,9 @@
         Sort sort = Sort.INDEXORDER;
 
         BooleanQuery.setUseScorer14(false);
+
+        QueryUtils.check(q1,searcher);
+
         Hits hits1 = searcher.search(q1,sort);
         if (hits1.length()>0) hits1.id(hits1.length()-1);
 
Index: src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java	(revision 465853)
+++ src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java	(working copy)
@@ -130,6 +130,7 @@
         DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.0f);
         q.add(tq("hed","albino"));
         q.add(tq("hed","elephant"));
+        QueryUtils.check(q,s);
 
         Hits h = s.search(q);
 
@@ -155,7 +156,9 @@
         DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.0f);
         q.add(tq("dek","albino"));
         q.add(tq("dek","elephant"));
+        QueryUtils.check(q,s);
 
+
         Hits h = s.search(q);
 
         try {
@@ -180,7 +183,9 @@
         q.add(tq("hed","elephant"));
         q.add(tq("dek","albino"));
         q.add(tq("dek","elephant"));
+        QueryUtils.check(q,s);
 
+
         Hits h = s.search(q);
 
         try {
@@ -203,7 +208,9 @@
         DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.01f);
         q.add(tq("dek","albino"));
         q.add(tq("dek","elephant"));
+        QueryUtils.check(q,s);
 
+
         Hits h = s.search(q);
 
         try {
@@ -232,14 +239,18 @@
             q1.add(tq("hed","albino"));
             q1.add(tq("dek","albino"));
             q.add(q1,BooleanClause.Occur.MUST);//true,false);
+            QueryUtils.check(q1,s);
+
         }
         {
             DisjunctionMaxQuery q2 = new DisjunctionMaxQuery(0.0f);
             q2.add(tq("hed","elephant"));
             q2.add(tq("dek","elephant"));
             q.add(q2, BooleanClause.Occur.MUST);//true,false);
+           QueryUtils.check(q2,s);
         }
 
+        QueryUtils.check(q,s);
 
         Hits h = s.search(q);
 
@@ -273,6 +284,7 @@
             q2.add(tq("dek","elephant"));
             q.add(q2, BooleanClause.Occur.SHOULD);//false,false);
         }
+        QueryUtils.check(q,s);
 
 
         Hits h = s.search(q);
@@ -312,6 +324,7 @@
             q2.add(tq("dek","elephant"));
             q.add(q2, BooleanClause.Occur.SHOULD);//false,false);
         }
+        QueryUtils.check(q,s);
 
 
         Hits h = s.search(q);
@@ -370,6 +383,7 @@
             q2.add(tq("dek","elephant"));
             q.add(q2, BooleanClause.Occur.SHOULD);//false,false);
         }
+        QueryUtils.check(q,s);
 
 
         Hits h = s.search(q);
Index: src/test/org/apache/lucene/search/QueryUtils.java
===================================================================
--- src/test/org/apache/lucene/search/QueryUtils.java	(revision 465853)
+++ src/test/org/apache/lucene/search/QueryUtils.java	(working copy)
@@ -2,6 +2,8 @@
 
 import junit.framework.TestCase;
 
+import java.io.IOException;
+
 /**
  * Copyright 2005 Apache Software Foundation
  *
@@ -63,4 +65,42 @@
     TestCase.assertTrue(q1.hashCode() != q2.hashCode());
   }
 
+
+  /** random query sanity checks on an index searcher */
+  public static void check(Query q1, IndexSearcher s) {
+    try {
+      check(q1);
+      checkSkipTo(q1,s);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  public static void checkSkipTo(final Query q, final IndexSearcher s) throws IOException {
+    final Weight w = q.weight(s);
+    final Scorer scorer = w.scorer(s.getIndexReader());
+
+    s.search(q,new HitCollector() {
+      int scorerDoc=-1;
+      public void collect(int doc, float score) {
+        try {
+          boolean more = scorer.skipTo(scorerDoc+1);
+          scorerDoc = scorer.doc();
+          float scorerScore = scorer.score();
+          if (more==false || doc != scorerDoc || score != scorerScore ) {
+            throw new RuntimeException("ERROR in matching query:"
+                    +"\n\tscorer.skipTo=" + more + " doc="+scorerDoc + " score="+scorerScore
+                    +"\n\thitCollector.doc=" + doc + " score="+score
+                    +"\n\t Scorer=" + scorer
+                    +"\n\t Query=" + q
+                    +"\n\t Searcher=" + s
+            );
+          }
+        } catch (IOException e) {
+          throw new RuntimeException(e);
+        }
+      }
+    });
+  }
+
 }
Index: src/java/org/apache/lucene/search/DisjunctionMaxScorer.java
===================================================================
--- src/java/org/apache/lucene/search/DisjunctionMaxScorer.java	(revision 465853)
+++ src/java/org/apache/lucene/search/DisjunctionMaxScorer.java	(working copy)
@@ -113,6 +113,13 @@
      * @return true iff there is a document to be generated whose number is at least target
      */
     public boolean skipTo(int target) throws IOException {
+        if (firstTime) {
+          if (!more) return false;
+          heapify();
+          firstTime = false;
+          return true;   // more would have been false if no subScorers had any docs
+        }
+
         while (subScorers.size()>0 && ((Scorer)subScorers.get(0)).doc()<target) {
             if (((Scorer)subScorers.get(0)).skipTo(target))
                 heapAdjust(0);
