Skip to content

Commit

Permalink
quote order_by field in SQL
Browse files Browse the repository at this point in the history
  • Loading branch information
taobojlen committed Jan 30, 2023
1 parent e88145c commit 2fe8e8b
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 14 deletions.
4 changes: 2 additions & 2 deletions tests/testapp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 11 additions & 11 deletions tests/testapp/test_queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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.
)
Expand Down Expand Up @@ -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):
Expand Down
3 changes: 2 additions & 1 deletion tree_queries/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from django.db.models.sql.compiler import SQLCompiler
from django.db.models.sql.query import Query


SEPARATOR = "\x1f"


Expand Down Expand Up @@ -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 "):
Expand Down

0 comments on commit 2fe8e8b

Please sign in to comment.