Commit fd433cfb authored by Alexander Nozdrin's avatar Alexander Nozdrin

Auto-merge from mysql-next-mr.

parents 57fd1178 17fa6edf
...@@ -12717,3 +12717,13 @@ COUNT(t1.a) ...@@ -12717,3 +12717,13 @@ COUNT(t1.a)
729 729
DROP TABLE t1; DROP TABLE t1;
SET @@join_buffer_size= @save_join_buffer_size; 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;
DROP TABLE IF EXISTS t1,t2,t3;
CREATE TABLE t1(c1 DOUBLE, c2 DOUBLE, c3 DOUBLE, c4 DOUBLE, c5 DOUBLE, 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); c6 DOUBLE, c7 DOUBLE, c8 DOUBLE, c9 DOUBLE, a INT PRIMARY KEY);
INSERT INTO t1 VALUES INSERT INTO t1 VALUES
...@@ -85,5 +86,37 @@ FLUSH TABLE mysql_db1.t1; ...@@ -85,5 +86,37 @@ FLUSH TABLE mysql_db1.t1;
SELECT COUNT(*) FROM mysql_db1.t1 WHERE c2 < 5; SELECT COUNT(*) FROM mysql_db1.t1 WHERE c2 < 5;
COUNT(*) COUNT(*)
128 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 TABLE mysql_db1.t1;
DROP DATABASE mysql_db1; DROP DATABASE mysql_db1;
...@@ -2048,23 +2048,4 @@ CREATE TABLE t1(id INT,KEY(id)) ENGINE=MYISAM ...@@ -2048,23 +2048,4 @@ CREATE TABLE t1(id INT,KEY(id)) ENGINE=MYISAM
PARTITION BY HASH(id) PARTITIONS 2; PARTITION BY HASH(id) PARTITIONS 2;
DROP TABLE t1; DROP TABLE t1;
SET SESSION SQL_MODE=DEFAULT; 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 End of 5.1 tests
...@@ -1623,3 +1623,15 @@ INSERT INTO t1 VALUES('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), ...@@ -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; SELECT COUNT(t1.a) FROM t1, t1 a, t1 b, t1 c, t1 d, t1 e;
DROP TABLE t1; DROP TABLE t1;
SET @@join_buffer_size= @save_join_buffer_size; 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;
-- disable_warnings
DROP TABLE IF EXISTS t1,t2,t3;
-- enable_warnings
# #
# BUG#31277 - myisamchk --unpack corrupts a table # BUG#31277 - myisamchk --unpack corrupts a table
# #
...@@ -105,5 +108,116 @@ let $MYSQLD_DATADIR= `select @@datadir`; ...@@ -105,5 +108,116 @@ let $MYSQLD_DATADIR= `select @@datadir`;
--exec $MYISAMCHK -srq $MYSQLD_DATADIR/mysql_db1/t1 --exec $MYISAMCHK -srq $MYSQLD_DATADIR/mysql_db1/t1
SELECT COUNT(*) FROM mysql_db1.t1 WHERE c2 < 5; 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 TABLE mysql_db1.t1;
DROP DATABASE mysql_db1; DROP DATABASE mysql_db1;
...@@ -2039,23 +2039,24 @@ CREATE TABLE t1(id INT,KEY(id)) ENGINE=MYISAM ...@@ -2039,23 +2039,24 @@ CREATE TABLE t1(id INT,KEY(id)) ENGINE=MYISAM
DROP TABLE t1; DROP TABLE t1;
SET SESSION SQL_MODE=DEFAULT; SET SESSION SQL_MODE=DEFAULT;
# This testcase is commented due to the Bug #46853
--echo # # Should be uncommented after fixing Bug #46853
--echo # BUG#45816 - assertion failure with index containing double #--echo #
--echo # column on partitioned table #--echo # BUG#45816 - assertion failure with index containing double
--echo # #--echo # column on partitioned table
#--echo #
CREATE TABLE t1 ( #
a INT DEFAULT NULL, #CREATE TABLE t1 (
b DOUBLE DEFAULT NULL, # a INT DEFAULT NULL,
c INT DEFAULT NULL, # b DOUBLE DEFAULT NULL,
KEY idx2(b,a) # c INT DEFAULT NULL,
) PARTITION BY HASH(c) PARTITIONS 3; # KEY idx2(b,a)
#) PARTITION BY HASH(c) PARTITIONS 3;
INSERT INTO t1 VALUES (6,8,9); #
INSERT INTO t1 VALUES (6,8,10); #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; #
#SELECT 1 FROM t1 JOIN t1 AS t2 USING (a) FOR UPDATE;
DROP TABLE t1; #
#DROP TABLE t1;
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -3934,15 +3934,43 @@ bool mysql_create_table_no_lock(THD *thd, ...@@ -3934,15 +3934,43 @@ bool mysql_create_table_no_lock(THD *thd,
create_info->table_existed= 0; // Mark that table is created create_info->table_existed= 0; // Mark that table is created
#ifdef HAVE_READLINK #ifdef HAVE_READLINK
if (test_if_data_home_dir(create_info->data_file_name))
{ {
my_error(ER_WRONG_ARGUMENTS, MYF(0), "DATA DIRECTORY"); size_t dirlen;
goto unlock_and_end; char dirpath[FN_REFLEN];
}
if (test_if_data_home_dir(create_info->index_file_name)) /*
{ data_file_name and index_file_name include the table name without
my_error(ER_WRONG_ARGUMENTS, MYF(0), "INDEX DIRECTORY"); extension. Mostly this does not refer to an existing file. When
goto unlock_and_end; 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 #ifdef WITH_PARTITION_STORAGE_ENGINE
......
...@@ -981,7 +981,11 @@ int ha_archive::index_read_idx(uchar *buf, uint index, const uchar *key, ...@@ -981,7 +981,11 @@ int ha_archive::index_read_idx(uchar *buf, uint index, const uchar *key,
} }
if (found) if (found)
{
/* notify handler that a record has been found */
table->status= 0;
DBUG_RETURN(0); DBUG_RETURN(0);
}
error: error:
DBUG_RETURN(rc ? rc : HA_ERR_END_OF_FILE); DBUG_RETURN(rc ? rc : HA_ERR_END_OF_FILE);
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#define DATA_TMP_EXT ".TMD" #define DATA_TMP_EXT ".TMD"
#define OLD_EXT ".OLD" #define OLD_EXT ".OLD"
#define FRM_EXT ".frm"
#define WRITE_COUNT MY_HOW_OFTEN_TO_WRITE #define WRITE_COUNT MY_HOW_OFTEN_TO_WRITE
struct st_file_buffer { struct st_file_buffer {
...@@ -125,6 +126,7 @@ static void get_options(int *argc,char ***argv); ...@@ -125,6 +126,7 @@ static void get_options(int *argc,char ***argv);
static MI_INFO *open_isam_file(char *name,int mode); 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 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 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 HUFF_COUNTS *init_huff_count(MI_INFO *info,my_off_t records);
static void free_counts_and_tree_and_queue(HUFF_TREE *huff_trees, static void free_counts_and_tree_and_queue(HUFF_TREE *huff_trees,
uint trees, uint trees,
...@@ -214,9 +216,13 @@ int main(int argc, char **argv) ...@@ -214,9 +216,13 @@ int main(int argc, char **argv)
error=ok=isamchk_neaded=0; error=ok=isamchk_neaded=0;
if (join_table) 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) || 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; error=1;
} }
else while (argc--) else while (argc--)
...@@ -757,6 +763,44 @@ static int compress(PACK_MRG_INFO *mrg,char *result_table) ...@@ -757,6 +763,44 @@ static int compress(PACK_MRG_INFO *mrg,char *result_table)
DBUG_RETURN(-1); 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 */ /* Init a huff_count-struct for each field and init it */
static HUFF_COUNTS *init_huff_count(MI_INFO *info,my_off_t records) static HUFF_COUNTS *init_huff_count(MI_INFO *info,my_off_t records)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment