24.4.3 새로운 Native 함수의 추가
새로운 네이티브 MySQL 함수를 추가하려면 여기에서 설명하는 절차를 사용합니다. 이 단계에서는 소스 배포판을 사용해야합니다. 네이티브 함수를 바이너리 배포판에 추가 할 수 없습니다. 이 경우 MySQL 소스 코드를 변경하여 변경된 소스에서 MySQL을 컴파일 할 필요가 있기 때문입니다. 다른 버전의 MySQL로 마이그레이션하는 경우 (예를 들어, 새 버전이 출시 된 경우) 새 버전을 사용하여이 절차를 반복해야합니다.
슬레이브 서버로 복제되는 문에 새로운 네이티브 함수를 참조하는 경우, 모든 슬레이브 서버에서 함수를 사용할 수 있도록해야합니다. 그렇지 않으면, 슬레이브에서 그 함수를 호출하려고 할 때 복제가 슬레이브로 실패합니다.
새로운 네이티브 함수를 추가하려면 다음 단계에 따라 sql
디렉토리의 소스 파일을 변경합니다.
item_create.cc
함수에 대한 서브 클래스를 작성합니다.함수가 고정 된 수의 인수를받는 경우, 함수가받는 인수의 수 (0,1,2 또는 3 개)에 따라
Create_func_arg0
,Create_func_arg1
,Create_func_arg2
또는Create_func_arg3
의 서브 클래스를 각각 작성합니다. 예를 들어,Create_func_uuid
,Create_func_abs
,Create_func_pow
및Create_func_lpad
클래스를 참조하십시오.함수가받는 인수의 수가 가변의 경우
Create_native_func
의 서브 클래스를 작성합니다. 예를 들어,Create_func_concat
를 참조하십시오.
SQL 문에서 함수를 참조 할 수있는 이름을 지정하려면 다음 배열에 행을 추가하여
item_create.cc
에 이름을 등록합니다.static Native_func_registry func_array[]
같은 함수에 여러 이름을 등록 할 수 있습니다. 예를 들어,
"LCASE"
및"LOWER"
행을 참조하십시오. 이들은Create_func_lcase
의 별칭입니다.item_func.h
에 함수가 숫자 나 문자열 중 하나를 반환 여부에 따라Item_num_func
또는Item_str_func
에서 상속하는 클래스를 선언합니다.item_func.cc
에 숫자 함수 또는 문자열 함수 중 하나를 정의할지에 따라 다음 중 하나의 선언을 추가합니다.double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)
표준 항목 (
Item_num_func
등)에서 객체를 상속하는 경우, 그 함수 중 하나를 정의하는 것만으로 종종 부모 개체에서 다른 함수가 제공됩니다. 예를 들어,Item_str_func
클래스는::str()
에 의해 반환 된 값에 대해서atof()
를 실행하는val()
함수를 정의하고 있습니다.함수 결정되지 않는 경우는 함수의 결과를 캐시하지 않음을 나타 내기 위해 다음 문을 항목의 생성자에 포함됩니다.
current_thd->lex->safe_to_cache_query=0;
함수 결정되지 않는 상태는 인수의 값이 고정되어 있어도 호출마다 다른 결과가 반환 될 수있는 경우입니다.
많은 경우 다음 객체 함수도 정의합니다.
void Item_func_newname::fix_length_and_dec()
이 함수는 지정된 인수에 따라 적어도
max_length
을 계산합니다.max_length
는 함수가 반환 할 수있는 최대 문자 수입니다. 메인 함수가NULL
값을 돌려 줄 수없는 경우,이 함수maybe_null = 0
도 설정합니다. 이 함수는 인수의maybe_null
변수를 체크하여 함수의 인수 중 하나가NULL
을 반환 할 수 있는지 여부를 확인할 수 있습니다. 이를 수행하는 방법의 전형적인 예는Item_func_mod::fix_length_and_dec
를 참조하십시오.
모든 함수는 스레드로부터 안전해야합니다. 즉, 함수 내에서 상호 배타적 잠금으로 보호하지 않고 글로벌 변수 나 정적 변수를 사용하지 마십시오.
::val()
, ::val_int()
또는 ::str()
에서 NULL
을 반환하는 경우 null_value
을 1로 설정하고 0을 반환합니다.
::str()
오브젝트 함수는주의해야 할 추가 고려 사항이 있습니다.
String *str
인수는 결과를 저장하는 데 사용할 수있는 문자열 버퍼를 제공합니다. (String
형의 자세한 내용은sql_string.h
파일을 참조하십시오.)::str()
함수는 결과가 유지되는 문자열을 반환하거나 결과가NULL
의 경우(char*) 0
을 반환합니다.현재 모든 문자열 함수는 절대적으로 필요한 경우를 제외하고 메모리 할당을 피하려고합니다.