crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> SQLite AND и OR - возможно, есть бага или фича?, операторы AND и OR дают ошибку
Iron Bug
  опции профиля:
сообщение 10.8.2010, 9:09
Сообщение #1


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Раз уж вспомнила сегодня про SQLite, то напишу про одну багу, на которую я наткнулась:

Есть довольно большая база (60 метров), в ней, в частности, таблица LOG такого вида:
CREATE TABLE LOG(
    ID INTEGER PRIMARY KEY,
    CONFIG_ID INTEGER NOT NULL,
    TIMESTAMP_BEGIN INTEGER NOT NULL,
    TIME_US_BEGIN INTEGER NOT NULL,
    TIMESTAMP_END INTEGER NOT NULL,
    TIME_US_END INTEGER NOT NULL,
    STATE INTEGER NOT NULL,
    PLD_FUNCTION INTEGER,
    PLD_VERSION INTEGER)



У меня была задача выбрать довольно сложную выборку из таблицы:
select ID,CONFIG_ID,
datetime(TIMESTAMP_BEGIN,'unixepoch','localtime')||' '||substr('00000'||TIME_US_BEGIN,length(TIME_US_BEGIN)) as TIME_BEGIN,
datetime(TIMESTAMP_END,'unixepoch','localtime')||' '||substr('00000'||TIME_US_END, length(TIME_US_END)) as ТIME_END,
STATE,PLD_FUNCTION,PLD_VERSION,TIMESTAMP_BEGIN,TIME_US_BEGIN,TIMESTAMP_END,TIME_
US_END
from LOG
    where (((TIMESTAMP_BEGIN>1281376800 and  TIMESTAMP_BEGIN<1281463200) or
(TIMESTAMP_BEGIN==1281376800 and  TIME_US_BEGIN>=0) or (TIMESTAMP_BEGIN==1281463200 and  TIME_US_BEGIN<=0)))
order by ID


При работе запрос выдавал все правильные записи, плюс несколько (порядка 7) совершенно пустых строк (все поля - NULL). Это повторялось и при вызове из моей проги, и при вызове запроса из утилитки SQLite2009Pro.
Вылечилось заменой всех AND и OR в запросе на & и | соответственно.

В простых запросах AND и OR работают нормально. При большой базе и длинных запросах начинаются такие глюки.

Копать особо было некогда, но теперь на всякий случай я не использую AND и OR в запросах.

Сообщение отредактировал Litkevich Yuriy - 10.8.2010, 13:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 2)
legat
  опции профиля:
сообщение 10.8.2010, 17:28
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 8.8.2010
Пользователь №: 1940

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
...
    where (((TIMESTAMP_BEGIN>1281376800 and  TIMESTAMP_BEGIN<1281463200) or
(TIMESTAMP_BEGIN==1281376800 and  TIME_US_BEGIN>=0) or (TIMESTAMP_BEGIN==1281463200 and  TIME_US_BEGIN<=0)))
order by ID

В простых запросах AND и OR работают нормально. При большой базе и длинных запросах начинаются такие глюки.


Возможно стоит заключать всегда в скобки все условные выражения, т.е. для данного случая получится:
...
    where ((((TIMESTAMP_BEGIN>1281376800) and  (TIMESTAMP_BEGIN<1281463200)) or
((TIMESTAMP_BEGIN==1281376800) and  (TIME_US_BEGIN>=0)) or ((TIMESTAMP_BEGIN==1281463200) and  (TIME_US_BEGIN<=0))))
order by ID


Просто про Sql даже в некоторых книгах пишут, что не всегда правильно расставляются приоритеты логических операций, поэтому как выход: скобки. А операторы & и | не всеми СУБД поддерживаются.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 10.8.2010, 18:43
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


скобки не помогали. если бы всё было так просто... :) я это первым делом пробовала, естессна.
SQLite поддерживает и་ AND и &. а вот в чём разница - я хз. но она есть. ибо факт, что на одной и той же базе при смене только обозначений либо работает, либо глючит. пустые записи - это вообще какой-то нездоровый глюк. ибо В БАЗЕ ИХ НЕТ. откуда они берутся - я даже не могу предположить.
я ещё поковыряю этот вопрос, когда время появится. и если что - напишу разработчикам SQLite.

кстати, там ещё была бага, но я тогда её связывала с проблемами транзакций, хотя может это и не оно... в общем, когда у меня база дорастала примерно до 300 метров - при попытке добавления записи возвращалась ошибка, что база "занята". может, это не размер, а количество записей вредило или ещё что. в итоге я просто стала её делить вручную, по 100 метров, и проблема исчезла.
но это тоже надо исследовать.

Сообщение отредактировал Iron Bug - 10.8.2010, 18:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 13:04