暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 语句块解析 (一)语法顺序查找分析

上下博客 2021-04-21
372
要在项目中增加一个多语句执行的问题,首先就需要分解除SQL的语句块。看了MySQL的语法规则文件是使用的“;”作为语句块的结束。然后就想着使用一些成熟的语法解析器来进行解析,并且可以优化掉以前写的一个简单识别语句的模块。于是看上了Antlr4,一阵摸索之后放弃。原因很简单:学习成本 + 是否有必要。思来想去可以按照以前的思路写一个简单的,因为实际需要的并非是一个专业的语法解析器,而只是需要一个能够解析简单语法的解析器就可以了。所以写了一会代码,先把分词搞定,后续增加语句块的解析。
    var i, b, c = "";
    for (i = 0; i < q.length; i++) {
    b = q.charAt(i), -1 === e.indexOf(b) || 0 != d ? -1 === a.indexOf(b) || 0 != d ? ("'" == b && 0 == f % 2 && (g += 1), '"' == b && 0 == g % 2 && (f += 1), d = 0 == g % 2 && 0 == f % 2 ? !1 : !0, -1 === a.indexOf(b) || 0 != d ? c += b : ("" != c && h.push([c, i]), h.push([b, i]), c = "")) : ("" != c && h.push([c, i]), h.push([b, i]), c = "", "'" == b && 0 == f % 2 && (g += 1), '"' == b && 0 == g % 2 && (f += 1)) : ("" != c && h.push([c, i]), c = "")
    }
    console.log(h);
    复制

    从网上找了一些SQL语句

      SHOW DATABASES;
      CREATE USER name IDENTIFIED BY 'ssap(":dr ow';
      SET PASSWORD FOR name=PASSWORD('fdddfd');
      SHOW GRANTS FOR name;
      GRANT SELECT ON db_name.* TO name;
      SHOW DATABASES;
      DELETE FROM tb_name WHERE id=3;
      CREATE PROCEDURE pro(




          IN num INT,OUT total INT)




          BEGIN




          SELECT SUM(score) INTO total FROM tb_name WHERE id=num;




          END;
      DROP PROCEDURE pro;
      复制

      解析效果如下

        [
        [ 'SHOW', 4 ],
        [ 'DATABASES', 14 ],
        [ ';', 14 ],
        [ '\nCREATE', 22 ],
        [ 'USER', 27 ],
        [ 'name', 32 ],
        [ 'IDENTIFIED', 43 ],
        [ 'BY', 46 ],
        [ "'", 47 ],
        [ 'ssap(":dr ow', 70 ],
        [ "'", 70 ],
        [ ';', 71 ],
        [ '\nSET', 76 ],
        [ 'PASSWORD', 85 ],
        [ 'FOR', 89 ],
        [ 'name', 94 ],
        [ '=', 94 ],
        [ 'PASSWORD', 103 ],
        [ '(', 103 ],
        [ "'", 104 ],
        [ 'fdddfd', 111 ],
        [ "'", 111 ],
        [ ')', 112 ],
        [ ';', 113 ],
        [ '\nSHOW', 119 ],
        [ 'GRANTS', 126 ],
        [ 'FOR', 130 ],
        [ 'name', 135 ],
        [ ';', 135 ],
        [ '\nGRANT', 142 ],
        [ 'SELECT', 149 ],
        [ 'ON', 152 ],
        [ 'db_name.*', 162 ],
        [ 'TO', 165 ],
        [ 'name', 170 ],
        [ ';', 170 ],
        [ '\nSHOW', 176 ],
        [ 'DATABASES', 186 ],
        [ ';', 186 ],
        [ '\nDELETE', 194 ],
        [ 'FROM', 199 ],
        [ 'tb_name', 207 ],
        [ 'WHERE', 213 ],
        [ 'id', 216 ],
        [ '=', 216 ],
        [ '3', 218 ],
        [ ';', 218 ],
        [ '\nCREATE', 226 ],
        [ 'PROCEDURE', 236 ],
        [ 'pro', 240 ],
        [ '(', 240 ],
        [ '\n\n', 243 ],
        [ 'IN', 249 ],
        [ 'num', 253 ],
        [ 'INT', 257 ],
        [ ',', 257 ],
        [ 'OUT', 261 ],
        [ 'total', 267 ],
        [ 'INT', 271 ],
        [ ')', 271 ],
        [ '\n\n', 274 ],
        [ 'BEGIN\n\n', 285 ],
        [ 'SELECT', 295 ],
        [ 'SUM', 299 ],
        [ '(', 299 ],
        [ 'score', 305 ],
        [ ')', 305 ],
        [ 'INTO', 311 ],
        [ 'total', 317 ],
        [ 'FROM', 322 ],
        [ 'tb_name', 330 ],
        [ 'WHERE', 336 ],
        [ 'id', 339 ],
        [ '=', 339 ],
        [ 'num', 343 ],
        [ ';', 343 ],
        [ '\n\n', 346 ],
        [ 'END', 353 ],
        [ ';', 353 ],
        [ '\nDROP', 359 ],
        [ 'PROCEDURE', 369 ],
        [ 'pro', 373 ],
        [ ';', 373 ]
        ]
        复制


        文章转载自上下博客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论