연산자가 참조하는 특정 연산자 표현은 다음 절차를 사용하여 결정됩니다. 주목하십시오 이 절차는 연산자는 어떤 하위 표현을 결정할 것입니다 연산자의 입력으로 간주됩니다. 보다섹션 4.1.6더 많은 정보.
운영자 유형 해상도
에서 고려할 토토 결과를 선택하십시오pg_operator
시스템 카탈로그. 경우 a
비 스키마 자격이없는 연산자 이름이 사용되었습니다 (일반적인 경우)
고려 된 운영자는 일치하는 이름과 인수를 가진 사람들입니다.
현재 검색 경로에서 볼 수있는 카운트 (참조섹션 5.7.3). 경우 a
자격을 갖춘 운영자 이름이 주어졌으며 지정된 토토 결과 만
스키마가 고려됩니다.
검색 경로가 동일하게 여러 토토 결과를 찾는 경우 인수 유형은 길에서 가장 오래된 것만 존경받는. 인수 유형이 다른 토토 결과가 고려됩니다 검색 경로 위치에 관계없이 동일한 기반에.
입력 인수를 정확히 수락하는 토토 결과를 확인하십시오 유형. 하나가 존재하는 경우 (세트에 정확히 일치 할 수 있습니다. 고려한 토토 결과), 사용하십시오. 정확히 일치가 부족합니다 자격있는 이름을 통해 전화시 보안 위험[1](아님 일반), 신뢰할 수없는 스키마에서 발견 된 모든 토토 결과 사용자는 객체를 만듭니다. 그러한 상황에서, 논쟁을 던져 정확한 일치를 강요하십시오.
최고의 경기를 찾으십시오.
입력 유형이없는 후보 토토 결과 폐기 일치하며 (암시 적 변환 사용) 변환 할 수 없습니다. 성냥.알 수없는리터럴이 가정됩니다 이 목적을 위해 무엇이든 전환 할 수 있습니다. 한 후보자 만 있다면 남아 있습니다. 그렇지 않으면 다음 단계로 계속됩니다.
입력 인수가 도메인 유형 인 경우 모든 후속 단계에 대한 도메인의 기본 유형. 이것은 그것을 보장합니다 도메인은 목적을 위해 기본 유형처럼 작용합니다 모호한 작동자 해상도.
모든 후보자를 통해 실행하여 가장 정확한 후보자를 유지하십시오. 입력 유형에서 일치합니다. 정확히없는 경우 모든 후보자를 유지하십시오 성냥. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 계속 다음 단계.
모든 후보자를 통해 선호하는 후보자를 유지하십시오. 입력 데이터 유형의 유형 카테고리의 유형 유형 변환이 필요한 위치. 모든 것을 유지하십시오 후보자가 선호하는 유형을 허용하지 않으면 후보자. 한 후보자 만 있다면 남아 있습니다. 그렇지 않으면 다음 단계로 계속됩니다.
입력 인수가있는 경우알 수없는, 확인 해당 인수 위치에서 수용된 유형 범주는 남은 후보자. 각 위치에서를 선택하십시오.String카테고리 후보자가 해당 범주를 수락하는 경우. (문자열에 대한이 편견은 알려지지 않은 유형 이후로 적절합니다 문자 그럴은 문자열처럼 보입니다.) 그렇지 않으면 나머지는 모두 응시자는 동일한 유형 범주를 수락하고 해당 범주를 선택하십시오. 그렇지 않으면 올바른 선택은없이 추론 할 수 없기 때문에 실패합니다. 더 많은 단서. 이제 선택된 것을 수락하지 않는 후보자를 버립니다 유형 카테고리. 또한 후보자가 선호하는 경우 해당 카테고리를 입력하고 선호되지 않은 수락 된 후보자를 버립니다 그 주장에 대한 유형. 아무도 살아남지 못하면 모든 후보자를 유지하십시오 테스트. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 계속 다음 단계.
둘 다있는 경우알 수없는및 알려진 유형 인수와 모든 알려진 유형의 인수는 동일한 유형을 가지고 있습니다. 가정알 수없는15445_15536알 수없는-경사 위치. 정확히 하나라면 후보자는이 테스트를 통과하여 사용합니다. 그렇지 않으면 실패합니다.
일부 예제가 따릅니다.
예 10-1. 요인 운영자 유형 해상도
Factorial Operator는 하나뿐입니다 (Postfix!) 표준 카탈로그에 정의되어 있으며 유형의 주장bigint. 스캐너가 할당됩니다 초기 유형Integer인수에 이 쿼리 표현 :
40을 선택하십시오! "40 Factorial"으로서; 40 FACTORION --------------------------------------------------------- 815915283247897734345611269596115894272000000000 (1 행)
따라서 파서는 피연산자와 쿼리는 다음과 같습니다.
Cast (40 AS Bigint)를 선택하십시오! "40 Factorial";
예 10-2. 문자열 연결 토토 결과 유형 해결
문자열과 같은 구문은 문자열 유형으로 작업하는 데 사용됩니다. 복잡한 확장 유형으로 작업합니다. 지정되지 않은 줄 유형은 가능한 운영자 후보와 일치합니다.
하나의 지정되지 않은 인수가있는 예 :
텍스트 'ABC'||를 선택하십시오 '텍스트와 알 수없는'으로 'def'; 텍스트와 알 수없는 ----------------- ABCDEF (1 행)
이 경우 파서는 운영자가 있는지 확인합니다. 취득텍스트두 인수 모두. 거기 이후 두 번째 주장은 다음으로 해석되어야한다고 가정합니다. 유형텍스트.
여기에 지정되지 않은 유형의 두 가지 값에 대한 연결이 있습니다.
'ABC'||를 선택하십시오 "지정되지 않은"로서의 'def'; 지정되지 않은 ------------- ABCDEF (1 행)
이 경우 사용 할 유형의 초기 힌트가 없습니다. 쿼리에 유형이 지정되지 않기 때문입니다. 따라서 파서는 찾습니다 모든 후보 운영자와 후보자가 있음을 알게됩니다 문자열 카테고리 및 비트 스트링 카테고리 입력을 모두 수락합니다. 사용 가능한 경우 문자열 카테고리가 선호되므로 해당 범주는 선택한 다음 문자열에 선호되는 유형,텍스트, 해결하기위한 특정 유형으로 사용됩니다. 알 수없는 유형의 리터럴 as.
예 10-3. 절대 가치 및 부정 토토 결과 유형 해결
thePostgreSQL운영자 카탈로그 접두사 토토 결과에 대한 몇 가지 항목이 있습니다@, 모두 절대 값 작동을 구현합니다 다양한 숫자 데이터 유형의 경우. 이 항목 중 하나는 유형입니다float8, 이는 숫자 카테고리. 그러므로,PostgreSQL직면 할 때 해당 항목을 사용합니다알 수없는입력 :
@ '-4.5'를 "ABS"로 선택합니다. ABS ----- 4.5 (1 행)
여기서 시스템은 미지의 문자를 암시 적으로 해결했습니다 as typefloat8선택한 것을 적용하기 전에 토토 결과. 우리는 그것을 확인할 수 있습니다float8다른 유형이 사용되었습니다.
"abs"로 @ '-4.5e500'을 선택하십시오. 오류 : "-4.5e500"은 유형 이중 정밀도의 범위를 벗어났습니다
반면에, 접두사 토토 결과~(Bitwise Negation)는 정수에 대해서만 정의됩니다 데이터 유형,float8. 그래서 우리가 시도하면 와 유사한 사례~, 우리는 다음을 얻습니다 :
"부정"으로 ~ '20'을 선택합니다. 오류 : 운영자는 고유하지 않습니다 : ~ "알 수 없음" 힌트 : 최고의 후보 운영자를 선택할 수 없었습니다. 추가해야 할 수도 있습니다 명시 적 유형 캐스트.
이것은 시스템이 어느 쪽을 결정할 수 없기 때문에 발생합니다. 몇 가지 가능한~운영자가 있어야합니다 우선의. 우리는 명시적인 캐스트로 그것을 도울 수 있습니다 :
선택 ~ cast ('20 'As int8)로 "부정"; 부정 --------- -21 (1 행)
예 10-4. 배열 포함 작업자 유형 해결
알려진 한 사람으로 운영자를 해결하는 또 다른 예가 있습니다. 그리고 하나의 알려지지 않은 입력 :
배열 선택 [1,2] <@ '1,2,3'as "Is Subset"; 서브 세트입니다 ---------- 티 (1 행)
thePostgreSQL운영자 카탈로그 Infix 토토 결과에 대한 몇 가지 항목이 있습니다<@그러나 허용 할 수있는 유일한 두 가지 왼쪽의 정수 배열은 배열 포함입니다. (AnyArray <@ AnyArray) 및 범위 포함 (Anylement <@ AnyRange). 이들 다형성 의사 유형 중 어느 것도 없기 때문이다 (보다토토 사이트 순위 PostgreSQL : 문서 : 9.3 : Pseudo-types) 선호되는 것으로 간주되는 파서는 모호성을 해결할 수 없습니다 그 기초. 하지만,3.F알 수없는 유형의 문자가 같은 유형이라고 가정합니다. 다른 입력, 즉 정수 배열. 이제 둘 중 하나뿐입니다 작업자가 일치 할 수 있으므로 배열 포함이 선택됩니다. (범위가있었습니다 포함이 선택되었고, 우리는 오류가 발생했을 것입니다. 문자열은 범위 문자가 될 수있는 올바른 형식이 없습니다.)
예 10-5. 도메인 유형의 사용자 정의 토토 결과
사용자는 때때로 운영자가 도메인 유형. 이것은 가능하지만 거의 유용하지 않습니다. 운영자 해상도 규칙이 도메인의 기본 유형에 적용하는 토토 결과를 선택하십시오. 예로 고려하다
텍스트 check (...)로 도메인 mytext 만들기; 함수 생성 mytext_eq_text (mytext, text)는 boolean을 다시 ...; create operator = (procedure = mytext_eq_text, leftarg = mytext, rightarg = text); MyTable 테이블 작성 (Val MyText); mytable에서 * val = 'foo';에서 선택하십시오.
이 쿼리는 사용자 정의 토토 결과를 사용하지 않습니다. 파서는 할 것입니다 먼저가 있는지 확인하십시오.MyText = MyText토토 결과 (2.A) 없습니다. 그러면 도메인의 기본 유형을 고려할 것입니다텍스트텍스트 = 텍스트토토 결과 (2.B) 거기가있다; 그래서 그것은를 해결합니다알 수없는-타입 문자로서텍스트텍스트 = 텍스트운영자. 사용자 정의 토토 결과를 얻는 유일한 방법 사용되는 것은 명시 적으로 문자를 캐스팅하는 것입니다 :
선택 *에서 mytable에서 val = text 'foo';
그래서MyText = 텍스트운영자가 발견되었습니다 정확한 일치 규칙에 따라 즉시. 최고의 경기 인 경우 규칙에 도달하면 운영자를 적극적으로 차별합니다 도메인 유형. 그들이하지 않았다면, 그러한 운영자도 캐스팅 규칙이 항상 있기 때문에 많은 모호한 작동자가 실패합니다 도메인을 기본 유형에 또는 도메인 운영자는 기본 유형의 비슷한 이름을 지정합니다.
[1] |
위험이 비 스키마 자격이없는 이름으로 발생하지 않습니다. 신뢰할 수없는 스키마를 포함하는 검색 경로 객체를 만드는 사용자는보안 스키마 사용 무늬. |