修改代码实现你的第一个Mysql版本

 

51ak带你看MYSQL5.7源码3:修改代码达成您的首先个Mysql版本,51akmysql5.7

 

从业DBA工作多年

MYSQL源码也是头一次接触

品尝记录下本人看MYSQL5.7源码的进度

 

目录:

51ak带你看MYSQL5.7源码1:main入口函数

51ak带你看MYSQL5.7源码2:编写翻译现成的代码

 51ak带你看MYSQL5.7源码3:修改代码达成您的率先个Mysql版本

 

 

由此开辟和测量检验情形铺排

于今到了我们开首的时候了,万事初叶难,首先大家贯彻个小功用

今天大家计划完毕那样二个效果与利益:数码永世也不会被DELETE掉

 

当你把那几个版本的MYSQL放到线上遇到今后,就长久不要顾忌有人来DELETE你的数目了

 

思路相当的轻松:顺腾摸瓜找到Delete所在的FUNC在函数开首就赶回贰个OK

标题来了,怎么找到那个函数?

有三种:风流倜傥种很有聪明的同校,恐怕风流浪漫眼就看看了sql/sql_delete.cc 那么些文件
,猜到是以此文件 

另日新月异种格局就是基础一点,大家本着那样的代码风度翩翩层蒸蒸日上层找到这里也行。

dispatch_command
|->mysql_parse
  |->mysql_execute_command
    ->mysql_update/mysql_delete
为了快速上手,我们用第一种方法,直接打开sql/sql_delete.cc 
找到这个方法:

bool Sql_cmd_delete::execute(THD *thd)
{
  DBUG_ASSERT(thd->lex->sql_command == SQLCOM_DELETE);

  LEX *const lex= thd->lex;
  SELECT_LEX *const select_lex= lex->select_lex;
  SELECT_LEX_UNIT *const unit= lex->unit;
  TABLE_LIST *const first_table= select_lex->get_table_list();
  TABLE_LIST *const all_tables= first_table;

  if (delete_precheck(thd, all_tables))
    return true;
  DBUG_ASSERT(select_lex->offset_limit == 0);
  unit->set_limit(select_lex);

  /* Push ignore / strict error handler */
  Ignore_error_handler ignore_handler;
  Strict_error_handler strict_handler;
  if (thd->lex->is_ignore())
    thd->push_internal_handler(&ignore_handler);
  else if (thd->is_strict_mode())
    thd->push_internal_handler(&strict_handler);
 

/*注:我们要改的就是这里,直接返回一个true,而把真正要执行的地方给注释掉了*/
  bool res =true;
  /*MYSQL_DELETE_START(const_cast<char*>(thd->query().str));
  bool res = mysql_delete(thd, unit->select_limit_cnt);
  MYSQL_DELETE_DONE(res, (ulong) thd->get_row_count_func());
  */

  /* Pop ignore / strict error handler */
  if (thd->lex->is_ignore() || thd->is_strict_mode())
    thd->pop_internal_handler();

  return res;
}

 

好了,代码就改那二个小地点,未来去编写翻译启动

下一场建 三个测量检验表往里写几条数据,然后尝试各样DELETE语句,接下去便是见证神跡的时候了,你会意识数目永恒不能被DELETE掉了。。

mysql> select * from t1;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
5 rows in set (0.00 sec)

mysql> delete from t1 where id=2;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t1;
+—-+
| id |
+—-+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+—-+
5 rows in set (0.00 sec)

 

什么样,小小的三个退换,就令你再也不忧郁数据被剔除了,认为很酷有没有

拜候此间的同校,现在您曾经有了第二个自定义版 的MYSQL了,还不尽快打包发表到线上去!!

让这个牧马人D同学感受一下来自DBA的调整力吧。

 

想必有好事的同学会问,这只防了DELETE,没防TRUNCATE和DROP啊。。。

如此问的校友,我认为您相当不够有智慧。。

 

 

好,明日到此截至

 

从事DBA专门的学业连年 MYSQL源码也是头壹遍接触
尝试记录下团结看MYSQL5.7源码…

 

转业DBA专门的学业连年

MYSQL源码也是头叁回接触

尝试记录下自个儿看MYSQL5.7源码的长河

发明:个人Python编制程序很溜,不过C++还停在傻蛋水准,源码驾驭地点有一点弱,如发掘有乖谬的地点,轻喷

 

目录:

51ak带你看MYSQL5.7源码1:main入口函数 (2018-03-21)

51ak带你看MYSQL5.7源码2:编译现成的代码 (2018-03-22)

51ak带你看MYSQL5.7源码3:修改代码实现您的首先个Mysql版本 (2018-03-23)

51ak带你看MYSQL5.7源码4:完毕SQL黑名单功用(2018-04-11)

 

 

 

通过开采和测量检验情状布置

今日到了作者们发轫的时候了,万事开始难,首先我们实现个小成效

今日我们希图完结如此一个功用:多少永久也不会被DELETE掉

 

当您把那么些版本的MYSQL放到线上蒙受未来,就长久不要牵记有人来DELETE你的多寡了

 

思路非常轻易:顺腾摸瓜找到Delete所在的FUNC在函数开始就回到三个OK

主题材料来了,怎么找到那些函数?

有两种:大器晚成种很有灵性的同窗,恐怕意气风发眼就看看了sql/sql_delete.cc 那几个文件
,猜到是以此文件 

另风华正茂种办法就是基础一点,我们本着那样的代码后生可畏层风度翩翩层找到这里也行。

dispatch_command
|->mysql_parse
  |->mysql_execute_command
    ->mysql_update/mysql_delete
为了快速上手,我们用第一种方法,直接打开sql/sql_delete.cc 
找到这个方法:

bool Sql_cmd_delete::execute(THD *thd)
{
  DBUG_ASSERT(thd->lex->sql_command == SQLCOM_DELETE);

  LEX *const lex= thd->lex;
  SELECT_LEX *const select_lex= lex->select_lex;
  SELECT_LEX_UNIT *const unit= lex->unit;
  TABLE_LIST *const first_table= select_lex->get_table_list();
  TABLE_LIST *const all_tables= first_table;

  if (delete_precheck(thd, all_tables))
    return true;
  DBUG_ASSERT(select_lex->offset_limit == 0);
  unit->set_limit(select_lex);

  /* Push ignore / strict error handler */
  Ignore_error_handler ignore_handler;
  Strict_error_handler strict_handler;
  if (thd->lex->is_ignore())
    thd->push_internal_handler(&ignore_handler);
  else if (thd->is_strict_mode())
    thd->push_internal_handler(&strict_handler);
 

/*注:我们要改的就是这里,直接返回一个true,而把真正要执行的地方给注释掉了*/
  bool res =true;
  /*MYSQL_DELETE_START(const_cast<char*>(thd->query().str));
  bool res = mysql_delete(thd, unit->select_limit_cnt);
  MYSQL_DELETE_DONE(res, (ulong) thd->get_row_count_func());
  */

  /* Pop ignore / strict error handler */
  if (thd->lex->is_ignore() || thd->is_strict_mode())
    thd->pop_internal_handler();

  return res;
}

 

好了,代码就改那二个小地点,以往去编写翻译运转

然后建 二个测量试验表往里写几条数据,然后尝试各类DELETE语句,接下去就是见证神蹟的时候了,你会意识数目永久不可能被DELETE掉了。。

mysql> select * from t1;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
5 rows in set (0.00 sec)

mysql> delete from t1 where id=2;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t1;
+—-+
| id |
+—-+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+—-+
5 rows in set (0.00 sec)

 

何以,小小的二个退换,就令你再也不愁数据被去除了,感到很酷有未有

看到这里的同窗,今后您早本来就有了第叁个自定义版 的MYSQL了,还不尽快打包发表到线上去!!

让那么些福睿斯D同学感受一下来自DBA的调控力吧。

 

兴许有好事的同学会问,那只防了DELETE,没防TRUNCATE和DROP啊。。。

如此问的同室,笔者感到您远远不足有灵气。。

 

 

好,今天到此为止

 

Leave a Comment.