Один из наших клиентов поставил задачу — не заливается дамп базы данных через phpPgAdmin. В лог ошибок выводятся сообщения типа: ERROR: relation «public».«company» does not exists.

Схема public в наличии имеется, таблицы company нету. В процессе поиска выясняется, что через консоль этот же дамп заливается без проблем. Если загружать в web-форму в phpPgAdmin — то тоже все отрабатывает. Но вот если загружать этот дамп в тот же phpPgAdmin как файл — идут ошибки.

Вот сокращенное содержимое дампа БД:

DROP TABLE IF EXISTS "public"."company";
CREATE TABLE "public"."company" (
"id" int4 NOT NULL,
"name" varchar(255) COLLATE "default" NOT NULL,
"address" varchar(255) COLLATE "default",
)
WITH (OIDS=FALSE)

;



COMMENT ON COLUMN "public"."company"."name" IS 'название';
COMMENT ON COLUMN "public"."company"."address" IS 'адрес';

-- ----------------------------
-- Records of company
-- ----------------------------
INSERT INTO "public"."company" VALUES ('1', 'Колхоз "Знамя Ильича"', 'Московская область, Коломенский район, с. Нелепецино');


В глаза бросается необычное расположение точки с запятой после команды создания таблицы — на отдельной строке.

Если перенести ее с отдельной строки в строчку с окончанием команды CREATE TABLE — то тогда обработка файла с дампом БД проходит без проблем.

Поиск по коду phpPgAdmin приводит нас в файл /classes/database/Postgres.php функция executeScript

Эта функция вызывается для парсинга загруженного файла с SQL скриптом. В ней присутствует баг с расстановкой фигурных скобок в if. И в итоге pg_query не выполнялся, если строка начиналась с точки с запятой. Поправил код, протестил — все работает.

Теперь надо сообщить о найденном баге автору phpPgAdmin. phppgadmin есть на гитхабе, так что сделать это очень просто:

Заходим/регистрируемся на github.com.
Проект github.com/phppgadmin/phppgadmin
Смотрим открытые pull request и видим, что мы не одиноки.
Есть и другие люди, которые столкнулись с этим багом, но, на мой взгляд, неправильно подошли к его исправлению.
Поэтому предложим свое решение проблемы

Нажимаем справа кнопочку Fork и немного ждем, пока гитхаб скопирует проект к вам.
Клонируем проект теперь уже от себя
git clone https://github.com/LuckySB/phppgadmin

Исправляем баг, коммит, пуш (вводим свои данные для входа на гитхаб) и любуемся своим собственным форком phppgadmin с исправленным багом.

После того как налюбовались — нажимаем на зеленую кнопочку «Compare, review, create a pull request». Гитхаб создает запрос на внесение изменений в основной проект, и тут наступает самое трудное — написать развернутый коммент к своему патчу.

У меня получилось как-то так: github.com/phppgadmin/phppgadmin/pull/30

Комментарии (7)


  1. vedenin1980
    14.05.2015 17:37
    +10

    Простите, а что полезного для читателей в этой статье, если вы не написали ничего конкретного, даже в чем бага? Была бага, пофиксел, написал автору в гитхаб, конец. Это такой миниатюрный курс о пулл реквестах гитхаба?


  1. LuckySB Автор
    14.05.2015 17:58
    -2

    а в код сложно посмотреть?
    я ссылку привел на pullrequest и кратко описал в чем именно была проблема.

    Давайте для вас более подробно распишу:

    там в коде идет посимвольный парсинг строчек файла.
    и в этом парсинге есть следующая проверка:

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

    и вот тут баг. вместо того, чтобы закрыть if автор там дальше, в том же if вызывает pg_query
    вот и получается, что если в строчке слева от точки с запятой ничего нет (символ ';' первый в строке) — то запрос на выполнение не уходит.

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


  1. thunderspb
    14.05.2015 18:54
    +2

    О, это та самая рубрика странная со странными работами над ошибками… Прошлая была на -13 рейтинга…

    Прочитал описание пуллреквеста — эм, английский бы очень не плохо подтянуть… Что такое «right patch for fix error»? :)
    А еще там есть разметка, которой можно код выделить…


  1. nazarpc
    14.05.2015 22:04
    +3

    Это что, и себе статьи начать писать о каждом pull request?
    Ну исправили, спасибо вам от многих пользователей, но на статью для хабра это не тянет.


  1. itcoder
    14.05.2015 22:44
    +1

    Мне интересно, где же вы таких клиентов нашли которые сами дамп заливают, да еще через phpPgAdmin?


    1. LuckySB Автор
      15.05.2015 11:49
      +1

      вы таки не поверите.
      это dev-сервер на который удаленные разработчики-фрилансеры клиента заливают результаты своего труда.

      отсюда и такое разнообразие


    1. Stalker_RED
      15.05.2015 15:53

      Или на шаред хостингах — запросто.