| 2848 | |
| 2849 | |
| 2850 | static |
| 2851 | my_bool key_check_without_overlaps(THD *thd, HA_CREATE_INFO *create_info, |
| 2852 | Alter_info *alter_info, |
| 2853 | Key &key) |
| 2854 | { |
| 2855 | DBUG_ENTER("key_check_without_overlaps"); |
| 2856 | if (!key.without_overlaps) |
| 2857 | DBUG_RETURN(FALSE); |
| 2858 | // append_system_key_parts is already called, so we should check all the |
| 2859 | // columns except the last two. |
| 2860 | const auto &period_start= create_info->period_info.period.start; |
| 2861 | const auto &period_end= create_info->period_info.period.end; |
| 2862 | List_iterator<Key_part_spec> part_it_forwarded(key.columns); |
| 2863 | List_iterator<Key_part_spec> part_it(key.columns); |
| 2864 | part_it_forwarded++; |
| 2865 | part_it_forwarded++; |
| 2866 | while (part_it_forwarded++) |
| 2867 | { |
| 2868 | Key_part_spec *key_part= part_it++; |
| 2869 | |
| 2870 | if (period_start.streq(key_part->field_name) |
| 2871 | || period_end.streq(key_part->field_name)) |
| 2872 | { |
| 2873 | my_error(ER_KEY_CONTAINS_PERIOD_FIELDS, MYF(0), key.name.str, |
| 2874 | key_part->field_name.str); |
| 2875 | DBUG_RETURN(TRUE); |
| 2876 | } |
| 2877 | } |
| 2878 | |
| 2879 | if (key.key_create_info.algorithm == HA_KEY_ALG_HASH || |
| 2880 | key.key_create_info.algorithm == HA_KEY_ALG_LONG_HASH) |
| 2881 | |
| 2882 | { |
| 2883 | my_error(ER_KEY_CANT_HAVE_WITHOUT_OVERLAPS, MYF(0), key.name.str); |
| 2884 | DBUG_RETURN(TRUE); |
| 2885 | } |
| 2886 | for (Key &key2: alter_info->key_list) |
| 2887 | { |
| 2888 | if (key2.type != Key::FOREIGN_KEY) |
| 2889 | continue; |
| 2890 | DBUG_ASSERT(&key != &key2); |
| 2891 | const Foreign_key &fk= (Foreign_key&)key2; |
| 2892 | if (fk.update_opt != FK_OPTION_CASCADE) |
| 2893 | continue; |
| 2894 | for (Key_part_spec& kp: key.columns) |
| 2895 | { |
| 2896 | for (Key_part_spec& kp2: fk.columns) |
| 2897 | { |
| 2898 | if (kp.field_name.streq(kp2.field_name)) |
| 2899 | { |
| 2900 | my_error(ER_KEY_CANT_HAVE_WITHOUT_OVERLAPS, MYF(0), key.name.str); |
| 2901 | DBUG_RETURN(TRUE); |
| 2902 | } |
| 2903 | } |
| 2904 | } |
| 2905 | } |
| 2906 | create_info->period_info.unique_keys++; |
| 2907 |
no test coverage detected