From 6d9fa91da4a553f6629dd2f7ec7e9147dfe0e727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E5=A4=A7=E6=B4=8B?= <714403855@qq.com> Date: Fri, 12 Dec 2025 10:22:52 +0800 Subject: [PATCH] fix Special characters --- src/memos/graph_dbs/polardb.py | 16 ++++++++++++++-- .../textual/tree_text_memory/organize/manager.py | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/memos/graph_dbs/polardb.py b/src/memos/graph_dbs/polardb.py index 588011d51..50ff4ab90 100644 --- a/src/memos/graph_dbs/polardb.py +++ b/src/memos/graph_dbs/polardb.py @@ -2179,8 +2179,9 @@ def get_by_metadata( # Format value if isinstance(value, str): - # Escape single quotes in string values - escaped_str = value.replace("'", "''") + # Escape single quotes using backslash when inside $$ dollar-quoted strings + # In $$ delimiters, Cypher string literals can use \' to escape single quotes + escaped_str = value.replace("'", "\\'") escaped_value = f"'{escaped_str}'" elif isinstance(value, list): # Handle list values - use double quotes for Cypher arrays @@ -4153,6 +4154,17 @@ def _build_filter_conditions_cypher( if filter: def escape_cypher_string(value: str) -> str: + """ + Escape single quotes in Cypher string literals. + + In Cypher, single quotes in string literals are escaped by doubling them: ' -> '' + However, when inside PostgreSQL's $$ dollar-quoted string, we need to be careful. + + The issue: In $$ delimiters, Cypher still needs to parse string literals correctly. + The solution: Use backslash escape \' instead of doubling '' when inside $$. + """ + # Use backslash escape for single quotes inside $$ dollar-quoted strings + # This works because $$ protects the backslash from PostgreSQL interpretation return value.replace("'", "\\'") def build_cypher_filter_condition(condition_dict: dict) -> str: diff --git a/src/memos/memories/textual/tree_text_memory/organize/manager.py b/src/memos/memories/textual/tree_text_memory/organize/manager.py index 0561d178e..c8c3cb01c 100644 --- a/src/memos/memories/textual/tree_text_memory/organize/manager.py +++ b/src/memos/memories/textual/tree_text_memory/organize/manager.py @@ -134,7 +134,7 @@ def _add_memories_parallel( return added_ids def _add_memories_batch( - self, memories: list[TextualMemoryItem], user_name: str | None = None, batch_size: int = 10 + self, memories: list[TextualMemoryItem], user_name: str | None = None, batch_size: int = 50 ) -> list[str]: """ Add memories using batch database operations (more efficient for large batches).