?

Log in

No account? Create an account
dump -0f - /dev/mind
Я знаю Haskell, OCaml, GSM, эндофункторы и много других страшных слов
Скромное очарование SQLite 
27th-Jan-2012 08:48 pm
СЯУ, что sqlite обладает двумя совершенно очаровательными "фичами":
1)Когда ты бэкапишь базу, "CREATE VIEW" выписываются в порядке, в котором они создавались.

Казалось бы - ну и что? Теперь представим, что у тебя была вот такая база:
create table a (int aa);
create view b as select * from a;
create view c as select * from b;


Затем вью b немного изменили:
begin; drop view b; create view b as select * from a where aa < 10; commit;

(отдельный вопрос, почему это проходит без ругани, но такое поведение более-менее неплохо документировано)

Если теперь сделать ".dump", то сначала будет выписано "CREATE TABLE a", потом - "CREATE VIEW c", потом - "CREATE VIEW b". Естественно, "create view c" обломается, так как "b" еще не существует. Единственное лечение - пересоздать все view в "правильном порядке".

2)Если у тебя есть вью, описание которого оканчивается комментарием, то в бэкап это попадет вот таким образом:
create view commented_view
  as select something
       from some_table -- pretty useless view;
create view another_view as ....


Видите точку с запятой в конце описания commented_view? А вот sqlite ее не видит, так как она ... Правильно, является теперь частью комментария!

Все это выяснилось в процессе поднятия из бэкапа столетней давности некий софт в условиях ... эээ ... жестких временных ограничений. Помнится, thesz давеча писал, что у sqlite на 1 строку кода приходится 100 строк тестов.

(принимая позу Станиславского) "Не верю!"

Если кому надо: раз багрепорт, два багрепорт.
Comments 
27th-Jan-2012 09:07 pm (UTC)
Скулайт не нужен же. А баги знатные, да, особенно с обработкой комментов
27th-Jan-2012 09:12 pm (UTC)
Втопку. Оракл рулит :)
27th-Jan-2012 09:28 pm (UTC)
Троль! ;)
28th-Jan-2012 03:15 pm (UTC)
Оракл:
col varchar2(100) -- bla-bla
сохраняет комментарий вместе с типом столбца в метаданных.
28th-Jan-2012 03:20 pm (UTC)
Во-первых, непонятно, что это вообще значит: col varchar2(100) -- bla-bla. Где такое используется? Во-вторых, непонятно, хорошо это или плохо, что комментарий хранится в метаданных :).
"Имя, сестра, имя!"
27th-Jan-2012 09:27 pm (UTC)
Мдаааа...
27th-Jan-2012 09:31 pm (UTC)
sqlite вообще веселая штука, например, там очень смешная система типов
27th-Jan-2012 09:43 pm (UTC)
А в какой реализации SQL она не смешная? Имхо везде весело.
27th-Jan-2012 09:47 pm (UTC)
Она там динамическая и слабая, то есть можно в численную колонку записать строку, например. По-моему, это гораздо круче, чем в других.
28th-Jan-2012 02:03 pm (UTC)
Ну так в SQLite, я б сказал, типов вообще нет. Попробуйте туда попишите, к примеру, даты-время, а потом попытайтесь по ним сделать селект where больше меньше. Получите много мата :)
27th-Jan-2012 09:44 pm (UTC)
Забавно... Надо запомнить на всякий случай.
27th-Jan-2012 11:49 pm (UTC)
мне вот sqlite помнится прекрасным мегабайтным сишниклм >_<
28th-Jan-2012 12:31 am (UTC)
А это такая фигня везде. Если воспользоваться мастером от MS SQL server 2000 получиться то же самое
28th-Jan-2012 10:46 am (UTC)
А вот кстати интересно, когда приложения транзакцию коммитят в sqlite, они sync делают?
28th-Jan-2012 11:19 am (UTC)
Зависит от прагм: http://sqlite.org/atomiccommit.html
28th-Jan-2012 02:32 pm (UTC)
Тысяча строк тестов. Тысяча!!!
28th-Jan-2012 09:11 pm (UTC)
Кхм. Схему базы бекапить - это code smell, и это изобрёл не я.
Ваш пример очень нагляден, но есть ещё масса других ситуаций, в которых такое происходит. Например, constraints и triggers.

Правильный способ хранения схемы, безотносительно СУБД, - это скриптование от самого начала до текущей версии.
Следовательно, в первом примере view b должно было создаваться дважды: в первый раз - для версии 1, второй раз - для версии 2.
31st-Jan-2012 10:49 pm (UTC)
в интербейзе 5-м было наоборот... наивное упорядочивание по типам объектов

точный синтакс не помню, но примерно так.

create table aaa (int bbb);

....прошла пара месяцев и захотелось красивостей

create function xxx(int bbb): varchar(20) module 'xxx.dll' name 'xxx';
alter table aaa add (bbb_4human computed by (xxx(aaa)) )

.... все хорошо работало, пока не понадобилось развернуть бэкап

..restoring tables
aaa - failed: .....
..restoring user-defined functions
finishing, closing, going home.

минус одна таблица.
This page was loaded Jul 22nd 2019, 6:16 pm GMT.