mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
AUTO_INCREMENT support for MERGE
HA_AUTO_PART_KEY support for handler parent class
This commit is contained in:
parent
0642d54a37
commit
e20d9e06c5
5 changed files with 108 additions and 23 deletions
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue