Commit 9805b66d authored by serg@sergbook.mysql.com's avatar serg@sergbook.mysql.com

Merge work:/home/bk/mysql-4.0

into sergbook.mysql.com:/usr/home/serg/Abk/mysql-4.0
parents c8f89bb6 e20d9e06
...@@ -37782,8 +37782,8 @@ The disadvantages with @code{MERGE} tables are: ...@@ -37782,8 +37782,8 @@ The disadvantages with @code{MERGE} tables are:
@itemize @bullet @itemize @bullet
@item @item
You can only use identical @code{MyISAM} tables for a @code{MERGE} table. You can only use identical @code{MyISAM} tables for a @code{MERGE} table.
@item @c @item
@code{AUTO_INCREMENT} columns are not automatically updated on @code{INSERT}. @c @code{AUTO_INCREMENT} columns are not automatically updated on @code{INSERT}.
@item @item
@code{REPLACE} doesn't work. @code{REPLACE} doesn't work.
@item @item
...@@ -37823,13 +37823,13 @@ CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20)); ...@@ -37823,13 +37823,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)); CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1"); INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2"); 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; TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
@end example @end example
Note that we didn't create a @code{UNIQUE} or @code{PRIMARY KEY} in the @c 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} @c @code{total} table as the key isn't going to be unique in the @code{total}
table. @c table.
Note that you can also manipulate the @file{.MRG} file directly from Note that you can also manipulate the @file{.MRG} file directly from
the outside of the MySQL server: the outside of the MySQL server:
...@@ -37856,6 +37856,10 @@ mysql> SELECT * FROM total; ...@@ -37856,6 +37856,10 @@ mysql> SELECT * FROM total;
+---+---------+ +---+---------+
@end example @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: To remap a @code{MERGE} table you can do one of the following:
@itemize @bullet @itemize @bullet
...@@ -37883,8 +37887,8 @@ The following are the known problems with @code{MERGE} tables: ...@@ -37883,8 +37887,8 @@ The following are the known problems with @code{MERGE} tables:
A @code{MERGE} table cannot maintain @code{UNIQUE} constraints over the 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 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} 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 table ensures that the data are unique, but it knows nothing about
first @code{MyISAM} table. others @code{MyISAM} tables.
@item @item
@code{DELETE FROM merge_table} used without a @code{WHERE} @code{DELETE FROM merge_table} used without a @code{WHERE}
will only clear the mapping for the table, not delete everything in the will only clear the mapping for the table, not delete everything in the
...@@ -49694,6 +49698,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. ...@@ -49694,6 +49698,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet @itemize @bullet
@item @item
Fixed a bug that made the pager option in the mysql client non-functional. 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 @end itemize
@item @item
Added OLAP functionality. Added OLAP functionality.
...@@ -323,8 +323,7 @@ typedef struct st_io_cache_share ...@@ -323,8 +323,7 @@ typedef struct st_io_cache_share
int count; int count;
/* actual IO_CACHE that filled the buffer */ /* actual IO_CACHE that filled the buffer */
struct st_io_cache *active; struct st_io_cache *active;
/* the following will be implemented whenever the need arises */ #ifdef NOT_YET_IMPLEMENTED
#ifdef NOT_IMPLEMENTED
/* whether the structure should be free'd */ /* whether the structure should be free'd */
my_bool alloced; my_bool alloced;
#endif #endif
......
...@@ -358,7 +358,7 @@ typedef struct st_sort_info ...@@ -358,7 +358,7 @@ typedef struct st_sort_info
MI_CHECK *param; MI_CHECK *param;
enum data_file_type new_data_file_type; enum data_file_type new_data_file_type;
SORT_KEY_BLOCKS *key_block,*key_block_end; SORT_KEY_BLOCKS *key_block,*key_block_end;
uint kei, total_keys; uint current_key, total_keys;
my_off_t filelength,dupp,buff_length; my_off_t filelength,dupp,buff_length;
ha_rows max_records; ha_rows max_records;
char *buff; char *buff;
......
...@@ -3223,7 +3223,7 @@ static int sort_delete_record(MI_SORT_PARAM *sort_param) ...@@ -3223,7 +3223,7 @@ static int sort_delete_record(MI_SORT_PARAM *sort_param)
old_file=info->dfile; old_file=info->dfile;
info->dfile=info->rec_cache.file; info->dfile=info->rec_cache.file;
if (sort_info->kei) if (sort_info->current_key)
{ {
key=info->lastkey+info->s->base.max_key_length; key=info->lastkey+info->s->base.max_key_length;
if ((error=(*info->s->read_rnd)(info,sort_param->record,info->lastpos,0)) && if ((error=(*info->s->read_rnd)(info,sort_param->record,info->lastpos,0)) &&
...@@ -3234,7 +3234,7 @@ static int sort_delete_record(MI_SORT_PARAM *sort_param) ...@@ -3234,7 +3234,7 @@ static int sort_delete_record(MI_SORT_PARAM *sort_param)
DBUG_RETURN(1); DBUG_RETURN(1);
} }
for (i=0 ; i < sort_info->kei ; i++) for (i=0 ; i < sort_info->current_key ; i++)
{ {
uint key_length=_mi_make_key(info,i,key,sort_param->record,info->lastpos); uint key_length=_mi_make_key(info,i,key,sort_param->record,info->lastpos);
if (_mi_ck_delete(info,i,key,key_length)) if (_mi_ck_delete(info,i,key,key_length))
......
...@@ -275,12 +275,12 @@ a b ...@@ -275,12 +275,12 @@ a b
1 2 1 2
drop table t3,t1,t2; drop table t3,t1,t2;
drop table if exists t6, t5, t4, t3, t2, t1; 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 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, 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 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 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 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, key(a,b)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST; 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; show create table t3;
Table Create Table Table Create Table
t3 CREATE TABLE `t3` ( t3 CREATE TABLE `t3` (
...@@ -299,18 +299,18 @@ show create table t5; ...@@ -299,18 +299,18 @@ show create table t5;
Table Create Table Table Create Table
t5 CREATE TABLE `t5` ( t5 CREATE TABLE `t5` (
`a` int(11) NOT NULL default '0', `a` int(11) NOT NULL default '0',
`b` int(11) NOT NULL default '0', `b` int(11) NOT NULL auto_increment,
KEY `a` (`a`,`b`) PRIMARY KEY (`a`,`b`)
) TYPE=MRG_MyISAM INSERT_METHOD=FIRST UNION=(t1,t2) ) TYPE=MRG_MyISAM INSERT_METHOD=FIRST UNION=(t1,t2)
show create table t6; show create table t6;
Table Create Table Table Create Table
t6 CREATE TABLE `t6` ( t6 CREATE TABLE `t6` (
`a` int(11) NOT NULL default '0', `a` int(11) NOT NULL default '0',
`b` int(11) NOT NULL default '0', `b` int(11) NOT NULL auto_increment,
KEY `a` (`a`,`b`) PRIMARY KEY (`a`,`b`)
) TYPE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1,t2) ) TYPE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1,t2)
insert into t1 values (1,1),(1,2),(1,3),(1,4); insert into t1 values (1,NULL),(1,NULL),(1,NULL),(1,NULL);
insert into t2 values (2,1),(2,2),(2,3),(2,4); insert into t2 values (2,NULL),(2,NULL),(2,NULL),(2,NULL);
select * from t3 order by b,a limit 3; select * from t3 order by b,a limit 3;
a b a b
select * from t4 order by b,a limit 3; select * from t4 order by b,a limit 3;
...@@ -461,6 +461,73 @@ a b ...@@ -461,6 +461,73 @@ a b
5 2 5 2
6 1 6 1
6 2 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; 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; 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); INSERT INTO t1 VALUES (1,1), (2,1);
......
...@@ -75,8 +75,7 @@ int ha_myisammrg::write_row(byte * buf) ...@@ -75,8 +75,7 @@ int ha_myisammrg::write_row(byte * buf)
if (table->time_stamp) if (table->time_stamp)
update_timestamp(buf+table->time_stamp-1); update_timestamp(buf+table->time_stamp-1);
if (table->next_number_field && buf == table->record[0]) if (table->next_number_field && buf == table->record[0])
return (my_errno=HA_ERR_WRONG_COMMAND); update_auto_increment();
// update_auto_increment(); - [phi] have to check this before allowing it
return myrg_write(file,buf); return myrg_write(file,buf);
} }
......
...@@ -34,7 +34,7 @@ class ha_myisammrg: public handler ...@@ -34,7 +34,7 @@ class ha_myisammrg: public handler
const char **bas_ext() const; const char **bas_ext() const;
ulong table_flags() 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_KEYPOS_TO_RNDPOS | HA_LASTKEY_ORDER |
HA_NULL_KEY | HA_BLOB_KEY); HA_NULL_KEY | HA_BLOB_KEY);
} }
......
...@@ -628,16 +628,29 @@ longlong handler::get_auto_increment() ...@@ -628,16 +628,29 @@ longlong handler::get_auto_increment()
{ {
longlong nr; longlong nr;
int error; int error;
(void) extra(HA_EXTRA_KEYREAD); (void) extra(HA_EXTRA_KEYREAD);
index_init(table->next_number_index); 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) if (error)
nr=1; nr=1;
else else
nr=(longlong) table->next_number_field-> nr=(longlong) table->next_number_field->
val_int_offset(table->rec_buff_length)+1; val_int_offset(table->rec_buff_length)+1;
(void) extra(HA_EXTRA_NO_KEYREAD);
index_end(); index_end();
(void) extra(HA_EXTRA_NO_KEYREAD);
return nr; return nr;
} }
......
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