@@ -366,7 +366,7 @@ private module PrivateDjango {
366
366
"none" , "all" , "filter" , "exclude" , "complex_filter" , "union" , "intersection" ,
367
367
"difference" , "select_for_update" , "select_related" , "prefetch_related" , "order_by" ,
368
368
"distinct" , "reverse" , "defer" , "only" , "using" , "annotate" , "extra" , "raw" ,
369
- "datetimes" , "dates" , "values" , "values_list"
369
+ "datetimes" , "dates" , "values" , "values_list" , "alias"
370
370
] and
371
371
result = [ manager ( ) , querySet ( ) ] .getMember ( name )
372
372
}
@@ -386,7 +386,8 @@ private module PrivateDjango {
386
386
/** Provides models for the `django.db.models.expressions.RawSQL` class. */
387
387
module RawSQL {
388
388
/**
389
- * Gets a reference to the `django.db.models.expressions.RawSQL` class.
389
+ * Gets an instance of the `django.db.models.expressions.RawSQL` class,
390
+ * that was initiated with the SQL represented by `sql`.
390
391
*/
391
392
API:: Node classRef ( ) {
392
393
result = expressions ( ) .getMember ( "RawSQL" )
@@ -406,7 +407,10 @@ private module PrivateDjango {
406
407
exists ( DataFlow:: TypeTracker t2 | result = instance ( t2 , sql ) .track ( t2 , t ) )
407
408
}
408
409
409
- /** Gets an instance of the `django.db.models.expressions.RawSQL` class. */
410
+ /**
411
+ * Gets an instance of the `django.db.models.expressions.RawSQL` class,
412
+ * that was initiated with the SQL represented by `sql`.
413
+ */
410
414
DataFlow:: Node instance ( ControlFlowNode sql ) {
411
415
instance ( DataFlow:: TypeTracker:: end ( ) , sql ) .flowsTo ( result )
412
416
}
@@ -435,6 +439,24 @@ private module PrivateDjango {
435
439
override DataFlow:: Node getSql ( ) { result .asCfgNode ( ) = sql }
436
440
}
437
441
442
+ /**
443
+ * A call to the `alias` function on a model using a `RawSQL` argument.
444
+ *
445
+ * See https://docs.djangoproject.com/en/3.2/ref/models/querysets/#alias
446
+ */
447
+ private class ObjectsAlias extends SqlExecution:: Range , DataFlow:: CallCfgNode {
448
+ ControlFlowNode sql ;
449
+
450
+ ObjectsAlias ( ) {
451
+ this = django:: db:: models:: querySetReturningMethod ( "alias" ) .getACall ( ) and
452
+ django:: db:: models:: expressions:: RawSQL:: instance ( sql ) in [
453
+ this .getArg ( _) , this .getArgByName ( _)
454
+ ]
455
+ }
456
+
457
+ override DataFlow:: Node getSql ( ) { result .asCfgNode ( ) = sql }
458
+ }
459
+
438
460
/**
439
461
* A call to the `raw` function on a model.
440
462
*
0 commit comments