1. C++ / Говнокод #15794

    +64

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    QSqlQuery my_query;
    my_query.prepare(
              QString("INSERT INTO table1 (number, address, age) VALUES (%1, '%2', %3);")
                              .arg(fromInput1).arg(fromInput2).arg(fromInput3)
              );

    Жаль, но похоже автор не осилил экранирование от SQL-иньекций.

    Запостил: LispGovno, 19 Апреля 2014

    Комментарии (29) RSS

    • Кстаи, полнотекстовой поиск только в SQLite по дефолту отключен, а в нормальных БД он обычно всегда включен по дефолту?
      И кстати полнотекстовой поиск в нормальных БД только по слову целеком ищет или может и по части слова? Слышал что SQLite может только слова индексировать полностью, а не их части.
      Ответить
      • Для полнотекстового отдельные особые индексы строятся.
        Ответить
        • Я слышал, что для SQLite это обычные деревья поиска слов, отсортированные в лексикографическом порядке. То есть по сути быстро найти по подстроке нельзя.

          И мне интересно почему они всегда строят деревья вместо возможности заюзать хештаблицы аля мапа слово на позицию.
          Ответить
          • В постгресе FTS тоже не дает по подстрокам искать. Но там нормализуются окончания, поэтому твой коммент нашелся бы и по фразе "дерево строится". Как в оракуле - х.з.

            > вместо возможности заюзать хештаблицы аля мапа слово на позицию
            Потому что будет слишком дохуя?
            Ответить
            • > Потому что будет слишком дохуя?
              А чем мапа из дерева меньше мапы из хештаблицы?
              Ответить
              • Ты предлагаешь забить все куски всех слов в эту карту? Там же будет твориться ёбаный квадратичный пиздец ;)))

                Поэтому в том же постгресе сделано так:
                select to_tsvector('хуй, пизда и джигурда');
                -- 'джигурд':4 'пизд':2 'ху':1
                И индекс строится уже по нормализованным словам. И ищет более-менее мягко, и индексы не так уж пухнут, как если в них забивать все-все-все куски...
                Ответить
                • > квадратичный
                  Чё это вдруг? Чем хештаблица не устроила то?
                  Ответить
                  • Блин, давай пока отложим хештаблицы и деревья, и сформулируем то, что ты будешь в них пихать?

                    Что во что твоя карта будет отображать?

                    P.S. Я не особо шарю в кишках GiST и GIN индексов ;( Более того, для меня они чорная магия.
                    Ответить
                    • Но судя по тому, что у GIN'а сложность растет пропорционально логарифму количества разных слов - это походу и есть то самое древо, отображающее слова в ссылки на записи.
                      Ответить
                    • > GiST и GIN
                      В гуглокартинках по обоим гуглится такая жопа, что я чуть не проблювался. Особенно от первого.

                      Ладно первое я ещё могу представить. Второе - это что?

                      Допустим все префиксы всех слов мы скидали в хештейбл. Получилась здоровая ёба. Собственно мапим например 'джигурд' на строку таблицы.
                      Ответить
                      • > все префиксы всех слов
                        Да нафига они нужны? Это же только дичайше раздует индекс (мелкие префиксы встречаются в дохера и больше строк), да добавит ложных сработок (по слову 'ху' будет искаться и 'хуй' и 'художник' и 'хутор'...). Ну и по серединам слов один хрен искать не будет :(

                        P.S. Надеюсь ты не предлагаешь потом искать все префиксы искомых слов в этой мапе (чтобы по 'художнику' находился 'хуй')? :)

                        Поэтому и выбрали более-менее разумную альтернативу - тупо обрезать окончания у слов. В оракле и M$ может быть и по-другому, надо дождаться d++ или dbdev...
                        Ответить
                        • Я просто не так выразился.
                          Имел в виду просто слова без окончаний мапить на строку. Я не предлагал строить префиксные деревья или забивать мапу всеми префиксами одного слова
                          Ответить
                          • > Имел в виду просто слова без окончаний мапить на строку.
                            Дык постгрешный GIN и sqlite вроде так и делают?
                            Ответить
                            • Но они делают деревья вместо хештаблиц. Почему?

                              Единственное предположение у меня в том, что часто < нужно делать, но вот в случае поиска подстроки < уже не нужно. Так что это не оправдание, а вот самое главное оправдание видимо рехешинг при расширении. И он видимо дохрена долгий
                              Ответить
                              • Ну да, рехеш создает непредсказуемые задержки, что для того же OLTP вообще смертельно. А дерево хоть и помедленней (на случайном доступе, на последовательном оно вклочья порвет хеш из-за i/o), зато распределение задержек более-менее ровное и предсказуемое...

                                И локальности нету - в хеш-табличках же стоящие рядом ключи размазаны по всей таблице, в в дереве - стоят рядом. (Хотя в этой конкретной задаче локальность вроде как и не нужна).
                                Ответить
                                • > Хотя в этой конкретной задаче локальность вроде как и не нужна

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

                                  Я тут как раз just for lulz пишу биграмный поиск на крестах, тема близка :) У меня только in-memory, потому юзаю хэш-таблицы.
                                  Ответить
                                  • > биграмный поиск
                                    Поиск в тексте по двум символам?
                                    Ответить
                            • Так что за GIN? Не гуглится
                              Ответить
                              • http://www.postgresql.org/docs/9.1/static/textsearch-indexes.html
                                Ответить
                              • http://www.postgresql.org/docs/9.3/static/indexes-types.html

                                А вот здесь все индексы, какие там есть.
                                Ответить
                                • |&>
                                  @>
                                  Няшно. Пошел читать.
                                  Питушки мотивируют.
                                  Ответить
                        • Хотя вот если бы не потребление, то префиксное дерево было бы весьма кстати, если искать по произвольной части слова.
                          Ответить
                        • > и M$ может быть и по-другому
                          Какие-то мапы строят в MS: http://technet.microsoft.com/en-us/library/ms142505(v=sql.105).aspx
                          Ответить
          • create table comments (id serial, text text);
            insert into comments (text) values ('И мне интересно почему они всегда строят деревья вместо возможности заюзать хештаблицы аля мапа слово на позицию.');
            insert into comments (text) values ('В постгресе FTS тоже не дает по подстрокам искать. Но там нормализуются окончания, поэтому твой коммент нашелся бы и по фразе "дерево строится". Как в оракуле - х.з.');
            select * from comments where text @@ 'строить дерево'
            -- показывает обе фразы
            select * from comments where text @@ 'искать подстроку'
            -- показывает только мою
            Ответить
      • > в нормальных СУБД по дефолту
        в оракле да, Oracle Text доступен даже в Express Edition, хотя, вроде, раньше имелся только начиная со Standard
        Ответить
      • > в нормальных БД он обычно всегда включен по дефолту?
        В MS SQL Server-e полнотекстовой поиск является отдельным сервисом (есть во всех версиях, кроме экспресс), который надо отметить галкой при установке, запускается отдельно от ядра СУБД (хотя часть поиска всё-же есть в ядре). По-умолчанию не включён.
        Ответить
    • Тем более кутишные запросы вполне умеют в параметризацию.
      Ответить
      • Я более того скажу - они ещё и сами экранируют от скул инъекций, если в параметрах бака. По крайней мере на нормальных БД.
        Ответить
        • > По крайней мере на нормальных БД.
          На ненормальных тоже норм. По крайней мере кутишный драйвер БД разбирается в экранировке намного лучше юзера :)

          Олсо там есть баг: http://govnokod.ru/12077
          Ответить

    Добавить комментарий