#33460: Change SQLite backend to generate INSERT statements using VALUES 
instead of
UNION.
-------------------------------------+-------------------------------------
               Reporter:  Keryn      |          Owner:  Keryn Knight
  Knight                             |
                   Type:             |         Status:  assigned
  Cleanup/optimization               |
              Component:  Database   |        Version:  dev
  layer (models, ORM)                |       Keywords:  sqlite orm
               Severity:  Normal     |  bulk_create batch
           Triage Stage:             |      Has patch:  1
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 This is a ticket for tracking this
 [https://github.com/django/django/pull/15354 pre-emptive PR].

 Django's minimum supported version of SQLite is currently documented as
 3.9.

 Using `INSERT INTO ... VALUES (...)` instead of `INSERT INTO ... SELECT
 UNION ALL ...` for multiple rows (i.e. `bulk_create`) was added to SQLite
 in [http://www.sqlite.org/releaselog/3_7_11.html 3.7.11] released in 2012.

 [https://www.sqlite.org/releaselog/3_8_8.html SQLite 3.8.8], released in
 2015, further changed it so that `VALUES(...)` was not subject to the
 `SQLITE_LIMIT_COMPOUND_SELECT` value, which should subsequently allow for
 improvements in batch sizes (e.g. investigating changes to
 `django.db.backends.sqlite3.operations.DatabaseOperations.bulk_batch_size`
 and
 `django.db.backends.sqlite3.features.DatabaseFeatures.max_query_params`,
 the latter of which supports `32766 ` values instead of `999` as of
 [https://www.sqlite.org/releaselog/3_32_0.html 3.32.0])

 The documentation for current SQLite (3.37.2) says, of using
 `VALUES(...)`:

 > The phrase "VALUES(expr-list)" means the same thing as "SELECT expr-
 list". The phrase "VALUES(expr-list-1),...,(expr-list-N)" means the same
 thing as "SELECT expr-list-1 UNION ALL ... UNION ALL SELECT expr-list-N".
 Both forms are the same, except that the number of SELECT statements in a
 compound is limited by SQLITE_LIMIT_COMPOUND_SELECT whereas the number of
 rows in a VALUES clause has no arbitrary limit.
 > There are some restrictions on the use of a VALUES clause that are not
 shown on the syntax diagrams:
 > A VALUES clause cannot be followed by ORDER BY.
 > A VALUES clause cannot be followed by LIMIT.

 I have run the test suite against `3.37.2` and whatever the CI versions
 are (I've not checked) ... so far so good.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33460>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.267f6d917e18c188dd60a63b4c5e7f48%40djangoproject.com.

Reply via email to