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

토토 사이트 단계

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

  • the토토 사이트정의gram.yandscan.lis Unix 도구를 사용하여 구축YACClex.

  • the변환 과정데이터 구조에 대한 수정 및 증강이 반환되었습니다 토토 사이트에 의해.

토토 사이트

토토 사이트는 쿼리 문자열을 확인해야합니다 (평원으로 도착합니다. 유효한 구문에 대한 ASCII 텍스트). 구문이 올바른 경우 aParse Tree| 그렇지 않으면 a 오류가 반환됩니다. 잘 알려진 UNIX 도구를 구현하려면lexandYACC사용됩니다.

theLexer파일에 정의되어 있습니다scan.l인식의 책임식별자,SQL 키워드등. 발견 된 모든 키워드 또는 식별자에 대해 A토큰가 생성되어 토토 사이트.

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

파일scan.lC- 소스 파일scan.c프로그램 사용lexandgram.ygram.c사용YACC. 이러한 변형이 발생한 후 정상적인 C- 컴파일러가 발생했습니다 토토 사이트를 만드는 데 사용할 수 있습니다. 절대 변경하지 마십시오 다음에 덮어 쓰기 때문에 C-Files가 생성되었습니다lex또는YACC호출.

참고 :언급 된 변환 및 편집 일반적으로를 사용하여 자동으로 수행됩니다.makefilesPostgres소스 배포.

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

사용 된 데이터 구조에 대한 더 나은 이해를 위해Postgresa 쿼리 우리는 이에 대한 변경 사항을 설명하기 위해 예제를 사용합니다. 모든 단계의 데이터 구조.

예제 61-1. 간단한 선택

이 예제는 다음과 같은 간단한 쿼리가 포함되어 있습니다. 다음과 같은 다양한 설명과 수치에 사용됩니다 섹션. 쿼리는에 나와있는 테이블을 가정합니다.공급 업체 데이터베이스이미 그랬습니다 한정된.

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

그림 \ ref parsetree 표시구문 분석 나무문법 규칙과 행동에 의해 구축 된gram.y간단한 선택 예제 다양한에서 사용될 다음 간단한 쿼리가 포함되어 있습니다. 다음 섹션에서 설명 및 수치. 그만큼 쿼리는 공급 업체 데이터베이스에 주어진 테이블에 이미 정의되었습니다. 공급 업체에서 S.Sname, se.pno를 선택하십시오 SESNO 2 및 S.SNO = SE.SNO; SE(없이운영자 트리어디서 절그림에 나와 있습니다 \ ref where_clause 둘 다를 보여줄 공간이 충분하지 않기 때문에 한 그림의 데이터 구조).

트리의 상단 노드는 A입니다.SelectStmt노드. 에 나타나는 모든 항목에 대해From ClauseSQL 쿼리 ARANGEVAR노드는의 이름을 고정하는 생성되었습니다alias그리고 A에 대한 포인터Relexpr이름을 고정하는 노드관계. 모두범위노드는 필드에 첨부 된 목록에 수집FromclauseSelectStmt노드.

모든 항목에 대해선택 목록SQL 쿼리 ARESTARGET노드 에 대한 포인터를 잡고 생성됩니다.attr노드. 그만큼attr노드를 보유합니다관계 이름항목 및 A에 대한 포인터value이름을 고정하는 노드속성. 모두RESTARGET노드는 목록으로 수집됩니다 현장에 연결TargetListSelectStmt노드.

그림 \ ref where_clause는 예제에 제공된 SQL 쿼리의 위치간단한 선택 예제 다양한에서 사용될 다음 간단한 쿼리가 포함되어 있습니다. 다음 섹션에서 설명 및 수치. 그만큼 쿼리는 공급 업체 데이터베이스에 주어진 테이블에 이미 정의되었습니다. 공급 업체에서 S.Sname, se.pno를 선택하십시오 SESNO 2 및 S.SNO = SE.SNO; SE필드QualselectStmt노드. 연산자 트리의 상단 노드a_expran을 나타내는 노드and작동. 이 노드에는 두 가지가 있습니다 후임자lexprandRexpr2를 가리키는하위 트리. 첨부 된 하위 트리lexpr자격을 나타냅니다S.Sno 2그리고 첨부 된 것Rexpr대표s.sno = se.sno. 모든 속성에 대해attr노드는 관계 이름과 A에 대한 포인터를 고정하는 생성되었습니다value이름을 고정하는 노드 기인하다. 쿼리 a에 나타나는 상수 용어의 경우const노드는 값.

변환 프로세스

the변환 과정토토 사이트에 의해 입력 및 단계가 재귀 적으로 트리 그것을 통해. aSelectStmt노드가 발견되었습니다. 그것은로 변형됩니다.쿼리노드 새로운 데이터 구조의 가장 큰 노드가 될 것입니다. 수치 \ ref transformed 변환 된 데이터 구조 (부품 변형 된어디서 절가 제공됩니다 그림 \ ref transformed_where에서 충분하지 않기 때문에 한 그림의 모든 부품을 보여주는 공간).

이제 확인이 이루어집니다.관계 이름inFrom Clause시스템. 에 존재하는 모든 관계 이름에 대해시스템 카탈로그aRTE노드는 관계 이름을 포함하여 생성되었습니다. 그만큼별칭 이름and the관계 ID. 이제부터 관계 ID가 사용됩니다 를 언급하려면관계질문. 모두RTE노드가 수집됩니다 그만큼범위 테이블 엔트리 목록현장에 연결rtable쿼리노드. 관계의 이름 인 경우 쿼리에서 시스템이 감지되는 것으로 알려져 있지 않습니다. 오류가 발생합니다. 반환하면 쿼리 처리가 중단됩니다.

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