토토 커뮤니티 9.3.25 문서 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.3 : 젠 토토 변환 | PostgreSQL : 문서 : 9.3 : 젠 토토 변환 | 10 장. 유형 변환 | PostgreSQL : 문서 : 9.3 : 토토 결과 |
SQL는 강력하게 입력되었습니다 언어. 즉, 모든 데이터 항목에는 관련 데이터 유형이 있습니다. 동작을 결정하고 허용 사용.PostgreSQL확장 가능한 유형 시스템이 있습니다 다른 것보다 더 일반적이고 유연합니다SQL구현. 따라서 대부분의 유형 의 변환 행동PostgreSQL|adhoc휴리스틱. 이것은 사용을 허용합니다 사용자 정의 유형에서도 혼합 유형 표현식.
토토 커뮤니티스캐너/파서 어휘 요소를 5 가지 기본 범주로 나눕니다. 정수, 비 integer 번호, 문자열, 식별자 및 키워드. 대부분의 비 숫자 유형의 상수는 먼저 분류됩니다 문자열. 그만큼SQL언어 정의는 문자열로 유형 이름을 지정할 수 있습니다 메커니즘을 사용할 수 있습니다PostgreSQL파서를 시작하려면 올바른 경로. 예를 들어, 쿼리 :
텍스트 '원점'을 "레이블", 포인트 '(0,0)' 'value "로 선택합니다. 라벨 | 값 --------+------- 원산지 | (0,0) (1 행)
유형의 2 개의 문자 상수가 있습니다텍스트and포인트. 유형이 a에 지정되지 않은 경우 문자열 문자, 그런 다음 자리 표시 자 유형알 수없는처음에는 할당되어 나중에 해결됩니다 아래에 설명 된 단계.
4 가지 기본 사항이 있습니다SQL별도의 유형이 필요한 구성 의 전환 규칙PostgreSQL파서 :
많은PostgreSQL타입 시스템은 풍부한 기능 세트를 중심으로 구축되었습니다. 기능은 가질 수 있습니다 하나 이상의 주장. 부터PostgreSQL함수 과부하를 허용합니다 함수 이름만으로는 기능을 고유하게 식별하지 않습니다. 라고 불리는; 파서는 데이터를 기반으로 올바른 함수를 선택해야합니다. 제공된 인수의 유형.
PostgreSQL표현식을 허용합니다 접두사 및 Postfix 단색 (1 회의) 연산자와 함께 바이너리 (두정) 연산자. 함수와 마찬가지로 운영자는 가능합니다 오버로드, 따라서 올바른 연산자를 선택하는 것과 동일한 문제가 있습니다. 존재합니다.
SQL 삽입and업데이트진술은 표현식 결과를 표에 배치합니다. 그만큼 성명서의 표현은 아마도 일치하고 아마도 대상 열의 유형으로 변환.
모든 쿼리가 Unionized의 결과로 결과select명령문은 단일 세트에 나타납니다
열, 각각의 결과 유형select절을 일치시키고 a로 변환해야합니다
균일 한 세트. 마찬가지로 a의 결과 표현CASE구성은 공통 유형으로 변환되어야합니다
그게CASE전체적으로 표현
알려진 출력 유형. 도 마찬가지입니다.배열구조 및가장 큰
and최소
기능.
시스템 카탈로그는 어떤 변환에 대한 정보를 저장하고, 또는캐스트, 데이터 유형 사이에 존재합니다. 그리고 그러한 전환을 수행하는 방법. 추가 캐스트를 추가 할 수 있습니다 사용자가캐스트 만들기명령. (이것은 일반적으로 새로운 정의와 함께 이루어집니다 데이터 유형. 내장 유형 사이의 캐스트 세트는있었습니다 조심스럽게 제작되었으며 변경되지 않습니다.)
Parser가 제공하는 추가 휴리스틱을 사용하면 개선 할 수 있습니다 유형 그룹 간의 적절한 캐스팅 동작 결정 암시 적 캐스트가 있습니다. 데이터 유형은 여러 기본으로 나뉩니다유형 카테고리, 포함부울, 숫자, String, Bitstring, DateTime, 타임 스팬, 기하학적, 네트워크및 사용자 정의. (목록 참조표 47-52; 그러나 사용자 정의 유형 카테고리를 만들 수도 있습니다.) 각 카테고리 내에는 하나 이상이있을 수 있습니다선호 유형,있을 때 선호됩니다 가능한 유형의 선택. 신중하게 선호하는 선택 유형 및 사용 가능한 암시 적 캐스트, 모호한 표현 (여러 후보자 구문 분석 솔루션)은 유용한 방식으로 해결 될 수 있습니다.
모든 유형 변환 규칙은 여러 원칙으로 설계되었습니다 명심 :
암시 적 변환은 결코 놀라운 일이 없어야합니다 예측할 수없는 결과.
Parser 또는 Executor에 추가 오버 헤드가 없어야합니다. 쿼리에는 암시 적 유형 변환이 필요하지 않습니다. 즉, 쿼리 인 경우입니다 잘 형성되어 있고 유형이 이미 일치하고 쿼리가 파서에서 여분의 시간을 보내지 않고 실행하십시오. 쿼리에서 불필요한 암시 적 변환 호출 소개.
또한 쿼리에 일반적으로 암시 적 변환이 필요한 경우 함수의 경우, 그렇다면 사용자는 새 함수를 다음과 함께 정의합니다. 올바른 인수 유형, 파서는이 새로운 기능을 사용해야합니다. 더 이상 이전 기능을 사용하기 위해 암시 적 변환을 수행하지 않습니다.