mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
merging with mysql-next-mr-svoj
This commit is contained in:
@ -127,6 +127,29 @@
|
|||||||
*/
|
*/
|
||||||
#define HA_BINLOG_ROW_CAPABLE (LL(1) << 34)
|
#define HA_BINLOG_ROW_CAPABLE (LL(1) << 34)
|
||||||
#define HA_BINLOG_STMT_CAPABLE (LL(1) << 35)
|
#define HA_BINLOG_STMT_CAPABLE (LL(1) << 35)
|
||||||
|
/*
|
||||||
|
When a multiple key conflict happens in a REPLACE command mysql
|
||||||
|
expects the conflicts to be reported in the ascending order of
|
||||||
|
key names.
|
||||||
|
|
||||||
|
For e.g.
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, UNIQUE (a), b INT NOT NULL, UNIQUE (b), c INT NOT
|
||||||
|
NULL, INDEX(c));
|
||||||
|
|
||||||
|
REPLACE INTO t1 VALUES (1,1,1),(2,2,2),(2,1,3);
|
||||||
|
|
||||||
|
MySQL expects the conflict with 'a' to be reported before the conflict with
|
||||||
|
'b'.
|
||||||
|
|
||||||
|
If the underlying storage engine does not report the conflicting keys in
|
||||||
|
ascending order, it causes unexpected errors when the REPLACE command is
|
||||||
|
executed.
|
||||||
|
|
||||||
|
This flag helps the underlying SE to inform the server that the keys are not
|
||||||
|
ordered.
|
||||||
|
*/
|
||||||
|
#define HA_DUPLICATE_KEY_NOT_IN_ORDER (LL(1) << 36)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set of all binlog flags. Currently only contain the capabilities
|
Set of all binlog flags. Currently only contain the capabilities
|
||||||
|
@ -1322,6 +1322,23 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
|
|||||||
|
|
||||||
static int last_uniq_key(TABLE *table,uint keynr)
|
static int last_uniq_key(TABLE *table,uint keynr)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
When an underlying storage engine informs that the unique key
|
||||||
|
conflicts are not reported in the ascending order by setting
|
||||||
|
the HA_DUPLICATE_KEY_NOT_IN_ORDER flag, we cannot rely on this
|
||||||
|
information to determine the last key conflict.
|
||||||
|
|
||||||
|
The information about the last key conflict will be used to
|
||||||
|
do a replace of the new row on the conflicting row, rather
|
||||||
|
than doing a delete (of old row) + insert (of new row).
|
||||||
|
|
||||||
|
Hence check for this flag and disable replacing the last row
|
||||||
|
by returning 0 always. Returning 0 will result in doing
|
||||||
|
a delete + insert always.
|
||||||
|
*/
|
||||||
|
if (table->file->ha_table_flags() & HA_DUPLICATE_KEY_NOT_IN_ORDER)
|
||||||
|
return 0;
|
||||||
|
|
||||||
while (++keynr < table->s->keys)
|
while (++keynr < table->s->keys)
|
||||||
if (table->key_info[keynr].flags & HA_NOSAME)
|
if (table->key_info[keynr].flags & HA_NOSAME)
|
||||||
return 0;
|
return 0;
|
||||||
|
Reference in New Issue
Block a user