| 6125 | // |
| 6126 | |
| 6127 | static void par_fkey_extension(cnstrt* cnstrt_val) |
| 6128 | { |
| 6129 | // Extended foreign key definition could be as follows : |
| 6130 | // |
| 6131 | // [ON DELETE { NO ACTION | CASCADE | SET DEFAULT | SET NULL } ] |
| 6132 | // [ON UPDATE { NO ACTION | CASCADE | SET DEFAULT | SET NULL } ] |
| 6133 | |
| 6134 | fb_assert(gpreGlob.token_global.tok_keyword == KW_ON); |
| 6135 | fb_assert(cnstrt_val != NULL); |
| 6136 | |
| 6137 | PAR_get_token(); |
| 6138 | |
| 6139 | const kwwords_t keyword = gpreGlob.token_global.tok_keyword; |
| 6140 | switch (keyword) |
| 6141 | { |
| 6142 | case KW_DELETE: |
| 6143 | // NOTE: action must be defined only once |
| 6144 | if (cnstrt_val->cnstrt_fkey_def_type & REF_DELETE_ACTION) |
| 6145 | CPR_s_error("UPDATE"); |
| 6146 | else |
| 6147 | cnstrt_val->cnstrt_fkey_def_type |= REF_DELETE_ACTION; |
| 6148 | break; |
| 6149 | case KW_UPDATE: |
| 6150 | // NOTE: action must be defined only once |
| 6151 | if (cnstrt_val->cnstrt_fkey_def_type & REF_UPDATE_ACTION) |
| 6152 | CPR_s_error("DELETE"); |
| 6153 | else |
| 6154 | cnstrt_val->cnstrt_fkey_def_type |= REF_UPDATE_ACTION; |
| 6155 | break; |
| 6156 | default: |
| 6157 | // unexpected keyword |
| 6158 | CPR_s_error("UPDATE or DELETE"); |
| 6159 | break; |
| 6160 | } |
| 6161 | |
| 6162 | PAR_get_token(); |
| 6163 | |
| 6164 | switch (gpreGlob.token_global.tok_keyword) |
| 6165 | { |
| 6166 | case KW_NO: |
| 6167 | PAR_get_token(); |
| 6168 | if (gpreGlob.token_global.tok_keyword != KW_ACTION) |
| 6169 | CPR_s_error("ACTION"); |
| 6170 | else if (keyword == KW_DELETE) |
| 6171 | cnstrt_val->cnstrt_fkey_def_type |= REF_DEL_NONE; |
| 6172 | else |
| 6173 | cnstrt_val->cnstrt_fkey_def_type |= REF_UPD_NONE; |
| 6174 | break; |
| 6175 | case KW_CASCADE: |
| 6176 | if (keyword == KW_DELETE) |
| 6177 | cnstrt_val->cnstrt_fkey_def_type |= REF_DEL_CASCADE; |
| 6178 | else |
| 6179 | cnstrt_val->cnstrt_fkey_def_type |= REF_UPD_CASCADE; |
| 6180 | break; |
| 6181 | case KW_SET: |
| 6182 | PAR_get_token(); |
| 6183 | switch (gpreGlob.token_global.tok_keyword) |
| 6184 | { |
no test coverage detected