mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge rkalimullin@work.mysql.com:/home/bk/mysql-4.1
into mysql.r18.ru:/usr/home/ram/mysql-4.1 mysql-test/r/create.result: Auto merged
This commit is contained in:
@ -21,7 +21,8 @@ static void init_block(HP_BLOCK *block,uint reclength,ulong min_records,
|
|||||||
ulong max_records);
|
ulong max_records);
|
||||||
|
|
||||||
int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
|
int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
|
||||||
uint reclength, ulong max_records, ulong min_records)
|
uint reclength, ulong max_records, ulong min_records,
|
||||||
|
HP_CREATE_INFO *create_info)
|
||||||
{
|
{
|
||||||
uint i, j, key_segs, max_length, length;
|
uint i, j, key_segs, max_length, length;
|
||||||
HP_SHARE *share;
|
HP_SHARE *share;
|
||||||
@ -120,6 +121,9 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
|
|||||||
share->keys= keys;
|
share->keys= keys;
|
||||||
share->max_key_length= max_length;
|
share->max_key_length= max_length;
|
||||||
share->changed= 0;
|
share->changed= 0;
|
||||||
|
share->auto_key= create_info->auto_key;
|
||||||
|
share->auto_key_type= create_info->auto_key_type;
|
||||||
|
share->auto_increment= create_info->auto_increment;
|
||||||
if (!(share->name= my_strdup(name,MYF(0))))
|
if (!(share->name= my_strdup(name,MYF(0))))
|
||||||
{
|
{
|
||||||
my_free((gptr) share,MYF(0));
|
my_free((gptr) share,MYF(0));
|
||||||
|
@ -537,3 +537,51 @@ my_bool hp_if_null_in_key(HP_KEYDEF *keydef, const byte *record)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void heap_update_auto_increment(HP_INFO *info, const byte *record)
|
||||||
|
{
|
||||||
|
ulonglong value;
|
||||||
|
HA_KEYSEG *keyseg= info->s->keydef[info->s->auto_key - 1].seg;
|
||||||
|
const uchar *key= (uchar*) record + keyseg->start;
|
||||||
|
|
||||||
|
switch (info->s->auto_key_type) {
|
||||||
|
case HA_KEYTYPE_INT8:
|
||||||
|
case HA_KEYTYPE_BINARY:
|
||||||
|
value= (ulonglong) *(uchar*) key;
|
||||||
|
break;
|
||||||
|
case HA_KEYTYPE_SHORT_INT:
|
||||||
|
case HA_KEYTYPE_USHORT_INT:
|
||||||
|
value= (ulonglong) uint2korr(key);
|
||||||
|
break;
|
||||||
|
case HA_KEYTYPE_LONG_INT:
|
||||||
|
case HA_KEYTYPE_ULONG_INT:
|
||||||
|
value= (ulonglong) uint4korr(key);
|
||||||
|
break;
|
||||||
|
case HA_KEYTYPE_INT24:
|
||||||
|
case HA_KEYTYPE_UINT24:
|
||||||
|
value= (ulonglong) uint3korr(key);
|
||||||
|
break;
|
||||||
|
case HA_KEYTYPE_FLOAT: /* This shouldn't be used */
|
||||||
|
{
|
||||||
|
float f_1;
|
||||||
|
float4get(f_1, key);
|
||||||
|
value= (ulonglong) f_1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case HA_KEYTYPE_DOUBLE: /* This shouldn't be used */
|
||||||
|
{
|
||||||
|
double f_1;
|
||||||
|
float8get(f_1, key);
|
||||||
|
value= (ulonglong) f_1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case HA_KEYTYPE_LONGLONG:
|
||||||
|
case HA_KEYTYPE_ULONGLONG:
|
||||||
|
value= uint8korr(key);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
value= 0; /* Error */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
set_if_bigger(info->s->auto_increment, value);
|
||||||
|
}
|
||||||
|
@ -55,5 +55,7 @@ int heap_info(reg1 HP_INFO *info,reg2 HEAPINFO *x,
|
|||||||
x->index_length= info->s->index_length;
|
x->index_length= info->s->index_length;
|
||||||
x->max_records = info->s->max_records;
|
x->max_records = info->s->max_records;
|
||||||
x->errkey = info->errkey;
|
x->errkey = info->errkey;
|
||||||
|
if (flag & HA_STATUS_AUTO)
|
||||||
|
x->auto_increment= info->s->auto_increment + 1;
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
} /* heap_info */
|
} /* heap_info */
|
||||||
|
@ -37,11 +37,14 @@ int main(int argc, char **argv)
|
|||||||
const char *filename;
|
const char *filename;
|
||||||
HP_KEYDEF keyinfo[10];
|
HP_KEYDEF keyinfo[10];
|
||||||
HA_KEYSEG keyseg[4];
|
HA_KEYSEG keyseg[4];
|
||||||
|
HP_CREATE_INFO hp_create_info;
|
||||||
MY_INIT(argv[0]);
|
MY_INIT(argv[0]);
|
||||||
|
|
||||||
filename= "test1";
|
filename= "test1";
|
||||||
get_options(argc,argv);
|
get_options(argc,argv);
|
||||||
|
|
||||||
|
bzero(&hp_create_info, sizeof(hp_create_info));
|
||||||
|
|
||||||
keyinfo[0].keysegs=1;
|
keyinfo[0].keysegs=1;
|
||||||
keyinfo[0].seg=keyseg;
|
keyinfo[0].seg=keyseg;
|
||||||
keyinfo[0].algorithm= HA_KEY_ALG_HASH;
|
keyinfo[0].algorithm= HA_KEY_ALG_HASH;
|
||||||
@ -55,7 +58,8 @@ int main(int argc, char **argv)
|
|||||||
bzero((gptr) flags,sizeof(flags));
|
bzero((gptr) flags,sizeof(flags));
|
||||||
|
|
||||||
printf("- Creating heap-file\n");
|
printf("- Creating heap-file\n");
|
||||||
if (heap_create(filename,1,keyinfo,30,(ulong) flag*100000l,10l) ||
|
if (heap_create(filename,1,keyinfo,30,(ulong) flag*100000l,10l,
|
||||||
|
&hp_create_info) ||
|
||||||
!(file= heap_open(filename, 2)))
|
!(file= heap_open(filename, 2)))
|
||||||
goto err;
|
goto err;
|
||||||
printf("- Writing records:s\n");
|
printf("- Writing records:s\n");
|
||||||
|
@ -63,6 +63,7 @@ int main(int argc, char *argv[])
|
|||||||
HP_KEYDEF keyinfo[MAX_KEYS];
|
HP_KEYDEF keyinfo[MAX_KEYS];
|
||||||
HA_KEYSEG keyseg[MAX_KEYS*5];
|
HA_KEYSEG keyseg[MAX_KEYS*5];
|
||||||
HEAP_PTR position;
|
HEAP_PTR position;
|
||||||
|
HP_CREATE_INFO hp_create_info;
|
||||||
MY_INIT(argv[0]); /* init my_sys library & pthreads */
|
MY_INIT(argv[0]); /* init my_sys library & pthreads */
|
||||||
LINT_INIT(position);
|
LINT_INIT(position);
|
||||||
|
|
||||||
@ -70,6 +71,8 @@ int main(int argc, char *argv[])
|
|||||||
filename2= "test2_2";
|
filename2= "test2_2";
|
||||||
file=file2=0;
|
file=file2=0;
|
||||||
get_options(argc,argv);
|
get_options(argc,argv);
|
||||||
|
|
||||||
|
bzero(&hp_create_info, sizeof(hp_create_info));
|
||||||
|
|
||||||
write_count=update=opt_delete=0;
|
write_count=update=opt_delete=0;
|
||||||
key_check=0;
|
key_check=0;
|
||||||
@ -122,7 +125,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
printf("- Creating heap-file\n");
|
printf("- Creating heap-file\n");
|
||||||
if (heap_create(filename,keys,keyinfo,reclength,(ulong) flag*100000L,
|
if (heap_create(filename,keys,keyinfo,reclength,(ulong) flag*100000L,
|
||||||
(ulong) recant/2) ||
|
(ulong) recant/2, &hp_create_info) ||
|
||||||
!(file= heap_open(filename, 2)))
|
!(file= heap_open(filename, 2)))
|
||||||
goto err;
|
goto err;
|
||||||
signal(SIGINT,endprog);
|
signal(SIGINT,endprog);
|
||||||
@ -557,7 +560,7 @@ int main(int argc, char *argv[])
|
|||||||
heap_close(file2);
|
heap_close(file2);
|
||||||
|
|
||||||
printf("- Creating output heap-file 2\n");
|
printf("- Creating output heap-file 2\n");
|
||||||
if (heap_create(filename2,1,keyinfo,reclength,0L,0L) ||
|
if (heap_create(filename2,1,keyinfo,reclength,0L,0L,&hp_create_info) ||
|
||||||
!(file2= heap_open(filename2, 2)))
|
!(file2= heap_open(filename2, 2)))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
@ -22,7 +22,8 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new)
|
|||||||
{
|
{
|
||||||
HP_KEYDEF *keydef, *end, *p_lastinx;
|
HP_KEYDEF *keydef, *end, *p_lastinx;
|
||||||
byte *pos;
|
byte *pos;
|
||||||
HP_SHARE *share=info->s;
|
bool auto_key_changed= 0;
|
||||||
|
HP_SHARE *share= info->s;
|
||||||
DBUG_ENTER("heap_update");
|
DBUG_ENTER("heap_update");
|
||||||
|
|
||||||
test_active(info);
|
test_active(info);
|
||||||
@ -33,20 +34,23 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new)
|
|||||||
if (--(share->records) < share->blength >> 1) share->blength>>= 1;
|
if (--(share->records) < share->blength >> 1) share->blength>>= 1;
|
||||||
share->changed=1;
|
share->changed=1;
|
||||||
|
|
||||||
p_lastinx = share->keydef + info->lastinx;
|
p_lastinx= share->keydef + info->lastinx;
|
||||||
for (keydef = share->keydef, end = keydef + share->keys; keydef < end;
|
for (keydef= share->keydef, end= keydef + share->keys; keydef < end; keydef++)
|
||||||
keydef++)
|
|
||||||
{
|
{
|
||||||
if (hp_rec_key_cmp(keydef, old, heap_new))
|
if (hp_rec_key_cmp(keydef, old, heap_new))
|
||||||
{
|
{
|
||||||
if ((*keydef->delete_key)(info, keydef, old, pos, keydef == p_lastinx) ||
|
if ((*keydef->delete_key)(info, keydef, old, pos, keydef == p_lastinx) ||
|
||||||
(*keydef->write_key)(info, keydef, heap_new, pos))
|
(*keydef->write_key)(info, keydef, heap_new, pos))
|
||||||
goto err;
|
goto err;
|
||||||
|
if (share->auto_key == (uint) (keydef - share->keydef + 1))
|
||||||
|
auto_key_changed= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(pos,heap_new,(size_t) share->reclength);
|
memcpy(pos,heap_new,(size_t) share->reclength);
|
||||||
if (++(share->records) == share->blength) share->blength+= share->blength;
|
if (++(share->records) == share->blength) share->blength+= share->blength;
|
||||||
|
if (auto_key_changed)
|
||||||
|
heap_update_auto_increment(info, heap_new);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
@ -61,6 +61,8 @@ int heap_write(HP_INFO *info, const byte *record)
|
|||||||
info->current_ptr=pos;
|
info->current_ptr=pos;
|
||||||
info->current_hash_ptr=0;
|
info->current_hash_ptr=0;
|
||||||
info->update|=HA_STATE_AKTIV;
|
info->update|=HA_STATE_AKTIV;
|
||||||
|
if (share->auto_key)
|
||||||
|
heap_update_auto_increment(info, record);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
err:
|
err:
|
||||||
DBUG_PRINT("info",("Duplicate key: %d", keydef - share->keydef));
|
DBUG_PRINT("info",("Duplicate key: %d", keydef - share->keydef));
|
||||||
|
@ -50,6 +50,7 @@ typedef struct st_heapinfo /* Struct from heap_info */
|
|||||||
ulong index_length;
|
ulong index_length;
|
||||||
uint reclength; /* Length of one record */
|
uint reclength; /* Length of one record */
|
||||||
int errkey;
|
int errkey;
|
||||||
|
ulonglong auto_increment;
|
||||||
} HEAPINFO;
|
} HEAPINFO;
|
||||||
|
|
||||||
|
|
||||||
@ -115,6 +116,9 @@ typedef struct st_heap_share
|
|||||||
#endif
|
#endif
|
||||||
my_bool delete_on_close;
|
my_bool delete_on_close;
|
||||||
LIST open_list;
|
LIST open_list;
|
||||||
|
uint auto_key;
|
||||||
|
uint auto_key_type; /* real type of the auto key segment */
|
||||||
|
ulonglong auto_increment;
|
||||||
} HP_SHARE;
|
} HP_SHARE;
|
||||||
|
|
||||||
struct st_hp_hash_info;
|
struct st_hp_hash_info;
|
||||||
@ -140,6 +144,13 @@ typedef struct st_heap_info
|
|||||||
LIST open_list;
|
LIST open_list;
|
||||||
} HP_INFO;
|
} HP_INFO;
|
||||||
|
|
||||||
|
typedef struct st_heap_create_info
|
||||||
|
{
|
||||||
|
uint auto_key;
|
||||||
|
uint auto_key_type;
|
||||||
|
ulonglong auto_increment;
|
||||||
|
} HP_CREATE_INFO;
|
||||||
|
|
||||||
/* Prototypes for heap-functions */
|
/* Prototypes for heap-functions */
|
||||||
|
|
||||||
extern HP_INFO *heap_open(const char *name, int mode);
|
extern HP_INFO *heap_open(const char *name, int mode);
|
||||||
@ -152,7 +163,8 @@ extern int heap_scan(register HP_INFO *info, byte *record);
|
|||||||
extern int heap_delete(HP_INFO *info,const byte *buff);
|
extern int heap_delete(HP_INFO *info,const byte *buff);
|
||||||
extern int heap_info(HP_INFO *info,HEAPINFO *x,int flag);
|
extern int heap_info(HP_INFO *info,HEAPINFO *x,int flag);
|
||||||
extern int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
|
extern int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
|
||||||
uint reclength, ulong max_records, ulong min_records);
|
uint reclength, ulong max_records, ulong min_records,
|
||||||
|
HP_CREATE_INFO *create_info);
|
||||||
extern int heap_delete_table(const char *name);
|
extern int heap_delete_table(const char *name);
|
||||||
extern int heap_extra(HP_INFO *info,enum ha_extra_function function);
|
extern int heap_extra(HP_INFO *info,enum ha_extra_function function);
|
||||||
extern int heap_rename(const char *old_name,const char *new_name);
|
extern int heap_rename(const char *old_name,const char *new_name);
|
||||||
@ -163,7 +175,7 @@ extern int heap_rprev(HP_INFO *info,byte *record);
|
|||||||
extern int heap_rfirst(HP_INFO *info,byte *record,int inx);
|
extern int heap_rfirst(HP_INFO *info,byte *record,int inx);
|
||||||
extern int heap_rlast(HP_INFO *info,byte *record,int inx);
|
extern int heap_rlast(HP_INFO *info,byte *record,int inx);
|
||||||
extern void heap_clear(HP_INFO *info);
|
extern void heap_clear(HP_INFO *info);
|
||||||
|
extern void heap_update_auto_increment(HP_INFO *info, const byte *record);
|
||||||
ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key,
|
ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key,
|
||||||
uint start_key_len,
|
uint start_key_len,
|
||||||
enum ha_rkey_function start_search_flag,
|
enum ha_rkey_function start_search_flag,
|
||||||
|
@ -22,14 +22,13 @@ drop table if exists t1,t2;
|
|||||||
create table t1 (b char(0) not null, index(b));
|
create table t1 (b char(0) not null, index(b));
|
||||||
The used table handler can't index column 'b'
|
The used table handler can't index column 'b'
|
||||||
create table t1 (a int not null auto_increment,primary key (a)) type=heap;
|
create table t1 (a int not null auto_increment,primary key (a)) type=heap;
|
||||||
The used table type doesn't support AUTO_INCREMENT columns
|
|
||||||
create table t1 (a int not null,b text) type=heap;
|
create table t1 (a int not null,b text) type=heap;
|
||||||
The used table type doesn't support BLOB/TEXT columns
|
The used table type doesn't support BLOB/TEXT columns
|
||||||
create table t1 (a int ,primary key(a)) type=heap;
|
create table t1 (a int ,primary key(a)) type=heap;
|
||||||
All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead
|
All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap;
|
create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap;
|
||||||
The used table type doesn't support AUTO_INCREMENT columns
|
Incorrect table definition; There can only be one auto column and it must be defined as a key
|
||||||
create table t1 (ordid int(8), primary key (ordid));
|
create table t1 (ordid int(8), primary key (ordid));
|
||||||
All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead
|
All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead
|
||||||
create table not_existing_database.test (a int);
|
create table not_existing_database.test (a int);
|
||||||
|
@ -22,12 +22,12 @@ drop table if exists t1;
|
|||||||
!$1146 create table t2 select auto+1 from t1;
|
!$1146 create table t2 select auto+1 from t1;
|
||||||
drop table if exists t1,t2;
|
drop table if exists t1,t2;
|
||||||
!$1167 create table t1 (b char(0) not null, index(b));
|
!$1167 create table t1 (b char(0) not null, index(b));
|
||||||
!$1164 create table t1 (a int not null auto_increment,primary key (a)) type=heap;
|
create table t1 (a int not null auto_increment,primary key (a)) type=heap;
|
||||||
!$1163 create table t1 (a int not null,b text) type=heap;
|
!$1163 create table t1 (a int not null,b text) type=heap;
|
||||||
!$1171 create table t1 (a int ,primary key(a)) type=heap;
|
!$1171 create table t1 (a int ,primary key(a)) type=heap;
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
|
|
||||||
!$1164 create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap;
|
!$1075 create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap;
|
||||||
!$1171 create table t1 (ordid int(8), primary key (ordid));
|
!$1171 create table t1 (ordid int(8), primary key (ordid));
|
||||||
|
|
||||||
-- error 1044,1
|
-- error 1044,1
|
||||||
|
@ -35,7 +35,9 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked)
|
|||||||
{
|
{
|
||||||
if (!(file= heap_open(name, mode)) && my_errno == ENOENT)
|
if (!(file= heap_open(name, mode)) && my_errno == ENOENT)
|
||||||
{
|
{
|
||||||
if (!create(name, table, NULL))
|
HA_CREATE_INFO create_info;
|
||||||
|
bzero(&create_info, sizeof(create_info));
|
||||||
|
if (!create(name, table, &create_info))
|
||||||
file= heap_open(name, mode);
|
file= heap_open(name, mode);
|
||||||
}
|
}
|
||||||
return (file ? 0 : 1);
|
return (file ? 0 : 1);
|
||||||
@ -51,6 +53,8 @@ int ha_heap::write_row(byte * buf)
|
|||||||
statistic_increment(ha_write_count,&LOCK_status);
|
statistic_increment(ha_write_count,&LOCK_status);
|
||||||
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])
|
||||||
|
update_auto_increment();
|
||||||
return heap_write(file,buf);
|
return heap_write(file,buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,6 +165,8 @@ void ha_heap::info(uint flag)
|
|||||||
index_file_length=info.index_length;
|
index_file_length=info.index_length;
|
||||||
max_data_file_length= info.max_records* info.reclength;
|
max_data_file_length= info.max_records* info.reclength;
|
||||||
delete_length= info.deleted * info.reclength;
|
delete_length= info.deleted * info.reclength;
|
||||||
|
if (flag & HA_STATUS_AUTO)
|
||||||
|
auto_increment_value= info.auto_increment;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ha_heap::extra(enum ha_extra_function operation)
|
int ha_heap::extra(enum ha_extra_function operation)
|
||||||
@ -234,11 +240,11 @@ ha_rows ha_heap::records_in_range(int inx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ha_heap::create(const char *name, TABLE *table,
|
int ha_heap::create(const char *name, TABLE *table,
|
||||||
HA_CREATE_INFO *create_info)
|
HA_CREATE_INFO *create_info)
|
||||||
{
|
{
|
||||||
uint key, parts, mem_per_row= 0;
|
uint key, parts, mem_per_row= 0;
|
||||||
|
uint auto_key= 0, auto_key_type= 0;
|
||||||
ulong max_rows;
|
ulong max_rows;
|
||||||
HP_KEYDEF *keydef;
|
HP_KEYDEF *keydef;
|
||||||
HA_KEYSEG *seg;
|
HA_KEYSEG *seg;
|
||||||
@ -296,19 +302,42 @@ int ha_heap::create(const char *name, TABLE *table,
|
|||||||
seg->null_bit= 0;
|
seg->null_bit= 0;
|
||||||
seg->null_pos= 0;
|
seg->null_pos= 0;
|
||||||
}
|
}
|
||||||
|
if (field->flags & AUTO_INCREMENT_FLAG)
|
||||||
|
{
|
||||||
|
auto_key= key + 1;
|
||||||
|
auto_key_type= field->key_type();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mem_per_row+= MY_ALIGN(table->reclength + 1, sizeof(char*));
|
mem_per_row+= MY_ALIGN(table->reclength + 1, sizeof(char*));
|
||||||
max_rows = (ulong) (current_thd->variables.max_heap_table_size /
|
max_rows = (ulong) (current_thd->variables.max_heap_table_size /
|
||||||
mem_per_row);
|
mem_per_row);
|
||||||
|
HP_CREATE_INFO hp_create_info;
|
||||||
|
hp_create_info.auto_key= auto_key;
|
||||||
|
hp_create_info.auto_key_type= auto_key_type;
|
||||||
|
hp_create_info.auto_increment= (create_info->auto_increment_value ?
|
||||||
|
create_info->auto_increment_value - 1 : 0);
|
||||||
error= heap_create(fn_format(buff,name,"","",4+2),
|
error= heap_create(fn_format(buff,name,"","",4+2),
|
||||||
table->keys,keydef, table->reclength,
|
table->keys,keydef, table->reclength,
|
||||||
((table->max_rows < max_rows && table->max_rows) ?
|
((table->max_rows < max_rows && table->max_rows) ?
|
||||||
table->max_rows : max_rows),
|
table->max_rows : max_rows),
|
||||||
table->min_rows);
|
table->min_rows, &hp_create_info);
|
||||||
my_free((gptr) keydef, MYF(0));
|
my_free((gptr) keydef, MYF(0));
|
||||||
if (file)
|
if (file)
|
||||||
info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE);
|
info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE);
|
||||||
ref_length= sizeof(HEAP_PTR);
|
ref_length= sizeof(HEAP_PTR);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ha_heap::update_create_info(HA_CREATE_INFO *create_info)
|
||||||
|
{
|
||||||
|
table->file->info(HA_STATUS_AUTO);
|
||||||
|
if (!(create_info->used_fields & HA_CREATE_USED_AUTO))
|
||||||
|
create_info->auto_increment_value= auto_increment_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
longlong ha_heap::get_auto_increment()
|
||||||
|
{
|
||||||
|
ha_heap::info(HA_STATUS_AUTO);
|
||||||
|
return auto_increment_value;
|
||||||
|
}
|
||||||
|
@ -40,8 +40,7 @@ class ha_heap: public handler
|
|||||||
ulong table_flags() const
|
ulong table_flags() const
|
||||||
{
|
{
|
||||||
return (HA_READ_RND_SAME | HA_NO_INDEX | HA_KEYPOS_TO_RNDPOS |
|
return (HA_READ_RND_SAME | HA_NO_INDEX | HA_KEYPOS_TO_RNDPOS |
|
||||||
HA_NO_BLOBS | HA_NULL_KEY | HA_REC_NOT_IN_SEQ |
|
HA_NO_BLOBS | HA_NULL_KEY | HA_REC_NOT_IN_SEQ);
|
||||||
HA_NO_AUTO_INCREMENT);
|
|
||||||
}
|
}
|
||||||
ulong index_flags(uint inx) const
|
ulong index_flags(uint inx) const
|
||||||
{
|
{
|
||||||
@ -63,6 +62,7 @@ class ha_heap: public handler
|
|||||||
int write_row(byte * buf);
|
int write_row(byte * buf);
|
||||||
int update_row(const byte * old_data, byte * new_data);
|
int update_row(const byte * old_data, byte * new_data);
|
||||||
int delete_row(const byte * buf);
|
int delete_row(const byte * buf);
|
||||||
|
longlong get_auto_increment();
|
||||||
int index_read(byte * buf, const byte * key,
|
int index_read(byte * buf, const byte * key,
|
||||||
uint key_len, enum ha_rkey_function find_flag);
|
uint key_len, enum ha_rkey_function find_flag);
|
||||||
int index_read_idx(byte * buf, uint idx, const byte * key,
|
int index_read_idx(byte * buf, uint idx, const byte * key,
|
||||||
@ -87,6 +87,7 @@ class ha_heap: public handler
|
|||||||
int delete_table(const char *from);
|
int delete_table(const char *from);
|
||||||
int rename_table(const char * from, const char * to);
|
int rename_table(const char * from, const char * to);
|
||||||
int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info);
|
int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info);
|
||||||
|
void update_create_info(HA_CREATE_INFO *create_info);
|
||||||
|
|
||||||
THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to,
|
THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to,
|
||||||
enum thr_lock_type lock_type);
|
enum thr_lock_type lock_type);
|
||||||
|
Reference in New Issue
Block a user