함수 호출에 의해 참조되는 특정 함수는 다음 절차를 사용하여 결정됩니다.
함수 유형 해상도
에서 고려할 함수를 선택하십시오PG_PROC
시스템 카탈로그. 비 스키마 자격이없는 함수 이름이 사용 된 경우, 고려 된 기능은 현재 검색 경로에서 볼 수있는 일치 이름과 인수 수를 가진 기능입니다 (참조섹션 5.9.3). 자격을 갖춘 배트맨 토토 이름이 주어지면 지정된 스키마의 배트맨 토토 만 고려됩니다.
검색 경로에서 동일한 인수 유형의 여러 배트맨 토토을 찾으면 경로에서 가장 오래된 것으로 보이는 사람 만 고려됩니다. 다른 인수 유형의 배트맨 토토은 검색 경로 위치에 관계없이 동일한 기반에서 고려됩니다.
If a function is declared with avariadic
배열 매개 변수이며 호출은를 사용하지 않습니다.variadic
키워드, 함수는 호출과 일치하는 데 필요한 경우 배열 매개 변수가 요소 유형의 하나 이상의 발생으로 대체되는 것처럼 취급됩니다. 이러한 확장 후 함수는 비 전환 배트맨 토토과 동일한 효과적인 인수 유형을 가질 수 있습니다. 이 경우 검색 경로에서 앞부분에서 나타나는 배트맨 토토이 사용되거나 두 배트맨 토토이 동일한 스키마에 있으면 비 전환이 선호됩니다.
이것은 자격을 갖춘 이름을 통해 호출 할 때 보안 위험을 초래합니다[10], 신뢰할 수없는 사용자가 객체를 생성 할 수있는 스키마에서 발견되는 변수 함수. 악의적 인 사용자는 제어하고 임의의 SQL 배트맨 토토을 실행 한 것처럼 실행할 수 있습니다. 를 대신하여variadic
키워드는이 위험을 우회합니다. 전화Variadic "Any"
매개 변수는 종종 동등한 공식을 포함하지 않습니다variadic
키워드. 해당 통화를 안전하게 발행하려면 배트맨 토토의 스키마는 신뢰할 수있는 사용자 만 객체를 만들도록 허용해야합니다.
매개 변수에 대한 기본값이있는 함수는 기본 매개 변수 위치의 0 이상을 생략하는 호출과 일치하는 것으로 간주됩니다. 둘 이상의 함수가 호출과 일치하면 검색 경로에서 가장 일찍 나타나는 배트맨 토토이 사용됩니다. 동일한 스키마에 동일한 스키마에 동일한 스키마에 동일한 매개 변수 유형을 가진 두 가지 이상의 배트맨 토토이있는 경우 (기본 기본 매개 변수 세트가 다른 경우 가능) 시스템은 선호하는 사람을 결정할 수 없습니다..“모호한 배트맨 토토 호출”통화와 더 잘 일치하지 않으면 오류가 발생합니다.
이것은 자격있는 이름을 통해 호출 할 때 가용성 위험을 초래합니다[10], 신뢰할 수없는 사용자가 객체를 생성 할 수있는 스키마에서 발견 된 모든 함수. 악의적 인 사용자는 기존 함수의 이름으로 함수를 생성하여 해당 배트맨 토토의 매개 변수를 복제하고 기본값을 갖는 새로운 매개 변수를 추가합니다. 이것은 원래 배트맨 토토에 대한 새로운 호출을 배제합니다. 이 위험을 파악하기 위해 신뢰할 수있는 사용자 만 물체를 만들 수있는 스키마에 배트맨 토토을 배치합니다.
입력 인수 유형을 정확하게 수락하는 함수를 확인하십시오. 하나가 존재하는 경우 (고려 된 배트맨 토토 세트에 정확히 일치하는 경우) 사용하십시오. 정확히 일치가 부족하여 자격을 갖춘 이름을 통해 호출 할 때 보안 위험이 발생합니다.[10], 신뢰할 수없는 사용자가 객체를 생성 할 수있는 스키마에서 발견 된 함수. 그러한 상황에서는 정확한 일치를 강요하기 위해 논쟁을 시전합니다. (관련된 사례알 수없는
이 단계에서 일치를 찾지 못할 것입니다.)
정확히 일치하지 않으면 함수 호출이 특수 유형 변환 요청으로 보이는지 확인하십시오. 함수 호출에 하나의 인수가 있고 함수 이름이 일부 데이터 유형의 (내부) 이름과 동일 한 경우에 발생합니다. 또한 함수 인수는 알려지지 않은 문자 그럴이거나 이름이 지정된 데이터 유형에 이진을 통합 할 수있는 유형이거나 해당 유형의 I/O 함수를 적용하여 명명 된 데이터 유형으로 변환 할 수있는 유형이어야합니다 (즉, 변환은 표준 문자열 유형 중 하나입니다). 이러한 조건이 충족되면 배트맨 토토 호출은의 형태로 취급됩니다.캐스트
사양.[11]
최고의 경기를 찾으십시오.
입력 유형이 일치하지 않고 일치하도록 (암시 적 변환을 사용하여) 변환 할 수없는 후보 함수 폐기.알 수없는
리터럴은이 목적을 위해 무엇이든 전환 할 수 있다고 가정합니다. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 다음 단계로 계속됩니다.
입력 인수가 도메인 유형 인 경우 모든 후속 단계에 대해 도메인의 기본 유형으로 취급하십시오. 이를 통해 도메인은 모호한 배트맨 토토 해상도를 위해 기본 유형처럼 작용하도록합니다.
모든 후보자를 통해 실행하여 입력 유형에서 가장 정확한 일치를 유지합니다. 정확히 일치하는 경우 모든 후보자를 유지하십시오. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 다음 단계로 계속됩니다.
모든 후보자를 통해 유형 변환이 필요한 대부분의 위치에 선호 유형 (입력 데이터 유형 유형 카테고리)을 허용하는 후보를 실행하십시오. 선호하는 유형을 허용하지 않으면 모든 후보자를 유지하십시오. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 다음 단계로 계속됩니다.
입력 인수가있는 경우알 수없는
, 나머지 후보자가 해당 인수 위치에서 수락 한 유형 범주를 확인하십시오. 각 위치에서를 선택하십시오.String
카테고리 후보자가 해당 범주를 수락하는 경우. (문자열에 대한이 편견은 알려지지 않은 문자 문자가 문자열처럼 보이기 때문에 적절합니다.) 그렇지 않으면, 나머지 후보가 모두 동일한 유형 범주를 수락하는 경우 해당 범주를 선택하십시오. 그렇지 않으면 더 이상의 단서없이 올바른 선택을 추론 할 수 없기 때문에 실패합니다. 이제 선택한 유형 카테고리를 수락하지 않는 후보자를 폐기하십시오. 또한 후보자가 해당 범주에서 선호하는 유형을 수락하는 경우 해당 주장에 대해 선호되지 않은 유형을 수락하는 후보자를 버립니다. 이 테스트에서 살아남지 못하면 모든 후보자를 유지하십시오. 한 명의 후보 만 남아 있으면 사용하십시오. 그렇지 않으면 다음 단계로 계속됩니다.
둘 다있는 경우알 수없는
및 알려진 유형의 인수, 그리고 알려진 모든 유형 인수는 동일한 유형을 가지고 있다고 가정합니다.알 수없는
인수는 또한 그 유형이며, 어떤 후보자가 어떤 후보자가 그 유형을 수락 할 수 있는지 확인합니다알 수없는
-경사 위치. 정확히 한 후보자 가이 테스트를 통과하면 사용하십시오. 그렇지 않으면 실패합니다.
“최고의 경기”규칙은 연산자 및 기능 유형 해상도와 동일합니다. 일부 예는 다음과 같습니다.
예 10.6. 반올림 함수 인수 유형 해상도
하나만 있습니다라운드
두 가지 인수를 취하는 함수; 유형의 첫 번째 논쟁이 필요합니다숫자
그리고 유형의 두 번째 인수Integer
. 따라서 다음 쿼리는 유형의 첫 번째 인수를 자동으로 변환합니다Integer
to숫자
:
선택 라운드 (4, 4); 둥근 -------- 4.0000 (1 행)
그 쿼리는 실제로 파서에 의해 :으로 변환됩니다.
원형 (캐스트 (4 AS 숫자), 4); 선택
소수점이있는 숫자 상수가 처음에 유형에 할당되기 때문에숫자
, 다음 쿼리는 유형 변환이 필요하지 않으므로 약간 더 효율적일 수 있습니다.
선택 라운드 (4.0, 4);
예 10.7. 변수 배트맨 토토 해상도
기능 생성 public.variadic_example (variadic numeric [])는 int를 반환합니다 언어 SQL 'SELECT 1'; 기능 만들기
이 함수는 Variadic 키워드를 허용하지만 필요하지 않습니다. 정수와 숫자 인수를 모두 허용합니다.
public.variadic_example (0), public.variadic_example (0.0), public.variadic_example (variadic array [0.0]); variadic_example | variadic_example | variadic_example -----------------+------------------------------------------ 1 | 1 | 1 (1 행)
그러나 첫 번째 및 두 번째 통화는 가능한 경우보다 특이한 함수를 선호합니다.
CREATE CREATE PUBLIC.VARIADIC_EXALLE (NUMERIC) int를 반환합니다 'SELECT 2'로 언어 SQL; 기능을 만듭니다 function public.variadic_example (int) int를 반환합니다 언어 SQL 'SELECT 3'; 기능을 만듭니다 public.variadic_example (0)을 선택하십시오. public.variadic_example (0.0), public.variadic_example (variadic array [0.0]); variadic_example | variadic_example | variadic_example -----------------+------------------------------------------ 3 | 2 | 1 (1 행)
기본 구성과 기존의 첫 번째 함수 만 주어지면 첫 번째 및 두 번째 호출은 안전하지 않습니다. 모든 사용자는 두 번째 또는 세 번째 배트맨 토토을 만들어이를 가로 채울 수 있습니다. 인수 유형을 정확하게 일치시키고 사용함으로써variadic
키워드, 세 번째 호출은 안전합니다.
예 10.8. 하위 문자열 배트맨 토토 유형 해상도
몇 가지가 있습니다서브 스트
함수, 그 중 하나는 유형을 취합니다텍스트
andInteger
. 지정되지 않은 유형의 문자열 상수로 호출되면 시스템은 선호하는 범주의 인수를 받아들이는 후보 함수를 선택합니다.String
(즉, 유형텍스트
).
SELECT SUBSTR ( '1234', 3); 기판 -------- 34 (1 행)
문자열이 유형으로 선언 된 경우Varchar
, 테이블에서 나오는 경우에 따라, 파서는이를 변환하도록 시도합니다텍스트
:
SELECT SIPSTR (Varchar '1234', 3); 기판 -------- 34 (1 행)
이것은 파서에 의해 효과적으로되는 것으로 변환됩니다 :
SELLE SELECT SEPTRT (CAST (Varchar '1234'as Text), 3);
파서는에서 배웁니다pg_cast
카탈로그텍스트
andvarchar
이진 호환이므로 물리적 변환을 수행하지 않고 다른 사람을 받아들이는 함수로 전달 될 수 있습니다. 따라서이 경우 유형 변환 호출이 실제로 삽입되지 않습니다.
그리고 함수가 유형의 인수로 호출되는 경우정수
, 파서는이를로 변환하려고합니다.텍스트
:
SELECT SUBSTR (1234, 3); 오류 : 함수 서브 (정수, 정수)가 존재하지 않습니다 힌트 : 주어진 이름과 인수 유형과 일치하지 않습니다. 필요할 수도 있습니다 명시 적 유형 캐스트를 추가하려면
이것은 작동하지 않기 때문에Integer
암시 적 캐스트가 없습니다텍스트
. 그러나 명백한 캐스트는 효과가 있습니다 :
SELECT SEPSTR (Cast (1234 AS TEXT), 3); 기판 -------- 34 (1 행)
[10]신뢰할 수없는 사용자가 객체를 생성 할 수 있도록하는 스키마를 포함하는 검색 경로는이 아니기 때문에 위험은 스키마 자격이없는 이름으로 발생하지 않습니다.보안 스키마 사용 패턴.
문서에 올바른 것이 없다면 일치하지 않습니다. 특정 배트맨 토토에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면