Support comparing SQL when order is not guaranteed in some statements.

Review Request #12040 — Created Feb. 4, 2022 and submitted

Information

Django Evolution
release-2.x

Reviewers

Django doesn't always generate SQL statements in a pre-defined order.
When adding or dropping multiple indexes, for example, it builds up
indexes as a set, and then iterates through them. This made
comparisons pretty unreliable.

We now pass the generated and expected SQL through a normalization
process. Sections of the expected SQL can be wrapped in a set, which
will then be sorted. The matching section of the generated SQL will be
sorted as well.

This is not perfect. If the generated SQL in that range is not a match,
it will still be sorted, and this can lead to some wonky results during
comparison. The "Generated SQL" output still uses the original generated
content, though, to help.

This also will not work quite right if Django ends up generating any
unordered SQL where each unordered item is actually a list of SQL
statements, but currently it doesn't appear that that's something that
happens. (Work was done to try to handle this case preemptively, but
it's far too complicated.)

Relevant series of statements has been updated to use this.

Unit tests pass for all supported versions of Python and Django.

Summary ID
Support comparing SQL when order is not guaranteed in some statements.
Django doesn't always generate SQL statements in a pre-defined order. When adding or dropping multiple indexes, for example, it builds up indexes as a `set`, and then iterates through them. This made comparisons pretty unreliable. We now pass the generated and expected SQL through a normalization process. Sections of the expected SQL can be wrapped in a `set`, which will then be sorted. The matching section of the generated SQL will be sorted as well. This is not perfect. If the generated SQL in that range is not a match, it will still be sorted, and this can lead to some wonky results during comparison. The "Generated SQL" output still uses the original generated content, though, to help. This also will not work quite right if Django ends up generating any unordered SQL where each unordered item is actually a list of SQL statements, but currently it doesn't appear that that's something that happens. (Work was done to try to handle this case preemptively, but it's far too complicated.) Relevant series of statements has been updated to use this.
71e04bdc66ef6ad60fc51595dc060041221d55ca
david
  1. Ship It!
  2. 
      
chipx86
david
  1. Ship It!
  2. 
      
chipx86
Review request changed
Status:
Completed
Change Summary:
Pushed to release-2.x (b89ebc5)