#36492: Sqlite: lack of specificity when querying against booleans hurts the query-
optimizer
-------------------------------------+-------------------------------------
Reporter: Klaas van Schelven | Owner: Simon
| Charette
Type: Bug | Status: assigned
Component: Database layer | Version: 5.2
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Simon Charette):
* component: Uncategorized => Database layer (models, ORM)
* owner: (none) => Simon Charette
* stage: Unreviewed => Accepted
* status: new => assigned
* type: Uncategorized => Bug
Comment:
Managed to reproduce as well
{{{#!sql
sqlite> CREATE TABLE foo (a int, b int);
sqlite> CREATE INDEX some_idx ON foo (a, b);
sqlite> EXPLAIN SELECT * FROM foo WHERE NOT a AND NOT b;
addr opcode p1 p2 p3 p4 p5 comment
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 13 0 0 Start at 13
1 OpenRead 0 2 0 2 0 root=2 iDb=0;
foo
2 Explain 2 0 0 SCAN foo 0
3 Rewind 0 12 0 0
4 Column 0 0 1 0 r[1]=foo.a
5 If 1 11 1 0
6 Column 0 1 1 0 r[1]=foo.b
7 If 1 11 1 0
8 Column 0 0 2 0 r[2]=foo.a
9 Column 0 1 3 0 r[3]=foo.b
10 ResultRow 2 2 0 0 output=r[2..3]
11 Next 0 4 0 1
12 Halt 0 0 0 0
13 Transaction 0 0 2 0 1
usesStmtJournal=0
14 Goto 0 1 0 0
sqlite> EXPLAIN SELECT * FROM foo WHERE a=false AND b=false;
addr opcode p1 p2 p3 p4 p5 comment
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 12 0 0 Start at 12
1 OpenRead 1 3 0 k(3,,,) 2 root=3 iDb=0;
some_idx
2 Explain 2 0 0 SEARCH foo USING COVERING INDEX
some_idx (a=? AND b=?) 0
3 Integer 0 1 0 0 r[1]=0
4 Integer 0 2 0 0 r[2]=0
5 SeekGE 1 11 1 2 0 key=r[1..2]
6 IdxGT 1 11 1 2 0 key=r[1..2]
7 Column 1 0 3 0 r[3]=foo.a
8 Column 1 1 4 0 r[4]=foo.b
9 ResultRow 3 2 0 0 output=r[3..4]
10 Next 1 6 1 0
11 Halt 0 0 0 0
12 Transaction 0 0 2 0 1
usesStmtJournal=0
13 Goto 0 1 0 0
}}}
(notice how the NOT usage doesn't make use of the covering index)
Unfortunately Django doesn't have a `has_native_boolean_field` feature
flag so the closest we could do here is override
`conditional_expression_supported_in_where_clause` like we did in #32691.
I'll try to submit work that unifies the different code path we have in
place today.
--
Ticket URL: <
https://code.djangoproject.com/ticket/36492#comment:1>