| 3140 | // |
| 3141 | |
| 3142 | static act* act_grant_revoke(act_t type) |
| 3143 | { |
| 3144 | gpre_req* request = MSC_request(REQ_ddl); |
| 3145 | PRV priv_block = MSC_privilege_block(); |
| 3146 | |
| 3147 | // if it is revoke action, parse the optional grant option for |
| 3148 | |
| 3149 | if (type == ACT_dyn_revoke) |
| 3150 | { |
| 3151 | if (MSC_match(KW_GRANT)) |
| 3152 | { |
| 3153 | if (!MSC_match(KW_OPTION)) |
| 3154 | CPR_s_error("OPTION"); |
| 3155 | if (!MSC_match(KW_FOR)) |
| 3156 | CPR_s_error("FOR"); |
| 3157 | priv_block->prv_privileges |= PRV_grant_option; |
| 3158 | } |
| 3159 | } |
| 3160 | |
| 3161 | bool execute_priv = false; |
| 3162 | |
| 3163 | if (MSC_match(KW_ALL)) |
| 3164 | { |
| 3165 | MSC_match(KW_PRIVILEGES); // Keyword 'privileges' is optional |
| 3166 | priv_block->prv_privileges = PRV_all; |
| 3167 | } |
| 3168 | else if (MSC_match(KW_EXECUTE)) |
| 3169 | { |
| 3170 | priv_block->prv_privileges |= PRV_execute; |
| 3171 | execute_priv = true; |
| 3172 | } |
| 3173 | else |
| 3174 | { |
| 3175 | gpre_lls** fields = &priv_block->prv_fields; |
| 3176 | while (true) |
| 3177 | { |
| 3178 | if (MSC_match(KW_SELECT)) |
| 3179 | priv_block->prv_privileges |= PRV_select; |
| 3180 | else if (MSC_match(KW_INSERT)) |
| 3181 | priv_block->prv_privileges |= PRV_insert; |
| 3182 | else if (MSC_match(KW_DELETE)) |
| 3183 | priv_block->prv_privileges |= PRV_delete; |
| 3184 | else if (MSC_match(KW_UPDATE)) |
| 3185 | { |
| 3186 | priv_block->prv_privileges |= PRV_update; |
| 3187 | if (MSC_match(KW_LEFT_PAREN)) |
| 3188 | { |
| 3189 | SCHAR col_name[NAME_SIZE + 1]; |
| 3190 | do { |
| 3191 | SQL_resolve_identifier("<column name>", col_name, NAME_SIZE + 1); |
| 3192 | if (gpreGlob.token_global.tok_length >= NAME_SIZE) |
| 3193 | PAR_error("Field name too long"); |
| 3194 | |
| 3195 | STR field_name = (STR) MSC_string(col_name); |
| 3196 | MSC_push((gpre_nod*) field_name, fields); |
| 3197 | fields = &(*fields)->lls_next; |
| 3198 | CPR_token(); |
| 3199 | } while (MSC_match(KW_COMMA)); |
no test coverage detected