Fix adding new non-NULL fields when there's existing data on SQLite.

Review Request #11383 — Created Jan. 19, 2021 and submitted — Latest diff uploaded

Information

Django Evolution
release-2.x

Reviewers

Django Evolution 2.0 regressed adding non-NULL fields to a table
containing existing data. Previous versions would set the column to
allow NULL value in the temporary table, copy data over to it, create
the destination table with the current NULL flag, and copy data back.
2.0 changed this to follow the modern, recommended approach of creating
the proper schema for the temporary table, but that meant that the
column could no longer be left empty.

We now set the initial value as part of the INSERT statement, instead
of in a follow-up UPDATE statement. This is the same approach Django
chose, confirming that it's sound.

Some additional logic has been added to work around a data loss bug
that's been present (but never encountered in our use) for many years.
When going from a NULL to a non-NULL, we'd override any copied data with
initial data. Definitely not good. We now use the copied data if
available, and set an initial value if not.

All unit tests pass for all versions of Python and Django.

Commits

Files