PYTHON-3028 $regex as a field name does not allow for non-string values (#807)

This commit is contained in:
Julius Park 2021-12-06 13:13:15 -08:00 committed by GitHub
parent 44853ea9c3
commit 70f7fe7542
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 1 deletions

View File

@ -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.

View File

@ -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()})