@@ -63,6 +63,80 @@ class SQLiteSwiftSqlSink extends SqlSink {
6363 }
6464}
6565
66+ /** A sink for the GRDB library. */
67+ class GrdbSqlSink extends SqlSink {
68+ GrdbSqlSink ( ) {
69+ exists ( CallExpr call , MethodDecl method |
70+ call .getStaticTarget ( ) = method and
71+ call .getArgument ( 0 ) .getExpr ( ) = this .asExpr ( )
72+ |
73+ method
74+ .hasQualifiedName ( "Database" ,
75+ [
76+ "allStatements(sql:arguments:)" , "cachedStatement(sql:)" ,
77+ "internalCachedStatement(sql:)" , "execute(sql:arguments:)" , "makeStatement(sql:)" ,
78+ "makeStatement(sql:prepFlags:)"
79+ ] )
80+ or
81+ method
82+ .hasQualifiedName ( "SQLRequest" ,
83+ [
84+ "init(stringLiteral:)" , "init(unicodeScalarLiteral:)" ,
85+ "init(extendedGraphemeClusterLiteral:)" , "init(stringInterpolation:)" ,
86+ "init(sql:arguments:adapter:cached:)"
87+ ] )
88+ or
89+ method
90+ .hasQualifiedName ( "SQL" ,
91+ [
92+ "init(stringLiteral:)" , "init(unicodeScalarLiteral:)" ,
93+ "init(extendedGraphemeClusterLiteral:)" , "init(stringInterpolation:)" ,
94+ "init(sql:arguments:)" , "append(sql:arguments:)"
95+ ] )
96+ or
97+ method
98+ .hasQualifiedName ( "TableDefinition" , [ "column(sql:)" , "check(sql:)" , "constraint(sql:)" ] )
99+ or
100+ method .hasQualifiedName ( "TableAlteration" , "addColumn(sql:)" )
101+ or
102+ method
103+ .hasQualifiedName ( "ColumnDefinition" ,
104+ [ "check(sql:)" , "defaults(sql:)" , "generatedAs(sql:_:)" ] )
105+ or
106+ method
107+ .hasQualifiedName ( "TableRecord" ,
108+ [
109+ "select(sql:arguments:)" , "select(sql:arguments:as:)" , "filter(sql:arguments:)" ,
110+ "order(sql:arguments:)"
111+ ] )
112+ or
113+ method .hasQualifiedName ( "StatementCache" , "statement(_:)" )
114+ )
115+ or
116+ exists ( CallExpr call , MethodDecl method |
117+ call .getStaticTarget ( ) = method and
118+ call .getArgument ( 1 ) .getExpr ( ) = this .asExpr ( )
119+ |
120+ method
121+ .hasQualifiedName ( [ "Row" , "DatabaseValueConvertible" ] ,
122+ [
123+ "fetchCursor(_:sql:arguments:adapter:)" , "fetchAll(_:sql:arguments:adapter:)" ,
124+ "fetchSet(_:sql:arguments:adapter:)" , "fetchOne(_:sql:arguments:adapter:)"
125+ ] )
126+ or
127+ method .hasQualifiedName ( "SQLStatementCursor" , "init(database:sql:arguments:prepFlags:)" )
128+ )
129+ or
130+ exists ( CallExpr call , MethodDecl method |
131+ call .getStaticTarget ( ) = method and
132+ call .getArgument ( 3 ) .getExpr ( ) = this .asExpr ( )
133+ |
134+ method
135+ .hasQualifiedName ( "CommonTableExpression" , "init(recursive:named:columns:sql:arguments:)" )
136+ )
137+ }
138+ }
139+
66140/**
67141 * A taint configuration for tainted data that reaches a SQL sink.
68142 */
0 commit comments