diff options
author | unknown <heikki@hundin.mysql.fi> | 2002-07-30 02:07:01 +0300 |
---|---|---|
committer | unknown <heikki@hundin.mysql.fi> | 2002-07-30 02:07:01 +0300 |
commit | 4cdd34f57b5987b6d609761a506e8f238e4ef97f (patch) | |
tree | 58326fa0fcf0d852afc35ad2f0ba662f0ad2c8dd | |
parent | e72fd145e766401a441d31cceada9b3fa00773f2 (diff) | |
download | mariadb-git-4cdd34f57b5987b6d609761a506e8f238e4ef97f.tar.gz |
ha_innobase.h, ha_innobase.cc:
procinfo -> proc_info to make ha_innobase.cc to compile, add more comments about ref
sql/ha_innobase.cc:
procinfo -> proc_info to make ha_innobase.cc to compile, add more comments about ref
sql/ha_innobase.h:
procinfo -> proc_info to make ha_innobase.cc to compile, add more comments about ref
-rw-r--r-- | sql/ha_innobase.cc | 96 | ||||
-rw-r--r-- | sql/ha_innobase.h | 2 |
2 files changed, 59 insertions, 39 deletions
diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 9c732b9c715..49ad21c0a41 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB & InnoDB Oy +/* Copyright (C) 2000 MySQL AB & Innobase Oy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -300,7 +300,7 @@ innobase_mysql_print_thd( if (thd->proc_info) { *buf++=' '; - buf=strnmov(buf, thd->procinfo, 50); + buf=strnmov(buf, thd->proc_info, 50); } if (thd->query) @@ -832,7 +832,7 @@ normalize_table_name( } /********************************************************************* -Creates and opens a handle to a table which already exists in an Innobase +Creates and opens a handle to a table which already exists in an InnoDB database. */ int @@ -903,13 +903,13 @@ ha_innobase::open( primary_key = MAX_KEY; - if (!row_table_got_default_clust_index(ib_table)) { + /* Allocate a buffer for a 'row reference'. A row reference is + a string of bytes of length ref_length which uniquely specifies + a row in our table. Note that MySQL may also compare two row + references for equality by doing a simple memcmp on the strings + of length ref_length! */ - /* If we automatically created the clustered index, - then MySQL does not know about it and it must not be aware - of the index used on scan, to avoid checking if we update - the column of the index. The column is the row id in - the automatical case, and it will not be updated. */ + if (!row_table_got_default_clust_index(ib_table)) { ((row_prebuilt_t*)innobase_prebuilt) ->clust_index_was_generated = FALSE; @@ -917,13 +917,11 @@ ha_innobase::open( primary_key = 0; key_used_on_scan = 0; - /* - MySQL allocates the buffer for ref. - This includes all keys + one byte for each column - that may be NULL. - The ref_length must be exact as possible as - all reference buffers are allocated based on this. - */ + /* MySQL allocates the buffer for ref. key_info->key_length + includes space for all key columns + one byte for each column + that may be NULL. ref_length must be as exact as possible to + save space, because all row reference buffers are allocated + based on ref_length. */ ref_length = table->key_info->key_length; } else { @@ -932,6 +930,14 @@ ha_innobase::open( ref_length = DATA_ROW_ID_LEN; + /* If we automatically created the clustered index, then + MySQL does not know about it, and MySQL must NOT be aware + of the index used on scan, to make it avoid checking if we + update the column of the index. That is why we assert below + that key_used_on_scan is the undefined value MAX_KEY. + The column is the row id in the automatical generation case, + and it will never be updated anyway. */ + DBUG_ASSERT(key_used_on_scan == MAX_KEY); } @@ -1178,7 +1184,8 @@ get_innobase_type_from_mysql_type( } /*********************************************************************** -Stores a key value for a row to a buffer. */ +Stores a key value for a row to a buffer. This must currently only be used +to store a row reference to the 'ref' buffer of this table handle! */ uint ha_innobase::store_key_val_for_row( @@ -1186,7 +1193,8 @@ ha_innobase::store_key_val_for_row( /* out: key value length as stored in buff */ uint keynr, /* in: key number */ char* buff, /* in/out: buffer for the key value (in MySQL - format) */ + format); currently this MUST be the 'ref' + buffer! */ const mysql_byte* record)/* in: row in MySQL format */ { KEY* key_info = table->key_info + keynr; @@ -1214,11 +1222,12 @@ ha_innobase::store_key_val_for_row( buff += key_part->length; } - /* - We have to zero-fill the buffer to be able to compare two - keys to see if they are equal - */ - bzero(buff, (ref_length- (uint) (buff - buff_start))); + /* We have to zero-fill the 'ref' buffer so that MySQL is able to + use a simple memcmp to compare two key values to determine if they are + equal */ + + bzero(buff, (ref_length - (uint) (buff - buff_start))); + DBUG_RETURN(ref_length); } @@ -1904,7 +1913,10 @@ ha_innobase::index_read( row */ const mysql_byte* key_ptr,/* in: key value; if this is NULL we position the cursor at the - start or end of index */ + start or end of index; this can + also contain an InnoDB row id, in + which case key_len is the InnoDB + row id length */ uint key_len,/* in: key value length */ enum ha_rkey_function find_flag)/* in: search flags from my_base.h */ { @@ -1931,10 +1943,8 @@ ha_innobase::index_read( index = prebuilt->index; - /* Note that if the select is used for an update, we always - fetch the clustered index record: therefore the index for which the - template is built is not necessarily prebuilt->index, but can also - be the clustered index */ + /* Note that if the index for which the search template is built is not + necessarily prebuilt->index, but can also be the clustered index */ if (prebuilt->sql_stat_start) { build_template(prebuilt, user_thd, table, @@ -1942,6 +1952,9 @@ ha_innobase::index_read( } if (key_ptr) { + /* Convert the search key value to InnoDB format into + prebuilt->search_tuple */ + row_sel_convert_mysql_key_to_innobase(prebuilt->search_tuple, (byte*) key_val_buff, index, @@ -2289,8 +2302,7 @@ ha_innobase::rnd_next( } /************************************************************************** -Fetches a row from the table based on a reference. TODO: currently we use -'ref_stored_len' of the handle as the key length. This may change. */ +Fetches a row from the table based on a row reference. */ int ha_innobase::rnd_pos( @@ -2298,7 +2310,11 @@ ha_innobase::rnd_pos( /* out: 0, HA_ERR_KEY_NOT_FOUND, or error code */ mysql_byte* buf, /* in/out: buffer for the row */ - mysql_byte* pos) /* in: primary key value in MySQL format */ + mysql_byte* pos) /* in: primary key value of the row in the + MySQL format, or the row id if the clustered + index was internally generated by InnoDB; + the length of data in pos has to be + ref_length */ { row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; int error; @@ -2314,7 +2330,7 @@ ha_innobase::rnd_pos( /* No primary key was defined for the table and we generated the clustered index from the row id: the row reference is the row id, not any key value - that MySQL knows */ + that MySQL knows of */ error = change_active_index(MAX_KEY); } else { @@ -2325,7 +2341,10 @@ ha_innobase::rnd_pos( DBUG_RETURN(error); } - error = index_read(buf, pos, ref_stored_len, HA_READ_KEY_EXACT); + /* Note that we assume the length of the row reference is fixed + for the table, and it is == ref_length */ + + error = index_read(buf, pos, ref_length, HA_READ_KEY_EXACT); change_active_index(keynr); @@ -2334,7 +2353,8 @@ ha_innobase::rnd_pos( /************************************************************************* Stores a reference to the current row to 'ref' field of the handle. Note -that the function parameter is illogical: we must assume that 'record' +that in the case where we have generated the clustered index for the +table, the function parameter is illogical: we MUST ASSUME that 'record' is the current 'position' of the handle, because if row ref is actually the row id internally generated in InnoDB, then 'record' does not contain it. We just guess that the row id must be for the record where the handle @@ -2355,7 +2375,7 @@ ha_innobase::position( /* No primary key was defined for the table and we generated the clustered index from row id: the row reference will be the row id, not any key value - that MySQL knows */ + that MySQL knows of */ len = DATA_ROW_ID_LEN; @@ -2364,9 +2384,11 @@ ha_innobase::position( len = store_key_val_for_row(primary_key, (char*) ref, record); } - DBUG_ASSERT(len == ref_length); + /* Since we do not store len to the buffer 'ref', we must assume + that len is always fixed for this table. The following assertion + checks this. */ - ref_stored_len = len; + DBUG_ASSERT(len == ref_length); } /********************************************************************* diff --git a/sql/ha_innobase.h b/sql/ha_innobase.h index aa497132b25..4a9f3a6251b 100644 --- a/sql/ha_innobase.h +++ b/sql/ha_innobase.h @@ -51,8 +51,6 @@ class ha_innobase: public handler byte* key_val_buff; /* buffer used in converting search key values from MySQL format to Innobase format */ - uint ref_stored_len; /* length of the key value stored to - 'ref' buffer of the handle, if any */ ulong int_option_flag; uint primary_key; uint last_dup_key; |