Комментарии 35
Отличная статья, узнал несколько новых для себя возможностей!
Не знаете, есть ли в планах другие методы join, кроме nested loops? (п. 7.1 в www.sqlite.org/optoverview.html)
есть ли в планах другие методы join, кроме nested loops
Лучше это на форуме SQLite спросить :) Конечно странно, что hash-join не подвезли до сих пор.
Возможно, аргументом потив hash-join можут быть накладные расходы памяти на построение hash-таблицы, но merge join можно сделать в некоторых случаях без доп. памяти. Например, если на обоих соединяемых таблицах есть подходящие индексы btree. Либо реализация псевдо-merge-join, если множество пересечения является сильно разреженным, тоже не требует дополнительной памяти при наличии индексов.
и (реклама!) sqlite-gui (только Windows).
Не, ну так написать — надо еще постараться.
VirusTotal GUI
VirusTotal WF
А еще и раздавать такое счастье… мне лень виртуалку стартовать, так что извините. Да и пайплайн для компиляции не настроен, чтобы свои бинарники получить.
Было 18 детектов на ровном месте, при том что утилитка никак не использует функции работы с сетью или файлами. Всё что она делала — выводила сгенерированный звук, и использовала только нужные для этого API. Такое изменение помогло — по факту оно добавляет в бинарник несколько килобайт кода стандартного рантайма, который не нужен в этой программе и не влияет на её логику, но выполняется при запуске. Это успокоило почти все антивирусы.
Увы, но качество работы антивирусов оставляет желать лучшего. Эвристики очень часто определяют компактные программы как вредоносные. При этом, если задаться целью — нет ничего сложного в том, чтобы написать вредоносный код, чтобы антивирусы ничего не детектили. Обычно для этого достаточно просто выбирать библиотеки потолще и не запариваться с оптимизацией кода по размеру. На кучу стандартного библиотечного кода антивирусы смотрят с меньшим подозрением.
просто чтобы успокоить антивирусы,
Менять код, чтобы успокоить антивирусы, это по сути переговоры с террористами. Это иногда оправдано. Чтобы у снайперов было время занять удобные позиции.
Это вы мне говорите? Я разрабатываю софт на ассемблере (https://fresh.flatassembler.net) – самая любимая жертва всех антивирусов.
Если процитировать Вечеровского (АБС):
— За мою работу они меня лупят уже вторую неделю. Вы здесь совсем ни при чем, бедные мои братишки, котики-песики.
:D
По идее использование цифровой подписи должно снизить градус подозрительности для антивирусов для подобных программ. Но, к сожалению, только цифровая подпись для организаций даёт максимальный уровень доверия. Цифровая подпись, доступная для частных лиц, мало того что стоит неоправданно дорого для хобби-проектов, так ещё и лишь частично снимает подозрения, то есть никаких гарантий, что антивирусы отвяжутся.
Сам факт, что программа является свободной и исходники доступны, является доказательством что программа не вирус и не вредонос.
К тому же, и я и вы говорим о инструментах предназначенных для программистов. Если программист не сумеет сам оценит опасность использования того или иного инструмента, то он просто не дорос до нужного уровня.
Не, ну так написать — надо еще постараться.
Быстро меня раскусили! Недооценил я Хабр :(
Увы, я в курсе этой проблемы. Надо попробовать воспользоваться советом VEG (спасибо!) или собрать Студией. Пайплайн там разворачивать особо не требуется — я Code::Blocks 17 поэтому и выбрал, что он занимает всего ~200мб.
gcc -I ../include -g -shared regexp.c -o regexp2.dll -s
с последующей переименовкой. Лично для меня это странно, т.к. считал, что содержимое не зависит от имени целевого файла.
Результат для тех, кто хочет проверить.
P.S. Заметил, что если не использовать опцию -s, существенно режущую размер dll, то virustotal рапортует о меньшем количестве вирусов.
Заметил, что если не использовать опцию -s, существенно режущую размер dll, то virustotal рапортует о меньшем количестве вирусов.Ну так в том и прикол, что чем меньше кода, тем более подозрительно антивирусы относятся к твоей программе. Видимо, сказывается, что в прошлом бинарники вирусов были в основном неплохо оптимизированы, а по поводу оптимизации обычных программ обычные разработчики не особо запаривались.
Недавняя видео-конференция от создателя (DRH) про sqlite, c 11:09 — The S&T 2020 Conference — D. Richard Hipp, презентация — SQLite Status Report 2020 — Slide 0
Стоит знать про автоматически создаваемую колонку 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.
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;
generate_series
.По умолчанию, если собирать из исходников, только
THREADSAFE=1
есть.А 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 (копи-лефт) лицензию.
Если я для себя модифицировал код, зачем я должен отдавать права на этот код кому то левому.
Да конечно, если я пожелаю отдать этот код в комунити чтобы оно его поддерживало, то можно и отдать права.
И конечно, всегда остаются форки и игры с названием.
Возможности SQLite, которые вы могли пропустить