← Back to team overview

maria-developers team mailing list archive

Re: ce91482: MDEV-17599 ALTER TABLE DROP CONSTRAINT does not work for foreign keys.

 

Hi, Alexey!

Looks good, one comment below
Ok to push

On Feb 04, Alexey Botchkov wrote:
> revision-id: ce91482df1af6935f81a2142d0ee9391feab2454 (mariadb-10.2.21-45-gce91482)
> parent(s): 97930df13c0e403940969ebb47398760b59f753c
> committer: Alexey Botchkov
> timestamp: 2019-02-04 12:57:57 +0400
> message:
> 
> MDEV-17599 ALTER TABLE DROP CONSTRAINT does not work for foreign keys.
> 
> The list of table constraints doesn't include foreign keys and uniques.
> So we replace DROP CONSTRAINT with DROP [FOREIGN] KEY in this case.
> 
> diff --git a/sql/sql_table.cc b/sql/sql_table.cc
> index 1b426f8..bd6ab9e 100644
> --- a/sql/sql_table.cc
> +++ b/sql/sql_table.cc
> @@ -8993,6 +8993,64 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
>  
>    THD_STAGE_INFO(thd, stage_setup);
>  
> +
> +  if (alter_info->flags & Alter_info::ALTER_DROP_CHECK_CONSTRAINT)
> +  {
> +    /*
> +      ALTER TABLE DROP CONSTRAINT
> +      should be replaced with ... DROP FOREIGN KEY
> +      if the constraint is the FOREIGN KEY one.
> +    */
> +
> +    List_iterator<Alter_drop> drop_it(alter_info->drop_list);
> +    Alter_drop *drop;
> +    alter_info->flags&= ~Alter_info::ALTER_DROP_CHECK_CONSTRAINT;
> +
> +    while ((drop= drop_it++))
> +    {
> +      if (drop->type == Alter_drop::CHECK_CONSTRAINT)
> +      {
> +        {
> +          /* Test if there is a FOREIGN KEY with this name. */
> +          List <FOREIGN_KEY_INFO> fk_child_key_list;
> +          FOREIGN_KEY_INFO *f_key;
> +          table->file->get_foreign_key_list(thd, &fk_child_key_list);

move this out of the loop, perhaps?

> +          List_iterator<FOREIGN_KEY_INFO> fk_key_it(fk_child_key_list);
> +
> +          while ((f_key= fk_key_it++))
> +          {
> +            if (my_strcasecmp(system_charset_info, f_key->foreign_id->str,
> +                  drop->name) == 0)
> +            {
> +              drop->type= Alter_drop::FOREIGN_KEY;
> +              alter_info->flags|= Alter_info::DROP_FOREIGN_KEY;
> +              goto do_continue;
> +            }
> +          }
> +        }
> +
> +        {
> +          /* Test if there is an UNIQUE with this name. */
> +          uint n_key;
> +
> +          for (n_key=0; n_key < table->s->keys; n_key++)
> +          {
> +            if ((table->key_info[n_key].flags & HA_NOSAME) &&
> +                my_strcasecmp(system_charset_info,
> +                  drop->name, table->key_info[n_key].name) == 0)
> +            {
> +              drop->type= Alter_drop::KEY;
> +              alter_info->flags|= Alter_info::ALTER_DROP_INDEX;
> +              goto do_continue;
> +            }
> +          }
> +        }
> +      }
> +      alter_info->flags|= Alter_info::ALTER_DROP_CHECK_CONSTRAINT;
> +do_continue:;
> +    }
> +  }
> +
>    handle_if_exists_options(thd, table, alter_info);
>  
>    /*
> diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
> index b2b9cb4..cc6670b 100644
> --- a/sql/sql_yacc.yy
> +++ b/sql/sql_yacc.yy
> @@ -1741,7 +1741,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
>          IDENT_sys TEXT_STRING_sys TEXT_STRING_literal
>          NCHAR_STRING opt_component key_cache_name
>          sp_opt_label BIN_NUM label_ident TEXT_STRING_filesystem ident_or_empty
> -        opt_constraint constraint opt_ident ident_table_alias
> +        opt_constraint opt_constraint_no_id constraint opt_ident ident_table_alias
>  
>  %type <lex_str_ptr>
>          opt_table_alias
> @@ -6123,6 +6123,11 @@ check_constraint:
>            }
>          ;
>  
> +opt_constraint_no_id:
> +          /* Empty */  {}
> +        | CONSTRAINT   {}
> +        ;
> +
>  opt_constraint:
>            /* empty */ { $$= null_lex_str; }
>          | constraint { $$= $1; }
> @@ -7653,7 +7658,7 @@ alter_list_item:
>              lex->alter_info.drop_list.push_back(ad, thd->mem_root);
>              lex->alter_info.flags|= Alter_info::DROP_FOREIGN_KEY;
>            }
> -        | DROP PRIMARY_SYM KEY_SYM
> +        | DROP opt_constraint_no_id PRIMARY_SYM KEY_SYM
>            {
>              LEX *lex=Lex;
>              Alter_drop *ad= (new (thd->mem_root)
> _______________________________________________
> commits mailing list
> commits@xxxxxxxxxxx
> https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits
Regards,
Sergei
Chief Architect MariaDB
and security@xxxxxxxxxxx