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

2.3. 파서 스롤 토토지

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

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

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

2.3.1. 롤 토토

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

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

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

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

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

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

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

예 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범위노드는 이름별칭그리고 A에 대한 포인터Relexpr이름을 고정하는 노드관계. 모두Rangevar노드는 목록에 수집됩니다 현장에 첨부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노드는입니다 에서 수집범위 테이블 항목 목록현장에 연결된rtableQuery노드. 시스템에 알려지지 않은 관계 이름 인 경우 쿼리에서 감지됩니다. 오류가 반환되고 쿼리 처리가 중단됩니다.

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