diff --git a/src/django_mysql/models/query.py b/src/django_mysql/models/query.py index 05d885d6..1ecaa957 100644 --- a/src/django_mysql/models/query.py +++ b/src/django_mysql/models/query.py @@ -262,6 +262,8 @@ def _index_hint( if len(index_names) == 0: indexes = "NONE" + elif len(index_names) == 1 and index_names[0] == "PRIMARY": + indexes = "PRIMARY" else: indexes = "`" + "`,`".join(index_names) + "`" diff --git a/src/django_mysql/rewrite_query.py b/src/django_mysql/rewrite_query.py index 79d71849..269b97cd 100644 --- a/src/django_mysql/rewrite_query.py +++ b/src/django_mysql/rewrite_query.py @@ -33,7 +33,7 @@ (?PJOIN|ORDER\ BY|GROUP\ BY) \ # space )? - (?P(`[^`]+`(,`[^`]+`)*)|NONE) + (?P(`[^`]+`(,`[^`]+`)*)|NONE|PRIMARY) """, re.VERBOSE, ) diff --git a/tests/testapp/test_models.py b/tests/testapp/test_models.py index f9251d27..cda1409d 100644 --- a/tests/testapp/test_models.py +++ b/tests/testapp/test_models.py @@ -244,7 +244,7 @@ def test_use_index(self): def test_use_index_primary(self): with CaptureLastQuery() as cap: list(Author.objects.use_index("PRIMARY")) - assert ("USE INDEX (`PRIMARY`)") in cap.query + assert ("USE INDEX (PRIMARY)") in cap.query used = used_indexes(cap.query) assert len(used) == 0 or "PRIMARY" in used @@ -273,10 +273,10 @@ def test_force_index(self): def test_force_index_primary(self): with CaptureLastQuery() as cap: - list(Author.objects.force_index("PRIMARY")) - assert ("FORCE INDEX (`PRIMARY`)") in cap.query + list(Author.objects.force_index("PRIMARY").order_by("pk")) + assert ("FORCE INDEX (PRIMARY)") in cap.query used = used_indexes(cap.query) - assert len(used) == 0 or "PRIMARY" in used + assert "PRIMARY" in used def test_force_index_inner_query(self): title_idx = index_name(Book, "title") @@ -319,8 +319,12 @@ def test_ignore_index_multiple(self): def test_ignore_index_primary(self): with CaptureLastQuery() as cap: - list(Author.objects.filter(name__gt="").ignore_index("PRIMARY")) - assert "IGNORE INDEX (`PRIMARY`)" in cap.query + list( + Author.objects.filter(name__gt="") + .ignore_index("PRIMARY") + .order_by("pk") + ) + assert "IGNORE INDEX (PRIMARY)" in cap.query assert "PRIMARY" not in used_indexes(cap.query) def test_force_index_at_least_one(self): @@ -355,7 +359,7 @@ def test_use_index_table_name(self): "PRIMARY", table_name=extra_table ) ) - assert ("`" + extra_table + "` USE INDEX (`PRIMARY`) ") in cap.query + assert ("`" + extra_table + "` USE INDEX (PRIMARY) ") in cap.query def test_force_index_table_name_doesnt_exist_ignored(self): with CaptureLastQuery() as cap: diff --git a/tests/testapp/test_rewrite_query.py b/tests/testapp/test_rewrite_query.py index 0faf5f6b..f812d309 100644 --- a/tests/testapp/test_rewrite_query.py +++ b/tests/testapp/test_rewrite_query.py @@ -284,6 +284,14 @@ def test_index_hint_for_order_by(self): + "WHERE (1) ORDER BY col_a" ) + def test_index_hint_primary(self): + assert rewrite_query( + "SELECT col_a, col_b FROM `sometable` " + + "WHERE (/*QueryRewrite':index=`sometable` FORCE PRIMARY */1)" + ) == ( + "SELECT col_a, col_b FROM `sometable` " + "FORCE INDEX (PRIMARY) WHERE (1)" + ) + def test_it_is_instrumented(self): with CaptureLastQuery() as cap, connection.cursor() as cursor: cursor.execute(