-
-
Notifications
You must be signed in to change notification settings - Fork 115
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
table.transform()
should preserve rowid
values
#592
Comments
That's odd, I wrote a test for this just now and it passes already: def test_transform_preserves_rowids(fresh_db):
# Create a rowid table
fresh_db["places"].insert_all(
(
{"name": "Paris", "country": "France"},
{"name": "London", "country": "UK"},
{"name": "New York", "country": "USA"},
),
)
assert fresh_db["places"].use_rowid
previous_rows = list(
tuple(row) for row in fresh_db.execute("select rowid, name from places")
)
# Transform it
fresh_db["places"].transform(column_order=("country", "name"))
# Should be the same
next_rows = list(
tuple(row) for row in fresh_db.execute("select rowid, name from places")
)
assert previous_rows == next_rows So maybe I'm wrong about the cause of that bug? |
I tried bumping that up to 10,000 rows instead of just 3 but the test still passed. |
I just noticed that the table where I encountered this bug wasn't actually a The reason the But I tried this test and it passed, too: def test_transform_preserves_rowids(fresh_db):
fresh_db["places"].insert_all(
[
{"id": "1", "name": "Paris", "country": "France"},
{"id": "2", "name": "London", "country": "UK"},
{"id": "3", "name": "New York", "country": "USA"},
],
pk="id",
)
previous_rows = list(
tuple(row) for row in fresh_db.execute("select rowid, id, name from places")
)
# Transform it
fresh_db["places"].transform(column_order=("country", "name"))
# Should be the same
next_rows = list(
tuple(row) for row in fresh_db.execute("select rowid, id, name from places")
)
assert previous_rows == next_rows |
Oh! Maybe the row ID preservation here is a coincidence because the tables are created from scratch and count 1, 2, 3. If I delete a row from the table and then insert some more - breaking the |
Yes! That recreated the bug:
|
In working on this I learned that https://www.sqlite.org/lang_vacuum.html#how_vacuum_works
So this fix wasn't as valuable as I thought. I need to move away from ever assuming that a |
I just spotted a bug when using https://datasette.io/plugins/datasette-configure-fts and https://datasette.io/plugins/datasette-edit-schema at the same time.
Steps to reproduce:
I got the wrong search results, which I think is because the
_fts
table pointed to the first table byrowid
but thoserowid
values were entirely rewritten as a consequence of runningtable.transform()
on the table.Reconfiguring FTS on the table fixed the problem.
I think
table.transform()
should be able to preserverowid
values.The text was updated successfully, but these errors were encountered: