summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2010-11-03 17:30:07 -0400
committerMathias Stearn <mathias@10gen.com>2010-11-03 17:30:07 -0400
commite1ef4d5c551f376b7302e12bda6cc11c20954a60 (patch)
tree897cd97dca42dd404fb7cfb08376bf225d54faf6
parent6c5553c4c9ef89e5c4b31e84ac9a7cc7100653a8 (diff)
downloadmongo-e1ef4d5c551f376b7302e12bda6cc11c20954a60.tar.gz
fix lexNumCmp with magic end of marker
Conflicts: db/update.cpp
-rw-r--r--db/update.cpp8
-rw-r--r--dbtests/basictests.cpp9
-rw-r--r--util/goodies.h8
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 );