通过错误的sql来测试推理sql的解析过程

简介: 在学习Oracle的时候,必然会接触到sql解析的过程。这个过程大体是这样的步骤。 1.对sql的文法检查,查看是否有文法错误,比如from,select拼写错误等。 2.在数据字典里校验sql涉及的对象是否存在。
在学习Oracle的时候,必然会接触到sql解析的过程。这个过程大体是这样的步骤。
1.对sql的文法检查,查看是否有文法错误,比如from,select拼写错误等。
2.在数据字典里校验sql涉及的对象是否存在。
3.将对象进行名称转换,比如同义词转义成对应的对象。比如select * from t t是一个同义词指向hr.test
4.检查语句的用户是否具有访问对象的权限
5.生成执行计划
6.将游标产生执行计划,sql文本装载入library cache所在的heap中。
这个过程看起来比较容易理解,但是实际中我们也不能死记硬背,如果想推理一下其中的有些步骤,其实不用很精细的trace也可以办到。我们就用最简单的sql语句来测试。
当然思路需要转换,要测试的是存在问题的sql语句,看oracle的编译器会给我们什么样的解释。
首先准备一个测试表
create table test (id number,name varchar2(30));
准备好之后,就开始测试一下。不过思路是用有问题的语句来测试,来推理。
下面的语句存在很多的问题,来看看oracle的反应。
select1 id1 from2 test1 where3 id1='aaa' group by4 id1 order  by5 id1
*
ERROR at line 1:
ORA-24333: zero iteration count
首先解析发现select的语句错误其实后面from,where,group by,order by都有错误。但是首先发现是select的部分。可见解析还是从左至右的方向来做文法解析。
接着修复select的文法错误,来继续看看。
select id1 from test1 where3 id1='aaa' group by4 id1 order  by5 id1
                             *
ERROR at line 1:
ORA-00933: SQL command not properly ended
这个时候错误指向了id1而没有指向where3,可见编译器在处理的时候可能不知道该怎么处理了。这一点上出乎我的意料。修复where的文法错误继续测试。
select id1 from test1 where id1='aaa' group by4 id1 order  by5 id1
                                           *
ERROR at line 1:
ORA-00924: missing BY keyword
这个时候直接指向了group by的部分。通过这三个例子可以基本推理出文法解析是从左至右。对于是否存在表,是否字段存在问题都先不会解析。
然后我们修复了group by,order by的文法错误,继续测试。
select id1 from test1 where id1='aaa' group by id1 order  by id1
                *
ERROR at line 1:
ORA-00942: table or view does not exist
发现错误指向了test1,发现没有这个表。可见在文法解析之后开始校验是否存在这个表。这个时候还没有开始校验字段的情况。
修复了表名的错误,继续测试。
select id1 from test where id1='aaa' group by id1 order  by id1
                                                *
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
发现这个时候是在解析group by 的字段名,对于select,where,order by中的先不解析。
然后修复group by中的错误,继续测试。
select id1 from test where id1='aaa' group by id order  by id1
                           *
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
发现解析到了where 子句中的字段值。这个时候select,order by中还没有开始解析。
修复where子句中的问题,继续测试。
select id1 from test where id1='aaa' group by id order  by id1
       *
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
这个时候错误就指向了select子句,这个时候就剩下了order by的部分。
修复select的部分。继续测试。
SQL> select id from test where id='aaa' group by id order  by id1;
select id from test where id='aaa' group by id order  by id1
                                                         *
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
终于指向了order by,可见order by的部分是语句执行的最后的部分。
通过上面的错误测试,可以发现能够基本得到语句解析中的处理顺序。
我们更深一步。看看如果字段id为number,赋予varchar2的数据,是否会在解析的时候校验出来。
SQL>  select id from test where id='aaa' group by id order  by id;        
 select id from test where id='aaa' group by id order  by id
                              *
ERROR at line 1:
ORA-01722: invalid number
这个时候发现错误已经在校验数据的类型了。
怎么看出在解析的时候是否校验了数据类型呢,别急,来做一个操作即可。
SQL> delete from test ;
1 row deleted.
然后再次执行上面的语句。
SQL> select id from test where id='aaa' group by id order  by id;
no rows selected
就会发现这个时候oracle好像处理不了这种场景了。
好了,oracle编译器已经很强大了。我们就最后以一个基本正常的语句结束。
SQL> select id from test where id='100' group by id order  by id;
no rows selected

目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
MySQL - 一文解析 SQL 的执行顺序
MySQL - 一文解析 SQL 的执行顺序
|
3月前
|
测试技术
软件测试中的QPS和TPS解析:以秒杀系统为例
软件测试中的QPS和TPS解析:以秒杀系统为例
75 0
软件测试中的QPS和TPS解析:以秒杀系统为例
|
3月前
|
SQL 存储 数据库
Python 的安全性和测试:什么是 SQL 注入攻击?如何防范 SQL 注入?
Python 的安全性和测试:什么是 SQL 注入攻击?如何防范 SQL 注入?
|
3月前
|
监控 安全 测试技术
从开发到测试再到发布,全方位解析项目上线的完美路程!
从开发到测试再到发布,全方位解析项目上线的完美路程!
120 0
|
4月前
|
SQL 消息中间件 Apache
Apache Calcite—sql执行和解析引擎
Apache Calcite—sql执行和解析引擎
54 0
|
2月前
|
SQL 安全 关系型数据库
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞,品相还不错,可执行任意 SQL 语句。 总之,吃了一惊,一个防 SQL 注入的工具居然也有 SQL 注入漏洞。 请看这段代码
413 1
|
29天前
|
测试技术 Android开发
快速上手App自动化测试利器,Toast原理解析及操作实例
`Toast`是Android中的轻量级通知,短暂显示在屏幕任意位置,1-2秒后自动消失,不获取焦点且不可点击。Appium通过uiautomator2在控件树中处理Toast。在测试中,可设置隐式等待,利用XPath或Accessibility ID定位Toast元素进行检测和验证。示例代码展示了如何初始化driver,点击触发Toast,以及如何定位并读取Toast文本。
22 3
|
30天前
|
SQL 关系型数据库 API
Star 4.7k!高效SQL Parser!纯Python开发!自称目前最快的纯Python SQL解析器!
Star 4.7k!高效SQL Parser!纯Python开发!自称目前最快的纯Python SQL解析器!
|
2月前
|
SQL JSON Apache
Flink SQL问题之复杂JSON解析如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
395 0
|
3月前
|
SQL 数据挖掘 关系型数据库
「SQL面试题库」 No_87 学生们参加各科测试的次数
「SQL面试题库」 No_87 学生们参加各科测试的次数

热门文章

最新文章