341
341
return field_type;
344
Item * default_value_item(enum_field_types field_type, bool default_null,
345
string default_value)
344
Item * default_value_item(enum_field_types field_type,
345
const CHARSET_INFO *charset,
346
bool default_null, string default_value,
347
string default_bin_value)
347
349
Item *default_item= NULL;
367
369
default_item= new Item_float(default_value.c_str(), default_value.length());
369
371
case DRIZZLE_TYPE_NULL:
370
374
case DRIZZLE_TYPE_TIMESTAMP:
371
375
case DRIZZLE_TYPE_TIME:
372
376
case DRIZZLE_TYPE_DATETIME:
373
377
case DRIZZLE_TYPE_DATE:
375
case DRIZZLE_TYPE_VARCHAR:
378
if(default_value.compare("NOW()")==0)
380
case DRIZZLE_TYPE_ENUM:
376
381
default_item= new Item_string(default_value.c_str(),
377
382
default_value.length(),
378
383
system_charset_info);
385
case DRIZZLE_TYPE_VARCHAR:
386
case DRIZZLE_TYPE_BLOB: /* Blob is here due to TINYTEXT. Feel the hate. */
387
if(charset==&my_charset_bin)
389
default_item= new Item_string(default_bin_value.c_str(),
390
default_bin_value.length(),
395
default_item= new Item_string(default_value.c_str(),
396
default_value.length(),
397
system_charset_info);
380
400
case DRIZZLE_TYPE_VIRTUAL:
382
402
case DRIZZLE_TYPE_NEWDECIMAL:
650
665
assert(field_offsets && field_pack_length); // TODO: fixme
667
uint32_t interval_count= 0;
668
uint32_t interval_parts= 0;
652
671
for(unsigned int fieldnr=0; fieldnr < share->fields; fieldnr++)
654
673
drizzle::Table::Field pfield= table.field(fieldnr);
751
773
rec_buff_length)))
776
memset(record, 0, rec_buff_length);
780
if(!table_options.pack_record())
782
null_count++; // one bit for delete mark.
754
786
share->default_values= record;
787
share->stored_rec_length= share->reclength;
791
share->intervals= (TYPELIB*)alloc_root(&share->mem_root,
792
interval_count*sizeof(TYPELIB));
795
share->intervals= NULL;
797
/* Now fix the TYPELIBs for the intervals (enum values) */
799
uint32_t interval_nr= 0;
801
for(unsigned int fieldnr=0; fieldnr < share->fields; fieldnr++)
803
drizzle::Table::Field pfield= table.field(fieldnr);
805
if(pfield.type() != drizzle::Table::Field::ENUM)
808
drizzle::Table::Field::SetFieldOptions field_options=
809
pfield.set_options();
811
TYPELIB *t= &(share->intervals[interval_nr]);
813
t->type_names= (const char**)alloc_root(&share->mem_root,
814
(field_options.field_value_size()+1)*sizeof(char*));
816
t->type_lengths= (unsigned int*) alloc_root(&share->mem_root,
817
(field_options.field_value_size()+1)*sizeof(unsigned int));
819
t->type_names[field_options.field_value_size()]= NULL;
820
t->type_lengths[field_options.field_value_size()]= 0;
822
t->count= field_options.field_value_size();
825
for(int n=0; n < field_options.field_value_size(); n++)
827
t->type_names[n]= strmake_root(&share->mem_root,
828
field_options.field_value(n).c_str(),
829
field_options.field_value(n).length());
831
t->type_lengths[n]= field_options.field_value(n).length();
837
/* and read the fields */
756
838
ulong recordpos= 0;
760
842
for(unsigned int fieldnr=0; fieldnr < share->fields; fieldnr++)
869
950
Item *default_value= NULL;
871
952
if(pfield.options().has_default_value()
872
|| pfield.options().has_default_null())
953
|| pfield.options().has_default_null()
954
|| pfield.options().has_default_bin_value())
874
956
default_value= default_value_item(field_type,
875
958
pfield.options().default_null(),
876
pfield.options().default_value());
959
pfield.options().default_value(),
960
pfield.options().default_bin_value());
879
if(pfield.has_constraints() && pfield.constraints().is_nullable())
882
963
uint32_t pack_flag= pfield.pack_flag(); /* TODO: MUST DIE */
884
965
TABLE_SHARE temp_share;
886
memset(&temp_share, 0, sizeof(share));
968
memset(&temp_share, 0, sizeof(temp_share));
969
memset(&temp_table, 0, sizeof(temp_table));
970
temp_table.s= &temp_share;
971
temp_table.in_use= session;
972
temp_table.s->db_low_byte_first= 1; //handler->low_byte_first();
973
temp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
888
975
Field* f= make_field(&temp_share, record+recordpos+data_offset,
889
976
pfield.options().length(),
895
982
(Field::utype) MTYP_TYPENR(unireg_type),
897
// share->intervals+interval_nr-1 :
983
((field_type==DRIZZLE_TYPE_ENUM)?
984
share->intervals+(interval_nr++)
899
986
pfield.name().c_str());
988
f->init(&temp_table);
990
if(!(f->flags & NOT_NULL_FLAG))
992
*f->null_ptr|= f->null_bit;
902
996
if(default_value)
904
998
int res= default_value->save_in_field(f, 1);
905
999
(void)res; // TODO error handle;
1001
else if(f->real_type() == DRIZZLE_TYPE_ENUM &&
1002
(f->flags & NOT_NULL_FLAG))
1005
f->store((int64_t) 1, true);
908
1010
recordpos+= field_pack_length[fieldnr];
1014
We need to set the unused bits to 1. If the number of bits is a multiple
1015
of 8 there are no unused bits.
1019
*(record + null_count / 8)|= ~(((unsigned char) 1 << (null_count & 7)) - 1);
911
1021
free(field_offsets);
912
1022
free(field_pack_length);
1279
1388
/* head+59 was extra_rec_buf_length */
1280
1389
rec_buff_length= ALIGN_SIZE(share->reclength + 1);
1281
share->rec_buff_length= rec_buff_length;
1282
1391
if (!(record= (unsigned char *) alloc_root(&share->mem_root,
1283
1392
rec_buff_length)))
1284
1393
goto err; /* purecov: inspected */
1285
share->default_values= record;
1286
1395
if (pread(file, record, (size_t) share->reclength, record_offset) == 0)
1287
1396
goto err; /* purecov: inspected */
1398
assert(memcmp(share->default_values, record, share->reclength)==0);
1289
1400
lseek(file,pos+288,SEEK_SET);
1291
1402
// share->fields= uint2korr(forminfo+258);
1320
1431
goto err; /* purecov: inspected */
1321
1432
strpos= disk_buff+pos;
1323
share->intervals= (TYPELIB*) (field_ptr+share->fields+1);
1324
interval_array= (const char **) (share->intervals+interval_count);
1434
// share->intervals= (TYPELIB*) (field_ptr+share->fields+1);
1435
interval_array= (const char **) ((field_ptr+share->fields+1)+interval_count);
1325
1436
names= (char*) (interval_array+share->fields+interval_parts+keys+3);
1326
if (!interval_count)
1327
share->intervals= 0; // For better debugging
1328
1438
memcpy(names, strpos+(share->fields*field_pack_length),
1329
1439
(uint32_t) (n_length+int_length));
1330
1440
comment_pos= (char *)(disk_buff+read_length-com_length-vcol_screen_length);
1335
1445
fix_type_pointers(&interval_array, &share->fieldnames, 1, &names);
1336
1446
if (share->fieldnames.count != share->fields)
1338
fix_type_pointers(&interval_array, share->intervals, interval_count,
1342
/* Set ENUM and SET lengths */
1344
for (interval= share->intervals;
1345
interval < share->intervals + interval_count;
1348
uint32_t count= (uint32_t) (interval->count + 1) * sizeof(uint32_t);
1349
if (!(interval->type_lengths= (uint32_t *) alloc_root(&share->mem_root,
1352
for (count= 0; count < interval->count; count++)
1354
char *val= (char*) interval->type_names[count];
1355
interval->type_lengths[count]= strlen(val);
1357
interval->type_lengths[count]= 0;
1361
1449
/* if (keynames)
1362
1450
fix_type_pointers(&interval_array, &share->keynames, 1, &keynames);*/