国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了MySQL的多層SP中Cursor的m_max_cursor_index相關(guān)BUG分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

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

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

注:本次使用的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 ☆問題點
       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)nameCursor6nameCursor1屬于同一層,因此他們的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)在上面標識出),發(fā)現(xiàn)第一個level=2的sp_pcontext的m_max_cursor_index值多了很多,預期值應該是4+1,但是實際是8+1,而上面的層都沒錯,這說明代碼最里面那層m_max_cursor_index賦值錯了。

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

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

1、初始化sp_pcontext的時候所有的參數(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,當前的m_cursor_offset=上一層cursor個數(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、退出當前sp_pcontext層,需要把當前的max_cursor_index()信息值賦值給上一層的m_max_cursor_index,即當前的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、每次增加一個cursor,m_max_cursor_index值遞增,m_max_cursor_index是計數(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累加出來計算錯誤,看看上面的累加過程,是用max_cursor_index()值來累加的,于是查看max_cursor_index()函數(shù)的實現(xiàn):

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

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

三、問題解決方案

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

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的值,再加上當前層的m_cursors.size()值。
        return m_max_cursor_index + static_cast<uint>(m_cursors.size());
}

四、問題總結(jié)

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

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


Enjoy GreatSQL ??

關(guān)于 GreatSQL

GreatSQL是適用于金融級應用的國內(nèi)自主開源數(shù)據(jù)庫,具備高性能、高可靠、高易用性、高安全等多個核心特性,可以作為MySQL或Percona Server的可選替換,用于線上生產(chǎn)環(huán)境,且完全免費并兼容MySQL或Percona Server。

相關(guān)鏈接: GreatSQL社區(qū) Gitee GitHub Bilibili

GreatSQL社區(qū):

社區(qū)博客有獎征稿詳情:https://greatsql.cn/thread-100-1-1.html

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

技術(shù)交流群:

微信:掃碼添加GreatSQL社區(qū)助手微信好友,發(fā)送驗證信息加群。

MySQL的多層SP中Cursor的m_max_cursor_index相關(guān)BUG分析文章來源地址http://www.zghlxwxcb.cn/news/detail-844301.html

到了這里,關(guān)于MySQL的多層SP中Cursor的m_max_cursor_index相關(guān)BUG分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • css鼠標樣式 cursor: pointer

    css鼠標樣式 cursor: pointer

    cursor: none; cursor:not-allowed; 禁止選擇 user-select: none; pointer-events:none; 禁止觸發(fā)事件, 該樣式會阻止默認事件的發(fā)生,但鼠標樣式會變成箭頭

    2024年02月12日
    瀏覽(24)
  • Cursor——自動編碼神器!安裝且使用教程

    Cursor——自動編碼神器!安裝且使用教程

    官方gitHub網(wǎng)站 Cursor,是OpenAI研發(fā)的一款程序員輔助工具。 保留了Idea的代碼風格,界面簡潔,支持多種插件 支持Max,Linux,Windows系統(tǒng) 在工作區(qū)輸入需求,可中文或者英文,即可快速生成相應需求實現(xiàn)代碼 選擇代碼可進行分析代碼,解讀代碼,幫助理解代碼含義 根據(jù)與AI進行

    2024年02月16日
    瀏覽(18)
  • Cursor——ChatGPT的替代品【筆記】

    Cursor——ChatGPT的替代品【筆記】

    2023-3-31 22:00:44 以下內(nèi)容源自《筆記》 僅供學習交流使用 什么? 你還沒用過 Cursor? 智能 AI 代碼生成工具 Cursor 安裝和使用介紹 Cursor AI IDE 開發(fā)者工具 【黑科技】任何人都可以白嫖最強AI!??! 官網(wǎng)下載Cursor 點擊設置 點擊sign in 可以使用github賬號登錄 先別打開任何文件,就

    2023年04月09日
    瀏覽(22)
  • 工具 | Cursor:一個不只是寫代碼的工具

    工具 | Cursor:一個不只是寫代碼的工具

    本文首發(fā)微信公眾號: 全副武裝的大師兄 (一個分享前沿技術(shù),生活感受的公眾號,關(guān)注我,率先了解好玩的工具) 最新版本v0.1.12已經(jīng)需要收費,伙伴們可以選擇不用升級,另外,大家如果沒有0.1.11的安裝包,可以找我。 [寫在前面的話] 朋友們,現(xiàn)在基于GPT3.5, GPT4的產(chǎn)品

    2024年02月01日
    瀏覽(17)
  • 倚天屠龍:Github Copilot vs Cursor

    倚天屠龍:Github Copilot vs Cursor

    武林至尊,寶刀屠龍。號令天下,莫敢不從。倚天不出,誰與爭鋒! 作為開發(fā)人員吃飯的家伙,一款好的開發(fā)工具對開發(fā)人員的幫助是無法估量的。還記得在學校讀書的時候,當時流行CS架構(gòu)的RAD,Delphi和VisualBasic大行其道。就因為Delphi開發(fā)快,即使原來沒學過Pascal(當時都

    2024年02月05日
    瀏覽(22)
  • AI智能編程工具Cursor使用介紹

    AI智能編程工具Cursor使用介紹

    為使用人工智能編程而構(gòu)建的編輯器,一款 人工智能編程軟件 、 智能Ai代碼生成工具 。 它有什么特點呢? 集成了 GPT-4 ,國內(nèi)可用,有強大的自動代碼生成能力,可以說是為程序員量身打造。 它可以根據(jù)你的需求,自動生成代碼,分析代碼,優(yōu)化代碼,并可以基于某個代碼

    2024年02月09日
    瀏覽(26)
  • 程序員的chatgpt —— cursor 編輯器

    趁著目前是初期階段,免費使用。這個編輯器本身的功能還比較簡單,比如無法設置主題色。 解釋以下原型代碼的作用: 答曰: Based on the code you provided, it seems like you are working on a file manager application. The code defines a ListMainForm class that inherits from WindowImplBase , INotifyUI , and ListVi

    2023年04月19日
    瀏覽(20)
  • 充滿可能的新一代輔助編程神器:Cursor

    充滿可能的新一代輔助編程神器:Cursor

    隨著技術(shù)的不斷進步,人工智能已經(jīng)逐漸成為了編程領(lǐng)域中不可或缺的一部分。而今天我們要為大家介紹的,就是一款基于 GPT4 智能引擎,由 OpenAI 開發(fā)出來的全新輔助編程神器 — Cursor 。 1、Cursor 編輯器 Cursor 作為一款智能代碼編輯器,為程序員們提供了驚人的編程體驗。它

    2024年02月02日
    瀏覽(21)
  • ChatGPT-CURSOR(copilot)試用初體驗

    ChatGPT-CURSOR(copilot)試用初體驗

    chatgpt相關(guān)的cursor試用記錄及總結(jié),會極大提升開發(fā)的代碼開發(fā)效率(間接的對百度、google的依賴降低很多),可以與開發(fā)需求全過程結(jié)合的點很多(如占用時間較多的CR),期待大家結(jié)合自身工作的試用分享。 “請使用python輸出斐波那契數(shù)列” def fibonacci(n): if n = 0: return No

    2024年02月09日
    瀏覽(25)
  • 體驗一波ChatGpt工具-cursor(自動代碼生成)

    體驗一波ChatGpt工具-cursor(自動代碼生成)

    最近體驗了一把cursor,自動生成代碼工具,集成了最近很火的ChatGpt,目前比較好的就是代碼生成工具大概就是github copilot和cursor,不過github copilot需要付費使用或者漫長的waitlist,所以目前比較好的cursor 官網(wǎng)介紹如下: 配置自己經(jīng)常使用的語言,比如ts、html、css等等 目前來說

    2023年04月21日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包