|
|||||||||||||||||||||||||||
|
æ¬ç« å å«è®¸å¤å¨ä½ å¤çMySQLä»£ç æ¶éè¦äºè§£çä½ äºæ ãå¦æä½ æ³æå ¥å°MySQLçå¼åä¸ï¼ææ³è¦æ¥è§¦å°ææ°çä¸é´çæ¬ç代ç ï¼æè å°±æ¯æ³äºè§£å¼åçè¿åº¦ï¼è¯·åé 2.8.3èï¼âä»å¼åæºä»£ç æ å®è£ âç说æãå¦æä½ å¯¹MySQLçå 鍿件æå ´è¶£ï¼ä½ ä¹å¯ä»¥è®¢é æä»¬çå 鍿件é®ä»¶å表ãè¿ä¸ªåè¡¨çæµéç¸å¯¹ä½ä¸äºã欲ç¥å¦ä½è®¢é ç详æ ï¼è¯·åé 1.7.1.1èï¼âMySQLé®ä»¶å表âãå¨MySQL AB çææå¼å人åé½å¨å 鍿件å表éï¼ æ¤å¤ï¼æä»¬å¸®å©é£äºæ£å¨å¤çMySQL代ç ç人ã请éæä½¿ç¨è¿ä¸ªé®ä»¶å表æ¥é®ä»£ç æå ³çé®é¢ï¼ä¹å¯ç¨å®æ¥åéä½ æ³å¥ç®ç»MySQL项ç®ç è¡¥ä¸ï¼ MySQLæå¡å¨å建å¦ä¸çº¿ç¨ï¼
mysqladmin processlist ä» æ¾ç¤ºè¿æ¥ï¼INSERT DELAYED, åå¤å¶çº¿ç¨ å å«å¨Unixæºç åäºè¿å¶ååçä¸çæµè¯ç³»ç»å¯ä»¥è®©ç¨æ·åå¼å人å对MySQLä»£ç æ½è¡å彿µè¯ãè¿äºæµè¯å¯ä»¥å¨Unixä¸è¿è¡ï¼ç®åå®ä»¬è¿ä¸è½å¨åççWindowsç¯å¢ä¸è¿è¡ã å½åçæµè¯æ¡ä¾å¥ä»¶ä¸è½å¨MySQL䏿µè¯ææä¸è¥¿ï¼ä½æ¯å®è½åç°SQLå¤ç代ç ï¼OS/libraryæä»¶ä¸å¤§å¤æ°ææ¾ç缺é·ï¼å¹¶ä¸å¨æµè¯å¤ä»¶æ¹é¢ä¹æ¯é常彻åºçãæä»¬çç»æç®æ æ¯å¯¹100%ç代ç è¿è¡æµè¯ãæä»¬æ¬¢è¿å¤§å®¶ç»æä»¬çæµè¯å¥ä»¶æ·»å å 容ãä½ å¯è½ä¼ç¹å«æ³è´¡ç®åºé£äºæ£æ¥ä½ ç³»ç»éåè½æ§å±æºçæµè¯ï¼å 为è¿å°ç¡®ä¿æªæ¥ææåè¡ççMySQLä¼ä¸ä½ çåºç¨ç¨åºä¸èµ·æ´å¥½å°è¿è¡ã æµè¯ç³»ç»å æ¬ä¸ä¸ªæµè¯è¯è¨è§£éå¨(mysqltest)ï¼ä¸ä¸ªè¿è¡æææµè¯çå¤å£³èæ¬(mysql-test-run)ï¼ç¨ä¸ç¨è¯è¨ç¼åçæµè¯æ¡ä¾ï¼ä»¥åå®ä»¬çé¢æç»æãå¨ç³»ç»ä¸ç¼è¯å¥½ä¹åï¼å¨æºä»£ç çrootä¸é®å ¥make test æmysql-test/mysql-test-runã妿å®è£ äºä¸ä¸ªäºè¿å¶ååçï¼ cd å°å®è£ root (å¦ /usr/local/mysql), ç¶åé®å ¥ scripts/mysql-test-runãæææµè¯åºè¯¥é½éè¿ï¼åä½¿ææ²¡éè¿çï¼è¥æ¯ä¸ä¸ªMySQLéç缺é·ï¼ä½ å¯ä»¥è¯çæ¾æ¾æ¯å 为ä»ä¹ï¼å¹¶ä¸æ¥åè¿ä¸ªé®é¢ã请åé 27.1.2.3èï¼âå¨MySQLæµè¯å¥ä»¶éæ¥å缺é·âã å¦æä½ æ³è¦è¿è¡æµè¯å¥ä»¶çæºå¨ä¸å·²ç»è¿è¡äºä¸ä¸ª mysqld ï¼åªè¦å®ä¸å ç¨9306 å 9307端å£ï¼å°±ä¸ç¨åæå®ã妿å ç¨äºå ¶ä¸çä¸ä¸ªï¼ä»¥å¯ä»¥ç¼è¾mysql-test-runæä¸»ç«¯å£åï¼æï¼ä»ç«¯å£å·æ¹ä¸ºå ¶å®å¯ç¨çã. å¯ä½¿ç¨ä¸é¢æä»¤è¿è¡å个æµè¯æ¡ä¾ mysql-test/mysql-test-run test_name. è¥ä¸ä¸ªæµè¯æªéè¿ï¼ä½ å¯ä»¥ç¨--forceéé¡¹æ¥æ£æ¥è¿è¡ççmysql-test-runçæ¯å¦æ¯å«çæµè¯æªéè¿ã ä½ å¯ä»¥ç¨mysqltest è¯è¨ç¼åä½ èªå·±çæµè¯æ¡ä¾ãä¸å¹¸å°æ¯ï¼æä»¬è¿æ²¡æåå®ç¸å ³æ¹é¢å®æ´å°ææ¡£ã使¯ï¼ä½ å¯ä»¥æ¥çæä»¬ç°æçæµè¯æ¡ä¾ï¼å¹¶å°å®ä»¬ä½ä¸ºèä¾ãä¸é¢å ç¹å°æå©äºä½ å ¥æï¼
å¦æä½ çMySQLççæ¬æ²¡æéè¿æµè¯å¥ä»¶ï¼ä½ å¯ä»¥éåå¦ä¸æªæ½ï¼
æä¸¤ä¸ªé徿¥ä¸ºMySQLæ·»å æ°å½æ°ï¼
æ¯ç§éå¾é½æå ¶ä¼ç¹å缺ç¹ï¼
æ è®ºä½ ä½¿ç¨åªç§æ¹æ³å»æ·»å æ°å½æ°ï¼å®ä»¬é½å¯ä»¥è¢«SQL声æè°ç¨ï¼å°±å ABS() æ SOUNDEX()è¿æ ·çåºæå½æ°ä¸æ ·ã å¦ä¸ä¸ªæ·»å 彿°çæ¹æ³æ¶å建åå¨å½æ°ãè¿äºå½æ°æ¶ç¨SQL声æç¼åçï¼è䏿¯ç¼è¯ç®æ 代ç ãç¼ååå¨å½æ°çè¯æ³å¨ç¬¬20ç« ï¼åå¨ç¨åºå彿° ä¸æè¿°ã ä¸é¢çå°èæè¿°UDFæ¥å£çç¹æ§ï¼ç»åºç¼åUDFçæä»¤ï¼å¹¶è®¨è®ºMySQLä¸ºé²æ¢UDF被误ç¨èéåçå®å ¨é¢é²æªæ½ã ç»åºæºä»£ç çä¾åæ¥è¯´æå¦ä½ç¼åUDFï¼çä¸çMySQLæºç ååç䏿ä¾çsql/udf_example.cc æä»¶ã MySQLèªå®ä¹å½æ°æ¥å£æå¦ä¸ç¹æ§ååè½ï¼
CREATE [AGGREGATE] FUNCTION
function_name RETURNS {STRING|INTEGER|REAL}
SONAME
shared_library_name
DROP FUNCTION
function_nameä¸ä¸ªèªå®ä¹å½æ° (UDF)å°±æ¯ç¨ä¸ä¸ªè±¡ABS() æ CONCAT()è¿æ ·çåºæï¼å 建ï¼å½æ°ä¸æ ·ä½ç¨çæ°å½æ°å»æ©å±MySQLã function_name æ¯ ç¨å¨SQL声æä¸ä»¥å¤è°ç¨ç彿°ååãRETURNS åå¥è¯´æå½æ°è¿åå¼çç±»åã shared_library_name æ¯å ±äº«ç®æ æä»¶çåºæ¬åï¼å ±äº«ç®æ æä»¶å«æå®ç°å½æ°ç代ç ã该æä»¶å¿ é¡»ä½äºä¸ä¸ªè½è¢«ä½ ç³»ç»çå¨æè¿æ¥è æç´¢çç®å½éã ä½ å¿ é¡»æmysql æ°æ®åºçINSERT æéæè½å建ä¸ä¸ªå½æ°ï¼ä½ å¿ é¡»æmysql æ°æ®åºçDELETEæéæè½æ¤éä¸ä¸ªå½æ°ãè¿æ¯å 为CREATE FUNCTION å¾è®°å½å½æ°ååï¼ç±»ååå ±äº«åçmysql.funcç³»ç»è¡¨éæ·»å äºä¸è¡ï¼èDROP FUNCTION忝ä»è¡¨ä¸å æè¿ä¸è¡ãå¦æä½ æ²¡æè¿ä¸ªç³»ç»è¡¨ï¼ä½ åºè¯¥è¿è¡mysql_fix_privilege_tablesèæ¬æ¥å建ä¸ä¸ªã请åé 2.10.2èï¼âå级ææè¡¨âã ä¸ä¸ªææç彿°æ¯ä¸ä¸ªç¨CREATE FUNCTIONå è½½ä¸æ²¡æç¨DROP FUNCTIONç§»é¤ç彿°ãæ¯æ¬¡æå¡å¨å¯å¨çæ¶åä¼éæ°å è½½ææææå½æ°ï¼é¤éä½ ä½¿ç¨--skip-grant-tablesåæ°å¯å¨mysqldãå¨è¿ç§æ åµä¸ï¼ å°è·³è¿UDFçåå§åï¼UDFä¸å¯ç¨ã è¦äºè§£ç¼åèªå®ä¹å½æ°ç说æï¼è¯·åé 27.2.3èï¼âæ·»å æ°çèªå®ä¹å½æ°âãè¦ä½¿å¾UDFæºå¶è½å¤èµ·ä½ç¨ï¼å¿ 须使ç¨Cæè C++ç¼å彿°ï¼ä½ çç³»ç»å¿ é¡»æ¯æå¨æå è½½ï¼èä¸ä½ å¿ é¡»æ¯å¨æç¼è¯çmysqldï¼ééæï¼ã ä¸ä¸ªAGGREGATE彿°å°±åä¸ä¸ªMySQLåºæçéåï¼æ»åï¼å½æ°ä¸æ ·èµ·ä½ç¨ï¼æ¯å¦ï¼SUMæCOUNT()彿°ãè¦ä½¿å¾AGGREGATE èµ·ä½ç¨ï¼ä½ çmysql.funcè¡¨å¿ é¡»å æ¬ä¸ä¸ªtypeåãå¦æä½ çmysql.func表没æè¿ä¸ åï¼ä½ åºè¯¥è¿è¡mysql_fix_privilege_tablesèæ¬æ¥åå»ºæ¤ åã è¦ä½¿å¾UDFæºå¶è½å¤èµ·ä½ç¨ï¼å¿ 须使ç¨Cæè C++ç¼å彿°ï¼ä½ çç³»ç»å¿ é¡»æ¯æå¨æå è½½ãMySQL æºç ååçå æ¬ä¸ä¸ªsql/udf_example.cc æä»¶ï¼æ¤æä»¶å®ä¹äº5个æ°å½æ°ãå¯ä»¥åèè¿ä¸ªæä»¶ï¼çUDFæ¯å¦ä½è°ç¨å¸¸è§å·¥ä½ã 为äºè½ä½¿ç¨UDFï¼ä½ éè¦å¨æé¾æ¥mysqldãä¸è¦é ç½®MySQL使ç¨--with-mysqld-ldflags=-all-staticåæ°ãå¦æä½ æ³ä½¿ç¨ä¸ä¸ªéè¦ä»mysqld 访é®ç¬¦å·çUDFï¼ä¾å¦å¨ä½¿ç¨default_charset_infoçsql/udf_example.ccæä»¶ä¸çmetaphone彿°ï¼ï¼ä½ å¿ é¡»ä½¿ç¨-rdynamicåæ°æ¥é¾æ¥ç¨åºï¼åé man dlopenï¼ãå¦æä½ è®¡å使ç¨UDF, ä¸ä¸ªç»éªæ³åå°±æ¯ï¼ç¨with-mysqld-ldflags=-rdynamic设å®MySQLï¼é¤éä½ æå¾å¥½ççç±ä¸å»è¿ä¹åã å¦æä½ ä½¿ç¨çæ¯é¢ç¼è¯ååççMySQLï¼ è¯·ä½¿ç¨MySQL-Maxï¼å ¶ä¸å«æä¸ä¸ªå¨æé¾æ¥äºçæå¡å¨ï¼å®å¯ä»¥æ¯æå¨æå è½½ã å¯¹äºæ¯ä¸ªä½ æ³è¦ä½¿ç¨å¨SQL声æä¸ç彿°ï¼ä½ åºè¯¥å®ä¹ç¸åºçC ï¼æ C++ï¼å½æ°ãå¨ä¸é¢ç讨论ä¸ï¼xxxç¨æ¥è¡¨ç¤ºèä¾å½æ°çååï¼ä¸ºäºåºå使ç¨SQLè¿æ¯C/C++ï¼xxx()(䏿 ï¼è¡¨ç¤ºSQL彿°è°ç¨ï¼xxx()ï¼ä¸æ ï¼è¡¨ç¤ºC/C++彿°è°ç¨ã ä½ ä¸ºxxx()ç¼åæ¥å®ç°æ¥å£çC/C++ 彿°å¦ä¸ï¼
å½SQL声æè°ç¨XXX()æ¶ï¼MySQLè°ç¨åå§å彿°xxx_init()ï¼è®©å®æ§è¡å¿ è¦çè®¾ç½®ï¼æ¯å¦ï¼æ£æ¥ åéæåé å åã妿xxx_init() è¿åä¸ä¸ªé误ï¼SQL声æä¼éåºå¹¶ç»åºé误信æ¯ï¼è䏻彿°åå»åå§å彿°å¹¶æ²¡æè¢«è°ç¨ã å¦åï¼ä¸»å½æ°xxx() 对æ¯ä¸è¡é½è¢«è°ç¨ä¸æ¬¡ãææè¡é½å¤çå®ä¹åï¼è°ç¨å»åå§å彿°xxx_deinit() æ§è¡å¿ è¦çæ¸ é¤ã 对äºè±¡SUM()䏿 ·å·¥ä½çéå彿°ï¼ä½ ä¹å¿ é¡»æä¾å¦ä¸ç彿°ï¼
MySQL æä¸åæä½æ¥å¤çéåUDFï¼
ææå½æ°å¿ é¡»æ¶çº¿ç¨å®å ¨çï¼è¿ä¸ä» 坹䏻彿°ï¼å¯¹åå§ååå»åå§å彿°ä¹ä¸æ ·ï¼ä¹å æ¬éå彿°è¦æ±çéå 彿°ãè¿ä¸ªè¦æ±çä¸ä¸ªç»æå°±æ¯ï¼ä½ ä¸è½åé ä»»ä½ååçå ¨å±æéæåéãå¦æä½ éè¦å åï¼ä½ å¯ä»¥å¨xxx_init()彿°åé å åï¼ç¶åå¨xxx_deinit()彿°éæ¾æã ä¸é¢ä»ç»å建ç®åUDFæ¶éè¦å®ä¹çä¸å彿°ã27.2.3èï¼âæ·»å æ°çèªå®ä¹å½æ°âä¸ä»ç»äºMySQLè°ç¨è¿äºå½æ°ç顺åºã 妿¬èæç¤ºï¼åºè¯¥è¯´æä¸»å½æ°xxx()ãæ³¨æè¿åå¼å忰伿æä¸åï¼è¿åå³äºä½ 说æçSQL彿°xxx()å¨CREATE FUNCTION声æä¸è¿åçæ¯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 åæ°è¢«ä¼ éç»ææçä¸ä¸ªå½æ°ã宿åä¸ä¸ªUDF_INIT ç»æï¼è¿ä¸ªç»æè¢«ç¨æ¥å¨å½æ°ä¹é´äº¤æ¢ä¿¡æ¯ãUDF_INIT ç»æé¡¹è·éçãåå§å彿°åºè¯¥ç»ä»»ä½å®æ³è¦æ¹åç项èµå¼ãï¼è¦ä½¿ç¨é¡¹çé»è®¤å¼ï¼å°±è®©å®ä¸è¢«æ¹åï¼
æ¬èä»ç»å建éåUDF乿¶éè¦å®ä¹çä¸å彿°ã27.2.3èï¼âæ·»å æ°çèªå®ä¹å½æ°â ä»ç»äºMySQLè°ç¨è¿äºå½æ°ç顺åºã
对éåUDFèè¨xxx() 彿°åºè¯¥ç¨ä¸ééåUDF䏿 ·çæ¹æ³æ¥è¯´æã请åé 27.2.3.1èï¼âUDFè°ç¨ç®å彿°ç顺åºâã 对ä¸ä¸ªéåUDFï¼MySQL å¨ç»å ææè¡è¢«å¤çä¹åè°ç¨xxx()彿°ãè¿éä½ åºè¯¥ä¸è¬ä¸ä¼æ¥è§¦å°å®çUDF_ARGSåéï¼ä½æ¯åè代ä¹å°æ ¹æ®å 鍿»ååéè¿åç»ä½ å¼ã å¨xxx()ä¸å¤ççè¿åå¼åºè¯¥ç¨ä¸å¯¹ééåUDF䏿 ·çæ¹æ³æ¥æä½ã请åé 27.2.3.4èï¼âUDFè¿åå¼åé误å¤çâã xxx_reset() å xxx_add() 彿°ç¨ä¸ééåUDF䏿 ·çæ¹æ³æ¥å¤çå®ä»¬çUDF_ARGS åéã请åé 27.2.3.3èï¼âUDFåéå¤çâã å°is_nullåerrorçæé åéåææå°xxx_reset(), xxx_clear(), xxx_add() å xxx()è°ç¨ä¸æ ·ãä½ å¯ä»¥ç¨è¿ä¸ªæ¥æéä½ è·åä¸ä¸ªéè¯¯ææ è®ºxxx()æ¯å¦è¿åNULLçä¸ä¸ªç»æãä½ ä¸è½æä¸ä¸ªå符串åå°*errorï¼erroræåååèåéè䏿¯å符串ç¼å²åºã *is_null 对æ¯ä¸ä¸ªç»é½éç½®ï¼è°ç¨xxx_clear()åï¼ï¼ *error ä»ä¸éç½®ã 妿 xxx()è¿åæ¶ï¼*is_null æ *error 被设置ï¼MySQLè¿å NULLä½ä¸ºç»å½æ°çç»æã args åæ°æååçç»æå ç UDF_ARGS ç»æï¼
å¦ææ²¡æé误åçï¼åå§å彿°åºè¯¥è¿å0ï¼å¦åå°±è¿å1ã妿æé误åçï¼xxx_init() åºè¯¥å¨message åæ°åå¨ä¸ä¸ªä»¥nullç»å°¾çéè¯¯æ¶æ¯ãè¯¥æ¶æ¯è¢«è¿åç»å®¢æ·ç«¯ãæ¶æ¯ç¼å²åºæ¯ MYSQL_ERRMSG_SIZE å符é¿åº¦ï¼ä½ä½ åºè¯¥è¯çææ¶æ¯ä¿æå¨å°äº80个å符ï¼ä»¥ä¾¿å®è½éåæ åç»ç«¯å±å¹ç宽度ã 对äºlong long å double ç±»åç彿°ï¼ä¸»å½æ° xxx()çè¿åè¿å弿¯å½æ°å¼ãåç¬¦å½æ°è¿åä¸ä¸ªæåç»æçæéï¼å¹¶ä¸è®¾ç½® *result å *length 为è¿åå¼çå 容åé¿åº¦ãä¾å¦ï¼ memcpy(result, "result string", 13); *length = 13; è¢«ä¼ ç» xxx() 彿°çç»æç¼å²åºæ¯ 255 åèé¿ãå¦æä½ çç»æéåè¿ä¸ªé¿åº¦ï¼ä½ å°±ä¸éè¦æ å¿å¯¹ç»æçå ååé ã 妿åç¬¦ä¸²å½æ°éè¦è¿åä¸ä¸ªè¶ è¿255åèçå符串ï¼ä½ å¿ é¡»ç¨ malloc() å¨ä½ ç xxx_init() 彿°æè xxx() 彿°é为å符串åé 空é´ï¼å¹¶ä¸å¨ xxx_deinit() 彿°ééæ¾æ¤ç©ºé´ãä½ å¯ä»¥å°å·²åé å ååå¨å¨ UDF_INIT ç»æéç ptr ä½ç½®ä»¥å¤å°æ¥ xxx() è°ç¨ã请åé 27.2.3.1èï¼âUDF 对ç®å彿°çè°ç¨é¡ºåºâã è¦å¨ä¸»å½æ°ä¸ææä¸ä¸ª NULL çè¿åå¼ï¼è®¾ç½® *is_null 为 1 ï¼ *is_null = 1; è¦å¨ä¸»å½æ°ä¸ææé误è¿åï¼è®¾ç½® *error 为 1 ï¼ *error = 1; 妿 xxx() 对任æè¡è®¾ç½® *error 为 1 ï¼å¯¹äºä»»ä½ XXX()被è°ç¨çè¯å¥å¤ççå½åè¡åéåçä»»æè¡ï¼è¯¥å½æ°å¼ä¸º NULL ï¼çè³é½ä¸ä¸ºéåçè¡è°ç¨ xxx()ï¼ã å®ç°UDFçæä»¶å¿ é¡»å¨è¿è¡æå¡å¨ç主æºä¸ç¼è¯åå®è£ ãè¿ä¸ªæ¥éª¤å¨ä¸é¢ä»ç»ï¼ä»¥å å«å¨MySQLæºç ååçéçUDFæä»¶sql/udf_example.cc 为ä¾ã ç´§æ¥çä¸é¢çæä»¤æ¯å¯¹Unixçï¼å¯¹Windowsçæä»¤å¨æ¬èç¨åç»åºã udf_example.cc æä»¶å å«ä¸å彿°ï¼
ä¸ä¸ªå¯å¨æå è½½çæä»¶åºä½¿ç¨å¦ä¸è¿æ ·çå½ä»¤ç¼è¯ä¸ºä¸ä¸ªå¯å ±äº«ç对象æä»¶ï¼ shell> gcc -shared -o udf_example.so udf_example.cc å¦æä½ ä½¿ç¨gccï¼ä½ åºè¯¥è½ç¨ä¸ä¸ªæ´ç®åçå½ä»¤å建udf_example.so ï¼ shell> make udf_example.so éè¿è¿è¡MySQLæºç æ ä¸sqléçå¦ä¸å½ä»¤ï¼ä½ å¯ä»¥å®¹æå°ä¸ºä½ çç³»ç»å³å®æ£ç¡®çç¼è¯å¨éé¡¹ï¼ shell> make udf_example.o ä½ åºè¯¥è¿è¡ä¸ä¸ªç±»ä¼¼äºmakeææ¾ç¤ºé£æ ·çç¼è¯å½ä»¤ï¼é¤äºè¦å¨è¡å°¾éè¿å é¤-cé项ï¼å¹¶å¨è¡å°¾å ä¸å ä¸ -o udf_example.soãï¼å¨æäºç³»ç»ä¸ï¼ä½ å¯è½éè¦å¨å½ä»¤è¡çç-c é项ï¼ã ç¼è¯å¥½ä¸ä¸ªå 嫿UDFçå ±äº«ç®æ åï¼ä½ å¿ é¡»å®è£ å®å¹¶éç¥MySQLãä»udf_example.ccç¼è¯ä¸ä¸ªå ±äº«ç®æ æä»¶äº§çä¸ä¸ªåå类似äºudf_example.so çæä»¶ï¼ç¡®åååå¯è½å å¹³å°èå¼ï¼ãæè¿ä¸ªæä»¶å¤å¶å° /usr/lib è¿æ ·è¢«ä½ ç³»ç»ç卿ï¼è¿è¡æ¶ï¼é¾æ¥å¨æç´¢å°çç®å½ä¸ï¼æè æä½ æ¾å ±äº«ç®æ æä»¶çç®å½æ·»å å°é¾æ¥å¨é ç½®æä»¶ï¼å¦ï¼/etc/ld.so.conf ï¼ã 卿龿¥å¨çååæ¶ç³»ç»ç¹å®çï¼å¦ï¼å¨FreeBSD䏿¯ld-elf.so.1 ï¼å¨Linux䏿¯ ld.soï¼å¨Mac OS X䏿¯dyld ï¼ãæ¥çä¸ä¸ä½ ç³»ç»çææ¡£ï¼çç龿¥å¨çå忝ä»ä¹åå¦ä½é ç½®é¾æ¥å¨ã å¨è®¸å¤ç³»ç»ä¸ï¼ä½ ä¹å¯ä»¥è®¾ç½®ç¯å¢åéLD_LIBRARY æ LD_LIBRARY_PATH æåä½ æ¾UDFçç®å½ãdlopen æåä¼åè¯ä½ ï¼å¨ä½ ç³»ç»ä¸ç¨åªä¸ªåéåãä½ å¯ä»¥å¨mysql.server æ mysqld_safe å¯å¨èæ¬é设置è¿ä¸ªç¶åéå¯ mysqldã å¨ä¸äºç³»ç»ä¸ï¼é ç½®å¨æé¾æ¥å¨çldconfigä¸è½è¯å«ä¸æ¯ä»¥libåååå¼å¤´çå ±äº«ç®æ ãå¨è¿ç§æ åµä¸ï¼ä½ åºè¯¥æudf_example.so æ¹å为 libudf_example.soã å¨Windowsç³»ç»ä¸ï¼ä½ å¯ä»¥éè¿ä¸åæ¥éª¤ç¼è¯èªå®ä¹å½æ°ï¼
å ±äº«ç®æ æä»¶å®è£ å®ä»¥åï¼ä¸ºæ°å½æ°ä¿¡æ¯ä¿®æ¹ 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';
mysql>
CREATE AGGREGATE FUNCTION avgcost
->
RETURNS REAL 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; mysql> DROP FUNCTION avgcost; CREATE FUNCTION å DROP FUNCTION å£°ææ´æ°mysql æ°æ®åºä¸çfunc ç³»ç»è¡¨ã彿°åï¼ç±»ååå ±äº«åºååè¿è¡¨ä¸ãä½ å¿ é¡»æmysql æ°æ®åºçINSERT åDELETE æéæ¥å建åç§»é¤å½æ°ã ä½ ä¸è½ä½¿ç¨ CREATE FUNCTION å»ç°é´ä¸ä¸ªå åå·²ç»è¢«å建ç彿°ãå¦æä½ éè¦éæ°å®è£ ä¸ä¸ªå½æ°ï¼ä½ å¯ä»¥ç¨DROP FUNCTIONç§»é¤å®ï¼ç¶ååç¨CREATE FUNCTIONéæ°å®è£ å®ãä½ å¯è½ä¼éè¦è¿ä¹åï¼æ¯å¦ä½ éæ°ç¼è¯æ°çæ¬ç彿°ä»¥ä¾¿mysqldå¾å°è¿ä¸ªæ°çæ¬ãä¸ç¶ï¼æå¡å¨è¿ç»§ç»ä½¿ç¨æ§ççæ¬ã ä¸ä¸ªææç¨åºæ¯å·²è¢« CREATE FUNCTIONå è½½ä¸æ²¡æè¢«DROP FUNCTIONç§»é¤ç彿°ãææææå½æ°å¨æ¯æ¬¡æå¡å¨å¯å¨æ¶éæ°å è½½ï¼é¤éä½ ä½¿ç¨--skip-grant-tablesé项æ¥å¯å¨mysqldãè¿ç§æ åµä¸ï¼UDFçåå§åå°è¢«è·³è¿ï¼UDFä¸å¯ç¨ã MySQL éåä¸åæªæ½æ¥é²æ¢è¯¯ç¨èªå®ä¹å½æ°ã ä½ å¿ é¡»æ INSERT æéæè½ä½¿ç¨ CREATE FUNCTION åæ DELETE æéæè½ä½¿ç¨ DROP FUNCTIONãè¿æ¯å¾å¿ è¦çï¼å 为è¿äºå£°æå¨mysql.funcè¡¨éæ·»å åå é¤è¡ã é¤äºå¯¹åºä¸» xxx()彿°çxxx 符å·ï¼UDFåºè¯¥è³å°å®ä¹ä¸ä¸ªç¬¦å·ãè¿äºè¾ å©ç¬¦å·å¯¹åº xxx_init(), xxx_deinit(), xxx_reset(), xxx_clear() å xxx_add() 彿°ãmysqld 乿¯æä¸ä¸ªæ§å¶ä» æä¸ä¸ªxxx符å·çUDFæ¯å¦è¢«å è½½ç--allow-suspicious-udfsãè¿ä¸ªé项 é»è®¤æ¯å ³ï¼ä»¥é²æ¢ä»å ±äº«ç®æ æä»¶è䏿¯ä»è¿äºå·²å å«çåæ³UDFå è½½çä¼å¾ãå¦æä½ æä» å«xxx符å·çèçæ¬UDFï¼ä»¥åä¸è½éç¼è¯æ¥å å«è¾ å©ç¬¦å·çèçæ¬UDFï¼é£å°±æå¿ è¦é--allow-suspicious-udfs é项ãå¦åï¼ä½ åºè¯¥é¿å æå¼è¿ä¸ªé项ã UDF ç®æ æä»¶ä¸è½æ¾å¨ä»»æç®å½ãå®ä»¬å¿ é¡»ä½äºå¨æé¾æ¥å¨è¢«é ç½®æ¥æç´¢å°çä¸äºç³»ç»ç®å½ãä¸ºå¼ºå¶æ§è¡è¿ä¸ªéå¶å¹¶é²æ¢æå®è¢«å¨æé¾æ¥å¨æç´¢å°çç®å½ä¹å¤çè·¯å¾ï¼MySQLå¨å è½½å½æ°çæ¶åæ£æ¥å¨CREATE FUNCTION 䏿å®çå ±äº«ç®æ æä»¶åï¼ä»¥ååå¨mysql.func表ä¸çæä»¶çè·¯å¾åé符ãè¿é²æ¢éè¿ç´æ¥æä½mysql.func表æå®éæ³è·¯å¾åãæå ³UDFåè¿è¡æ¶é¾æ¥å¨ï¼è¯·åé 27.2.3.5èï¼âç¼è¯åå®è£ èªå®ä¹å½æ°âã ä¸é¢ä»ç»æ·»å æ°åºæå½æ°çæ¥éª¤ãè¦æ³¨æä½ ä¸è½æ·»å åºæå½æ°å°äºè¿å¶ååçéï¼å 为è¿ä¸ªæ¥éª¤å å«ä¿®æ¹MySQLæºä»£ç ãä½ å¿ é¡»ä»æºç ååçèªå·±ç¼è¯MySQLãå¦å¤è¦æ³¨æï¼å¦æä½ æMySQLç§»æ¤å°å¦ä¸ä¸ªçæ¬ï¼æ¯å¦æ°çæ¬æ¾åºæ¥çæ¶åï¼ï¼ä½ éè¦ç¨æ°çæ¬éå¤è¿ä¸ªæ·»å æ¥éª¤ã éåä¸åæ¥éª¤æ¥æ·»å MySQLæ°çåºæå½æ°ï¼
ææå½æ°é½å¿ é¡»æ¯çº¿ç¨å®å ¨çï¼æ¢å¥è¯è¯´å°±æ¯ï¼å¦ææ²¡æäºæ¥ä½ä¿æ¤ï¼ä¸è¦å¨å½æ°ä¸ä½¿ç¨ä»»ä½å ¨å±æéæåéã å¦æä½ æ³è¦ä»å½æ°::val(), ::val_int()æ::str()è¿åNULLï¼ä½ åºè¯¥è®¾null_value为1,å¹¶è¿å0ã 对äºç®æ 彿° ::str() æä¸äºéè¦èå¤èèä¹å¤ï¼:
å¨MySQLä¸ï¼ä½ å¯ä»¥ç¨C++å®ä¹ä¸ä¸ªæ¥éª¤ï¼å¨ä¸ä¸ªæ¥è¯¢è¢«åéå°å®¢æ·ç«¯ä¹å访é®åä¿®æ¹å ¶ä¸çæ°æ®ãä¿®æ¹å¯ä»¥ä¸è¡æ¥ä¸è¡å°åï¼æè æç §çº§å«æç»ï¼GROUPï¼å°åã æä»¬å建ä¸ä¸ªè便¥éª¤æ¥æ¼ç¤ºä½ å¯ä»¥åçã æ¤å¤ï¼æä»¬æ¨èä½ çä¸ä¸myluaãéè¿å®ä½ å¯ä»¥ç¨ LUAè¯è¨æè¿è¡æ¶éçä¸ä¸ª æ¥éª¤å è½½å°mysqldä¸ã analyse([max_elements,[max_memory]]) è¿ä¸ªæ¥éª¤å¨sql/sql_analyse.ccå®ä¹ï¼è¿ä¸ªæ¥éª¤æ£æ¥ä½ æ¥è¯¢çç»æï¼å¹¶ä¸è¿å对æ¤ç»æçä¸ä¸ªåæï¼
SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([ max_elements,[ max_memory]]) å½åæ¥è¯´ï¼ç¸å ³çææ¡£åªææºç ã æ£æ¥ä¸åæä»¶å¯ä»¥è·å¾å ³äºæ¥éª¤çææä¿¡æ¯ï¼
è¿æ¯MySQLåèæåçç¿»è¯çæ¬ï¼å ³äºMySQLåèæåï¼è¯·è®¿é®dev.mysql.comã åå§åèæåä¸ºè±æçï¼ä¸è±æçåèæåç¸æ¯ï¼æ¬ç¿»è¯çå¯è½ä¸æ¯ææ°çã |
||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||