Bug#14729221 IN-PLACE ALTER TABLE REPORTS '' INSTEAD OF

REAL DUPLICATE VALUE FOR PREFIX KEYS

innobase_rec_to_mysql(): Invoke dict_index_get_nth_col_or_prefix_pos()
instead of dict_index_get_nth_col_pos() to find the column.
This commit is contained in:
Marko Mäkelä 2012-10-16 14:24:15 +03:00
parent c8cebffdbd
commit b10ab56da5
4 changed files with 42 additions and 7 deletions
storage/innodb_plugin

View file

@ -1,3 +1,9 @@
2012-10-16 The InnoDB Team
* dict/dict0dict.c, handler/handler0alter.cc, include/dict0dict.h:
Fix Bug#14729221 IN-PLACE ALTER TABLE REPORTS '' INSTEAD OF REAL
DUPLICATE VALUE FOR PREFIX KEYS
2012-10-09 The InnoDB Team 2012-10-09 The InnoDB Team
* row/row0mysql.c: * row/row0mysql.c:

View file

@ -1,6 +1,6 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@ -473,10 +473,12 @@ Looks for column n in an index.
ULINT_UNDEFINED if not contained */ ULINT_UNDEFINED if not contained */
UNIV_INTERN UNIV_INTERN
ulint ulint
dict_index_get_nth_col_pos( dict_index_get_nth_col_or_prefix_pos(
/*=======================*/ /*=================================*/
const dict_index_t* index, /*!< in: index */ const dict_index_t* index, /*!< in: index */
ulint n) /*!< in: column number */ ulint n, /*!< in: column number */
ibool inc_prefix) /*!< in: TRUE=consider
column prefixes too */
{ {
const dict_field_t* field; const dict_field_t* field;
const dict_col_t* col; const dict_col_t* col;
@ -498,7 +500,8 @@ dict_index_get_nth_col_pos(
for (pos = 0; pos < n_fields; pos++) { for (pos = 0; pos < n_fields; pos++) {
field = dict_index_get_nth_field(index, pos); field = dict_index_get_nth_field(index, pos);
if (col == field->col && field->prefix_len == 0) { if (col == field->col
&& (inc_prefix || field->prefix_len == 0)) {
return(pos); return(pos);
} }
@ -507,6 +510,20 @@ dict_index_get_nth_col_pos(
return(ULINT_UNDEFINED); return(ULINT_UNDEFINED);
} }
/********************************************************************//**
Looks for column n in an index.
@return position in internal representation of the index;
ULINT_UNDEFINED if not contained */
UNIV_INTERN
ulint
dict_index_get_nth_col_pos(
/*=======================*/
const dict_index_t* index, /*!< in: index */
ulint n) /*!< in: column number */
{
return(dict_index_get_nth_col_or_prefix_pos(index, n, FALSE));
}
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
/********************************************************************//** /********************************************************************//**
Returns TRUE if the index contains a column or a prefix of that column. Returns TRUE if the index contains a column or a prefix of that column.

View file

@ -147,7 +147,7 @@ innobase_rec_to_mysql(
field->reset(); field->reset();
ipos = dict_index_get_nth_col_pos(index, i); ipos = dict_index_get_nth_col_or_prefix_pos(index, i, TRUE);
if (UNIV_UNLIKELY(ipos == ULINT_UNDEFINED)) { if (UNIV_UNLIKELY(ipos == ULINT_UNDEFINED)) {
null_field: null_field:

View file

@ -839,6 +839,18 @@ dict_index_get_nth_col_pos(
const dict_index_t* index, /*!< in: index */ const dict_index_t* index, /*!< in: index */
ulint n); /*!< in: column number */ ulint n); /*!< in: column number */
/********************************************************************//** /********************************************************************//**
Looks for column n in an index.
@return position in internal representation of the index;
ULINT_UNDEFINED if not contained */
UNIV_INTERN
ulint
dict_index_get_nth_col_or_prefix_pos(
/*=================================*/
const dict_index_t* index, /*!< in: index */
ulint n, /*!< in: column number */
ibool inc_prefix); /*!< in: TRUE=consider
column prefixes too */
/********************************************************************//**
Returns TRUE if the index contains a column or a prefix of that column. Returns TRUE if the index contains a column or a prefix of that column.
@return TRUE if contains the column or its prefix */ @return TRUE if contains the column or its prefix */
UNIV_INTERN UNIV_INTERN