通过错误的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

目录
相关文章
|
12月前
|
SQL 数据可视化 关系型数据库
MCP与PolarDB集成技术分析:降低SQL门槛与简化数据可视化流程的机制解析
阿里云PolarDB与MCP协议融合,打造“自然语言即分析”的新范式。通过云原生数据库与标准化AI接口协同,实现零代码、分钟级从数据到可视化洞察,打破技术壁垒,提升分析效率99%,推动企业数据能力普惠化。
921 3
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
存储 人工智能 算法
AI测试平台实战:深入解析自动化评分和多模型对比评测
在AI技术迅猛发展的今天,测试工程师面临着如何高效评估大模型性能的全新挑战。本文将深入探讨AI测试平台中自动化评分与多模型对比评测的关键技术与实践方法,为测试工程师提供可落地的解决方案。
|
存储 人工智能 测试技术
HarmonyOS Next~HarmonyOS应用测试全流程解析:从一级类目上架到二级类目专项测试
本文深入解析HarmonyOS应用测试全流程,涵盖从一级类目通用测试到二级类目专项测试的技术方案。针对兼容性、性能、安全测试及分布式能力验证等关键环节,提供详细实践指导与代码示例。同时,结合典型案例分析常见问题及优化策略,帮助开发者满足华为严苛的质量标准,顺利上架应用。文章强调测试在开发中的核心地位,助力打造高品质HarmonyOS应用。
829 2
|
SQL 安全 关系型数据库
SQL注入之万能密码:原理、实践与防御全解析
本文深入解析了“万能密码”攻击的运行机制及其危险性,通过实例展示了SQL注入的基本原理与变种形式。文章还提供了企业级防御方案,包括参数化查询、输入验证、权限控制及WAF规则配置等深度防御策略。同时,探讨了二阶注入和布尔盲注等新型攻击方式,并给出开发者自查清单。最后强调安全防护需持续改进,无绝对安全,建议使用成熟ORM框架并定期审计。技术内容仅供学习参考,严禁非法用途。
2191 0
|
11月前
|
监控 Java 关系型数据库
面试性能测试总被刷?学员真实遇到的高频问题全解析!
面试常被性能测试题难住?其实考的不是工具,而是分析思维。从脚本编写到瓶颈定位,企业更看重系统理解与实战能力。本文拆解高频面试题,揭示背后考察逻辑,并通过真实项目训练,帮你构建性能测试完整知识体系,实现从“会操作”到“能解决问题”的跨越。
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
如何让AI更“聪明”?VLM模型的优化策略与测试方法全解析​
本文系统解析视觉语言模型(VLM)的核心机制、推理优化、评测方法与挑战。涵盖多模态对齐、KV Cache优化、性能测试及主流基准,助你全面掌握VLM技术前沿。建议点赞收藏,深入学习。
3475 8
|
12月前
|
人工智能 自然语言处理 前端开发
深度解析Playwright MCP:功能、优势与挑战,AI如何提升测试效率与覆盖率
Playwright MCP通过AI与浏览器交互,实现自然语言驱动的自动化测试。它降低门槛、提升效率,助力测试工程师聚焦高价值工作,是探索性测试与快速验证的新利器。
|
12月前
|
人工智能 边缘计算 搜索推荐
AI产品测试学习路径全解析:从业务场景到代码实践
本文深入解析AI测试的核心技能与学习路径,涵盖业务理解、模型指标计算与性能测试三大阶段,助力掌握分类、推荐系统、计算机视觉等多场景测试方法,提升AI产品质量保障能力。
|
JavaScript 前端开发 测试技术
Playwright自动化测试系列课(4) | 异步加载克星:自动等待 vs 智能等待策略深度解析​
本文深度解析Playwright自动化测试中的等待策略,对比自动等待(零配置防御机制)与智能等待(精准控制异步场景)的核心差异。通过实战案例讲解等待机制的选择标准、常见失效原因及调试技巧,帮助开发者有效解决页面异步加载问题,提升测试脚本的稳定性和执行效率。

推荐镜像

更多
  • DNS