402
400
for(int indx= 0; indx < table.indexes_size(); indx++)
403
401
share->key_parts+= table.indexes(indx).index_part_size();
403
share->key_info= (KEY*) alloc_root(&share->mem_root,
404
table.indexes_size() * sizeof(KEY)
405
+share->key_parts*sizeof(KEY_PART_INFO));
407
KEY_PART_INFO *key_part;
409
key_part= reinterpret_cast<KEY_PART_INFO*>
410
(share->key_info+table.indexes_size());
413
ulong *rec_per_key= (ulong*) alloc_root(&share->mem_root,
414
sizeof(ulong*)*share->key_parts);
416
share->keynames.count= table.indexes_size();
417
share->keynames.name= NULL;
418
share->keynames.type_names= (const char**)
419
alloc_root(&share->mem_root, sizeof(char*) * (table.indexes_size()+1));
421
share->keynames.type_lengths= (unsigned int*)
422
alloc_root(&share->mem_root,
423
sizeof(unsigned int) * (table.indexes_size()+1));
425
share->keynames.type_names[share->keynames.count]= NULL;
426
share->keynames.type_lengths[share->keynames.count]= 0;
428
KEY* keyinfo= share->key_info;
429
for (int keynr=0; keynr < table.indexes_size(); keynr++, keyinfo++)
431
drizzle::Table::Index indx= table.indexes(keynr);
437
keyinfo->flags|= HA_NOSAME;
439
if(indx.has_options())
441
drizzle::Table::Index::IndexOptions indx_options= indx.options();
442
if(indx_options.pack_key())
443
keyinfo->flags|= HA_PACK_KEY;
445
if(indx_options.var_length_key())
446
keyinfo->flags|= HA_VAR_LENGTH_PART;
448
if(indx_options.null_part_key())
449
keyinfo->flags|= HA_NULL_PART_KEY;
451
if(indx_options.binary_pack_key())
452
keyinfo->flags|= HA_BINARY_PACK_KEY;
454
if(indx_options.has_partial_segments())
455
keyinfo->flags|= HA_KEY_HAS_PART_KEY_SEG;
457
if(indx_options.auto_generated_key())
458
keyinfo->flags|= HA_GENERATED_KEY;
460
if(indx_options.has_key_block_size())
462
keyinfo->flags|= HA_USES_BLOCK_SIZE;
463
keyinfo->block_size= indx_options.key_block_size();
467
keyinfo->block_size= 0;
474
case drizzle::Table::Index::UNKNOWN_INDEX:
475
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
477
case drizzle::Table::Index::BTREE:
478
keyinfo->algorithm= HA_KEY_ALG_BTREE;
480
case drizzle::Table::Index::RTREE:
481
keyinfo->algorithm= HA_KEY_ALG_RTREE;
483
case drizzle::Table::Index::HASH:
484
keyinfo->algorithm= HA_KEY_ALG_HASH;
486
case drizzle::Table::Index::FULLTEXT:
487
keyinfo->algorithm= HA_KEY_ALG_FULLTEXT;
490
/* TODO: suitable warning ? */
491
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
495
keyinfo->key_length= indx.key_length();
497
keyinfo->key_parts= indx.index_part_size();
499
keyinfo->key_part= key_part;
500
keyinfo->rec_per_key= rec_per_key;
502
for(unsigned int partnr= 0;
503
partnr < keyinfo->key_parts;
504
partnr++, key_part++)
506
drizzle::Table::Index::IndexPart part;
507
part= indx.index_part(partnr);
511
key_part->field= NULL;
512
key_part->fieldnr= part.fieldnr();
513
key_part->null_bit= 0;
514
/* key_part->offset= ASS ASS ASS. Set later in the frm code */
515
/* key_part->null_offset is only set if null_bit (see later) */
516
/* key_part->key_type= */ /* I *THINK* this may be okay.... */
517
/* key_part->type ???? */
518
key_part->key_part_flag= 0;
519
if(part.has_in_reverse_order())
520
key_part->key_part_flag= part.in_reverse_order()? HA_REVERSE_SORT : 0;
522
key_part->length= part.compare_length();
524
key_part->store_length= key_part->length;
527
if(!indx.has_comment())
529
keyinfo->comment.length= 0;
530
keyinfo->comment.str= NULL;
534
keyinfo->flags|= HA_USES_COMMENT;
535
keyinfo->comment.length= indx.comment().length();
536
keyinfo->comment.str= strmake_root(&share->mem_root,
537
indx.comment().c_str(),
538
keyinfo->comment.length);
541
keyinfo->name= strmake_root(&share->mem_root,
543
indx.name().length());
545
share->keynames.type_names[keynr]= keyinfo->name;
546
share->keynames.type_lengths[keynr]= indx.name().length();
405
549
share->keys_for_keyread.init(0);
406
550
share->keys_in_use.init(share->keys);
586
732
goto err; /* purecov: inspected */
587
733
if (disk_buff[0] & 0x80)
589
share->keys= keys= (disk_buff[1] << 7) | (disk_buff[0] & 0x7f);
590
share->key_parts= key_parts= uint2korr(disk_buff+2);
735
/*share->keys=*/ keys= (disk_buff[1] << 7) | (disk_buff[0] & 0x7f);
736
/*share->key_parts=*/ key_parts= uint2korr(disk_buff+2);
594
share->keys= keys= disk_buff[0];
595
share->key_parts= key_parts= disk_buff[1];
740
/*share->keys= */keys= disk_buff[0];
741
/*share->key_parts=*/ key_parts= disk_buff[1];
597
share->keys_for_keyread.init(0);
598
share->keys_in_use.init(keys);
600
n_length=keys*sizeof(KEY)+key_parts*sizeof(KEY_PART_INFO);
601
if (!(keyinfo = (KEY*) alloc_root(&share->mem_root,
602
n_length + uint2korr(disk_buff+4))))
603
goto err; /* purecov: inspected */
604
memset(keyinfo, 0, n_length);
605
share->key_info= keyinfo;
743
// share->keys_for_keyread.init(0);
744
// share->keys_in_use.init(keys);
746
// n_length=keys*sizeof(KEY)+key_parts*sizeof(KEY_PART_INFO);
747
// if (!(keyinfo = (KEY*) alloc_root(&share->mem_root,
748
// n_length + uint2korr(disk_buff+4))))
750
/* the magic uint2korr(disk_buff+4) is the key names size */
752
// goto err; /* purecov: inspected */
753
// memset(keyinfo, 0, n_length);
754
// share->key_info= keyinfo;
756
keyinfo= share->key_info;
606
757
key_part= reinterpret_cast<KEY_PART_INFO*> (keyinfo+keys);
607
758
strpos=disk_buff+6;
609
if (!(rec_per_key= (ulong*) alloc_root(&share->mem_root,
610
sizeof(ulong*)*key_parts)))
760
// if (!(rec_per_key= (ulong*) alloc_root(&share->mem_root,
761
// sizeof(ulong*)*key_parts)))
613
764
for (i=0 ; i < keys ; i++, keyinfo++)
615
keyinfo->table= 0; // Updated in open_frm
766
// keyinfo->table= 0; // Updated in open_frm
616
767
if (new_frm_ver >= 3)
618
keyinfo->flags= (uint) uint2korr(strpos) ^ HA_NOSAME;
619
keyinfo->key_length= (uint) uint2korr(strpos+2);
620
keyinfo->key_parts= (uint) strpos[4];
621
keyinfo->algorithm= (enum ha_key_alg) strpos[5];
622
keyinfo->block_size= uint2korr(strpos+6);
769
/*keyinfo->flags=*/ (uint) uint2korr(strpos) ^ HA_NOSAME;
770
/*keyinfo->key_length=*/ (uint) uint2korr(strpos+2);
771
/*keyinfo->key_parts=*/ (uint) strpos[4];
772
// /*keyinfo->algorithm=*/ (enum ha_key_alg) strpos[5];
773
// /*keyinfo->block_size=*/ uint2korr(strpos+6);
626
keyinfo->key_part= key_part;
627
keyinfo->rec_per_key= rec_per_key;
777
// keyinfo->key_part= key_part;
778
// keyinfo->rec_per_key= rec_per_key;
628
779
for (j=keyinfo->key_parts ; j-- ; key_part++)
631
key_part->fieldnr= (uint16_t) (uint2korr(strpos) & FIELD_NR_MASK);
782
//key_part->fieldnr= (uint16_t) (uint2korr(strpos) & FIELD_NR_MASK);
632
783
key_part->offset= (uint) uint2korr(strpos+2)-1;
633
784
key_part->key_type= (uint) uint2korr(strpos+5);
634
785
// key_part->field= (Field*) 0; // Will be fixed later
635
786
if (new_frm_ver >= 1)
637
key_part->key_part_flag= *(strpos+4);
638
key_part->length= (uint) uint2korr(strpos+7);
788
//key_part->key_part_flag= *(strpos+4);
789
//key_part->length= (uint) uint2korr(strpos+7);
643
key_part->length= *(strpos+4);
644
key_part->key_part_flag=0;
645
if (key_part->length > 128)
647
key_part->length&=127; /* purecov: inspected */
648
key_part->key_part_flag=HA_REVERSE_SORT; /* purecov: inspected */
794
abort(); // Old FRM version, we abort as we should never see it.
652
key_part->store_length=key_part->length;
796
//key_part->store_length=key_part->length;
655
keynames=(char*) key_part;
656
strpos+= (strcpy(keynames, (char*)strpos)+strlen((char*)strpos)-keynames)+1;
800
// keynames=(char*) key_part;
801
// strpos+= (strcpy(keynames, (char*)strpos)+strlen((char*)strpos)-keynames)+1;
658
803
//reading index comments
659
804
for (keyinfo= share->key_info, i=0; i < keys; i++, keyinfo++)
661
806
if (keyinfo->flags & HA_USES_COMMENT)
663
keyinfo->comment.length= uint2korr(strpos);
664
keyinfo->comment.str= strmake_root(&share->mem_root, (char*) strpos+2,
665
keyinfo->comment.length);
666
strpos+= 2 + keyinfo->comment.length;
808
// keyinfo->comment.length= uint2korr(strpos);
809
// keyinfo->comment.str= strmake_root(&share->mem_root, (char*) strpos+2,
810
// keyinfo->comment.length);
811
strpos+= 2 + uint2korr(strpos);//keyinfo->comment.length;
668
assert(test(keyinfo->flags & HA_USES_COMMENT) ==
669
(keyinfo->comment.length > 0));
813
// assert(test(keyinfo->flags & HA_USES_COMMENT) ==
814
// (keyinfo->comment.length > 0));
672
817
share->reclength = uint2korr((head+16));