diff options
author | Alexander Nozdrin <alik@ibmvm> | 2009-12-08 09:55:52 +0300 |
---|---|---|
committer | Alexander Nozdrin <alik@ibmvm> | 2009-12-08 09:55:52 +0300 |
commit | 6fd3866c6c104f8bc991d71583e627ae6fabe0ab (patch) | |
tree | 9e087da0ea351f94c35f6996a5e0c4c468d2333a | |
parent | 04fe40393d9d0ef81cc6a770bda67ab67fe4154e (diff) | |
parent | a8e80f3146779c9783aa6d29d5f8ffef7a4a9f69 (diff) | |
download | mariadb-git-6fd3866c6c104f8bc991d71583e627ae6fabe0ab.tar.gz |
Auto-merge from mysql-next-mr.
-rw-r--r-- | mysql-test/r/archive.result | 10 | ||||
-rw-r--r-- | mysql-test/r/myisampack.result | 33 | ||||
-rw-r--r-- | mysql-test/r/partition.result | 19 | ||||
-rw-r--r-- | mysql-test/t/archive.test | 12 | ||||
-rw-r--r-- | mysql-test/t/myisampack.test | 114 | ||||
-rw-r--r-- | mysql-test/t/partition.test | 39 | ||||
-rw-r--r-- | sql/sql_table.cc | 44 | ||||
-rw-r--r-- | storage/archive/ha_archive.cc | 4 | ||||
-rw-r--r-- | storage/myisam/myisampack.c | 48 |
9 files changed, 275 insertions, 48 deletions
diff --git a/mysql-test/r/archive.result b/mysql-test/r/archive.result index e865d775c6a..a250821d12b 100644 --- a/mysql-test/r/archive.result +++ b/mysql-test/r/archive.result @@ -12717,3 +12717,13 @@ COUNT(t1.a) 729 DROP TABLE t1; SET @@join_buffer_size= @save_join_buffer_size; +End of 5.1 tests +CREATE TABLE t1(id INT NOT NULL AUTO_INCREMENT, name VARCHAR(128) NOT NULL, PRIMARY KEY(id)) ENGINE=archive; +INSERT INTO t1 VALUES(NULL,'a'),(NULL,'a'); +CREATE TABLE t2(id INT NOT NULL AUTO_INCREMENT, name VARCHAR(128) NOT NULL, PRIMARY KEY(id)) ENGINE=archive; +INSERT INTO t2 VALUES(NULL,'b'),(NULL,'b'); +SELECT t1.id, t2.id, t1.name, t2.name FROM t1,t2 WHERE t1.id = t2.id; +id id name name +1 1 a b +2 2 a b +DROP TABLE t1,t2; diff --git a/mysql-test/r/myisampack.result b/mysql-test/r/myisampack.result index fbcd8aed17a..dd14c31f32e 100644 --- a/mysql-test/r/myisampack.result +++ b/mysql-test/r/myisampack.result @@ -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,37 @@ 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); +FLUSH TABLE t1,t2; +#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 ===== +FLUSH TABLE t3; +#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 +myisampack: Can't create/write to file (Errcode: 17) +Aborted: file is not compressed +DROP TABLE t1,t2,t3; DROP TABLE mysql_db1.t1; DROP DATABASE mysql_db1; diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index 065e46dbf92..543a70f9a2a 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -2048,23 +2048,4 @@ CREATE TABLE t1(id INT,KEY(id)) ENGINE=MYISAM PARTITION BY HASH(id) PARTITIONS 2; DROP TABLE t1; SET SESSION SQL_MODE=DEFAULT; -# -# BUG#45816 - assertion failure with index containing double -# column on partitioned table -# -CREATE TABLE t1 ( -a INT DEFAULT NULL, -b DOUBLE DEFAULT NULL, -c INT DEFAULT NULL, -KEY idx2(b,a) -) PARTITION BY HASH(c) PARTITIONS 3; -INSERT INTO t1 VALUES (6,8,9); -INSERT INTO t1 VALUES (6,8,10); -SELECT 1 FROM t1 JOIN t1 AS t2 USING (a) FOR UPDATE; -1 -1 -1 -1 -1 -DROP TABLE t1; End of 5.1 tests diff --git a/mysql-test/t/archive.test b/mysql-test/t/archive.test index aad3d19455d..a27efcf9583 100644 --- a/mysql-test/t/archive.test +++ b/mysql-test/t/archive.test @@ -1623,3 +1623,15 @@ INSERT INTO t1 VALUES('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), SELECT COUNT(t1.a) FROM t1, t1 a, t1 b, t1 c, t1 d, t1 e; DROP TABLE t1; SET @@join_buffer_size= @save_join_buffer_size; + +--echo End of 5.1 tests + +# +# BUG#40677 - Archive tables joined on primary return no result +# +CREATE TABLE t1(id INT NOT NULL AUTO_INCREMENT, name VARCHAR(128) NOT NULL, PRIMARY KEY(id)) ENGINE=archive; +INSERT INTO t1 VALUES(NULL,'a'),(NULL,'a'); +CREATE TABLE t2(id INT NOT NULL AUTO_INCREMENT, name VARCHAR(128) NOT NULL, PRIMARY KEY(id)) ENGINE=archive; +INSERT INTO t2 VALUES(NULL,'b'),(NULL,'b'); +SELECT t1.id, t2.id, t1.name, t2.name FROM t1,t2 WHERE t1.id = t2.id; +DROP TABLE t1,t2; diff --git a/mysql-test/t/myisampack.test b/mysql-test/t/myisampack.test index 9d27ed53254..463aa559de2 100644 --- a/mysql-test/t/myisampack.test +++ b/mysql-test/t/myisampack.test @@ -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,116 @@ 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 a 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 a from t2; + dec $i; +} +--enable_query_log + +FLUSH TABLE t1,t2; +--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 ===== +FLUSH TABLE t3; +--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/test/t1 $MYSQLD_DATADIR/test/t2 2>&1 + +DROP TABLE t1,t2,t3; + DROP TABLE mysql_db1.t1; DROP DATABASE mysql_db1; + diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index 459acc9f1f5..8ab91f23522 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -2039,23 +2039,24 @@ CREATE TABLE t1(id INT,KEY(id)) ENGINE=MYISAM DROP TABLE t1; SET SESSION SQL_MODE=DEFAULT; - ---echo # ---echo # BUG#45816 - assertion failure with index containing double ---echo # column on partitioned table ---echo # - -CREATE TABLE t1 ( - a INT DEFAULT NULL, - b DOUBLE DEFAULT NULL, - c INT DEFAULT NULL, - KEY idx2(b,a) -) PARTITION BY HASH(c) PARTITIONS 3; - -INSERT INTO t1 VALUES (6,8,9); -INSERT INTO t1 VALUES (6,8,10); - -SELECT 1 FROM t1 JOIN t1 AS t2 USING (a) FOR UPDATE; - -DROP TABLE t1; +# This testcase is commented due to the Bug #46853 +# Should be uncommented after fixing Bug #46853 +#--echo # +#--echo # BUG#45816 - assertion failure with index containing double +#--echo # column on partitioned table +#--echo # +# +#CREATE TABLE t1 ( +# a INT DEFAULT NULL, +# b DOUBLE DEFAULT NULL, +# c INT DEFAULT NULL, +# KEY idx2(b,a) +#) PARTITION BY HASH(c) PARTITIONS 3; +# +#INSERT INTO t1 VALUES (6,8,9); +#INSERT INTO t1 VALUES (6,8,10); +# +#SELECT 1 FROM t1 JOIN t1 AS t2 USING (a) FOR UPDATE; +# +#DROP TABLE t1; --echo End of 5.1 tests diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 30ffa3703c2..e594499b4d8 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3934,15 +3934,43 @@ bool mysql_create_table_no_lock(THD *thd, create_info->table_existed= 0; // Mark that table is created #ifdef HAVE_READLINK - if (test_if_data_home_dir(create_info->data_file_name)) { - my_error(ER_WRONG_ARGUMENTS, MYF(0), "DATA DIRECTORY"); - goto unlock_and_end; - } - if (test_if_data_home_dir(create_info->index_file_name)) - { - my_error(ER_WRONG_ARGUMENTS, MYF(0), "INDEX DIRECTORY"); - goto unlock_and_end; + size_t dirlen; + char dirpath[FN_REFLEN]; + + /* + data_file_name and index_file_name include the table name without + extension. Mostly this does not refer to an existing file. When + comparing data_file_name or index_file_name against the data + directory, we try to resolve all symbolic links. On some systems, + we use realpath(3) for the resolution. This returns ENOENT if the + resolved path does not refer to an existing file. my_realpath() + does then copy the requested path verbatim, without symlink + resolution. Thereafter the comparison can fail even if the + requested path is within the data directory. E.g. if symlinks to + another file system are used. To make realpath(3) return the + resolved path, we strip the table name and compare the directory + path only. If the directory doesn't exist either, table creation + will fail anyway. + */ + if (create_info->data_file_name) + { + dirname_part(dirpath, create_info->data_file_name, &dirlen); + if (test_if_data_home_dir(dirpath)) + { + my_error(ER_WRONG_ARGUMENTS, MYF(0), "DATA DIRECTORY"); + goto unlock_and_end; + } + } + if (create_info->index_file_name) + { + dirname_part(dirpath, create_info->index_file_name, &dirlen); + if (test_if_data_home_dir(dirpath)) + { + my_error(ER_WRONG_ARGUMENTS, MYF(0), "INDEX DIRECTORY"); + goto unlock_and_end; + } + } } #ifdef WITH_PARTITION_STORAGE_ENGINE diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc index 23fe034d9ed..2ff4a5daff5 100644 --- a/storage/archive/ha_archive.cc +++ b/storage/archive/ha_archive.cc @@ -981,7 +981,11 @@ int ha_archive::index_read_idx(uchar *buf, uint index, const uchar *key, } if (found) + { + /* notify handler that a record has been found */ + table->status= 0; DBUG_RETURN(0); + } error: DBUG_RETURN(rc ? rc : HA_ERR_END_OF_FILE); diff --git a/storage/myisam/myisampack.c b/storage/myisam/myisampack.c index 8adfcfd6fb2..fec6d32133e 100644 --- a/storage/myisam/myisampack.c +++ b/storage/myisam/myisampack.c @@ -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,44 @@ 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]; + + 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) |