이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.사설 토토 42 |_1 |04버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

10.3. 토토 커뮤니티

함수 호출에서 참조되는 특정 함수는 다음과 같습니다. 다음 절차에 따라 결정됩니다.

함수 유형 해상도

  1. 다음에서 고려할 기능을 선택하세요.pg_proc시스템 카탈로그. 만약 스키마에 한정되지 않은 함수 이름이 사용되었습니다. 일치하는 이름과 인수 개수를 가진 항목이 고려됩니다. 현재 검색 경로에 표시됩니다(참조섹션 5.7.3). 만약 정규화된 함수 이름이 지정되었습니다. 지정된 함수의 함수만 스키마가 고려됩니다.

    1. 검색 경로에서 동일한 여러 토토 커뮤니티을 찾은 경우 인수 유형 중 경로에서 가장 먼저 나타나는 인수 유형만 고려. 다양한 인수 유형의 함수가 고려됩니다. 검색 경로 위치에 상관없이 동등한 입장입니다.

    2. 함수가 다음과 같이 선언된 경우VARIADIC배열 매개변수이며 호출은 사용하지 않습니다.VARIADIC키워드인 경우 함수는 다음과 같습니다. 배열 매개변수가 하나 이상의 매개변수로 대체된 것처럼 처리됩니다. 호출과 일치하는 데 필요한 요소 유형의 발생. 이후 이러한 확장을 통해 함수는 효과적인 인수 유형을 가질 수 있습니다. 일부 non-variadic 함수와 동일합니다. 이 경우 함수는 검색 경로의 앞부분에 나타나는 것이 사용되거나 두 가지가 사용되는 경우 함수가 동일한 스키마에 있고 가변적이지 않은 함수는 다음과 같습니다. 선호합니다.

      이것은 정규화된 이름을 통해 호출할 때 보안 위험을 야기합니다.[1], 신뢰할 수 없는 사용자를 허용하는 스키마에서 발견된 가변 함수 객체를 생성합니다. 악의적인 사용자가 제어권을 갖고 실행 가능 마치 사용자가 실행한 것처럼 임의의 SQL 함수를 사용합니다. 대체 다음을 포함하는 통화VARIADIC키워드, 이 위험을 우회합니다. 전화 연결 중VARIADIC "아무거나"매개변수에 동등한 공식이 없는 경우가 많습니다. 다음을 포함하는VARIADIC키워드. 발행하려면 이러한 호출이 안전하게 이루어지려면 함수의 스키마에서 신뢰할 수 있는 것만 허용해야 합니다. 사용자가 객체를 생성할 수 있습니다.

    3. 매개변수에 기본값이 있는 함수가 고려됩니다. 0개 이상의 기본값을 생략하는 호출과 일치시키려면 매개변수 위치. 그러한 함수가 두 개 이상 호출과 일치하는 경우, 검색 경로에서 가장 먼저 나타나는 것이 사용됩니다. 만약 있다면 동일한 스키마에 있는 두 개 이상의 함수 기본값이 아닌 위치의 매개변수 유형(가능함) 기본 설정 가능한 매개변수 세트가 다른 경우) 시스템은 어느 것을 선호할지 결정할 수 없으므로"모호한 함수 호출"오류가 발생합니다 호출과 더 잘 일치하는 항목을 찾을 수 없는 경우 결과가 표시됩니다.

      이것은 자격을 갖춘 전화를 통해 전화할 때 가용성 위험을 만듭니다. 이름[1], 스키마에서 발견된 모든 함수 신뢰할 수 없는 사용자가 객체를 생성하도록 허용합니다. 악의적인 사용자는 다음을 수행할 수 있습니다. 기존 함수의 이름으로 함수를 생성하고, 해당 함수의 매개변수를 복제하고 새로운 내용을 추가합니다. 기본값을 갖는 매개변수. 이로 인해 새로운 호출이 불가능해졌습니다. 원래 기능. 이러한 위험을 방지하려면 다음 위치에 기능을 배치하세요. 신뢰할 수 있는 사용자만 객체를 생성하도록 허용하는 스키마입니다.

  2. 입력 인수 유형을 정확하게 받아들이는 함수를 확인하세요. 하나가 존재하는 경우(세트에 정확히 일치하는 항목은 하나만 있을 수 있음) 고려된 토토 커뮤니티)을 사용하십시오. 정확한 일치가 없으면 인증된 이름을 통해 전화할 때 보안 위험이 있습니다.[1], 스키마에 있는 함수 신뢰할 수 없는 사용자가 객체를 생성하도록 허용합니다. 그러한 상황에서는 캐스팅 정확한 일치를 강제하는 인수입니다. (관련 사례알 수 없음이 단계에서는 일치하는 항목을 찾을 수 없습니다.)

  3. 완전히 일치하는 항목이 없으면 함수 호출이 다음과 같이 나타나는지 확인하십시오. 특별한 유형 변환 요청이어야 합니다. 이 기능은 다음과 같은 경우에 발생합니다. call에는 인수가 하나만 있고 함수 이름은 (내부) 일부 데이터 유형의 이름입니다. 게다가, 그 기능은 인수는 알 수 없는 유형의 리터럴이거나 다음과 같은 유형이어야 합니다. 명명된 데이터 유형으로 이진 강제 변환 가능하거나 해당 유형의 I/O를 적용하여 명명된 데이터 유형으로 변환됩니다. 함수(즉, 변환은 다음 중 하나에서 수행됩니다. 표준 문자열 유형). 이러한 조건이 충족되면 해당 기능은 통화는 다음과 같은 형식으로 처리됩니다.캐스트사양.[2]

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

    1. 입력 유형이 아닌 후보 함수를 폐기합니다. 일치하지만 다음으로 변환할 수 없습니다(암시적 변환 사용). 일치합니다.알 수 없음리터럴은 다음과 같이 가정됩니다. 이 목적을 위해 무엇이든 변환 가능합니다. 후보가 1명뿐인 경우 남아 있으면 사용하세요. 그렇지 않으면 다음 단계로 진행하세요.

    2. 입력 인수가 도메인 유형인 경우 다음으로 처리합니다. 모든 후속 단계에 대한 도메인의 기본 유형입니다. 이는 다음을 보장합니다. 도메인은 다음 목적을 위해 기본 유형처럼 작동합니다. 모호한 기능 해결.

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

    4. 모든 후보자를 살펴보고 선호하는 후보자를 유지하십시오. 유형(입력 데이터 유형의 유형 카테고리 중) 최대 유형 변환이 필요한 위치. 모두 유지 선호하는 유형을 허용하지 않는 경우 후보자. 후보가 1명뿐인 경우 남아 있으면 사용하세요. 그렇지 않으면 다음 단계로 진행하세요.

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

    6. 둘 다 있는 경우알 수 없음및 알려진 유형 인수와 모든 알려진 유형의 인수는 동일한 유형을 갖습니다. 다음과 같이 가정합니다.알 수 없음인수는 또한 해당 유형을 확인하고 해당 유형을 수락할 수 있는 후보자를 확인하세요.알 수 없음-인수 위치. 정확히 하나라면 후보자가 이 테스트를 통과했다면 사용하세요. 그렇지 않으면 실패합니다.

참고하세요"가장 일치하는 항목"규칙은 다음과 같습니다 연산자 및 함수 유형 확인과 동일합니다. 몇 가지 예 따라가세요.

예제 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 텍스트), 3);

참고:파서는 다음에서 학습합니다.pg_cast카탈로그텍스트그리고varchar바이너리 호환 가능, 즉 하나는 없이 다른 하나를 받아들이는 함수에 전달될 수 있습니다. 물리적 변환을 수행합니다. 따라서 유형 변환 호출이 없습니다. 이 경우에는 실제로 삽입되었습니다.

그리고 함수가 다음 유형의 인수로 호출되는 경우정수, 파서는 이를 변환하려고 시도합니다. 에텍스트:

SELECT 하위 문자열(1234, 3);
오류: substr(정수, 정수) 함수가 존재하지 않습니다.
힌트: 주어진 이름과 인수 유형과 일치하는 함수가 없습니다. 필요할 수도 있습니다
명시적인 유형 캐스트를 추가합니다.

이것은 작동하지 않습니다. 왜냐하면정수그렇습니다 암시적 캐스트가 없습니다.텍스트. 안 그러나 명시적 캐스트는 작동합니다.

SELECT substr(CAST (1234 AS 텍스트), 3);

 하위 문자열
--------
     34
(1행)

참고

[1]

스키마에 한정되지 않은 이름으로는 위험이 발생하지 않습니다. 신뢰할 수 없는 것을 허용하는 스키마가 포함된 검색 경로 때문입니다. 사용자가 객체를 생성하는 것은 a가 아닙니다.보안 스키마 사용 패턴.

[2]

이 단계의 이유는 함수 스타일 캐스트를 지원하기 위한 것입니다 실제 캐스트 기능이 없는 경우의 사양입니다. 캐스트 함수가 있는 경우 관례적으로 해당 함수의 이름을 따서 명명됩니다. 출력 유형이므로 특별한 경우가 필요하지 않습니다. 참조PostgreSQL : 문서 : 9.3 : 토토 꽁 머니 만들기추가 해설.