Bug 10005

Summary: Error:undefined symbol: RelationUsesTempNamespace when 1C create database
Product: Postgres@Etersoft Reporter: capitan <bla-bla-bla>
Component: пакетыAssignee: Станислав Коробейников <stas>
Status: CLOSED FIXED QA Contact: Konstantin Artyushkin <akv>
Severity: critical    
Priority: P4 CC: akv, lav
Version: не указана   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: 40385 Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 11144    
Deadline: 2015-10-07   

Description capitan 2014-05-29 16:20:15 MSK
If posible recompile package postgre-etersoft9.2-contrib_9.2.4-eter2ubuntu_amd64.deb

Solved:http://tarkhil.livejournal.com/1154569.html?thread=8280841

4. В разных версиях постгреса то появляется, то исчезает макрос

#define RelationUsesTempNamespace(relation) \
((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP)

если его нет - то добавить в contrib/fasttrun/fasttrun.c
Comment 1 Vitaly Lipatov 2014-09-11 18:40:15 MSK
Откладываем задачи, к которым не обращались более 100 дней.
Comment 3 Konstantin Artyushkin 2015-12-11 18:21:12 MSK
Беглый поиск по коду версии 9.2.14 не нашёл определение этого макроса 

$ack RelationUsesTempNamespace ./*                                                                                                     rebased [0ca422f]
contrib/fasttrun/fasttrun.c
47:	if ( !RelationUsesTempNamespace(rel) )


====

Согласно заявке  40385 без него Ubuntu ругается:

ERROR: could not load library /usr/lib/x86_64-linux-gnu/postgresql/fasttrun.so undefined
Comment 4 Станислав Коробейников 2016-06-16 19:49:44 MSK
В postgres с tag REL9_2_1 в файле rel.h есть макрос:
/*
 * RelationUsesTempNamespace
 *		True if relation's catalog entries live in a private namespace.
 */
#define RelationUsesTempNamespace(relation) \
	((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP)

В commit'е fe2ef429a19b25903438b882ce16617a6e700d0f (Fix failure to ignore leftover temp tables after a server crash.) он удаляется. При этом используется другая конструкция:
-       if (RelationUsesTempNamespace(rel))
+       if (isTempOrToastNamespace(rel->rd_rel->relnamespace))
функция isTempOrToastNamespace находится в следующих файлах
src/include/catalog/namespace.h
src/backend/catalog/namespace.c
заголовок и реализация соответственно. 

Но пока я не разобрался с ситуацией в gitum'е. Там вроде бы макрос ещё есть. А если нет, то как тогда собралось и слинковалось. А если есть, то в что вызывает ошибку. Нужно прокосультироваться с akv
Comment 5 Konstantin Artyushkin 2016-06-17 12:43:28 MSK
(Ответ Станислав Коробейников на комментарий4)
> В postgres с tag REL9_2_1 в файле rel.h есть макрос:
> /*
>  * RelationUsesTempNamespace
>  *		True if relation's catalog entries live in a private namespace.
>  */
> #define RelationUsesTempNamespace(relation) \
> 	((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP)
> 
> В commit'е fe2ef429a19b25903438b882ce16617a6e700d0f (Fix failure to ignore
> leftover temp tables after a server crash.) он удаляется. При этом
> используется другая конструкция:
> -       if (RelationUsesTempNamespace(rel))
> +       if (isTempOrToastNamespace(rel->rd_rel->relnamespace))
> функция isTempOrToastNamespace находится в следующих файлах
> src/include/catalog/namespace.h
> src/backend/catalog/namespace.c
> заголовок и реализация соответственно. 
> 
> Но пока я не разобрался с ситуацией в gitum'е. Там вроде бы макрос ещё есть.
> А если нет, то как тогда собралось и слинковалось. А если есть, то в что
> вызывает ошибку. Нужно прокосультироваться с akv

Посмотрел по истории веток rebased, upstream и mainline. 
В ветке upstream нет папки contrib и всего туда входящего.
В коммите fe2ef429a19b25903438b882ce16617a6e700d0f действительно происходит глобальная замена макроса на функцию isTempOrToastNamespace(rel->rd_rel->relnamespace). Что не было выполнено в файлах из папки contrib. 
Почему собралось без ругани - загадка. В spece сборки не нашёл никаких ignore  на проблемы линковки.
Comment 6 Станислав Коробейников 2016-06-20 18:58:55 MSK
contrib'ы собираются с флагом shared, и при такой сборки
gcc  -I../../src/include  -fpic -c -o  fasttrun.o fasttrun.c
gcc -fpic -shared -o fasttrun.so fasttrun.o

можно собрать foo(bar()); и получить только два варнинга:

fasttrun.c:38:2: warning: implicit declaration of function ‘foo’ [-Wimplicit-function-declaration]
  foo(bar());
  ^
fasttrun.c:38:6: warning: implicit declaration of function ‘bar’ [-Wimplicit-function-declaration]
  foo(bar());
      ^
Заменил 
 -       if (RelationUsesTempNamespace(rel))
на
 +       if (isTempOrToastNamespace(rel->rd_rel->relnamespace))
варнинги сборки исчезли. 

Написал скрипт, который проходится по файлам sql в /usr/share/postgresql/extension и /usr/share/postgresql/contrib и выполняет. Т.е. должны ставиться все расширения. Ошибка в contrib'е нашлась. 
Пока не собрался postgres для p7 собрал на builder'е, и поставил с no-deps, эта ошибка ушла. Но из-за несовпадения версий libicu в p7 и сизифе появились другие.
Comment 7 Vitaly Lipatov 2016-06-21 17:30:52 MSK
(Ответ Станислав Коробейников на комментарий6)
> contrib'ы собираются с флагом shared, и при такой сборки
> gcc  -I../../src/include  -fpic -c -o  fasttrun.o fasttrun.c
> gcc -fpic -shared -o fasttrun.so fasttrun.o
> 
> можно собрать foo(bar()); и получить только два варнинга:
> 
> fasttrun.c:38:2: warning: implicit declaration of function ‘foo’
> [-Wimplicit-function-declaration]
>   foo(bar());

добавить -Werror=implicit-function-declaration ?
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Comment 8 Станислав Коробейников 2016-06-22 17:56:32 MSK
(In reply to Vitaly Lipatov from comment #7)
> добавить -Werror=implicit-function-declaration ?
> https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
попробовал в spec добавить:
%add_optflags -Werror=implicit-function-declaration
макрос должен добавлять CFLAGS в configure.


не получилось. Не проходит проверку:
checking whether long long int is 64 bits... no
дело в том, что для проверки используется программа из config/c-compiler.m4 
main() {
  exit(! does_int64_work());
}
при этом, похоже, stdlib.h не инклудится. Т.е. и возникает тот самый варнинг, который делается ошибкой.

добавил для сборки contrib и contrib/xml таким образом:
%make_build -C contrib all CFLAGS="%optflags -Werror=implicit-function-declaration"

всё прошло хорошо.
Comment 9 Станислав Коробейников 2016-06-27 22:35:48 MSK
Закрываю до сборки
Comment 10 Станислав Коробейников 2016-07-01 19:09:03 MSK
собралось
Comment 11 Станислав Коробейников 2016-07-01 19:09:30 MSK
ошибка не воспроизводится, всё хорошо, закрываю
Comment 12 Станислав Коробейников 2016-07-01 19:09:42 MSK
ошибка не воспроизводится, всё хорошо, закрываю
Comment 13 Станислав Коробейников 2016-07-06 17:19:25 MSK
Конкретно эту ошибку можно тестировать следующим образом 
createdb -U postgres test
psql -U postgres -d test -f /usr/share/postgresql/contrib/fasttrun.sql >> test.log || echo "error in $filedb".
dropdb -U postgres test
Comment 14 Станислав Коробейников 2016-07-06 17:20:06 MSK
Т.е. так:
Конкретно эту ошибку можно тестировать следующим образом 
createdb -U postgres test
psql -U postgres -d test -f /usr/share/postgresql/contrib/fasttrun.sql 
dropdb -U postgres test
Comment 15 Konstantin Artyushkin 2016-07-14 16:58:24 MSK
(Ответ Станислав Коробейников на комментарий14)
> Т.е. так:
> Конкретно эту ошибку можно тестировать следующим образом 
> createdb -U postgres test
> psql -U postgres -d test -f /usr/share/postgresql/contrib/fasttrun.sql 
> dropdb -U postgres test

Что-то я не понял с какой версией мы работаем. В названии баги 9.2.4.
А мы с тобой вроде о 9.2.14 говорили. Пакеты source для версии 9.2.4 имеют дату правки за 2013 год. А вот 9.2.14 вроде свежие.

С 9.2.4 вообще что-то непонятное происходит:
Createdb -U postgres test
createdb: не удалось подключиться к базе template1: ?????:  ???????????? "postgres" ?? ?????? ???????? ??????????? (Peer)

#epmqp postgre
postgre-etersoft9.2-9.2.4-eter2ubuntu
postgre-etersoft9.2-contrib-9.2.4-eter2ubuntu
postgre-etersoft9.2-seltaaddon-9.2.4-eter2ubuntu
postgre-etersoft9.2-server-9.2.4-eter2ubuntu

--------

В 9.2.1 ошибка уже с переводом на русский язык
createdb -U postgres test
createdb: не удалось подключиться к базе template1: ВАЖНО:  пользователь "postgres" не прошёл проверку подлинности (Peer)

--------
Пока ещё не нашёл в чём причина или что я не донастроил.
Comment 16 Станислав Коробейников 2016-07-14 20:24:07 MSK
(In reply to Konstantin Artyushkin from comment #15)
> Что-то я не понял с какой версией мы работаем. В названии баги 9.2.4.
> А мы с тобой вроде о 9.2.14 говорили. 
Сейчас речь идёт о 9.2.14. Нужно что бы эта версия заработала

> createdb: не удалось подключиться к базе template1: ВАЖНО:  пользователь
> "postgres" не прошёл проверку подлинности (Peer)
в pg_hba.conf нужно поставить
local ...... trust
http://wiki.etersoft.ru/PostgreSQL#.D0.9D.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9.D0.BA.D0.B0_PostgreSQL
Comment 17 Konstantin Artyushkin 2016-07-15 14:46:15 MSK
Проверил всё работает:
$createdb -U postgres test
$ psql -U postgres -d test -f /usr/share/postgresql/contrib/fasttrun.sql 
BEGIN
CREATE FUNCTION
COMMIT
$ dropdb -U postgres test