vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
Сегодня вот напоролись на ситуацию, когда добавление ключевого слова в SQL приводит к тому, что постгрес перестает собираться НЕКОТОРЫМи компиляторами.
(разработчики, есественно, немедленно начинают ныть: "А, это винда, она неправильная" Ну и что, что неправильная, работать-то под ней надо).

Но дело оказалось не в винде.
А в том, что на каждое ключевое слово в постгресе создает значение типа enum.
(причем это происходит где-то в недрах ecpg. Ни разу ее видел живьем челвовека, который бы писал на Embedded в C SQL).
А ключевое слово было INFINITY. А в языке C есть макрос INFINITY. А у микрософта есть привычка включать все инклюды какие попало. Вот math.h и попал. А в gcc и clang, видимо, он туда, где определялся этот enum, не включался.

Диагностика от того, что посреди определения enum препроцессор раскрыл какой-то макрос, естественно, крайне невнятная. А файл, при компиляции которого эта ошибка происходит, еще и генерируемый.

Date: 2017-10-17 08:32 am (UTC)
livelight: (Default)
From: [personal profile] livelight
C генерируемым кодом всегда так, особенно если часть идентификаторов приходит от пользователя. За день пишешь генератор для хорошей погоды, а потом неделю втыкаешь защиту ото всяких тёмных углов лексики и синтаксиса языка, библиотек и вот, как выяснилось, макросов.

Date: 2017-10-17 08:38 am (UTC)
From: [personal profile] cae32
префикс добавить к enum?

Date: 2017-10-17 08:51 am (UTC)
livelight: (hot)
From: [personal profile] livelight
А потом ещё gcc добавит от себя к каждой функции префикс "_", чтобы с кем-то ещё не подраться.

Date: 2017-10-17 09:19 am (UTC)
From: [personal profile] cae32
Ну сделайте хотя бы глобальную подстановку в ванильные исходники для своей сборки. Как быстрый workaround пойдёт, а потом можно поднять вопрос в рассылке, ибо INFINITY всё-таки довольно важный define и отмазка в стиле "просто не включайте math.h" будет выглядеть неадекватно.
Edited Date: 2017-10-17 09:20 am (UTC)

Date: 2017-10-17 11:29 am (UTC)
livelight: (Default)
From: [personal profile] livelight
У вас баг в мэппинге SQL -> C, а вы правите язык SQL вместо того, чтобы исправить этот мэппинг.
Это скользкий путь. При таком подходе вам придётся в языке SQL обходить все места, опасные во всех языках, мэппинг в которых из SQL строится где-либо.

Date: 2017-10-17 12:38 pm (UTC)
livelight: (Default)
From: [personal profile] livelight
Это, конечно, усложняет жизнь. Ну вы до них донесли, что поскольку поставщики стандартных и нестандартных библиотек для Си, а также создатели нестандартных расширений для SQL всё время придумывают новые слова, им необходимо придумать механизм защиты от вот этого всего? Навскидку я бы предложил вести список опасных слов, и если таковое попалось - добавлять хотя бы подчёркивание в постфикс, например.

Date: 2017-10-17 11:59 am (UTC)
From: [personal profile] cae32
А, я понял, это было не расширение стандарта SQL, а ваша доработка.

Date: 2017-10-17 10:58 am (UTC)
livelight: (Default)
From: [personal profile] livelight
Синтаксис чего вы поменяли? Postgres'овского SQL?! Или ECPG?

Date: 2017-10-17 09:14 am (UTC)
eldhenn: (Default)
From: [personal profile] eldhenn
Чудесно, просто чудесно. А как отловили-то?

Date: 2017-10-17 10:59 am (UTC)
beldmit: (Программизм)
From: [personal profile] beldmit
Во времена моей работы в Криптокоме я потратил пару дней на то, чтобы какое-то добавление начало компилироваться повсюду на тестовых машинах. Правка содержательно сводилась к добавлению и перестановке заголовочных файлов.

Date: 2017-10-17 11:31 am (UTC)
beldmit: (Default)
From: [personal profile] beldmit
Вряд ли ты. В "Визире" STL использовался только чтобы Черкашина пугать, а там #include были STL-ные, так что скорее всего это была консолька.

Date: 2017-10-17 11:26 am (UTC)
From: [personal profile] cross_join
Ключевое слово в проблеме - макрос.
Используйте пространства имен и константы - и ваши волосы будут чистыми и шелковистыми.

Date: 2017-10-17 11:33 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan
Осталось арендовать машину времени и объяснить про пространства имён и константы Кернигану и Ритчи. Или кто там первый в math.h макрос INFINITY написал.

Date: 2017-10-22 06:35 am (UTC)
netch: (Default)
From: [personal profile] netch
Сарказм не к месту. C++ уровня "си с классами и пространствами имён" сейчас настолько банален, что непонятно, какой есть смысл его не использовать. Ладно ядро, там рантайм очень специфичный, но постгрес уже не того типа проект.
А пространства имён очень спасают от множества подобных ситуаций.

Date: 2017-10-22 06:48 am (UTC)
netch: (Default)
From: [personal profile] netch
Ну тогда и писать надо как на Си, а не как на ЯВУ.
Какое нафиг INFINITY, когда это могло быть только kw_INFINITY?
То же самое ещё в куче мест, как имена полей в структурах.

Date: 2017-10-17 12:39 pm (UTC)
livelight: (hot)
From: [personal profile] livelight
А что, пространства имён уже спасают от препроцессора? ;)

Date: 2017-10-17 12:48 pm (UTC)
eldhenn: (Default)
From: [personal profile] eldhenn
Оставить один макрос - #define # //

Date: 2017-10-17 12:50 pm (UTC)
livelight: (Default)
From: [personal profile] livelight
Ещё второй макрос нужен:
#define //include #include

А вообще не получится: в ванильном Си нет однострочного комментария //

Date: 2017-10-17 12:51 pm (UTC)
eldhenn: (Default)
From: [personal profile] eldhenn
Так вроде в cpp модули добавляют.

Date: 2017-10-22 06:38 am (UTC)
netch: (Default)
From: [personal profile] netch
Конечно, на это нужна соответствующая работа. В частности, потому и придумывают разные <cstdio> в отличие от <stdio.h>, что первые не гадят в общем пространстве имён, а аккуратно размещают свои определения в std; но на это их нужно было когда-то подточить.
Edited Date: 2017-10-22 06:38 am (UTC)

Date: 2017-10-22 08:23 am (UTC)
livelight: (Default)
From: [personal profile] livelight
Дык, в том-то и дело, что сделавший так перестаёт гадить другим, но того, кто так делает (использует пространства имён), это не спасает от тех, кто гадит в препроцессор. И повлиять на этих гадящих можно далеко не всегда.
Кстати, ещё ворк-эраунд: в компиляторе SQL->C перед каждой константой втыкать #undefine для неё :)

Date: 2017-10-17 12:56 pm (UTC)
filin: (Default)
From: [personal profile] filin
О, Витус, скажи мне, как большой специалист по постгресу, какие в наше время (интересующая версия — 9.5) правильные действия, чтобы он сортировал строки по правилам русского языка?

Помнится, в старину надо было и базе чего-то говорить, и установку проводить с правильной локалью, и не дай бог оно потом не в той запустится... Я очень надеюсь, что те времена прошли, но один фиг, хотелось бы знать ответ до того, как база начнет заполняться.

charset — UTF-8.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

January 2026

S M T W T F S
     1 2 3
4 5678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 6th, 2026 05:34 pm
Powered by Dreamwidth Studios