Skip to content

Commit 6a5c761

Browse files
committed
Fix problems with fully qualified packaged table's index names
1 parent 5da72ab commit 6a5c761

4 files changed

Lines changed: 64 additions & 9 deletions

File tree

src/dsql/gen.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -523,14 +523,32 @@ static void gen_plan(DsqlCompilerScratch* dsqlScratch, const PlanNode* planNode)
523523

524524
const auto checkIndexSchema = [&]()
525525
{
526-
if (node->recordSourceNode &&
527-
node->recordSourceNode->dsqlContext &&
528-
node->recordSourceNode->dsqlContext->ctx_relation &&
529-
idx_iter->indexName.schema.hasData() &&
530-
idx_iter->indexName.schema != node->recordSourceNode->dsqlContext->ctx_relation->rel_name.schema)
526+
if (!node->recordSourceNode ||
527+
!node->recordSourceNode->dsqlContext ||
528+
!node->recordSourceNode->dsqlContext->ctx_relation)
531529
{
532-
ERRD_post(Arg::Gds(isc_index_unused) << idx_iter->indexName.toQuotedString());
530+
return;
533531
}
532+
533+
const auto& relName = node->recordSourceNode->dsqlContext->ctx_relation->rel_name;
534+
const auto& indexName = idx_iter->indexName;
535+
536+
if (indexName.package.hasData())
537+
{
538+
if ((!indexName.schema.hasData() || indexName.schema == relName.schema) &&
539+
indexName.package == relName.package)
540+
{
541+
return;
542+
}
543+
}
544+
else if (!indexName.schema.hasData() ||
545+
indexName.schema == relName.schema ||
546+
indexName.schema == relName.package)
547+
{
548+
return;
549+
}
550+
551+
ERRD_post(Arg::Gds(isc_index_unused) << indexName.toQuotedString());
534552
};
535553

536554
switch (node->accessType->type)

src/dsql/parse.y

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7423,7 +7423,7 @@ access_type
74237423
'(' index_list($2) ')'
74247424
{ $$ = $2; }
74257425
| ORDER { $$ = newNode<PlanNode::AccessType>(PlanNode::AccessType::TYPE_NAVIGATIONAL); }
7426-
symbol_index_name extra_indices_opt($2)
7426+
scoped_qualified_name extra_indices_opt($2)
74277427
{
74287428
$$ = $2;
74297429
$$->items.insert(0).indexName = *$3;
@@ -7432,12 +7432,12 @@ access_type
74327432

74337433
%type index_list(<accessType>)
74347434
index_list($accessType)
7435-
: symbol_index_name
7435+
: scoped_qualified_name
74367436
{
74377437
PlanNode::AccessItem& item = $accessType->items.add();
74387438
item.indexName = *$1;
74397439
}
7440-
| index_list ',' symbol_index_name
7440+
| index_list ',' scoped_qualified_name
74417441
{
74427442
PlanNode::AccessItem& item = $accessType->items.add();
74437443
item.indexName = *$3;

src/jrd/RecordSourceNodes.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,41 @@ dsql_ctx* PlanNode::dsqlPassAlias(DsqlCompilerScratch* dsqlScratch, DsqlContextS
603603
}
604604
}
605605

606+
if (!result_context && alias.schema.hasData() && alias.package.isEmpty())
607+
{
608+
// Fallback for packaged relations referenced as package.table: the qualifier
609+
// names a package, not a schema. Mirrors the name1.name2 handling in
610+
// DsqlCompilerScratch::resolveRoutineOrRelation. Kept local to PLAN matching
611+
// so field-qualification semantics elsewhere are unchanged.
612+
for (DsqlContextStack::iterator itr(stack); itr.hasData(); ++itr)
613+
{
614+
dsql_ctx* context = itr.object();
615+
if (context->ctx_scope_level != dsqlScratch->scopeLevel)
616+
continue;
617+
618+
if (context->ctx_internal_alias.object.hasData())
619+
continue;
620+
621+
if ((context->ctx_relation &&
622+
context->ctx_relation->rel_name.object == alias.object &&
623+
context->ctx_relation->rel_name.package == alias.schema) ||
624+
(context->ctx_procedure &&
625+
context->ctx_procedure->prc_name.object == alias.object &&
626+
context->ctx_procedure->prc_name.package == alias.schema))
627+
{
628+
if (result_context)
629+
{
630+
// the table %s is referenced twice; use aliases to differentiate
631+
ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) <<
632+
Arg::Gds(isc_dsql_command_err) <<
633+
Arg::Gds(isc_dsql_self_join) << alias.toQuotedString());
634+
}
635+
636+
result_context = context;
637+
}
638+
}
639+
}
640+
606641
return result_context;
607642
}
608643

src/jrd/par.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,7 @@ static PlanNode* par_plan(thread_db* tdbb, CompilerScratch* csb)
11851185
QualifiedName name;
11861186
csb->csb_blr_reader.getMetaName(name.object);
11871187
name.schema = relation->rel_name.schema;
1188+
name.package = relation->rel_name.package;
11881189

11891190
IndexStatus idx_status;
11901191
MetaId foundRelationId;
@@ -1240,6 +1241,7 @@ static PlanNode* par_plan(thread_db* tdbb, CompilerScratch* csb)
12401241
QualifiedName name;
12411242
csb->csb_blr_reader.getMetaName(name.object);
12421243
name.schema = relation->rel_name.schema;
1244+
name.package = relation->rel_name.package;
12431245

12441246
IndexStatus idx_status;
12451247
MetaId foundRelationId;

0 commit comments

Comments
 (0)