Почему бы не спросить саму целевую базу данных, как она будет интерпретировать запросы?
В Perl можно использовать DBI для запроса подготовленного представления запроса SQL. Иногда это зависит от базы данных: некоторые драйверы (в пространстве имен perl DBD::
) поддерживают в своей СУБД идею , описывающую операторы способами, аналогичными нативному API С или С ++ СУБД.
Однако это может быть сделано в общем случае, поскольку DBI поместит имена столбцов результата в атрибут дескриптора оператора NAME
. Следующие, например, имеют хорошие шансы работать на любой поддерживаемой DBI СУБД:
use strict;
use warnings;
use DBI;
use constant DSN => 'dbi:YouHaveNotToldUs:dbname=we_do_not_know';
my $dbh = DBI->connect(DSN, ..., { RaiseError => 1 });
my $sth;
while (<>) {
next unless /^SELECT/i; # SELECTs only, assume whole query on one line
chomp;
my $sql = /\bWHERE\b/i ? "$_ AND 1=0" : "$_ WHERE 1=0"; # XXX ugly!
eval {
$sth = $dbh->prepare($sql); # some drivers don't know column names
$sth->execute(); # until after a successful execute()
};
print $@, next if $@; # oops, problem with that one
print join(', ', @{$sth->{NAME}}), "\n";
}
Бит XXX безобразный! пытается добавить условие «всегда ложное» в SELECT, чтобы движок SQL не выполнял никакой реальной работы, когда вы execute()
. Это очень наивный подход - этот тест /\bWHERE\b/i
не более правильно идентифицирует предложение SQL WHERE, чем простые регулярные выражения, правильно анализирующие имена полей SELECT, - но он, вероятно, сработает.