Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The database file is growing when the BLOB is assigned to the NULL value [CORE5625] #5891

Open
firebird-automations opened this issue Sep 29, 2017 · 2 comments

Comments

@firebird-automations
Copy link
Collaborator

Submitted by: PEAKTOP (peaktop)

Votes: 1

The database consists of two files:
1) MYDATABASE.FDB - contains all user data
2) MYDATABASE_BLOB.FDB - contains only BLOB field values.

--------------------------------------------------------------
2) Here is MYDATABASE_BLOB.FDB DDL

CREATE TABLE TABL$R_CS_PHOTO (
CS_ID INTEGER NOT NULL,
ID INTEGER NOT NULL PRIMARY KEY,
NAME VARCHAR(255),
FLAG_DELETE SMALLINT DEFAULT 0,
DATE_COMMIT TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PHOTO BLOB SUB_TYPE 0 SEGMENT SIZE 8192
);

1) Here is MYDATABASE.FDB DDL

CREATE TABLE TABL$R_CS_PHOTO (
CS_ID INTEGER NOT NULL,
ID INTEGER NOT NULL PRIMARY KEY,
NAME VARCHAR(255),
FLAG_DELETE SMALLINT DEFAULT 0,
DATE_COMMIT TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PHOTO BLOB SUB_TYPE 0 SEGMENT SIZE 8192
);

CREATE OR ALTER TRIGGER TRIG$R_CS_PHOTO_BIU_240 FOR TABL$R_CS_PHOTO
ACTIVE BEFORE INSERT OR UPDATE POSITION 240
AS
DECLARE VARIABLE P_DB_BLOB TYPE OF COLUMN TABL$R_FILIALS.DATABASE_NAME_REMOTE;
DECLARE VARIABLE P_SQL_STMT TYPE OF COLUMN TABL$J_4.DOCSTR;
BEGIN
P_DB_BLOB = 'MYDATABASE_BLOB.FDB';

IF(NEW.PHOTO IS NULL)THEN
BEGIN
P_SQL_STMT =
'UPDATE OR INSERT INTO TABL$R_CS_PHOTO (CS_ID, ID, NAME, FLAG_DELETE, DATE_COMMIT) '||
' VALUES (?Q_CS_ID, ?Q_ID, ?Q_NAME, ?Q_FLAG_DELETE, ?Q_DATE_COMMIT) '||
' MATCHING(ID) ';
EXECUTE STATEMENT (:P_SQL_STMT)(
Q_CS_ID := NEW.CS_ID
,Q_ID := http://NEW.ID
,Q_NAME := http://NEW.NAME
,Q_FLAG_DELETE := NEW.FLAG_DELETE
,Q_DATE_COMMIT := NEW.DATE_COMMIT
)ON EXTERNAL DATA SOURCE :P_DB_BLOB AS USER 'SYSDBA' PASSWORD 'masterkey';
END
ELSE
BEGIN
P_SQL_STMT =
'UPDATE OR INSERT INTO TABL$R_CS_PHOTO (CS_ID, ID, NAME, FLAG_DELETE, DATE_COMMIT, PHOTO) '||
' VALUES (?Q_CS_ID, ?Q_ID, ?Q_NAME, ?Q_FLAG_DELETE, ?Q_DATE_COMMIT, ?Q_PHOTO) '||
' MATCHING(ID) ';
EXECUTE STATEMENT (:P_SQL_STMT)(
Q_CS_ID := NEW.CS_ID
,Q_ID := http://NEW.ID
,Q_NAME := http://NEW.NAME
,Q_FLAG_DELETE := NEW.FLAG_DELETE
,Q_DATE_COMMIT := NEW.DATE_COMMIT
,Q_PHOTO := NEW.PHOTO
)ON EXTERNAL DATA SOURCE :P_DB_BLOB AS USER 'SYSDBA' PASSWORD 'masterkey';
NEW.PHOTO = NULL;
END
END
------------------------------

Description:

When the client application inserts records into table TABL$R_CS_PHOTO the BLOB records, I import them into an external database 'MYDATABASE_BLOB.FDB'. In the main database 'MYDATABASE.FDB', I had to assign BLOB field value to NULL.

But, the main database 'MYDATABASE.FDB' continues to grow when inserting new records. Every record was inserted with separate transaction.

It seems like: the Firebird-Engine does not mark the pages with NULL-BLOB as deleted.

@firebird-automations
Copy link
Collaborator Author

Commented by: PEAKTOP (peaktop)

Discuss about this bug is placed on the Firebird-Forum (in Russian)

http://www.sql.ru/forum/1272202-a/puhnet-baza-ot-blob

@firebird-automations
Copy link
Collaborator Author

Modified by: PEAKTOP (peaktop)

security: Developers [ 10012 ] =>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant