1. Remove assignments of DEFAULT to computed fields. 2. Remove assignments to identity column when OVERRIDING USER VALUE is specified in INSERT.
| 10997 | // 1. Remove assignments of DEFAULT to computed fields. |
| 10998 | // 2. Remove assignments to identity column when OVERRIDING USER VALUE is specified in INSERT. |
| 10999 | static 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; |