From 70f7fe75426b76debfce787a0ee2eb398c27a1ce Mon Sep 17 00:00:00 2001 From: Julius Park Date: Mon, 6 Dec 2021 13:13:15 -0800 Subject: [PATCH] PYTHON-3028 $regex as a field name does not allow for non-string values (#807) --- bson/json_util.py | 2 +- test/test_json_util.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bson/json_util.py b/bson/json_util.py index 0644874b4..ed67d9a36 100644 --- a/bson/json_util.py +++ b/bson/json_util.py @@ -508,7 +508,7 @@ def object_hook(dct, json_options=DEFAULT_JSON_OPTIONS): def _parse_legacy_regex(doc): pattern = doc["$regex"] # Check if this is the $regex query operator. - if isinstance(pattern, Regex): + if not isinstance(pattern, (str, bytes)): return doc flags = 0 # PyMongo always adds $options but some other tools may not. diff --git a/test/test_json_util.py b/test/test_json_util.py index f28b75c9b..dbf4f1c26 100644 --- a/test/test_json_util.py +++ b/test/test_json_util.py @@ -270,6 +270,15 @@ class TestJsonUtil(unittest.TestCase): json_util.dumps(Regex('.*', re.M | re.X), json_options=LEGACY_JSON_OPTIONS)) + def test_regex_validation(self): + non_str_types = [10, {}, []] + docs = [{"$regex": i} for i in non_str_types] + for doc in docs: + self.assertEqual(doc, json_util.loads(json.dumps(doc))) + + doc = {"$regex": ""} + self.assertIsInstance(json_util.loads(json.dumps(doc)), Regex) + def test_minkey(self): self.round_trip({"m": MinKey()})