SQL 생성 도구를 설명하는 기사

SQL 생성 도구는  Parser  와 다른 데이터베이스 제품의 호환성을 테스트하는 데 사용할 수 있습니다. YACC  문법 파일의 생성을 구문 분석하여  해당  SQL  문을 생성한 다음 그  결과를 기반으로 데이터베이스 사용합니다. , 해당 명령문이 다른 데이터베이스 구문과 호환되는지 여부를 판단합니다.

0 1 도구 사용

문법 파일 전처리

전처리의 목적은 문법 파일에서 관련 없는 콘텐츠를 제거하고 각 문의 생성 내용만 유지하는 것입니다. bison -v sql.y 명령을 통해 문법 파일에서 문법 규칙을 얻은 다음(작업 없이) 제거할 수 있습니다. 생성된 파일에 생성된 내용 중 터미널 기호 목록, 비 터미널 기호 목록, 상태 전이 테이블 등 쓸모없는 부분은 다음과 같습니다.

생성된 sql.output 파일의 내용은 다음과 같습니다. " 구문 " 섹션만 유지합니다.

참고: 예약된 " 구문 " 섹션의 경우 해당 일련 번호도 제거해야 합니다.

 

위 프로세스의 경우 처리된 파일이 도구의 요구 사항을 충족하도록 전처리 스크립트 preprocess.sh를 통해 이를 캡슐화합니다. 생성된 파일 형식은 다음과 같으며 출력 .output 파일은 전처리된 문법 파일입니다.

 

SQL 문 생성

조건에 맞는 구문 파일을 생성한 후 도구를 사용하여 SQL을 생성할 수 있습니다. 이 도구는 다음 매개변수를 지원합니다.

•-b: 필수 구문 파일을 지정합니다. 구문 파일은 preprocess.sh 스크립트로 처리한 후 생성된 파일입니다.

•-n: 생성할 프로덕션 이름을 지정합니다. 필수입니다.

•-R: 무작위 생성 모드, 선택 사항, 기본값은 열거 모드입니다.

•-o: SQL 문을 생성하기 위한 저장 파일을 지정합니다. 선택 사항이며 기본값은 report.csv입니다.

•-N: 생성된 SQL 문 수 제한, 선택 사항, 기본적으로 제한 없음

 

0 2 도구 구현

이 도구에는 토큰 구문 분석 및 SQL 생성을 각각 완료하는 yacc_parser 및 sql_generator라는 두 개의 패키지가 포함되어 있습니다.

생산방법

type SeqInfo struct {
    Items []string
}
type Production struct {
    Head  string    // 产生式头部
    Alter []SeqInfo     // 产生式 body
}

​​​​​​​

토큰 분석

Tokenize 함수는 읽기 문법 파일의 문자를 토큰화하는 데 사용되며 각 호출은 토큰을 반환합니다. 이 함수는 단순 구분 기호와 따옴표만 처리하며, 표준 어휘 분석기의 정기적인 일치를 구현하지 않습니다.

Parse 함수는 Tokenize 함수를 호출하여 매번 하나의 토큰을 반환합니다. 반환 후 Parse 함수는 현재 상태와 토큰 유형을 기반으로 일련의 토큰을 프로덕션으로 조합합니다.

 

SQL 생성

SQL 생성에는 두 가지 모드가 있습니다.

1. Production에서 지정된 Production의 본문 목록을 탐색하고 열거하여 SQL 문을 생성합니다.

2. Production에서 지정된 Production의 본문 목록을 무작위로 선택하여 SQL 문을 무작위로 생성합니다.

 

1. 열거

열거의 구현은 연결 목록을 사용하여 해결될 토큰을 저장하는 것입니다. 연결 목록의 헤드에서 토큰을 가져올 때마다 토큰의 발생 횟수가 증가한 다음 숫자에 따라 증가합니다. 각 하위 표현식의 레코드에서 토큰 발생 횟수가 지정된 시간보다 크면 계속해서 추론할 수 있는 하위 표현식을 필터링합니다.

반면, 현재 취하는 하위 표현식의 첨자(choice)와 기록할 현재 최대 하위 표현식의 첨자(max)를 기록하기 위해 두 개의 배열을 사용하므로 선택에 따라 다음 표현식이 증가될 수 있다.

필터링 후, 선택 위치에서 프로덕션의 올바른 하위 표현을 선택하고 해당 토큰을 모두 연결 목록의 헤드에 삽입한 다음 헤드가 리터럴인지 키워드인지 확인합니다. 그렇다면 헤드를 꺼내서 넣습니다. SQL 배열이 아닌 경우 연결된 목록을 통해 루프를 계속합니다.

처리가 현재 생산의 끝에 도달하면(판정 방법은 선택>최대) 이때 "캐리"가 시도됩니다. 즉, 현재 기록된 위치 배열의 마지막 자리가 증가됩니다.

예: 최대 배열은 1 2 1 3이고 선택 배열은 0 0 0 3이며 carry 뒤의 선택 배열은 0 0 1 0입니다. 이는 마지막 위치가 통과되었으며 이제 두 번째에서 마지막 위치로 이동했음을 의미합니다. 증가해야 하며 마지막 위치가 0이면 다음 순열 및 조합을 계속 읽으십시오.

생성 프로세스는 재귀를 통해 구현됩니다. 예를 들어 다음 생산의 경우 처리 논리는 그림과 같습니다.

show_tables_stmt: 이름 '.'의 테이블 표시 이름 with_comment
                | name with_comment의 테이블 표시
                | with_comment

with_comment: WITH COMMENT
            | %빈

이름: ID ENT

 

기록된 선택 값에 따라 SQL이 생성될 때까지 프로덕션의 선택 하위 표현식을 선택합니다. 그런 다음 선택 배열을 가지고 다음 선택 라운드를 계속합니다.

2. 무작위

무작위 생성 모드는 생산 본문 목록의 각 토큰을 순차적으로 탐색하지 않고 SQL의 일부로 토큰을 무작위로 선택한다는 점을 제외하면 열거 생성 모드와 유사합니다.

 

오픈 소스 산업용 소프트웨어를 포기하기로 결정했습니다 . 주요 이벤트 - OGG 1.0 출시, Huawei가 모든 소스 코드를 제공했습니다. Google Python Foundation 팀이 "코드 똥산"에 의해 해고되었습니다 . ". Fedora Linux 40이 정식 출시되었습니다. 유명 게임 회사가 출시했습니다. 새로운 규정: 직원의 결혼 선물은 100,000위안을 초과할 수 없습니다. China Unicom은 세계 최초로 오픈 소스 모델의 Llama3 8B 중국어 버전을 출시했습니다. Pinduoduo는 보상금을 선고 받았습니다 . 불공정 경쟁에 500만 위안 국내 클라우드 입력 방식 - 화웨이만 클라우드 데이터 업로드 보안 문제 없음
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/u/5148943/blog/11054997