Как стать автором
Обновить

Комментарии 35

Отличная статья, узнал несколько новых для себя возможностей!

Спасибо за обзор, эта база получает всё больше и больше возможностей.
Не знаете, есть ли в планах другие методы join, кроме nested loops? (п. 7.1 в www.sqlite.org/optoverview.html)
главное, чтобы из SQLite не превратилась в «SQLarge».
есть ли в планах другие методы join, кроме nested loops

Лучше это на форуме SQLite спросить :) Конечно странно, что hash-join не подвезли до сих пор.
Спрошу на форуме.
Возможно, аргументом потив hash-join можут быть накладные расходы памяти на построение hash-таблицы, но merge join можно сделать в некоторых случаях без доп. памяти. Например, если на обоих соединяемых таблицах есть подходящие индексы btree. Либо реализация псевдо-merge-join, если множество пересечения является сильно разреженным, тоже не требует дополнительной памяти при наличии индексов.
и (реклама!) sqlite-gui (только Windows).

Не, ну так написать — надо еще постараться.
VirusTotal GUI

VirusTotal WF

А еще и раздавать такое счастье… мне лень виртуалку стартовать, так что извините. Да и пайплайн для компиляции не настроен, чтобы свои бинарники получить.
Обычное дело для не раздутых бинарников. Сам совсем недавно оказался в похожей ситуации, когда приходилось добавлять неиспользуемый код для одной компактной утилитки, просто чтобы успокоить антивирусы, и разблокировать свой сайт в Google Safe Browsing.

Было 18 детектов на ровном месте, при том что утилитка никак не использует функции работы с сетью или файлами. Всё что она делала — выводила сгенерированный звук, и использовала только нужные для этого API. Такое изменение помогло — по факту оно добавляет в бинарник несколько килобайт кода стандартного рантайма, который не нужен в этой программе и не влияет на её логику, но выполняется при запуске. Это успокоило почти все антивирусы.

Увы, но качество работы антивирусов оставляет желать лучшего. Эвристики очень часто определяют компактные программы как вредоносные. При этом, если задаться целью — нет ничего сложного в том, чтобы написать вредоносный код, чтобы антивирусы ничего не детектили. Обычно для этого достаточно просто выбирать библиотеки потолще и не запариваться с оптимизацией кода по размеру. На кучу стандартного библиотечного кода антивирусы смотрят с меньшим подозрением.
просто чтобы успокоить антивирусы,

Менять код, чтобы успокоить антивирусы, это по сути переговоры с террористами. Это иногда оправдано. Чтобы у снайперов было время занять удобные позиции.

Согласен, но проигнорировать было сложно, так как все популярные браузера стали блокировать закачки с моего сайта, и соответственно пользователи жаловались на это. Я несколько раз подавал апелляции в Google, присылал ссылку на исходники и объяснял что эта программа делает, но там походу никто то что я писал не читал, мои апелляции просто отклоняли, а сайт попадал во всё большее количество чёрных списков, которые импортируют себе данные из Google Safe Browsing. Пришлось таки немного изменить код. Ещё был вариант поставить пароль на архив с программой, но мне такой вариант нравится ещё меньше, так как выглядит ещё более подозрительно для обычного пользователя.

Это вы мне говорите? Я разрабатываю софт на ассемблере (https://fresh.flatassembler.net) – самая любимая жертва всех антивирусов.


Если процитировать Вечеровского (АБС):


— За мою работу они меня лупят уже вторую неделю. Вы здесь совсем ни при чем, бедные мои братишки, котики-песики.

:D

Я в курсе, что вы разрабатываете Fresh IDE и AsmBB на FASM =) Сам для некоторых проектов пользуюсь FASM (например, патч для Need For Speed III).

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

Сам факт, что программа является свободной и исходники доступны, является доказательством что программа не вирус и не вредонос.


К тому же, и я и вы говорим о инструментах предназначенных для программистов. Если программист не сумеет сам оценит опасность использования того или иного инструмента, то он просто не дорос до нужного уровня.

Сам факт, что программа является свободной и исходники доступны, является доказательством что программа не вирус и не вредонос.

Это чего вдруг-то?

Не, ну так написать — надо еще постараться.

Быстро меня раскусили! Недооценил я Хабр :(

Увы, я в курсе этой проблемы. Надо попробовать воспользоваться советом VEG (спасибо!) или собрать Студией. Пайплайн там разворачивать особо не требуется — я Code::Blocks 17 поэтому и выбрал, что он занимает всего ~200мб.
Вероятно, в вашем случае антивирусы тоже реагируют на нестандартную точку входа. По-видимому, когда антивирусы видят там привычную точку входа msvcrt, это делает их немного спокойнее. Ставить всю Visual Studio не обязательно — можно поставить только Build Tools. Как вариант, можно ещё собирать софтину при помощи Clang — он умеет использовать стандартный Windows SDK и хорошо совместим с MSVC, даже нестандартные расширения всякие поддерживает.
Кажется мне удалось договориться с террористами. Для этого пришлось обновить mingw с версии 5.1.0, которая идет в комплекте с Code::Blocks 17, до 9.2.0. А так же пару dll собрать как
gcc -I ../include -g -shared regexp.c -o regexp2.dll -s
с последующей переименовкой. Лично для меня это странно, т.к. считал, что содержимое не зависит от имени целевого файла.

Результат для тех, кто хочет проверить.

P.S. Заметил, что если не использовать опцию -s, существенно режущую размер dll, то virustotal рапортует о меньшем количестве вирусов.
Заметил, что если не использовать опцию -s, существенно режущую размер dll, то virustotal рапортует о меньшем количестве вирусов.
Ну так в том и прикол, что чем меньше кода, тем более подозрительно антивирусы относятся к твоей программе. Видимо, сказывается, что в прошлом бинарники вирусов были в основном неплохо оптимизированы, а по поводу оптимизации обычных программ обычные разработчики не особо запаривались.
Виндовая затычка для антивируса еще при скачивании ругнулась, поэтому полез дальше копать.

Стоит знать про автоматически создаваемую колонку rowid c уникальным индексом для записей в таблице. А то видел я как для уникального индекса автор вручную добавлял столбец с UUID, раздувая базу кажется втрое от достаточного размера.


С rowid прадва есть немного нюансов, например в настройках по-умолчанию он может быть переиспользован, если удалить строку и потом вставить другую.

Вообще-то стоит, но все таки rowid не принципиально. Потому что, если в таблице есть "integer primary key", то это является по сути то же самое rowid, только переименованным.


И наоборот, если нет "integer primary key" то и знать что есть такая скрытая колона не обязательно. И даже вредно.


Потому что rowid, когда в таблице нет "integer primary key", меняется:


If the rowid is not aliased by INTEGER PRIMARY KEY then it is not persistent and might change. In particular the VACUUM command will change rowids for tables that do not declare an INTEGER PRIMARY KEY. Therefore, applications should not normally access the rowid directly, but instead use an INTEGER PRIMARY KEY.
Эта тема уже была озвучена Krovosos в статье SQLite — замечательная встраиваемая БД (часть 1). Поскольку, за небольшим исключениями, статьи не потеряли своей актуальности, то повторять про rowid я смысла не увидел.
Для поддержки R-Tree индекса требуется собрать SQLite с флагом SQLITE_ENABLE_RTREE (по умолчанию не установлен).

Иногда, этот флаг (как и некоторые другие) установлен по умолчанию. Вот, что по дефолту включено в SQLite 3.33.0 под Windows:

COMPILER=gcc-5.2.0
ENABLE_COLUMN_METADATA
ENABLE_FTS3
ENABLE_FTS5
ENABLE_JSON1
ENABLE_RTREE
THREADSAFE=1

Команда для вывода опций компиляции:
WITH opts(n, opt) AS (
  VALUES(0, NULL)
  UNION ALL
  SELECT n + 1,
         sqlite_compileoption_get(n)
  FROM opts
  WHERE sqlite_compileoption_get(n) IS NOT NULL
)
SELECT opt
FROM opts;
Это sqlite3 для CLI собран с этими флагами, что разумно, т.к. это достаточно ходовые расширения и заставлять пользователей их устанавливать отдельно несколько странно, при том загрузка расширений по умолчанию выключена в целях безопасности (защита от дурака). Кстати, с 3.34.0 будет еще включать generate_series.

По умолчанию, если собирать из исходников, только THREADSAFE=1 есть.
Нет, речь именно про sqlite3.dll для win32 x86 (возможно, это же справедливо и для x64, не проверял), которая распространяется самими разработчиками: i.imgur.com/TB4Fr6L.png

А CLI собран с другими флагами:
# sqlite3.exe
SQLite version 3.33.0 2020-08-14 13:23:32
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> WITH opts(n, opt) AS (VALUES(0, NULL) UNION ALL SELECT n + 1, sqlite_compileoption_get(n) FROM opts WHERE sqlite_compileoption_get(n) IS NOT NULL) SELECT opt FROM opts;

COMPILER=gcc-5.2.0
ENABLE_DBSTAT_VTAB
ENABLE_FTS3
ENABLE_FTS5
ENABLE_JSON1
ENABLE_RTREE
ENABLE_STMTVTAB
ENABLE_UNKNOWN_SQL_FUNCTION
THREADSAFE=0

По умолчанию, если собирать из исходников, только THREADSAFE=1 есть.

Да, но это только если собирать самому из исходников, а не взять готовую dll.

Не думаю, что в прод кто-то собирает sqlite из исходников. Ею пользуются зачастую именно потому, что она уже есть собранная. Вчера проверял расширения на всех своих серверах, включая один, не обновлявшийся с 2015 года, и RTREE включен везде: и в консоли, и в python.

Хорошая статья, добрая.


Конечно, надо помнить о том, что если используете относительно свежие фичи SQLite в своем продукте — необходимо будет убедиться, что в рабочем окружении продукта будет соответственно достаточно свежая библиотека SQLite. Ваш Кэп.


Круто, что кастомная лизензия позволяет статично и безнаказанно вкомпиливать в свой бинарь амальгаму из пары .c + .h исходников.

кастомная лизензия

Какая такая "кастомная"? Лицензия SQLite – "public domain" – делайте что хотите.

pacman -Qi sqlite | grep License
Licenses        : custom:Public Domain

Почему-то public domain считается кастомной. Наверное из-за редкости использования и сложности по compliance. Насколько я изучал тему, авторы SQLite очень заморочились на эту тему, чтобы даже в самых долбанутых юрисдикциях их код считался максимально свободным. Как минус, вы не можете просто отправить патч/pull request: его даже читать не будут, чтоб не понахватать оттуда чужих идей непонятного происхождения.

Нет, дело там, насколько я знаю в авторских прав.


И это проблема не только public domain, но и всех "permissive license" схемах: BSD, MIT и всякие такие.


Потому что, разрешение на использованиe они вам дают, но каждый, чей код используется в проекте, сохраняет за собой авторские права на своей части кода. Из за этого могут последовать всякие нехорошие юридические последствия, по крайней мере в США. Ну и управление проекта становится сложным и не гибким.


Поэтому, чтобы стать разработчиком SQLite (ну или в других проектах DRH), надо подписать отказ от авторских прав в пользу DRH, ну или его компании, не суть. Но вполне реально, если очень хочется.


Было дело, дискутировали с DRH эту тему, но я отказался подписывать – не люблю такие юридические пляски. Поэтому и использую EUPL (копи-лефт) лицензию.

Не понимаю проблему

Если я для себя модифицировал код, зачем я должен отдавать права на этот код кому то левому.

Да конечно, если я пожелаю отдать этот код в комунити чтобы оно его поддерживало, то можно и отдать права.

И конечно, всегда остаются форки и игры с названием.

Так нет по сути никаких проблем. Просто особенности взаимодействия пермисив лицензии и законы авторского права.


Иногда приходится делать дополнительные движения, что несколько хлопотно.

НЛО прилетело и опубликовало эту надпись здесь
Вчера вышла версия 3.35.0. Добавил в публикацию returning, drop column и materialized.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории