Skip to content

Commit aa1bdf8

Browse files
committed
force_index and use_index PRIMARY clarify
1 parent ebf8556 commit aa1bdf8

File tree

4 files changed

+19
-8
lines changed

4 files changed

+19
-8
lines changed

src/django_mysql/models/query.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,8 @@ def _index_hint(
262262

263263
if len(index_names) == 0:
264264
indexes = "NONE"
265+
elif len(index_names) == 1 and index_names[0] == 'PRIMARY':
266+
indexes = 'PRIMARY'
265267
else:
266268
indexes = "`" + "`,`".join(index_names) + "`"
267269

src/django_mysql/rewrite_query.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
(?P<for_what>JOIN|ORDER\ BY|GROUP\ BY)
3434
\ # space
3535
)?
36-
(?P<index_names>(`[^`]+`(,`[^`]+`)*)|NONE)
36+
(?P<index_names>(`[^`]+`(,`[^`]+`)*)|NONE|PRIMARY)
3737
""",
3838
re.VERBOSE,
3939
)

tests/testapp/test_models.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ def test_use_index(self):
244244
def test_use_index_primary(self):
245245
with CaptureLastQuery() as cap:
246246
list(Author.objects.use_index("PRIMARY"))
247-
assert ("USE INDEX (`PRIMARY`)") in cap.query
247+
assert ("USE INDEX (PRIMARY)") in cap.query
248248
used = used_indexes(cap.query)
249249
assert len(used) == 0 or "PRIMARY" in used
250250

@@ -273,10 +273,10 @@ def test_force_index(self):
273273

274274
def test_force_index_primary(self):
275275
with CaptureLastQuery() as cap:
276-
list(Author.objects.force_index("PRIMARY"))
277-
assert ("FORCE INDEX (`PRIMARY`)") in cap.query
276+
list(Author.objects.force_index("PRIMARY").order_by('pk'))
277+
assert ("FORCE INDEX (PRIMARY)") in cap.query
278278
used = used_indexes(cap.query)
279-
assert len(used) == 0 or "PRIMARY" in used
279+
assert "PRIMARY" in used
280280

281281
def test_force_index_inner_query(self):
282282
title_idx = index_name(Book, "title")
@@ -319,8 +319,8 @@ def test_ignore_index_multiple(self):
319319

320320
def test_ignore_index_primary(self):
321321
with CaptureLastQuery() as cap:
322-
list(Author.objects.filter(name__gt="").ignore_index("PRIMARY"))
323-
assert "IGNORE INDEX (`PRIMARY`)" in cap.query
322+
list(Author.objects.filter(name__gt="").ignore_index("PRIMARY").order_by('pk'))
323+
assert "IGNORE INDEX (PRIMARY)" in cap.query
324324
assert "PRIMARY" not in used_indexes(cap.query)
325325

326326
def test_force_index_at_least_one(self):
@@ -355,7 +355,7 @@ def test_use_index_table_name(self):
355355
"PRIMARY", table_name=extra_table
356356
)
357357
)
358-
assert ("`" + extra_table + "` USE INDEX (`PRIMARY`) ") in cap.query
358+
assert ("`" + extra_table + "` USE INDEX (PRIMARY) ") in cap.query
359359

360360
def test_force_index_table_name_doesnt_exist_ignored(self):
361361
with CaptureLastQuery() as cap:

tests/testapp/test_rewrite_query.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,15 @@ def test_index_hint_for_order_by(self):
284284
+ "WHERE (1) ORDER BY col_a"
285285
)
286286

287+
def test_index_hint_primary(self):
288+
assert rewrite_query(
289+
"SELECT col_a, col_b FROM `sometable` "
290+
+ "WHERE (/*QueryRewrite':index=`sometable` FORCE PRIMARY */1)"
291+
) == (
292+
"SELECT col_a, col_b FROM `sometable` "
293+
+ "FORCE INDEX (PRIMARY) WHERE (1)"
294+
)
295+
287296
def test_it_is_instrumented(self):
288297
with CaptureLastQuery() as cap, connection.cursor() as cursor:
289298
cursor.execute(

0 commit comments

Comments
 (0)