Схема 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)
LuckySB Автор
14.05.2015 17:58-2а в код сложно посмотреть?
я ссылку привел на pullrequest и кратко описал в чем именно была проблема.
Давайте для вас более подробно распишу:
там в коде идет посимвольный парсинг строчек файла.
и в этом парсинге есть следующая проверка:
Если встретился символ ';' и это не внутри комментария и т.п. — то проверяем — есть ли что в текущей строке слева от точки с запятой.
Если есть — добавляем в буфер с запросом, добавляем туда же перевод строки и точку с запятой.
и вот тут баг. вместо того, чтобы закрыть if автор там дальше, в том же if вызывает pg_query
вот и получается, что если в строчке слева от точки с запятой ничего нет (символ ';' первый в строке) — то запрос на выполнение не уходит.
ошибка то элементарная, интерес вызывает количество лет, которое она находится в коде достаточно популярного приложения, и достаточная экзотичность условий, которые приводят к ее появлению
thunderspb
14.05.2015 18:54+2О, это та самая рубрика странная со странными работами над ошибками… Прошлая была на -13 рейтинга…
Прочитал описание пуллреквеста — эм, английский бы очень не плохо подтянуть… Что такое «right patch for fix error»? :)
А еще там есть разметка, которой можно код выделить…
nazarpc
14.05.2015 22:04+3Это что, и себе статьи начать писать о каждом pull request?
Ну исправили, спасибо вам от многих пользователей, но на статью для хабра это не тянет.
itcoder
14.05.2015 22:44+1Мне интересно, где же вы таких клиентов нашли которые сами дамп заливают, да еще через phpPgAdmin?
LuckySB Автор
15.05.2015 11:49+1вы таки не поверите.
это dev-сервер на который удаленные разработчики-фрилансеры клиента заливают результаты своего труда.
отсюда и такое разнообразие
vedenin1980
Простите, а что полезного для читателей в этой статье, если вы не написали ничего конкретного, даже в чем бага? Была бага, пофиксел, написал автору в гитхаб, конец. Это такой миниатюрный курс о пулл реквестах гитхаба?