Commit c9f5a5cc authored by unknown's avatar unknown

Corrections from code review for auto_increment. Added test cases.


mysql-test/r/archive.result:
  New result file.
mysql-test/t/archive.test:
  Added new tests for indexes. Also accidently updated it so that all "FROM" are now capitalized :)
sql/ha_archive.cc:
  Changed comparision function to compare memory locations. 
  
  Modified function for storing the auto_increment. 
  Removed useless DBUG_PRINT
parent 60d827b6
...@@ -4,13 +4,13 @@ Period smallint(4) unsigned zerofill DEFAULT '0000' NOT NULL, ...@@ -4,13 +4,13 @@ Period smallint(4) unsigned zerofill DEFAULT '0000' NOT NULL,
Varor_period smallint(4) unsigned DEFAULT '0' NOT NULL Varor_period smallint(4) unsigned DEFAULT '0' NOT NULL
) ENGINE=archive; ) ENGINE=archive;
INSERT INTO t1 VALUES (9410,9412); INSERT INTO t1 VALUES (9410,9412);
select period from t1; select period FROM t1;
period period
9410 9410
select * from t1; select * FROM t1;
Period Varor_period Period Varor_period
9410 9412 9410 9412
select t1.* from t1; select t1.* FROM t1;
Period Varor_period Period Varor_period
9410 9412 9410 9412
CREATE TABLE t2 ( CREATE TABLE t2 (
...@@ -22,13 +22,13 @@ fld4 char(35) DEFAULT '' NOT NULL, ...@@ -22,13 +22,13 @@ fld4 char(35) DEFAULT '' NOT NULL,
fld5 char(35) DEFAULT '' NOT NULL, fld5 char(35) DEFAULT '' NOT NULL,
fld6 char(4) DEFAULT '' NOT NULL fld6 char(4) DEFAULT '' NOT NULL
) ENGINE=archive; ) ENGINE=archive;
select t2.fld3 from t2 where companynr = 58 and fld3 like "%imaginable%"; select t2.fld3 FROM t2 where companynr = 58 and fld3 like "%imaginable%";
fld3 fld3
imaginable imaginable
select fld3 from t2 where fld3 like "%cultivation" ; select fld3 FROM t2 where fld3 like "%cultivation" ;
fld3 fld3
cultivation cultivation
select t2.fld3,companynr from t2 where companynr = 57+1 order by fld3; select t2.fld3,companynr FROM t2 where companynr = 57+1 order by fld3;
fld3 companynr fld3 companynr
concoct 58 concoct 58
druggists 58 druggists 58
...@@ -53,7 +53,7 @@ synergy 58 ...@@ -53,7 +53,7 @@ synergy 58
thanking 58 thanking 58
tying 58 tying 58
unlocks 58 unlocks 58
select fld3,companynr from t2 where companynr = 58 order by fld3; select fld3,companynr FROM t2 where companynr = 58 order by fld3;
fld3 companynr fld3 companynr
concoct 58 concoct 58
druggists 58 druggists 58
...@@ -78,7 +78,7 @@ synergy 58 ...@@ -78,7 +78,7 @@ synergy 58
thanking 58 thanking 58
tying 58 tying 58
unlocks 58 unlocks 58
select fld3 from t2 order by fld3 desc limit 10; select fld3 FROM t2 order by fld3 desc limit 10;
fld3 fld3
youthfulness youthfulness
yelped yelped
...@@ -90,49 +90,49 @@ Winsett ...@@ -90,49 +90,49 @@ Winsett
Willy Willy
willed willed
wildcats wildcats
select fld3 from t2 order by fld3 desc limit 5; select fld3 FROM t2 order by fld3 desc limit 5;
fld3 fld3
youthfulness youthfulness
yelped yelped
Wotan Wotan
workers workers
Witt Witt
select fld3 from t2 order by fld3 desc limit 5,5; select fld3 FROM t2 order by fld3 desc limit 5,5;
fld3 fld3
witchcraft witchcraft
Winsett Winsett
Willy Willy
willed willed
wildcats wildcats
select t2.fld3 from t2 where fld3 = 'honeysuckle'; select t2.fld3 FROM t2 where fld3 = 'honeysuckle';
fld3 fld3
honeysuckle honeysuckle
select t2.fld3 from t2 where fld3 LIKE 'honeysuckl_'; select t2.fld3 FROM t2 where fld3 LIKE 'honeysuckl_';
fld3 fld3
honeysuckle honeysuckle
select t2.fld3 from t2 where fld3 LIKE 'hon_ysuckl_'; select t2.fld3 FROM t2 where fld3 LIKE 'hon_ysuckl_';
fld3 fld3
honeysuckle honeysuckle
select t2.fld3 from t2 where fld3 LIKE 'honeysuckle%'; select t2.fld3 FROM t2 where fld3 LIKE 'honeysuckle%';
fld3 fld3
honeysuckle honeysuckle
select t2.fld3 from t2 where fld3 LIKE 'h%le'; select t2.fld3 FROM t2 where fld3 LIKE 'h%le';
fld3 fld3
honeysuckle honeysuckle
select t2.fld3 from t2 where fld3 LIKE 'honeysuckle_'; select t2.fld3 FROM t2 where fld3 LIKE 'honeysuckle_';
fld3 fld3
select t2.fld3 from t2 where fld3 LIKE 'don_t_find_me_please%'; select t2.fld3 FROM t2 where fld3 LIKE 'don_t_find_me_please%';
fld3 fld3
select t2.fld3 from t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3; select t2.fld3 FROM t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3;
fld3 fld3
honeysuckle honeysuckle
honoring honoring
select fld1,fld3 from t2 where fld3="Colombo" or fld3 = "nondecreasing" order by fld3; select fld1,fld3 FROM t2 where fld3="Colombo" or fld3 = "nondecreasing" order by fld3;
fld1 fld3 fld1 fld3
148504 Colombo 148504 Colombo
068305 Colombo 068305 Colombo
000000 nondecreasing 000000 nondecreasing
select fld1,fld3 from t2 where companynr = 37 and fld3 like 'f%'; select fld1,fld3 FROM t2 where companynr = 37 and fld3 like 'f%';
fld1 fld3 fld1 fld3
012001 flanking 012001 flanking
013602 foldout 013602 foldout
...@@ -165,37 +165,37 @@ fld1 fld3 ...@@ -165,37 +165,37 @@ fld1 fld3
232102 forgivably 232102 forgivably
238007 filial 238007 filial
238008 fixedly 238008 fixedly
select fld3 from t2 where fld3 like "L%" and fld3 = "ok"; select fld3 FROM t2 where fld3 like "L%" and fld3 = "ok";
fld3 fld3
select fld3 from t2 where (fld3 like "C%" and fld3 = "Chantilly"); select fld3 FROM t2 where (fld3 like "C%" and fld3 = "Chantilly");
fld3 fld3
Chantilly Chantilly
select fld1,fld3 from t2 where fld1 like "25050%"; select fld1,fld3 FROM t2 where fld1 like "25050%";
fld1 fld3 fld1 fld3
250501 poisoning 250501 poisoning
250502 Iraqis 250502 Iraqis
250503 heaving 250503 heaving
250504 population 250504 population
250505 bomb 250505 bomb
select fld1,fld3 from t2 where fld1 like "25050_"; select fld1,fld3 FROM t2 where fld1 like "25050_";
fld1 fld3 fld1 fld3
250501 poisoning 250501 poisoning
250502 Iraqis 250502 Iraqis
250503 heaving 250503 heaving
250504 population 250504 population
250505 bomb 250505 bomb
create table t3 engine=archive select * from t2; create table t3 engine=archive select * FROM t2;
select * from t3 where fld3='bonfire'; select * FROM t3 where fld3='bonfire';
auto fld1 companynr fld3 fld4 fld5 fld6 auto fld1 companynr fld3 fld4 fld5 fld6
1191 068504 00 bonfire corresponds positively 1191 068504 00 bonfire corresponds positively
select count(*) from t3; select count(*) FROM t3;
count(*) count(*)
1199 1199
rename table t3 to t4; rename table t3 to t4;
select * from t4 where fld3='bonfire'; select * FROM t4 where fld3='bonfire';
auto fld1 companynr fld3 fld4 fld5 fld6 auto fld1 companynr fld3 fld4 fld5 fld6
1191 068504 00 bonfire corresponds positively 1191 068504 00 bonfire corresponds positively
select count(*) from t4; select count(*) FROM t4;
count(*) count(*)
1199 1199
INSERT INTO t2 VALUES (1,000001,00,'Omaha','teethe','neat',''); INSERT INTO t2 VALUES (1,000001,00,'Omaha','teethe','neat','');
...@@ -11130,7 +11130,7 @@ t2 CREATE TABLE `t2` ( ...@@ -11130,7 +11130,7 @@ t2 CREATE TABLE `t2` (
`fld4` char(35) NOT NULL default '', `fld4` char(35) NOT NULL default '',
`fld5` char(35) NOT NULL default '' `fld5` char(35) NOT NULL default ''
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1
SELECT * from t2; SELECT * FROM t2;
auto fld1 companynr fld3 fld4 fld5 auto fld1 companynr fld3 fld4 fld5
1 000001 00 Omaha teethe neat 1 000001 00 Omaha teethe neat
2 011401 37 breaking dreaded Steinberg 2 011401 37 breaking dreaded Steinberg
...@@ -12346,4 +12346,63 @@ auto fld1 companynr fld3 fld4 fld5 ...@@ -12346,4 +12346,63 @@ auto fld1 companynr fld3 fld4 fld5
3 011402 37 Romans scholastics jarring 3 011402 37 Romans scholastics jarring
4 011403 37 intercepted audiology tinily 4 011403 37 intercepted audiology tinily
4 011403 37 intercepted audiology tinily 4 011403 37 intercepted audiology tinily
drop table t1, t2, t4; CREATE TABLE `t5` (
`a` int(11) NOT NULL auto_increment,
b char(12),
PRIMARY KEY (`a`)
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (32, "foo");
INSERT INTO t5 VALUES (23, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (3, "foo");
ERROR 23000: Can't write; duplicate key in table 't5'
INSERT INTO t5 VALUES (0, "foo");
SELECT * FROM t5;
a b
1 foo
2 foo
3 foo
4 foo
5 foo
32 foo
23 foo
33 foo
34 foo
35 foo
DROP TABLE t5;
CREATE TABLE `t5` (
`a` int(11) NOT NULL auto_increment,
b char(12),
KEY (`a`)
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (32, "foo");
INSERT INTO t5 VALUES (23, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (3, "foo");
INSERT INTO t5 VALUES (0, "foo");
SELECT * FROM t5;
a b
1 foo
2 foo
3 foo
4 foo
5 foo
32 foo
23 foo
33 foo
34 foo
3 foo
35 foo
drop table t1, t2, t4, t5;
# #
# Simple test for archive example # Simple test for archive example
# Taken from the select test # Taken FROM the select test
# #
-- source include/have_archive.inc -- source include/have_archive.inc
...@@ -15,9 +15,9 @@ CREATE TABLE t1 ( ...@@ -15,9 +15,9 @@ CREATE TABLE t1 (
INSERT INTO t1 VALUES (9410,9412); INSERT INTO t1 VALUES (9410,9412);
select period from t1; select period FROM t1;
select * from t1; select * FROM t1;
select t1.* from t1; select t1.* FROM t1;
# #
# Create test table # Create test table
...@@ -1243,64 +1243,64 @@ INSERT INTO t2 VALUES (1193,000000,00,'nondecreasing','implant','thrillingly','' ...@@ -1243,64 +1243,64 @@ INSERT INTO t2 VALUES (1193,000000,00,'nondecreasing','implant','thrillingly',''
# Search with a key # Search with a key
# #
select t2.fld3 from t2 where companynr = 58 and fld3 like "%imaginable%"; select t2.fld3 FROM t2 where companynr = 58 and fld3 like "%imaginable%";
select fld3 from t2 where fld3 like "%cultivation" ; select fld3 FROM t2 where fld3 like "%cultivation" ;
# #
# Search with a key using sorting and limit the same time # Search with a key using sorting and limit the same time
# #
select t2.fld3,companynr from t2 where companynr = 57+1 order by fld3; select t2.fld3,companynr FROM t2 where companynr = 57+1 order by fld3;
select fld3,companynr from t2 where companynr = 58 order by fld3; select fld3,companynr FROM t2 where companynr = 58 order by fld3;
select fld3 from t2 order by fld3 desc limit 10; select fld3 FROM t2 order by fld3 desc limit 10;
select fld3 from t2 order by fld3 desc limit 5; select fld3 FROM t2 order by fld3 desc limit 5;
select fld3 from t2 order by fld3 desc limit 5,5; select fld3 FROM t2 order by fld3 desc limit 5,5;
# #
# Search with a key having a constant with each unique key. # Search with a key having a constant with each unique key.
# The table is read directly with read-next on fld3 # The table is read directly with read-next on fld3
# #
select t2.fld3 from t2 where fld3 = 'honeysuckle'; select t2.fld3 FROM t2 where fld3 = 'honeysuckle';
select t2.fld3 from t2 where fld3 LIKE 'honeysuckl_'; select t2.fld3 FROM t2 where fld3 LIKE 'honeysuckl_';
select t2.fld3 from t2 where fld3 LIKE 'hon_ysuckl_'; select t2.fld3 FROM t2 where fld3 LIKE 'hon_ysuckl_';
select t2.fld3 from t2 where fld3 LIKE 'honeysuckle%'; select t2.fld3 FROM t2 where fld3 LIKE 'honeysuckle%';
select t2.fld3 from t2 where fld3 LIKE 'h%le'; select t2.fld3 FROM t2 where fld3 LIKE 'h%le';
select t2.fld3 from t2 where fld3 LIKE 'honeysuckle_'; select t2.fld3 FROM t2 where fld3 LIKE 'honeysuckle_';
select t2.fld3 from t2 where fld3 LIKE 'don_t_find_me_please%'; select t2.fld3 FROM t2 where fld3 LIKE 'don_t_find_me_please%';
# #
# Test sorting with a used key (there is no need for sorting) # Test sorting with a used key (there is no need for sorting)
# #
select t2.fld3 from t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3; select t2.fld3 FROM t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3;
select fld1,fld3 from t2 where fld3="Colombo" or fld3 = "nondecreasing" order by fld3; select fld1,fld3 FROM t2 where fld3="Colombo" or fld3 = "nondecreasing" order by fld3;
# #
# Search with a key with LIKE constant # Search with a key with LIKE constant
# If the like starts with a certain letter key will be used. # If the like starts with a certain letter key will be used.
# #
select fld1,fld3 from t2 where companynr = 37 and fld3 like 'f%'; select fld1,fld3 FROM t2 where companynr = 37 and fld3 like 'f%';
select fld3 from t2 where fld3 like "L%" and fld3 = "ok"; select fld3 FROM t2 where fld3 like "L%" and fld3 = "ok";
select fld3 from t2 where (fld3 like "C%" and fld3 = "Chantilly"); select fld3 FROM t2 where (fld3 like "C%" and fld3 = "Chantilly");
select fld1,fld3 from t2 where fld1 like "25050%"; select fld1,fld3 FROM t2 where fld1 like "25050%";
select fld1,fld3 from t2 where fld1 like "25050_"; select fld1,fld3 FROM t2 where fld1 like "25050_";
# #
# Test rename of table # Test rename of table
# #
create table t3 engine=archive select * from t2; create table t3 engine=archive select * FROM t2;
select * from t3 where fld3='bonfire'; select * FROM t3 where fld3='bonfire';
select count(*) from t3; select count(*) FROM t3;
# Clean up path in error message # Clean up path in error message
--replace_result $MYSQL_TEST_DIR . /var/master-data/ / --replace_result $MYSQL_TEST_DIR . /var/master-data/ /
rename table t3 to t4; rename table t3 to t4;
select * from t4 where fld3='bonfire'; select * FROM t4 where fld3='bonfire';
select count(*) from t4; select count(*) FROM t4;
# End of 4.1 tests # End of 4.1 tests
...@@ -1351,10 +1351,58 @@ INSERT DELAYED INTO t2 VALUES (4,011403,37,'intercepted','audiology','tinily','' ...@@ -1351,10 +1351,58 @@ INSERT DELAYED INTO t2 VALUES (4,011403,37,'intercepted','audiology','tinily',''
# Adding test for alter table # Adding test for alter table
ALTER TABLE t2 DROP COLUMN fld6; ALTER TABLE t2 DROP COLUMN fld6;
SHOW CREATE TABLE t2; SHOW CREATE TABLE t2;
SELECT * from t2; SELECT * FROM t2;
# Adding tests for autoincrement
# First the simple stuff
CREATE TABLE `t5` (
`a` int(11) NOT NULL auto_increment,
b char(12),
PRIMARY KEY (`a`)
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (32, "foo");
INSERT INTO t5 VALUES (23, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
--error 1022
INSERT INTO t5 VALUES (3, "foo");
INSERT INTO t5 VALUES (0, "foo");
SELECT * FROM t5;
DROP TABLE t5;
CREATE TABLE `t5` (
`a` int(11) NOT NULL auto_increment,
b char(12),
KEY (`a`)
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (32, "foo");
INSERT INTO t5 VALUES (23, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (0, "foo");
INSERT INTO t5 VALUES (3, "foo");
INSERT INTO t5 VALUES (0, "foo");
SELECT * FROM t5;
# #
# Cleanup, test is over # Cleanup, test is over
# #
drop table t1, t2, t4; --disable_warnings
drop table t1, t2, t4, t5;
--enable_warnings
...@@ -599,7 +599,6 @@ int ha_archive::create(const char *name, TABLE *table_arg, ...@@ -599,7 +599,6 @@ int ha_archive::create(const char *name, TABLE *table_arg,
{ {
Field *field= key_part->field; Field *field= key_part->field;
DBUG_PRINT("info", ("Looking at field index%s", field->field_name));
if (!(field->flags & AUTO_INCREMENT_FLAG)) if (!(field->flags & AUTO_INCREMENT_FLAG))
{ {
error= -1; error= -1;
...@@ -720,8 +719,6 @@ int ha_archive::write_row(byte *buf) ...@@ -720,8 +719,6 @@ int ha_archive::write_row(byte *buf)
KEY *mkey= &table->s->key_info[0]; // We only support one key right now KEY *mkey= &table->s->key_info[0]; // We only support one key right now
update_auto_increment(); update_auto_increment();
temp_auto= table->next_number_field->val_int(); temp_auto= table->next_number_field->val_int();
DBUG_PRINT("info", ("archive would see %d and %d",
temp_auto, share->auto_increment_value));
/* /*
Bad news, this will cause a search for the unique value which is very Bad news, this will cause a search for the unique value which is very
...@@ -765,13 +762,15 @@ int ha_archive::write_row(byte *buf) ...@@ -765,13 +762,15 @@ int ha_archive::write_row(byte *buf)
/* /*
Now we read and check all of the rows. Now we read and check all of the rows.
if (!memcmp(table->next_number_field->ptr, mfield->ptr, mfield->max_length())) if (!memcmp(table->next_number_field->ptr, mfield->ptr, mfield->max_length()))
if ((longlong)temp_auto ==
mfield->val_int((char*)(read_buf + mfield->offset())))
*/ */
Field *mfield= table->next_number_field; Field *mfield= table->next_number_field;
while (!(get_row(&archive, read_buf))) while (!(get_row(&archive, read_buf)))
{ {
if ((longlong)temp_auto == if (!memcmp(read_buf + mfield->offset(), table->next_number_field->ptr,
mfield->val_int((char*)(read_buf + mfield->offset()))) mfield->max_length()))
{ {
rc= HA_ERR_FOUND_DUPP_KEY; rc= HA_ERR_FOUND_DUPP_KEY;
goto error; goto error;
...@@ -780,7 +779,8 @@ int ha_archive::write_row(byte *buf) ...@@ -780,7 +779,8 @@ int ha_archive::write_row(byte *buf)
} }
else else
{ {
auto_increment_value= share->auto_increment_value= temp_auto; if (temp_auto > share->auto_increment_value)
auto_increment_value= share->auto_increment_value= temp_auto;
} }
} }
...@@ -802,7 +802,7 @@ int ha_archive::write_row(byte *buf) ...@@ -802,7 +802,7 @@ int ha_archive::write_row(byte *buf)
ulonglong ha_archive::get_auto_increment() ulonglong ha_archive::get_auto_increment()
{ {
return auto_increment_value= ++share->auto_increment_value; return share->auto_increment_value + 1;
} }
/* Initialized at each key walk (called multiple times unlike rnd_init()) */ /* Initialized at each key walk (called multiple times unlike rnd_init()) */
......
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