⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
循环

当需要在 sqllogictests 中多次执行同一个查询但常量值略有不同时,可以使用循环。例如,假设我们想要发出 100 个查询来检查表中是否存在 0..100 这些值。

# 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

同样,foreach 可用于遍历一组值。

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 还有许多预设组合,在需要时应使用这些组合。通过这种方式,当预设中添加新的组合时,旧的测试将自动采用这些新组合。

预设 展开
⟨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

请谨慎使用大规模循环。执行成千上万条 SQL 语句会不必要地拖慢测试速度。不要使用循环来插入数据。

无需循环的数据生成

循环应当谨慎使用。虽然使用循环配合 insert 语句来插入数据看起来很诱人,但这会显著拖慢测试用例。相反,最好使用内置的 rangerepeat 函数来生成数据。

要创建包含值 [0, 1, ..., 98, 99] 的表 integers,请运行:

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

要创建包含 100 个 hello 值的表 strings,请运行:

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

结合使用这两个函数,再加上巧妙运用交叉乘积和其他表达式,可以高效地生成许多不同类型的数据集。random() 函数也可用于生成随机数据。

另一种选择是从现有的 CSV 或 Parquet 文件中读取数据。有多个大型 CSV 文件可以从目录 test/sql/copy/csv/data/real 加载,方法是使用 COPY INTO 语句或 read_csv_auto 函数。

TPC-H 和 TPC-DS 扩展也可用于生成合成数据,例如使用 CALL dbgen(sf = 1)CALL dsdgen(sf = 1)

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南