powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / isql паддинг столбов: странный результат для LPAD('', integer_expression, 'X')
6 сообщений из 6, страница 1 из 1
isql паддинг столбов: странный результат для LPAD('', integer_expression, 'X')
    #38606511
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Запустите у себя вот это вот:

Код: plaintext
1.
2.
3.
4.
5.
select lpad('1', 3, '0')||'<' c1 from rdb$database;

select char_length(lpad('1', 2+1, '0')) w from rdb$database;

select lpad('1', 2+1, '0')||'<' c2 from rdb$database;

У мну на
Код: plaintext
1.
2.
ISQL Version: WI-V2.5.3.26726 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-T3.0.0.30984 Firebird 3.0 Alpha 2"

- получится файлик размеров примерно в 65 К - см аттач. :-)
В нём строки номер 12 и 14 имеют длину по 32 Кб.

Это отчего такое с ними случилось ?
...
Рейтинг: 0 / 0
isql паддинг столбов: странный результат для LPAD('', integer_expression, 'X')
    #38606522
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не хватает функции, возвращающей тип данных по выражению.
Если бы такая была, то её вызов для "lpad('1', 2+1, '0')||'<'" вернул бы "varchar(32765) character set ...".

IBExpert в хинте на заголовке колонки отображает тип.
...
Рейтинг: 0 / 0
isql паддинг столбов: странный результат для LPAD('', integer_expression, 'X')
    #38606544
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeНе хватает функции, возвращающей тип данных по выражению.
Открой для себя SET SQLDA_DISPLAY ON;
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
isql паддинг столбов: странный результат для LPAD('', integer_expression, 'X')
    #38606547
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

результат PAD-функций с неконстантным вторым аргументом является строка максимальной длины (32К). Выражение из операторов-констант не считается константным (парсер / оптимизатор никогда не вычисляют выражения).
...
Рейтинг: 0 / 0
isql паддинг столбов: странный результат для LPAD('', integer_expression, 'X')
    #38606552
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
select lpad('1', 3, '0') from rdb$database -- возращает varchar(3)
select lpad('1', 2+1, '0') from rdb$database -- возращает varchar(32765)
select lpad('1', :a, '0') from rdb$database -- возращает varchar(32765)


Проблема ровно одна: движку нужно заранее знать какого размера выделять буфер. Верней не так... Работа с памятью в движке на сегодня устроена так, что требует не только указывать длину строковых полей в БД, но и имеет некоторые другие неудобные архитектурные последствия.
Пока не будет придумана и реализована эффективная работа с резиновым varchar, придётся считаться с некоторыми ограничениями и несуразностями. В delphi например есть оба типа, string(N) и string, причём второй со счётчиком ссылок. И работает всё крайне быстро (например при присваивании одной переменной в другую (или при передаче string-параметра в функцию) не происходит выделения памяти под строку и копирования данных, а происходит лишь увеличение на 1 счётчика ссылок).
В firebird же, насколько я понимаю, при присваивании и передаче в функцию всегда происходит alloc(+zero_allocated_memory)+move.
Всё это сказывается на отжоре памяти и тактах cpu, например при:
Код: sql
1.
select d from (select lpad('1', 2+1, '0') d from rdb$types a, rdb$types b, rdb$types c rows 10000) order by 1


будут выделены и перелопачены лишние мегабайты памяти, причём не только при самом селекте, но и при сортировке. Хотя тут достаточно одного стринга длиной 3 байта, и счётчика ссылок на него.
...
Рейтинг: 0 / 0
isql паддинг столбов: странный результат для LPAD('', integer_expression, 'X')
    #38606555
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeэффективная работа с резиновым varchar
спасибо, поржал

NickDeeВ firebird же, насколько я понимаю, при присваивании и передаче в функцию всегда происходит alloc(+zero_allocated_memory)+move
неправильно считаешь
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / isql паддинг столбов: странный результат для LPAD('', integer_expression, 'X')
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]