이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.토토 : 문서 : 17 : 50.3. 파서 스테이지버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

2.3. 토토 사이트 순위 단계

토토 사이트 순위 단계두 개로 구성됨 부품:

  • 토토 사이트 순위다음에 정의됨gram.y그리고스캔.lUnix 도구를 사용하여 빌드됨yacc그리고렉스.

  • 변환 과정그렇습니다 데이터 구조 수정 및 확대 토토 사이트 순위가 반환했습니다.

2.3.1. 토토 사이트 순위

토토 사이트 순위는 쿼리 문자열(다음과 같이 도착함)을 확인해야 합니다. 일반 ASCII 텍스트)를 사용하여 유효한 구문을 확인하세요. 구문이 올바른 경우 a파싱 트리만들어서 돌려받음 그렇지 않으면 오류가 반환됩니다. 구현을 위해 우물 알려진 Unix 도구렉스그리고yacc사용됩니다.

렉서파일에 정의되어 있습니다스캔.l그리고 다음을 담당합니다. 인식식별자, 그SQL 키워드등. 모든 키워드 또는 발견된 식별자, a토큰이다 생성되어 토토 사이트 순위에 전달됩니다.

토토 사이트 순위는 파일에 정의되어 있습니다.gram.y다음 세트로 구성됨문법 규칙그리고작업규칙이 실행될 때마다 실행됩니다. 해고되었습니다. 작업 코드(실제로는 C 코드)는 다음과 같습니다. 구문 분석 트리를 구축하는 데 사용됩니다.

파일스캔.l다음으로 변환됩니다. C 소스 파일스캔.c사용 중 프로그램렉스그리고gram.y다음으로 변환됨gram.c사용 중yacc. 이러한 변환을 거친 후에는 일반적인 C 컴파일러를 사용하여 다음을 생성할 수 있습니다. 토토 사이트 순위. 생성된 C 파일을 절대로 변경하지 마십시오. 다음번에는 덮어쓰게 됩니다렉스또는yacc호출됩니다.

참고:언급된 변환과 컴파일은 일반적으로 다음을 사용하여 자동으로 수행됩니다.메이크파일다음과 함께 제공됨PostgreSQL출처 배포.

에 대한 자세한 설명yacc또는 다음에 제공된 문법 규칙gram.y범위를 벗어나는 것입니다. 이 논문. 관련된 책과 문서가 많이 있습니다.렉스그리고yacc. 당신은 다음 사항에 대해 잘 알고 있어야 합니다.yacc공부를 시작하기 전에 주어진 문법gram.y그렇지 않으면 당신은 거기서 무슨 일이 일어나는지 이해하지 못할 것입니다.

다음에 사용된 데이터 구조에 대한 더 나은 이해를 위해PostgreSQL13784_14108공급업체 데이터베이스이미 정의되었습니다.

예 2-1. 간단한 선택

s.sname, se.pno 선택
    공급업체 s에서 se를 판매함
    여기서 s.sno  2이고 s.sno = se.sno;

그림 \refparsetree는 다음을 보여줍니다.파싱 나무에 제공된 문법 규칙과 동작에 따라 구축됨gram.y에 제공된 쿼리에 대해예 2-1(없이연산자 트리에 대한where 절그림에 표시됨 \refwhere_clause 표시할 공간이 충분하지 않았기 때문입니다. 하나의 그림에 두 데이터 구조가 모두 있음).

트리의 최상위 노드는 aSelectStmt노드. 다음에 나타나는 모든 항목에 대해절에서SQL 쿼리 중 aRangeVar노드가 생성되어 의 이름별칭및 a에 대한 포인터RelExpr노드 이름을 보유하고 있는관계. 모두RangeVar노드는 다음과 같은 목록에 수집됩니다. 필드에 첨부됨fromClauseSelectStmt노드.

다음에 나타나는 모든 항목에 대해선택 목록SQL 쿼리의 aResTarget노드가 생성되어 포인터를 보유하고 있습니다.속성노드.속성노드가 다음을 보유함관계 이름의 항목 및 a에 대한 포인터노드 의 이름을 갖고 있는속성. 모두ResTarget노드는 다음으로 수집됩니다. 필드에 연결된 목록대상 목록SelectStmt노드.

그림 \refwhere_clause는 다음을 위해 구축된 연산자 트리를 보여줍니다. 에 제공된 SQL 쿼리의 where 절예제 2-1이것은 필드에 첨부됨qualSelectStmt노드. 의 최상위 노드 연산자 트리는A_Expr노드 을 나타내는그리고작동. 이 노드에는라는 두 개의 후속 노드가 있습니다.lexpr그리고rexpr둘을 가리키며하위 트리. 다음에 연결된 하위 트리lexpr자격을 나타냅니다s.sno 2그리고 다음에 첨부된 것rexpr표시s.sno = se.sno. 모든 속성에 대해속성노드가 생성되어 다음 이름을 보유합니다. 관계 및 a에 대한 포인터노드 속성의 이름을 보유합니다. 상수항의 경우 쿼리에 표시됨 a상수노드는 값을 보유하여 생성되었습니다.

2.3.2. 변환 과정

변환 과정걸림 토토 사이트 순위가 입력 및 단계로 반환한 트리 그것을 통해 재귀적으로. 만약에SelectStmt노드가 발견되면 a로 변환됩니다.쿼리가장 최상위 노드가 될 노드 새로운 데이터 구조의 노드. 그림 \reftransformed는 다음을 보여줍니다. 변환된 데이터 구조(변환된 부분where 절그림에 나와 있습니다. \reftransformed_where 공간이 부족해서 모든 부분을 하나의 그림으로 표시).

이제 확인이 이루어졌습니다. 다음과 같은 경우관계 이름에서FROM 절알려져 있습니다 시스템에. 에 존재하는 모든 관계 이름에 대해시스템 카탈로그 a RTE관계를 포함하는 노드가 생성됩니다 이름, 그별칭 이름그리고관계 ID. 이제부터 관계 ID는 다음과 같습니다. 다음을 참조하는 데 사용됩니다.관계주어진 쿼리에서. 모두RTE노드는 에서 수집됨범위 토토 사이트 순위블 항목 목록필드에 연결된 것r토토 사이트 순위블쿼리노드. 시스템에 알려지지 않은 릴레이션의 이름인 경우 쿼리에서 감지되면 오류가 반환되고 쿼리 처리가 중단됩니다.

다음으로 다음이 확인됩니다.속성 이름사용된 것은 다음에 주어진 관계에 포함되어 있습니다. 쿼리. 발견된 모든 속성에 대해TLE노드가 a에 대한 포인터를 가지고 생성됩니다.레스돔노드(다음 이름을 보유함) 열) 및 a에 대한 포인터VAR노드. 에는 두 가지 중요한 숫자가 있습니다.VAR노드. 필드바르노관계의 위치를 제공합니다. 범위 테이블 항목 목록에 현재 속성 포함 위에서 생성되었습니다. 필드varattno관계 내 속성의 위치를 제공합니다. 만약 속성 이름을 찾을 수 없으며 오류가 반환됩니다. 쿼리 처리가 중단됩니다.