Skip to content

Commit 40d51c4

Browse files
committed
parse sql escape symbol
1 parent 0cd14cb commit 40d51c4

File tree

13 files changed

+67
-38
lines changed

13 files changed

+67
-38
lines changed

uncoder-core/app/translator/core/str_value_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ class StrValueManager:
182182
container_spec_symbols_map: ClassVar[dict[type[BaseSpecSymbol], str]] = CONTAINER_SPEC_SYMBOLS_MAP
183183

184184
@staticmethod
185-
def from_str_to_container(value: str) -> StrValue:
185+
def from_str_to_container(value: str, escape_symbol: Optional[str] = None) -> StrValue: # noqa: ARG004
186186
return StrValue(value=value, split_value=[value])
187187

188188
def from_re_str_to_container(self, value: str) -> StrValue:

uncoder-core/app/translator/core/tokenizer.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ def search_multi_value(
162162

163163
def _get_field_value_match(self, query: str, operator: str, field_name: str, value_pattern: str) -> re.Match:
164164
field_value_pattern = self.get_field_value_pattern(operator, field_name, value_pattern)
165-
field_value_regex = re.compile(field_value_pattern, re.IGNORECASE)
166-
field_value_match = re.match(field_value_regex, query)
165+
field_value_match = re.match(field_value_pattern, query, re.IGNORECASE)
167166
if field_value_match is None:
168167
raise TokenizerGeneralException(error=f"Value couldn't be found in query part: {query}")
169168

uncoder-core/app/translator/platforms/base/aql/str_value_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"""
1919

2020
import copy
21-
from typing import ClassVar
21+
from typing import ClassVar, Optional
2222

2323
from app.translator.core.custom_types.values import ValueType
2424
from app.translator.core.str_value_manager import (
@@ -55,7 +55,7 @@ class AQLStrValueManager(StrValueManager):
5555
"%": UnboundLenWildCard,
5656
}
5757

58-
def from_str_to_container(self, value: str) -> StrValue:
58+
def from_str_to_container(self, value: str, escape_symbol: Optional[str] = None) -> StrValue: # noqa: ARG002
5959
split = []
6060
prev_char = None
6161
for char in value:

uncoder-core/app/translator/platforms/base/lucene/str_value_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
-----------------------------------------------------------------
1818
"""
1919

20-
from typing import ClassVar
20+
from typing import ClassVar, Optional
2121

2222
from app.translator.core.str_value_manager import (
2323
BaseSpecSymbol,
@@ -68,7 +68,7 @@ class LuceneStrValueManager(StrValueManager):
6868
}
6969
re_str_spec_symbols_map = RE_STR_SPEC_SYMBOLS_MAP
7070

71-
def from_str_to_container(self, value: str) -> StrValue:
71+
def from_str_to_container(self, value: str, escape_symbol: Optional[str] = None) -> StrValue: # noqa: ARG002
7272
split = []
7373
prev_char = None
7474
for char in value:

uncoder-core/app/translator/platforms/base/spl/str_value_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
limitations under the License.
1717
-----------------------------------------------------------------
1818
"""
19-
from typing import ClassVar
19+
from typing import ClassVar, Optional
2020

2121
from app.translator.core.str_value_manager import BaseSpecSymbol, StrValue, StrValueManager, UnboundLenWildCard
2222
from app.translator.platforms.base.spl.escape_manager import spl_escape_manager
@@ -26,7 +26,7 @@ class SplStrValueManager(StrValueManager):
2626
escape_manager = spl_escape_manager
2727
str_spec_symbols_map: ClassVar[dict[str, type[BaseSpecSymbol]]] = {"*": UnboundLenWildCard}
2828

29-
def from_str_to_container(self, value: str) -> StrValue:
29+
def from_str_to_container(self, value: str, escape_symbol: Optional[str] = None) -> StrValue: # noqa: ARG002
3030
split = []
3131
prev_char = None
3232
for char in value:

uncoder-core/app/translator/platforms/base/sql/custom_types/__init__.py

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from app.translator.core.custom_types.values import ValueType
2+
3+
4+
class SQLValueType(ValueType):
5+
like_value = "like_value"

uncoder-core/app/translator/platforms/base/sql/escape_manager.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
from typing import ClassVar
22

3-
from app.translator.core.custom_types.values import ValueType
43
from app.translator.core.escape_manager import EscapeManager
54
from app.translator.core.models.escape_details import EscapeDetails
5+
from app.translator.platforms.base.sql.custom_types.values import SQLValueType
66

77

88
class SQLEscapeManager(EscapeManager):
99
escape_map: ClassVar[dict[str, list[EscapeDetails]]] = {
10-
ValueType.value: [EscapeDetails(pattern=r"(')", escape_symbols=r"'\1")],
11-
ValueType.regex_value: [
10+
SQLValueType.value: [EscapeDetails(pattern=r"(')", escape_symbols=r"'\1")],
11+
SQLValueType.like_value: [EscapeDetails(pattern=r"(['%_\\])", escape_symbols=r"\\\1")],
12+
SQLValueType.regex_value: [
1213
EscapeDetails(pattern=r"([$^*+()\[\]{}|.?\-\\])", escape_symbols=r"\\\1"),
1314
EscapeDetails(pattern=r"(')", escape_symbols=r"'\1"),
1415
],

uncoder-core/app/translator/platforms/base/sql/renders/sql.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from app.translator.core.custom_types.values import ValueType
2222
from app.translator.core.mapping import LogSourceSignature
2323
from app.translator.core.render import BaseFieldValueRender, PlatformQueryRender
24+
from app.translator.platforms.base.sql.custom_types.values import SQLValueType
2425
from app.translator.platforms.base.sql.str_value_manager import sql_str_value_manager
2526

2627

@@ -56,17 +57,23 @@ def greater_or_equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> st
5657
def contains_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
5758
if isinstance(value, list):
5859
return f"({self.or_token.join(self.contains_modifier(field=field, value=v) for v in value)})"
59-
return f"{field} like '%{self._pre_process_value(field, value)}%'"
60+
61+
value = f"'%{self._pre_process_value(field, value, value_type=SQLValueType.like_value)}%' escape '\\'"
62+
return f"{field} like {value}"
6063

6164
def endswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
6265
if isinstance(value, list):
6366
return f"({self.or_token.join(self.endswith_modifier(field=field, value=v) for v in value)})"
64-
return f"{field} like '%{self._pre_process_value(field, value)}'"
67+
68+
value = f"'%{self._pre_process_value(field, value, value_type=SQLValueType.like_value)}' escape '\\'"
69+
return f"{field} like {value}"
6570

6671
def startswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
6772
if isinstance(value, list):
6873
return f"({self.or_token.join(self.startswith_modifier(field=field, value=v) for v in value)})"
69-
return f"{field} like '{self._pre_process_value(field, value)}%'"
74+
75+
value = f"'{self._pre_process_value(field, value, value_type=SQLValueType.like_value)}%' escape '\\'"
76+
return f"{field} like {value}"
7077

7178
def regex_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
7279
if isinstance(value, list):

uncoder-core/app/translator/platforms/base/sql/str_value_manager.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"""
1919

2020
import copy
21-
from typing import ClassVar
21+
from typing import ClassVar, Optional
2222

2323
from app.translator.core.custom_types.values import ValueType
2424
from app.translator.core.str_value_manager import (
@@ -55,20 +55,28 @@ class SQLStrValueManager(StrValueManager):
5555
"%": UnboundLenWildCard,
5656
}
5757

58-
def from_str_to_container(self, value: str) -> StrValue:
58+
def from_str_to_container(self, value: str, escape_symbol: Optional[str] = None) -> StrValue:
5959
split = []
6060
prev_char = None
6161
for char in value:
62-
if char in self.str_spec_symbols_map:
63-
split.append(self.str_spec_symbols_map[char]())
64-
else:
65-
if char == "'":
66-
if prev_char == "'":
67-
split.append(char)
68-
prev_char = None
69-
continue
70-
prev_char = char
62+
if escape_symbol and char == escape_symbol:
63+
if prev_char == escape_symbol:
64+
split.append(char)
65+
prev_char = None
7166
continue
67+
prev_char = char
68+
continue
69+
if not escape_symbol and char == "'":
70+
if prev_char == "'":
71+
split.append(char)
72+
prev_char = None
73+
continue
74+
elif char in ("'", "_", "%"):
75+
if escape_symbol and prev_char == escape_symbol:
76+
split.append(char)
77+
elif char in self.str_spec_symbols_map:
78+
split.append(self.str_spec_symbols_map[char]())
79+
else:
7280
split.append(char)
7381

7482
prev_char = char

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy