summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorserg@sergbook.mysql.com <>2002-07-21 23:55:32 +0200
committerserg@sergbook.mysql.com <>2002-07-21 23:55:32 +0200
commite20d9e06c5e8f394eb0d4243431f293cd13e727e (patch)
tree18b81d0250f43e62349dfb3c0cb2dde8af33f444
parent0642d54a3728ac502353b1ba94966cb75e794691 (diff)
downloadmariadb-git-e20d9e06c5e8f394eb0d4243431f293cd13e727e.tar.gz
AUTO_INCREMENT support for MERGE
HA_AUTO_PART_KEY support for handler parent class
-rw-r--r--Docs/manual.texi22
-rw-r--r--mysql-test/r/merge.result87
-rw-r--r--sql/ha_myisammrg.cc3
-rw-r--r--sql/ha_myisammrg.h2
-rw-r--r--sql/handler.cc17
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;
}