Django

Code

Ticket #7056 (closed: fixed)

Opened 8 months ago

Last modified 8 months ago

Query.as_sql() has side effects for select_related queries

Reported by: ikelly Assigned to: nobody
Milestone: Component: Database layer (models, ORM)
Version: queryset-refactor Keywords: qs-rf
Cc: Triage Stage: Accepted
Has patch: 0 Needs documentation: 0
Needs tests: 0 Patch needs improvement: 0

Description

Each time Query.as_sql() is called on a select_related query, the list of select columns grows again. Presumably Query.pre_sql_setup() should only get called once? For example:

In [39]: qs = Species.objects.all().select_related(depth=1)

In [40]: qs.query.as_sql()
Out[40]:
('SELECT "TEST_SPECIES"."ID", "TEST_SPECIES"."NAME", "TEST_SPECIES"."GENUS_ID", "TEST_GENUS"."ID", "TEST_GENUS"."NAME", "TEST_GENUS"."FAMILY_ID" FROM "TEST_SPECIES" INNER JOIN "TEST_GENUS" ON ("TEST_SPECIES"."GENUS_ID" = "TEST_GENUS"."ID")',
 ())

In [41]: qs.query.as_sql()
Out[41]:
('SELECT "TEST_SPECIES"."ID", "TEST_SPECIES"."NAME", "TEST_SPECIES"."GENUS_ID", "TEST_GENUS"."ID", "TEST_GENUS"."NAME", "TEST_GENUS"."FAMILY_ID", "TEST_SPECIES"."ID", "TEST_SPECIES"."NAME", "TEST_SPECIES"."GENUS_ID", "TEST_GENUS"."ID", "TEST_GENUS"."NAME", "TEST_GENUS"."FAMILY_ID" FROM "TEST_SPECIES" INNER JOIN "TEST_GENUS" ON ("TEST_SPECIES"."GENUS_ID" = "TEST_GENUS"."ID")',
 ())

Attachments

Change History

04/22/08 12:36:19 changed by mtredinnick

  • needs_better_patch changed.
  • stage changed from Unreviewed to Accepted.
  • needs_tests changed.
  • needs_docs changed.

04/23/08 03:39:05 changed by mtredinnick

We can't really arrange to call pre_sql_setup() just once, because if we did that and then added something to the query set, it could change the required select columns and we wouldn't know how to undo the previous select modifications from pre_sql_setup(). So the sequence

qs = ....
qs.query.as_sql()
qs = qs.select_related(depth=2)
qs.query.as_sql()

and similar usage patterns wouldn't be correct.

I've fixed this by keeping the extra select columns separate until we construct the query in as_sql().

04/23/08 04:26:15 changed by mtredinnick

  • status changed from new to closed.
  • resolution set to fixed.

(In [7445]) queryset-refactor: Removed an unwanted side-effect from the Query.as_sql() method.

Fixed #7056


Add/Change #7056 (Query.as_sql() has side effects for select_related queries)




Change Properties
Action