From 2fe8e8bf0d7b309607351ca100023a224680d255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tao=20Bojl=C3=A9n?= <66130243+taobojlen@users.noreply.github.com> Date: Mon, 30 Jan 2023 15:22:52 +0100 Subject: [PATCH] quote order_by field in SQL --- tests/testapp/models.py | 4 ++-- tests/testapp/test_queries.py | 22 +++++++++++----------- tree_queries/compiler.py | 3 ++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/tests/testapp/models.py b/tests/testapp/models.py index e043adb..ec48ab9 100644 --- a/tests/testapp/models.py +++ b/tests/testapp/models.py @@ -8,11 +8,11 @@ class Model(TreeNode): custom_id = models.AutoField(primary_key=True) - position = models.PositiveIntegerField(default=0) + order = models.PositiveIntegerField(default=0) name = models.CharField(max_length=100) class Meta: - ordering = ("position",) + ordering = ("order",) def __str__(self): return self.name diff --git a/tests/testapp/test_queries.py b/tests/testapp/test_queries.py index ea125ca..f283dab 100644 --- a/tests/testapp/test_queries.py +++ b/tests/testapp/test_queries.py @@ -30,11 +30,11 @@ class Test(TestCase): def create_tree(self): tree = type("Namespace", (), {})() # SimpleNamespace for PY2... tree.root = Model.objects.create(name="root") - tree.child1 = Model.objects.create(parent=tree.root, position=0, name="1") - tree.child2 = Model.objects.create(parent=tree.root, position=1, name="2") - tree.child1_1 = Model.objects.create(parent=tree.child1, position=0, name="1-1") - tree.child2_1 = Model.objects.create(parent=tree.child2, position=0, name="2-1") - tree.child2_2 = Model.objects.create(parent=tree.child2, position=1, name="2-2") + tree.child1 = Model.objects.create(parent=tree.root, order=0, name="1") + tree.child2 = Model.objects.create(parent=tree.root, order=1, name="2") + tree.child1_1 = Model.objects.create(parent=tree.child1, order=0, name="1-1") + tree.child2_1 = Model.objects.create(parent=tree.child2, order=0, name="2-1") + tree.child2_2 = Model.objects.create(parent=tree.child2, order=1, name="2-2") return tree def test_stuff(self): @@ -141,10 +141,10 @@ def test_annotate(self): def test_update_aggregate(self): self.create_tree() - Model.objects.with_tree_fields().update(position=3) + Model.objects.with_tree_fields().update(order=3) self.assertEqual( - Model.objects.with_tree_fields().aggregate(Sum("position")), - {"position__sum": 18}, + Model.objects.with_tree_fields().aggregate(Sum("order")), + {"order__sum": 18}, # TODO Sum("tree_depth") does not work because the field is not # known yet. ) @@ -267,11 +267,11 @@ def test_string_ordering(self): ) def test_many_ordering(self): - root = Model.objects.create(position=1, name="root") + root = Model.objects.create(order=1, name="root") for i in range(20, 0, -1): - Model.objects.create(parent=root, name=f"Node {i}", position=i * 10) + Model.objects.create(parent=root, name=f"Node {i}", order=i * 10) - positions = [m.position for m in Model.objects.with_tree_fields()] + positions = [m.order for m in Model.objects.with_tree_fields()] self.assertEqual(positions, list(sorted(positions))) def test_bfs_ordering(self): diff --git a/tree_queries/compiler.py b/tree_queries/compiler.py index def82ee..647e5f9 100644 --- a/tree_queries/compiler.py +++ b/tree_queries/compiler.py @@ -4,7 +4,6 @@ from django.db.models.sql.compiler import SQLCompiler from django.db.models.sql.query import Query - SEPARATOR = "\x1f" @@ -279,6 +278,8 @@ def as_sql(self, *args, **kwargs): if _ordered_by_integer(opts, params) else self.CTE_MYSQL_WITH_TEXT_ORDERING ) + if params["order_by"]: + params["order_by"] = self.connection.ops.quote_name(params["order_by"]) sql_0, sql_1 = super().as_sql(*args, **kwargs) explain = "" if sql_0.startswith("EXPLAIN "):