diff --git a/dbtests/basictests.cpp b/dbtests/basictests.cpp index 97fb748249a96..48df6ac9775f9 100644 --- a/dbtests/basictests.cpp +++ b/dbtests/basictests.cpp @@ -406,7 +406,8 @@ namespace BasicTests { ASSERT_EQUALS( -1, lexNumCmp( "000a", "001a")); ASSERT_EQUALS( 0, lexNumCmp( "010a", "0010a")); - ASSERT_EQUALS( 1 , lexNumCmp( "a0" , "a00" ) ); + ASSERT_EQUALS( -1 , lexNumCmp( "a0" , "a00" ) ); + ASSERT_EQUALS( 0 , lexNumCmp( "a.0" , "a.00" ) ); } }; diff --git a/jstests/updatea.js b/jstests/updatea.js index 9864aa6788985..5b45d60f7bfc3 100644 --- a/jstests/updatea.js +++ b/jstests/updatea.js @@ -47,4 +47,10 @@ t.update( {} , { $inc: { "a.10" : 1 } } ); orig.a[10]++; +// SERVER-3218 +t.drop() +t.insert({"a":{"c00":1}, 'c':2}) +t.update({"c":2}, {'$inc':{'a.c000':1}}) + +assert.eq( { "c00" : 1 , "c000" : 1 } , t.findOne().a , "D1" ) diff --git a/util/stringutils.h b/util/stringutils.h index 1dad4beb9b429..1b1ff5613e7a3 100644 --- a/util/stringutils.h +++ b/util/stringutils.h @@ -44,6 +44,9 @@ 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; + + bool startWord = true; + while( *s1 && *s2 ) { bool p1 = ( *s1 == (char)255 ); @@ -59,8 +62,11 @@ namespace mongo { if ( n1 && n2 ) { // get rid of leading 0s - while ( *s1 == '0' ) s1++; - while ( *s2 == '0' ) s2++; + if ( startWord ) { + while ( *s1 == '0' ) s1++; + while ( *s2 == '0' ) s2++; + startWord = false; + } char * e1 = (char*)s1; char * e2 = (char*)s2; @@ -91,7 +97,7 @@ namespace mongo { s2 = e2; continue; } - + if ( n1 ) return 1; @@ -103,7 +109,11 @@ namespace mongo { if ( *s2 > *s1 ) return -1; - + + if ( *s1 == '.' ) + startWord = true; + else + startWord = false; s1++; s2++; }