운영자 표현식에 의해 참조되는 특정 토토는 다음 절차를 사용하여 결정됩니다. 이 절차는 관련 토토의 우선 순위에 의해 간접적으로 영향을 받는다. 보다섹션 4.1.6자세한 내용은
운영자 토토 해상도
pg_operator
시스템 카탈로그. 비 스키마 자격이없는 토토 이름이 사용 된 경우 (일반적인 경우), 고려 된 토토는 현재 검색 경로에서 볼 수있는 일치 이름 및 인수 수를 가진 사람입니다 (참조섹션 5.9.3). 자격을 갖춘 토토 이름이 제공되면 지정된 스키마의 토토 만 고려됩니다.
검색 경로가 동일한 인수 유형을 가진 여러 토토를 찾으면 경로에서 가장 오래된 것으로 보이는 것만으로 간주됩니다. 인수 유형이 다른 토토는 검색 경로 위치에 관계없이 동일한 기반에서 고려됩니다.
입력 인수 유형을 정확히 수락하는 토토를 확인하십시오. 하나가 존재하는 경우 (고려 된 토토 세트에는 정확히 일치하는 경우) 사용하십시오. 정확히 일치가 부족하여 자격을 갖춘 이름을 통해 호출 할 때 보안 위험이 발생합니다.[8](일반적이 아님), 신뢰할 수없는 사용자가 객체를 생성 할 수있는 스키마에서 발견 된 모든 토토. 그러한 상황에서, 정확한 일치를 강요하기 위해 논쟁을 시전합니다.
이진 토토 호출의 하나의 인수가 인 경우알 수없는
토토은이 점검의 다른 인수와 같은 토토이라고 가정합니다. 두 가지 관련 호출알 수없는
입력 또는 an을 가진 단시 토토알 수없는
입력,이 단계에서 일치를 찾지 못할 것입니다.
이진 토토 호출의 하나의 인수가 인 경우알 수없는
토토과 다른 하나는 도메인 토토이며, 다음은 도메인의 기본 토토을 정확히 수락하는 운영자가 있는지 확인합니다. 그렇다면 사용하십시오.
최고의 경기를 찾으십시오.
입력 유형이 일치하지 않고 일치하도록 암시 적 변환을 사용하여 변환 할 수없는 후보 토토 폐기.알 수없는
리터럴은이 목적을 위해 무엇이든 전환 할 수 있다고 가정합니다. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 다음 단계로 계속됩니다.
입력 인수가 도메인 토토 인 경우 모든 후속 단계에 대해 도메인의 기본 토토으로 취급하십시오. 이를 통해 도메인은 모호한 운영자 해상도를 위해 기본 토토처럼 작용하도록합니다.
모든 후보자를 통해 실행하여 입력 토토에서 가장 정확한 일치를 유지합니다. 정확히 일치하는 경우 모든 후보자를 유지하십시오. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 다음 단계로 계속됩니다.
모든 후보자를 통해 실행하고 토토 변환이 필요한 대부분의 위치에 선호되는 토토 (입력 데이터 토토 토토 범주)을 수락 한 후보를 유지하십시오. 선호하는 토토을 허용하지 않으면 모든 후보자를 유지하십시오. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 다음 단계로 계속됩니다.
입력 인수가있는 경우알 수없는
, 나머지 후보자가 해당 인수 위치에서 수락 한 토토 범주를 확인하십시오. 각 위치에서를 선택하십시오.String
카테고리 후보자가 해당 범주를 수락하는 경우. (문자열에 대한이 편견은 알려지지 않은 문자 문자가 문자열처럼 보이기 때문에 적절합니다.) 그렇지 않으면, 나머지 후보가 모두 동일한 토토 범주를 수락하는 경우 해당 범주를 선택하십시오. 그렇지 않으면 더 이상의 단서없이 올바른 선택을 추론 할 수 없기 때문에 실패합니다. 이제 선택한 토토 카테고리를 수락하지 않는 후보자를 폐기하십시오. 또한 후보자가 해당 범주에서 선호하는 토토을 수락하는 경우 해당 주장에 대해 선호되지 않은 토토을 수락하는 후보자를 버립니다. 이 테스트에서 살아남지 못하면 모든 후보자를 유지하십시오. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 다음 단계로 계속됩니다.
둘 다있는 경우알 수없는
및 알려진 토토의 인수, 그리고 알려진 모든 토토의 인수는 동일한 토토을 가지고 있다고 가정합니다.알 수없는
인수는 또한 그 토토이며, 어떤 후보자가 어떤 후보자가 그 토토을 수락 할 수 있는지 확인합니다알 수없는
-경사 위치. 정확히 한 후보자 가이 테스트를 통과하면 사용하십시오. 그렇지 않으면 실패합니다.
일부 예제가 따릅니다.
예 10.1. 제곱근 토토 유형 해상도
제곱 루트 토토가 하나만 있습니다 (Prefix|/
) 표준 카탈로그에 정의 된 토토의 주장이중 정밀
. 스캐너는 초기 토토의를 할당합니다.Integer
이 쿼리 표현식의 인수 :
선택 |/ 40으로 "40의 제곱근"; 40의 제곱근 -------------------- 6.324555320336759 (1 행)
따라서 파서는 피토토에서 유형 변환을 수행하고 쿼리는 다음과 같습니다.
선택 |/ 캐스트 (40은 이중 정밀도) "40의 제곱근";
예 10.2. 문자열 연결 토토 유형 해상도
문자열과 같은 구문은 문자열 토토으로 작업하고 복잡한 확장 토토으로 작업하는 데 사용됩니다. 지정되지 않은 토토을 가진 문자열은 가능한 작업자 후보와 일치합니다.
하나의 지정되지 않은 인수가있는 예 :
텍스트 'ABC'||를 선택하십시오 '텍스트와 알 수없는'으로 'def'; 텍스트와 알 수없는 ----------------- ABCDEF (1 행)
이 경우 파서는 운영자가 복용하는지 확인하려고합니다텍스트
두 인수 모두. 두 번째 인수는 토토으로 해석되어야한다고 가정합니다.텍스트
.
여기에 지정되지 않은 토토의 두 가지 값에 대한 연결이 있습니다.
'ABC'||를 선택하십시오 "지정되지 않은"로서의 'def'; 지정되지 않은 ------------- ABCDEF (1 행)
이 경우 쿼리에 유형이 지정되지 않기 때문에 사용할 초기 힌트가 없습니다. 따라서 Parser는 모든 후보 운영자를 찾고 String-Category 및 Bit-String-Category 입력을 모두 수락하는 후보자가 있음을 알게됩니다. 사용 가능한 경우 문자열 카테고리가 선호되므로 해당 범주가 선택되고 문자열의 선호 유형텍스트
, 미지의 토토 리터럴을 해결하기 위해 특정 토토으로 사용됩니다.
예 10.3. 절대 가치 및 부정 토토 유형 해상도
thePostgreSQL운영자 카탈로그는 접두사 토토에 대한 여러 항목이 있습니다@
, 모두 다양한 숫자 데이터 토토에 대한 절대 값 작동을 구현합니다. 이 항목 중 하나는 토토입니다float8
, 숫자 범주에서 선호되는 토토입니다. 그러므로,postgresql|알 수없는
입력 :
@ '-4.5'를 "ABS"로 선택합니다. ABS ----- 4.5 (1 행)
여기서 시스템은 미지의 문자를 토토으로 암시 적으로 해결했습니다float8
선택한 토토를 적용하기 전에. 우리는 그것을 확인할 수 있습니다float8
다른 토토이 사용되지 않았습니다.
@ '-4.5e500'을 "ABS"로 선택합니다. 오류 : "-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 : 문서 : 13 : 8.21. 의사 유형) 선호되는 것으로 간주되며, 파서는 그 근거로 모호성을 해결할 수 없습니다. 하지만,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';에서 선택하십시오.
이 쿼리는 사용자 정의 토토를 사용하지 않습니다. 파서는 먼저 A가 있는지 확인합니다.mytext
=
MyText
토토 (2.A), 그렇지 않은; 그러면 도메인의 기본 토토을 고려할 것입니다텍스트
텍스트
=
텍스트
토토 (2.B); 그래서 그것은를 해결합니다알 수없는
-타입 문자 AS텍스트
텍스트
=
텍스트
운영자. 사용자 정의 토토를 사용하도록하는 유일한 방법은 명시 적으로 문자를 캐스팅하는 것입니다.
선택 *에서 mytable에서 val = text 'foo';
그래서MyText
=
텍스트
토토는 정확한 일치 규칙에 따라 즉시 발견됩니다. 최상의 일치 규칙에 도달하면 도메인 유형의 토토를 적극적으로 차별합니다. 그렇지 않은 경우, 캐스팅 규칙은 항상 도메인을 기본 유형에 따라 또는 기본 유형에서 캐스팅 할 수있는 것으로 간주하므로 도메인 토토는 기본 유형에서 유사하게 이름이 지정된 운영자와 동일한 사례에서 사용할 수있는 것으로 간주되기 때문에 그러한 토토는 너무 많은 모호한 운영자 실패를 생성 할 것입니다..
[8]신뢰할 수없는 사용자가 객체를 생성 할 수 있도록하는 스키마를 포함하는 검색 경로는이 아니기 때문에 위험은 스키마 자격이없는 이름으로 발생하지 않습니다.보안 스키마 사용 패턴.
문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면