summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Staple <aaron@10gen.com>2009-06-05 12:13:49 -0400
committerAaron Staple <aaron@10gen.com>2009-06-05 12:13:49 -0400
commit1fd840fd64b9147631262bd7ad09ede9b6f9fcbb (patch)
treeed29129e8664c0eac1b5c0a96296a7cd79b227a2
parent5514c49e39849671826d863ed23d49ef58968a8f (diff)
downloadmongo-1fd840fd64b9147631262bd7ad09ede9b6f9fcbb.tar.gz
BUG SERVER-92 $all scan only one key in index
-rw-r--r--db/queryutil.cpp15
-rw-r--r--jstests/index_check2.js6
2 files changed, 16 insertions, 5 deletions
diff --git a/db/queryutil.cpp b/db/queryutil.cpp
index 44deaf59a05..d4b6219a965 100644
--- a/db/queryutil.cpp
+++ b/db/queryutil.cpp
@@ -55,9 +55,18 @@ namespace mongo {
case BSONObj::GTE:
lower_ = e;
break;
- case BSONObj::opIN:
- case BSONObj::opALL: {
- massert( "$in/$all require array", e.type() == Array );
+ case BSONObj::opALL: {
+ massert( "$all requires array", e.type() == Array );
+ BSONObjIterator i( e.embeddedObject() );
+ if ( i.more() ) {
+ BSONElement f = i.next();
+ if ( !f.eoo() )
+ lower_ = upper_ = f;
+ }
+ break;
+ }
+ case BSONObj::opIN: {
+ massert( "$in requires array", e.type() == Array );
BSONElement max = minKey.firstElement();
BSONElement min = maxKey.firstElement();
BSONObjIterator i( e.embeddedObject() );
diff --git a/jstests/index_check2.js b/jstests/index_check2.js
index 8543849be39..5ffd93bf65b 100644
--- a/jstests/index_check2.js
+++ b/jstests/index_check2.js
@@ -32,8 +32,10 @@ scanned1 = t.find(q1).explain().nscanned;
scanned2 = t.find(q2).explain().nscanned;
scanned3 = t.find(q3).explain().nscanned;
-print( "scanned1: " + scanned1 + " scanned2: " + scanned2 + " scanned3: " + scanned3 );
+//print( "scanned1: " + scanned1 + " scanned2: " + scanned2 + " scanned3: " + scanned3 );
// $all should just iterate either of the words
-//assert( scanned3 <= Math.max( scanned1 , scanned2 ) , "$all makes query optimizer not work well" );
+assert( scanned3 <= Math.max( scanned1 , scanned2 ) , "$all makes query optimizer not work well" );
+exp3 = t.find( q3 ).explain();
+assert.eq( exp3.startKey, exp3.endKey, "$all range not a single key" );