Loading Docs/manual.texi +14 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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: Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 mysql-test/r/merge.result +77 −10 Original line number Diff line number Diff line Loading @@ -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` ( Loading @@ -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; Loading Loading @@ -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); Loading sql/ha_myisammrg.cc +1 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading sql/ha_myisammrg.h +1 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading sql/handler.cc +15 −2 Original line number Diff line number Diff line Loading @@ -628,16 +628,29 @@ longlong handler::get_auto_increment() { longlong nr; int error; (void) extra(HA_EXTRA_KEYREAD); index_init(table->next_number_index); 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; } Loading Loading
Docs/manual.texi +14 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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: Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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
mysql-test/r/merge.result +77 −10 Original line number Diff line number Diff line Loading @@ -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` ( Loading @@ -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; Loading Loading @@ -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); Loading
sql/ha_myisammrg.cc +1 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading
sql/ha_myisammrg.h +1 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading
sql/handler.cc +15 −2 Original line number Diff line number Diff line Loading @@ -628,16 +628,29 @@ longlong handler::get_auto_increment() { longlong nr; int error; (void) extra(HA_EXTRA_KEYREAD); index_init(table->next_number_index); 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; } Loading