精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL的match函數在sp中使用的Bug解析

數據庫 MySQL
在一次開發中在sp中使用MySQL PREPARE?以后,使用match AGAINST?語句作為prepare stmt的參數后,發現執行第二遍call會導致數據庫crash,于是開始動手調查問題發生的原因。

一、問題發現

在一次開發中在sp中使用MySQL PREPARE以后,使用match AGAINST語句作為prepare stmt的參數后,發現執行第二遍call會導致數據庫crash,于是開始動手調查問題發生的原因。

注:本次使用的 MySQL 數據庫版本為最新的debug版本。

SQL語句示例:

CREATE TABLE t1 (a INT, b VARCHAR(10));
DELIMITER $$
CREATE PROCEDURE p1()
begin
  declare a VARCHAR(200);
  declare b TEXT;
  set a = 'Only MyISAM tables';
  set b ='support collections'; 
  set @bb := match(a,b) AGAINST ('collections');    
  prepare stmt1 from 'select * from t1 where ?';   
  execute stmt1 using @bb;  
end$$
DELIMITER ;
執行結果:
mysql> call p1;
ERROR 1210 (HY000): Incorrect arguments to MATCH
mysql> call p1; 這里發現代碼crash了
ERROR 2013 (HY000): Lost connection to MySQL server during query

二、問題調查過程

1、首先查看錯誤堆棧信息,可以看到Item_func_match::val_real函數的item->real_item()->type()不等于FIELD_ITEM引起的,打印堆棧看了一下,此時的item->real_item()為Item_splocal,明顯不是FIELD_ITEM。

#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ffff7568859 in __GI_abort () at abort.c:79
#2  0x00007ffff7568729 in __assert_fail_base (fmt=0x7ffff76fe588 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", 
    assertion=0x55555bd2e340 "std::all_of(args, args + arg_count, [](const Item *item) { return item->real_item()->type() == FIELD_ITEM; })", file=0x55555bd2a9e0 "/mysql/sql/item_func.cc", 
    line=9769, function=<optimized out>) at assert.c:92
#3  0x00007ffff7579fd6 in __GI___assert_fail (
    assertion=0x55555bd2e340 "std::all_of(args, args + arg_count, [](const Item *item) { return item->real_item()->type() == FIELD_ITEM; })", file=0x55555bd2a9e0 "/mysql/sql/item_func.cc", 
    line=9769, function=0x55555bd2e300 "virtual double Item_func_match::val_real()") at assert.c:101
#4  0x0000555558f9e17e in Item_func_match::val_real (this=0x7fff2cc86928) 這里導致的crash
    at /mysql/sql/item_func.cc:9769
#5  0x0000555558f97f7e in Item_func_set_user_var::check (this=0x7fff2cc88200, use_result_field=false)
    at /mysql/sql/item_func.cc:8238
#6  0x00005555592d74d3 in set_var_user::check (this=0x7fff2cc88388)
    at /mysql/sql/set_var.cc:1874
#7  0x00005555592d5cd6 in sql_set_variables (thd=0x7fff2c001050, var_list=0x7fff2cc87210, opened=true)
    at /mysql/sql/set_var.cc:1442
#8  0x00005555594d89ed in mysql_execute_command (thd=0x7fff2c001050, first_level=false)
    at /mysql/sql/sql_parse.cc:4051
#9  0x000055555930c7a8 in sp_instr_stmt::exec_core (this=0x7fff2cc883d8, thd=0x7fff2c001050, 
    nextp=0x7fffe02ed8b4) at /mysql/sql/sp_instr.cc:1039
#10 0x000055555930ae0b in sp_lex_instr::reset_lex_and_exec_core (this=0x7fff2cc883d8, thd=0x7fff2c001050, 
    nextp=0x7fffe02ed8b4, open_tables=false) at /mysql/sql/sp_instr.cc:457
#11 0x000055555930bc74 in sp_lex_instr::validate_lex_and_execute_core (this=0x7fff2cc883d8, thd=0x7fff2c001050, 
    nextp=0x7fffe02ed8b4, open_tables=false) at /mysql/sql/sp_instr.cc:771
#12 0x000055555930c3ad in sp_instr_stmt::execute (this=0x7fff2cc883d8, thd=0x7fff2c001050, nextp=0x7fffe02ed8b4)
    at /mysql/sql/sp_instr.cc:956
#13 0x00005555592fa772 in sp_head::execute (this=0x7fff2cc76da0, thd=0x7fff2c001050, merge_da_on_success=true)
    at /mysql/sql/sp_head.cc:2279
#14 0x00005555592fcec2 in sp_head::execute_procedure (this=0x7fff2cc76da0, thd=0x7fff2c001050, args=0x0)
    at /mysql/sql/sp_head.cc:2995
#15 0x00005555593661c9 in do_execute_sp (thd=0x7fff2c001050, sp=0x7fff2cc76da0, args=0x0)
    at /mysql/sql/sql_call.cc:86

2、要想獲取sp參數的實際item,應該調用this_item()方法,但是也許作者本來就不想讓match支持sp參數,因此這里的寫法是對的。但是本來代碼不應該運行到這里,因為本來應該直接報錯。

double Item_func_match::val_real() {
  assert(fixed);
  assert(!has_rollup_expr());
  assert(std::all_of(args, args + arg_count, [](const Item *item) {
    return item->real_item()->type() == FIELD_ITEM; ==>這里的item->real_item()->type()說明不支持Item_splocal
  }));

3、接著繼續調查,查看第一次報錯的地方的代碼,找到Item_func_match::fix_fields,看到了第一次報錯的地方的代碼item->type() != Item::FIELD_ITEM,因此代碼運行應該在這里報錯。但是為何第二次執行會運行到Item_func_match::val_real而不是在Item_func_match::fix_fields就直接報錯返回呢?仔細查看下面的代碼,發現下面的代碼有1個地方有錯誤。

bool Item_func_match::fix_fields(THD *thd, Item **ref) {
  if (Item_func::fix_fields(thd, ref) || fix_func_arg(thd, &against) || 
  上面這里Item_func::fix_fields執行完后使fixed=true
  但是如果后面有任何報錯的地方導致返回的話,這個值沒有修改回false
  會導致第二次call sp不會再次執行Item_func_match::fix_fields。
      !against->const_for_execution()) {
    thd->mark_used_columns = save_mark_used_columns;
    my_error(ER_WRONG_ARGUMENTS, MYF(0), "AGAINST");
    return true;
  }
  for (uint i = 0; i < arg_count; i++) {
    item = args[i] = args[i]->real_item();
    if (item->type() != Item::FIELD_ITEM || 
        /* Cannot use FTS index with outer table field */
        item->is_outer_reference()) {
      my_error(ER_WRONG_ARGUMENTS, MYF(0), "MATCH");
      return true;
    }

三、問題解決方案

通過以上代碼解析后作如下修改,正確給fixed賦值,這樣就可以保證每次call sp的時候如果遇到報錯再次運行還會重新執行fix_fields。

bool Item_func_match::fix_fields(THD *thd, Item **ref) {
  if (Item_func::fix_fields(thd, ref) || fix_func_arg(thd, &against) ||
      !against->const_for_execution()) {
    fixed = false; ==>這里需要重新把fixed賦值為false
    thd->mark_used_columns = save_mark_used_columns;
    my_error(ER_WRONG_ARGUMENTS, MYF(0), "AGAINST");
    return true;
  }
  thd->mark_used_columns = save_mark_used_columns;
  fixed = false;  ==>這里需要重新把fixed賦值為false
    for (uint i = 0; i < arg_count; i++) {
    item = args[i] = args[i]->real_item()->this_item();
    if (item->type() != Item::FIELD_ITEM ||
        /* Cannot use FTS index with outer table field */
        item->is_outer_reference()) {
      my_error(ER_WRONG_ARGUMENTS, MYF(0), "MATCH");
      return true;
    }
    中間省略
   fixed = true; ==>最后沒有問題了再賦值為true
   return false;

現在重新執行call sp,沒有問題了。

mysql> call p1;
ERROR 1210 (HY000): Incorrect arguments to MATCH
mysql> call p1;
ERROR 1210 (HY000): Incorrect arguments to MATCH

四、問題總結

本次只是解決了match的fix_fields問題,但是如果想讓 match 支持 sp 的參數,即Item_splocal的參數的話,代碼里面還要做相應修改,包括set @bb := match(a,b) AGAINST ('collections'); 這里面生成的Item_func_match會在這句執行完以后被 cleanup 掉,等到下一句 prepare 想再次使用它的時候會因為找不到該item發生問題,這個是重構 match函數支持 sp 參數需要注意的點。

責任編輯:武曉燕 來源: GreatSQL社區
相關推薦

2022-08-02 11:31:46

Python語法代碼

2024-05-08 08:56:09

GreatSQL內存宏定義

2022-08-18 20:21:33

MySQLpreparebug

2019-01-17 10:25:56

Python編程語言程序員

2009-04-10 22:06:09

Vmwareesx虛擬化

2010-07-19 13:32:55

Perl用戶函數

2024-04-03 08:33:31

MySQLCursorcursor

2021-07-29 10:00:43

XMLXMLStarletLinux

2009-06-24 10:49:08

Unix

2014-08-01 15:16:05

SwiftC語言

2018-08-21 09:00:30

Linuxtop命令

2024-03-26 09:25:35

RustSerde重命名

2024-11-25 07:00:00

箭頭函數JavaScriptReact

2009-04-14 14:53:06

C++Lambda函數多線程

2009-11-30 17:16:34

PHP函數preg_m

2010-07-13 10:13:35

Perl內部函數

2015-08-25 10:20:47

云堆棧hypervisor虛擬化

2015-04-17 16:44:22

swiftOC

2022-04-07 12:53:40

UbuntuLinux

2009-06-25 16:49:24

Hibernate
點贊
收藏

51CTO技術棧公眾號

久久网站最新地址| 亚洲伊人观看| 精品国产精品网麻豆系列| 欧美精品久久久久久久自慰| 亚洲三级中文字幕| 日本sm残虐另类| 欧美成人免费播放| 男女黄床上色视频| 99久久这里有精品| 激情成人在线视频| 国产精品99久久久久久大便| 免费看黄色一级视频| 日本中文字幕一区二区有限公司| 欧美日本高清一区| 人妻视频一区二区| 欧美电影在线观看完整版| 欧美三级视频在线观看| 成年人午夜免费视频| 欧美69xxx| 26uuu精品一区二区在线观看| 国产精品免费看久久久香蕉| 99免费在线观看| 天天综合精品| 国产一区二区三区高清在线观看| 国产精品99精品无码视亚| 高清电影一区| 午夜视频一区在线观看| 国产一区一区三区| 成人h小游戏| 91亚洲精品乱码久久久久久蜜桃| 亚洲综合自拍一区| 中文字幕欧美色图| 久久一二三四| 91av在线播放| 国产精品自拍视频一区| 女同性一区二区三区人了人一| 亚洲乱码一区二区| 国产黄色三级网站| av在线亚洲色图| 欧美一区二区三区日韩| the porn av| 日本韩国欧美| 色av成人天堂桃色av| 欧美 丝袜 自拍 制服 另类| 成人在线免费观看黄色| 亚洲男人电影天堂| 亚洲一区二区在线免费观看| 高清国产福利在线观看| 国产亚洲一区二区在线观看| 麻豆av一区二区| 午夜视频免费看| 久久在线观看免费| 快播日韩欧美| 日本天堂在线| 久久综合给合久久狠狠狠97色69| 久久99精品国产一区二区三区| 乱色精品无码一区二区国产盗| 国产一区二区三区免费播放| 91亚洲永久免费精品| 国产精品无码在线播放 | 久久久久久久97| 强行糟蹋人妻hd中文| 欧美激情第10页| 欧美多人爱爱视频网站| 99热精品免费| 国模大胆一区二区三区| 韩国国内大量揄拍精品视频| 91浏览器在线观看| 性欧美xxxx大乳国产app| 国产97在线观看| 中文天堂在线视频| 国产精品中文有码| 国产精品12| 欧洲毛片在线| 国产精品欧美极品| 久久久天堂国产精品| 91禁在线看| 欧美影片第一页| 91欧美一区二区三区| 一区二区在线视频观看| 日韩av在线影院| 日本美女bbw| 欧美日韩免费| 日本一区二区不卡| 97超碰资源站| 成人av电影在线网| 亚欧精品在线| 国产精品探花在线| 色婷婷综合久色| 欧美在线aaa| 精品国产一区二区三区2021| 亚洲激情小视频| 欧美狂猛xxxxx乱大交3| 国产精品毛片一区二区在线看| 欧美日韩国产成人| 美女又爽又黄免费视频| 国产在线精品一区二区夜色| 九九九九久久久久| wwwxxx在线观看| 亚洲午夜在线电影| 国产九九在线视频| 国产欧美三级电影| 日韩色av导航| 99热在线观看免费精品| 极品美女销魂一区二区三区| 精品国产乱码久久久久久108| h网站视频在线观看| 亚洲国产精品天堂| 在线看的黄色网址| 免费观看成人www动漫视频| 中文字幕在线观看日韩| 日韩免费观看一区二区| 久久99精品国产91久久来源| 久久一区二区精品| 亚洲精品天堂| 欧美日韩免费在线视频| 波多野结衣先锋影音| 我不卡影院28| 国产精品久久激情| 飘雪影院手机免费高清版在线观看| 亚洲三级在线免费| 四季av一区二区| 女同另类激情重口| 九九视频直播综合网| 中文在线a天堂| 久久美女高清视频| 亚洲人成无码网站久久99热国产| 久久福利在线| 亚洲欧洲激情在线| www.国产高清| av午夜一区麻豆| 国产精品69久久久| 日本99精品| 久久亚洲成人精品| 11024精品一区二区三区日韩| 久久日韩精品一区二区五区| 可以在线看的av网站| 伊人精品综合| 色综合久久中文字幕综合网小说| 91亚洲欧美激情| 国产精品人成在线观看免费| 丁香婷婷激情网| 伊人久久综合影院| 欧美专区在线播放| 男人av在线| 日韩欧美国产免费播放| 中文字幕免费在线播放| 亚洲国产精品一区制服丝袜| 国产高清一区视频| 国产经典三级在线| 亚洲精品美女在线观看播放| 1级黄色大片儿| av毛片久久久久**hd| 国产资源在线视频| 日韩高清影视在线观看| 97在线视频免费| 欧美新色视频| 日本韩国欧美一区| 刘亦菲国产毛片bd| 久久99久久久久久久久久久| 在线视频欧美一区| 欧美久久一区二区三区| 色综合久久久888| 三级小视频在线观看| 欧美日韩国产激情| 成人免费网站黄| 日韩成人午夜电影| 天天综合五月天| 91精品日本| 97精品在线观看| 欧美婷婷久久五月精品三区| 欧美综合久久久| 国产美女久久久久久| 国产精品1024| 怡红院av亚洲一区二区三区h| 免费精品国产| 国产日韩欧美在线视频观看| 中中文字幕av在线| 日韩精品免费看| 亚洲综合图片网| 最新热久久免费视频| 最新版天堂资源在线| 视频一区二区国产| 欧美精品一区二区性色a+v| 国产精品午夜av| 国产精品久久久久av免费| 超碰在线免费公开| 亚洲开心激情网| 国产精品久久久久久久久久久久久久久久久久| 亚洲免费资源在线播放| 免费a级黄色片| 国产精品自在在线| 亚洲人成无码www久久久| 久久久久久久久久久妇女| 国产精品一区二区三区四区五区| 男人皇宫亚洲男人2020| 欧美成人精品一区二区| 亚洲av成人精品毛片| 欧美视频在线一区| 日本少妇吞精囗交| 国产精品免费网站在线观看| 国产视频精品视频| 精品一区在线看| 亚洲欧洲日产国码无码久久99| 91麻豆精品国产91久久久平台| 国产精品久久九九| 久久精品嫩草影院| 欧美在线观看网站| 蜜臀av在线播放| 久久久国产视频91| 久草视频在线看| 亚洲国产精品电影| 国产成年妇视频| 欧美性猛交xxxx乱大交退制版| 一区二区三区免费高清视频| 国产精品天干天干在线综合| 香蕉视频黄色在线观看| 成人一区二区视频| caoporm在线视频| 日韩高清一区在线| 99精品人妻少妇一区二区| 自拍偷拍欧美专区| 亚洲一区二区在线看| 精品一区二区三| 欧美国产一区二区在线| 91九色鹿精品国产综合久久香蕉| 成人黄色网免费| 日韩一级二级| 国产激情久久久久| 在线天堂新版最新版在线8| 久久久久久久爱| 人人超在线公开视频| 日韩三级影视基地| 日本美女在线中文版| 国产亚洲美女精品久久久| 五月婷婷六月丁香| 亚洲激情中文字幕| 天堂av中文在线资源库| 亚洲国产精品成人av| 亚洲成人一级片| 日韩欧美精品三级| www.色播.com| 日韩欧美视频一区| 成人黄色免费视频| 欧美r级电影在线观看| 精品人妻无码一区二区| 日韩精品资源二区在线| 亚洲国产精品视频在线| 日韩欧美在线影院| 丰满人妻一区二区三区免费视频| 日韩精品一区在线| 韩国av免费在线| 亚洲第一精品电影| 手机看片国产1024| 亚洲精品一区二区久| 牛牛影视精品影视| 亚洲人成自拍网站| jizz亚洲| 欧美日韩成人在线播放| 18aaaa精品欧美大片h| 97超级碰碰人国产在线观看| 日韩理论视频| 国产精品高潮呻吟视频| 日本午夜精品久久久久| 91麻豆桃色免费看| 国产精品丝袜在线播放| 欧美一区少妇| 99久久国产综合精品成人影院| a级网站在线观看| 在线不卡欧美| 可以免费观看av毛片| 麻豆国产欧美一区二区三区| 欧美专区第二页| 99国产精品久久久久久久久久久 | 91国内精品久久| 成人美女大片| 91在线网站视频| 精品福利一区| 亚洲成人av动漫| 国内激情久久| 久久99999| 国产 欧美在线| 高潮毛片无遮挡| 亚洲人成影院在线观看| www.毛片.com| 91精品国模一区二区三区| 深爱五月激情五月| 一区二区三区天堂av| 成人免费在线| 热久久这里只有精品| www.成人| 欧美日韩综合网| 欧美69wwwcom| 国产视频在线视频| 国产不卡视频一区| 少妇无套高潮一二三区| 亚洲国产欧美日韩另类综合 | 超碰超碰人人人人精品| 成人免费观看网址| 亚洲另类av| 妺妺窝人体色www看人体| 丝袜亚洲另类欧美| 中文字幕在线国产| 国产精品国产三级国产aⅴ入口 | 亚洲成人国产精品| 成人动漫在线免费观看| 97视频在线播放| 在线日韩三级| 欧美下载看逼逼| 91久久亚洲| 中国老熟女重囗味hdxx| 国产亲近乱来精品视频| 日韩av黄色片| 日韩视频免费直播| 在线视频婷婷| 青草青草久热精品视频在线观看| 亚洲超碰在线观看| 伊人天天久久大香线蕉av色| 亚洲一区二区三区免费在线观看 | 99久久婷婷国产综合精品青牛牛| 亚洲春色在线视频| 亚欧美中日韩视频| 一级黄色片毛片| 亚洲专区一二三| aa视频在线免费观看| 按摩亚洲人久久| 粉嫩av一区二区三区四区五区| 久久久久久国产精品免费免费| 国产综合网站| 日本一本在线视频| 国产女人18水真多18精品一级做| 国产精品人人人人| 亚洲国产高清自拍| 24小时免费看片在线观看| eeuss一区二区三区| 午夜久久99| 欧美污在线观看| 亚洲精品视频自拍| www.国产三级| 精品中文字幕在线2019| 精品国产麻豆| 国风产精品一区二区| 国产乱色国产精品免费视频| 中文字幕电影av| 91精品国产高清一区二区三区蜜臀| 91caoporn在线| 国产精品一二三在线| 国产精品久久久久蜜臀| 日本成人在线免费观看| 一区二区三区精品视频| 亚洲AV无码一区二区三区性| 欧美激情欧美激情在线五月| 97久久综合区小说区图片区| 中文字幕日韩精品无码内射| 国产福利一区在线| 久久久久久久久久综合| 欧美精品一区二区不卡| 日韩电影毛片| 日韩精品欧美在线| 麻豆91在线看| 岛国毛片在线观看| 亚洲国产一区二区三区四区| 日韩欧美精品一区二区三区| 女人一区二区三区| 久久99国产精品成人| 九九久久免费视频| 亚洲精品大尺度| 亚洲四虎影院| 激情五月五月婷婷| 成人性视频网站| 国产主播第一页| 久久综合久久八八| 精品精品国产毛片在线看| 日本精品久久久久中文字幕| 中文字幕不卡在线| 亚洲高清在线观看视频| 国产ts一区二区| 亚州av乱码久久精品蜜桃| zjzjzjzjzj亚洲女人| 91黄色免费看| 91蜜桃在线视频| 欧美欧美一区二区| 极品少妇xxxx精品少妇偷拍| 日韩免费一级片| 久久精品视频在线播放| 国产精品22p| 亚洲免费看av| 亚洲成人免费影院| jizz日韩| 韩国精品一区二区三区六区色诱| 青娱乐精品视频| 欧美日韩大片在线观看| 亚洲人成电影网站| 试看120秒一区二区三区| 99色精品视频| 一区二区三区日韩欧美| 黄色av免费在线看| 国产欧美一区二区视频| 久久成人麻豆午夜电影| 欧美 日韩 精品|