mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 11:01:52 +01:00
Fix for Bug#36573 myisampack --join does not create destination
table .frm file Problem: ======== Myisampack --join did not create the destination table .frm file. The user had to copy one of the source table .frm file as destination .frm file for mysql server to recognize. This is just 'user-friendliness' issue. How it was solved ================= After successful join and compression we copy the frm file from the first source table. Functionality added =================== myisampack --join=/path/t3 /path/t1 /path/t2 creates /path/t3.frm (which is bascially copied from first table's frm /path/t1) Tests ===== Modified myisampack.test to test two scenario's 1. Positive myisampack --join test In this case after the join operation is done,we test if the destination table is accessible from the server 2. Positive myisampack --join test with an existing .frm file. We test the above case with an existing .frm file for the destination table. It should return success even in this case. 3. Positive myisampack --join test with no .frm file for source tables We test the join operation with no .frm files for source tables. It should complete the join operation without any warnings and error messages 4. Negative myisampack --join test We test myisampack --join with existing .MYI,.MDI,.frm files for the destination table. It should fail with exit status 2 in this case.
This commit is contained in:
parent
412c6c4bd7
commit
6002c1adeb
3 changed files with 189 additions and 2 deletions
|
@ -1,3 +1,4 @@
|
|||
DROP TABLE IF EXISTS t1,t2,t3;
|
||||
CREATE TABLE t1(c1 DOUBLE, c2 DOUBLE, c3 DOUBLE, c4 DOUBLE, c5 DOUBLE,
|
||||
c6 DOUBLE, c7 DOUBLE, c8 DOUBLE, c9 DOUBLE, a INT PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES
|
||||
|
@ -85,5 +86,34 @@ FLUSH TABLE mysql_db1.t1;
|
|||
SELECT COUNT(*) FROM mysql_db1.t1 WHERE c2 < 5;
|
||||
COUNT(*)
|
||||
128
|
||||
# ===== myisampack.1 =====
|
||||
CREATE TABLE t1(a INT);
|
||||
INSERT INTO t1 VALUES(20);
|
||||
CREATE TABLE t2(a INT);
|
||||
INSERT INTO t2 VALUES(40);
|
||||
#If the myisampack --join operation is successful, we have table t3(.frm)
|
||||
#so we should be able to query about the table from server.
|
||||
SELECT COUNT(a) FROM t3;
|
||||
COUNT(a)
|
||||
1024
|
||||
# ===== myisampack.2 =====
|
||||
#Tests the myisampack join operation with an existing destination .frm file,
|
||||
#the command should return correct exit status(0) and
|
||||
#we should be able to query the table.
|
||||
SELECT COUNT(a) FROM t3;
|
||||
COUNT(a)
|
||||
1024
|
||||
# ===== myisampack.3 =====
|
||||
DROP TABLE t3;
|
||||
#Tests the myisampack join operation without frm file for the first and second table
|
||||
#No frm file is generated in this and we shouldn't be able to access the newly
|
||||
#created table
|
||||
SELECT COUNT(a) FROM t3;
|
||||
ERROR 42S02: Table 'test.t3' doesn't exist
|
||||
# ===== myisampack.4 =====
|
||||
#Tests the myisampack join operation with an existing destination .frm,.MYI,.MDI
|
||||
#the command should fail with exit status 2
|
||||
/data/z/mysql-next-mr-runtime/mysql-test/var/mysqld.1/data//master-data/test/t1 gave error 2 on open
|
||||
DROP TABLE t1,t2,t3;
|
||||
DROP TABLE mysql_db1.t1;
|
||||
DROP DATABASE mysql_db1;
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
-- disable_warnings
|
||||
DROP TABLE IF EXISTS t1,t2,t3;
|
||||
-- enable_warnings
|
||||
#
|
||||
# BUG#31277 - myisamchk --unpack corrupts a table
|
||||
#
|
||||
|
@ -105,5 +108,114 @@ let $MYSQLD_DATADIR= `select @@datadir`;
|
|||
--exec $MYISAMCHK -srq $MYSQLD_DATADIR/mysql_db1/t1
|
||||
SELECT COUNT(*) FROM mysql_db1.t1 WHERE c2 < 5;
|
||||
#
|
||||
# Bug#36573 myisampack --join does not create destination table .frm file
|
||||
#
|
||||
#############################################################################
|
||||
# Testcase myisampack.1: Positive test for myisampack --join
|
||||
# To test myisampack --join operation creates .frm file
|
||||
# If it creates .frm file, we will be able to access from mysql
|
||||
# server
|
||||
#############################################################################
|
||||
--echo # ===== myisampack.1 =====
|
||||
CREATE TABLE t1(a INT);
|
||||
INSERT INTO t1 VALUES(20);
|
||||
|
||||
let $i=9;
|
||||
--disable_query_log
|
||||
while ($i)
|
||||
{
|
||||
INSERT INTO t1 SELECT ROUND(a * RAND() * 10) from t1;
|
||||
dec $i;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
CREATE TABLE t2(a INT);
|
||||
INSERT INTO t2 VALUES(40);
|
||||
|
||||
let $i=9;
|
||||
--disable_query_log
|
||||
while ($i)
|
||||
{
|
||||
INSERT INTO t2 SELECT ROUND(a * RAND() * 10) from t2;
|
||||
dec $i;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
--exec $MYISAMPACK --join=$MYSQLD_DATADIR/test/t3 $MYSQLD_DATADIR/test/t1 $MYSQLD_DATADIR/test/t2 2>&1
|
||||
|
||||
--echo #If the myisampack --join operation is successful, we have table t3(.frm)
|
||||
--echo #so we should be able to query about the table from server.
|
||||
SELECT COUNT(a) FROM t3;
|
||||
|
||||
#############################################################################
|
||||
# Testcase myisampack.2: 2nd Positive test for myisampack --join
|
||||
# Test myisampack join operation with an existing destination frm file.
|
||||
# It should finish the join operation successfully
|
||||
#############################################################################
|
||||
--echo # ===== myisampack.2 =====
|
||||
--remove_file $MYSQLD_DATADIR/test/t3.MYI
|
||||
--remove_file $MYSQLD_DATADIR/test/t3.MYD
|
||||
--exec $MYISAMPACK --join=$MYSQLD_DATADIR/test/t3 $MYSQLD_DATADIR/test/t1 $MYSQLD_DATADIR/test/t2 2>&1
|
||||
--echo #Tests the myisampack join operation with an existing destination .frm file,
|
||||
--echo #the command should return correct exit status(0) and
|
||||
--echo #we should be able to query the table.
|
||||
|
||||
SELECT COUNT(a) FROM t3;
|
||||
|
||||
#############################################################################
|
||||
# Testcase myisampack.3: 3rd Positive test for myisampack --join
|
||||
# Test myisampack join operation without frm file for first table and second
|
||||
# table. It should finish the join operation successfully
|
||||
#############################################################################
|
||||
--echo # ===== myisampack.3 =====
|
||||
--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLTEST_VARDIR/tmp/bug36573.t1.frm
|
||||
--copy_file $MYSQLD_DATADIR/test/t2.frm $MYSQLTEST_VARDIR/tmp/bug36573.t2.frm
|
||||
--remove_file $MYSQLD_DATADIR/test/t1.frm
|
||||
--remove_file $MYSQLD_DATADIR/test/t2.frm
|
||||
|
||||
DROP TABLE t3;
|
||||
--exec $MYISAMPACK --join=$MYSQLD_DATADIR/test/t3 $MYSQLD_DATADIR/test/t1 $MYSQLD_DATADIR/test/t2 2>&1
|
||||
--echo #Tests the myisampack join operation without frm file for the first and second table
|
||||
--echo #No frm file is generated in this and we shouldn't be able to access the newly
|
||||
--echo #created table
|
||||
|
||||
--error ER_NO_SUCH_TABLE
|
||||
SELECT COUNT(a) FROM t3;
|
||||
|
||||
--copy_file $MYSQLTEST_VARDIR/tmp/bug36573.t1.frm $MYSQLD_DATADIR/test/t1.frm
|
||||
--copy_file $MYSQLTEST_VARDIR/tmp/bug36573.t2.frm $MYSQLD_DATADIR/test/t2.frm
|
||||
--copy_file $MYSQLTEST_VARDIR/tmp/bug36573.t1.frm $MYSQLD_DATADIR/test/t3.frm
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/bug36573.t1.frm
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/bug36573.t2.frm
|
||||
|
||||
#############################################################################
|
||||
# Testcase myisampack.4: Negative test for myisampack --join
|
||||
# Test myisampack join operation with an existing .MYI,.MDI,.frm files
|
||||
# the test should fail
|
||||
#############################################################################
|
||||
--echo # ===== myisampack.4 =====
|
||||
--echo #Tests the myisampack join operation with an existing destination .frm,.MYI,.MDI
|
||||
--echo #the command should fail with exit status 2
|
||||
#
|
||||
# Note: Use of regular expressions in this file is for output printed in result file
|
||||
# The main purpose of this regular expression is to supress the filenames for
|
||||
# error messages produced so that we can create a generic result file
|
||||
#
|
||||
#1. /.*myisampack(\.exe)?: Can't create\/write to file .*\(/myisampack: Can't create\/write to file (/
|
||||
# Replace everything before "myisampack" or "myisampack.exe" and followed by
|
||||
# ": Can't create\/write to file " until the first open paranthesis , with
|
||||
# "myisampack: Can't create\/write to file ("
|
||||
#
|
||||
#2. /Aborted: .*is/Aborted: file is/
|
||||
# Replace everything after starting with "Aborted: " until ending with "is" with
|
||||
# "Aborted: file is/
|
||||
#
|
||||
--replace_regex /.*myisampack(\.exe)?: Can't create\/write to file .*\(/myisampack: Can't create\/write to file (/ /Aborted: .*is/Aborted: file is/
|
||||
--error 2
|
||||
--exec $MYISAMPACK --join=$MYSQLD_DATADIR/test/t3 $MYSQLD_DATADIR/master-data/test/t1 $MYSQLD_DATADIR/test/t2 2>&1
|
||||
|
||||
DROP TABLE t1,t2,t3;
|
||||
|
||||
DROP TABLE mysql_db1.t1;
|
||||
DROP DATABASE mysql_db1;
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
|
||||
#define DATA_TMP_EXT ".TMD"
|
||||
#define OLD_EXT ".OLD"
|
||||
#define FRM_EXT ".frm"
|
||||
#define WRITE_COUNT MY_HOW_OFTEN_TO_WRITE
|
||||
|
||||
struct st_file_buffer {
|
||||
|
@ -125,6 +126,7 @@ static void get_options(int *argc,char ***argv);
|
|||
static MI_INFO *open_isam_file(char *name,int mode);
|
||||
static my_bool open_isam_files(PACK_MRG_INFO *mrg,char **names,uint count);
|
||||
static int compress(PACK_MRG_INFO *file,char *join_name);
|
||||
static int create_dest_frm(char *source_table, char *dest_table);
|
||||
static HUFF_COUNTS *init_huff_count(MI_INFO *info,my_off_t records);
|
||||
static void free_counts_and_tree_and_queue(HUFF_TREE *huff_trees,
|
||||
uint trees,
|
||||
|
@ -214,9 +216,13 @@ int main(int argc, char **argv)
|
|||
|
||||
error=ok=isamchk_neaded=0;
|
||||
if (join_table)
|
||||
{ /* Join files into one */
|
||||
{
|
||||
/*
|
||||
Join files into one and create FRM file for the compressed table only if
|
||||
the compression succeeds
|
||||
*/
|
||||
if (open_isam_files(&merge,argv,(uint) argc) ||
|
||||
compress(&merge,join_table))
|
||||
compress(&merge, join_table) || create_dest_frm(argv[0], join_table))
|
||||
error=1;
|
||||
}
|
||||
else while (argc--)
|
||||
|
@ -757,6 +763,45 @@ static int compress(PACK_MRG_INFO *mrg,char *result_table)
|
|||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Create FRM for the destination table for --join operation
|
||||
Copy the first table FRM as the destination table FRM file. Doing so
|
||||
will help the mysql server to recognize the newly created table.
|
||||
See Bug#36573.
|
||||
|
||||
@param source_table Name of the source table
|
||||
@param dest_table Name of the destination table
|
||||
@retval 0 Successful copy operation
|
||||
|
||||
@note We always return 0 because we don't want myisampack to report error
|
||||
even if the copy operation fails.
|
||||
*/
|
||||
|
||||
static int create_dest_frm(char *source_table, char *dest_table)
|
||||
{
|
||||
char source_name[FN_REFLEN], dest_name[FN_REFLEN];
|
||||
int error;
|
||||
|
||||
DBUG_ENTER("create_dest_frm");
|
||||
|
||||
(void) fn_format(source_name, source_table,
|
||||
"", FRM_EXT, MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS);
|
||||
(void) fn_format(dest_name, dest_table,
|
||||
"", FRM_EXT, MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS);
|
||||
/*
|
||||
Error messages produced by my_copy() are suppressed as this
|
||||
is not vital for --join operation. User shouldn't see any error messages
|
||||
like "source file frm not found" and "unable to create destination frm
|
||||
file. So we don't pass the flag MY_WME -Write Message on Error to
|
||||
my_copy()
|
||||
*/
|
||||
(void) my_copy(source_name, dest_name, MYF(MY_DONT_OVERWRITE_FILE));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Init a huff_count-struct for each field and init it */
|
||||
|
||||
static HUFF_COUNTS *init_huff_count(MI_INFO *info,my_off_t records)
|
||||
|
|
Loading…
Add table
Reference in a new issue