Skip to content

Commit fc8a889

Browse files
committed
Add AUTO RELEASE TEMP BLOBID transaction option
It makes the transaction release temporary ID of user BLOB just after its materialization. It's useful for massive insertions of records with user-defined BLOBs because it eliminates the memory overhead caused by creating and keeping temporary IDs until the transaction ends. This option is used during the database restore.
1 parent 933ac7b commit fc8a889

File tree

21 files changed

+66
-17
lines changed

21 files changed

+66
-17
lines changed

doc/sql.extensions/README.set_transaction.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ commit fails. This option is mostly used by gfix.
2727
LOCK TIMEOUT nonneg_short_integer: it's the time (measured in seconds) that a
2828
transaction waits for a lock in a record before giving up and reporting an error.
2929

30+
AUTO RELEASE TEMP BLOBID: makes the transaction release temporary ID of user BLOB
31+
just after its materialization. It's useful for massive insertions of records with
32+
user-defined BLOBs because it eliminates the memory overhead caused by creating and
33+
keeping temporary IDs until the transaction ends. This option is used during the
34+
database restore.
35+
3036

3137
Author:
3238
Claudio Valderrama C.

src/burp/BurpTasks.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,7 @@ void RestoreRelationTask::initItem(BurpGlobals* tdgbl, Item& item)
898898
ClumpletWriter tpb(ClumpletReader::Tpb, 128, isc_tpb_version3);
899899
tpb.insertTag(isc_tpb_concurrency);
900900
tpb.insertTag(isc_tpb_no_auto_undo);
901+
tpb.insertTag(isc_tpb_auto_release_temp_blobid);
901902

902903
item.m_tra = item.m_att->startTransaction(&status, tpb.getBufferLength(), tpb.getBuffer());
903904

src/burp/restore.epp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ int RESTORE_restore (const TEXT* file_name, const TEXT* database_name)
421421
// Block added to verbose index creation by Toni Martir
422422
// Always try to activate deferred indices - it helps for some broken backups,
423423
// and in normal cases doesn't take much time to look for such indices. AP-2008.
424-
EXEC SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED NO_AUTO_UNDO;
424+
EXEC SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
425425
if (gds_status->hasData())
426426
EXEC SQL SET TRANSACTION;
427427

@@ -445,7 +445,7 @@ int RESTORE_restore (const TEXT* file_name, const TEXT* database_name)
445445
general_on_error ();
446446
END_ERROR;
447447

448-
EXEC SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED NO_AUTO_UNDO;
448+
EXEC SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
449449
if (gds_status->hasData())
450450
EXEC SQL SET TRANSACTION;
451451

@@ -481,7 +481,7 @@ int RESTORE_restore (const TEXT* file_name, const TEXT* database_name)
481481
END_ERROR;
482482
}
483483

484-
EXEC SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED NO_AUTO_UNDO;
484+
EXEC SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
485485
if (gds_status->hasData())
486486
EXEC SQL SET TRANSACTION;
487487

@@ -745,7 +745,7 @@ void add_files(BurpGlobals* tdgbl, const char* file_name)
745745
END_ERROR;
746746
END_ERROR;
747747

748-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
748+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
749749
if (gds_status->hasData())
750750
EXEC SQL SET TRANSACTION;
751751
}
@@ -3166,7 +3166,7 @@ static void commit_relation_data(BurpGlobals* tdgbl, burp_rel* relation)
31663166
} // end of while
31673167
END_ERROR;
31683168

3169-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
3169+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
31703170
if (gds_status->hasData())
31713171
EXEC SQL SET TRANSACTION;
31723172
}
@@ -7777,7 +7777,7 @@ bool get_relation(BurpGlobals* tdgbl, Coordinator* coord, RestoreRelationTask* t
77777777
general_on_error ();
77787778
END_ERROR;
77797779

7780-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
7780+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
77817781
if (gds_status->hasData())
77827782
EXEC SQL SET TRANSACTION;
77837783
}
@@ -8004,7 +8004,7 @@ bool get_relation(BurpGlobals* tdgbl, Coordinator* coord, RestoreRelationTask* t
80048004
general_on_error ();
80058005
END_ERROR;
80068006
END_ERROR;
8007-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
8007+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
80088008
if (gds_status->hasData())
80098009
EXEC SQL SET TRANSACTION;
80108010
}
@@ -8041,7 +8041,7 @@ bool get_relation(BurpGlobals* tdgbl, Coordinator* coord, RestoreRelationTask* t
80418041
general_on_error ();
80428042
END_ERROR;
80438043

8044-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
8044+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
80458045
if (gds_status->hasData())
80468046
EXEC SQL SET TRANSACTION;
80478047

@@ -9085,7 +9085,7 @@ bool get_trigger_old (BurpGlobals* tdgbl, burp_rel* relation)
90859085
general_on_error ();
90869086
END_ERROR;
90879087
END_ERROR;
9088-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
9088+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
90899089
if (gds_status->hasData())
90909090
EXEC SQL SET TRANSACTION;
90919091
}
@@ -9441,7 +9441,7 @@ bool get_trigger(BurpGlobals* tdgbl)
94419441
general_on_error ();
94429442
END_ERROR;
94439443
END_ERROR;
9444-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
9444+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
94459445
if (gds_status->hasData())
94469446
EXEC SQL SET TRANSACTION;
94479447
}
@@ -9537,7 +9537,7 @@ bool get_trigger_message(BurpGlobals* tdgbl)
95379537
general_on_error ();
95389538
END_ERROR;
95399539
END_ERROR;
9540-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
9540+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
95419541
if (gds_status->hasData())
95429542
EXEC SQL SET TRANSACTION;
95439543
}
@@ -10391,7 +10391,7 @@ bool restore(BurpGlobals* tdgbl, Firebird::IProvider* provider, const TEXT* file
1039110391

1039210392
create_database(tdgbl, provider, database_name);
1039310393

10394-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
10394+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
1039510395
if (gds_status->hasData())
1039610396
EXEC SQL SET TRANSACTION;
1039710397

@@ -10751,7 +10751,7 @@ bool restore(BurpGlobals* tdgbl, Firebird::IProvider* provider, const TEXT* file
1075110751
ON_ERROR
1075210752
general_on_error ();
1075310753
END_ERROR;
10754-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
10754+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
1075510755
if (gds_status->hasData())
1075610756
EXEC SQL SET TRANSACTION;
1075710757
flag = false;
@@ -10875,7 +10875,7 @@ bool restore(BurpGlobals* tdgbl, Firebird::IProvider* provider, const TEXT* file
1087510875
ON_ERROR
1087610876
general_on_error ();
1087710877
END_ERROR;
10878-
EXEC SQL SET TRANSACTION NO_AUTO_UNDO;
10878+
EXEC SQL SET TRANSACTION NO_AUTO_UNDO AUTO_RELEASE_TEMP_BLOBID;
1087910879
if (gds_status->hasData())
1088010880
EXEC SQL SET TRANSACTION;
1088110881
}

src/common/ParserTokens.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ PARSER_TOKEN(TOK_BINARY, "BINARY", false)
9797
PARSER_TOKEN(TOK_BIND, "BIND", true)
9898
PARSER_TOKEN(TOK_BIT_LENGTH, "BIT_LENGTH", false)
9999
PARSER_TOKEN(TOK_BLOB, "BLOB", false)
100+
PARSER_TOKEN(TOK_BLOBID, "BLOBID", true)
100101
PARSER_TOKEN(TOK_BLOB_APPEND, "BLOB_APPEND", true)
101102
PARSER_TOKEN(TOK_BLOCK, "BLOCK", true)
102103
PARSER_TOKEN(TOK_BODY, "BODY", true)
@@ -492,6 +493,7 @@ PARSER_TOKEN(TOK_TAN, "TAN", true)
492493
PARSER_TOKEN(TOK_TANH, "TANH", true)
493494
PARSER_TOKEN(TOK_TARGET, "TARGET", true)
494495
PARSER_TOKEN(TOK_TEMPORARY, "TEMPORARY", true)
496+
PARSER_TOKEN(TOK_TEMP, "TEMP", true)
495497
PARSER_TOKEN(TOK_THEN, "THEN", false)
496498
PARSER_TOKEN(TOK_TIES, "TIES", true)
497499
PARSER_TOKEN(TOK_TIME, "TIME", false)

src/dsql/StmtNodes.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9720,6 +9720,9 @@ SetTransactionNode* SetTransactionNode::dsqlPass(DsqlCompilerScratch* dsqlScratc
97209720
if (autoCommit.isAssigned())
97219721
dsqlScratch->appendUChar(isc_tpb_autocommit);
97229722

9723+
if (autoReleaseTempBlobID.isAssigned())
9724+
dsqlScratch->appendUChar(isc_tpb_auto_release_temp_blobid);
9725+
97239726
if (lockTimeout.has_value())
97249727
{
97259728
dsqlScratch->appendUChar(isc_tpb_lock_timeout);

src/dsql/StmtNodes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,6 +1607,7 @@ class SetTransactionNode : public TransactionNode
16071607
NODE_PRINT(printer, ignoreLimbo);
16081608
NODE_PRINT(printer, restartRequests);
16091609
NODE_PRINT(printer, autoCommit);
1610+
NODE_PRINT(printer, autoReleaseTempBlobID);
16101611
NODE_PRINT(printer, lockTimeout);
16111612
//// FIXME-PRINT: NODE_PRINT(printer, reserveList);
16121613
NODE_PRINT(printer, tpb);
@@ -1633,6 +1634,7 @@ class SetTransactionNode : public TransactionNode
16331634
Firebird::TriState ignoreLimbo;
16341635
Firebird::TriState restartRequests;
16351636
Firebird::TriState autoCommit;
1637+
Firebird::TriState autoReleaseTempBlobID;
16361638
};
16371639

16381640

src/dsql/parse.y

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ using namespace Firebird;
163163
%token <metaNamePtr> BEGIN
164164
%token <metaNamePtr> BETWEEN
165165
%token <metaNamePtr> BLOB
166+
%token <metaNamePtr> BLOBID
166167
%token <metaNamePtr> BY
167168
%token <metaNamePtr> CAST
168169
%token <metaNamePtr> CHARACTER
@@ -308,6 +309,7 @@ using namespace Firebird;
308309
%token <metaNamePtr> SUSPEND
309310
%token <metaNamePtr> SUM
310311
%token <metaNamePtr> TABLE
312+
%token <metaNamePtr> TEMP
311313
%token <metaNamePtr> THEN
312314
%token <metaNamePtr> TO
313315
%token <metaNamePtr> TRANSACTION
@@ -5938,6 +5940,8 @@ tran_option($setTransactionNode)
59385940
{ setClause($setTransactionNode->restartRequests, "RESTART REQUESTS", true); }
59395941
| AUTO COMMIT
59405942
{ setClause($setTransactionNode->autoCommit, "AUTO COMMIT", true); }
5943+
| AUTO RELEASE TEMP BLOBID
5944+
{ setClause($setTransactionNode->autoReleaseTempBlobID, "AUTO RELEASE TEMP BLOBID", true); }
59415945
// timeout
59425946
| LOCK TIMEOUT nonneg_short_integer
59435947
{ setClause($setTransactionNode->lockTimeout, "LOCK TIMEOUT", (USHORT) $3); }
@@ -9749,10 +9753,12 @@ non_reserved_word
97499753
// added in FB 4.0.2
97509754
| BLOB_APPEND
97519755
// added in FB 5.0
9756+
| BLOBID
97529757
| LOCKED
97539758
| OPTIMIZE
97549759
| QUARTER
97559760
| TARGET
9761+
| TEMP
97569762
| TIMEZONE_NAME
97579763
| UNICODE_CHAR
97589764
| UNICODE_VAL

src/gpre/cmp.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,8 @@ void CMP_t_start( gpre_tra* trans)
408408
*text++ = isc_tpb_autocommit;
409409
if (trans->tra_flags & TRA_no_auto_undo)
410410
*text++ = isc_tpb_no_auto_undo;
411+
if (trans->tra_flags & TRA_auto_release_temp_blobid)
412+
*text++ = isc_tpb_auto_release_temp_blobid;
411413
*text = 0;
412414
const USHORT tpb_len = text - tpb_buffer;
413415

src/gpre/gpre.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1414,7 +1414,8 @@ enum tra_flags_vals {
14141414
TRA_read_committed = 32,
14151415
TRA_autocommit = 64,
14161416
TRA_rec_version = 128,
1417-
TRA_no_auto_undo = 256
1417+
TRA_no_auto_undo = 256,
1418+
TRA_auto_release_temp_blobid = 512
14181419
};
14191420

14201421
const int MAX_TRA_OPTIONS = 8;

src/gpre/hsh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@
306306
{"PROCEDURE", KW_PROCEDURE},
307307
{"PROTECTED", KW_PROTECTED},
308308
{"PUBLIC", KW_PUBLIC},
309+
{"AUTO_RELEASE_TEMP_BLOBID", KW_AUTO_RELEASE_TEMP_BLOBID},
309310
{"PUT_SEGMENT", KW_PUT_SEGMENT},
310311
{"PUT_SLICE", KW_PUT_SLICE},
311312
{"QUADWORD", KW_QUAD},

0 commit comments

Comments
 (0)