그윈 토토 단계두 개로 구성됨 부품:
그윈 토토다음에 정의됨gram.y그리고스캔.l이다 UNIX 도구를 사용하여 구축됨yacc그리고렉스.
그변환 과정그렇습니다 반환된 데이터 구조에 대한 수정 및 확장 윈 토토에 의해.
윈 토토는 쿼리 문자열을 확인해야 합니다(일반으로 도착함) ASCII 텍스트)를 사용하여 유효한 구문을 확인하세요. 구문이 올바른 경우 a파싱 트리이 구축되고 그렇지 않으면 반환됩니다. 오류가 반환됩니다. 구현을 위해 잘 알려진 UNIX 도구렉스그리고yacc사용됩니다.
그렉서파일에 정의되어 있습니다스캔.l그리고 인식을 담당합니다식별자, 그SQL 키워드등. 발견된 모든 키워드 또는 식별자에 대해 a토큰생성되어 다음 사용자에게 전달됩니다. 윈 토토.
윈 토토는 파일에 정의되어 있습니다.gram.y다음 세트로 구성됨문법 규칙그리고작업규칙이 실행될 때마다 실행됩니다. 작업 코드 (실제로는 C 코드임)은 구문 분석 트리를 구축하는 데 사용됩니다.
파일스캔.l다음으로 변환됩니다. C 소스 파일스캔.c프로그램 사용하기렉스그리고gram.y다음으로 변환됨gram.c사용yacc. 이러한 변환이 수행된 후 일반 C 컴파일러 윈 토토를 생성하는 데 사용할 수 있습니다. 절대로 변경하지 마세요. 다음에 덮어쓰게 되므로 생성된 C 파일렉스또는yacc호출되었습니다.
참고:언급된 변환 및 컴파일 일반적으로 다음을 사용하여 자동으로 수행됩니다.메이크파일다음과 함께 배송됨포스트그레소스 배포.
에 대한 자세한 설명yacc또는 다음에 제공된 문법 규칙gram.y이 문서의 범위를 벗어납니다. 책도 많고, 다루는 문서렉스그리고yacc. 당신은 다음 사항에 대해 잘 알고 있어야 합니다.yacc공부를 시작하기 전에 주어진 문법gram.y그렇지 않으면 당신은 거기서 무슨 일이 일어나는지 이해하지 못할 거예요.
다음에 사용된 데이터 구조에 대한 더 나은 이해를 위해포스트그레처리를 위해 쿼리에 대한 변경 사항을 설명하기 위해 예제를 사용합니다. 모든 단계의 데이터 구조.
이 예에는 다음과 같은 간단한 쿼리가 포함되어 있습니다. 다음 전반에 걸쳐 다양한 설명과 그림에 사용됩니다. 섹션. 쿼리는 다음과 같이 가정합니다.공급업체 데이터베이스이미 정의되었습니다.
s.sname, se.pno 선택
공급업체 s에서 se를 판매함
여기서 s.sno 2이고 s.sno = se.sno;
그림 \refparsetree는 다음을 보여줍니다.파싱 나무다음에 제공된 문법 규칙과 동작에 따라 구축됨gram.y에 제공된 쿼리에 대해간단한 선택이 예 다양한 용도로 사용되는 다음과 같은 간단한 쿼리가 포함되어 있습니다. 다음 섹션 전체에 설명과 그림이 나와 있습니다. 는 쿼리는 공급자 데이터베이스에 제공된 테이블에 다음이 있다고 가정합니다. 이미 정의되어 있습니다. 공급업체에서 s.sname, se.pno를 선택하고 판매합니다. se 여기서 s.sno 2이고 s.sno = se.sno;(없이연산자 트리에 대한where 절그림에 표시됨 \refwhere_clause 왜냐하면 둘 다 표시할 공간이 충분하지 않았기 때문입니다. 한 그림의 데이터 구조).
트리의 최상위 노드는 aSelectStmt노드. 에 나타나는 모든 항목에 대해절에서SQL 쿼리 중 aRangeVar노드는 다음의 이름을 가지고 생성됩니다.별칭및 a에 대한 포인터RelExpr노드 이름을 보유하고 있는관계. 모두RangeVar노드는 필드에 첨부된 목록에 수집됩니다.fromClause의SelectStmt노드.
다음에 나타나는 모든 항목에 대해선택 목록SQL 쿼리의 aResTarget노드 에 대한 포인터를 보유하여 생성됩니다.속성노드.속성노드 보유관계 이름항목 및 a에 대한 포인터값노드 이름을 보유하고 있는속성. 모두ResTarget노드가 목록으로 수집됩니다. 필드에 연결됨대상 목록의SelectStmt노드.
그림 \refwhere_clause는 다음을 위해 구축된 연산자 트리를 보여줍니다. 예제에 제공된 SQL 쿼리의 where 절간단한 선택이 예 다양한 용도로 사용되는 다음과 같은 간단한 쿼리가 포함되어 있습니다. 다음 섹션 전체에 설명과 그림이 나와 있습니다. 는 쿼리는 공급자 데이터베이스에 제공된 테이블에 다음이 있다고 가정합니다. 이미 정의되어 있습니다. 공급업체에서 s.sname, se.pno를 선택하고 판매합니다. se 여기서 s.sno 2이고 s.sno = se.sno;다음에 첨부됨 필드qual의SelectStmt노드. 연산자 트리의 최상위 노드 는A_Expr을 나타내는 노드그리고작동. 이 노드에는 두 개의 후임자가 호출됨lexpr그리고rexpr둘을 가리키며하위 트리. 다음에 연결된 하위 트리lexpr자격을 나타냅니다s.sno 2그리고 다음에 첨부된 것rexpr표시s.sno = se.sno. 모든 속성에 대해속성관계의 이름과 a에 대한 포인터를 보유하는 노드가 생성됩니다.값노드 이름을 보유하고 있는 노드 속성. 쿼리에 나타나는 상수 용어의 경우 a상수노드가 생성되어 값.
그변환 과정다음을 취합니다 윈 토토가 입력으로 트리를 전달하고 재귀적으로 단계를 수행합니다. 그것을 통해. 만약에SelectStmt노드를 찾았습니다. a로 변환됩니다.쿼리노드 새로운 데이터 구조의 최상위 노드가 됩니다. 그림 \reftransformed는 변환된 데이터 구조를 보여줍니다(부분 변화된 사람을 위해where 절주어졌습니다 그림 \reftransformed_where에서는 충분하지 않았기 때문에 모든 부분을 하나의 그림으로 표시하는 공간).
이제 확인이 이루어졌습니다. 다음과 같은 경우관계 이름에서FROM 절알려진 시스템. 에 존재하는 모든 관계 이름에 대해시스템 카탈로그 a RTE관계 이름을 포함하는 노드가 생성됩니다.별명 이름그리고관계 ID. 이제부터는 관계 ID가 사용됩니다. 참조하기 위해관계에 주어짐 쿼리. 모두RTE노드는 다음에 수집됩니다.범위 테이블 항목 목록이것은 필드에 연결됨rtable의쿼리노드. 관계의 이름이 시스템에 알려지지 않은 것이 쿼리에서 감지되면 오류가 발생합니다. 반환되고 쿼리 처리가 중단됩니다.
다음으로 다음이 확인됩니다.속성 이름사용된 내용은 쿼리에 제공된 관계에 포함되어 있습니다. 발견된 모든 속성에 대해TLE노드는 a에 대한 포인터를 가지고 생성됩니다.레스돔노드(노드의 이름을 보유함) 열) 및 a에 대한 포인터VAR노드. 거기 는 두 개의 중요한 숫자입니다.VAR노드. 필드바르노다음의 위치를 제공합니다. 범위 테이블 항목의 현재 속성을 포함하는 관계 위에서 만든 목록입니다. 필드varattno관계 내 속성의 위치를 제공합니다. 만약 속성 이름을 찾을 수 없으며 오류가 반환됩니다. 쿼리 처리가 중단됩니다.