MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / preprocessAssignments

Function preprocessAssignments

src/dsql/StmtNodes.cpp:10999–11084  ·  view source on GitHub ↗

1. Remove assignments of DEFAULT to computed fields. 2. Remove assignments to identity column when OVERRIDING USER VALUE is specified in INSERT.

Source from the content-addressed store, hash-verified

10997// 1. Remove assignments of DEFAULT to computed fields.
10998// 2. Remove assignments to identity column when OVERRIDING USER VALUE is specified in INSERT.
10999static void preprocessAssignments(thread_db* tdbb, CompilerScratch* csb,
11000 StreamType stream, CompoundStmtNode* compoundNode, const Nullable<OverrideClause>* insertOverride)
11001{
11002 if (!compoundNode)
11003 return;
11004
11005 jrd_rel* relation = csb->csb_rpt[stream].csb_relation;
11006
11007 //// TODO: LocalTableSourceNode
11008 if (!relation)
11009 return;
11010
11011 Nullable<IdentityType> identityType;
11012
11013 for (FB_SIZE_T i = compoundNode->statements.getCount(); i--; )
11014 {
11015 const AssignmentNode* assign = nodeAs<AssignmentNode>(compoundNode->statements[i]);
11016 fb_assert(assign);
11017 if (!assign)
11018 continue;
11019
11020 const ExprNode* assignFrom = assign->asgnFrom;
11021 const FieldNode* assignToField = nodeAs<FieldNode>(assign->asgnTo);
11022
11023 if (assignToField)
11024 {
11025 int fieldId = assignToField->fieldId;
11026 jrd_fld* fld;
11027
11028 while (true)
11029 {
11030 if (assignToField->fieldStream == stream &&
11031 (fld = MET_get_field(relation, fieldId)))
11032 {
11033 if (insertOverride && fld->fld_identity_type.specified)
11034 {
11035 if (insertOverride->specified || !nodeIs<DefaultNode>(assignFrom))
11036 identityType = fld->fld_identity_type;
11037
11038 if (*insertOverride == OverrideClause::USER_VALUE)
11039 {
11040 compoundNode->statements.remove(i);
11041 break;
11042 }
11043 }
11044
11045 if (fld->fld_computation)
11046 {
11047 if (nodeIs<DefaultNode>(assignFrom))
11048 compoundNode->statements.remove(i);
11049 }
11050 else if (relation->rel_view_rse && fld->fld_source_rel_field.first.hasData())
11051 {
11052 relation = MET_lookup_relation(tdbb, fld->fld_source_rel_field.first);
11053
11054 fb_assert(relation);
11055 if (!relation)
11056 return;

Callers 1

pass1Method · 0.85

Calls 5

GdsClass · 0.85
ERR_postFunction · 0.50
getCountMethod · 0.45
removeMethod · 0.45
hasDataMethod · 0.45

Tested by

no test coverage detected