@@ -21,18 +21,21 @@ import com.trivadis.oracle.plsql.plsql.Body
2121import com.trivadis.oracle.plsql.plsql.ConstructorDeclaration
2222import com.trivadis.oracle.plsql.plsql.CreateFunction
2323import com.trivadis.oracle.plsql.plsql.CreateProcedure
24+ import com.trivadis.oracle.plsql.plsql.DeclareSection
2425import com.trivadis.oracle.plsql.plsql.ExecuteImmediateStatement
2526import com.trivadis.oracle.plsql.plsql.FuncDeclInType
2627import com.trivadis.oracle.plsql.plsql.FunctionDefinition
2728import com.trivadis.oracle.plsql.plsql.FunctionOrParenthesisParameter
2829import com.trivadis.oracle.plsql.plsql.OpenForStatement
2930import com.trivadis.oracle.plsql.plsql.ParameterDeclaration
31+ import com.trivadis.oracle.plsql.plsql.PlsqlBlock
3032import com.trivadis.oracle.plsql.plsql.ProcDeclInType
3133import com.trivadis.oracle.plsql.plsql.ProcedureCallOrAssignmentStatement
3234import com.trivadis.oracle.plsql.plsql.ProcedureDefinition
3335import com.trivadis.oracle.plsql.plsql.SimpleExpressionNameValue
3436import com.trivadis.oracle.plsql.plsql.SimpleExpressionStringValue
3537import com.trivadis.oracle.plsql.plsql.UserDefinedType
38+ import com.trivadis.oracle.plsql.plsql.VariableDeclaration
3639import com.trivadis.oracle.plsql.validation.PLSQLCopGuideline
3740import com.trivadis.oracle.plsql.validation.PLSQLCopValidator
3841import com.trivadis.oracle.plsql.validation.PLSQLJavaValidator
@@ -213,8 +216,11 @@ class SQLInjection extends PLSQLJavaValidator implements PLSQLCopValidator {
213216
214217
215218 def isAsserted(SimpleExpressionNameValue n) {
216- val body = EcoreUtil2.getContainerOfType(n, Body)
217- val usages = EcoreUtil2.getAllContentsOfType(body, SimpleExpressionNameValue).filter[it.value.equalsIgnoreCase(n.value)]
219+ var EObject obj = EcoreUtil2.getContainerOfType(n, Body)
220+ if (obj === null) {
221+ obj = EcoreUtil2.getContainerOfType(n, DeclareSection)
222+ }
223+ val usages = EcoreUtil2.getAllContentsOfType(obj, SimpleExpressionNameValue).filter[it.value.equalsIgnoreCase(n.value)]
218224 for (usage : usages) {
219225 val name = usage.qualifiedFunctionName
220226 for (assertPackage : ASSERT_PACKAGES) {
@@ -262,6 +268,32 @@ class SQLInjection extends PLSQLJavaValidator implements PLSQLCopValidator {
262268 }
263269 }
264270
271+ def getDeclareSection(Body body) {
272+ val parent = body.eContainer
273+ var DeclareSection declareSection;
274+ if (parent instanceof CreateFunction) {
275+ declareSection = parent.declareSection
276+ } else if (parent instanceof CreateProcedure) {
277+ declareSection = parent.declareSection
278+ } else if (parent instanceof FuncDeclInType) {
279+ declareSection = parent.declareSection
280+ } else if (parent instanceof ProcDeclInType) {
281+ declareSection = parent.declareSection
282+ } else if (parent instanceof ConstructorDeclaration) {
283+ declareSection = parent.declareSection
284+ } else if (parent instanceof PlsqlBlock) {
285+ declareSection = parent.declareSection
286+ } else if (parent instanceof FunctionDefinition) {
287+ declareSection = parent.declareSection
288+ } else if (parent instanceof ProcedureDefinition) {
289+ declareSection = parent.declareSection
290+ } else {
291+ // CreatePackageBody, CreateTrigger, CreateTypeBody
292+ declareSection = null;
293+ }
294+ return declareSection;
295+ }
296+
265297 def HashMap<String, SimpleExpressionNameValue> getSimpleExpressinNamesFromAssignments(SimpleExpressionNameValue n) {
266298 val expressions = new HashMap<String, SimpleExpressionNameValue>
267299 val body = EcoreUtil2.getContainerOfType(n, Body)
@@ -281,8 +313,16 @@ class SQLInjection extends PLSQLJavaValidator implements PLSQLCopValidator {
281313 }
282314 }
283315 }
284- if (expressions.size == 0) {
285- expressions.put(n.value.toLowerCase, n);
316+ val declareSection = body.declareSection
317+ if (declareSection !== null) {
318+ val variable = EcoreUtil2.getAllContentsOfType(declareSection, VariableDeclaration).findFirst [
319+ it.variable.value.equalsIgnoreCase(n.value) && it.getDefault() !== null
320+ ]
321+ if (variable !== null) {
322+ for (name : getRelevantSimplExpressionNameValues(variable.getDefault())) {
323+ expressions.put(name.value.toLowerCase, name)
324+ }
325+ }
286326 }
287327 return expressions;
288328 }
@@ -292,6 +332,9 @@ class SQLInjection extends PLSQLJavaValidator implements PLSQLCopValidator {
292332 if (obj !== null) {
293333 if (obj instanceof SimpleExpressionNameValue) {
294334 expressions.putAll(obj.simpleExpressinNamesFromAssignments)
335+ if (expressions.size == 0) {
336+ expressions.put(obj.value.toLowerCase, obj);
337+ }
295338 } else {
296339 for (name : getRelevantSimplExpressionNameValues(obj)) {
297340 expressions.put(name.value.toLowerCase, name)
0 commit comments