| 1211 | // |
| 1212 | |
| 1213 | static void create_constraint( gpre_req* request, const act* action, cnstrt* constraint) |
| 1214 | { |
| 1215 | for (; constraint; constraint = constraint->cnstrt_next) |
| 1216 | { |
| 1217 | if (constraint->cnstrt_flags & CNSTRT_delete) |
| 1218 | continue; |
| 1219 | put_cstring(request, isc_dyn_rel_constraint, constraint->cnstrt_name->str_string); |
| 1220 | |
| 1221 | switch (constraint->cnstrt_type) |
| 1222 | { |
| 1223 | case CNSTRT_PRIMARY_KEY: |
| 1224 | request->add_byte(isc_dyn_def_primary_key); |
| 1225 | break; |
| 1226 | case CNSTRT_UNIQUE: |
| 1227 | request->add_byte(isc_dyn_def_unique); |
| 1228 | break; |
| 1229 | case CNSTRT_FOREIGN_KEY: |
| 1230 | request->add_byte(isc_dyn_def_foreign_key); |
| 1231 | break; |
| 1232 | case CNSTRT_NOT_NULL: |
| 1233 | request->add_byte(isc_dyn_fld_not_null); |
| 1234 | request->add_end(); |
| 1235 | continue; |
| 1236 | case CNSTRT_CHECK: |
| 1237 | create_check_constraint(request, action, constraint); |
| 1238 | request->add_end(); |
| 1239 | continue; |
| 1240 | default: |
| 1241 | fb_assert(false); |
| 1242 | } |
| 1243 | |
| 1244 | // stuff a zero-length name, indicating that an index |
| 1245 | // name should be generated |
| 1246 | |
| 1247 | request->add_word(0); |
| 1248 | |
| 1249 | if (constraint->cnstrt_type == CNSTRT_FOREIGN_KEY) |
| 1250 | { |
| 1251 | // If <referenced column list> is not specified try to catch |
| 1252 | // them right here |
| 1253 | if (constraint->cnstrt_referred_fields == NULL) |
| 1254 | get_referred_fields(action, constraint); |
| 1255 | |
| 1256 | if (constraint->cnstrt_fkey_def_type & REF_UPDATE_ACTION) |
| 1257 | { |
| 1258 | request->add_byte(isc_dyn_foreign_key_update); |
| 1259 | switch (constraint->cnstrt_fkey_def_type & REF_UPDATE_MASK) |
| 1260 | { |
| 1261 | case REF_UPD_NONE: |
| 1262 | request->add_byte(isc_dyn_foreign_key_none); |
| 1263 | break; |
| 1264 | case REF_UPD_CASCADE: |
| 1265 | request->add_byte(isc_dyn_foreign_key_cascade); |
| 1266 | create_upd_cascade_trg(request, action, constraint); |
| 1267 | break; |
| 1268 | case REF_UPD_SET_DEFAULT: |
| 1269 | request->add_byte(isc_dyn_foreign_key_default); |
| 1270 | create_set_default_trg(request, action, constraint, true); |
no test coverage detected