Skip to content

Commit 5427d2d

Browse files
authored
Fix issues with longish concatenated context aliases (#8494)
1 parent 10ea348 commit 5427d2d

File tree

7 files changed

+27
-16
lines changed

7 files changed

+27
-16
lines changed

src/jrd/RecordSourceNodes.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,20 @@ static ValueExprNode* resolveUsingField(DsqlCompilerScratch* dsqlScratch, const
5555

5656
namespace
5757
{
58+
void appendContextAlias(DsqlCompilerScratch* dsqlScratch, const string& alias)
59+
{
60+
const auto len = alias.length();
61+
if (len <= MAX_UCHAR)
62+
dsqlScratch->appendMetaString(alias.c_str());
63+
else
64+
{
65+
string truncatedAlias(alias);
66+
truncatedAlias.resize(MAX_UCHAR - 3);
67+
truncatedAlias += "...";
68+
dsqlScratch->appendMetaString(truncatedAlias.c_str());
69+
}
70+
}
71+
5872
// Search through the list of ANDed booleans to find comparisons
5973
// referring streams of parent select expressions.
6074
// Extract those booleans and return them to the caller.
@@ -677,7 +691,7 @@ void LocalTableSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch)
677691
{
678692
dsqlScratch->appendUChar(blr_local_table_id);
679693
dsqlScratch->appendUShort(tableNumber);
680-
dsqlScratch->appendMetaString(alias.c_str()); // dsqlContext->ctx_alias?
694+
appendContextAlias(dsqlScratch, alias); // dsqlContext->ctx_alias?
681695

682696
GEN_stuff_context(dsqlScratch, dsqlContext);
683697
}
@@ -893,7 +907,7 @@ void RelationSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch)
893907
if (dsqlContext->ctx_alias.hasData())
894908
{
895909
const auto& contextAliases = dsqlContext->getConcatenatedAlias();
896-
dsqlScratch->appendMetaString(contextAliases.c_str());
910+
appendContextAlias(dsqlScratch, contextAliases);
897911
}
898912

899913
GEN_stuff_context(dsqlScratch, dsqlContext);
@@ -1546,7 +1560,7 @@ void ProcedureSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch)
15461560
dsqlScratch->appendUChar(blr_invsel_procedure_alias);
15471561

15481562
const auto& contextAliases = dsqlContext->getConcatenatedAlias();
1549-
dsqlScratch->appendMetaString(contextAliases.c_str());
1563+
appendContextAlias(dsqlScratch, contextAliases);
15501564
}
15511565

15521566
dsqlScratch->appendUChar(blr_end);
@@ -1560,7 +1574,7 @@ void ProcedureSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch)
15601574
dsqlScratch->appendMetaString(dsqlProcedure->prc_name.object.c_str());
15611575

15621576
const auto& contextAliases = dsqlContext->getConcatenatedAlias();
1563-
dsqlScratch->appendMetaString(contextAliases.c_str());
1577+
appendContextAlias(dsqlScratch, contextAliases);
15641578
}
15651579
else
15661580
{
@@ -1589,7 +1603,7 @@ void ProcedureSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch)
15891603
if (dsqlContext->ctx_alias.hasData())
15901604
{
15911605
const auto& contextAliases = dsqlContext->getConcatenatedAlias();
1592-
dsqlScratch->appendMetaString(contextAliases.c_str());
1606+
appendContextAlias(dsqlScratch, contextAliases);
15931607
}
15941608
}
15951609

@@ -4150,11 +4164,8 @@ void TableValueFunctionSourceNode::genBlr(DsqlCompilerScratch* dsqlScratch)
41504164

41514165
GEN_stuff_context(dsqlScratch, dsqlContext);
41524166

4153-
if (dsqlContext->ctx_alias.hasData())
4154-
{
4155-
const auto& contextAliases = dsqlContext->getConcatenatedAlias();
4156-
dsqlScratch->appendMetaString(contextAliases.c_str());
4157-
}
4167+
const auto& contextAliases = dsqlContext->getConcatenatedAlias();
4168+
appendContextAlias(dsqlScratch, contextAliases);
41584169

41594170
dsqlScratch->appendUShort(dsqlContext->ctx_proc_inputs->items.getCount());
41604171
for (auto& arg : dsqlContext->ctx_proc_inputs->items)

src/jrd/recsrc/BitmapTableScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,6 @@ void BitmapTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, uns
149149
planEntry.objectType = m_relation->getObjectType();
150150
planEntry.objectName = m_relation->rel_name;
151151

152-
if (m_alias.hasData() && m_relation->rel_name.object != m_alias)
152+
if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object))
153153
planEntry.alias = m_alias;
154154
}

src/jrd/recsrc/ExternalTableScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,6 @@ void ExternalTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, u
137137
planEntry.objectType = m_relation->getObjectType();
138138
planEntry.objectName = m_relation->rel_name;
139139

140-
if (m_alias.hasData() && m_relation->rel_name.object != m_alias)
140+
if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object))
141141
planEntry.alias = m_alias;
142142
}

src/jrd/recsrc/FullTableScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,6 @@ void FullTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, unsig
198198
planEntry.objectType = m_relation->getObjectType();
199199
planEntry.objectName = m_relation->rel_name;
200200

201-
if (m_alias.hasData() && m_relation->rel_name.object != m_alias)
201+
if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object))
202202
planEntry.alias = m_alias;
203203
}

src/jrd/recsrc/IndexTableScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ void IndexTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, unsi
404404
planEntry.objectType = m_relation->getObjectType();
405405
planEntry.objectName = m_relation->rel_name;
406406

407-
if (m_alias.hasData() && m_relation->rel_name.object != m_alias)
407+
if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object))
408408
planEntry.alias = m_alias;
409409

410410
if (m_inversion)

src/jrd/recsrc/RecordSource.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ namespace Jrd
126126
Firebird::ObjectsArray<PlanEntry> children{getPool()};
127127
std::optional<ObjectType> objectType;
128128
QualifiedName objectName;
129-
MetaName alias;
129+
Firebird::string alias{getPool()};
130130
const AccessPath* accessPath = nullptr;
131131
ULONG recordLength = 0;
132132
ULONG keyLength = 0;

src/jrd/recsrc/VirtualTableScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,6 @@ void VirtualTableScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntry, un
131131
planEntry.objectType = m_relation->getObjectType();
132132
planEntry.objectName = m_relation->rel_name;
133133

134-
if (m_alias.hasData() && m_relation->rel_name.object != m_alias)
134+
if (m_alias.hasData() && m_alias != string(m_relation->rel_name.object))
135135
planEntry.alias = m_alias;
136136
}

0 commit comments

Comments
 (0)