SQLsmith효과적인 것으로 입증되었습니다 PostgreSQL 서버 및 기타 영역의 다양한 영역에서 버그를 찾는 도구 실행기 버그부터 세그폴트까지 보안 버그를 포함한 제품 유형 및 색인 메소드 구현.
그러나 일부 오류를 유발하는 SQLsmith에 의해 생성된 무작위 쿼리는 다음과 같습니다. 대부분 매우 크고 영향을 미치지 않는 많은 소음을 포함합니다. 오류. 지금까지는 쿼리를 수동으로 검사하고 지루한 편집 작업을 수행했습니다. 개발자가 사용할 수 있는 최소한의 재현으로 예제를 줄이는 데 필요합니다. 문제를 해결하기 위해.
이 문제는 다음으로 해결됩니다.SQL감소. SQLreduce는 임의의 SQL을 입력으로 사용합니다. 그런 다음 PostgreSQL 서버에 대해 실행되는 쿼리입니다. 다양한 단순화 단계가 적용되어 각 단계 후에 단순화된 쿼리가 여전히 유효한지 확인합니다. PostgreSQL에서 동일한 오류가 발생합니다. 최종 결과는 다음과 같은 SQL 쿼리입니다. 최소한의 복잡성.
범퍼카 토토는 쿼리를 줄이는 데 효과적입니다.SQLsmith의 원래 오류 보고서수동으로 축소된 쿼리와 일치하는 쿼리에.
자세한 내용은블로그 게시물에서 작동 방식.
2018년에는SQLsmith가 세그폴트를 발견했습니다.Git 개정판 039eb6e92f를 실행하는 PostgreSQL에서. 당시 재생기는 40줄, 2.2kB의 거대한 쿼리였습니다.
선택
pg_catalog.lastval() < pg_catalog.pg_stat_get_bgwriter_maxwrite_clean() 인 경우 pg_catalog.circle_sub_pt(
캐스트(캐스트(원으로 null)를 원으로),
Cast((public.emp 제한 1 오프셋 13에서 위치 선택)
포인트로)) ~ Cast(nullif(캐스트할 경우(상자로 null) & (public.brintest에서 boxcol 선택 제한 1 오프셋 2)
그런 다음 (public.circle_tbl 제한 1 오프셋 4에서 f1 선택)
else (public.circle_tbl 제한 1 오프셋 4에서 f1 선택)
종료,
경우(public.f_star에서 pg_catalog.max(class) 선택)
~~ ref_0.c then 캐스팅(원으로 null) else 캐스팅(원으로 null) end
) 원으로) 그런 다음 ref_0.a else ref_0.a 끝
그렇지 않으면 pg_catalog.circle_sub_pt(
캐스트(캐스트(원으로 null)를 원으로),
Cast((public.emp 제한 1 오프셋 13에서 위치 선택)
포인트로)) ~ Cast(nullif(캐스트할 경우(상자로 null) & (public.brintest에서 boxcol 선택 제한 1 오프셋 2)
그런 다음 (public.circle_tbl 제한 1 오프셋 4에서 f1 선택)
else (public.circle_tbl 제한 1 오프셋 4에서 f1 선택)
종료,
경우(public.f_star에서 pg_catalog.max(class) 선택)
~~ ref_0.c then 캐스팅(원으로 null) else 캐스팅(원으로 null) end
) 원으로) 그런 다음 ref_0.a else ref_0.a 끝
c0으로 끝나고,
경우(public.brintest 제한 1 오프셋 1에서 간격 콜 선택)
= 캐스트("간격"으로 null) 다음의 경우 ((public.room에서 pg_catalog.max(roomno) 선택)
!~~ ref_0.c)
그리고 (cast(xid로 null) < 100) then ref_0.b else ref_0.b end
그렇지 않은 경우((public.room에서 pg_catalog.max(roomno) 선택)
!~~ ref_0.c)
그리고 (cast(xid로 null) < 100) then ref_0.b else ref_0.b end
c1으로 끝나고,
ref_0.a를 c2로,
(public.idxpart1 제한 1 오프셋 5에서 선택)을 c3으로,
ref_0.b를 c4로,
pg_catalog.stddev(
캐스트((public.brintest에서 pg_catalog.sum(float4col) 선택)
float4)) over (ref_0.a, ref_0.b, ref_0.c로 파티션을 나눈 후 ref_0.b로 순서)를 c5로,
Cast(nullif(ref_0.b, ref_0.a) as int4) as c6, ref_0.b as c7, ref_0.c as c8
에서
public.mlparted3(ref_0)
사실인 경우;
범퍼카 토토는 그 괴물을 효과적으로 다음과 같이 줄일 수 있습니다:
SELECT pg_catalog.stddev(NULL) OVER () AS c5 FROM public.mlparted3 AS ref_0
범퍼카 토토는 MIT 라이선스에 따라 라이선스가 부여된 오픈 소스입니다. 소스 코드는 GitHub에 있습니다: https://github.com/credativ/범퍼카 토토
범퍼카 토토용 Debian/Ubuntu 패키지가 배송되었습니다.apt.postgresql.org.
범퍼카 토토는 다음의 오픈 소스 제품입니다.credativ GmbH.