From e20d9e06c5e8f394eb0d4243431f293cd13e727e Mon Sep 17 00:00:00 2001 From: "serg@sergbook.mysql.com" <> Date: Sun, 21 Jul 2002 23:55:32 +0200 Subject: [PATCH] AUTO_INCREMENT support for MERGE HA_AUTO_PART_KEY support for handler parent class --- Docs/manual.texi | 22 ++++++---- mysql-test/r/merge.result | 87 ++++++++++++++++++++++++++++++++++----- sql/ha_myisammrg.cc | 3 +- sql/ha_myisammrg.h | 2 +- sql/handler.cc | 17 +++++++- 5 files changed, 108 insertions(+), 23 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 62218b469bf..5ce3192f1b1 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -37793,8 +37793,8 @@ The disadvantages with @code{MERGE} tables are: @itemize @bullet @item You can only use identical @code{MyISAM} tables for a @code{MERGE} table. -@item -@code{AUTO_INCREMENT} columns are not automatically updated on @code{INSERT}. +@c @item +@c @code{AUTO_INCREMENT} columns are not automatically updated on @code{INSERT}. @item @code{REPLACE} doesn't work. @item @@ -37834,13 +37834,13 @@ CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20)); CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20)); INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1"); INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2"); -CREATE TABLE total (a INT NOT NULL, message CHAR(20), KEY(a)) +CREATE TABLE total (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST; @end example -Note that we didn't create a @code{UNIQUE} or @code{PRIMARY KEY} in the -@code{total} table as the key isn't going to be unique in the @code{total} -table. +@c Note that we didn't create a @code{UNIQUE} or @code{PRIMARY KEY} in the +@c @code{total} table as the key isn't going to be unique in the @code{total} +@c table. Note that you can also manipulate the @file{.MRG} file directly from the outside of the MySQL server: @@ -37867,6 +37867,10 @@ mysql> SELECT * FROM total; +---+---------+ @end example +Note that the @code{a} column, though declared as @code{PRIMARY KEY}, +is not really unique, as @code{MERGE} table cannot enforce uniqueness +over a set of underlying @code{MyISAM} tables. + To remap a @code{MERGE} table you can do one of the following: @itemize @bullet @@ -37894,8 +37898,8 @@ The following are the known problems with @code{MERGE} tables: A @code{MERGE} table cannot maintain @code{UNIQUE} constraints over the whole table. When you do @code{INSERT}, the data goes into the first or last table (according to @code{INSERT_METHOD=xxx}) and this @code{MyISAM} -table ensures that the data are unique, but it knows nothing about the -first @code{MyISAM} table. +table ensures that the data are unique, but it knows nothing about +others @code{MyISAM} tables. @item @code{DELETE FROM merge_table} used without a @code{WHERE} will only clear the mapping for the table, not delete everything in the @@ -49699,6 +49703,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item Fixed a bug that made the pager option in the mysql client non-functional. +@item +Added full @code{AUTO_INCREMENT} support to @code{MERGE} tables. @end itemize diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index f6ca2acc91c..b95352a9eaa 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -275,12 +275,12 @@ a b 1 2 drop table t3,t1,t2; drop table if exists t6, t5, t4, t3, t2, t1; -create table t1 (a int not null, b int not null, key(a,b)); -create table t2 (a int not null, b int not null, key(a,b)); +create table t1 (a int not null, b int not null auto_increment, primary key(a,b)); +create table t2 (a int not null, b int not null auto_increment, primary key(a,b)); create table t3 (a int not null, b int not null, key(a,b)) UNION=(t1,t2) INSERT_METHOD=NO; create table t4 (a int not null, b int not null, key(a,b)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=NO; -create table t5 (a int not null, b int not null, key(a,b)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=FIRST; -create table t6 (a int not null, b int not null, key(a,b)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST; +create table t5 (a int not null, b int not null auto_increment, primary key(a,b)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=FIRST; +create table t6 (a int not null, b int not null auto_increment, primary key(a,b)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST; show create table t3; Table Create Table t3 CREATE TABLE `t3` ( @@ -299,18 +299,18 @@ show create table t5; Table Create Table t5 CREATE TABLE `t5` ( `a` int(11) NOT NULL default '0', - `b` int(11) NOT NULL default '0', - KEY `a` (`a`,`b`) + `b` int(11) NOT NULL auto_increment, + PRIMARY KEY (`a`,`b`) ) TYPE=MRG_MyISAM INSERT_METHOD=FIRST UNION=(t1,t2) show create table t6; Table Create Table t6 CREATE TABLE `t6` ( `a` int(11) NOT NULL default '0', - `b` int(11) NOT NULL default '0', - KEY `a` (`a`,`b`) + `b` int(11) NOT NULL auto_increment, + PRIMARY KEY (`a`,`b`) ) TYPE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1,t2) -insert into t1 values (1,1),(1,2),(1,3),(1,4); -insert into t2 values (2,1),(2,2),(2,3),(2,4); +insert into t1 values (1,NULL),(1,NULL),(1,NULL),(1,NULL); +insert into t2 values (2,NULL),(2,NULL),(2,NULL),(2,NULL); select * from t3 order by b,a limit 3; a b select * from t4 order by b,a limit 3; @@ -461,6 +461,73 @@ a b 5 2 6 1 6 2 +select 1; +1 +1 +insert into t5 values (1,NULL),(5,NULL); +insert into t6 values (2,NULL),(6,NULL); +select * from t1 order by a,b; +a b +1 1 +1 2 +1 3 +1 4 +1 5 +4 1 +4 2 +5 1 +5 2 +5 3 +select * from t2 order by a,b; +a b +2 1 +2 2 +2 3 +2 4 +2 5 +6 1 +6 2 +6 3 +select * from t5 order by a,b; +a b +1 1 +1 2 +1 3 +1 4 +1 5 +2 1 +2 2 +2 3 +2 4 +2 5 +4 1 +4 2 +5 1 +5 2 +5 3 +6 1 +6 2 +6 3 +select * from t6 order by a,b; +a b +1 1 +1 2 +1 3 +1 4 +1 5 +2 1 +2 2 +2 3 +2 4 +2 5 +4 1 +4 2 +5 1 +5 2 +5 3 +6 1 +6 2 +6 3 drop table if exists t6, t5, t4, t3, t2, t1; CREATE TABLE t1 ( a int(11) NOT NULL default '0', b int(11) NOT NULL default '0', PRIMARY KEY (a,b)) TYPE=MyISAM; INSERT INTO t1 VALUES (1,1), (2,1); diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc index 4e09c87f341..a04aafec130 100644 --- a/sql/ha_myisammrg.cc +++ b/sql/ha_myisammrg.cc @@ -75,8 +75,7 @@ int ha_myisammrg::write_row(byte * buf) if (table->time_stamp) update_timestamp(buf+table->time_stamp-1); if (table->next_number_field && buf == table->record[0]) - return (my_errno=HA_ERR_WRONG_COMMAND); - // update_auto_increment(); - [phi] have to check this before allowing it + update_auto_increment(); return myrg_write(file,buf); } diff --git a/sql/ha_myisammrg.h b/sql/ha_myisammrg.h index 2b9d7433d2f..47d3e022eb5 100644 --- a/sql/ha_myisammrg.h +++ b/sql/ha_myisammrg.h @@ -34,7 +34,7 @@ class ha_myisammrg: public handler const char **bas_ext() const; ulong table_flags() const { - return (HA_REC_NOT_IN_SEQ | HA_READ_RND_SAME | + return (HA_REC_NOT_IN_SEQ | HA_READ_RND_SAME | HA_AUTO_PART_KEY | HA_KEYPOS_TO_RNDPOS | HA_LASTKEY_ORDER | HA_NULL_KEY | HA_BLOB_KEY); } diff --git a/sql/handler.cc b/sql/handler.cc index 25617d95075..f1308a0de6e 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -628,16 +628,29 @@ longlong handler::get_auto_increment() { longlong nr; int error; + (void) extra(HA_EXTRA_KEYREAD); index_init(table->next_number_index); - error=index_last(table->record[1]); + if (!table->next_number_key_offset) + { // Autoincrement at key-start + error=index_last(table->record[1]); + } + else + { + byte key[MAX_KEY_LENGTH]; + key_copy(key,table,table->next_number_index, + table->next_number_key_offset); + error=index_read(table->record[1], key, table->next_number_key_offset, + HA_READ_PREFIX_LAST); + } + if (error) nr=1; else nr=(longlong) table->next_number_field-> val_int_offset(table->rec_buff_length)+1; - (void) extra(HA_EXTRA_NO_KEYREAD); index_end(); + (void) extra(HA_EXTRA_NO_KEYREAD); return nr; }