diff options
author | Mathias Stearn <mathias@10gen.com> | 2010-11-03 17:30:07 -0400 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2010-11-03 17:30:07 -0400 |
commit | e1ef4d5c551f376b7302e12bda6cc11c20954a60 (patch) | |
tree | 897cd97dca42dd404fb7cfb08376bf225d54faf6 | |
parent | 6c5553c4c9ef89e5c4b31e84ac9a7cc7100653a8 (diff) | |
download | mongo-e1ef4d5c551f376b7302e12bda6cc11c20954a60.tar.gz |
fix lexNumCmp with magic end of marker
Conflicts:
db/update.cpp
-rw-r--r-- | db/update.cpp | 8 | ||||
-rw-r--r-- | dbtests/basictests.cpp | 9 | ||||
-rw-r--r-- | util/goodies.h | 8 |
3 files changed, 18 insertions, 7 deletions
diff --git a/db/update.cpp b/db/update.cpp index d4a038b875d..e178e0fe65f 100644 --- a/db/update.cpp +++ b/db/update.cpp @@ -517,10 +517,12 @@ namespace mongo { DEBUGUPDATE( "\t\t createNewFromMods root: " << root ); BSONObjIteratorSorted es( obj ); BSONElement e = es.next(); - + ModStateHolder::iterator m = _mods.lower_bound( root ); - ModStateHolder::iterator mend = _mods.lower_bound( root + '{' ); - + StringBuilder buf(root.size() + 2 ); + buf << root << (char)255; + ModStateHolder::iterator mend = _mods.lower_bound( buf.str() ); + set<string> onedownseen; while ( e.type() && m != mend ){ diff --git a/dbtests/basictests.cpp b/dbtests/basictests.cpp index 27f7cdc90e2..ecba7650be7 100644 --- a/dbtests/basictests.cpp +++ b/dbtests/basictests.cpp @@ -319,6 +319,9 @@ namespace BasicTests { class LexNumCmp { public: void run() { + + ASSERT( ! isNumber( (char)255 ) ); + ASSERT_EQUALS( 0, lexNumCmp( "a", "a" ) ); ASSERT_EQUALS( -1, lexNumCmp( "a", "aa" ) ); ASSERT_EQUALS( 1, lexNumCmp( "aa", "a" ) ); @@ -346,7 +349,7 @@ namespace BasicTests { ASSERT_EQUALS( -1, lexNumCmp( "f12f", "f12g" ) ); ASSERT_EQUALS( 1, lexNumCmp( "f12g", "f12f" ) ); ASSERT_EQUALS( 1, lexNumCmp( "aa{", "aab" ) ); - ASSERT_EQUALS( 1, lexNumCmp( "aa{", "aa1" ) ); + ASSERT_EQUALS( -1, lexNumCmp( "aa{", "aa1" ) ); ASSERT_EQUALS( -1, lexNumCmp( "a1{", "a11" ) ); ASSERT_EQUALS( 1, lexNumCmp( "a1{a", "a1{" ) ); ASSERT_EQUALS( -1, lexNumCmp( "a1{", "a1{a" ) ); @@ -355,6 +358,10 @@ namespace BasicTests { ASSERT_EQUALS( -1 , lexNumCmp( "a.0" , "a.1" ) ); ASSERT_EQUALS( -1 , lexNumCmp( "a.0.b" , "a.1" ) ); + + ASSERT_EQUALS( -1 , lexNumCmp( "b." , "b.|" ) ); + ASSERT_EQUALS( -1 , lexNumCmp( "b.0e" , (string("b.") + (char)255).c_str() ) ); + ASSERT_EQUALS( -1 , lexNumCmp( "b." , "b.0e" ) ); } }; diff --git a/util/goodies.h b/util/goodies.h index c43f356b417..0bbc4da499e 100644 --- a/util/goodies.h +++ b/util/goodies.h @@ -651,15 +651,17 @@ namespace mongo { // for convenience, '{' is greater than anything and stops number parsing inline int lexNumCmp( const char *s1, const char *s2 ) { + //cout << "START : " << s1 << "\t" << s2 << endl; while( *s1 && *s2 ) { - bool p1 = ( *s1 == '{' ); - bool p2 = ( *s2 == '{' ); + bool p1 = ( *s1 == (char)255 ); + bool p2 = ( *s2 == (char)255 ); + //cout << "\t\t " << p1 << "\t" << p2 << endl; if ( p1 && !p2 ) return 1; if ( p2 && !p1 ) return -1; - + bool n1 = isNumber( *s1 ); bool n2 = isNumber( *s2 ); |