@@ -11,43 +11,29 @@ private import semmle.python.Concepts
1111
1212private module SqlAlchemy {
1313 /**
14- * An instantization of a SqlAlchemy Session object.
14+ * Returns an instantization of a SqlAlchemy Session object.
1515 * See https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session and
1616 * https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.sessionmaker
1717 */
18- private class SqlAlchemySessionInstance extends API:: Node {
19- SqlAlchemySessionInstance ( ) {
20- this in [
21- API:: moduleImport ( "sqlalchemy.orm" ) .getMember ( "Session" ) .getReturn ( ) ,
22- API:: moduleImport ( "sqlalchemy.orm" ) .getMember ( "sessionmaker" ) .getReturn ( ) .getReturn ( )
23- ]
24- }
25-
26- override string toString ( ) { result = "Use of SqlAlchemy Session instantization" }
18+ private API:: Node getSqlAlchemySessionInstance ( ) {
19+ result = API:: moduleImport ( "sqlalchemy.orm" ) .getMember ( "Session" ) .getReturn ( ) or
20+ result = API:: moduleImport ( "sqlalchemy.orm" ) .getMember ( "sessionmaker" ) .getReturn ( ) .getReturn ( )
2721 }
2822
2923 /**
30- * An instantization of a SqlAlchemy Engine object.
24+ * Returns an instantization of a SqlAlchemy Engine object.
3125 * See https://docs.sqlalchemy.org/en/14/core/engines.html#sqlalchemy.create_engine
3226 */
33- private class SqlAlchemyEngineInstance extends API:: Node {
34- SqlAlchemyEngineInstance ( ) {
35- this = API:: moduleImport ( "sqlalchemy" ) .getMember ( "create_engine" ) .getReturn ( )
36- }
37-
38- override string toString ( ) { result = "Use of SqlAlchemy create_engine member" }
27+ private API:: Node getSqlAlchemyEngineInstance ( ) {
28+ result = API:: moduleImport ( "sqlalchemy" ) .getMember ( "create_engine" ) .getReturn ( )
3929 }
4030
4131 /**
42- * An instantization of a SqlAlchemy Query object.
32+ * Returns an instantization of a SqlAlchemy Query object.
4333 * See https://docs.sqlalchemy.org/en/14/orm/query.html?highlight=query#sqlalchemy.orm.Query
4434 */
45- private class SqlAlchemyQueryInstance extends API:: Node {
46- SqlAlchemyQueryInstance ( ) {
47- this = any ( SqlAlchemySessionInstance sessionInstance ) .getMember ( "query" ) .getReturn ( )
48- }
49-
50- override string toString ( ) { result = "Use of SqlAlchemy Session Query member" }
35+ private API:: Node getSqlAlchemyQueryInstance ( ) {
36+ result = getSqlAlchemySessionInstance ( ) .getMember ( "query" ) .getReturn ( )
5137 }
5238
5339 /**
@@ -59,11 +45,14 @@ private module SqlAlchemy {
5945 */
6046 private class SqlAlchemyExecuteCall extends DataFlow:: CallCfgNode , SqlExecution:: Range {
6147 SqlAlchemyExecuteCall ( ) {
62- exists ( SqlAlchemySessionInstance sessionInstance , SqlAlchemyEngineInstance engineInstance |
63- this = sessionInstance .getMember ( "execute" ) .getACall ( ) or
64- this = engineInstance .getMember ( "connect" ) .getReturn ( ) .getMember ( "execute" ) .getACall ( ) or
65- this = engineInstance .getMember ( "begin" ) .getReturn ( ) .getMember ( "execute" ) .getACall ( )
66- )
48+ // new way
49+ this = getSqlAlchemySessionInstance ( ) .getMember ( "execute" ) .getACall ( ) or
50+ this =
51+ getSqlAlchemyEngineInstance ( )
52+ .getMember ( [ "connect" , "begin" ] )
53+ .getReturn ( )
54+ .getMember ( "execute" )
55+ .getACall ( )
6756 }
6857
6958 override DataFlow:: Node getSql ( ) { result = this .getArg ( 0 ) }
@@ -76,8 +65,10 @@ private module SqlAlchemy {
7665 */
7766 private class SqlAlchemyScalarCall extends DataFlow:: CallCfgNode , SqlExecution:: Range {
7867 SqlAlchemyScalarCall ( ) {
79- this = any ( SqlAlchemySessionInstance sessionInstance ) .getMember ( "scalar" ) .getACall ( ) or
80- this = any ( SqlAlchemyEngineInstance engineInstance ) .getMember ( "scalar" ) .getACall ( )
68+ this =
69+ [ getSqlAlchemySessionInstance ( ) , getSqlAlchemyEngineInstance ( ) ]
70+ .getMember ( "scalar" )
71+ .getACall ( )
8172 }
8273
8374 override DataFlow:: Node getSql ( ) { result = this .getArg ( 0 ) }
@@ -88,9 +79,7 @@ private module SqlAlchemy {
8879 * See https://docs.sqlalchemy.org/en/14/orm/query.html?highlight=query#sqlalchemy.orm.Query
8980 */
9081 private class SqlAlchemyQueryCall extends DataFlow:: CallCfgNode , SqlExecution:: Range {
91- SqlAlchemyQueryCall ( ) {
92- this = any ( SqlAlchemyQueryInstance queryInstance ) .getAMember ( ) .getACall ( )
93- }
82+ SqlAlchemyQueryCall ( ) { this = getSqlAlchemyQueryInstance ( ) .getAMember ( ) .getACall ( ) }
9483
9584 override DataFlow:: Node getSql ( ) { result = this .getArg ( 0 ) }
9685 }
0 commit comments