From 1951362a7393f3b97a29ab68ecb2b3defc46e10e Mon Sep 17 00:00:00 2001 From: Adriano dos Santos Fernandes Date: Thu, 11 Jun 2020 12:55:00 -0300 Subject: [PATCH] Improve allocation of request impure space, specially statements, to not waste alignment space (CORE-6330). --- src/dsql/AggNodes.cpp | 10 ++-- src/dsql/BoolNodes.cpp | 4 +- src/dsql/ExprNodes.cpp | 69 +++++++++++++++------------- src/dsql/StmtNodes.cpp | 23 ++++++---- src/dsql/WinNodes.cpp | 6 +-- src/jrd/JrdStatement.cpp | 13 ++++++ src/jrd/Optimizer.cpp | 8 ++-- src/jrd/RecordSourceNodes.cpp | 2 +- src/jrd/cmp.cpp | 32 ------------- src/jrd/cmp_proto.h | 1 - src/jrd/exe.h | 9 ++++ src/jrd/opt.cpp | 6 +-- src/jrd/recsrc/AggregatedStream.cpp | 2 +- src/jrd/recsrc/BitmapTableScan.cpp | 2 +- src/jrd/recsrc/BufferedStream.cpp | 2 +- src/jrd/recsrc/ConditionalStream.cpp | 2 +- src/jrd/recsrc/Cursor.cpp | 2 +- src/jrd/recsrc/ExternalTableScan.cpp | 2 +- src/jrd/recsrc/FilteredStream.cpp | 2 +- src/jrd/recsrc/FirstRowsStream.cpp | 2 +- src/jrd/recsrc/FullOuterJoin.cpp | 2 +- src/jrd/recsrc/FullTableScan.cpp | 2 +- src/jrd/recsrc/HashJoin.cpp | 2 +- src/jrd/recsrc/IndexTableScan.cpp | 8 ++-- src/jrd/recsrc/LockedStream.cpp | 2 +- src/jrd/recsrc/MergeJoin.cpp | 2 +- src/jrd/recsrc/NestedLoopJoin.cpp | 4 +- src/jrd/recsrc/ProcedureScan.cpp | 2 +- src/jrd/recsrc/RecursiveStream.cpp | 2 +- src/jrd/recsrc/SingularStream.cpp | 2 +- src/jrd/recsrc/SkipRowsStream.cpp | 2 +- src/jrd/recsrc/SortedStream.cpp | 2 +- src/jrd/recsrc/Union.cpp | 2 +- src/jrd/recsrc/VirtualTableScan.cpp | 2 +- src/jrd/recsrc/WindowedStream.cpp | 4 +- 35 files changed, 119 insertions(+), 120 deletions(-) diff --git a/src/dsql/AggNodes.cpp b/src/dsql/AggNodes.cpp index c272a6b532c..5da128baf10 100644 --- a/src/dsql/AggNodes.cpp +++ b/src/dsql/AggNodes.cpp @@ -351,7 +351,7 @@ AggNode* AggNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value_ex)); + impureOffset = csb->allocImpure(); return this; } @@ -653,7 +653,7 @@ AggNode* AvgAggNode::pass2(thread_db* tdbb, CompilerScratch* csb) nodFlags |= FLAG_DOUBLE; // We need a second descriptor in the impure area for AVG. - tempImpure = CMP_impure(csb, sizeof(impure_value_ex)); + tempImpure = csb->allocImpure(); return this; } @@ -1416,7 +1416,7 @@ AggNode* StdDevAggNode::pass2(thread_db* tdbb, CompilerScratch* csb) { AggNode::pass2(tdbb, csb); - impure2Offset = CMP_impure(csb, sizeof(StdDevImpure)); + impure2Offset = csb->allocImpure(); return this; } @@ -1625,7 +1625,7 @@ AggNode* CorrAggNode::pass2(thread_db* tdbb, CompilerScratch* csb) { AggNode::pass2(tdbb, csb); - impure2Offset = CMP_impure(csb, sizeof(CorrImpure)); + impure2Offset = csb->allocImpure(); return this; } @@ -1901,7 +1901,7 @@ AggNode* RegrAggNode::pass2(thread_db* tdbb, CompilerScratch* csb) { AggNode::pass2(tdbb, csb); - impure2Offset = CMP_impure(csb, sizeof(RegrImpure)); + impure2Offset = csb->allocImpure(); return this; } diff --git a/src/dsql/BoolNodes.cpp b/src/dsql/BoolNodes.cpp index fb3f5111213..f3a0cd4dec0 100644 --- a/src/dsql/BoolNodes.cpp +++ b/src/dsql/BoolNodes.cpp @@ -636,7 +636,7 @@ void ComparativeBoolNode::pass2Boolean2(thread_db* tdbb, CompilerScratch* csb) if (nodFlags & FLAG_INVARIANT) { // This may currently happen for nod_like, nod_contains and nod_similar - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); } } @@ -1753,7 +1753,7 @@ void RseBoolNode::pass2Boolean1(thread_db* tdbb, CompilerScratch* csb) void RseBoolNode::pass2Boolean2(thread_db* tdbb, CompilerScratch* csb) { if (nodFlags & FLAG_INVARIANT) - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); RecordSource* const rsb = CMP_post_rse(tdbb, csb, rse); diff --git a/src/dsql/ExprNodes.cpp b/src/dsql/ExprNodes.cpp index 66446ee6151..bc1db76e5ae 100644 --- a/src/dsql/ExprNodes.cpp +++ b/src/dsql/ExprNodes.cpp @@ -1805,7 +1805,7 @@ ValueExprNode* ArithmeticNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -3181,7 +3181,7 @@ ValueExprNode* AtNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -3299,7 +3299,7 @@ ValueExprNode* BoolAsValueNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -3518,7 +3518,7 @@ ValueExprNode* CastNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -3890,7 +3890,7 @@ ValueExprNode* ConcatenateNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -4123,7 +4123,7 @@ ValueExprNode* CurrentDateNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -4228,7 +4228,7 @@ ValueExprNode* CurrentTimeNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -4343,7 +4343,7 @@ ValueExprNode* CurrentTimeStampNode::pass2(thread_db* tdbb, CompilerScratch* csb dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -4437,7 +4437,7 @@ ValueExprNode* CurrentRoleNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -4531,7 +4531,7 @@ ValueExprNode* CurrentUserNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -5411,7 +5411,7 @@ ValueExprNode* ExtractNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -6771,7 +6771,7 @@ ValueExprNode* FieldNode::pass2(thread_db* tdbb, CompilerScratch* csb) if (csb->csb_rpt[fieldStream].csb_relation || csb->csb_rpt[fieldStream].csb_procedure) format = CMP_format(tdbb, csb, fieldStream); - impureOffset = CMP_impure(csb, sizeof(impure_value_ex)); + impureOffset = csb->allocImpure(); cursorNumber = csb->csb_rpt[fieldStream].csb_cursor_number; return this; @@ -7023,7 +7023,7 @@ ValueExprNode* GenIdNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -7217,7 +7217,7 @@ ValueExprNode* InternalInfoNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -8025,7 +8025,7 @@ ValueExprNode* LocalTimeNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -8128,7 +8128,7 @@ ValueExprNode* LocalTimeStampNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -8735,7 +8735,7 @@ ValueExprNode* NegateNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -9608,7 +9608,11 @@ ValueExprNode* ParameterNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, (nodFlags & FLAG_VALUE) ? sizeof(impure_value_ex) : sizeof(dsc)); + + if (nodFlags & FLAG_VALUE) + impureOffset = csb->allocImpure(); + else + impureOffset = csb->allocImpure(); return this; } @@ -10146,7 +10150,7 @@ ValueExprNode* RecordKeyNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -10333,7 +10337,7 @@ ValueExprNode* ScalarNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -10547,7 +10551,7 @@ ValueExprNode* StrCaseNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -10762,7 +10766,7 @@ ValueExprNode* StrLenNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -11187,7 +11191,7 @@ ValueExprNode* SubQueryNode::pass2(thread_db* tdbb, CompilerScratch* csb) ValueExprNode::pass2(tdbb, csb); - impureOffset = CMP_impure(csb, sizeof(impure_value_ex)); + impureOffset = csb->allocImpure(); { dsc desc; @@ -11539,7 +11543,7 @@ ValueExprNode* SubstringNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -11843,7 +11847,7 @@ ValueExprNode* SubstringSimilarNode::pass2(thread_db* tdbb, CompilerScratch* csb dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -12100,7 +12104,7 @@ ValueExprNode* SysFuncCallNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -12356,7 +12360,7 @@ ValueExprNode* TrimNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -12771,20 +12775,20 @@ ValueExprNode* UdfCallNode::pass2(thread_db* tdbb, CompilerScratch* csb) dsc desc; getDesc(tdbb, csb, &desc); - impureOffset = CMP_impure(csb, sizeof(Impure)); + impureOffset = csb->allocImpure(); if (function->isDefined() && !function->fun_entrypoint) { if (function->getInputFormat() && function->getInputFormat()->fmt_count) { fb_assert(function->getInputFormat()->fmt_length); - CMP_impure(csb, function->getInputFormat()->fmt_length); + csb->allocImpure(FB_ALIGNMENT, function->getInputFormat()->fmt_length); } fb_assert(function->getOutputFormat()->fmt_count == 3); fb_assert(function->getOutputFormat()->fmt_length); - CMP_impure(csb, function->getOutputFormat()->fmt_length); + csb->allocImpure(FB_ALIGNMENT, function->getOutputFormat()->fmt_length); } return this; @@ -13438,7 +13442,10 @@ ValueExprNode* VariableNode::pass2(thread_db* tdbb, CompilerScratch* csb) ValueExprNode::pass2(tdbb, csb); - impureOffset = CMP_impure(csb, (nodFlags & FLAG_VALUE) ? sizeof(impure_value_ex) : sizeof(dsc)); + if (nodFlags & FLAG_VALUE) + impureOffset = csb->allocImpure(); + else + impureOffset = csb->allocImpure(); return this; } diff --git a/src/dsql/StmtNodes.cpp b/src/dsql/StmtNodes.cpp index 9cb24e7773b..a6bd71a667b 100644 --- a/src/dsql/StmtNodes.cpp +++ b/src/dsql/StmtNodes.cpp @@ -632,7 +632,7 @@ BlockNode* BlockNode::pass2(thread_db* tdbb, CompilerScratch* csb) doPass2(tdbb, csb, action.getAddress(), this); doPass2(tdbb, csb, handlers.getAddress(), this); - impureOffset = CMP_impure(csb, sizeof(SavNumber)); + impureOffset = csb->allocImpure(); return this; } @@ -976,7 +976,7 @@ CompoundStmtNode* CompoundStmtNode::pass2(thread_db* tdbb, CompilerScratch* csb) for (NestConst* i = statements.begin(); i != statements.end(); ++i) doPass2(tdbb, csb, i->getAddress(), this); - impureOffset = CMP_impure(csb, sizeof(impure_state)); + impureOffset = csb->allocImpure(); for (NestConst* i = statements.begin(); i != statements.end(); ++i) { @@ -2248,7 +2248,7 @@ DeclareVariableNode* DeclareVariableNode::pass1(thread_db* tdbb, CompilerScratch DeclareVariableNode* DeclareVariableNode::pass2(thread_db* /*tdbb*/, CompilerScratch* csb) { - impureOffset = CMP_impure(csb, sizeof(impure_value)); + impureOffset = csb->allocImpure(); return this; } @@ -3736,7 +3736,7 @@ ExecStatementNode* ExecStatementNode::pass2(thread_db* tdbb, CompilerScratch* cs } } - impureOffset = CMP_impure(csb, sizeof(EDS::Statement*)); + impureOffset = csb->allocImpure(); return this; } @@ -3992,7 +3992,7 @@ InAutonomousTransactionNode* InAutonomousTransactionNode::pass1(thread_db* tdbb, InAutonomousTransactionNode* InAutonomousTransactionNode::pass2(thread_db* tdbb, CompilerScratch* csb) { - impureOffset = CMP_impure(csb, sizeof(Impure)); + impureOffset = csb->allocImpure(); doPass2(tdbb, csb, action.getAddress(), this); return this; } @@ -5046,7 +5046,10 @@ StmtNode* ForNode::pass2(thread_db* tdbb, CompilerScratch* csb) if (rse->flags & RseNode::FLAG_WRITELOCK) withLock = true; - impureOffset = CMP_impure(csb, isMerge ? sizeof(ImpureMerge) : sizeof(Impure)); + if (isMerge) + impureOffset = csb->allocImpure(); + else + impureOffset = csb->allocImpure(); return this; } @@ -6031,8 +6034,8 @@ MessageNode* MessageNode::pass2(thread_db* /*tdbb*/, CompilerScratch* csb) { fb_assert(format); - impureOffset = CMP_impure(csb, FB_ALIGN(format->fmt_length, 2)); - impureFlags = CMP_impure(csb, sizeof(USHORT) * format->fmt_count); + impureOffset = csb->allocImpure(FB_ALIGNMENT, FB_ALIGN(format->fmt_length, 2)); + impureFlags = csb->allocImpure(FB_ALIGNMENT, sizeof(USHORT) * format->fmt_count); return this; } @@ -6527,7 +6530,7 @@ ModifyNode* ModifyNode::pass2(thread_db* tdbb, CompilerScratch* csb) if (!(marks & StmtNode::MARK_POSITIONED)) forNode = pass2FindForNode(parentStmt, orgStream); - impureOffset = CMP_impure(csb, sizeof(impure_state)); + impureOffset = csb->allocImpure(); return this; } @@ -7441,7 +7444,7 @@ StoreNode* StoreNode::pass2(thread_db* tdbb, CompilerScratch* csb) ExprNode::doPass2(tdbb, csb, i->value.getAddress()); } - impureOffset = CMP_impure(csb, sizeof(impure_state)); + impureOffset = csb->allocImpure(); return this; } diff --git a/src/dsql/WinNodes.cpp b/src/dsql/WinNodes.cpp index 6e10856e01e..79d88d767b3 100644 --- a/src/dsql/WinNodes.cpp +++ b/src/dsql/WinNodes.cpp @@ -142,7 +142,7 @@ ValueExprNode* RankWinNode::copy(thread_db* tdbb, NodeCopier& /*copier*/) const AggNode* RankWinNode::pass2(thread_db* tdbb, CompilerScratch* csb) { AggNode::pass2(tdbb, csb); - tempImpure = CMP_impure(csb, sizeof(impure_value_ex)); + tempImpure = csb->allocImpure(); return this; } @@ -218,7 +218,7 @@ ValueExprNode* PercentRankWinNode::copy(thread_db* tdbb, NodeCopier& /*copier*/) AggNode* PercentRankWinNode::pass2(thread_db* tdbb, CompilerScratch* csb) { AggNode::pass2(tdbb, csb); - tempImpure = CMP_impure(csb, sizeof(impure_value_ex)); + tempImpure = csb->allocImpure(); return this; } @@ -803,7 +803,7 @@ ValueExprNode* NTileWinNode::copy(thread_db* tdbb, NodeCopier& copier) const AggNode* NTileWinNode::pass2(thread_db* tdbb, CompilerScratch* csb) { AggNode::pass2(tdbb, csb); - thisImpureOffset = CMP_impure(csb, sizeof(ThisImpure)); + thisImpureOffset = csb->allocImpure(); return this; } diff --git a/src/jrd/JrdStatement.cpp b/src/jrd/JrdStatement.cpp index ed0529ee779..b1cb39874ea 100644 --- a/src/jrd/JrdStatement.cpp +++ b/src/jrd/JrdStatement.cpp @@ -45,6 +45,19 @@ template static void makeSubRoutines(thread_db* tdbb, JrdStatement* CompilerScratch* csb, T& subs); +ULONG CompilerScratch::allocImpure(ULONG align, ULONG size) +{ + const ULONG offset = FB_ALIGN(csb_impure, align); + + if (offset + size > JrdStatement::MAX_REQUEST_SIZE) + IBERROR(226); // msg 226: request size limit exceeded + + csb_impure = offset + size; + + return offset; +} + + // Start to turn a parsed scratch into a statement. This is completed by makeStatement. JrdStatement::JrdStatement(thread_db* tdbb, MemoryPool* p, CompilerScratch* csb) : pool(p), diff --git a/src/jrd/Optimizer.cpp b/src/jrd/Optimizer.cpp index 6f2fe24bf0b..590f61b81db 100644 --- a/src/jrd/Optimizer.cpp +++ b/src/jrd/Optimizer.cpp @@ -110,7 +110,7 @@ namespace cast = FB_NEW_POOL(csb->csb_pool) CastNode(csb->csb_pool); cast->source = value; cast->castDesc = desc; - cast->impureOffset = CMP_impure(csb, sizeof(impure_value)); + cast->impureOffset = csb->allocImpure(); } value = cast; @@ -140,7 +140,7 @@ namespace FB_NEW_POOL(csb->csb_pool) BoolAsValueNode(csb->csb_pool); newValue->boolean = cmpNode; - newValue->impureOffset = CMP_impure(csb, sizeof(impure_value)); + newValue->impureOffset = csb->allocImpure(); return newValue; } @@ -1361,7 +1361,7 @@ InversionNode* OptimizerRetrieval::makeIndexScanNode(IndexScratch* indexScratch) // mark the index as utilized for the purposes of this compile idx->idx_runtime_flags |= idx_used; - const ULONG impure = csb ? CMP_impure(csb, sizeof(impure_inversion)) : 0; + const ULONG impure = csb ? csb->allocImpure() : 0; return FB_NEW_POOL(pool) InversionNode(retrieval, impure); } @@ -2195,7 +2195,7 @@ InversionCandidate* OptimizerRetrieval::matchDbKey(BoolExprNode* boolean) const fb_assert(lower == upper); InversionNode* const inversion = FB_NEW_POOL(pool) InversionNode(lower, n); - inversion->impure = CMP_impure(csb, sizeof(impure_inversion)); + inversion->impure = csb->allocImpure(); invCandidate->inversion = inversion; } else diff --git a/src/jrd/RecordSourceNodes.cpp b/src/jrd/RecordSourceNodes.cpp index 0f2c1d284b2..01f22a6aba2 100644 --- a/src/jrd/RecordSourceNodes.cpp +++ b/src/jrd/RecordSourceNodes.cpp @@ -1949,7 +1949,7 @@ RecordSource* UnionSourceNode::generate(thread_db* tdbb, OptimizerBlk* opt, cons CompilerScratch* csb = opt->opt_csb; HalfStaticArray rsbs; - const ULONG baseImpure = CMP_impure(csb, 0); + const ULONG baseImpure = csb->allocImpure(FB_ALIGNMENT, 0); NestConst* ptr = clauses.begin(); NestConst* ptr2 = maps.begin(); diff --git a/src/jrd/cmp.cpp b/src/jrd/cmp.cpp index 9afe800e2eb..dfb99d278ed 100644 --- a/src/jrd/cmp.cpp +++ b/src/jrd/cmp.cpp @@ -321,38 +321,6 @@ IndexLock* CMP_get_index_lock(thread_db* tdbb, jrd_rel* relation, USHORT id) } -ULONG CMP_impure(CompilerScratch* csb, ULONG size) -{ -/************************************** - * - * C M P _ i m p u r e - * - ************************************** - * - * Functional description - * Allocate space (offset) in request. - * - **************************************/ - DEV_BLKCHK(csb, type_csb); - - if (!csb) - { - return 0; - } - - const ULONG offset = FB_ALIGN(csb->csb_impure, FB_ALIGNMENT); - - if (offset + size > JrdStatement::MAX_REQUEST_SIZE) - { - IBERROR(226); // msg 226: request size limit exceeded - } - - csb->csb_impure = offset + size; - - return offset; -} - - void CMP_post_access(thread_db* tdbb, CompilerScratch* csb, const Firebird::MetaName& security_name, diff --git a/src/jrd/cmp_proto.h b/src/jrd/cmp_proto.h index a752bc98bb9..15a0b36a2f4 100644 --- a/src/jrd/cmp_proto.h +++ b/src/jrd/cmp_proto.h @@ -42,7 +42,6 @@ Jrd::jrd_req* CMP_compile2(Jrd::thread_db*, const UCHAR* blr, ULONG blr_length, Jrd::CompilerScratch::csb_repeat* CMP_csb_element(Jrd::CompilerScratch*, StreamType element); const Jrd::Format* CMP_format(Jrd::thread_db*, Jrd::CompilerScratch*, StreamType); Jrd::IndexLock* CMP_get_index_lock(Jrd::thread_db*, Jrd::jrd_rel*, USHORT); -ULONG CMP_impure(Jrd::CompilerScratch*, ULONG); Jrd::jrd_req* CMP_make_request(Jrd::thread_db*, Jrd::CompilerScratch*, bool); Jrd::ItemInfo* CMP_pass2_validation(Jrd::thread_db*, Jrd::CompilerScratch*, const Jrd::Item&); diff --git a/src/jrd/exe.h b/src/jrd/exe.h index 330545f5336..bdf54131a84 100644 --- a/src/jrd/exe.h +++ b/src/jrd/exe.h @@ -468,6 +468,15 @@ class CompilerScratch : public pool_alloc csb_dbg_info = FB_NEW_POOL(p) Firebird::DbgInfo(p); } + // Implemented in JrdStatement.cpp + ULONG allocImpure(ULONG align, ULONG size); + + template + ULONG allocImpure() + { + return allocImpure(alignof(T), sizeof(T)); + } + StreamType nextStream(bool check = true) { if (csb_n_stream >= MAX_STREAMS && check) diff --git a/src/jrd/opt.cpp b/src/jrd/opt.cpp index 59e236aea0b..202285da265 100644 --- a/src/jrd/opt.cpp +++ b/src/jrd/opt.cpp @@ -1969,7 +1969,7 @@ void OPT_gen_aggregate_distincts(thread_db* tdbb, CompilerScratch* csb, MapNode* asb->length += sizeof(ULONG); sort_key->skd_flags = SKD_ascending; - asb->impure = CMP_impure(csb, sizeof(impure_agg_sort)); + asb->impure = csb->allocImpure(); asb->desc = *desc; aggNode->asb = asb; @@ -2816,7 +2816,7 @@ static bool gen_equi_join(thread_db* tdbb, OptimizerBlk* opt, RiverList& org_riv CastNode* cast = FB_NEW_POOL(*tdbb->getDefaultPool()) CastNode(*tdbb->getDefaultPool()); cast->source = node1; cast->castDesc = result; - cast->impureOffset = CMP_impure(csb, sizeof(impure_value)); + cast->impureOffset = csb->allocImpure(); node1 = cast; } @@ -2825,7 +2825,7 @@ static bool gen_equi_join(thread_db* tdbb, OptimizerBlk* opt, RiverList& org_riv CastNode* cast = FB_NEW_POOL(*tdbb->getDefaultPool()) CastNode(*tdbb->getDefaultPool()); cast->source = node2; cast->castDesc = result; - cast->impureOffset = CMP_impure(csb, sizeof(impure_value)); + cast->impureOffset = csb->allocImpure(); node2 = cast; } } diff --git a/src/jrd/recsrc/AggregatedStream.cpp b/src/jrd/recsrc/AggregatedStream.cpp index ad5a837db0b..5ea626120bb 100644 --- a/src/jrd/recsrc/AggregatedStream.cpp +++ b/src/jrd/recsrc/AggregatedStream.cpp @@ -48,7 +48,7 @@ BaseAggWinStream::BaseAggWinStream(thread_db* tdbb, Compiler m_oneRowWhenEmpty(oneRowWhenEmpty) { fb_assert(m_next); - m_impure = CMP_impure(csb, sizeof(typename ThisType::Impure)); + m_impure = csb->allocImpure(); } template diff --git a/src/jrd/recsrc/BitmapTableScan.cpp b/src/jrd/recsrc/BitmapTableScan.cpp index 9b2de4e7b62..6b3485eda72 100644 --- a/src/jrd/recsrc/BitmapTableScan.cpp +++ b/src/jrd/recsrc/BitmapTableScan.cpp @@ -43,7 +43,7 @@ BitmapTableScan::BitmapTableScan(CompilerScratch* csb, const string& alias, { fb_assert(m_inversion); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void BitmapTableScan::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/BufferedStream.cpp b/src/jrd/recsrc/BufferedStream.cpp index 9e4054b3de8..424c7d4e2e0 100644 --- a/src/jrd/recsrc/BufferedStream.cpp +++ b/src/jrd/recsrc/BufferedStream.cpp @@ -44,7 +44,7 @@ BufferedStream::BufferedStream(CompilerScratch* csb, RecordSource* next) { fb_assert(m_next); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); StreamList streams; m_next->findUsedStreams(streams); diff --git a/src/jrd/recsrc/ConditionalStream.cpp b/src/jrd/recsrc/ConditionalStream.cpp index 3d119935a9e..91d3e854037 100644 --- a/src/jrd/recsrc/ConditionalStream.cpp +++ b/src/jrd/recsrc/ConditionalStream.cpp @@ -45,7 +45,7 @@ ConditionalStream::ConditionalStream(CompilerScratch* csb, { fb_assert(m_first && m_second && m_boolean); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void ConditionalStream::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/Cursor.cpp b/src/jrd/recsrc/Cursor.cpp index a7ed781f435..a44a68d180c 100644 --- a/src/jrd/recsrc/Cursor.cpp +++ b/src/jrd/recsrc/Cursor.cpp @@ -100,7 +100,7 @@ Cursor::Cursor(CompilerScratch* csb, const RecordSource* rsb, { fb_assert(m_top); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void Cursor::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/ExternalTableScan.cpp b/src/jrd/recsrc/ExternalTableScan.cpp index 232c92d3a27..b6309a3279d 100644 --- a/src/jrd/recsrc/ExternalTableScan.cpp +++ b/src/jrd/recsrc/ExternalTableScan.cpp @@ -42,7 +42,7 @@ ExternalTableScan::ExternalTableScan(CompilerScratch* csb, const string& alias, StreamType stream, jrd_rel* relation) : RecordStream(csb, stream), m_relation(relation), m_alias(csb->csb_pool, alias) { - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void ExternalTableScan::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/FilteredStream.cpp b/src/jrd/recsrc/FilteredStream.cpp index 2b3c75f3293..5ae71e88036 100644 --- a/src/jrd/recsrc/FilteredStream.cpp +++ b/src/jrd/recsrc/FilteredStream.cpp @@ -41,7 +41,7 @@ FilteredStream::FilteredStream(CompilerScratch* csb, RecordSource* next, BoolExp { fb_assert(m_next && m_boolean); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void FilteredStream::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/FirstRowsStream.cpp b/src/jrd/recsrc/FirstRowsStream.cpp index c107d157e5f..f5deb5328cf 100644 --- a/src/jrd/recsrc/FirstRowsStream.cpp +++ b/src/jrd/recsrc/FirstRowsStream.cpp @@ -41,7 +41,7 @@ FirstRowsStream::FirstRowsStream(CompilerScratch* csb, RecordSource* next, Value { fb_assert(m_next && m_value); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void FirstRowsStream::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/FullOuterJoin.cpp b/src/jrd/recsrc/FullOuterJoin.cpp index 33261ad1ca2..73b77f8f05e 100644 --- a/src/jrd/recsrc/FullOuterJoin.cpp +++ b/src/jrd/recsrc/FullOuterJoin.cpp @@ -42,7 +42,7 @@ FullOuterJoin::FullOuterJoin(CompilerScratch* csb, RecordSource* arg1, RecordSou { fb_assert(m_arg1 && m_arg2); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void FullOuterJoin::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/FullTableScan.cpp b/src/jrd/recsrc/FullTableScan.cpp index 4a12bcfb549..d8096fea15b 100644 --- a/src/jrd/recsrc/FullTableScan.cpp +++ b/src/jrd/recsrc/FullTableScan.cpp @@ -44,7 +44,7 @@ FullTableScan::FullTableScan(CompilerScratch* csb, const string& alias, m_relation(relation), m_dbkeyRanges(csb->csb_pool, dbkeyRanges) { - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void FullTableScan::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/HashJoin.cpp b/src/jrd/recsrc/HashJoin.cpp index e7f4a523b4b..58e6001abdc 100644 --- a/src/jrd/recsrc/HashJoin.cpp +++ b/src/jrd/recsrc/HashJoin.cpp @@ -212,7 +212,7 @@ HashJoin::HashJoin(thread_db* tdbb, CompilerScratch* csb, FB_SIZE_T count, { fb_assert(count >= 2); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); m_leader.source = args[0]; m_leader.keys = keys[0]; diff --git a/src/jrd/recsrc/IndexTableScan.cpp b/src/jrd/recsrc/IndexTableScan.cpp index a3fa4eae6e8..075dc931594 100644 --- a/src/jrd/recsrc/IndexTableScan.cpp +++ b/src/jrd/recsrc/IndexTableScan.cpp @@ -49,7 +49,7 @@ IndexTableScan::IndexTableScan(CompilerScratch* csb, const string& alias, { fb_assert(m_index); - // Reserve one excess byte for the upper key - in case when length of + // Reserve one excess byte for the upper key - in case when length of // upper key at retrieval is greater than declared index key length. // See also comments at openStream(). FB_SIZE_T size = sizeof(Impure) + 2u * m_length + 1u; @@ -57,7 +57,7 @@ IndexTableScan::IndexTableScan(CompilerScratch* csb, const string& alias, m_offset = size; size += sizeof(index_desc); - m_impure = CMP_impure(csb, static_cast(size)); + m_impure = csb->allocImpure(FB_ALIGNMENT, static_cast(size)); } void IndexTableScan::open(thread_db* tdbb) const @@ -509,8 +509,8 @@ UCHAR* IndexTableScan::openStream(thread_db* tdbb, Impure* impure, win* window) temporary_key* limit_ptr = NULL; if (retrieval->irb_upper_count) { - // If upper key length is greater than declared key length, we need - // one "excess" byte for correct comparison. Without it there could + // If upper key length is greater than declared key length, we need + // one "excess" byte for correct comparison. Without it there could // be false equality hits. impure->irsb_nav_upper_length = MIN(m_length + 1, upper.key_length); memcpy(impure->irsb_nav_data + m_length, upper.key_data, impure->irsb_nav_upper_length); diff --git a/src/jrd/recsrc/LockedStream.cpp b/src/jrd/recsrc/LockedStream.cpp index fe7002b0ddc..a4d389a4a44 100644 --- a/src/jrd/recsrc/LockedStream.cpp +++ b/src/jrd/recsrc/LockedStream.cpp @@ -39,7 +39,7 @@ LockedStream::LockedStream(CompilerScratch* csb, RecordSource* next) { fb_assert(m_next); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void LockedStream::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/MergeJoin.cpp b/src/jrd/recsrc/MergeJoin.cpp index 0a40558dc67..dbfd5555778 100644 --- a/src/jrd/recsrc/MergeJoin.cpp +++ b/src/jrd/recsrc/MergeJoin.cpp @@ -41,7 +41,7 @@ MergeJoin::MergeJoin(CompilerScratch* csb, FB_SIZE_T count, : m_args(csb->csb_pool), m_keys(csb->csb_pool) { const size_t size = sizeof(struct Impure) + count * sizeof(Impure::irsb_mrg_repeat); - m_impure = CMP_impure(csb, static_cast(size)); + m_impure = csb->allocImpure(FB_ALIGNMENT, static_cast(size)); m_args.resize(count); m_keys.resize(count); diff --git a/src/jrd/recsrc/NestedLoopJoin.cpp b/src/jrd/recsrc/NestedLoopJoin.cpp index b291623034e..0446f601b7d 100644 --- a/src/jrd/recsrc/NestedLoopJoin.cpp +++ b/src/jrd/recsrc/NestedLoopJoin.cpp @@ -37,7 +37,7 @@ using namespace Jrd; NestedLoopJoin::NestedLoopJoin(CompilerScratch* csb, FB_SIZE_T count, RecordSource* const* args) : m_joinType(INNER_JOIN), m_args(csb->csb_pool), m_boolean(NULL) { - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); m_args.resize(count); @@ -51,7 +51,7 @@ NestedLoopJoin::NestedLoopJoin(CompilerScratch* csb, RecordSource* outer, Record { fb_assert(outer && inner); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); m_args.add(outer); m_args.add(inner); diff --git a/src/jrd/recsrc/ProcedureScan.cpp b/src/jrd/recsrc/ProcedureScan.cpp index 10d0c868c57..7e1ecf05a7f 100644 --- a/src/jrd/recsrc/ProcedureScan.cpp +++ b/src/jrd/recsrc/ProcedureScan.cpp @@ -45,7 +45,7 @@ ProcedureScan::ProcedureScan(CompilerScratch* csb, const string& alias, StreamTy : RecordStream(csb, stream, procedure->prc_record_format), m_alias(csb->csb_pool, alias), m_procedure(procedure), m_sourceList(sourceList), m_targetList(targetList), m_message(message) { - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); fb_assert(!sourceList == !targetList); diff --git a/src/jrd/recsrc/RecursiveStream.cpp b/src/jrd/recsrc/RecursiveStream.cpp index e3d4d1d0b6e..f6339df6f9a 100644 --- a/src/jrd/recsrc/RecursiveStream.cpp +++ b/src/jrd/recsrc/RecursiveStream.cpp @@ -50,7 +50,7 @@ RecursiveStream::RecursiveStream(CompilerScratch* csb, StreamType stream, Stream { fb_assert(m_root && m_inner && m_rootMap && m_innerMap); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); m_saveSize = csb->csb_impure - saveOffset; m_innerStreams.resize(streamCount); diff --git a/src/jrd/recsrc/SingularStream.cpp b/src/jrd/recsrc/SingularStream.cpp index 0db81017a23..45e3f0b03ea 100644 --- a/src/jrd/recsrc/SingularStream.cpp +++ b/src/jrd/recsrc/SingularStream.cpp @@ -39,7 +39,7 @@ SingularStream::SingularStream(CompilerScratch* csb, RecordSource* next) m_next->findUsedStreams(m_streams); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void SingularStream::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/SkipRowsStream.cpp b/src/jrd/recsrc/SkipRowsStream.cpp index 1893b8583b7..6a22ea099f1 100644 --- a/src/jrd/recsrc/SkipRowsStream.cpp +++ b/src/jrd/recsrc/SkipRowsStream.cpp @@ -41,7 +41,7 @@ SkipRowsStream::SkipRowsStream(CompilerScratch* csb, RecordSource* next, ValueEx { fb_assert(m_next && m_value); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void SkipRowsStream::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/SortedStream.cpp b/src/jrd/recsrc/SortedStream.cpp index 1006445260b..ec526c26f47 100644 --- a/src/jrd/recsrc/SortedStream.cpp +++ b/src/jrd/recsrc/SortedStream.cpp @@ -44,7 +44,7 @@ SortedStream::SortedStream(CompilerScratch* csb, RecordSource* next, SortMap* ma { fb_assert(m_next && m_map); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void SortedStream::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/Union.cpp b/src/jrd/recsrc/Union.cpp index f75894c5b63..1f3692ea506 100644 --- a/src/jrd/recsrc/Union.cpp +++ b/src/jrd/recsrc/Union.cpp @@ -41,7 +41,7 @@ Union::Union(CompilerScratch* csb, StreamType stream, { fb_assert(argCount); - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); m_args.resize(argCount); diff --git a/src/jrd/recsrc/VirtualTableScan.cpp b/src/jrd/recsrc/VirtualTableScan.cpp index 806073933cf..b130e0c4e9d 100644 --- a/src/jrd/recsrc/VirtualTableScan.cpp +++ b/src/jrd/recsrc/VirtualTableScan.cpp @@ -41,7 +41,7 @@ VirtualTableScan::VirtualTableScan(CompilerScratch* csb, const string& alias, StreamType stream, jrd_rel* relation) : RecordStream(csb, stream), m_relation(relation), m_alias(csb->csb_pool, alias) { - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void VirtualTableScan::open(thread_db* tdbb) const diff --git a/src/jrd/recsrc/WindowedStream.cpp b/src/jrd/recsrc/WindowedStream.cpp index 20ef449aa07..5b118e9c297 100644 --- a/src/jrd/recsrc/WindowedStream.cpp +++ b/src/jrd/recsrc/WindowedStream.cpp @@ -92,7 +92,7 @@ namespace BufferedStreamWindow::BufferedStreamWindow(CompilerScratch* csb, BufferedStream* next) : m_next(next) { - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); } void BufferedStreamWindow::open(thread_db* tdbb) const @@ -187,7 +187,7 @@ WindowedStream::WindowedStream(thread_db* tdbb, CompilerScratch* csb, : m_next(FB_NEW_POOL(csb->csb_pool) BufferedStream(csb, next)), m_joinedStream(NULL) { - m_impure = CMP_impure(csb, sizeof(Impure)); + m_impure = csb->allocImpure(); // Process the unpartioned and unordered map, if existent.