Skip to content

Commit

Permalink
Escape special characters in regular expressions generated for LINQ q…
Browse files Browse the repository at this point in the history
…ueries involving strings.
  • Loading branch information
rstam committed Apr 9, 2012
1 parent 2b9e193 commit 2caf888
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 6 deletions.
5 changes: 2 additions & 3 deletions Driver/Linq/Translators/SelectQuery.cs
Expand Up @@ -824,7 +824,7 @@ private IMongoQuery BuildStringQuery(MethodCallExpression methodCallExpression)
return null;
}

var pattern = (string)constantExpression.Value; // TODO: escape value
var pattern = Regex.Escape((string)constantExpression.Value);
switch (methodCallExpression.Method.Name)
{
case "Contains": pattern = ".*" + pattern + ".*"; break;
Expand Down Expand Up @@ -1103,8 +1103,7 @@ private string GetTrimCharsPattern(Expression trimCharsExpression)
}
else
{
// TODO: handle special characters better
sb.Append(c.ToString());
sb.Append(Regex.Escape(c.ToString()));
}
}
if (sawDash)
Expand Down
29 changes: 26 additions & 3 deletions DriverUnitTests/Linq/SelectQueryTests.cs
Expand Up @@ -4259,6 +4259,29 @@ public void TestWhereSContainsAbcNot()
Assert.AreEqual(4, Consume(query));
}

[Test]
public void TestWhereSContainsDot()
{
var query = from c in _collection.AsQueryable<C>()
where c.S.Contains(".")
select c;

var translatedQuery = MongoQueryTranslator.Translate(query);
Assert.IsInstanceOf<SelectQuery>(translatedQuery);
Assert.AreSame(_collection, translatedQuery.Collection);
Assert.AreSame(typeof(C), translatedQuery.DocumentType);

var selectQuery = (SelectQuery)translatedQuery;
Assert.AreEqual("(C c) => c.S.Contains(\".\")", ExpressionFormatter.ToString(selectQuery.Where));
Assert.IsNull(selectQuery.OrderBy);
Assert.IsNull(selectQuery.Projection);
Assert.IsNull(selectQuery.Skip);
Assert.IsNull(selectQuery.Take);

Assert.AreEqual("{ \"s\" : /\\./s }", selectQuery.BuildQuery().ToJson());
Assert.AreEqual(0, Consume(query));
}

[Test]
public void TestWhereSEndsWithAbc()
{
Expand Down Expand Up @@ -4794,7 +4817,7 @@ public void TestWhereSTrimStartsWithXyzNot()
public void TestWhereSTrimStartTrimEndToLowerContainsXyz()
{
var query = from c in _collection.AsQueryable<C>()
where c.S.TrimStart(' ', '-', '\t').TrimEnd().ToLower().Contains("xyz")
where c.S.TrimStart(' ', '.', '-', '\t').TrimEnd().ToLower().Contains("xyz")
select c;

var translatedQuery = MongoQueryTranslator.Translate(query);
Expand All @@ -4803,13 +4826,13 @@ where c.S.TrimStart(' ', '-', '\t').TrimEnd().ToLower().Contains("xyz")
Assert.AreSame(typeof(C), translatedQuery.DocumentType);

var selectQuery = (SelectQuery)translatedQuery;
Assert.AreEqual("(C c) => c.S.TrimStart(Char[]:{ ' ', '-', '\t' }).TrimEnd(Char[]:{ }).ToLower().Contains(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
Assert.AreEqual("(C c) => c.S.TrimStart(Char[]:{ ' ', '.', '-', '\t' }).TrimEnd(Char[]:{ }).ToLower().Contains(\"xyz\")", ExpressionFormatter.ToString(selectQuery.Where));
Assert.IsNull(selectQuery.OrderBy);
Assert.IsNull(selectQuery.Projection);
Assert.IsNull(selectQuery.Skip);
Assert.IsNull(selectQuery.Take);

Assert.AreEqual("{ \"s\" : /^[ \t-]*.*xyz.*\\s*$/is }", selectQuery.BuildQuery().ToJson());
Assert.AreEqual("{ \"s\" : /^[\\ \\.\\t-]*.*xyz.*\\s*$/is }", selectQuery.BuildQuery().ToJson());
Assert.AreEqual(1, Consume(query));
}

Expand Down

0 comments on commit 2caf888

Please sign in to comment.