Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions dbt/adapters/sqlserver/sqlserver_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,11 +210,17 @@ def build_server_arg(credentials: SQLServerCredentials) -> str:


def format_connection_string_value(value: Optional[str], mssql_python_backend: bool) -> str:
"""Format a connection-string value for the requested backend."""
"""Format a connection-string value for the requested backend.

Inside a brace-quoted ODBC value a literal ``}`` must be doubled to ``}}``;
otherwise the driver treats it as the closing brace and misparses the rest
of the connection string.
"""

if mssql_python_backend:
return escape_connection_string_value(value)
return "{" + ("" if value is None else value) + "}"
text = "" if value is None else str(value)
return "{" + text.replace("}", "}}") + "}"


def format_pyodbc_driver_value(value: Optional[str]) -> str:
Expand Down
13 changes: 13 additions & 0 deletions tests/unit/adapters/mssql/test_sqlserver_connection_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
from dbt.adapters.sqlserver.sqlserver_helpers import (
bool_to_connection_string_arg,
escape_connection_string_value,
format_connection_string_value,
is_mssql_python_backend,
sanitize_connection_string_for_logging,
validate_connection_requirements,
Expand Down Expand Up @@ -349,6 +350,18 @@ def test_escape_connection_string_value_quotes_only_when_needed() -> None:
assert escape_connection_string_value("trailing ") == "{trailing }"


def test_format_connection_string_value_doubles_braces_for_pyodbc() -> None:
assert format_connection_string_value("plain", mssql_python_backend=False) == "{plain}"
assert format_connection_string_value("pa}ss", mssql_python_backend=False) == "{pa}}ss}"
assert format_connection_string_value("}{", mssql_python_backend=False) == "{}}{}"
assert format_connection_string_value(None, mssql_python_backend=False) == "{}"


def test_format_connection_string_value_delegates_for_mssql_python() -> None:
assert format_connection_string_value("plain", mssql_python_backend=True) == "plain"
assert format_connection_string_value("pa}ss", mssql_python_backend=True) == "{pa}}ss}"


def test_sanitize_connection_string_for_logging_redacts_common_secret_fields() -> None:
sanitized = sanitize_connection_string_for_logging(
"SERVER=fake;UID=user@example.com;User Id=another@example.com;"
Expand Down
Loading