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

MySQL的多層SP中Cursor的m_max_cursor_index相關(guān)BUG分析

數(shù)據(jù)庫 MySQL
在MySQL的sp里面使用cursor的話,因?yàn)閙_max_cursor_index?只用于統(tǒng)計(jì),不用于實(shí)際賦值和計(jì)算過程,因此不影響使用。但是如果要用這個(gè)值用于二次開發(fā),就要注意到這個(gè)問題。

一、問題發(fā)現(xiàn)

在一次開發(fā)中在sp中使用多層cursor的時(shí)候想知道每層的m_max_cursor_index值分別是多少,以用來做后續(xù)開發(fā)。于是做了以下的試驗(yàn),但是發(fā)現(xiàn)第一個(gè)level=2那層的m_max_cursor_index的值有點(diǎn)問題。

注:本次使用的MySQL數(shù)據(jù)庫版本為最新的debug版本。

SQL語句示例:

greatsql> CREATE TABLE t1 (a INT, b VARCHAR(10));

以下注釋里面是該層sp_pcontext的參數(shù)值。
DELIMITER $$
CREATE PROCEDURE processnames() -- level=0,m_max_cursor_index=1+8+1
BEGIN
    DECLARE nameCursor0 CURSOR FOR SELECT * FROM t1; -- level=1,m_cursor_offset=0,m_max_cursor_index=1+8+1
    begin
    DECLARE nameCursor1 CURSOR FOR SELECT * FROM t1; -- level=2,m_cursor_offset=1,m_max_cursor_index=1+8 ☆問題點(diǎn)
       begin
   DECLARE nameCursor2 CURSOR FOR SELECT * FROM t1; -- level=3,m_cursor_offset=2,m_max_cursor_index=1
            DECLARE nameCursor3 CURSOR FOR SELECT * FROM t1; -- level=3,m_cursor_offset=2,m_max_cursor_index=2
            DECLARE nameCursor4 CURSOR FOR SELECT * FROM t1; -- level=3,m_cursor_offset=2,m_max_cursor_index=3
            DECLARE nameCursor5 CURSOR FOR SELECT * FROM t1; -- level=3,m_cursor_offset=2,m_max_cursor_index=4
        end;
    end;
    begin
  DECLARE nameCursor6 CURSOR FOR SELECT * FROM t1; -- level=2,m_cursor_offset=1,m_max_cursor_index=1
    end;
END $$
DELIMITER ;

首先查看上面的sp的code,可以發(fā)現(xiàn)nameCursor6和nameCursor1屬于同一層,因此他們的offset值一樣。

greatsql>  show procedure code processnames;
+-----+---------------------------------------+
| Pos | Instruction                           |
+-----+---------------------------------------+
|   0 | cpush nameCursor0@0: SELECT * FROM t1 |
|   1 | cpush nameCursor1@1: SELECT * FROM t1 |
|   2 | cpush nameCursor2@2: SELECT * FROM t1 |
|   3 | cpush nameCursor3@3: SELECT * FROM t1 |
|   4 | cpush nameCursor4@4: SELECT * FROM t1 |
|   5 | cpush nameCursor5@5: SELECT * FROM t1 |
|   6 | cpop 4                                |
|   7 | cpop 1                                |
|   8 | cpush nameCursor6@1: SELECT * FROM t1 |
|   9 | cpop 1                                |
|  10 | cpop 1                                |
+-----+---------------------------------------+
11 rows in set (6.02 sec)

然后通過debug查看每層sp_pcontext的參數(shù)值(相關(guān)參數(shù)值已經(jīng)在上面標(biāo)識(shí)出),發(fā)現(xiàn)第一個(gè)level=2的sp_pcontext的m_max_cursor_index值多了很多,預(yù)期值應(yīng)該是4+1,但是實(shí)際是8+1,而上面的層都沒錯(cuò),這說明代碼最里面那層m_max_cursor_index賦值錯(cuò)了。

二、問題調(diào)查過程

1、發(fā)現(xiàn)了問題點(diǎn)就看看代碼里面對(duì)于每層的m_max_cursor_index是怎么賦值的。

1、初始化sp_pcontext的時(shí)候所有的參數(shù)都為0
sp_pcontext::sp_pcontext(THD *thd) 
    : m_level(0),
      m_max_var_index(0),
      m_max_cursor_index(0)...{init(0, 0, 0, 0);}

2、每加一層sp_pcontext,當(dāng)前的m_cursor_offset=上一層cursor個(gè)數(shù)
sp_pcontext::sp_pcontext(THD *thd, sp_pcontext *prev,  
                         sp_pcontext::enum_scope scope)
    : m_level(prev->m_level + 1),
      m_max_var_index(0),
      m_max_cursor_index(0)... {init(prev->current_cursor_count());}
void sp_pcontext::init(uint cursor_offset) {m_cursor_offset = cursor_offset;}
uint current_cursor_count() const {
    return m_cursor_offset + static_cast<uint>(m_cursors.size());
}

3、退出當(dāng)前sp_pcontext層,需要把當(dāng)前的max_cursor_index()信息值賦值給上一層的m_max_cursor_index,即當(dāng)前的cursor數(shù)量累加給上一層
sp_pcontext *sp_pcontext::pop_context() {
    uint submax = max_cursor_index();
    if (submax > m_parent->m_max_cursor_index)
      m_parent->m_max_cursor_index = submax;
}
uint max_cursor_index() const {
    return m_max_cursor_index + static_cast<uint>(m_cursors.size());
  }

4、每次增加一個(gè)cursor,m_max_cursor_index值遞增,m_max_cursor_index是計(jì)數(shù)器。
bool sp_pcontext::add_cursor(LEX_STRING name) {
  if (m_cursors.size() == m_max_cursor_index) ++m_max_cursor_index;

  return m_cursors.push_back(name);
}

2、根據(jù)第一步的分析,只在最里面那層的m_max_cursor_index累加出來計(jì)算錯(cuò)誤,看看上面的累加過程,是用max_cursor_index()值來累加的,于是查看max_cursor_index()函數(shù)的實(shí)現(xiàn):

uint max_cursor_index() const {
    return m_max_cursor_index + static_cast<uint>(m_cursors.size());
  }

這里是把當(dāng)前層的m_max_cursor_index值加上m_cursors.size(),但是在函數(shù)add_cursor里面,m_cursors數(shù)組每增加一個(gè)cursor,m_max_cursor_index都要加1,也就是說在最里面那層sp_pcontext的計(jì)算重復(fù)了,計(jì)算了2遍m_cursors.size(),導(dǎo)致上面的level=2那層的m_max_cursor_index值變成2*4=8了。到這里問題點(diǎn)發(fā)現(xiàn)。

三、問題解決方案

通過以上代碼解析后,可以考慮只對(duì)最里面那層sp_pcontext的max_cursor_index()取值進(jìn)行修改,最里面那層的sp_pcontext沒有m_children,因此可以用這個(gè)數(shù)組值進(jìn)行判斷。代碼作如下修改:

uint max_cursor_index() const {
    if(m_children.size() == 0) -- 最里面那層sp_pcontext直接返回m_max_cursor_index的值。
     return m_max_cursor_index; -- 可以改為static_cast<uint>(m_cursors.size()),二者值一樣。
    else -- 上層sp_pcontext返回下層所有sp_pcontext的m_max_cursor_index的值,再加上當(dāng)前層的m_cursors.size()值。
        return m_max_cursor_index + static_cast<uint>(m_cursors.size());
}

四、問題總結(jié)

在MySQL的sp里面使用cursor的話,因?yàn)閙_max_cursor_index只用于統(tǒng)計(jì),不用于實(shí)際賦值和計(jì)算過程,因此不影響使用。但是如果要用這個(gè)值用于二次開發(fā),就要注意到這個(gè)問題。上面的修改方案只是其中一個(gè)解決方案,也可以根據(jù)自己的需要去改add_cursor的m_max_cursor_index的賦值過程。

這次發(fā)現(xiàn)的問題屬于不參與計(jì)算的bug,但卻影響開源代碼的后續(xù)開發(fā),在實(shí)際開發(fā)應(yīng)用中類似的問題也要注意,一不小心就會(huì)踩坑。

責(zé)任編輯:武曉燕 來源: GreatSQL社區(qū)
相關(guān)推薦

2025-03-17 10:01:07

2025-01-03 08:50:23

2025-07-18 09:20:31

2025-05-14 16:39:21

2025-11-11 03:00:00

CursorAI開發(fā)模式

2025-06-06 08:13:47

2024-05-08 08:56:09

GreatSQL內(nèi)存宏定義

2025-04-07 02:30:00

Cursor前端

2025-05-09 08:21:29

2025-03-19 09:14:15

CursorTun模式LLM

2023-07-05 08:21:24

MySQL函數(shù)sp

2025-05-23 09:32:44

2025-04-29 08:11:15

2025-01-02 14:10:41

2025-06-13 08:44:37

2025-09-03 01:48:00

Cursor技巧AI

2011-04-19 15:38:16

MongodbCursor

2024-12-23 08:01:27

2025-05-09 08:11:07

AICursor編程

2024-09-13 10:01:51

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

色一情一乱一伦| 国产成人久久777777| www.热久久| 国产欧美日本| 日韩一区二区av| 人妻换人妻a片爽麻豆| 成人开心激情| 亚洲国产精品综合小说图片区| 97国产精品视频人人做人人爱| 超碰人人cao| 毛片无码国产| 一区二区在线观看不卡| 亚洲一区二区少妇| www黄色日本| 97超碰人人澡| 黄色网址在线播放| 免费的成人av| 91成人精品网站| 91精品少妇一区二区三区蜜桃臀| 国产精品蜜月aⅴ在线| 夜夜操天天操亚洲| 亚洲精品中字| 国产精品无码专区av免费播放| 国产精品国产一区| 亚洲免费av电影| 日韩av影视大全| 成人自拍视频网| 欧美午夜性色大片在线观看| 国产高清免费在线| 最新真实国产在线视频| 美女任你摸久久| 久久不射电影网| 性猛交娇小69hd| 日韩精品免费一区二区夜夜嗨| 色综合久久88色综合天天6| 成人毛片100部免费看| 一广人看www在线观看免费视频| 精品一区二区三区免费观看| 日本韩国欧美精品大片卡二| 香蕉视频一区二区| 欧美日本一区二区高清播放视频| 亚洲激情视频在线观看| 国偷自产av一区二区三区麻豆| 成人免费无遮挡| 在线国产一区二区| 懂色av中文字幕一区二区三区| 日韩在线www| 国产一二三四视频| 国产精品x8x8一区二区| 在线免费观看日本一区| 免费黄色日本网站| 超级碰碰久久| 91福利资源站| 一区二区三区入口| 99在线视频影院| 婷婷一区二区三区| 国模吧无码一区二区三区| 伊人久久国产| 欧美中文字幕亚洲一区二区va在线| 男女啪啪的视频| 成视频免费观看在线看| 一区二区三区色| 国产av熟女一区二区三区| 欧美xxxx黑人又粗又长| 亚洲一二三四久久| 日本福利视频在线| 日本免费久久| 欧美日韩黄视频| 亚洲涩涩在线观看| 国产一区二区三区免费观看在线| 色综合久久久久综合| 在线视频日韩一区 | a亚洲天堂av| 精品免费国产| 亚洲成人第一区| www.欧美精品一二区| 精品久久蜜桃| 亚洲精品综合久久| 91色乱码一区二区三区| 日韩欧美一区二区三区四区五区 | 成人免费高清在线观看| 精品视频高清无人区区二区三区| 国产伦精品一区二区三区视频痴汉| 日韩午夜免费| 韩国欧美国产1区| 欧美成人精品三级在线观看| 播金莲一级淫片aaaaaaa| 教室别恋欧美无删减版| 久久色免费在线视频| 国产稀缺真实呦乱在线| 久久久久中文| 亚洲一区中文字幕在线观看| 秋霞av鲁丝片一区二区| 国产三级久久久| 欧美婷婷久久| 黄网在线免费| 亚洲美女免费在线| 香港三级韩国三级日本三级| 久久精品国产精品亚洲毛片| 亚洲精品一区二区三区四区高清 | 99久久久精品| 一级做a爰片久久| 黑人极品ⅴideos精品欧美棵| 亚洲免费在线观看| av免费在线播放网站| 久久伦理中文字幕| 国产午夜一区二区| 香蕉视频一区二区| 国产一区二区三区久久久| 免费一区二区三区| 欧美性受ⅹ╳╳╳黑人a性爽| 亚洲综合丝袜美腿| av中文字幕网址| 一区二区视频| 色婷婷av一区二区三区在线观看| 国产高清视频免费在线观看| 小说区亚洲自拍另类图片专区| 久久综合88中文色鬼| 日日骚av一区二区| 国产xxx精品视频大全| 一本一道久久a久久综合精品| 99在线视频观看| 欧美熟乱第一页| 国产精品探花在线播放| 色婷婷中文字幕| 成年永久一区二区三区免费视频| 欧美性生交xxxxx久久久| 精产国品一二三区| 色88久久久久高潮综合影院| 日韩av手机在线观看| 天堂在线视频免费| 亚洲va欧美va人人爽午夜| 韩国三级hd中文字幕有哪些| 欧美gay男男猛男无套| 国产精品91一区| 青草久久伊人| 亚洲天堂免费看| 高潮一区二区三区| 久久精品国产68国产精品亚洲| 欧美成人性生活| 国产又粗又猛又黄又爽| 国产精品伦理在线| 色国产在线视频| 色喇叭免费久久综合网| 成人av番号网| 秋霞a级毛片在线看| 精品污污网站免费看| 潮喷失禁大喷水aⅴ无码| 麻豆精品国产91久久久久久| 亚洲一卡二卡| 国产高清亚洲| 欧美肥臀大乳一区二区免费视频| 黄色免费av网站| 久久久噜噜噜久久中文字幕色伊伊| 亚洲欧美国产一区二区| 国产精品黄色片| www.亚洲免费视频| 国产丰满美女做爰| 亚洲自拍偷拍麻豆| 国产精品无码在线| 91tv官网精品成人亚洲| 国产成人aa精品一区在线播放| 国内老熟妇对白hdxxxx| 玉足女爽爽91| 偷偷色噜狠狠狠狠的777米奇| 羞羞色午夜精品一区二区三区| 欧洲亚洲免费视频| www.视频在线.com| 欧美一区在线视频| 日韩黄色三级视频| 国产拍欧美日韩视频二区| 国产探花在线看| 国产精品久久| 91免费在线观看网站| a√中文在线观看| 亚洲香蕉成人av网站在线观看| 日本在线视频免费观看| 97欧美成人| 樱桃国产成人精品视频| 男人网站在线观看| 日韩精品一卡二卡三卡四卡无卡| 国产精品一区二区欧美| 玛雅亚洲电影| 欧美大肥婆大肥bbbbb| 天堂中文资源在线| 91精品国产综合久久精品| 国产无遮挡aaa片爽爽| 高清日韩电视剧大全免费| 久久精品免费一区二区| 中文精品久久| 亚洲自拍小视频| 小视频免费在线观看| 北条麻妃久久精品| 国产毛片一区二区三区va在线| 国产精品久久久久aaaa| 日韩一区二区三区不卡视频| 欧美理论在线| 手机看片福利永久国产日韩| 国产主播性色av福利精品一区| 欧美富婆性猛交| 九九在线视频| 欧美v日韩v国产v| 中文字幕 国产| 欧美日韩国产在线| 日本少妇高清视频| 日本一区二区综合亚洲| 亚洲一区二区三区四区av| 麻豆精品视频在线观看视频| 热这里只有精品| 九九热线有精品视频99| 成人av免费在线看| 福利成人导航| 美日韩在线视频| 天天干天天爱天天操| 在线播放中文字幕一区| 午夜久久久久久久久久影院| 午夜不卡一区| 日韩www在线| 亚洲精品久久久久久久久久久久久久| 一区二区在线观看免费视频播放 | 国产在线精品一区在线观看麻豆| 黄色一级视频播放| 精品伊人久久久| 亚洲a中文字幕| 欧美成人高清视频在线观看| 日韩av第一页| 91av亚洲| 69久久夜色精品国产69| 黄色网址在线播放| 91精品国产福利| 91福利免费视频| 精品视频免费在线| 亚洲精品无码久久久久| 在线亚洲高清视频| 日韩手机在线视频| 高跟丝袜一区二区三区| 91国产丝袜播放在线| 亚洲午夜精品网| 国产在线视频二区| 亚洲一二三四久久| 日本三级2019| 婷婷激情综合网| 精品欧美一区二区三区免费观看| 日本一区二区免费在线观看视频| 欧美xxxx黑人| 国产精品系列在线播放| 中文字幕日韩久久| 国产精品99久久久久| 91精产国品一二三| 成人av在线资源网| 三级黄色片网站| 久久众筹精品私拍模特| 日本激情小视频| 国产精品午夜在线| 极品色av影院| 一区二区三区日韩精品| 国产在线拍揄自揄拍| 欧美色视频日本版| 精品乱码一区内射人妻无码| 亚洲高清三级视频| 精品成人久久久| 欧洲国产伦久久久久久久| 97超碰中文字幕| 欧美大片拔萝卜| 97超视频在线观看| 日韩一级黄色片| 深夜福利视频网站| 亚洲视频在线视频| 国产精品实拍| 精品中文字幕一区二区三区av| 欧美激情视频网| 国产夫妻在线| 国产精品久久久久久中文字| 国产精久久久| 久久大香伊蕉在人线观看热2| 麻豆精品在线| 久久av免费观看| 日韩成人精品一区| 久久综合久久久久| 久久亚洲二区| 国产精品久久久久久久99| a在线播放不卡| 9.1片黄在线观看| 国产女主播一区| 欧美黄色免费观看| 色综合天天视频在线观看| 国产精品一二三四五区| 亚洲精品aⅴ中文字幕乱码| av二区在线| 国内精品久久久久久久久| 青春草在线免费视频| 热re91久久精品国99热蜜臀| 成人影院网站ww555久久精品| 国产欧美va欧美va香蕉在线| 中文字幕一区图| 亚洲精品成人三区| 亚洲国产一区二区精品专区| 99久久久无码国产精品6| 久久国产精品99精品国产| 中文字幕丰满乱码| 久久蜜臀精品av| 免费中文字幕视频| 欧美日韩一区二区不卡| 天堂在线观看视频| 亚洲人成网站999久久久综合| 黄网在线免费| 性欧美xxxx视频在线观看| 色偷偷色偷偷色偷偷在线视频| 久草这里只有精品视频| 2018日日夜夜| 国产中文一区二区三区| 午夜在线观看一区| 五月天久久比比资源色| 日本三级免费看| 欧美精品v日韩精品v韩国精品v| 国产精品系列视频| 亚洲天堂男人天堂女人天堂| 国产蜜臀在线| 日本一本a高清免费不卡| 91蝌蚪精品视频| 自拍偷拍99| 日韩电影免费在线观看网站| 大尺度做爰床戏呻吟舒畅| 91日韩精品一区| 国产一二三四在线| 欧美一区二区精品| 青青青青在线| 国产精品一区二区3区| 亚洲另类av| 中文字幕一区二区三区精彩视频| 欧美在线高清| 亚洲a级黄色片| 国产欧美日韩三级| 男人的天堂久久久| 欧美另类z0zxhd电影| 爱久久·www| 欧美极品少妇与黑人| 高清久久精品| avove在线观看| 国产在线一区观看| 插吧插吧综合网| 精品日韩中文字幕| 国产精品乱码久久久| 精品国产一区二区三区四区在线观看| 性欧美猛交videos| 91深夜福利视频| 亚洲色图插插| 亚洲av无一区二区三区久久| 亚洲影视一区| 69视频在线播放| 国产成人在线中文字幕| 大陆av在线播放| 高清av一区二区| 天海翼一区二区| 日韩成人av在线播放| 亚洲一二三四| 亚洲成人一区二区三区| 六月婷婷色综合| 视频这里只有精品| 精品日产卡一卡二卡麻豆| 国模精品一区二区| 国产精品久久久久久久久久久久| y111111国产精品久久久| 国产精品www在线观看| 99久久国产综合精品女不卡| 91视频最新网址| 欧美一二三四区在线| 黑人极品ⅴideos精品欧美棵| 国产综合在线观看视频| 欧美大片一区| 午夜男人的天堂| 日本高清免费不卡视频| 在线观看完整版免费| 亚洲最大av网站| 99精品99| 国产精品成人在线视频| 日韩一区二区中文字幕| 国产蜜臀在线| 岛国视频一区免费观看| 亚洲国产精品久久久天堂 | 91中文字幕一区| 在线不卡欧美| 女人又爽又黄免费女仆| 欧美日韩激情一区| 阿v视频在线观看| 日韩精品无码一区二区三区| 精品人妻一区二区三区浪潮在线| 亚洲毛片在线看| 在线成人免费| 狠狠97人人婷婷五月| 1024亚洲合集| 四虎精品成人影院观看地址| 国产精品一久久香蕉国产线看观看| 欧美日韩黑人| 亚洲性图第一页| 在线看日本不卡| 黄毛片在线观看| 国产精品12p| 国产欧美日韩久久| 欧美一级一区二区三区|