이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다토토 : 문서 : 17 : 50.3. 파서 스테이지버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

2.3. 파서 스테이지

theParser Stage두 가지로 구성됩니다 부분품:

  • the파서정의gram.yandscan.lUNIX 도구를 사용하여 구축되었습니다YACCandlex.

  • 변환 과정데이터 구조에 대한 수정 및 증강 파서에 의해 반환.

2.3.1. 파서

파서는 쿼리 문자열을 확인해야합니다 ( 유효한 구문에 대한 일반 ASCII 텍스트). 구문이 올바른 경우 aParse Tree| 그렇지 않으면 오류가 반환됩니다. 구현을 위해 우물 알려진 유닉스 도구lexandYACC사용됩니다.

theLexer파일에 정의되어 있습니다scan.l인식식별자, TheSQL 키워드등. 모든 키워드 또는 발견 된 식별자, a토큰is 파서에게 생성되고 건네 준다.

파서는 파일에 정의되어 있습니다gram.y그리고 일련의 세트로 구성됩니다문법 규칙andAction규칙이있을 때마다 실행됩니다 해고. 액션 코드 (실제로 C 코드)는 다음과 같습니다. 구문 분석 트리를 구축하는 데 사용됩니다.

파일scan.l로 변환됩니다 C- 소스 파일scan.c사용 프로그램lexandgram.ygram.c사용YACC. 이러한 변형 후 정상적인 C- 컴파일러가 사용하여 사용하여 파서. 생성 된 C-Files를 변경하지 마십시오. 다음에 덮어 쓸 것입니다lex또는YACC호출.

참고 :언급 된 변환 및 컴파일은 일반적으로를 사용하여 자동으로 수행됩니다.MakeFilesPostgreSQL소스 분포.

자세한 설명YACC또는 문법 규칙gram.y의 범위를 벗어납니다 이 논문. 다루는 많은 책과 문서가 있습니다lexandYACC. 당신은 익숙해야합니다YACC공부를 시작하기 전에 에 주어진 문법gram.y그렇지 않으면 당신은 거기서 무슨 일이 일어나는지 이해하지 못할 것입니다.

사용 된 데이터 구조에 대한 더 나은 이해를 위해PostgreSQL처리의 경우 쿼리의 변경 사항을 설명하기 위해 예제를 사용합니다. 이러한 데이터 구조는 모든 단계에서 구조화됩니다. 이 예제에는 포함됩니다 다양한에서 사용될 간단한 쿼리 다음 다음 섹션에서 설명 및 수치. 그만큼 쿼리는에 나와있는 테이블을 가정합니다.공급 업체 데이터베이스이미 정의되었습니다.

예 2-1. 간단한 선택

s.sname, se.pno를 선택하십시오
    공급 업체에서 SE를 판매합니다
    여기서 s.sno 2 및 s.sno = se.sno;

그림 \ ref parsetree가를 보여줍니다.구문 분석 나무문법 규칙과 행동에 의해 구축 된gram.y예 2-1(없이운영자 트리어디서 절그림에 나와 있습니다 \ ref where_clause를 보여줄 공간이 충분하지 않기 때문에 한 그림의 두 데이터 구조 모두).

트리의 상단 젠 토토는 A입니다.SelectStmt젠 토토. 출입하는 모든 항목에 대해 그만큼From ClauseSQL 쿼리 A범위젠 토토는 이름alias그리고 A에 대한 포인터Relexpr이름을 고정하는 젠 토토관계. 모두범위젠 토토는 목록에 수집됩니다 현장에 첨부FromclauseOF 그만큼SelectStmt젠 토토.

모든 항목에 대해선택 목록의 SQL 쿼리 aRESTARGET젠 토토는 포인터를 잡고있는를 잡고 생성되었습니다.attr젠 토토. 그만큼attr젠 토토를 보유합니다관계 이름의 입력 및 A에 대한 포인터value젠 토토 의 이름을 잡고속성. 모두RESTARGET젠 토토는 a로 수집됩니다 필드에 연결된 목록TargetListSelectStmt젠 토토.

그림 \ ref where_clause에 구축 된 연산자 트리가 표시됩니다 SQL 쿼리의 WHERE 절예 2-1현장에 첨부QualSelectStmt젠 토토. 의 상단 노드 운영자 트리는a_expr젠 토토 대표and작동. 이것 젠 토토에는라는 두 명의 후임자가 있습니다.lexprandRexpr2를 가리키는하위 트리. 첨부 된 하위 트리lexpr자격을 나타냅니다S.Sno 2그리고 첨부 된 것Rexpr대표s.sno = se.sno. 모든 속성에 대해attr노드의 이름을 고정하는 젠 토토가 생성되었습니다 관계 및 A에 대한 포인터value노드 속성의 이름을 유지합니다. 상수 용어의 경우 쿼리 a에 나타납니다.const젠 토토입니다 가치를 유지하는 생성.

2.3.2. 변환 과정

the변환 과정파서에 의해 입력 및 단계로 트리를 전달했습니다. 그것을 통해 재귀 적으로. aSelectStmt젠 토토가 발견되면로 변환됩니다.쿼리가장 맨 위에있는 노드 새로운 데이터 구조의 젠 토토. 그림 \ ref transformed가 표시됩니다 변환 된 데이터 구조 (변환 된 부분)어디서 절그림에 나와 있습니다 \ ref transformed_where 공간이 충분하지 않기 때문에 한 그림의 모든 부분을 보여줍니다).

이제 수표가 이루어지면관계 이름inFrom Clause알려져 있습니다 시스템에. 에 존재하는 모든 관계 이름에 대해시스템 카탈로그aRTE노드는 관계가 포함되어 있습니다 이름,별칭 이름and the관계 ID. 이제부터 관계 ID는입니다 를 언급하는 데 사용관계주어진 쿼리에서. 모두RTE젠 토토는입니다 에서 수집범위 테이블 항목 목록현장에 연결된rtable쿼리젠 토토. 시스템에 알려지지 않은 관계 이름 인 경우 쿼리에서 감지됩니다. 오류가 반환되고 쿼리 처리가 중단됩니다.

다음은을 확인합니다속성 이름사용 된 관계에 포함되어 있습니다 질문. 모든 속성에 대해 발견됩니다.tle젠 토토는 A에 대한 포인터를 잡고있는 생성되었습니다.resdom젠 토토 (이름을 보유합니다 열) 및 A에 대한 포인터var젠 토토. 에는 두 가지 중요한 숫자가 있습니다.var젠 토토. 필드varno관계의 위치를 ​​제공합니다 범위 테이블 입력 목록에 현재 속성을 포함하는 위에 만들어졌습니다. 필드varattno관계 내 속성의 위치를 ​​제공합니다. 만약 속성 이름을 찾을 수 없습니다. 오류가 반환됩니다. 그리고 쿼리 처리가 중단됩니다.