Есть довольно большая база (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 в запросах.