元建模crud FROM / JOIN / WHERE语句片段用于更高级别的分析

时间:2016-02-09 16:33:54

标签: metaprogramming rdbms dsl

考虑这些sql语句片段的“meta-”共性:

-- ...
FROM TableA

-- ...
FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

-- ...
FROM TableA
FULL OUTER JOIN TableOfValues() AS TableB
ON TableA.id= TableB.id
WHERE Somesuch = 1

-- ...
FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

如何在数据类型库中对这些语句片段进行建模,以便可以在完整{的模型描述中使用描述连接过滤器的建模对象{1}}声明,或者同样,一个完整的select声明?也就是说,建模片段的描述性足以满足两种用法。

是的,linq-to-sql等技术已经处理update个案;但是,select的建模要求在我看来要困难得多。例如,我们不仅需要捕获通过模型返回以改变源列所需的信息,我们还仅限于在更新语句中更新单个连接组件表的列(通常)。

为了这个值得,建模语言的类型系统与我们的模型相结合应该能够验证声明的关系健全性,并突出显示大多数无意义的语句包含类型微积分错误。例如,视图或表值函数等连接源可能根本不可更新。

updates子句和计算投影值(包括窗口函数)需要影响类型,可能会导致在GROUP BY语句中使用的类型准确不兼容但仍在{ {1}}陈述。

SQL Server如何解析,分析和编译t-sql?我希望Microsoft和其他供应商有一些组织良好的AST类型,t-sql被解析为推理,语句验证,优化和编译。但我无法在任何地方找到有关这些内部的信息。你知道一个参考,特别是一个学术(供应商不可知)吗?

1 个答案:

答案 0 :(得分:1)

大多数SQL系统使用特定于供应商的SQL语法来解析SQL查询。他们通过为每个子句类型提供子语法来构建一个AST,它对查询中的所有子句进行建模。 AST的实际形状因系统而略有不同,因为它们具有不同的语法和略微不同的语义,以确保供应商锁定。

您应该能够轻松找到SQL语法;例如:http://www.antlr3.org/grammar/list.html这应该足以模拟通用SQL查询,包括SELECT和UPDATE语句。

您可能会发现很难找到的是明智的,富有表现力的方式来描述您可能想要对SQL查询或SQL查询的子项进行哪种分析。这主要是实施的 由特设机构。

关于SQL引擎的问题:大多数情况下,他们使用经典编译器技术(解析,构建AST,构建符号表,计算中间表达式类型,进行一些数据流分析)的组合来编译SQL语句,并进行优化由引擎随时间收集的访问统计数据驱动的数据访问。