Есть ли способ сравнить две строки sql, чтобы проверить, являются ли они семантически эквивалентными? - PullRequest
2 голосов
/ 14 апреля 2011

Я пишу некоторые модульные тесты Java, и мне нужно сравнить две строки SQL, где операторы SQL семантически эквивалентны, но могут синтаксически отличаться. Я не могу выполнить сравнение строк, так как порядок предложения from и предложения where могут отличаться, но оба запроса могут быть эквивалентны.

Есть ли способ сделать это в Java без необходимости писать собственный Oracle SQL Parser? :)

P.S. Запрос может быть очень сложным!

Спасибо!

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

Общий ответ - НЕТ, потому что вы всегда можете вызвать какую-то хранимую процедуру, которая скрывает машину Тьюринга.Тот факт, что вы можете делать арифметику в SQL-выражении, я думаю, заставляет вас и Тьюринговую скалу тоже.

Конечно, теоретики всегда говорят нам, что все невозможно, поэтому мы все должны перевернуться и умереть.

Нет.

Так что вы можете сделать?Что ж, «простая» возможность - нормализовать запросы SQL, так же как вы упрощаете алгебраические уравнения.Если бы вы могли как-то для оператора SQL «нормализовать» (преобразовать) его в абсолютно кратчайший эквивалентный SQL, который сделал то же самое, то вы могли бы нормализовать оба оператора SQL и сравнить операторы результата;если они равны по модулю идентификатору переименования, то они имеют одинаковую «семантику».Для каждого оператора в SQL есть некоторая семантика и некоторый набор эквивалентных операций, как в алгебре.Итак, если вы можете определить набор алгебраических эквивалентностей для каждого оператора SQL, вы можете заменить каждое алгебраическое вычисление кратчайшим алгебраическим эквивалентом, который делает то же самое.

Чтобы сделать это, вы должны иметь возможность анализировать SQL и применять перезаписываемые SQL к анализируемому SQL, что означает, что вам нужен механизм преобразования программ .(Вы можете увидеть аналог этого в Алгебра парсинга и перезаписи )

Это работает не во всех случаях.Во-первых, может быть несколько «самых коротких» операторов SQL одинаковой длины, которые эквивалентны ( 2 + X - это то же самое, что X + 2 , но это не очевидно для инструмента),Теперь у вас есть проблема доказательства теорем (в нашем примере X + 2 используйте коммутативный закон, чтобы доказать, что они равны), вернемся к теории.Во-вторых, вы можете не знать , как генерировать кратчайшую возможную последовательность, используя ваши переписывания;даже математические уравнения иногда должны разбухать, прежде чем они снова станут маленькими.Технически вы должны искать все возможные алгебраические эквивалентности, чтобы найти самое короткое, а это невероятно большое.

Так что на практике это тоже сложно сделать.Итак, №.

2 голосов
/ 14 апреля 2011

Не является прямым решением вашей проблемы, но вы можете захотеть взглянуть на JSqlParser , который может уже покрывать часть того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...