【问题标题】:SQL parser library - get table names from querySQL 解析器库 - 从查询中获取表名
【发布时间】:2013-02-21 13:12:01
【问题描述】:

我正在寻找一个 C/C++ SQL 解析库,它能够为我提供查询所依赖的表的名称。

我的期望:

    SELECT * FROM TABLEA NATURAL JOIN TABLEB

结果:TABLEA、TABLEB

当然提供的示例非常简单。我已经编写了自己的解析器(基于 Boost.Spirit)来处理 SQL 语法的子集,但我需要的是能够处理复杂(递归等)查询的解析器。

你知道什么有用的吗?

我找到的是http://www.sqlparser.com - 它是商业的,但正是我需要的。 我还深入研究了 PostgreSQL 源码,没有任何效果。

【问题讨论】:

  • 很抱歉跑题了,但是……为什么?
  • 您可以使用 lexxer 和 yaccer 的组合来执行此操作,我知道您可以在网上找到完整的语法定义,但它们并非都是最新的......无论如何我也搜索了很多可以做到这一点的东西,并最终编写了我自己的解析器,它实际上可以跳过语法的未定义部分,但仍然很难让它处理复杂的查询......
  • @vines - 我正在编写一个中间件库,它透明地将查询结果缓存在 Memcached、Redis 或本地 RAM 中(取决于配置)。目前,无论是否有意义,这只是一项学术研究。我正在使用 SOCI 库进行测试(soci.sourceforge.net,我已经实现了自己的后端)。也许我也会实现一些 JDBCv2 驱动程序。
  • @ppetrov - 感谢您的回复,不幸的是,我知道编写功能齐全的解析器需要相当多的时间和精力。这就是为什么我现在正在寻找可用的东西。

标签: c++ sql c parsing


【解决方案1】:

Antlr 可以为您生成一个不错的 SQL 解析器(解析器的源代码可以是 C++),并且可用的 SQL 语法很少:http://www.antlr3.org/grammar/list.html

如果您只对表名感兴趣,那么采用其中一种语法并添加收集这些名称的语义操作应该相当容易。

有一些使用 Antlr 和 Bison/Yacc 和 Lex/Flex 的经验,我绝对推荐 Antlr。它是用 Java 编写的,但目标语言可以是 C++ - 生成的代码实际上是可读的,看起来像是由人编写的。 Antlr生成的解析器调试还可以,Bison生成的就不好说了。。

还有其他选项,例如 Lemon 和 sqlite 语法,如果您愿意,可以看看这个问题:SQL parser in C

【讨论】:

  • 谢谢,我试试看
  • 好的,告诉我们进展如何,我很想知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2016-08-16
  • 1970-01-01
相关资源
最近更新 更多