diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index a59597b..2478189 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -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) diff --git a/tests/test_create.py b/tests/test_create.py index 83ce403..e900aee 100644 --- a/tests/test_create.py +++ b/tests/test_create.py @@ -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() diff --git a/tests/test_introspect.py b/tests/test_introspect.py index 03b02cc..343424d 100644 --- a/tests/test_introspect.py +++ b/tests/test_introspect.py @@ -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