mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
8f521b41ba
Bug#47633 - assert in ha_myisammrg::info during OPTIMIZE The server crashed on an attempt to optimize a MERGE table with non-existent child table. mysql_admin_table() relied on the table to be successfully open if a table object had been allocated. Changed code to check return value of the open function before calling a handler:: function on it. mysql-test/r/merge.result: Backport of revid:ingo.struewing@sun.com-20091223200354-r2uzbdkj2v6yv111 Bug#47633 - assert in ha_myisammrg::info during OPTIMIZE Updated result file. mysql-test/t/merge.test: Backport of revid:ingo.struewing@sun.com-20091223200354-r2uzbdkj2v6yv111 Bug#47633 - assert in ha_myisammrg::info during OPTIMIZE Changed tests to respect changed TEMPORARY MERGE locking (unrelated). Changed tests to respect changed CREATE TABLE ... LIKE (unrelated). Changed tests to respect that no new tables can be created under LOCK TABLE (unrelated). Added test for Bug#47633. Changed error numbers to symbolic names. Added test for child locking for ALTER under LOCK TABLE. Since Bug 36171 is not pushed yet, not the whole patch has been backported. mysys/my_delete.c: Backport of revid:ingo.struewing@sun.com-20091223200354-r2uzbdkj2v6yv111 Bug#47633 - assert in ha_myisammrg::info during OPTIMIZE Fixed error reporting. Fixed indentation. mysys/my_mmap.c: Backport of revid:ingo.struewing@sun.com-20091223200354-r2uzbdkj2v6yv111 Bug#47633 - assert in ha_myisammrg::info during OPTIMIZE Added DBUG. sql/item_func.cc: Backport of revid:ingo.struewing@sun.com-20091223200354-r2uzbdkj2v6yv111 Added Debug Sync point, required by merge_sync.test. sql/sql_table.cc: Backport of revid:ingo.struewing@sun.com-20091223200354-r2uzbdkj2v6yv111 Bug#47633 - assert in ha_myisammrg::info during OPTIMIZE Do not call handler:: functions if the table was not opened successfully. Added Debug Sync point, required by merge_sync.test. storage/myisam/mi_check.c: Backport of revid:ingo.struewing@sun.com-20091223200354-r2uzbdkj2v6yv111 Bug#47633 - assert in ha_myisammrg::info during OPTIMIZE Unmap memory before exchanging data files. Needed on Windows. storage/myisammrg/ha_myisammrg.cc: Backport of revid:ingo.struewing@sun.com-20091223200354-r2uzbdkj2v6yv111 Added Debug Sync point, required by merge_sync.test. merge_sync.test will be introduced by a patch for Bug 36171, which is not pushed yet.
125 lines
3.7 KiB
C
125 lines
3.7 KiB
C
/* Copyright (C) 2000 MySQL AB
|
|
|
|
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 Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#include "mysys_priv.h"
|
|
#include "mysys_err.h"
|
|
#include <my_sys.h>
|
|
|
|
int my_delete(const char *name, myf MyFlags)
|
|
{
|
|
int err;
|
|
DBUG_ENTER("my_delete");
|
|
DBUG_PRINT("my",("name %s MyFlags %d", name, MyFlags));
|
|
|
|
if ((err = unlink(name)) == -1)
|
|
{
|
|
my_errno=errno;
|
|
if (MyFlags & (MY_FAE+MY_WME))
|
|
my_error(EE_DELETE,MYF(ME_BELL+ME_WAITTANG+(MyFlags & ME_NOINPUT)),
|
|
name,errno);
|
|
}
|
|
else if ((MyFlags & MY_SYNC_DIR) &&
|
|
my_sync_dir_by_file(name, MyFlags))
|
|
err= -1;
|
|
DBUG_RETURN(err);
|
|
} /* my_delete */
|
|
|
|
#if defined(__WIN__)
|
|
/**
|
|
Delete file which is possibly not closed.
|
|
|
|
This function is intended to be used exclusively as a temporal solution
|
|
for Win NT in case when it is needed to delete a not closed file (note
|
|
that the file must be opened everywhere with FILE_SHARE_DELETE mode).
|
|
Deleting not-closed files can not be supported on Win 98|ME (and because
|
|
of that is considered harmful).
|
|
|
|
The function deletes the file with its preliminary renaming. This is
|
|
because when not-closed share-delete file is deleted it still lives on
|
|
a disk until it will not be closed everwhere. This may conflict with an
|
|
attempt to create a new file with the same name. The deleted file is
|
|
renamed to <name>.<num>.deleted where <name> - the initial name of the
|
|
file, <num> - a hexadecimal number chosen to make the temporal name to
|
|
be unique.
|
|
|
|
@param the name of the being deleted file
|
|
@param the flags instructing how to react on an error internally in
|
|
the function
|
|
|
|
@note The per-thread @c my_errno holds additional info for a caller to
|
|
decide how critical the error can be.
|
|
|
|
@retval
|
|
0 ok
|
|
@retval
|
|
1 error
|
|
|
|
|
|
*/
|
|
int nt_share_delete(const char *name, myf MyFlags)
|
|
{
|
|
char buf[MAX_PATH + 20];
|
|
ulong cnt;
|
|
DBUG_ENTER("nt_share_delete");
|
|
DBUG_PRINT("my",("name %s MyFlags %d", name, MyFlags));
|
|
|
|
for (cnt= GetTickCount(); cnt; cnt--)
|
|
{
|
|
errno= 0;
|
|
sprintf(buf, "%s.%08X.deleted", name, cnt);
|
|
if (MoveFile(name, buf))
|
|
break;
|
|
|
|
if ((errno= GetLastError()) == ERROR_ALREADY_EXISTS)
|
|
continue;
|
|
|
|
/* This happened during tests with MERGE tables. */
|
|
if (errno == ERROR_ACCESS_DENIED)
|
|
continue;
|
|
|
|
DBUG_PRINT("warning", ("Failed to rename %s to %s, errno: %d",
|
|
name, buf, errno));
|
|
break;
|
|
}
|
|
|
|
if (errno == ERROR_FILE_NOT_FOUND)
|
|
{
|
|
my_errno= ENOENT; // marking, that `name' doesn't exist
|
|
}
|
|
else if (errno == 0)
|
|
{
|
|
if (DeleteFile(buf))
|
|
DBUG_RETURN(0);
|
|
/*
|
|
The below is more complicated than necessary. For some reason, the
|
|
assignment to my_errno clears the error number, which is retrieved
|
|
by GetLastError() (VC2005EE). Assigning to errno first, allows to
|
|
retrieve the correct value.
|
|
*/
|
|
errno= GetLastError();
|
|
if (errno == 0)
|
|
my_errno= ENOENT; // marking, that `buf' doesn't exist
|
|
else
|
|
my_errno= errno;
|
|
}
|
|
else
|
|
my_errno= errno;
|
|
|
|
if (MyFlags & (MY_FAE+MY_WME))
|
|
my_error(EE_DELETE, MYF(ME_BELL + ME_WAITTANG + (MyFlags & ME_NOINPUT)),
|
|
name, my_errno);
|
|
DBUG_RETURN(-1);
|
|
}
|
|
#endif
|