mysql的又一个让人捉摸不透的bug?
这次就不说很多没有写博客了,因为前几天已经写过了。\^o^/
昨天我们刚讨论了关于自动化运维工作的实现方式,如果批量执行,中间出错怎么办?突然有人提出mysql支持--force,可以跳过出错继续执行。
那么我就想看看它这个功能是什么样子的,看看我能不能借鉴一下。
然后我就在一个测试机器上写入如下命令:
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force -e "insert into myinfo (1,'asdf');insert into myinfo values(1,'asdf');
然后报错:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
看上去是正确的,因为第一条是有语法错误,但第二条是正确的,这个表应该多一条数据,但查了几遍都是没有,那说明根本就没有执行,为什么?不是说可以跳过么?
我换一种方法,将上面的语句放到一个sql文件中,因为考虑到这只有是在batch批量执行的时候才出现的,放到文件中肯定是批量的吧?然后执行下面的语句:
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force -e "source sql"
结果和上面是一样的,报错依旧,数据没有插入依旧!为什么?
然后又换了一种方式:
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force < sql
啊?用这种方式,报错依旧,查了一次表,发现好像多了一条?为什么这样可以执行成功,通过-e方式指定就不能?
不行,我得看看代码
对于--force的参数解析,它将全局变量ignore_errors设置为1,表示忽略所有的错误。
发现对-e的解析是下面的代码:
case 'e':
status.batch= 1;
status.add_to_history= 0;
if (!status.line_buff)
ignore_errors= 0; // do it for the first -e only
if (!(status.line_buff= batch_readline_command(status.line_buff, argument)))
return 1;
break;
这里可以看到,处理-e时可能会将变量ignore_errors设置为0,这是在status.line_buff=NULL的情况下,但看了一下代码,如果有-e,则蓝色字体是设置status.line_buff的最早位置,那说明上面的ignore_errors肯定会被设置为0啊!!!
这么说来,我在命令中必须要将--force放到-e后面去?将上面出错的命令中--force放在-e后面重试一下?
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql -e "insert into myinfo (1,'asdf');insert into myinfo values(1,'asdf'); --force
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql -e "source sql" --force
此时执行发错,报错依旧,但正确的插入语句执行成功了!!!难道这是个bug?
突然又想到,这是不是故意这样子,而我才疏学浅不知道?那我看看文档怎么写的:
• --execute=statement [237], -e statement
Execute the statement and quit. The default output format is like that produced with --
batch [235]. See Section 4.2.3.1, “Using Options on the Command Line”, for some examples.
With this option, mysql does not use the history file.
• --force [237], -f
Continue even if an SQL error occurs.
这完全没有说啊!!
随便提一个改法啊,这是随便提的,没有深入研究,别批我就好了
if (!status.line_buff)
ignore_errors= 0; // do it for the first -e only
if (!(status.line_buff= batch_readline_command(status.line_buff, argument)))
return 1;
将上面4行中的前面2行放到后面2行之后去,换一下位置,这样先初始化status.line_buff就不会出现这个问题了。
mysql代码的bug还是比较多的。
mysql的又一个让人捉摸不透的bug?的更多相关文章
- 如何写出一个让人很难发现的bug?
程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug. 那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢? - 1 -新手开发+ ...
- 如何隐藏一个让人很难发现的bug?
程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug. 那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢? - 1 - 新手开发 ...
- mysql如何设置一个字段,里面是自增的序号(1,2,3,..........)。
[遇到问题] [可忽略] 想把以前写的留言板搬到我的网站上去,所以要在Mysql上创建一个一mu一样的数据库,表单,字段..................... userid这个字段忘记了如何添加, ...
- java web(一) 使用sql标签库+tomcat+mysql手动创建一个jsp练习总结
2016-09-0111:06:53 使用sql标签库+tomcat+mysql手动创建一个jsp 1. 1.1安装tomcat ...
- mysql中添加一个和root一样的用户用于远程连接
mysql中添加一个和root一样的用户用于远程连接: 大家在拿站时应该碰到过.root用户的mysql,只可以本地连,对外拒绝连接. 下面语句添加一个新用户administrtor: CREATE ...
- 一个IT人士的个人经历,给迷失方向的朋友
这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量.最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经历写出来与大家共勉,希望能 ...
- MySQL数据库添加一个字段
MySQL数据库添加一个字段 1.添加一个字段 alter table tableName add 列名 数据类型; 2.添加一个字段设置默认值 alter table tableName add ...
- 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室
原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
随机推荐
- Linux 数据重定向
名称 描述 代码 表示 stdin 标准输入 0 < 或 << stdout 标准输出 1 > 或 >> stderr 标准错误输出 2 2> 或 2> ...
- 软件架构设计学习总结(15):远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
总结这些概念都是易混淆,最基本概念定义复习和深入理解,同时也是架构师必备课程 RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请 ...
- 【IT笔试面试题整理】连续子数组的最大和
[试题描述]输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n). 思路:当我们加上一个正数时,和会增加:当我们加上一个 ...
- Docker 使用官方镜像
Docker 使用官方镜像 如何使用官方镜像 Docker 中国官方镜像加速可通过 registry.docker-cn.com 访问.目前该镜像库只包含流行的公有镜像,而私有镜像仍需要从美国镜像库中 ...
- #if defined 和 #if ! defined 的用法
背景:MFC初学,头文件中有#if !defined(AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_)#define A ...
- SpringMvc+hibernate+easyui简单的权限管理系统
用户登录: 主界面: 资源管理: 角色管理: 用户管理: 部门管理: 源码在群共享: 189811613 群满了,直接发链接吧链接:http://pan.baidu.com/ ...
- c# List< int>和List< string>互相转换
c# List< int>和List< string>互相转换 定义一个list< t> List<int> list = new List<in ...
- UML,构件图与部署图
一.构件图概述 1.概念 用来显示一组构件之间的组织及其依赖关系 2.基本元素 (1)构件:定义了良好接口的物理实现单元. ● 配置构件:形成可执行文件的基础,如:动态链接库(DLL).ActiveX ...
- java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.String(Short类型无法强转成String类型)
有一行Java代码如下: String code1 = (String)qTable1.getValueAt(i, 0); 这是一个Java的图形界面获取表格中值的代码,其中qTable1.getVa ...
- ifream框架角色切换
js受制于单个页面,用ifream框架做web系统,会遇到角色切换菜单刷新的问题,我就来讲一下我的思路: 用户登录时将用户角色放入session中,以角色id为key,权限为值,角色切换时将相应角色i ...