Condense ALTER TABLEs when possible.

Review Request #5190 — Created Jan. 3, 2014 and submitted — Latest diff uploaded

Information

Django Evolution
master

Reviewers

Condense ALTER TABLEs when possible.

When possible, multiple ALTER TABLE rules are now combined, resulting in
fewer table rebuilds. Adjacent ADD COLUMN, MODIFY COLUMN, and
DELETE COLUMN operations within a single batch of operations will be
condensed together.

When processing operations, AlterTableSQLResult will take the various
Alter Table operations and put them into batches of ALTER TABLE
statements. Typically, all operations in a batch will be turned into one
statement, but an Alter Table entry can set independent=True to ensure
it's part of its own ALTER TABLE, in the proper order.

generate_table_op_sql takes the operations for a model and combines
their SQL into an AlterTableSQLResult. If there are multiple adjacent
operations in a row that can be merged together (add_column,
change_column, delete_column), they'll be placed into the same
AlterTableSQLResult.

The result is a fairly compact list of ALTER TABLE statements that
trigger table rebuilds. It's still dependent on the ordering of
mutations, though.

Unit tests pass for all databases.

Checked SQL output for an RB 1.7.x to 2.0 upgrade. The number of
ALTER TABLE statements dropped by 3 (leaving 20 table-rebuilding
statements for 13 tables). Future changes should get this down to 13
for 13.