| 1221 | // |
| 1222 | |
| 1223 | static act* act_alter_domain() |
| 1224 | { |
| 1225 | // create request block |
| 1226 | |
| 1227 | gpre_req* request = MSC_request(REQ_ddl); |
| 1228 | if (gpreGlob.isc_databases && !gpreGlob.isc_databases->dbb_next) |
| 1229 | request->req_database = gpreGlob.isc_databases; |
| 1230 | else |
| 1231 | PAR_error("Can only ALTER a domain in context of single database"); |
| 1232 | |
| 1233 | // create action block |
| 1234 | |
| 1235 | act* action = MSC_action(request, ACT_alter_domain); |
| 1236 | |
| 1237 | PAR_get_token(); |
| 1238 | gpre_fld* field = make_field(0); |
| 1239 | cnstrt** cnstrt_ptr = &field->fld_constraints; |
| 1240 | |
| 1241 | // Check if default value was specified |
| 1242 | |
| 1243 | while (!end_of_command()) |
| 1244 | { |
| 1245 | if (MSC_match(KW_SET)) |
| 1246 | { |
| 1247 | if (gpreGlob.token_global.tok_keyword == KW_DEFAULT) |
| 1248 | { |
| 1249 | field->fld_default_source = CPR_start_text(); |
| 1250 | PAR_get_token(); |
| 1251 | } |
| 1252 | else |
| 1253 | CPR_s_error("DEFAULT"); |
| 1254 | |
| 1255 | if (MSC_match(KW_USER)) |
| 1256 | field->fld_default_value = MSC_node(nod_user_name, 0); |
| 1257 | else if (MSC_match(KW_NULL)) |
| 1258 | field->fld_default_value = MSC_node(nod_null, 0); |
| 1259 | else |
| 1260 | { |
| 1261 | if (MSC_match(KW_MINUS)) |
| 1262 | { |
| 1263 | if (gpreGlob.token_global.tok_type != tok_number) |
| 1264 | CPR_s_error("<number>"); |
| 1265 | |
| 1266 | gpre_nod* literal_node = EXP_literal(); |
| 1267 | field->fld_default_value = MSC_unary(nod_negate, literal_node); |
| 1268 | } |
| 1269 | else if ((field->fld_default_value = EXP_literal()) == NULL) |
| 1270 | CPR_s_error("<constant>"); |
| 1271 | } |
| 1272 | CPR_end_text(field->fld_default_source); |
| 1273 | } |
| 1274 | else if (MSC_match(KW_ADD)) |
| 1275 | { |
| 1276 | MSC_match(KW_CONSTRAINT); |
| 1277 | if (gpreGlob.token_global.tok_keyword == KW_CHECK) |
| 1278 | { |
| 1279 | cnstrt* cnstrt_str = par_field_constraint(request, field); |
| 1280 | *cnstrt_ptr = cnstrt_str; |
no test coverage detected