Praneshrajan15's picture
Deploy DataForge playground API
13fe504 verified
Raw
History Blame Contribute Delete
999 Bytes
"""SQL rendering helpers for DataForge table-store adapters."""
from __future__ import annotations
import re
_SAFE_RELATION_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*|\.\"[^\"]+\")*$")
_SAFE_IDENTIFIER_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
def ensure_safe_relation(relation: str) -> str:
"""Return a validated relation identifier or raise ``ValueError``."""
if not _SAFE_RELATION_RE.fullmatch(relation):
raise ValueError(f"Unsafe relation identifier: {relation}")
return relation
def quote_identifier(identifier: str) -> str:
"""Return a double-quoted SQL identifier after strict validation."""
if not _SAFE_IDENTIFIER_RE.fullmatch(identifier):
raise ValueError(f"Unsafe column identifier: {identifier}")
return f'"{identifier}"'
def sql_literal(value: object) -> str:
"""Render a SQL string literal for generated patch statements."""
return "'" + str(value).replace("'", "''") + "'"