범퍼카 토토 : Verbose SQL 쿼리를 최소한의 예제로 줄입니다

게시2022-03-09by Credativ gmbh
관련 오픈 소스

SQLSMITH효과적인 것으로 입증되었습니다 Postgresql 서버 및 기타의 다른 영역에서 버그를 찾는 도구 유령 버그에서부터 segfaults에 이르기까지 보안 버그를 포함한 제품 유형 및 색인 방법 구현.

그러나 일부 오류를 트리거하는 SQLSMITH에 의해 생성 된 랜덤 쿼리는 다음과 같습니다. 대부분 매우 크고 기여하지 않는 많은 소음이 포함되어 있습니다. 오류. 지금까지 쿼리 및 지루한 편집의 수동 검사는 개발자가 사용할 수있는 최소 재생산으로 예제를 줄여야합니다. 문제를 해결하려면

이 문제는에 의해 해결됩니다.범퍼카 토토. 범퍼카 토토는 임의의 SQL을 입력하는 역할을합니다 그런 다음 PostgreSQL 서버에 대해 실행되는 쿼리. 다양한 단순화 단계가 적용되어 각 단계 후에 단순화 된 쿼리가 여전히 확인됩니다. PostgreSQL에서 동일한 오류를 트리거합니다. 최종 결과는 SQL 쿼리입니다 최소 복잡성.

범퍼카 토토는 쿼리를 줄이는 데 효과적입니다.SQLSMITH의 원래 오류 보고서수동으로 감소 된 쿼리와 일치하는 쿼리.

자세한 내용은블로그 게시물에서 작동하는 방법.

example

2018 년SQLSMITH가 Segfault를 찾았습니다in PostgreSQL running Git revision 039eb6e92f. 당시 재생산기는 40 라인, 2.2kb 쿼리였습니다.

선택 pg_catalog.lastval () <pg_catalog.pg_stat_get_bgwriter_maxwritten_clean () pg_catalog.circle_sub_pt (경우). 캐스트 (캐스트 (원으로 널) 원으로 캐스트), 캐스트 ((공개 위치 선택 1 1 오프셋 13) as point)) ~ cast (nullif (cast cast (null as box)) & (public.brintest 한계 1 오프셋 2) 그런 다음 (public.circle_tbl 한계 1 오프셋 4에서 f1을 선택하십시오.) else (public.circle_tbl 한계 1 오프셋 4에서 f1을 선택하십시오. 끝, 경우 (public.f_star에서 pg_catalog.max (클래스)를 선택하십시오. ~~ ref_0.c 그런 다음 캐스트 (널로 null) else 캐스트 (null as circle) 끝 ) 원으로) 그런 다음 ref_0.a else ref_0.a end 그렇지 않으면 PG_CATALOG.CIRCLE_SUB_PT ( 캐스트 (캐스트 (원으로 널) 원으로 캐스트), 캐스트 ((공개 위치 선택 1 1 오프셋 13) as point)) ~ cast (nullif (cast cast (null as box)) & (public.brintest 한계 1 오프셋 2) 그런 다음 (public.circle_tbl 한계 1 오프셋 4에서 f1을 선택하십시오.) else (public.circle_tbl 한계 1 오프셋 4에서 f1을 선택하십시오. 끝, 경우 (public.f_star에서 pg_catalog.max (클래스)를 선택하십시오. ~~ ref_0.c 그런 다음 캐스트 (널로 null) else 캐스트 (null as circle) 끝 ) 원으로) 그런 다음 ref_0.a else ref_0.a end C0으로 끝나고 경우 (public.brintest 한계 1 오프셋 1에서 interalcol을 선택하십시오.) = 캐스트 ( "간격"으로 NULL) 그런 다음 (공개. ! ~~ ref_0.c) 그리고 (cast (null as xid) < 100) 그런 다음 ref_0.b else ref_0.b end 그렇지 않으면 (public.room에서 pg_catalog.max (roomno)를 선택하십시오 ! ~~ ref_0.c) 그리고 (cast (null as xid) < 100) 그런 다음 ref_0.b else ref_0.b end C1로 끝나고 ref_0.a as C2, (public.idxpart1 한계 1 오프셋 5에서 a를 선택하십시오.) C3, ref_0.B AS C4, pg_catalog.stddev ( cast ((public.brintest에서 pg_catalog.sum (float4col)을 선택하십시오) as float4)) Over (ref_0.a, ref_0.b, ref_0.c의 ref_0.b에 의한 파티션) c5, c5, c5, CAST (int4 AS int4 AS int4) CAST (ref_0.B as C7, ref_0.c As C8 ~에서 public.mlparted3 as ref_0 진실한 곳;

범퍼카 토토는 그 괴물을 효과적으로 줄일 수 있습니다 :

public.mlparted3에서 c5 as ref_0에서 c5로 pg_catalog.stddev (null) Over ()를 선택하십시오.

가용성

SQLREDUCE는 MIT 라이센스에 따라 오픈 소스 라이센스입니다. 소스 코드는 github : https://github.com/credativ/범퍼카 토토에 있습니다.

범퍼카 토토에 대한 데비안/우분투 패키지가 배송되었습니다apt.postgresql.org.

범퍼카 토토는의 오픈 소스 제품입니다.Credativ gmbh.