mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
merge with 5.3
sql/sql_insert.cc: CREATE ... IF NOT EXISTS may do nothing, but it is still not a failure. don't forget to my_ok it. ****** CREATE ... IF NOT EXISTS may do nothing, but it is still not a failure. don't forget to my_ok it. sql/sql_table.cc: small cleanup ****** small cleanup
This commit is contained in:
commit
76f0b94bb0
1705 changed files with 166479 additions and 39785 deletions
|
|
@ -34,6 +34,7 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
|
|||
MARIA_KEYDEF *keyinfo= &info->s->keyinfo[def->key];
|
||||
uchar *key_buff= info->lastkey_buff2;
|
||||
MARIA_KEY key;
|
||||
int error= 0;
|
||||
DBUG_ENTER("_ma_check_unique");
|
||||
DBUG_PRINT("enter",("unique_hash: %lu", (ulong) unique_hash));
|
||||
|
||||
|
|
@ -44,12 +45,19 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
|
|||
/* The above changed info->lastkey_buff2. Inform maria_rnext_same(). */
|
||||
info->update&= ~HA_STATE_RNEXT_SAME;
|
||||
|
||||
/* Setup that unique key is active key */
|
||||
info->last_key.keyinfo= keyinfo;
|
||||
|
||||
/* any key pointer in data is destroyed */
|
||||
info->lastinx= ~0;
|
||||
|
||||
DBUG_ASSERT(key.data_length == MARIA_UNIQUE_HASH_LENGTH);
|
||||
if (_ma_search(info, &key, SEARCH_FIND, info->s->state.key_root[def->key]))
|
||||
if (_ma_search(info, &key, SEARCH_FIND | SEARCH_SAVE_BUFF,
|
||||
info->s->state.key_root[def->key]))
|
||||
{
|
||||
info->page_changed=1; /* Can't optimize read next */
|
||||
info->cur_row.lastpos= lastpos;
|
||||
DBUG_RETURN(0); /* No matching rows */
|
||||
goto end;
|
||||
}
|
||||
|
||||
for (;;)
|
||||
|
|
@ -63,7 +71,8 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
|
|||
info->page_changed= 1; /* Can't optimize read next */
|
||||
info->cur_row.lastpos= lastpos;
|
||||
DBUG_PRINT("info",("Found duplicate"));
|
||||
DBUG_RETURN(1); /* Found identical */
|
||||
error= 1; /* Found identical */
|
||||
goto end;
|
||||
}
|
||||
DBUG_ASSERT(info->last_key.data_length == MARIA_UNIQUE_HASH_LENGTH);
|
||||
if (_ma_search_next(info, &info->last_key, SEARCH_BIGGER,
|
||||
|
|
@ -72,9 +81,12 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
|
|||
{
|
||||
info->page_changed= 1; /* Can't optimize read next */
|
||||
info->cur_row.lastpos= lastpos;
|
||||
DBUG_RETURN(0); /* end of tree */
|
||||
break; /* end of tree */
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -134,13 +146,14 @@ ha_checksum _ma_unique_hash(MARIA_UNIQUEDEF *def, const uchar *record)
|
|||
keyseg->charset->coll->hash_sort(keyseg->charset,
|
||||
(const uchar*) pos, length, &seed1,
|
||||
&seed2);
|
||||
crc^= seed1;
|
||||
crc+= seed1;
|
||||
}
|
||||
else
|
||||
while (pos != end)
|
||||
crc=((crc << 8) +
|
||||
(((uchar) *pos++))) +
|
||||
(crc >> (8*sizeof(ha_checksum)-8));
|
||||
{
|
||||
my_hash_sort_bin((CHARSET_INFO*) 0, pos, (size_t) (end-pos),
|
||||
&seed1, &seed2);
|
||||
crc+= seed1;
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue