FB3. Alternatives for Embedding Quotes in String Literals

Привет всем.

В FB3 был добавлен новый способ представления текстовых литералов в тексте запроса:

<alternate string literal> ::=
{ q | Q } <quote> <alternate start char> [ { <char> }… ] <alternate end char> <quote>

Author: Adriano dos Santos Fernandes

Перед тем как начинать добавлять поддержку этого представления в IBProvider, я пару часов морально готовился, созерцая картинки вида:


Нельзя просто так взять и написать хороший код с первого раза

И как в воду глядел 🙂

Приступив к созданию более-менее «продвинутых» тестов, я таки наступил на грабли. Которые заставили задуматься.

Текст запроса:

select q'Жмама, мама, что я буду делать?Ж' from dual

При использовании кодовой страницы подключения WIN1251, сервер без проблем переварил этот запрос.

А вот если подключаться с использованием UTF8 (текст запроса будет передан на сервер в виде строки с UTF8 символами), сервер уже не в состоянии подготовить этот запрос.

Причина очевидна (и я нашел в исходниках подтверждение) — «alternate char» должен быть однобайтным символом. Коим русская буква «Ж» не является.

Но напрягло меня не это. А то, что IBProvider, хотя и переварил ‘Ж’ (потому что манипулирует UCS2 символами), тоже может споткнуться, если «alternate char» будет четырехбайтным. И надо будет это учесть.

Вот не было печали.

3 комментария

Dmitry Kovalenko  on 11 сентября, 2018

Пять лет прошло. Без изменений.

Dmitry Kovalenko  on 9 августа, 2023

FB4 works fine. To my surprise.

Dmitry Kovalenko  on 19 августа, 2023

Unfortunately I was mistaken — FB4 has the same problems as FB3.

I added into IBProvider (5.31.1.43971) the support of UTF-16 alternative quotes. Amen 🙂

Leave a Comment