���룺����(yanzi) ��ҳ��http://nrdoc.com
��һ��, ǰһ��, ��һ��, ���һ����Ŀ¼.
��2�ַ������º����ӵ�MySQL�У�
CREATE
FUNCTION
��DROP FUNCTION
��䶯̬�����Ӻ�ɾ������7.30 CREATE FUNCTION/DROP FUNCTION
�䷨��mysqld
������������һ�����õĻ����Ͽɵõ���ÿ�ַ��������ŵ��ȱ�㣺
������ʹ�����ַ��������º��������ǿ�����ԭ����������ABS()
��SOUNDEX()
����ʹ�á�
����UDF�Ĺ������ƣ�����������C��C++��д������IJ���ϵͳ����֧�ֶ�̬װ�ء�MySQLԴ����ַ�����һ���ļ���sql/udf_example.cc������������5���º������������ļ���UDF����Լ������������
��ÿһ��������SQL�����ʹ�õĺ�������Ӧ�ö����Ӧ��C(�� C++)������������������У���xxx������һ�������������ӡ�Ϊ������SQL��C/C++�÷���XXX()
(��д)����SQL�������ã���xxx()
((Сд)����C/C++�������á�
���дʵ��XXX()
�Ľӿڵ�C/C++�����ǣ�
xxx()
������ģ�SQL ���� | C/C++ ���� |
STRING |
char * |
INTEGER |
long long |
REAL |
double |
xxx_init()
����ѡ��xxx()
�ij�ʼ���������������ڣ� XXX()
�IJ��������� REAL
����)С��λ�������Ŀ��NULL
��xxx_deinit()
����ѡ��xxx()
�Ľ�����������Ӧ���ͷų�ʼ�����������˵��κ��ڴ档��һ��SQL������XXX()
ʱ��MySQL���ó�ʼ������xxx_init()
������ִ���κ���������ã�������������ڴ���䡣���xxx_init()
����һ������SQL�����һ��������Ϣ�����������������ͽ��������������ã�����Ϊÿ�е���������xxx()
һ�Ρ��������б��������������xxx_deinit()
�����ã��������ִ���κα�Ҫ�������
���к��������̰߳�ȫ��(��ֻ�������������г�ʼ���ͽ�������)������ζ�ţ��㲻���������κθı��ȫ�ֻ�̬�������������Ҫ�ڴ棬��Ӧ����xxx_init()
�ַ�����������xxx_deinit()
���ͷ�����
������Ӧ�����¶��塣ע�ⷵ�����ͺͲ�����ͬ��ȡ�������Ƿ���CREATE
FUNCTION
���������SQL����XXX()
����STRING
��INTEGER
��REAL
��
��STRING
������
char *xxx(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error);
��INTEGER
������
long long xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
����REAL
������
double xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
��ʼ���ͽ���������������������
my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void xxx_deinit(UDF_INIT *initid);
initid
��������������3����������ָ��һ��UDF_INIT
�ṹ���������ں���֮�䴫����Ϣ��UDF_INIT
�ṹ��Ա�������档��ʼ������Ӧ����д����Ҫ�ı���κγ�Ա������һ����Աʹ��ȱʡֵ�����ı�������
my_bool maybe_null
xxx()
�ܷ���NULL
��xxx_init()
Ӧ������maybe_null
Ϊ1
������������κ�һ��������maybe_null
��ȱʡֵ��1��
unsigned int decimals
1.34
��1.345
��1.3
��ȱʡֵ����3����Ϊ1.345
��3��С��λ��unsigned int max_length
initid->decimals
ָ����С��λ�����������ֺ��������Ȱ����κη���λ��С�����ַ�����char *ptr
initid->ptr
�ں���֮�䴫�ݷ�����ڴ档��xxx_init()
�У������ڴ沢�����������ָ�룺initid->ptr = allocated_memory;
��xxx()
��xxx_deinit()
������initid->ptr
��ʹ�û��ͷ��ڴ档
args
����ָ��һ��UDF_ARGS
��Ա����ṹ�������棺
unsigned int arg_count
if (args->arg_count != 2) { strcpy(message,"XXX() requires two arguments"); return 1; }
enum Item_result *arg_type
STRING_RESULT
��INT_RESULT
��REAL_RESULT
��Ϊ��ȷ��������һ�ָ��������ͣ���������Dz��ǣ�����һ�������ڳ�ʼ�������м��arg_type
���顣���磺if (args->arg_type[0] != STRING_RESULT && args->arg_type[1] != INT_RESULT) { strcpy(message,"XXX() requires a string and an integer"); return 1; }
��Ϊ��һ��Ҫ����ĺ����IJ����������ض����͵�ѡ�������ʹ�ó�ʼ����������arg_type
��Ա������Ҫ�����͡����MySQLΪÿ��xxx()
����ǿ�Ʋ���Ϊ��Щ���ͣ����磬Ϊ��ָ��ͷ
2���������ַ�����������ǿ�ƣ���xxx_init()
��������
args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT;
char **args
args->args
��������ĺ����������õIJ�����һ�����Ե���Ϣ���ݵ���ʼ����������һ����������i
��args->args[i]
ָ�����ֵ������������������ȷ��ȡֵ��ָ��)
��һ���dz����IJ�����args->args[i]
��0
��һ����������ֻ��ʹ�ó�����һ������ʽ������3
��4*7-2
��SI(3.14)
��һ���dz������������ÿ���ÿ�в�ͬ��ֵ��һ������ʽ�����������ֻ��÷dz����������õĺ���������������ÿ�ε��ã�args->args
�����Ե�ǰ���ڴ������������ݵ�ʵ�ʲ����������������µ�����һ������i
��STRING_RESULT
���͵IJ�����һ���ַ���ָ���һ�����ȸ�����������������ij��ȵĶ����Ƶ����ݻ����ݡ��ַ������ݿ���args->args[i]
�õ������ַ���������args->lengths[i]
���㲻Ӧ�ü����ַ������Կ�(null)�����ġ�INT_RESULT
���͵IJ����������ǿ��ת��args->args[i]
Ϊһ��long
long
ֵ�� long long int_val; int_val = *((long long*) args->args[i]);
REAL_RESULT
���͵IJ����������ǿ��ת��args->args[i]
Ϊһ��double
ֵ��
double real_val; real_val = *((double*) args->args[i]);
unsigned long *lengths
lengths
����ָ��ÿ������������ַ������ȡ��������������ã�lengths
����Ϊ��ǰ���ڱ��������д��ݵ��κ��ַ���������ʵ�ʳ��ȡ���INT_RESULT
��REAL_RESULT
���͵IJ�����lengths
��Ȼ�������������(����Գ�ʼ������)��
���û�г��ִ���ʼ������Ӧ�÷���0
������1
���������һ������xxx_init()
Ӧ����message
�����д洢һ�����ַ������Ĵ�����Ϣ����Ϣ�������ظ��ͻ�����Ϣ��������MYSQL_ERRMSG_SIZE
���ַ�����������Ӧ�����ű�����Ϣ����80���ַ��Ա����ʺ�һ�����ն���Ļ�Ŀ��ȡ�
��long long
��double
������������xxx()
�ķ���ֵ�Ǻ���ֵ�����ַ����������ַ�����result
��length
�����б����ء�result
������255���ֽڳ���һ����������������ЩΪ����ֵ�����ݺͳ��ȡ����磺
memcpy(result, "result string", 13); *length = 13;
�ַ�����������ֵҲͨ��ָ������
Ϊ�����������б���һ��NULL
����ֵ���趨is_null
Ϊ1
��
*is_null = 1;
Ϊ���ں����б���һ�����أ��趨error
����Ϊ1
��
*error = 1;
��������xxx()
����*error
Ϊ1
���Ե�ǰ�к���ֵ��NULL
�������ڸ�����д����ĺ����У�XXX()
�����á�(xxx()
��������Ϊ�����б����á���ע�⣺��MySQL
3.22.10��ǰ�İ汾�У���Ӧ�ö�����*error
��*is_null
��
*error = 1; *is_null = 1;
ʵ��UDF���ļ������ڷ��������е������ϱ����벢�Ұ�װ�������������������UDF�����ļ�������MySQLԴ����ַ�����udf_example.cc���У�����ļ��������к�����
metaphon()
�����ַ���������һ������λ(metaphon)�ַ��������е���һ��soundex�ַ����������������Ӣ��������myfunc_double()
������������������ַ���ASCIIֵ�ĺͣ��������������֮�͡�myfunc_int()
�������������֮�͡� lookup()
���ض���������IP����reverse_lookup()
���ض�һ��IP����������������������һ���ַ���"xxx.xxx.xxx.xxx"
��4λ���ֱ����á�һ���ɶ�̬װ�ص��ļ�Ӧ�ñ���Ϊһ�������Ķ����ļ���ʹ�������������
shell> gcc -shared -o udf_example.so myfunc.cc
ͨ�����������MySQLԴ����������sql��Ŀ¼�µ�����������ܺ������ҳ������ϵͳ��ȷ�ı�����ѡ�
shell> make udf_example.o
��Ӧ������һ��������make
��ʾ�ı������������Ӧ��ɾ���ӽ��н�β��-c
ѡ��������������-o
udf_example.so
������һЩϵͳ�ϣ��������Ҫ�������ϱ���-c
����
һ��������˰���UDF
��һ��������������밲װ�����Ұ�������MySQL������udf_example.cc������һ�������������һ������������udf_example.so�����ļ���ȷ�����ֿ�����ƽ̨��ͬ����ͬ)����������ļ�����ij��ld
Ѱ�ҵ�Ŀ¼��������/usr/lib����������ϵͳ�ϣ������趨LD_LIBRARY
��LD_LIBRARY_PATH
����������ָ����UDF�����ļ���Ŀ¼��dopen
�ֲ�ҳ��������Ӧ�������ϵͳ��ʹ���ĸ���������Ӧ����mysql.server
��safe_mysqld
����������������mysqld
��
�ڿⱻ��װ�Ժ�����Щ����֪ͨmysqld
�й��µĺ�������Ϣ��
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so"; mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so"; mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so"; mysql> CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so"; mysql> CREATE FUNCTION reverse_lookup RETURNS STRING SONAME "udf_example.so";
������ʹ��DROP FUNCTION
ɾ����
mysql> DROP FUNCTION metaphon; mysql> DROP FUNCTION myfunc_double; mysql> DROP FUNCTION myfunc_int; mysql> DROP FUNCTION lookup; mysql> DROP FUNCTION reverse_lookup;
CREATE FUNCTION
��DROP FUNCTION
�����mysql
���ݿ��и���ϵͳ��func
�������������ͺ��������������ڸñ��С�������ж�mysql
��insert��deleteȨ���Դ���������������
�㲻Ӧ��ʹ��CREATE FUNCTION
����һ���Ѿ��������ĺ������������Ҫ���°�װ��������Ӧ����DROP
FUNCTION
ɾ������Ȼ����CREATE FUNCTION
���°�װ�����㽫��Ҫ�����������磬��������±�����ĺ�����һ���°汾���Ա�mysqld
����°汾�����������������ʹ�þɰ汾��
��Ծ������ÿ�η���������ʱ�ٴ�װ�أ�������ʹ��--skip-grant-tables
ѡ������mysqld
������������£�UDF��ʼ������������UDF�����á�����Ծ������һ����CREATE
FUNCTION
װ�ز���û����DROP FUNCTION
ɾ���ĺ�����)
����һ���µ�ԭ�������Ĺ���������������ע�⣬�㲻����һ�������Ʒַ��м����º�������Ϊ�ù����漰��MySQLԴ���롣������Դ����ַ����б���MySQL��ҲҪע�⣬�����Ǩ�Ƶ�MySQL�������汾�����磬��һ���°汾���ͷ�ʱ)���㽫��Ҫ���°汾�ظ��ù��̡�
Ϊ�˼���һ���µ�ԭ��MySQL��������ѭ��Щ���裺
sql_functions[]
�����ж��庯������
yacc
Ӧ�ö����Ԥ����������(��Ӧ�ü����ļ��Ŀ�ʼ)��Ȼ���庯���������ҽ�һ��������Щ��������Ŀ���ӵ�simple_expr
����������С���һ�����ӣ��������sql_yacc.yy
���е�SOUNDEX
���ֿ�����ʹ�������ġ�Item_num_func
��Item_str_func
���࣬ȡ������ĺ����Ƿ���һ�����ֻ���һ���ַ�����double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)
void Item_func_newname::fix_length_and_dec()
�����������Ӧ�û��ڸ����IJ�������max_length
��max_length
�Ǻ������Է��ص��ַ��������Ŀ��������������ܷ���һ��NULL
ֵ���������ҲӦ������maybe_null
= 0
����������ͨ����������maybe_null
�����Ա��麯���������κ�һ���Ƿ��ܷ���NULL
��
���к����������̰߳�ȫ�ģ�thread-safed����
���ַ�����������֪��һЩ����Ŀ��ǣ�
String *str
�����ṩһ�������������������ַ�����������