sqllogictest 루프
sqllogictest 루프 (Loops)
sqllogictest에서 상수 값만 조금 바꿔 가며 같은 쿼리를 여러 번 실행해야 할 때 루프(loop)를 사용할 수 있어요. 예를 들어 테이블에 0...100 값이 있는지 확인하는 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에는 필요한 경우 사용해야 하는 미리 설정된 조합(preset combinations)도 몇 가지 있어요. 이렇게 하면 preset에 새 조합이 추가될 때, 기존 테스트가 자동으로 새 조합을 사용하게 돼요.
| Preset | Expansion |
|---|---|
| ⟨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 문을 실행하면 테스트가 불필요하게 느려져요. 데이터 삽입에 루프를 사용하지 마세요.
루프 없이 데이터 생성하기 (Data Generation without Loops)
루프는 아껴서 사용해야 해요. insert 문으로 데이터를 삽입하는 데 루프를 쓰고 싶어질 수 있지만, 이러면 테스트 케이스가 상당히 느려져요. 대신 내장된 range와 repeat 함수를 사용해 데이터를 생성하는 것이 더 좋아요.
integers 테이블을 [0, 1, ..., 98, 99] 값으로 만들려면:
CREATE TABLE integers AS SELECT * FROM range(0, 100, 1) t1(i);
strings 테이블을 hello 값 100번으로 만들려면:
CREATE TABLE strings AS SELECT * FROM repeat('hello', 100) t1(s);
이 두 함수를 크로스 프로덕트와 다른 표현식의 영리한 사용과 결합하면, 다양한 종류의 데이터셋을 효율적으로 생성할 수 있어요. random() 함수를 사용해 임의 데이터를 생성할 수도 있어요.
또 다른 옵션은 기존 CSV 또는 Parquet 파일에서 데이터를 읽는 거예요. test/sql/copy/csv/data/real 디렉터리에서 COPY INTO 문이나 read_csv_auto 함수를 사용해 로드할 수 있는 큰 CSV 파일이 몇 개 있어요.
TPC-H와 TPC-DS 확장을 사용해 CALL dbgen(sf = 1) 또는 CALL dsdgen(sf = 1) 같은 것으로 합성 데이터를 생성할 수도 있어요.