My Software has an option to archive older data to an read-only marked database which may be stored to a CD or DVD. I created a Viewer program using IBObjects that displays the data. That worked very well up to Firebird 2.0.3.

Now I moved to Firebird 2.1.1. On opening a query with TIBOQuery (IBObjects) I get following error message:

attempted update on read-only database.

I debugged the source code of IBObjects and found out that following statement is used before opening the Query:

I tried some combinitians and found out that follwing statement fails with that error message:

select *
from rdb$relation_fields
where rdb$default_source is not null)

when I change this to:

select *
from rdb$relation_fields
where rdb$default_source <> null)

everything works well. (I didn't knew before that this is allowed...)

I think this is a bug of Firebird 2.1

Description

My Software has an option to archive older data to an read-only marked database which may be stored to a CD or DVD. I created a Viewer program using IBObjects that displays the data. That worked very well up to Firebird 2.0.3.
Now I moved to Firebird 2.1.1. On opening a query with TIBOQuery (IBObjects) I get following error message:
attempted update on read-only database.
I debugged the source code of IBObjects and found out that following statement is used before opening the Query:
SELECT F.RDB$FIELD_NAME F_FieldName
, F.RDB$RELATION_NAME F_RelationName
, F.RDB$DEFAULT_SOURCE F_DefaultSource
, D.RDB$DEFAULT_SOURCE D_DefaultSource
, D.RDB$FIELD_TYPE D_FieldType
FROM RDB$RELATION_FIELDS F INNER JOIN RDB$FIELDS D
ON D.RDB$FIELD_NAME = F.RDB$FIELD_SOURCE
WHERE (( F.RDB$DEFAULT_SOURCE IS NOT NULL ) OR ( D.RDB$DEFAULT_SOURCE IS NOT NULL ))
AND NOT F.RDB$RELATION_NAME STARTING WITH 'RDB$'
ORDER BY 1
I tried some combinitians and found out that follwing statement fails with that error message:
select *
from rdb$relation_fields
where rdb$default_source is not null)
when I change this to:
select *
from rdb$relation_fields
where rdb$default_source <> null)
everything works well. (I didn't knew before that this is allowed...)
I think this is a bug of Firebird 2.1

thank you for your fast answer. Your right, the query works fine in iSQL. I made some more debugging in IBObjects and found out that the detching of a Dataset of table rdb$relation_fields with an filled rdb$default_source Blob seems to be the problem. The "workaround" with "<> null" doesn't work at all. This Query gives no datasets back and so there was no problem with fetching a dataset...

I could make a small sample application with IBObjects where the problem occurs or do you think I should ask Jason Wharton about this? As said before, with Firebird 2.0.3 and the same IBobjects-Version everything worked well...

pesser added a comment - 04/Aug/08 06:25 AM Hi Vlad,
thank you for your fast answer. Your right, the query works fine in iSQL. I made some more debugging in IBObjects and found out that the detching of a Dataset of table rdb$relation_fields with an filled rdb$default_source Blob seems to be the problem. The "workaround" with "<> null" doesn't work at all. This Query gives no datasets back and so there was no problem with fetching a dataset...
I could make a small sample application with IBObjects where the problem occurs or do you think I should ask Jason Wharton about this? As said before, with Firebird 2.0.3 and the same IBobjects-Version everything worked well...
Thanks Patrick

Since FB 2.1 engine performs transliteraion of blobs between character sets. In this case system blob, stored in UNICODE_FSS, transliterated into connection charset. To do this, temporary blob is created. Engine didn't support temporary blobs creation in read-only databases since read-only databases was introduced in IB6.

Vlad Khorsun added a comment - 10/Aug/08 07:00 AM Since FB 2.1 engine performs transliteraion of blobs between character sets. In this case system blob, stored in UNICODE_FSS, transliterated into connection charset. To do this, temporary blob is created. Engine didn't support temporary blobs creation in read-only databases since read-only databases was introduced in IB6.