{"record":{"id":"8596f53551843744","repo":"mem0ai/mem0","slug":"invalid-filter-key-key-r","errorCode":null,"errorMessage":"Invalid filter key: {key!r}","messagePattern":"Invalid filter key: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mem0/vector_stores/baidu.py","lineNumber":418,"sourceCode":"            )\n        except Exception as e:\n            logger.warning(f\"Error resetting table: {e}\")\n            raise\n\n    def _create_filter(self, filters: dict) -> str:\n        \"\"\"\n        Create filter expression for queries.\n\n        Args:\n            filters (dict): Filter conditions.\n\n        Returns:\n            str: Filter expression.\n        \"\"\"\n        conditions = []\n        for key, value in filters.items():\n            if not self._SAFE_FILTER_KEY.match(key):\n                raise ValueError(f\"Invalid filter key: {key!r}\")\n            if isinstance(value, str):\n                escaped = value.replace(\"\\\\\", \"\\\\\\\\\").replace('\"', '\\\\\"')\n                conditions.append(f'metadata[\"{key}\"] = \"{escaped}\"')\n            elif isinstance(value, (int, float, bool)):\n                conditions.append(f'metadata[\"{key}\"] = {value}')\n            else:\n                raise ValueError(\n                    f\"Filter value for {key!r} must be str, int, float, or bool, \"\n                    f\"got {type(value).__name__}\"\n                )\n        return \" AND \".join(conditions)\n","sourceCodeStart":400,"sourceCodeEnd":430,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/mem0/vector_stores/baidu.py#L400-L430","documentation":"BaiduDB._create_filter raises ValueError when a metadata filter key fails the _SAFE_FILTER_KEY regex ^[a-zA-Z_][a-zA-Z0-9_]*$. Because keys are interpolated directly into a SQL-like expression metadata[\"key\"] = value, non-identifier keys (spaces, dots, hyphens, leading digits, empty strings) are rejected to prevent injection into the Baidu query language.","triggerScenarios":"Calling search/get on BaiduDB with filters={'user-id': 'x'}, {'meta.key': 'v'}, {'2key': 1}, or any key containing characters outside [A-Za-z0-9_] or starting with a digit. Only runs when filters is a non-empty dict.","commonSituations":"Passing structured metadata keys that came from JSON payloads with dots/hyphens; copying filter syntax from another provider (e.g. Qdrant nested 'metadata.field' paths); machine-generated keys from user data.","solutions":["Rename the metadata key to a plain identifier (letters, digits, underscore, not starting with a digit) both in stored payloads and in filters.","Sanitize keys before calling search: re.sub(r'[^A-Za-z0-9_]', '_', key).","Drop or reject non-conforming keys early at the API boundary instead of letting the vector store throw."],"exampleFix":"# before\nresults = db.search(query=\"...\", vectors=[...], filters={\"user-id\": \"alice\"})  # ValueError\n\n# after\nresults = db.search(query=\"...\", vectors=[...], filters={\"user_id\": \"alice\"})","handlingStrategy":"validation","validationCode":"import re\n_SAFE_KEY = re.compile(r\"^[a-zA-Z_][a-zA-Z0-9_]*$\")\n\ndef sanitize_filters(filters: dict) -> dict:\n    out = {}\n    for k, v in (filters or {}).items():\n        if not _SAFE_KEY.match(k or \"\"):\n            k2 = re.sub(r\"[^A-Za-z0-9_]\", \"_\", str(k))\n            if not re.match(r\"^[A-Za-z_]\", k2):\n                k2 = \"f_\" + k2\n            k = k2\n        out[k] = v\n    return out\n\ndb.search(query, vectors, filters=sanitize_filters(filters))","typeGuard":"def has_safe_filter_keys(filters: dict) -> bool:\n    import re\n    return all(isinstance(k, str) and re.match(r\"^[a-zA-Z_][a-zA-Z0-9_]*$\", k) for k in (filters or {}))","tryCatchPattern":null,"preventionTips":["Restrict stored metadata keys to identifier-safe names at write time.","Never build filter keys from raw user input.","Centralize filter normalization in one helper reused by every provider call."],"tags":["baidu","filters","validation","injection-guard"],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}