JSQLParser碰到的问题

矫情吗;* 2022-09-12 11:58 483阅读 0赞

JSQLParser是github上一个开源的项目,专门解析SQL,可以轻松地得到一条SQL的列、表、条件等对象,

906d88d3ae6682af9434ceb4c1db9761.png

P.S. https://github.com/JSQLParser/JSqlParser

最近在做一个功能开发的时候,被他困扰了下,从需求来讲,就是利用正则,先将多行的SQL改成一行,然后通过JSQLParser解析SQL,但是在这过程中,碰到了很多问题。

问题1,提示EOF

最崩溃的,就是这个错误,

  1. Encountered unexpected token: EOF

EOF我们在C中经常看到的,表示文件结尾,End Of File,但在这提示,一开始确实迷惑,忽略中间各种盲测调试,其实问题就出在所有的SQL合并到单行,如果存在”—“这种语法就会导致”—“跟着的所有内容,都是注释,如果之前的内容恰巧不能构成一条正确的SQL,就会提示未找到正确的结尾。

场景1,字段中出现”—内容”,

  1. select c1, --测试字段
  2. c2, c3
  3. from test1
  4. join test2
  5. where test1.id = test2.id;

场景2,字段中出现”—无内容”,

  1. select c1, --
  2. c2, c3
  3. from test1
  4. join test2
  5. where test1.id = test2.id;

场景3,WHERE条件中出现”—内容”,

  1. select c1, --测试字段
  2. c2, c3
  3. from test1
  4. join test2
  5. where test1.id = test2.id --连接
  6. and test1.id = 1;

以上三个场景,如果要将SQL整合成为一行,就需要替换这些”—“,

  1. replaceAll("--.+[^.+]", " ")
  2. .replaceAll("--[^.+]", " ")
  3. .replaceAll("[\r\n]", " ");

问题2,提示”\\“

  1. Encountered: "\\" after : ""

通过SQL,

  1. select c1, --测试字段
  2. c2,
  3. REPLACE(REPLACE(to_char(SUBSTR(regexp_REPLACE(c3, '\s',''),1,25)),'\','\\'),'"','\"') AS c3
  4. from test1
  5. join test2
  6. where test1.id = test2.id;

定位到是REPLACE函数中用到的”\\“,

  1. regexp_REPLACE(TEST, '\s',''),1,25)),'\','\\')

因此再增加对”\\“的函数替换,将其改为统一的”XXX”,

  1. .replaceAll("\\\\", "XXX")

问题3,提示\uff01

  1. Encountered: "\uff01" (65281), after : ""

\uff01这个其实是中文的叹号,

  1. >>> print(u'\uff01')
  2. !(中文叹号)

除了这种中文叹号的使用,还出现了中文的括号,”(”和”)”,如下所示,

场景1 中文叹号,

  1. select c1, --测试字段
  2. c2, c3
  3. from test1
  4. join test2
  5. where test1.id = test2.id and test1.output !(此处是中文叹号)= 1;

场景2,中文括号,

  1. select c1, --测试字段
  2. c2, c3
  3. from test1
  4. join test2
  5. where test1.id = test2.id
  6. and test1.output in ((此处是中文括号)1, 2, 3)(此处是中文括号);

我们知道,SQL中使用中文符号,执行报错,如下所示,

  1. SQL> select * from test where owner !='a';
  2. select * from test where owner !='a'
  3. *
  4. ERROR at line 1:
  5. ORA-00911: invalid character

但是既然出现了,程序上就得规避,hard code对这些字符,进行替换,

  1. .replaceAll("!", "!") // 替换中文的!
  2. .replaceAll("(", "(") // 替换中文的(
  3. .replaceAll(")", ")"); // 替换中文的)

从这个处理过程我们能看到,SQL的标准写法上,其实还是有很多值得遵循的,所谓无规矩,不成方圆,还是有他的道理。

近期更新的文章:

《高刷屏是什么?

《“万一免五”是什么?

《最近碰到的问题

《Python一个有趣的彩蛋

《国内首个违反GPL的案件介绍

文章分类和索引:

《公众号800篇文章分类和索引

发表评论

表情:
评论列表 (有 0 条评论,483人围观)

还没有评论,来说两句吧...

相关阅读

    相关 最近碰到一些问题

    最近写代码的过程中,碰到一些问题,记录一下。 问题1 按照空格分割字符串的需求 需要按照空格进行字符串分割,对其中的数组成员进行处理,分割这个操作,如果按照如下的形式解析,

    相关 最近碰到问题

    最近碰到的问题,包罗万象,同时欢迎各位朋友们能提供这种迷你知识点。 问题1 MySQL报错MySQL“ERROR 1046(3D000):未选择数据库”更新查询 ![

    相关 使用bootstrap碰到问题

    bootstrap3 顶部固定的导航栏的z-index设置成了1030,导致了我的对话框的遮罩层遮罩不住顶部的导航栏,而我的登陆表单又是在顶部导航栏的,也就造成了可以重复点击登