ошибка с blob-полем

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
buratino
Сообщения: 11
Зарегистрирован: 22 сен 2010, 16:26

ошибка с blob-полем

Сообщение buratino » 29 сен 2010, 13:09

Добрый день!
есть
в таблице т1 поле s1 определено как blob, name - varchar(32);
запрос вида
delete from name='имя' and s1='бла-бла-бла'
имею при выполнении (в программе, в ibexpert) ошибку
Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.

что я делаю не так? в faq ответа не нашел.
причем если в эксперте ограничиваю значение для s1 по длине (просто для проверки), то ошибки нет

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: ошибка с blob-полем

Сообщение Dimitry Sibiryakov » 29 сен 2010, 14:48

Что значит "ограничиваю значение s1 по длине"? BLOB поля ограничены только возможностями сервера.

Да и запрос "delete from name='имя'" чисто технически выполняться не может...

buratino
Сообщения: 11
Зарегистрирован: 22 сен 2010, 16:26

Re: ошибка с blob-полем

Сообщение buratino » 29 сен 2010, 15:39

Dimitry Sibiryakov писал(а):Что значит "ограничиваю значение s1 по длине"? BLOB поля ограничены только возможностями сервера.

Да и запрос "delete from name='имя'" чисто технически выполняться не может...
ну да, конечно.
я не копировал текст, а набирал заново в тексте этого сообщения. поэтому пропустил.
на самом деле пытаюсь выполнить
delete from t1 where name='имя' and s1='...'

В s1 хранится текст sql-предложения, типа 'select s1,s2,s3,s4,..... from ..... ' - все как положено по синтаксису.
так вот, если я принудительно делаю длину меньше (укорачиваю селект, не заботясь о синтаксисе), то начиная с некоторого значения эксперт ошибку перестает выдавать.
т.е., есть какая-то зависимость от длины значения, если это blob? или с blob вообще нельзя проверять значения в where ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: ошибка с blob-полем

Сообщение kdv » 30 сен 2010, 02:47

Хоть поле s1 и блоб, все-таки сравнивается в запросе он со строкой, и больше 32к она быть никак не может. И если в эту строку запихнуть больше, то будет как раз такая ошибка.

Вообще удивляет, что Вы не можете посчитать размер этого самого = '...' когда ошибка не выдается, и когда начинает выдаваться.
То есть, фраза "начиная с некоторого значения эксперт ошибку перестает выдавать" очень замечательная. Типа, я тут чего то делаю, и ошибка то выдается, то нет. А чего делаю - непонятно.

buratino
Сообщения: 11
Зарегистрирован: 22 сен 2010, 16:26

Re: ошибка с blob-полем

Сообщение buratino » 30 сен 2010, 11:49

kdv писал(а):Хоть поле s1 и блоб, все-таки сравнивается в запросе он со строкой, и больше 32к она быть никак не может. И если в эту строку запихнуть больше, то будет как раз такая ошибка.

Вообще удивляет, что Вы не можете посчитать размер этого самого = '...' когда ошибка не выдается, и когда начинает выдаваться.
То есть, фраза "начиная с некоторого значения эксперт ошибку перестает выдавать" очень замечательная. Типа, я тут чего то делаю, и ошибка то выдается, то нет. А чего делаю - непонятно.
могу посчитать и считал.
просто , думал что это не принципиально.
32к тут не пахнет - всего 250 байт. Т.е., оставляю в значении чуть меньше - 240 и ошибки нет.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: ошибка с blob-полем

Сообщение Dimitry Sibiryakov » 30 сен 2010, 13:55

Версию сервера ты, похоже, тоже считаешь непринципиальной... А зря.

Добавлено немного погодя:
Чисто от скуки попытался воспроизвести:

Код: Выделить всё

Use CONNECT or CREATE DATABASE to specify a database
create database "bt.fdb" user "sysdba" password "masterkey";
create table t (n varchar(40), b blob sub_type text);
insert into t values ('abc', 'abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ');
delete from t where n='abc' and b='abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ';
show version;
ISQL Version: WI-V2.1.1.17910 Firebird 2.1
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.1.1.17910 Firebird 2.1"
Firebird/x86/Windows NT (remote server), version "WI-V2.1.1.17910 Firebird 2.1/XNet (SD-ACER7)/P11"
Firebird/x86/Windows NT (remote interface), version "WI-V2.1.1.17910 Firebird 2.1/XNet (SD-ACER7)/P11"
on disk structure version 11.1
drop database;
Никаких ошибок нет. К чему бы это?..

buratino
Сообщения: 11
Зарегистрирован: 22 сен 2010, 16:26

Re: ошибка с blob-полем

Сообщение buratino » 30 сен 2010, 14:55

Dimitry Sibiryakov писал(а):Версию сервера ты, похоже, тоже считаешь непринципиальной... А зря.

Добавлено немного погодя:
Чисто от скуки попытался воспроизвести:

Код: Выделить всё

Use CONNECT or CREATE DATABASE to specify a database
create database "bt.fdb" user "sysdba" password "masterkey";
create table t (n varchar(40), b blob sub_type text);
insert into t values ('abc', 'abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ');
delete from t where n='abc' and b='abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ';
show version;
ISQL Version: WI-V2.1.1.17910 Firebird 2.1
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.1.1.17910 Firebird 2.1"
Firebird/x86/Windows NT (remote server), version "WI-V2.1.1.17910 Firebird 2.1/XNet (SD-ACER7)/P11"
Firebird/x86/Windows NT (remote interface), version "WI-V2.1.1.17910 Firebird 2.1/XNet (SD-ACER7)/P11"
on disk structure version 11.1
drop database;
Никаких ошибок нет. К чему бы это?..
хорошо, что Вы меня так возите фейсом - следующий раз буду знать как задавать вопрос.
WinXP SP2
Firebird-1.5.5.4926
IBExpert 2010.03.25

В Expert-е такой оператор
delete from sqbd where name='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
and sq='select NAME123,12345,1234567,123,9999999999999999999999,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,'
выполняется
Plan
PLAN (SQLT NATURAL)

------ Performance info ------
Prepare time = 0ms
Execute time = 0ms

а, если добавить в конце еще '12345,'
то уже ошибка
"Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
"
вот я ничего и не понимаю.....
поле sq - blob.

CREATE TABLE SQBD (
ID INTEGER NOT NULL,
......
SQ BLOB SUB_TYPE 0 SEGMENT SIZE 1024,
......
);

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: ошибка с blob-полем

Сообщение Dimitry Sibiryakov » 30 сен 2010, 15:32

А назачем у тебя sub_type 0?.. Впрочем и с ним всё нормально:

Код: Выделить всё

Use CONNECT or CREATE DATABASE to specify a database
create database "bt.fdb" user "sysdba" password "masterkey";
create table t (n varchar(40), b blob sub_type 0);
insert into t values ('abc', 'abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ');
delete from t where n='abc' and b='abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ';
delete from t where n='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
and b='select NAME123,12345,1234567,123,9999999999999999999999,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,';
show version;
ISQL Version: WI-V1.5.2.4731 Firebird 1.5
Firebird/x86/Windows NT (access method), version "WI-V1.5.2.4731 Firebird 1.5"
on disk structure version 10.1
drop database;
В-общем, давай воспроизводимый в isql пример. IBExpert - для чайников. Фтопку.

buratino
Сообщения: 11
Зарегистрирован: 22 сен 2010, 16:26

Re: ошибка с blob-полем

Сообщение buratino » 30 сен 2010, 15:46

Dimitry Sibiryakov писал(а):А назачем у тебя sub_type 0?.. Впрочем и с ним всё нормально:

Код: Выделить всё

Use CONNECT or CREATE DATABASE to specify a database
create database "bt.fdb" user "sysdba" password "masterkey";
create table t (n varchar(40), b blob sub_type 0);
insert into t values ('abc', 'abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ');
delete from t where n='abc' and b='abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ';
delete from t where n='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
and b='select NAME123,12345,1234567,123,9999999999999999999999,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,';
show version;
ISQL Version: WI-V1.5.2.4731 Firebird 1.5
Firebird/x86/Windows NT (access method), version "WI-V1.5.2.4731 Firebird 1.5"
on disk structure version 10.1
drop database;
зачем sub_type не знаю - таблица унаследованная.
более того, поскольку с firebird-ом я недавно, то я даже по синтаксису не понимаю что это.

но факт остается фактом! ошибка есть.
а isql и ibexpert одинаково себя в этом плане ведут?

Ответить