Fix _decode_default_value to unescape doubled single quotes in string defaults (#811)

* Fix _decode_default_value to unescape doubled single quotes in string defaults

SQLite stores string defaults with single quotes doubled (e.g. DEFAULT 'O''Brien'
is stored as the literal "'O''Brien'" in sqlite_master). The previous code
stripped the outer quotes with value[1:-1] but never converted '' back to ',
so default_values returned the raw escaped form instead of the true string value.

* Test for doubled single quotes in string defaults
This commit is contained in:
ikatyal2110 2026-07-25 23:52:04 -05:00 committed by GitHub
commit 6a456830ca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 13 additions and 2 deletions

View file

@ -5108,8 +5108,8 @@ def resolve_extracts(
def _decode_default_value(value: str) -> object:
if value.startswith("'") and value.endswith("'"):
# It's a string
return value[1:-1]
# It's a string; unescape doubled single quotes
return value[1:-1].replace("''", "'")
if value.isdigit():
# It's an integer
return int(value)

View file

@ -312,6 +312,7 @@ def test_table_strict(fresh_db, create_table, expected_strict):
1,
1.3,
"foo",
"O'Brien",
True,
b"binary",
),
@ -324,6 +325,16 @@ def test_table_default_values(fresh_db, value):
assert default_values == {"value": value}
def test_table_default_values_escaped_quotes(fresh_db):
# SQLite stores string defaults with single quotes doubled, so
# introspection needs to unescape them again
fresh_db.execute(
"create table t (id integer primary key, name text default 'O''Brien')"
)
assert "default 'O''Brien'" in fresh_db["t"].schema
assert fresh_db["t"].default_values == {"name": "O'Brien"}
def test_pks_use_primary_key_declaration_order(fresh_db):
# PRIMARY KEY (a, b) declared against columns stored in order (b, a) -
# pks must follow the declaration order, which is what SQLite uses to