@@ -7965,17 +7965,70 @@ void AlterRelationNode::execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratc
79657965
79667966 FOR (REQUEST_HANDLE requestHandle TRANSACTION_HANDLE transaction)
79677967 TRG IN RDB$TRIGGERS CROSS
7968- CHK IN RDB$CHECK_CONSTRAINTS WITH
7969- TRG.RDB$RELATION_NAME EQ name.c_str() AND
7970- TRG.RDB$TRIGGER_NAME EQ CHK.RDB$TRIGGER_NAME AND
7971- CHK.RDB$CONSTRAINT_NAME EQ clause->name.c_str()
7968+ CHK IN RDB$CHECK_CONSTRAINTS
7969+ WITH TRG.RDB$RELATION_NAME EQ name.c_str() AND
7970+ TRG.RDB$TRIGGER_NAME EQ CHK.RDB$TRIGGER_NAME AND
7971+ CHK.RDB$CONSTRAINT_NAME EQ clause->name.c_str()
79727972 {
79737973 MODIFY TRG
79747974 TRG.RDB$TRIGGER_INACTIVE = clause->enforced ? FALSE : TRUE;
79757975 END_MODIFY
79767976 }
79777977 END_FOR
79787978 }
7979+ else if (strcmp(RC.RDB$CONSTRAINT_TYPE, NOT_NULL_CNSTRT) == 0)
7980+ {
7981+ AutoRequest requestHandle;
7982+
7983+ FOR (REQUEST_HANDLE requestHandle TRANSACTION_HANDLE transaction)
7984+ CHK IN RDB$CHECK_CONSTRAINTS CROSS
7985+ RF IN RDB$RELATION_FIELDS
7986+ WITH CHK.RDB$CONSTRAINT_NAME EQ clause->name.c_str() AND
7987+ CHK.RDB$TRIGGER_NAME EQ RF.RDB$FIELD_NAME AND
7988+ RF.RDB$RELATION_NAME EQ name.c_str()
7989+ {
7990+ // Identity column cannot be NULL-able.
7991+ if (RF.RDB$IDENTITY_TYPE.NULL == FALSE)
7992+ {
7993+ fb_utils::exact_name(RF.RDB$FIELD_NAME);
7994+ // msg 274: Identity column @1 of table @2 cannot be changed to NULLable
7995+ status_exception::raise(Arg::PrivateDyn(274) << RF.RDB$FIELD_NAME << name.c_str());
7996+ }
7997+
7998+ // Column of an active primary key cannot be nullable
7999+ AutoRequest request3;
8000+
8001+ FOR (REQUEST_HANDLE request3 TRANSACTION_HANDLE transaction)
8002+ ISG IN RDB$INDEX_SEGMENTS CROSS
8003+ IDX IN RDB$INDICES CROSS
8004+ RC2 IN RDB$RELATION_CONSTRAINTS
8005+ WITH ISG.RDB$FIELD_NAME EQ RF.RDB$FIELD_NAME AND
8006+ ISG.RDB$INDEX_NAME EQ IDX.RDB$INDEX_NAME AND
8007+ IDX.RDB$RELATION_NAME EQ name.c_str() AND
8008+ (IDX.RDB$INDEX_INACTIVE EQ 0 OR IDX.RDB$INDEX_INACTIVE MISSING) AND
8009+ RC2.RDB$INDEX_NAME EQ IDX.RDB$INDEX_NAME AND
8010+ RC2.RDB$CONSTRAINT_TYPE EQ PRIMARY_KEY
8011+ {
8012+ status_exception::raise(Arg::Gds(isc_primary_key_notnull));
8013+ }
8014+ END_FOR
8015+
8016+ // Otherwise it is fine
8017+ MODIFY RF
8018+ if (clause->enforced)
8019+ {
8020+ RF.RDB$NULL_FLAG.NULL = FALSE;
8021+ RF.RDB$NULL_FLAG = TRUE;
8022+ }
8023+ else
8024+ {
8025+ RF.RDB$NULL_FLAG.NULL = TRUE;
8026+ RF.RDB$NULL_FLAG = FALSE; // For symmetry
8027+ }
8028+ END_MODIFY
8029+ }
8030+ END_FOR
8031+ }
79798032 else
79808033 status_exception::raise(Arg::Gds(isc_wish_list) << Arg::Gds(isc_ref_cnstrnt_update));
79818034 }
0 commit comments