Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сравнение строкового поля с параметром / 20 сообщений из 20, страница 1 из 1
28.12.2015, 05:34
    #39139012
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
Возможно, баян. Запрос:
Код: sql
1.
SELECT 1 FROM RDB$DATABASE D WHERE D.RDB$CHARACTER_SET_NAME = :STR


Если указать параметр длиной более 31 одного символа, FB выдает исключение:
Код: plaintext
1.
2.
3.
4.
Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.

Разработчики знают про данный баг?
...
Рейтинг: 0 / 0
28.12.2015, 07:13
    #39139020
ZeroMQ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
CyberMax,

не то что это баг.

Для параметра создается буфер. В соответствии с типом данных параметра. В данном случае его размер равен длине поля, с которым параметр сравнивается. 31 символ.

Ели нужно, к примеру, 33 символа - задавай длину параметра явно:

Код: sql
1.
SELECT 1 FROM RDB$DATABASE D WHERE D.RDB$security_class = cast(:STR as varchar(33))



А если тип данных параметра взять неоткуда, как вот тут:

Код: sql
1.
SELECT 1 FROM RDB$DATABASE D WHERE :A = :B


- по получишь "Data type unknown".

Вот такая логика.
...
Рейтинг: 0 / 0
28.12.2015, 09:37
    #39139070
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
ZeroMQ,

А если поменялась длина поля? Придется во всех местах переделывать такие приведения. Причем неизвестно, что там по факту будет. Если в STR будет 100 символов?
Считаю, что баг, так как программист не должен учитывать фактическую длину строки при указании значения параметра.
...
Рейтинг: 0 / 0
28.12.2015, 09:43
    #39139081
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
CyberMaxРазработчики знают про данный баг?

да.

Собственно не совсем понятно а какой размер под параметр STR выделять в данном случае. Все 32765 байт? А не жирно ли?
...
Рейтинг: 0 / 0
28.12.2015, 09:55
    #39139097
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
Симонов Денис,

А что мешает задавать размер только при фактической подстановке? Ведь в случае, если поле длиной 25000, из которых по факту используется 5 символов, перерасход памяти получается.
...
Рейтинг: 0 / 0
28.12.2015, 10:05
    #39139105
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
CyberMax,

потому что память под параметры выделяется в момент prepare.

Когда я решил разобраться в UDR и посмотрел каким образом формируются входные и выходные сообщения для ХП, я понял откуда такой геморрой. Может быть когда-нибудь это и поменяют, но уж точно не в 2.5 и 3.0.
...
Рейтинг: 0 / 0
28.12.2015, 10:08
    #39139106
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
CyberMax,

даже в UDR лезть не надо. Просто посмотри примеры работы с новым API. Оно и в старом так было, просто это не видно так явно.
...
Рейтинг: 0 / 0
28.12.2015, 10:33
    #39139121
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
Симонов Денис,

А, понятно, там глобальная проблема. Спасибо за ответы.
...
Рейтинг: 0 / 0
28.12.2015, 12:46
    #39139227
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
CyberMaxСчитаю, что баг, так как программист не должен учитывать фактическую длину
строки при указании значения параметра.
Программист должен понимать, что указывать в параметре для сравнения строку длиннее поля,
совершенно бессмысленно, поскольку ни одно значение поля в принципе не может быть ей равно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.12.2015, 12:54
    #39139231
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
Dimitry SibiryakovПрограммист должен понимать, что указывать в параметре для сравнения строку длиннее поля,
совершенно бессмысленно, поскольку ни одно значение поля в принципе не может быть ей равно.


с точки зрения языка SQL это не запрещено. К тому же можно писать и другие запросы в которых это бы имело смысл. Что-то типа

Код: sql
1.
2.
SELECT * FROM T
WHERE :MyParam containing some_field
...
Рейтинг: 0 / 0
28.12.2015, 13:27
    #39139260
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
CyberMaxСчитаю, что баг, так как программист не должен учитывать фактическую длину строки при указании значения параметра.
Полагаю, если, к примеру, оба поля символьные и тип параметра явно задан через cast, то серверу не стоит пытаться приводить параметр к точному типу поля, а сравнивать строки как есть. Не вижу в этом большой беды.
...
Рейтинг: 0 / 0
28.12.2015, 18:02
    #39139564
ZeroMQ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
Учитывая, что эта тема периодически всплывает, неплохо бы на сию "проблему" указать в документации.
...
Рейтинг: 0 / 0
29.12.2015, 01:35
    #39139706
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
Dimitry SibiryakovПрограммист должен понимать, что указывать в параметре для сравнения строку длиннее поля,
совершенно бессмысленно, поскольку ни одно значение поля в принципе не может быть ей равно.
Представь ситуацию - пользователь вводит текст для поиска записи по условию. Этот текст указывается в значении параметра для выборки. И тут запрос обламывается, потому что пользователь ввел 11 символов, а поле - 10. Это нормально?
Я уже писал, что длина поля может измениться в любой момент. Сегодня 10 символов, завтра кто-то из разработчиков решил, что этого мало и сделал 15 символов. И теперь надо менять весь код, работающий с этим полем?
Длина поля - это особенности реализации. И программист не должен заморачиваться, сколько там по факту длина строки в поле.
...
Рейтинг: 0 / 0
29.12.2015, 01:38
    #39139707
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
DBConstructor[Полагаю, если, к примеру, оба поля символьные и тип параметра явно задан через cast, то серверу не стоит пытаться приводить параметр к точному типу поля, а сравнивать строки как есть. Не вижу в этом большой беды.
Ты читал тему? Речь идет о параметре без всяких CAST.
...
Рейтинг: 0 / 0
29.12.2015, 09:21
    #39139790
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
CyberMax, а какая разница используется ли явное преобразование или неявное? Суть не меняется - "не стоит пытаться приводить параметр к точному типу поля, а сравнивать строки как есть. Не вижу в этом большой беды."
...
Рейтинг: 0 / 0
29.12.2015, 10:14
    #39139827
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
CyberMax, у меня вдруг появилось недопонимание в отношении твоего начального поста. Каким образом на клиенте в параметр CHAR(31) по полю RDB$SECURITY_CLASS подготовленного запроса ты умудряешься класть VARCHAR(33)?
...
Рейтинг: 0 / 0
29.12.2015, 10:36
    #39139844
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
DBConstructorКаким образом на клиенте в параметр CHAR(31) по полю RDB$SECURITY_CLASS подготовленного запроса ты умудряешься класть VARCHAR(33)?
Проверял через IBExpert. Запускаешь запрос и у тебя IBE спрашивает значение параметра. Пишешь строку более 31 символа и получаешь исключение от FB. Как это делается - хз.
...
Рейтинг: 0 / 0
29.12.2015, 13:16
    #39139999
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
CyberMaxЯ уже писал, что длина поля может измениться в любой момент. Сегодня 10
символов, завтра кто-то из разработчиков решил, что этого мало и сделал 15 символов. И
теперь надо менять весь код, работающий с этим полем?
Ну, если руки кривые, то да. Если нет, то код типа такого менять никогда не нужно:
Код: pascal
1.
2.
Query.Prepare;
ParamEdit.MaxLength := Query.Params[0].CharLength;


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.12.2015, 13:30
    #39140010
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
Dimitry SibiryakovНу, если руки кривые, то да. Если нет, то код типа такого менять никогда не нужно:
Код: pascal
1.
2.
Query.Prepare;
ParamEdit.MaxLength := Query.Params[0].CharLength;


Сдается мне, IBExpert валит ошибку именно по этой же причине - override свойств параметра подготовленного запроса под размещение значения большего размера, чем поле, с которым производится сравнение и по которому были рассчитаны свойства параметра. :)
...
Рейтинг: 0 / 0
29.12.2015, 17:52
    #39140228
ZeroMQ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строкового поля с параметром
Странно, что сей "баг" не упоминают в битвах этой ветки.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сравнение строкового поля с параметром / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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