Парсинг SQL запроса (регулярные выражения)

Romantik

TeaM PHPClub
Парсинг SQL запроса (регулярные выражения)

Приветствую уважаемые.

Вот возникла проблема с переходом на MySQL 5, точнее с именами в таблицах.
Оптимальным решением оказалось взятие имен в обратные кавычки (`)
благо работа идет через абстракцию и править нужно только 1 метод класса
Решил все делать через explode и array_key_exists
Все хорошо, но когда пошла конструкция
Код:
... LEFT JOIN table1.field1=table2.field2 AND table3.field3>0 AND table4.field4!=0
парсинг оказался фактически в тупике да и количество действий и скорость показало что путь выбран не грамотный, что фактически проще регуляркой понаходить участки table1.field1 и заменить их на
`table1`.`field1`
фактически точка встречается еще только в REPLACE(field, '.00', '')
вроде правило есть но тут еще учитывать нужно простые запросы
SELECT field_name AS name FROM table, table2 AS t LEFT JOIN table AS n ...
с таким разбросом написать регулярку у меня не хватит сил и я был бы признателен за любую помощь,
потому как и скорость еще важна.

может кто подскажет проще решение или вообще скажет, что я тормоз и есть опция которая сама подставляет обратные кавычки- я был бы очень признателен.
 

serglt

Анус, ой, Ахтунг
Зачем тебе использовать кавычки? И без них все должно хорошо работать
 

Romantik

TeaM PHPClub
serglt
нет не работает, да и в коде встречается выражение типа
mycms_loop.loop_name AS loop
переделывать код очень проблематично и по времени много
sage
Запросы формируются вида (абстракция):
PHP:
array(
  'table'=> array('table1','table2'),
  'fields'=> array(
    'table1.field1'=>'field1',
    'table2.field2'=>'field1'
  ),
  'join'=> array(
    'table3'=>'table3.field3=table1.field1'
  )
)
и потом в классе парсится этот массив по соотв частям и собирается запрос.

Вот и есть возможность сделать это только в одном методе- не трогая весь код.
 

crocodile2u

http://vbolshov.org.ru
Возможно, причина в том, что в качестве имен таблиц/колонок используются слова, которые не были зарезервированы в 4-й версии, но зарезервированы в 5-й... Впрочем, решению это не помогает..
 

crocodile2u

http://vbolshov.org.ru
Упс, как интересно.. Это уже похоже на багу в парсере mysql. По идее он не должен считать "loop" в такой конструкции отдельным словом и, следовательно, зарезервированным..
 

serglt

Анус, ой, Ахтунг
Дык вот в том то и дело что это просто ключевые слова не дают выполниться запросу. По сему нужно просто используемые имена полей и имена таблиц которые названы ключевыми словами экранировать кавычками.

А так запросы без кавычек работают на ура, и это не обсуждается ;)
 

crocodile2u

http://vbolshov.org.ru
Romantik
Если проблема только с одним словом loop - может быть, сделать ход конем и составить регулярку с учетом этого? Это должно упростить задачу, по идее.. А в дальнейшей разработке учесть этот аспект и каим-то образом обойти?

Еще вариант - обрабатывать нужные элементы входного массива. Правда, возможно, напускать регулярки на каждый ключ/элемент массива будет не очень с точки зрения производительности, зато регулярка(и) должна(ы) получиться не слишком сложная(ые).
 

Romantik

TeaM PHPClub
crocodile2u
к сожалению не только loop а еще несколько полей- но дело в универсальности.
Я вообще думал что такое возможно настройками самого PHP, но просмотрев PhpMyAdmin я увидел свою реализацию данной проблемы.
а юзать регулярку когда идет 30-50 запросов -нужно спецов просить сделать быструю...
Пока продолжил работу в таком плане:
PHP:
$tval=  explode(' AND ', $val); 
IF(array_key_exists(1, $tval)){
 $t0and= explode('=', $tval[0]);
 $t1and= explode('=', $tval[1]);
 $and0=	(array_key_exists(1, $t0and))?'`'.$t0and[0].'` = `'.$t0and[1].'`':'`'.$tval[0].'`';
 $and1=	(array_key_exists(1, $t1and))?'`'.$t1and[0].'` = `'.$t1and[1].'`':'`'.$tval[1].'`';
 $t00val= explode('.', $t0and[0]);
 $t01val= explode('.', $t0and[1]);
 $t10val= explode('.', $t1and[0]);
 $t11val= explode('.', $t1and[1]);
 ...
}
это десятая часть парсера...
видимо прийдется тупо весь код перерабатывать руками
 
Сверху