From 0af10a17e7dd672282d6bb701dfd19b32d6f7a2b Mon Sep 17 00:00:00 2001 From: JSCU-CNI <121175071+JSCU-CNI@users.noreply.github.com> Date: Mon, 2 Feb 2026 18:15:27 +0100 Subject: [PATCH 1/3] Fix for simple primary key constraints with multiple parts --- dissect/database/sqlite3/util.py | 3 +-- tests/sqlite3/test_util.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/dissect/database/sqlite3/util.py b/dissect/database/sqlite3/util.py index a589b5c..20cc0b9 100644 --- a/dissect/database/sqlite3/util.py +++ b/dissect/database/sqlite3/util.py @@ -139,6 +139,5 @@ def get_primary_key_from_constraint(column_type_constraint: str, column_def: str # part. if len(primary_key_defs) == 1: primary_key_parts = primary_key_defs[0].split(maxsplit=1) - if len(primary_key_parts) == 1: - primary_key = primary_key_parts[0] + primary_key = primary_key_parts[0].strip("'\"") return primary_key diff --git a/tests/sqlite3/test_util.py b/tests/sqlite3/test_util.py index eb083d5..e844af8 100644 --- a/tests/sqlite3/test_util.py +++ b/tests/sqlite3/test_util.py @@ -155,6 +155,21 @@ ), id="create-table-firefox-foreign-in-column-name", ), + # Primary key constraint with multiple parts, but not a compound/composite constraint. + pytest.param( + 'CREATE TABLE "example"("foo" INTEGER, "bar" TEXT NOT NULL, PRIMARY KEY("foo" AUTOINCREMENT))', + ( + "foo", + [ + ("foo", "INTEGER"), + ("bar", "TEXT NOT NULL"), + ], + [ + 'PRIMARY KEY("foo" AUTOINCREMENT)', + ], + ), + id="primary-key-constraint-multiple-parts", + ) ] From cd786be8836473c9bd9b9b48c2b7a21fdcbce6ae Mon Sep 17 00:00:00 2001 From: JSCU-CNI <121175071+JSCU-CNI@users.noreply.github.com> Date: Tue, 3 Feb 2026 18:45:01 +0100 Subject: [PATCH 2/3] add comment --- dissect/database/sqlite3/util.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dissect/database/sqlite3/util.py b/dissect/database/sqlite3/util.py index 20cc0b9..1e20ff8 100644 --- a/dissect/database/sqlite3/util.py +++ b/dissect/database/sqlite3/util.py @@ -134,9 +134,8 @@ def get_primary_key_from_constraint(column_type_constraint: str, column_def: str ) matched_group = primary_key_sql.groups()[0] primary_key_defs = list(split_sql_list(matched_group)) - # We only handle single primary keys, no compound keys or - # expressions, so a single entry in the list consisting of a single - # part. + # We only handle single primary keys, no compound keys or expressions, so a single entry in the list consisting of + # a single part. For example we parse ``id`` as a primary_key in the constraint ``PRIMARY KEY("id" AUTOINCREMENT)``. if len(primary_key_defs) == 1: primary_key_parts = primary_key_defs[0].split(maxsplit=1) primary_key = primary_key_parts[0].strip("'\"") From 4202573b914c24c6611cfb90121a3c8aa3dba76b Mon Sep 17 00:00:00 2001 From: JSCU-CNI <121175071+JSCU-CNI@users.noreply.github.com> Date: Wed, 4 Feb 2026 10:43:28 +0100 Subject: [PATCH 3/3] fix linter --- tests/sqlite3/test_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sqlite3/test_util.py b/tests/sqlite3/test_util.py index e844af8..50da300 100644 --- a/tests/sqlite3/test_util.py +++ b/tests/sqlite3/test_util.py @@ -169,7 +169,7 @@ ], ), id="primary-key-constraint-multiple-parts", - ) + ), ]