Fixed introspection of default values TRUE / FALSE / NULL

Closes #836
This commit is contained in:
Simon Willison 2026-08-12 14:19:30 -07:00
commit 88b48fa167
3 changed files with 42 additions and 0 deletions

View file

@ -5270,6 +5270,13 @@ def _decode_default_value(value: str) -> object:
# It's a binary string, stored as hex
to_decode = value[2:-1]
return binascii.unhexlify(to_decode)
upper = value.upper()
if upper == "TRUE":
return True
if upper == "FALSE":
return False
if upper == "NULL":
return None
# If it is a string containing a floating point number:
try:
return float(value)

View file

@ -1509,6 +1509,26 @@ def test_create_transform(fresh_db, cols, kwargs, expected_schema, should_transf
assert fresh_db.table("demo").count == 1
def test_create_transform_keyword_literal_defaults_unchanged(fresh_db):
fresh_db.execute(
"create table demo ("
"id integer primary key, "
"enabled integer default TRUE, "
"disabled integer default FALSE, "
"nullable text default NULL"
")"
)
traces = []
with fresh_db.tracer(lambda sql, parameters: traces.append((sql, parameters))):
fresh_db.table("demo").create(
{"id": int, "enabled": int, "disabled": int, "nullable": str},
pk="id",
defaults={"enabled": True, "disabled": False, "nullable": None},
transform=True,
)
assert not any(sql.startswith("CREATE TABLE") for sql, _ in traces)
def test_rename_table(fresh_db):
fresh_db.table("t").insert({"foo": "bar"})
assert ["t"] == fresh_db.table_names()

View file

@ -393,6 +393,21 @@ def test_table_default_values_escaped_quotes(fresh_db):
assert fresh_db.table("t").default_values == {"name": "O'Brien"}
def test_table_default_values_keyword_literals(fresh_db):
fresh_db.execute(
"create table t ("
"enabled integer default TRUE, "
"disabled integer default false, "
"nullable text default NULL"
")"
)
assert fresh_db.table("t").default_values == {
"enabled": True,
"disabled": False,
"nullable": None,
}
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