Ложные друзья транслятора
Oct. 17th, 2017 11:14 amСегодня вот напоролись на ситуацию, когда добавление ключевого слова в SQL приводит к тому, что постгрес перестает собираться НЕКОТОРЫМи компиляторами.
(разработчики, есественно, немедленно начинают ныть: "А, это винда, она неправильная" Ну и что, что неправильная, работать-то под ней надо).
Но дело оказалось не в винде.
А в том, что на каждое ключевое слово в постгресе создает значение типа enum.
(причем это происходит где-то в недрах ecpg. Ни разу ее видел живьем челвовека, который бы писал на Embedded в C SQL).
А ключевое слово было INFINITY. А в языке C есть макрос INFINITY. А у микрософта есть привычка включать все инклюды какие попало. Вот math.h и попал. А в gcc и clang, видимо, он туда, где определялся этот enum, не включался.
Диагностика от того, что посреди определения enum препроцессор раскрыл какой-то макрос, естественно, крайне невнятная. А файл, при компиляции которого эта ошибка происходит, еще и генерируемый.
(разработчики, есественно, немедленно начинают ныть: "А, это винда, она неправильная" Ну и что, что неправильная, работать-то под ней надо).
Но дело оказалось не в винде.
А в том, что на каждое ключевое слово в постгресе создает значение типа enum.
(причем это происходит где-то в недрах ecpg. Ни разу ее видел живьем челвовека, который бы писал на Embedded в C SQL).
А ключевое слово было INFINITY. А в языке C есть макрос INFINITY. А у микрософта есть привычка включать все инклюды какие попало. Вот math.h и попал. А в gcc и clang, видимо, он туда, где определялся этот enum, не включался.
Диагностика от того, что посреди определения enum препроцессор раскрыл какой-то макрос, естественно, крайне невнятная. А файл, при компиляции которого эта ошибка происходит, еще и генерируемый.
no subject
Date: 2017-10-17 08:32 am (UTC)no subject
Date: 2017-10-17 08:35 am (UTC)no subject
Date: 2017-10-17 08:38 am (UTC)no subject
Date: 2017-10-17 08:51 am (UTC)no subject
Date: 2017-10-17 09:02 am (UTC)Проще оказалось поменять синтаксис на более похожий на человеческий английский.
no subject
Date: 2017-10-17 09:19 am (UTC)no subject
Date: 2017-10-17 11:24 am (UTC)Нам проще было не использовать в этом месте слово INFINITY (тем более что по смыслу INFINITELY там лучше).
no subject
Date: 2017-10-17 11:29 am (UTC)Это скользкий путь. При таком подходе вам придётся в языке SQL обходить все места, опасные во всех языках, мэппинг в которых из SQL строится где-либо.
no subject
Date: 2017-10-17 11:47 am (UTC)Синтаксис SQL - у нас, в нашем расширении. А архитектура мэппинга - она апстримовская.
no subject
Date: 2017-10-17 12:38 pm (UTC)no subject
Date: 2017-10-17 11:59 am (UTC)no subject
Date: 2017-10-17 10:58 am (UTC)no subject
Date: 2017-10-17 11:23 am (UTC)Мы постоянно вносим изменения в посгресовский SQL.
Вот правда новый стандарт SQL JSON еще не дореализовали.
no subject
Date: 2017-10-17 09:14 am (UTC)no subject
Date: 2017-10-17 09:37 am (UTC)Посмотрели что поменялось по сравнению с той версией, что компилируется, посмотрели в генерируемый файл, на ту строчку. начиная с которой оно ругается. Потом я задался вопросом "А почему FOR ему не мешает, а INFINITY - не нравится", и тут до меня дошло что C - case sensitive.
no subject
Date: 2017-10-17 10:59 am (UTC)no subject
Date: 2017-10-17 11:25 am (UTC)А так вообще-то я этим что в Криптокоме, что здесь регулярно занимаюсь.
no subject
Date: 2017-10-17 11:31 am (UTC)no subject
Date: 2017-10-17 11:49 am (UTC)А основные развлечения с переносимостью были в криптопакете. Поскольку визирь для спарков это был скорее proof of concept.
no subject
Date: 2017-10-17 11:26 am (UTC)Используйте пространства имен и константы - и ваши волосы будут чистыми и шелковистыми.
no subject
Date: 2017-10-17 11:33 am (UTC)no subject
Date: 2017-10-17 11:45 am (UTC)Чего уж мелочиться-то с плюсами.
no subject
Date: 2017-10-22 06:35 am (UTC)А пространства имён очень спасают от множества подобных ситуаций.
no subject
Date: 2017-10-22 06:43 am (UTC)no subject
Date: 2017-10-22 06:48 am (UTC)Какое нафиг INFINITY, когда это могло быть только kw_INFINITY?
То же самое ещё в куче мест, как имена полей в структурах.
no subject
Date: 2017-10-22 06:59 am (UTC)no subject
Date: 2017-10-17 12:39 pm (UTC)no subject
Date: 2017-10-17 12:48 pm (UTC)no subject
Date: 2017-10-17 12:50 pm (UTC)#define //include #include
А вообще не получится: в ванильном Си нет однострочного комментария //
no subject
Date: 2017-10-17 12:51 pm (UTC)no subject
Date: 2017-10-18 09:18 am (UTC)no subject
Date: 2017-10-22 06:38 am (UTC)no subject
Date: 2017-10-22 08:23 am (UTC)Кстати, ещё ворк-эраунд: в компиляторе SQL->C перед каждой константой втыкать #undefine для неё :)
no subject
Date: 2017-10-17 12:56 pm (UTC)Помнится, в старину надо было и базе чего-то говорить, и установку проводить с правильной локалью, и не дай бог оно потом не в той запустится... Я очень надеюсь, что те времена прошли, но один фиг, хотелось бы знать ответ до того, как база начнет заполняться.
charset — UTF-8.
no subject
Date: 2017-10-18 04:26 am (UTC)Поскольку между измышлениями Дреппера и правилами русского языка - дистанция огромного размера.
Но если libc-шная collation устраивает, то там на самом деле все довольно просто. Вопрос в том, в курсе ли об этом "просто" мейнтейнер пакетов, или надо повыкидывать то, что он там наворотил и делать как написано в документации на постгрес. Потому что, как правило, мейнтейнеры пакетов эту документацию не читают.
В принципе, там все подробно документировано.
В десятке уже есть возможность собраться с ICU из коробки (но это опять же вряд ли мейнтейнер пакета это сделает), но там ICU-шные коллейшны будут использоваться только если они явно указаны при создании конкретных таблиц и индексов. Нам, чтобы оно работало по умолчанию, опять патчить пришлось.