10.2. 운영자

연산자 표현식이 참조하는 특정 연산자는 다음 절차를 사용하여 결정됩니다. 이 절차는 관련된 연산자의 우선 순위에 의해 간접적으로 영향을 받습니다. 이는 어떤 하위 표현식이 어떤 연산자의 입력으로 사용되는지 결정하기 때문입니다. 참조섹션 4.1.6더 많은 정보를 원하시면.

운영자 유형 확인

  1. 다음에서 고려할 연산자를 선택하세요.pg_operator시스템 카탈로그. 스키마에 한정되지 않은 연산자 이름이 사용된 경우(일반적인 경우) 고려되는 연산자는 현재 검색 경로에 표시되는 일치하는 이름과 인수 개수를 가진 연산자입니다(참조섹션 5.9.3). 정규화된 배트맨 토토 이름이 제공된 경우 지정된 스키마의 배트맨 토토만 고려됩니다.

    1. 검색 경로가 동일한 인수 유형을 가진 여러 배트맨 토토를 찾으면 경로에서 가장 먼저 나타나는 배트맨 토토만 고려됩니다. 인수 유형이 다른 배트맨 토토는 검색 경로 위치에 관계없이 동등한 입장에서 간주됩니다.

  2. 입력 인수 유형을 정확하게 받아들이는 배트맨 토토를 확인하세요. 존재하는 경우(고려된 배트맨 토토 집합에 정확히 일치하는 항목은 하나만 있을 수 있음) 이를 사용합니다. 정확한 일치가 없으면 정규화된 이름을 통해 전화할 때 보안 위험이 발생합니다.[9](일반적이지 않음), 신뢰할 수 없는 사용자가 객체를 생성하도록 허용하는 스키마에 있는 모든 배트맨 토토입니다. 이러한 상황에서는 인수를 캐스팅하여 정확히 일치하도록 하세요.

    1. 이항 연산자 호출의 인수 중 하나가 다음인 경우알 수 없음유형인 경우 이 검사에 대한 다른 인수와 동일한 유형이라고 가정합니다. 두 가지를 포함하는 호출알 수 없음입력 또는 접두사 배트맨 토토(알 수 없음입력, 이 단계에서는 일치하는 항목을 찾을 수 없습니다.

    2. 이항 연산자 호출의 인수 중 하나가 다음인 경우알 수 없음유형이 있고 다른 하나는 도메인 유형인 경우, 다음으로 양쪽에서 도메인의 기본 유형을 정확히 받아들이는 연산자가 있는지 확인하십시오. 그렇다면 사용하세요.

  3. 가장 일치하는 항목을 찾으세요.

    1. 입력 유형이 일치하지 않고 일치하도록 변환(암시적 변환 사용)할 수 없는 후보 배트맨 토토를 폐기합니다.알 수 없음리터럴은 이 목적을 위해 무엇이든 변환할 수 있는 것으로 가정됩니다. 후보가 하나만 남아 있으면 해당 후보를 사용합니다. 그렇지 않으면 다음 단계로 진행하세요.

    2. 입력 인수가 도메인 유형인 경우 모든 후속 단계에서 이를 도메인의 기본 유형으로 취급합니다. 이렇게 하면 모호한 배트맨 토토 해결을 위해 도메인이 기본 유형처럼 작동합니다.

    3. 모든 후보를 살펴보고 입력 유형과 가장 정확하게 일치하는 후보를 유지하세요. 정확히 일치하는 후보가 없으면 모든 후보를 유지합니다. 후보가 하나만 남아 있으면 해당 후보를 사용합니다. 그렇지 않으면 다음 단계로 진행하세요.

    4. 모든 후보를 실행하고 선호하는 유형(입력 데이터 유형의 유형 범주)을 허용하는 유형을 유형 변환이 필요한 대부분의 위치에 유지하십시오. 선호하는 유형을 허용하는 후보가 없으면 모든 후보를 유지합니다. 후보가 하나만 남아 있으면 해당 후보를 사용합니다. 그렇지 않으면 다음 단계로 진행하세요.

    5. 입력 인수가 다음과 같은 경우알 수 없음, 나머지 후보가 해당 인수 위치에서 허용하는 유형 범주를 확인하십시오. 각 위치에서 다음을 선택하세요.문자열후보자가 해당 카테고리를 수락하는 경우 카테고리. (알 수 없는 유형의 리터럴이 문자열처럼 보이기 때문에 문자열에 대한 이러한 편향은 적절합니다.) 그렇지 않고 나머지 모든 후보가 동일한 유형 범주를 허용하는 경우 해당 범주를 선택하십시오. 그렇지 않으면 더 많은 단서 없이는 올바른 선택을 추론할 수 없기 때문에 실패합니다. 이제 선택한 유형 카테고리를 허용하지 않는 후보를 삭제하십시오. 또한 후보자가 해당 카테고리에서 선호하는 유형을 허용하는 경우 해당 인수에 대해 선호되지 않는 유형을 허용하는 후보자를 삭제하십시오. 이 테스트에서 살아남은 후보가 없으면 모든 후보를 유지하십시오. 후보가 하나만 남아 있으면 해당 후보를 사용합니다. 그렇지 않으면 다음 단계로 진행하세요.

    6. 둘 다 있는 경우알 수 없음및 알려진 유형의 인수와 모든 알려진 유형의 인수가 동일한 유형을 갖고 있다고 가정합니다.알 수 없음인수도 해당 유형이며, 어떤 후보자가 해당 유형을 받아들일 수 있는지 확인하세요.알 수 없음-인수 위치. 정확히 한 명의 후보자가 이 테스트를 통과하면 이를 사용하십시오. 그렇지 않으면 실패합니다.

몇 가지 예가 이어집니다.

예제 10.1. 제곱근 배트맨 토토 유형 해상도

제곱근 배트맨 토토는 하나만 있습니다(접두사|/)은 표준 카탈로그에 정의되어 있으며, 유형의 인수를 사용합니다.배정밀도. 스캐너는 초기 유형을 할당합니다.정수이 쿼리 표현식의 인수:

SELECT |/ 40 AS "40의 제곱근";
 40의 제곱근
------
 6.324555320336759
(1행)

그래서 파서는 피연산자에 대해 유형 변환을 수행하며 쿼리는 다음과 같습니다.

SELECT |/ CAST(40 AS 배정밀도) AS "40의 제곱근";

예제 10.2. 문자열 연결 연산자 유형 확인

문자열과 유사한 구문은 문자열 유형 작업 및 복잡한 확장 유형 작업에 사용됩니다. 유형이 지정되지 않은 문자열은 가능한 연산자 후보와 일치됩니다.

하나의 지정되지 않은 인수가 있는 예:

텍스트 'abc' 선택 || 'def' AS "텍스트 및 알 수 없음";

 텍스트가 있고 알 수 없음
------------------
 abcdef
(1행)

이 경우 파서는 수행하는 배트맨 토토가 있는지 확인합니다.텍스트두 인수 모두에 대해. 있기 때문에 두 번째 인수는 유형으로 해석되어야 한다고 가정합니다.텍스트.

다음은 지정되지 않은 유형의 두 값을 연결한 것입니다.

'abc' 선택 || 'def' AS "지정되지 않음";

 불특정
-------------
 abcdef
(1행)

이 경우에는 쿼리에 유형이 지정되지 않았기 때문에 사용할 유형에 대한 초기 힌트가 없습니다. 따라서 파서는 모든 후보 연산자를 찾고 문자열 범주 및 비트 문자열 범주 입력을 모두 허용하는 후보가 있음을 찾습니다. 사용 가능한 경우 문자열 카테고리가 선호되므로 해당 카테고리가 선택된 다음 문자열에 대해 선호되는 유형이 선택됩니다.텍스트은 알 수 없는 유형 리터럴을 해결하기 위한 특정 유형으로 사용됩니다.


예제 10.3. 절대값 및 부정 배트맨 토토 유형 확인

PostgreSQL배트맨 토토 카탈로그에는 접두사 배트맨 토토에 대한 여러 항목이 있습니다.@, 모두 다양한 숫자 데이터 유형에 대한 절대값 연산을 구현합니다. 다음 항목 중 하나는 유형에 대한 것입니다.float8는 숫자 카테고리에서 선호되는 유형입니다. 그러므로포스트그레SQL다음에 직면했을 때 해당 항목을 사용합니다알 수 없음입력:

SELECT @ '-4.5' AS "abs";
 복근
-----
 4.5
(1행)

여기서 시스템은 알 수 없는 유형 리터럴을 유형으로 암시적으로 해결했습니다.float8선택한 배트맨 토토를 적용하기 전. 우리는 그것을 확인할 수 있습니다float8그리고 다른 유형은 사용되지 않았습니다:

SELECT @ '-4.5e500' AS "abs";

오류: "-4.5e500"이 배정밀도 유형의 범위를 벗어났습니다.

반면에 접두사 배트맨 토토~(비트 부정)은 정수 데이터 유형에 대해서만 정의되며float8. 따라서 비슷한 사례를 시도하면~, 우리는 다음을 얻습니다:

SELECT ~ '20' AS "부정";

오류: 연산자가 고유하지 않습니다. ~ "알 수 없음"
힌트: 가장 적합한 후보 연산자를 선택할 수 없습니다. 추가해야 할 수도 있습니다.
명시적인 유형 캐스팅.

이는 시스템이 가능한 여러 가지 중 어느 것을 결정할 수 없기 때문에 발생합니다.~배트맨 토토를 선호해야 합니다. 명시적인 캐스트를 통해 도움을 드릴 수 있습니다.

SELECT ~ CAST('20' AS int8) AS "부정";

 부정
----------
      -21
(1행)

예 10.4. 배열 포함 배트맨 토토 유형 확인

다음은 하나의 알려진 입력과 하나의 알려지지 않은 입력으로 연산자를 해결하는 또 다른 예입니다:

배열[1,2] <@ '1,2,3'을 "하위 집합"으로 선택;

 부분 집합입니다
-----------
 티
(1행)

PostgreSQL배트맨 토토 카탈로그에는 중위 배트맨 토토에 대한 여러 항목이 있습니다<@, 그러나 왼쪽에 정수 배열을 허용할 수 있는 유일한 두 가지는 배열 포함(임의배열 <@ 임의배열) 및 범위 포함(모든 요소 <@ anyrange). 이러한 다형성 의사 유형은 하나도 없기 때문에(참조토토 꽁 머니 PostgreSQL : 문서 : 14 : 8.21. 의사 유형)이 선호되는 것으로 간주되므로 파서는 이를 기반으로 모호성을 해결할 수 없습니다. 그러나3단계.f알 수 없는 유형 리터럴이 다른 입력, 즉 정수 배열과 동일한 유형이라고 가정하도록 지시합니다. 이제 두 연산자 중 하나만 일치할 수 있으므로 배열 포함이 선택됩니다. (범위 포함을 선택했다면 문자열이 범위 리터럴이 되기에 적합한 형식이 아니기 때문에 오류가 발생했을 것입니다.)


예제 10.5. 도메인 유형의 사용자 정의 배트맨 토토

사용자는 때때로 도메인 유형에만 적용되는 배트맨 토토를 선언하려고 시도합니다. 이는 가능하지만 보기만큼 유용하지는 않습니다. 왜냐하면 배트맨 토토 해결 규칙은 도메인의 기본 유형에 적용되는 배트맨 토토를 선택하도록 설계되었기 때문입니다. 예를 들어 고려하십시오.

DOMAIN mytext를 텍스트 CHECK(...)로 생성;
CREATE FUNCTION mytext_eq_text (mytext, text) RETURNS 부울 AS ...;
CREATE OPERATOR = (절차=mytext_eq_text, leftarg=mytext, rightarg=text);
CREATE TABLE mytable(val mytext);

SELECT * FROM mytable WHERE val = 'foo';

이 쿼리는 사용자 정의 연산자를 사용하지 않습니다. 파서는 먼저 다음이 있는지 확인합니다.mytext = mytext배트맨 토토 (2단계.a), 존재하지 않습니다. 그런 다음 도메인의 기본 유형을 고려합니다.텍스트, 그리고 a가 있는지 확인하세요.텍스트 = 텍스트배트맨 토토 (2단계.b)이 있습니다. 그래서 그것은 해결됩니다.알 수 없음-다음과 같은 리터럴 유형텍스트그리고 다음을 사용합니다텍스트 = 텍스트배트맨 토토. 사용자 정의 배트맨 토토를 사용하는 유일한 방법은 리터럴을 명시적으로 캐스팅하는 것입니다.

SELECT * FROM mytable WHERE val = 텍스트 'foo';

그래서mytext = 텍스트배트맨 토토는 정확히 일치 규칙에 따라 즉시 검색됩니다. 최적 일치 규칙에 도달하면 도메인 유형에 따라 운영자를 적극적으로 차별합니다. 그렇지 않은 경우 그러한 배트맨 토토는 너무 많은 모호한 배트맨 토토 실패를 생성할 것입니다. 왜냐하면 형변환 규칙은 항상 도메인을 기본 유형으로 또는 기본 유형에서 형변환 가능한 것으로 간주하고 도메인 배트맨 토토는 기본 유형의 비슷한 이름의 배트맨 토토와 동일한 경우에 모두 사용 가능한 것으로 간주되기 때문입니다.




[9]신뢰할 수 없는 사용자가 객체를 생성하도록 허용하는 스키마를 포함하는 검색 경로는 스키마가 아닌 이름으로 위험이 발생하지 않습니다.보안 스키마 사용 패턴.

수정 사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.