summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorFeideus <erwan.ulrich@gmail.com>2018-05-30 18:49:47 +0200
committerFeideus <erwan.ulrich@gmail.com>2018-05-30 18:49:47 +0200
commit90e55ae08404e8cc2cc49b9ad2bee03ed60ba0c6 (patch)
tree9aa8402daba1a528929dc08d85b0f17be167eb3d /src/main
parent72a0c0bb75bd0af284c0f1bdab311b21cb4b5a3b (diff)
downloadschemafuzz-90e55ae08404e8cc2cc49b9ad2bee03ed60ba0c6.tar.gz
schemafuzz-90e55ae08404e8cc2cc49b9ad2bee03ed60ba0c6.tar.bz2
schemafuzz-90e55ae08404e8cc2cc49b9ad2bee03ed60ba0c6.zip
Main loop crashing all over the place (due to possibilities being empty ??)
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/schemaspy/DBFuzzer.java23
-rw-r--r--src/main/java/org/schemaspy/model/GenericTreeNode.java72
-rw-r--r--src/main/java/org/schemaspy/model/QueryResponseParser.java1
3 files changed, 63 insertions, 33 deletions
diff --git a/src/main/java/org/schemaspy/DBFuzzer.java b/src/main/java/org/schemaspy/DBFuzzer.java
index 8de09e3..772c1e4 100644
--- a/src/main/java/org/schemaspy/DBFuzzer.java
+++ b/src/main/java/org/schemaspy/DBFuzzer.java
@@ -85,9 +85,12 @@ public class DBFuzzer
LOGGER.info("Starting Database Fuzzing");
+ GenericTreeNode currentMutation;
// Building root Mutation. Could be extended by looking for a relevant first SingleChange as rootMutation
- Row randomRow = pickRandomRow();
- GenericTreeNode currentMutation = new GenericTreeNode(randomRow,nextId());
+ do {
+ Row randomRow = pickRandomRow();
+ currentMutation = new GenericTreeNode(randomRow, nextId());
+ } while(currentMutation.getPotential_changes().isEmpty());
currentMutation.setChosenChange(currentMutation.getPotential_changes().get(0));
currentMutation.initPostChangeRow();
mutationTree.setRoot(currentMutation);
@@ -319,7 +322,7 @@ public class DBFuzzer
if (markingDiff > 0) //
{
int randNumber = rand.nextInt(previousMutation.getPotential_changes().size());
- nextMut = new GenericTreeNode(previousMutation.getPost_change_row(), nextId(), mutationTree.getRoot(), previousMutation);
+ nextMut = new GenericTreeNode(previousMutation.getPost_change_row(), nextId(), mutationTree.getRoot(), previousMutation,false);
nextMut.setChosenChange(previousMutation.getPotential_changes().get(randNumber));
nextMut.initPostChangeRow();
}
@@ -330,14 +333,18 @@ public class DBFuzzer
if(changeOrDepthen.nextInt(2) == 1)
{
SingleChange tmp = mutationTree.getRoot().singleChangeBasedOnWeight();
- nextMut = new GenericTreeNode(tmp.getAttachedToMutation().getPost_change_row(), nextId(), mutationTree.getRoot(), tmp.getAttachedToMutation());
+ nextMut = new GenericTreeNode(tmp.getAttachedToMutation().getPost_change_row(), nextId(), mutationTree.getRoot(), tmp.getAttachedToMutation(),false);
nextMut.setChosenChange(tmp);
nextMut.initPostChangeRow();
}
- else
- {
- Row nextRow = pickRandomRow();
- nextMut = new GenericTreeNode(nextRow,nextId(),mutationTree.getRoot(),previousMutation);
+ else {
+ Row nextRow;
+ do
+ {
+ nextRow = pickRandomRow();
+ nextMut = new GenericTreeNode(nextRow, nextId(), mutationTree.getRoot(), previousMutation, true);
+ }while(nextMut.getPotential_changes().isEmpty());
+
Random nextSingleChangeId = new Random();
nextMut.setChosenChange(nextMut.getPotential_changes().get(nextSingleChangeId.nextInt(nextMut.getPotential_changes().size())));
nextMut.initPostChangeRow();
diff --git a/src/main/java/org/schemaspy/model/GenericTreeNode.java b/src/main/java/org/schemaspy/model/GenericTreeNode.java
index 3ddd9fd..6e846b8 100644
--- a/src/main/java/org/schemaspy/model/GenericTreeNode.java
+++ b/src/main/java/org/schemaspy/model/GenericTreeNode.java
@@ -2,11 +2,14 @@ package org.schemaspy.model;
import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Statement;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
+import java.util.logging.Logger;
import org.schemaspy.*;
import org.schemaspy.service.SqlService;
@@ -27,6 +30,7 @@ public class GenericTreeNode {
private GenericTreeNode parent;
private ArrayList<GenericTreeNode> children = new ArrayList<GenericTreeNode>();
private SingleChange chosenChange;
+ private boolean isFirstApperance;
/**
* Default GenericTreeNode constructor
@@ -38,6 +42,7 @@ public class GenericTreeNode {
this.weight = 1;
this.depth = 0;
this.id = id;
+ this.isFirstApperance = true;
this.initial_state_row = initial_state_row;
this.potential_changes = discoverMutationPossibilities(this);
}
@@ -49,22 +54,29 @@ public class GenericTreeNode {
this.weight = 1;
this.depth = 0;
this.id = id;
+ this.isFirstApperance = false;
this.initial_state_row = initial_state_row;
this.chosenChange = sg;
}
- public GenericTreeNode(Row initial_state_row, int id, GenericTreeNode rootMutation, GenericTreeNode parentMutation) {
+ public GenericTreeNode(Row initial_state_row, int id, GenericTreeNode rootMutation, GenericTreeNode parentMutation,boolean isFirstApperance) {
this.parent = parentMutation;
this.cascadingFK = false;
this.subTreeWeight = 0;
this.weight = 1;
this.id = id;
initDepth();
+ this.isFirstApperance = isFirstApperance;
this.initial_state_row = initial_state_row;
this.potential_changes = discoverMutationPossibilities(rootMutation);
}
+
+ public boolean getIsFirstApperance() {
+ return isFirstApperance;
+ }
+
public void setDepth(int depth) {
this.depth = depth;
}
@@ -132,6 +144,9 @@ public class GenericTreeNode {
{
final Random r = new Random();
+ if(this.getPotential_changes().isEmpty())
+ System.out.println(this+"EMMMMMMPTY");
+
checkWeightConsistency();
if (this.potential_changes.isEmpty() && (0 == subTreeWeight))
System.out.println("ERROR PICKING : no potential_changes AND subtreeweight = 0");
@@ -229,14 +244,14 @@ public class GenericTreeNode {
}
}
if(possibilities.isEmpty())
- throw new Error("No raw Mutation could be found for this row");
+ System.out.println("No raw Mutation could be found for this row"); // TO BE HANDLED. juste create another GenericTreeNode
//REMOVING POSSIBILITIES THAT DONT MATCH CONSTRAINTS
- for(SingleChange singleChange : possibilities)
- {
- if (!singleChange.respectsConstraints())
- possibilities.remove(singleChange);
- }
+ // for(SingleChange singleChange : possibilities)
+ // {
+ // if (!singleChange.respectsConstraints())
+ // possibilities.remove(singleChange);
+ // }
return possibilities;
}
@@ -246,13 +261,14 @@ public class GenericTreeNode {
ArrayList<SingleChange> oneChange = new ArrayList<SingleChange>();
String typeName = tableColumn.getTypeName();
- System.out.println("TABLECOLUMN TYPE = "+typeName);
+ GenericTreeNode rootForThisMutation = FirstApperanceOf(this);
switch (typeName) {
case "smallint":
case "integer":
case "int2":
- int tmp = Integer.parseInt(rootMutation.getInitial_state_row().getContent().get(tableColumn.getName()).toString());
+
+ int tmp = Integer.parseInt(rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()).toString());
oneChange.add(new SingleChange(tableColumn, this, column_value, Integer.toString(tmp++)));
oneChange.add(new SingleChange(tableColumn, this, column_value, Integer.toString(32767)));
oneChange.add(new SingleChange(tableColumn, this, column_value, Integer.toString(1)));
@@ -261,17 +277,11 @@ public class GenericTreeNode {
case "character":
case "character varying":
case "varchar":
- if (rootMutation == null) {
- char tmp2 = column_value.toString().charAt(0);
- oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(tmp2++) + column_value.toString().substring(1))));
- oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(tmp2--) + column_value.toString().substring(1))));
- } else {
- char tmp2 = (char) rootMutation.getInitial_state_row().getContent().get(tableColumn.getName()).toString().charAt(0);
+ char tmp2 = (char) rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()).toString().charAt(0);
char nextChar = (char) (tmp2 + 1);
char prevChar = (char) (tmp2 - 1);
- oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(nextChar) + column_value.toString().substring(1))));
- oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(prevChar) + column_value.toString().substring(1))));
- }
+ SingleChange sg = new SingleChange(tableColumn, this, column_value, (Character.toString(nextChar) + column_value.toString().substring(1)));
+ oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(nextChar) + column_value.toString().substring(1))));oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(prevChar) + column_value.toString().substring(1))));
break;
case "bool":
@@ -324,7 +334,6 @@ public class GenericTreeNode {
public boolean inject(SqlService sqlService,Database db, boolean undo)
{
-
if (undo)
System.out.println("UNDOING");
else
@@ -333,8 +342,9 @@ public class GenericTreeNode {
String theQuery = updateQueryBuilder(undo);
try
{
- PreparedStatement stmt = sqlService.prepareStatement(theQuery, db, null);
- stmt.execute();
+ Statement stmt = sqlService.getConnection().createStatement();
+ stmt.execute(theQuery);
+ System.out.println("Query success");
return true;
}
catch (Exception e)
@@ -371,7 +381,8 @@ public class GenericTreeNode {
{
if (chosenChange.getParentTableColumn().getTypeName().equals("varchar")
|| chosenChange.getParentTableColumn().getTypeName().equals("bool")
- || chosenChange.getParentTableColumn().getTypeName().equals("timestamp"))
+ || chosenChange.getParentTableColumn().getTypeName().equals("timestamp")
+ || chosenChange.getParentTableColumn().getTypeName().equals("date"))
theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + chosenChange.getParentTableColumn().getName() + "='" + chosenChange.getOldValue().toString() + "', ";
else
theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + chosenChange.getParentTableColumn().getName() + " = " + chosenChange.getOldValue().toString() + ", ";
@@ -380,7 +391,8 @@ public class GenericTreeNode {
{
if (chosenChange.getParentTableColumn().getTypeName().equals("varchar")
|| chosenChange.getParentTableColumn().getTypeName().equals("bool")
- || chosenChange.getParentTableColumn().getTypeName().equals("timestamp"))
+ || chosenChange.getParentTableColumn().getTypeName().equals("timestamp")
+ || chosenChange.getParentTableColumn().getTypeName().equals("date"))
theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + chosenChange.getParentTableColumn().getName() + "='" + chosenChange.getNewValue().toString() + "', ";
else
theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + chosenChange.getParentTableColumn().getName() + "=" + chosenChange.getNewValue().toString() + ", ";
@@ -391,7 +403,8 @@ public class GenericTreeNode {
{
if (chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("varchar") ||
chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("bool") ||
- chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp"))
+ chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp")
+ || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("date"))
theQuery = theQuery + (entry.getKey() + "='" + entry.getValue().toString() + "', ");
else
theQuery = theQuery + (entry.getKey() + "=" + entry.getValue().toString() + ", ");
@@ -408,7 +421,8 @@ public class GenericTreeNode {
{
if (chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("varchar") ||
chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("bool") ||
- chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp"))
+ chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp")
+ || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("date"))
theQuery = theQuery + (entry.getKey() + "='" + entry.getValue().toString() + "' AND ");
else
theQuery = theQuery + (entry.getKey() + "=" + entry.getValue().toString() + " AND ");
@@ -604,4 +618,12 @@ public class GenericTreeNode {
this.getParent().propagateWeight();
}
+ public GenericTreeNode FirstApperanceOf (GenericTreeNode mutation)
+ {
+ if(mutation.getIsFirstApperance())
+ return mutation;
+
+ return FirstApperanceOf(mutation.getParent());
+ }
+
}
diff --git a/src/main/java/org/schemaspy/model/QueryResponseParser.java b/src/main/java/org/schemaspy/model/QueryResponseParser.java
index e24b825..e25956a 100644
--- a/src/main/java/org/schemaspy/model/QueryResponseParser.java
+++ b/src/main/java/org/schemaspy/model/QueryResponseParser.java
@@ -68,6 +68,7 @@ public class QueryResponseParser
Row currentRow = new Row(parentTable,mapOfTheRow,resultMeta.getColumnCount());
queryResponse.getRows().add(currentRow);
}
+ assert(!queryResponse.getRows().get(0).getContent().containsValue(null));
return queryResponse;
}