[997]Limit в драйвере MSSQL

Уже исправленные репорты или принятые предложения
Закрыто
Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

[997]Limit в драйвере MSSQL

Сообщение Caveman »

Запрос лимитирования строк с ошибкой (метод applyLimit класса CMssqlCommandBuilder):

Код: Выделить всё

SELECT * FROM (
    SELECT TOP {$limit} * FROM (
        $sql
    ) as [__inner top table__] {$reverseOrdering}
) as [__outer top table__] {$orginalOrdering} 
Псевдонимы для всех таблиц - и существующей и временных - получаются одинаковыми, что не есть правильно. Необходимо либо заменять псевдонимы временных таблиц на [__inner top table__] и [__outer top table__] соответственно, либо вообще убрать псевдонимы.

Код: Выделить всё

SELECT * FROM (
    SELECT TOP $limit * FROM (
        $sql
    ) as [__inner top table__] {$this->removeTableAlias($reverseOrdering)}
) as [__outer top table__] {$this->removeTableAlias($orginalOrdering) } 

Код: Выделить всё

protected function removeTableAlias($sql)
    {
        return preg_replace('/\s+\[[^\]]+\]\.(\[[^\]]+\])/i', ' \1', $sql);
    } 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Limit в драйвере MSSQL

Сообщение samdark »

А можно продублировать в трекер?
Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Limit в драйвере MSSQL

Сообщение Caveman »

Баг уже есть - http://code.google.com/p/yii/issues/detail?id=997
Прокомментировал.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [997]Limit в драйвере MSSQL

Сообщение samdark »

Я помочь с ним не смогу… проверять не на чем. Можно либо подождать Qiang-а, либо хорошенько оттестировать на побочные эффекты и тогда я волью в SVN.
Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: [997]Limit в драйвере MSSQL

Сообщение Caveman »

На самом деле единственный побочный эффект может быть только если в какой-нибудь версии нельзя без задания псевдонима (что маловероятно).
Для стопроцентного кода надо просто заменить псевдонимы:

Код: Выделить всё

SELECT * FROM (
    SELECT TOP $limit * FROM (
        $sql
    ) as [__inner top table__] {$this->replaceTableAlias($reverseOrdering, '[__inner top table__]')}
) as [__outer top table__] {$this->replaceTableAlias($orginalOrdering, '[__outer top table__]') }  
Ну и соответствующую функцию по замене. То есть, главное - правильную регулярку написать.
Закрыто