diff --git a/src/jrd/RecordSourceNodes.cpp b/src/jrd/RecordSourceNodes.cpp index 67c2c5142fb..235727b0b4c 100644 --- a/src/jrd/RecordSourceNodes.cpp +++ b/src/jrd/RecordSourceNodes.cpp @@ -55,6 +55,20 @@ static ValueExprNode* resolveUsingField(DsqlCompilerScratch* dsqlScratch, const namespace { + void appendContextAlias(DsqlCompilerScratch* dsqlScratch, const string& alias) + { + const auto len = alias.length(); + if (len <= MAX_UCHAR) + dsqlScratch->appendMetaString(alias.c_str()); + else + { + string truncatedAlias(alias); + truncatedAlias.resize(MAX_UCHAR - 3); + truncatedAlias += "..."; + dsqlScratch->appendMetaString(truncatedAlias.c_str()); + } + } + // Search through the list of ANDed booleans to find comparisons // referring streams of parent select expressions. // Extract those booleans and return them to the caller. @@ -677,7 +691,7 @@ void LocalTableSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch) { dsqlScratch->appendUChar(blr_local_table_id); dsqlScratch->appendUShort(tableNumber); - dsqlScratch->appendMetaString(alias.c_str()); // dsqlContext->ctx_alias? + appendContextAlias(dsqlScratch, alias); // dsqlContext->ctx_alias? GEN_stuff_context(dsqlScratch, dsqlContext); } @@ -893,7 +907,7 @@ void RelationSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch) if (dsqlContext->ctx_alias.hasData()) { const auto& contextAliases = dsqlContext->getConcatenatedAlias(); - dsqlScratch->appendMetaString(contextAliases.c_str()); + appendContextAlias(dsqlScratch, contextAliases); } GEN_stuff_context(dsqlScratch, dsqlContext); @@ -1546,7 +1560,7 @@ void ProcedureSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch) dsqlScratch->appendUChar(blr_invsel_procedure_alias); const auto& contextAliases = dsqlContext->getConcatenatedAlias(); - dsqlScratch->appendMetaString(contextAliases.c_str()); + appendContextAlias(dsqlScratch, contextAliases); } dsqlScratch->appendUChar(blr_end); @@ -1560,7 +1574,7 @@ void ProcedureSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch) dsqlScratch->appendMetaString(dsqlProcedure->prc_name.object.c_str()); const auto& contextAliases = dsqlContext->getConcatenatedAlias(); - dsqlScratch->appendMetaString(contextAliases.c_str()); + appendContextAlias(dsqlScratch, contextAliases); } else { @@ -1589,7 +1603,7 @@ void ProcedureSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch) if (dsqlContext->ctx_alias.hasData()) { const auto& contextAliases = dsqlContext->getConcatenatedAlias(); - dsqlScratch->appendMetaString(contextAliases.c_str()); + appendContextAlias(dsqlScratch, contextAliases); } } @@ -4150,11 +4164,8 @@ void TableValueFunctionSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch) GEN_stuff_context(dsqlScratch, dsqlContext); - if (dsqlContext->ctx_alias.hasData()) - { - const auto& contextAliases = dsqlContext->getConcatenatedAlias(); - dsqlScratch->appendMetaString(contextAliases.c_str()); - } + const auto& contextAliases = dsqlContext->getConcatenatedAlias(); + appendContextAlias(dsqlScratch, contextAliases); dsqlScratch->appendUShort(dsqlContext->ctx_proc_inputs->items.getCount()); for (auto& arg : dsqlContext->ctx_proc_inputs->items) diff --git a/src/jrd/recsrc/BitmapTableScan.cpp b/src/jrd/recsrc/BitmapTableScan.cpp index dda0ecfc66c..8be42f51e24 100644 --- a/src/jrd/recsrc/BitmapTableScan.cpp +++ b/src/jrd/recsrc/BitmapTableScan.cpp @@ -149,6 +149,6 @@ void BitmapTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, uns planEntry.objectType = m_relation->getObjectType(); planEntry.objectName = m_relation->rel_name; - if (m_alias.hasData() && m_relation->rel_name.object != m_alias) + if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object)) planEntry.alias = m_alias; } diff --git a/src/jrd/recsrc/ExternalTableScan.cpp b/src/jrd/recsrc/ExternalTableScan.cpp index 16575542868..58e2f7a95f3 100644 --- a/src/jrd/recsrc/ExternalTableScan.cpp +++ b/src/jrd/recsrc/ExternalTableScan.cpp @@ -137,6 +137,6 @@ void ExternalTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, u planEntry.objectType = m_relation->getObjectType(); planEntry.objectName = m_relation->rel_name; - if (m_alias.hasData() && m_relation->rel_name.object != m_alias) + if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object)) planEntry.alias = m_alias; } diff --git a/src/jrd/recsrc/FullTableScan.cpp b/src/jrd/recsrc/FullTableScan.cpp index 7d8a56d043c..3711247e6de 100644 --- a/src/jrd/recsrc/FullTableScan.cpp +++ b/src/jrd/recsrc/FullTableScan.cpp @@ -198,6 +198,6 @@ void FullTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, unsig planEntry.objectType = m_relation->getObjectType(); planEntry.objectName = m_relation->rel_name; - if (m_alias.hasData() && m_relation->rel_name.object != m_alias) + if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object)) planEntry.alias = m_alias; } diff --git a/src/jrd/recsrc/IndexTableScan.cpp b/src/jrd/recsrc/IndexTableScan.cpp index a32306deae4..bf44b8bd768 100644 --- a/src/jrd/recsrc/IndexTableScan.cpp +++ b/src/jrd/recsrc/IndexTableScan.cpp @@ -404,7 +404,7 @@ void IndexTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, unsi planEntry.objectType = m_relation->getObjectType(); planEntry.objectName = m_relation->rel_name; - if (m_alias.hasData() && m_relation->rel_name.object != m_alias) + if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object)) planEntry.alias = m_alias; if (m_inversion) diff --git a/src/jrd/recsrc/RecordSource.h b/src/jrd/recsrc/RecordSource.h index a0f33de967f..b5414a8b00c 100644 --- a/src/jrd/recsrc/RecordSource.h +++ b/src/jrd/recsrc/RecordSource.h @@ -126,7 +126,7 @@ namespace Jrd Firebird::ObjectsArray children{getPool()}; std::optional objectType; QualifiedName objectName; - MetaName alias; + Firebird::string alias{getPool()}; const AccessPath* accessPath = nullptr; ULONG recordLength = 0; ULONG keyLength = 0; diff --git a/src/jrd/recsrc/VirtualTableScan.cpp b/src/jrd/recsrc/VirtualTableScan.cpp index 61663aa0682..286a15b5b77 100644 --- a/src/jrd/recsrc/VirtualTableScan.cpp +++ b/src/jrd/recsrc/VirtualTableScan.cpp @@ -131,6 +131,6 @@ void VirtualTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, un planEntry.objectType = m_relation->getObjectType(); planEntry.objectName = m_relation->rel_name; - if (m_alias.hasData() && m_relation->rel_name.object != m_alias) + if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object)) planEntry.alias = m_alias; }