Build a validation list for a relation, if appropriate.
| 10708 | |
| 10709 | // Build a validation list for a relation, if appropriate. |
| 10710 | static void makeValidation(thread_db* tdbb, CompilerScratch* csb, StreamType stream, |
| 10711 | Array<ValidateInfo>& validations) |
| 10712 | { |
| 10713 | SET_TDBB(tdbb); |
| 10714 | |
| 10715 | DEV_BLKCHK(csb, type_csb); |
| 10716 | |
| 10717 | jrd_rel* relation = csb->csb_rpt[stream].csb_relation; |
| 10718 | if (!relation) //// TODO: LocalTableSourceNode |
| 10719 | return; |
| 10720 | |
| 10721 | vec<jrd_fld*>* vector = relation->rel_fields; |
| 10722 | if (!vector) |
| 10723 | return; |
| 10724 | |
| 10725 | StreamMap localMap; |
| 10726 | StreamType* map = csb->csb_rpt[stream].csb_map; |
| 10727 | |
| 10728 | if (!map) |
| 10729 | { |
| 10730 | map = localMap.getBuffer(STREAM_MAP_LENGTH); |
| 10731 | fb_assert(stream <= MAX_STREAMS); |
| 10732 | map[0] = stream; |
| 10733 | } |
| 10734 | |
| 10735 | USHORT fieldId = 0; |
| 10736 | vec<jrd_fld*>::iterator ptr1 = vector->begin(); |
| 10737 | |
| 10738 | for (const vec<jrd_fld*>::const_iterator end = vector->end(); ptr1 < end; ++ptr1, ++fieldId) |
| 10739 | { |
| 10740 | BoolExprNode* validation; |
| 10741 | |
| 10742 | if (*ptr1 && (validation = (*ptr1)->fld_validation)) |
| 10743 | { |
| 10744 | AutoSetRestore<USHORT> autoRemapVariable(&csb->csb_remap_variable, |
| 10745 | (csb->csb_variables ? csb->csb_variables->count() : 0) + 1); |
| 10746 | |
| 10747 | RemapFieldNodeCopier copier(csb, map, fieldId); |
| 10748 | |
| 10749 | validation = copier.copy(tdbb, validation); |
| 10750 | |
| 10751 | ValidateInfo validate; |
| 10752 | validate.boolean = validation; |
| 10753 | validate.value = PAR_gen_field(tdbb, stream, fieldId); |
| 10754 | validations.add(validate); |
| 10755 | } |
| 10756 | |
| 10757 | if (*ptr1 && (validation = (*ptr1)->fld_not_null)) |
| 10758 | { |
| 10759 | AutoSetRestore<USHORT> autoRemapVariable(&csb->csb_remap_variable, |
| 10760 | (csb->csb_variables ? csb->csb_variables->count() : 0) + 1); |
| 10761 | |
| 10762 | RemapFieldNodeCopier copier(csb, map, fieldId); |
| 10763 | |
| 10764 | validation = copier.copy(tdbb, validation); |
| 10765 | |
| 10766 | ValidateInfo validate; |
| 10767 | validate.boolean = validation; |