Zum Inhalt springen

Schleifen

Schleifen können in sqllogictests verwendet werden, wenn dieselbe Abfrage viele Male ausgeführt werden soll, aber mit leichten Änderungen an konstanten Werten. Angenommen, wir wollen 100 Abfragen absetzen, die das Vorhandensein der Werte 0...100 in einer Tabelle prüfen:

# create the table 'integers' with values 0...100
statement ok
CREATE TABLE integers AS SELECT * FROM range(0, 100, 1) t1(i);
# verify individually that all 100 values are there
loop i 0 100
# execute the query, replacing the value
query I
SELECT count(*) FROM integers WHERE i = ${i};
----
1
# end the loop (note that multiple statements can be part of a loop)
endloop

Ebenso kann foreach verwendet werden, um über eine Menge von Werten zu iterieren.

foreach partcode millennium century decade year quarter month day hour minute second millisecond microsecond epoch
query III
SELECT i, date_part('${partcode}', i) AS p, date_part(['${partcode}'], i) AS st
FROM intervals
WHERE p <> st['${partcode}'];
----
endloop

foreach hat außerdem eine Reihe vordefinierter Kombinationen, die verwendet werden sollten, wenn sie benötigt werden. So greifen alte Tests automatisch neue Kombinationen auf, sobald sie der Vorgabe hinzugefügt werden.

Vorgabe Expandiert zu
⟨compression⟩ none uncompressed rle bitpacking dictionary fsst chimp patas
⟨signed⟩ tinyint smallint integer bigint hugeint
⟨unsigned⟩ utinyint usmallint uinteger ubigint uhugeint
⟨integral⟩ ⟨signed⟩ ⟨unsigned⟩
⟨numeric⟩ ⟨integral⟩ float double
⟨alltypes⟩ ⟨numeric⟩ bool interval varchar json

Große Schleifen sparsam einsetzen. Das Ausführen von Hunderttausenden SQL-Anweisungen verlangsamt Tests unnötig. Verwenden Sie Schleifen nicht zum Einfügen von Daten.

Datenerzeugung ohne Schleifen

Schleifen sollten sparsam eingesetzt werden. Es mag verlockend sein, Schleifen zu verwenden, um Daten per INSERT-Anweisung einzufügen – das verlangsamt die Testfälle jedoch erheblich. Stattdessen ist es besser, Daten mit den eingebauten Funktionen range und repeat zu erzeugen.

Um die Tabelle integers mit den Werten [0, 1, ..., 98, 99] anzulegen, führen Sie aus:

CREATE TABLE integers AS SELECT * FROM range(0, 100, 1) t1(i);

Um die Tabelle strings mit 100-mal dem Wert hello anzulegen, führen Sie aus:

CREATE TABLE strings AS SELECT * FROM repeat('hello', 100) t1(s);

Mit diesen beiden Funktionen sowie geschickter Nutzung von Kreuzprodukten und anderen Ausdrücken lassen sich viele verschiedene Arten von Datensätzen effizient erzeugen. Die Funktion random() kann außerdem verwendet werden, um Zufallsdaten zu erzeugen.

Eine Alternative ist, Daten aus einer vorhandenen CSV- oder Parquet-Datei zu lesen. Es gibt mehrere große CSV-Dateien, die aus dem Verzeichnis test/sql/copy/csv/data/real mit einer COPY INTO-Anweisung oder der Funktion read_csv_auto geladen werden können.

Die TPC-H- und TPC-DS-Erweiterungen können ebenfalls verwendet werden, um synthetische Daten zu erzeugen, z. B. mit CALL dbgen(sf = 1) oder CALL dsdgen(sf = 1).