함수 호출에 의해 참조되는 특정 함수는 다음 절차를 사용하여 결정됩니다.
토토 사이트 유형 확인
다음에서 고려할 기능을 선택하세요.pg_proc시스템 카탈로그. 스키마에 한정되지 않은 함수 이름이 사용된 경우 고려되는 함수는 현재 검색 경로에 표시되는 일치하는 이름 및 인수 개수를 가진 함수입니다(참조섹션 5.8.3). 정규화된 토토 사이트 이름이 제공된 경우 지정된 스키마의 토토 사이트만 고려됩니다.
검색 경로가 동일한 인수 유형의 여러 토토 사이트를 발견하면 경로에서 가장 먼저 나타나는 토토 사이트만 고려됩니다. 서로 다른 인수 유형의 토토 사이트는 검색 경로 위치에 관계없이 동등한 입장에서 고려됩니다.
함수가 다음과 같이 선언된 경우VARIADIC배열 매개변수이며 호출은VARIADIC키워드인 경우 토토 사이트는 호출과 일치하기 위해 필요에 따라 배열 매개변수가 해당 요소 유형의 하나 이상의 항목으로 대체된 것처럼 처리됩니다. 이러한 확장 후에 토토 사이트는 일부 비 가변 토토 사이트와 동일한 유효한 인수 유형을 가질 수 있습니다. 이 경우 검색 경로의 앞부분에 나타나는 토토 사이트가 사용되거나 두 토토 사이트가 동일한 스키마에 있는 경우 가변적이지 않은 토토 사이트가 선호됩니다.
이것은 정규화된 이름을 통해 호출할 때 보안 위험을 야기합니다.[9], 신뢰할 수 없는 사용자가 객체를 생성하도록 허용하는 스키마에 있는 가변 함수입니다. 악의적인 사용자는 마치 사용자가 실행한 것처럼 임의의 SQL 기능을 제어하고 실행할 수 있습니다. 다음이 포함된 통화로 대체합니다.VARIADIC이 위험을 우회하는 키워드입니다. 전화 연결 중VARIADIC "모든"매개변수에는 종종 다음을 포함하는 동등한 공식이 없습니다.VARIADIC키워드. 이러한 호출을 안전하게 실행하려면 토토 사이트의 스키마에서 신뢰할 수 있는 사용자만 객체를 생성하도록 허용해야 합니다.
매개변수에 대한 기본값이 있는 토토 사이트는 0개 이상의 기본 매개변수 위치를 생략하는 모든 호출과 일치하는 것으로 간주됩니다. 호출과 일치하는 토토 사이트가 둘 이상인 경우 검색 경로에서 가장 먼저 나타나는 토토 사이트가 사용됩니다. 기본값이 아닌 위치에 동일한 매개변수 유형을 가진 동일한 스키마에 두 개 이상의 토토 사이트가 있는 경우(기본 설정 가능한 매개변수의 다른 집합이 있는 경우 가능함) 시스템은 어느 것을 선호할지 결정할 수 없습니다.“모호한 토토 사이트 호출”호출과 더 일치하는 항목을 찾을 수 없으면 오류가 발생합니다.
이것은 정규화된 이름을 통해 전화할 때 가용성 위험을 만듭니다[9], 신뢰할 수 없는 사용자가 객체를 생성하도록 허용하는 스키마에 있는 모든 토토 사이트입니다. 악의적인 사용자는 기존 토토 사이트의 이름으로 토토 사이트를 생성하여 해당 토토 사이트의 매개변수를 복제하고 기본값을 갖는 새로운 매개변수를 추가할 수 있습니다. 이로 인해 원래 토토 사이트에 대한 새로운 호출이 불가능해졌습니다. 이러한 위험을 방지하려면 신뢰할 수 있는 사용자만 객체를 생성하도록 허용하는 토토 사이트를 스키마에 배치하세요.
입력 인수 유형을 정확하게 받아들이는 토토 사이트를 확인하세요. 존재하는 경우(고려된 토토 사이트 세트에서 정확히 일치하는 항목은 하나만 있을 수 있음) 이를 사용하십시오. 정확한 일치가 없으면 정규화된 이름을 통해 전화할 때 보안 위험이 발생합니다.[9], 신뢰할 수 없는 사용자가 객체를 생성하도록 허용하는 스키마에 있는 토토 사이트입니다. 이러한 상황에서는 인수를 캐스팅하여 정확히 일치하도록 합니다. (관련 사례알 수 없음이 단계에서는 일치하는 항목을 찾을 수 없습니다.)
완전히 일치하는 항목이 없으면 함수 호출이 특수 유형 변환 요청으로 나타나는지 확인하십시오. 이는 함수 호출에 인수가 하나만 있고 함수 이름이 일부 데이터 유형의 (내부) 이름과 동일한 경우에 발생합니다. 또한 함수 인수는 알 수 없는 유형 리터럴이거나 명명된 데이터 유형으로 이진 강제 변환 가능한 유형이거나 해당 유형의 I/O 함수를 적용하여 명명된 데이터 유형으로 변환될 수 있는 유형이어야 합니다(즉, 표준 문자열 유형 중 하나로 변환되거나 표준 문자열 유형 중 하나로 변환됩니다). 이러한 조건이 충족되면 함수 호출은 다음 형식으로 처리됩니다.캐스트사양.[10]
가장 일치하는 항목을 찾으십시오.
입력 유형이 일치하지 않고 일치하도록 변환(암시적 변환 사용)할 수 없는 후보 토토 사이트를 삭제합니다.알 수 없음리터럴은 이 목적을 위해 무엇이든 변환할 수 있는 것으로 가정됩니다. 후보가 하나만 남아 있으면 해당 후보를 사용하십시오. 그렇지 않으면 다음 단계로 진행하세요.
입력 인수가 도메인 유형인 경우 모든 후속 단계에서 이를 도메인의 기본 유형으로 취급합니다. 이렇게 하면 모호한 토토 사이트 해결을 위해 도메인이 기본 유형처럼 작동합니다.
모든 후보를 살펴보고 입력 유형과 가장 정확하게 일치하는 후보를 유지하세요. 정확히 일치하는 후보가 없으면 모든 후보를 유지합니다. 후보가 하나만 남아 있으면 해당 후보를 사용하십시오. 그렇지 않으면 다음 단계로 진행하세요.
모든 후보를 실행하고 선호하는 유형(입력 데이터 유형의 유형 범주 중)을 허용하는 유형을 유형 변환이 필요한 대부분의 위치에 유지하십시오. 선호하는 유형을 허용하는 후보가 없으면 모든 후보를 유지합니다. 후보가 하나만 남아 있으면 해당 후보를 사용하십시오. 그렇지 않으면 다음 단계로 진행하세요.
입력 인수가 다음과 같은 경우알 수 없음, 나머지 후보가 해당 인수 위치에서 허용하는 유형 범주를 확인하십시오. 각 위치에서 다음을 선택하세요.문자열후보자가 해당 카테고리를 수락하는 경우 카테고리. (알 수 없는 유형의 리터럴이 문자열처럼 보이기 때문에 문자열에 대한 이러한 편향은 적절합니다.) 그렇지 않고 나머지 모든 후보가 동일한 유형 범주를 허용하는 경우 해당 범주를 선택하십시오. 그렇지 않으면 더 많은 단서 없이는 올바른 선택을 추론할 수 없기 때문에 실패합니다. 이제 선택한 유형 카테고리를 허용하지 않는 후보를 삭제하십시오. 또한 후보자가 해당 카테고리에서 선호하는 유형을 허용하는 경우 해당 인수에 대해 선호되지 않는 유형을 허용하는 후보자를 삭제하십시오. 이 테스트에서 살아남은 후보가 없으면 모든 후보를 유지합니다. 후보가 하나만 남아 있으면 해당 후보를 사용합니다. 그렇지 않으면 다음 단계로 진행하세요.
둘 다 있는 경우알 수 없음및 알려진 유형의 인수와 모든 알려진 유형의 인수가 동일한 유형을 가지고 있다고 가정합니다.알 수 없음인수도 해당 유형이며, 어떤 후보자가 해당 유형을 받아들일 수 있는지 확인하세요.알 수 없음-인수 위치. 정확히 한 명의 후보자가 이 테스트를 통과하면 이를 사용하십시오. 그렇지 않으면 실패합니다.
참고하세요“가장 일치하는 항목”규칙은 연산자 및 토토 사이트 유형 확인에 대해 동일합니다. 다음은 몇 가지 예입니다.
예제 10.6. 반올림 토토 사이트 인수 유형 해결
단 하나뿐입니다라운드두 개의 인수를 취하는 토토 사이트; 유형의 첫 번째 인수를 취합니다.숫자및 유형의 두 번째 인수정수. 따라서 다음 쿼리는 유형의 첫 번째 인수를 자동으로 변환합니다.정수에숫자:
SELECT 라운드(4, 4); 둥근 -------- 4.0000 (1행)
해당 쿼리는 실제로 파서에 의해 다음과 같이 변환됩니다.
SELECT round(CAST (4 AS 숫자), 4);
소수점이 있는 숫자 상수는 처음에 유형이 할당되었기 때문에숫자, 다음 쿼리는 유형 변환이 필요하지 않으므로 약간 더 효율적일 수 있습니다.
라운드 선택(4.0, 4);
예 10.7. 가변 토토 사이트 분해능
CREATE FUNCTION public.variadic_example(VARIADIC 숫자[]) RETURNS int LANGUAGE sql AS 'SELECT 1'; 함수 생성
이 함수는 VARIADIC 키워드를 허용하지만 필수는 아닙니다. 정수 및 숫자 인수를 모두 허용합니다.
SELECT public.variadic_example(0),
public.variadic_example(0.0),
public.variadic_example(VARIADIC 배열[0.0]);
가변_예제 | 가변_예제 | 가변_예제
------+---------+------
1 | 1 | 1
(1행)
그러나 첫 번째와 두 번째 호출은 가능한 경우 더 구체적인 토토 사이트을 선호합니다.
함수 생성 public.variadic_example(numeric) RETURNS int
LANGUAGE sql AS 'SELECT 2';
함수 생성
함수 생성 public.variadic_example(int) 반환 int
LANGUAGE sql AS 'SELECT 3';
함수 생성
SELECT public.variadic_example(0),
public.variadic_example(0.0),
public.variadic_example(VARIADIC 배열[0.0]);
가변_예제 | 가변_예제 | 가변_예제
------+---------+------
3 | 2 | 1
(1행)
기본 구성과 첫 번째 토토 사이트만 존재하는 경우 첫 번째와 두 번째 호출은 안전하지 않습니다. 모든 사용자는 두 번째 또는 세 번째 토토 사이트을 생성하여 이를 가로챌 수 있습니다. 인수 유형을 정확하게 일치시키고VARIADIC키워드, 세 번째 호출은 안전합니다.
예제 10.8. 하위 문자열 토토 사이트 유형 확인
몇 가지가 있습니다substr토토 사이트, 그 중 하나는 유형을 취함텍스트그리고정수. 지정되지 않은 유형의 문자열 상수로 호출되면 시스템은 선호하는 카테고리의 인수를 허용하는 후보 함수를 선택합니다.문자열(즉, 유형텍스트).
SELECT substr('1234', 3);
하위 문자열
--------
34
(1행)
문자열이 유형으로 선언된 경우varchar, 테이블에서 오는 경우와 마찬가지로 파서는 이를 다음과 같이 변환하려고 시도합니다.텍스트:
SELECT substr(varchar '1234', 3);
하위 문자열
--------
34
(1행)
이것은 파서에 의해 효과적으로 변환됩니다:
SELECT substr(CAST (varchar '1234' AS text), 3);
파서는 다음에서 학습합니다.pg_cast카탈로그를 작성하세요텍스트그리고varchar은 바이너리 호환 가능합니다. 즉, 물리적 변환을 수행하지 않고도 하나를 다른 하나를 허용하는 토토 사이트에 전달할 수 있습니다. 따라서 이 경우에는 실제로 유형 변환 호출이 삽입되지 않습니다.
그리고 함수가 다음 유형의 인수로 호출되는 경우정수, 파서는 이를 다음으로 변환하려고 시도합니다.텍스트:
SELECT 하위 문자열(1234, 3); 오류: substr(정수, 정수) 함수가 존재하지 않습니다. 힌트: 주어진 이름과 인수 유형과 일치하는 함수가 없습니다. 필요할 수도 있습니다 명시적인 유형 캐스트를 추가합니다.
이것은 작동하지 않습니다. 왜냐하면정수암시적 캐스트가 없습니다.텍스트. 그러나 명시적인 캐스트는 작동합니다.
SELECT substr(CAST (1234 AS 텍스트), 3);
하위 문자열
--------
34
(1행)