diff options
author | monty@mysql.com <> | 2004-12-06 02:00:37 +0200 |
---|---|---|
committer | monty@mysql.com <> | 2004-12-06 02:00:37 +0200 |
commit | 67ce24796584e80cf843b37b09aeb794c9231190 (patch) | |
tree | b75e098b12b8e91a3470008602bacbb5b3009e45 /sql/key.cc | |
parent | 46089cfd144be3430f69e2a8b48b0aeee154d6fa (diff) | |
download | mariadb-git-67ce24796584e80cf843b37b09aeb794c9231190.tar.gz |
Add support for up to VARCHAR (size up to 65535)
Renamed HA_VAR_LENGTH to HA_VAR_LENGTH_PART
Renamed in all files FIELD_TYPE_STRING and FIELD_TYPE_VAR_STRING to MYSQL_TYPE_STRING and MYSQL_TYPE_VAR_STRING to make it easy to catch all possible errors
Added support for VARCHAR KEYS to heap
Removed support for ISAM
Now only long VARCHAR columns are changed to TEXT on demand (not CHAR)
Internal temporary files can now use fixed length tables if the used VARCHAR columns are short
Diffstat (limited to 'sql/key.cc')
-rw-r--r-- | sql/key.cc | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/sql/key.cc b/sql/key.cc index 15d84b73beb..dfd924f1dc7 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -106,14 +106,21 @@ void key_copy(byte *to_key, byte *from_record, KEY *key_info, uint key_length) { char *pos; ulong blob_length= ((Field_blob*) key_part->field)->get_length(); - key_length-= 2; + key_length-= HA_KEY_BLOB_LENGTH; ((Field_blob*) key_part->field)->get_ptr(&pos); length=min(key_length, key_part->length); set_if_smaller(blob_length, length); int2store(to_key, (uint) blob_length); - to_key+= 2; // Skip length info + to_key+= HA_KEY_BLOB_LENGTH; // Skip length info memcpy(to_key, pos, blob_length); } + else if (key_part->key_part_flag & HA_VAR_LENGTH_PART) + { + key_length-= HA_KEY_BLOB_LENGTH; + length= min(key_length, key_part->length); + key_part->field->get_key_image(to_key, length, Field::itRAW); + to_key+= HA_KEY_BLOB_LENGTH; + } else { length= min(key_length, key_part->length); @@ -166,12 +173,19 @@ void key_restore(byte *to_record, byte *from_key, KEY *key_info, if (key_part->key_part_flag & HA_BLOB_PART) { uint blob_length= uint2korr(from_key); - from_key+= 2; - key_length-= 2; + from_key+= HA_KEY_BLOB_LENGTH; + key_length-= HA_KEY_BLOB_LENGTH; ((Field_blob*) key_part->field)->set_ptr((ulong) blob_length, (char*) from_key); length= key_part->length; } + else if (key_part->key_part_flag & HA_VAR_LENGTH_PART) + { + key_length-= HA_KEY_BLOB_LENGTH; + length= min(key_length, key_part->length); + key_part->field->set_key_image(from_key, length); + from_key+= HA_KEY_BLOB_LENGTH; + } else { length= min(key_length, key_part->length); @@ -226,9 +240,9 @@ bool key_cmp_if_same(TABLE *table,const byte *key,uint idx,uint key_length) } key++; } - if (key_part->key_part_flag & (HA_BLOB_PART | HA_VAR_LENGTH)) + if (key_part->key_part_flag & (HA_BLOB_PART | HA_VAR_LENGTH_PART)) { - if (key_part->field->key_cmp(key, key_part->length+ HA_KEY_BLOB_LENGTH)) + if (key_part->field->key_cmp(key, key_part->length)) return 1; length=key_part->length+HA_KEY_BLOB_LENGTH; } @@ -248,7 +262,7 @@ bool key_cmp_if_same(TABLE *table,const byte *key,uint idx,uint key_length) } if (cs->coll->strnncollsp(cs, (const uchar*) key, length, - (const uchar*) pos, char_length)) + (const uchar*) pos, char_length, 0)) return 1; } else if (memcmp(key,table->record[0]+key_part->offset,length)) |