Skip to content

Commit 0acd6e0

Browse files
committed
Avoid adding new dependencies to database too early
1 parent fb32088 commit 0acd6e0

10 files changed

Lines changed: 289 additions & 200 deletions

File tree

src/dsql/ExprNodes.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5122,7 +5122,7 @@ DmlNode* DefaultNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch*
51225122
{
51235123
Dependency dependency(obj_relation);
51245124
dependency.relation = MetadataCache::getPerm<Cached::Relation>(tdbb, relationName, CacheFlag::AUTOCREATE);
5125-
dependency.subName = FB_NEW_POOL(pool) MetaName(fieldName);
5125+
dependency.subName = fieldName;
51265126
csb->addDependency(dependency);
51275127
}
51285128

@@ -13299,7 +13299,7 @@ DmlNode* UdfCallNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch*
1329913299
{
1330013300
Dependency dependency(obj_udf);
1330113301
dependency.function = node->function();
13302-
dependency.subName = &argName;
13302+
dependency.subName = argName;
1330313303
csb->addDependency(dependency);
1330413304
}
1330513305
}

src/dsql/StmtNodes.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3416,7 +3416,7 @@ DmlNode* ExecProcedureNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScr
34163416
{
34173417
Dependency dependency(obj_procedure);
34183418
dependency.procedure = node->procedure();
3419-
dependency.subName = &argName;
3419+
dependency.subName = argName;
34203420
csb->addDependency(dependency);
34213421
}
34223422
}
@@ -3427,7 +3427,7 @@ DmlNode* ExecProcedureNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScr
34273427
{
34283428
Dependency dependency(obj_procedure);
34293429
dependency.procedure = node->procedure();
3430-
dependency.subName = &argName;
3430+
dependency.subName = argName;
34313431
csb->addDependency(dependency);
34323432
}
34333433
}

src/jrd/RecordSourceNodes.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1434,7 +1434,7 @@ ProcedureSourceNode* ProcedureSourceNode::parse(thread_db* tdbb, CompilerScratch
14341434
{
14351435
Dependency dependency(obj_procedure);
14361436
dependency.procedure = node->procedure();
1437-
dependency.subName = &argName;
1437+
dependency.subName = argName;
14381438
csb->addDependency(dependency);
14391439
}
14401440
}

src/jrd/dfw.epp

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@ static bool set_linger(thread_db*, SSHORT, DeferredWork*, jrd_tra*);
416416
static bool clear_cache(thread_db*, SSHORT, DeferredWork*, jrd_tra*);
417417
static bool change_repl_state(thread_db*, SSHORT, DeferredWork*, jrd_tra*);
418418
static bool set_statistics(thread_db*, SSHORT, DeferredWork*, jrd_tra*);
419+
static bool deps_to_disk(thread_db*, SSHORT, DeferredWork*, jrd_tra*);
419420

420421
// ----------------------------------------------------------------
421422

@@ -879,13 +880,13 @@ namespace
879880
Dependency dependency(obj_relation);
880881
dependency.relation = MetadataCache::getPerm<Cached::Relation>(tdbb,
881882
parameter->prm_type_of_table, CacheFlag::AUTOCREATE);
882-
dependency.subName = &parameter->prm_type_of_column;
883+
dependency.subName = parameter->prm_type_of_column;
883884
dependencies.push(dependency);
884885
}
885886
else if (!fb_utils::implicit_domain(parameter->prm_field_source.object.c_str()))
886887
{
887888
Dependency dependency(obj_field);
888-
dependency.name = &parameter->prm_field_source;
889+
dependency.name = parameter->prm_field_source;
889890
dependencies.push(dependency);
890891
}
891892

@@ -899,8 +900,7 @@ namespace
899900
}
900901

901902
MET_store_dependencies(tdbb, dependencies, nullptr, depName,
902-
(work->dfw_package.isEmpty() ? objType : obj_package_header),
903-
transaction);
903+
(work->dfw_package.isEmpty() ? objType : obj_package_header));
904904
}
905905

906906
MetadataCache::verify_cache(tdbb);
@@ -1121,6 +1121,7 @@ namespace
11211121

11221122
static inline constexpr deferred_task task_table[] =
11231123
{
1124+
{ dfw_deps_to_disk, deps_to_disk }, // must be first
11241125
{ dfw_add_shadow, add_shadow },
11251126
{ dfw_delete_ltt_index, delete_ltt_index },
11261127
{ dfw_delete_index, delete_index },
@@ -4998,3 +4999,32 @@ static bool make_ltt_version(thread_db* tdbb, SSHORT phase, DeferredWork* work,
49984999
}
49995000

50005001

5002+
// Store dependencies
5003+
static bool deps_to_disk(thread_db* tdbb, SSHORT phase, DeferredWork* work, jrd_tra* transaction)
5004+
{
5005+
switch (phase)
5006+
{
5007+
case 1:
5008+
case 2:
5009+
case 3:
5010+
case 4:
5011+
case 5:
5012+
case 6:
5013+
return true;
5014+
5015+
case 7:
5016+
break;
5017+
5018+
default:
5019+
return false;
5020+
}
5021+
5022+
transaction->tra_flags |= TRA_deps_to_disk;
5023+
5024+
for (auto& dep : transaction->tra_dependencies)
5025+
MET_store_dependency(tdbb, dep.dependency, dep.dep_rel, dep.object_name, dep.dependency_type);
5026+
5027+
transaction->tra_dependencies.clear();
5028+
5029+
return false;
5030+
}

src/jrd/exe.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,14 +435,26 @@ struct Dependency
435435
Cached::Relation* relation;
436436
Cached::Function* function;
437437
Cached::Procedure* procedure;
438-
const QualifiedName* name;
439438
SLONG number;
440439
};
440+
QualifiedName name;
441441

442-
const MetaName* subName;
442+
MetaName subName;
443443
SLONG subNumber;
444444
};
445445

446+
struct WildDependency
447+
{
448+
WildDependency()
449+
: dependency(0)
450+
{ }
451+
452+
Dependency dependency;
453+
const jrd_rel* dep_rel;
454+
QualifiedName object_name;
455+
int dependency_type;
456+
};
457+
446458
class CompilerScratch : public pool_alloc<type_csb>
447459
{
448460
public:

0 commit comments

Comments
 (0)