⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 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 还有一些预设组合,应在需要时使用。这样,当新的组合添加到预设中时,旧测试将自动识别这些新组合。

预设 扩展
⟨压缩⟩ 无 未压缩 RLE 位打包 字典 FSST Chimp Patas
⟨有符号⟩ tinyint smallint integer bigint hugeint
⟨无符号⟩ utinyint usmallint uinteger ubigint uhugeint
⟨整型⟩ ⟨有符号⟩ ⟨无符号⟩
⟨数值型⟩ ⟨整型⟩ float double
⟨所有类型⟩ ⟨数值型⟩ bool interval varchar json

谨慎使用大型循环。执行数十万条SQL语句会不必要地减慢测试速度。请勿使用循环来插入数据。

不使用循环生成数据

应谨慎使用循环。虽然可能很想使用循环通过insert语句插入数据,但这会显著减慢测试用例的速度。相反,最好使用内置的rangerepeat函数来生成数据。

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

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

要创建包含值hello重复100次的表strings,请运行

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

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

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

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