Skip to content

Commit 9c7090d

Browse files
committed
Fixed control on index dependencies when index to be deleted
1 parent 36d6695 commit 9c7090d

3 files changed

Lines changed: 58 additions & 2 deletions

File tree

src/dsql/DdlNodes.epp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14407,7 +14407,27 @@ void DropIndexNode::drop(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_
1440714407
IDX.RDB$INDEX_INACTIVE = MET_index_deferred_drop;
1440814408

1440914409
if (tempName.hasData())
14410+
{
1441014411
strcpy(IDX.RDB$INDEX_NAME, tempName.c_str());
14412+
14413+
// Related dependencies should be also renamed
14414+
AUTO_HANDLE(depRq);
14415+
FOR(REQUEST_HANDLE depRq TRANSACTION_HANDLE transaction)
14416+
DEP IN RDB$DEPENDENCIES
14417+
WITH DEP.RDB$DEPENDENT_SCHEMA_NAME EQ indexName.schema.c_str() AND
14418+
DEP.RDB$PACKAGE_NAME EQUIV NULLIF(indexName.package.c_str(), '') AND
14419+
DEP.RDB$DEPENDENT_NAME EQ indexName.object.c_str() AND
14420+
(DEP.RDB$DEPENDENT_TYPE EQ obj_index_expression OR
14421+
DEP.RDB$DEPENDENT_TYPE EQ obj_index_condition)
14422+
{
14423+
MODIFY DEP USING
14424+
{
14425+
strcpy(DEP.RDB$DEPENDENT_NAME, tempName.c_str());
14426+
}
14427+
END_MODIFY
14428+
}
14429+
END_FOR
14430+
}
1441114431
END_MODIFY
1441214432
}
1441314433
else

src/jrd/SystemTriggers.epp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,6 +1732,40 @@ void afterInsertCollation(thread_db* tdbb, Record* record)
17321732
populateCache<f_coll_cs_id, Cached::CharSet, CSetId>(tdbb, record);
17331733
}
17341734

1735+
void afterDeleteIndex(thread_db* tdbb, Record* record)
1736+
{
1737+
const auto transaction = tdbb->getTransaction();
1738+
dsc desc;
1739+
1740+
MetaName schemaName, packageName, indexName;
1741+
1742+
if (!EVL_field(nullptr, record, f_idx_schema, &desc))
1743+
return;
1744+
MOV_get_metaname(tdbb, &desc, schemaName);
1745+
1746+
if (EVL_field(nullptr, record, f_idx_pkg_name, &desc))
1747+
MOV_get_metaname(tdbb, &desc, packageName);
1748+
1749+
if (!EVL_field(nullptr, record, f_idx_name, &desc))
1750+
return;
1751+
MOV_get_metaname(tdbb, &desc, indexName);
1752+
1753+
static const CachedRequestId requestCacheId;
1754+
AutoCacheRequest request(tdbb, requestCacheId);
1755+
1756+
FOR (REQUEST_HANDLE request TRANSACTION_HANDLE transaction)
1757+
DEP IN RDB$DEPENDENCIES
1758+
WITH DEP.RDB$DEPENDENT_SCHEMA_NAME EQ schemaName.c_str() AND
1759+
DEP.RDB$PACKAGE_NAME EQUIV NULLIF(packageName.c_str(), '') AND
1760+
DEP.RDB$DEPENDENT_NAME EQ indexName.c_str() AND
1761+
(DEP.RDB$DEPENDENT_TYPE EQ obj_index_expression OR
1762+
DEP.RDB$DEPENDENT_TYPE EQ obj_index_condition)
1763+
{
1764+
ERASE DEP;
1765+
}
1766+
END_FOR
1767+
}
1768+
17351769
} // anonymous
17361770

17371771

@@ -1780,6 +1814,10 @@ void SystemTriggers::executeAfterDeleteTriggers(thread_db* tdbb, jrd_rel* relati
17801814
case rel_rfr:
17811815
afterDeleteRelationField(tdbb, record);
17821816
break;
1817+
1818+
case rel_indices:
1819+
afterDeleteIndex(tdbb, record);
1820+
break;
17831821
}
17841822
}
17851823

src/jrd/dfw.epp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3687,8 +3687,6 @@ static bool delete_index(thread_db* tdbb, SSHORT phase, DeferredWork* work, jrd_
36873687
}
36883688
}
36893689
}
3690-
MET_delete_dependencies(tdbb, work->getQualifiedName(), obj_index_expression);
3691-
MET_delete_dependencies(tdbb, work->getQualifiedName(), obj_index_condition);
36923690
return true;
36933691

36943692
case 5:

0 commit comments

Comments
 (0)