
Automatisiertes Testen zur Erkennung von Logik- und Performance-Fehlern in Datenbanksystemen

SQLancer ist ein Werkzeug, um Datenbankmanagementsysteme (DBMS) automatisch zu testen, um Fehler in deren Implementierung zu finden. Das heißt, es findet Fehler im Code der DBMS-Implementierung und nicht in vom Benutzer geschriebenen Abfragen. SQLancer hat Hunderte von Fehlern in ausgereiften und weit verbreiteten DBMS gefunden.
SQLancer bewältigt zwei wesentliche Herausforderungen beim automatischen Testen von DBMS:
Community. Wir haben einen Slack-Arbeitsbereich zur Diskussion über SQLancer und DBMS-Testing im Allgemeinen. Früher hatte SQLancer einen Account auf Twitter/X @sqlancer_dbms, der nicht mehr gepflegt wird. Wir haben einen Blog, der derzeit nur Beiträge von Mitwirkenden des Google Summer of Code-Projekts enthält.
Mindestanforderungen:
Die folgenden Befehle klonen SQLancer, erstellen ein JAR und starten SQLancer zum Testen von SQLite mit Non-optimizing Reference Engine Construction (NoREC):``` git clone https://github.com/sqlancer/sqlancer cd sqlancer mvn package -DskipTests cd target java -jar sqlancer-*.jar --num-threads 4 sqlite3 --oracle NoREC
**Ausführung und Beendigung.** Wenn die Ausführung alle fünf Sekunden Fortschrittsinformationen ausgibt, funktioniert das Tool wie erwartet. Mit der Tastenkombination STRG+C kann SQLancer manuell beendet werden. Wenn SQLancer keine Fehler findet, wird es unbegrenzt ausgeführt. Die Option `--num-tries` kann verwendet werden, um festzulegen, nach wie vielen Fehlern SQLancer beendet wird. Alternativ kann die Option `--timeout-seconds` verwendet werden, um die maximale Laufzeit von SQLancer anzugeben.
**Parameter.** Wenn Sie SQLancer ohne Parameter starten, werden verfügbare Optionen und Befehle angezeigt. Beachten Sie, dass allgemeine Optionen, die von allen DBMS-Testimplementierungen unterstützt werden (z. B. `--num-threads`), vor dem Namen des zu testenden DBMS (z. B. `sqlite3`) stehen müssen. Optionen, die nur für bestimmte DBMS unterstützt werden (z. B. `--test-rtree` für SQLite3), oder Optionen, für die jede Testimplementierung unterschiedliche Werte bereitstellt (z. B. `--oracle NoREC`), müssen nach dem DBMS-Namen stehen.
**DBMS.** Um SQLancer auf SQLite auszuführen, war es nicht erforderlich, ein DBMS zu installieren und einzurichten. Der Grund dafür ist, dass eingebettete DBMS im selben Prozess wie die Anwendung ausgeführt werden und daher keine separate Installation oder Einrichtung erfordern. Von SQLancer unterstützte eingebettete DBMS umfassen DuckDB, H2 und SQLite. Ihre Binärdateien sind als [JAR-Abhängigkeiten](https://github.com/sqlancer/sqlancer/blob/main/pom.xml) enthalten. Beachten Sie, dass Abstürze in diesen Systemen auch zu einem Absturz der JVM führen, auf der SQLancer ausgeführt wird.
# Verwendung von SQLancer
**Protokolle.** SQLancer speichert Protokolle im Unterverzeichnis `target/logs`. Standardmäßig ist die Option `--log-each-select` aktiviert, was dazu führt, dass jede an das DBMS gesendete SQL-Anweisung protokolliert wird. Die entsprechenden Dateinamen haben das Suffix `-cur.log`. Darüber hinaus erstellt SQLancer bei Erkennung eines Logikfehlers eine Datei mit der Erweiterung `.log`, in der die Anweisungen zur Reproduktion des Fehlers protokolliert werden, einschließlich nur der zuletzt ausgeführten Abfrage zusammen mit den anderen Anweisungen zum Einrichten des Datenbankzustands.
**Reduzieren von Fehlern.** Nachdem eine fehlerauslösende Testeingabe gefunden wurde, muss die Eingabe in der Regel reduziert werden, um sie weiter zu analysieren, da sie viele SQL-Anweisungen enthalten kann, die für die Reproduktion des Fehlers redundant sind. Eine Möglichkeit besteht darin, dies manuell zu tun, indem nach und nach eine Anweisung oder ein Feature entfernt wird, die fehlerauslösenden Anweisungen wiederholt abgespielt werden und das Testorakel angewendet wird (z. B. würde dies bei Testorakeln wie TLP oder NoREC erfordern, dass überprüft wird, ob beide Abfragen weiterhin ein unterschiedliches Ergebnis liefern). Dieser Prozess kann mit einem sogenannten [Delta-Debugging-Ansatz](https://www.debuggingbook.org/html/DeltaDebugger.html) automatisiert werden. SQLancer enthält eine experimentelle Implementierung eines Delta-Debugging-Ansatzes, der mit `--use-reducer` aktiviert werden kann. In der Vergangenheit haben wir erfolgreich [C-Reduce](https://embed.cs.utah.edu/creduce/) verwendet, was die Angabe des Testorakels in einem Skript erfordert, das von C-Reduce ausgeführt werden kann.