|
|
|
Баг или так задумано, where cast ( field as numeric ) > value. postgree 9.3 last stable
|
|||
|---|---|---|---|
|
#18+
Решил на днях поставить wordpress + pgsql, как известно расширение PG4WP с текущей версией WP ( 3.8.1 ) не работает, решил его доработать, расширение само по себе представляет парсер запросов mysql в pgsql, первый же запрос выглядит как Код: sql 1. 2. 3. 4. 5. при этом поле option_value типа varchar. написал парсер такого запроса в вид, который вроде как должен работать в postgree: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. но он не работает, ругается на то что t1.option_value не является числовым, хотя внутренний обзединённый запрос по отдельности выводит только те строки в которых option_value состоит только из цифр. Вероятно где то в процессе подготовки запроса, оптимизатор решает, что быстрее сначала проверить условие cast ( t1.option_value as numeric ) <= 1396370722 ) при этом если изменить запрос до вида: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ситуация не меняется, т.е. запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. отрабатывает без проблем возвращая только числовые значения, а в сумме не работает. проблему причём можно решить ( правда при таком поведении неизвестно насколько верно ) изменив условие внешнего запроса на Код: sql 1. в первом запросе. к сожалению создать простой скрипт для сравнения не удалось, т.к. на простых таблицах оптимизатор преобразование сдвигает на последнюю стадию, и ошибка не вылетает ( сама ошибка - неверный синтаксис для типа numeric "строка с буквами которой в рез подзапроса быть не должно" ) в результате данных изысканий задался вопросом, правильно ли работает оптимизатор, и соответственно стоит ли постить как баг. p.s. как решить задачу с запросом в принципе я нашёл ( 2 способа, собств. функция или pgsql блок ) интересует именно правильно ли с точки зрения теории и документации работает postgree. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2014, 00:25:59 |
|
||
|
Баг или так задумано, where cast ( field as numeric ) > value. postgree 9.3 last stable
|
|||
|---|---|---|---|
|
#18+
NikolayV81, мальчик, ты дурак ? -- хотел было написать я, прочитав первые строки до места авторпри этом поле option_value типа varchar. но потом почитал дальше, и решал таки, что безусловно мальчик, ты дурак . оптимизатор тебе ничего не должен решать насчёт не описанных дефолтных кастов (впрочем и те ему до...) ,которые оно, (неонка, по глупости отождествляемая с оптимайзером) таки умеет делать. напиши ф-ю, на крайняк - устойчивое выражение, делающее чеккинг и только потом каст. и ставь везде его вместо поля в самом ленивом случае это устойчивое выражение будет выглядеть так (собираем из твоих наработок) Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2014, 12:29:52 |
|
||
|
Баг или так задумано, where cast ( field as numeric ) > value. postgree 9.3 last stable
|
|||
|---|---|---|---|
|
#18+
1335напиши ф-ю, на крайняк - устойчивое выражение, делающее чеккинг и только потом каст. и ставь везде его вместо поля в самом ленивом случае это устойчивое выражение будет выглядеть так (собираем из твоих наработок) Код: sql 1. 2. 3. 4. 5. 6. Для тех кто не дочитал до конца про этот пункт написано, решений есть куча, а вот про то как должен относиться оптимизатор к проваливанию условий в подзапросы, и преобразованию типов я что-то не нашёл. к примеру мы можем написать в запросе : Код: sql 1. который будет работать в 100% случаев, но при этом запрос Код: sql 1. работать не будет Тут вопрос в том правильно ли отрабатывает оптимизатор, а не в том кто кому чего обязан, вот о том какое решение было принято я документов не нашёл. Вопрос именно в этом а не в поиске наиболее простого решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2014, 14:28:33 |
|
||
|
Баг или так задумано, where cast ( field as numeric ) > value. postgree 9.3 last stable
|
|||
|---|---|---|---|
|
#18+
NikolayV811335напиши ф-ю, на крайняк - устойчивое выражение, делающее чеккинг и только потом каст. и ставь везде его вместо поля в самом ленивом случае это устойчивое выражение будет выглядеть так (собираем из твоих наработок) Код: sql 1. 2. 3. 4. 5. 6. Для тех кто не дочитал до конца про этот пункт написано, решений есть куча, а вот про то как должен относиться оптимизатор к проваливанию условий в подзапросы, и преобразованию типов я что-то не нашёл. к примеру мы можем написать в запросе : Код: sql 1. который будет работать в 100% случаев, но при этом запрос Код: sql 1. работать не будет Тут вопрос в том правильно ли отрабатывает оптимизатор, а не в том кто кому чего обязан, вот о том какое решение было принято я документов не нашёл. Вопрос именно в этом а не в поиске наиболее простого решения. мальчик, ты не дурак, я ошибся. ты, ять, дебил никаких вопросов про оптимизатор нет есть вопрос, нужно тебя насильно в дурку закатывать или ты и так безвреден короче в сад ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2014, 22:56:43 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38606085&tid=1998757]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
176ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 486ms |

| 0 / 0 |
