gpt4 book ai didi

sql - 自动检查两个 SQL 查询在语义上是否相等

转载 作者:行者123 更新时间:2023-12-04 20:56:05 27 4
gpt4 key购买 nike

我有两个问题:

'UPDATE foo SET bar = baz WHERE a = b AND c = d'

'UPDATE foo SET bar = baz WHERE c = d AND a = b'

两者在语义上是相同的(它们做的相同),但是一个简单的比较会表明它们是不同的,因为第一个有 a = b AND c = d 而第二个使用 c = d 和 a = b

如何检查两个查询在语义上是否相等?

这是一个明显简单的示例,可以通过在 WHERE 节点处对语法树进行简单的字母排序来解决。我对一种通用方法很感兴趣,它也可以解决更复杂的查询 - 即使是子查询。

进一步的限制是我无权访问数据库并且只能使用查询的字符串。因此,运行查询是不可能的,因为它不会反射(reflect)查询的相​​等性。

上面粗体文本的例子:

足球 table :

A |  B |  C
1 | xx | xx
2 | yy | zz

FooTable':(FooTable' 是不同数据库上的 FooTable)

A |  B |  C
1 | xx | xx
2 | ee | zz
3 | ss | xx

运行查询不会产生有效结果的示例:

1)同数据库查询:

UPDATE FooTable SET B = 'rr' WHERE C = 'xx'

UPDATE FooTable SET B = 'rr' WHERE C = 'xx' OR B = 'ss'

两个查询的结果完全相同,但根本不相等。

2) 包含不同数据库时的查询(相同模式但不同数据):

SELECT A,B,C FROM FooTable where C = 'xx'

SELECT A,B,C FROM FooTable' where C = 'xx'

这两个查询在语义上基本相同,但不会产生相同的结果。

最佳答案

这个任务确实不简单。

本质上,您必须构建自己的查询解析器和优化器。这是优化器的任务——转换执行计划中的查询运算符,使查询的最终结果对于基础表中的任何可能数据保持不变(考虑所有约束)。智能优化器能够为看起来非常不同的查询(例如 INEXISTS)生成相同的计划,它们简化并统一了 WHERE 中的逻辑条件> 子句,可以沿着执行树推送谓词并做许多其他事情。

从头开始编写这样的优化器会很困难,但您可以查看现有的开源数据库(Postgres?),看看是否可以从那里借用一些东西。

另一种更实用的方法是利用一个现有的数据库,而不是运行查询,而是要求优化器返回生成的执行计划。然后,您可以比较执行计划而不是比较原始 SQL 文本。如果计划相同,那么原始查询是 100% 等效的。如果计划不同,优化器仍有可能不够聪明,无法推断出查询是等价的,但您必须接受漏报的可能性。

我会查看几个不同的数据库,看看您可以使用内置功能从它们的优化器中获得什么样的信息。无论如何,生成的执行计划应该比原始 SQL 文本结构化得多,并且应该更容易自动比较它们。

关于sql - 自动检查两个 SQL 查询在语义上是否相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36304088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com