diff options
author | unknown <heikki@hundin.mysql.fi> | 2003-02-18 19:43:41 +0200 |
---|---|---|
committer | unknown <heikki@hundin.mysql.fi> | 2003-02-18 19:43:41 +0200 |
commit | b3fa1d867f29137240c46a6a0396bb9a1c7019fa (patch) | |
tree | 78b5f15491b173d4287553ba50a0ed18b9b4ae52 /innobase/page/page0cur.c | |
parent | 65508b65ba04d499f900259d52d6b16be871ef4a (diff) | |
download | mariadb-git-b3fa1d867f29137240c46a6a0396bb9a1c7019fa.tar.gz |
page0cur.c:
Prepare for 5.x where HA_READ_PREFIX_LAST may pass only a few first bytes of the last field in a key value
ha_innodb.cc:
In 4.0 always assume HA_READ_PREFIX_LAST passes a complete-field prefix of a key value; LIKE queries use a padding trick
sql/ha_innodb.cc:
In 4.0 always assume HA_READ_PREFIX_LAST passes a complete-field prefix of a key value; LIKE queries use a padding trick
innobase/page/page0cur.c:
Prepare for 5.x where HA_READ_PREFIX_LAST may pass only a few first bytes of the last field in a key value
Diffstat (limited to 'innobase/page/page0cur.c')
-rw-r--r-- | innobase/page/page0cur.c | 71 |
1 files changed, 51 insertions, 20 deletions
diff --git a/innobase/page/page0cur.c b/innobase/page/page0cur.c index 0e65dc8b1de..d3a40668c4b 100644 --- a/innobase/page/page0cur.c +++ b/innobase/page/page0cur.c @@ -121,6 +121,53 @@ page_cur_try_search_shortcut( #endif /******************************************************************** +Checks if the nth field in a record is a character type field which extends +the nth field in tuple, i.e., the field is longer or equal in length and has +common first characters. */ +static +ibool +page_cur_rec_field_extends( +/*=======================*/ + /* out: TRUE if rec field extends tuple + field */ + dtuple_t* tuple, /* in: data tuple */ + rec_t* rec, /* in: record */ + ulint n) /* in: compare nth field */ +{ + dtype_t* type; + dfield_t* dfield; + byte* rec_f; + ulint rec_f_len; + + dfield = dtuple_get_nth_field(tuple, n); + + type = dfield_get_type(dfield); + + rec_f = rec_get_nth_field(rec, n, &rec_f_len); + + if (type->mtype == DATA_VARCHAR + || type->mtype == DATA_CHAR + || type->mtype == DATA_FIXBINARY + || type->mtype == DATA_BINARY + || type->mtype == DATA_BLOB + || type->mtype == DATA_VARMYSQL + || type->mtype == DATA_MYSQL) { + + if (dfield_get_len(dfield) != UNIV_SQL_NULL + && rec_f_len != UNIV_SQL_NULL + && rec_f_len >= dfield_get_len(dfield) + && 0 == cmp_data_data_slow(type, dfield_get_data(dfield), + dfield_get_len(dfield), + rec_f, dfield_get_len(dfield))) { + + return(TRUE); + } + } + + return(FALSE); +} + +/******************************************************************** Searches the right position for a page cursor. */ void @@ -239,16 +286,8 @@ page_cur_search_with_match( } else if (cmp == -1) { if (mode == PAGE_CUR_LE_OR_EXTENDS - && dfield_get_len(dtuple_get_nth_field(tuple, - cur_matched_fields)) - == cur_matched_bytes - && rec_get_nth_field_len(mid_rec, - cur_matched_fields) - != UNIV_SQL_NULL) { - - /* This means current dfield is not SQL - NULL, and the current rec field extends it */ - + && page_cur_rec_field_extends(tuple, mid_rec, + cur_matched_fields)) { low = mid; low_matched_fields = cur_matched_fields; low_matched_bytes = cur_matched_bytes; @@ -296,16 +335,8 @@ page_cur_search_with_match( } else if (cmp == -1) { if (mode == PAGE_CUR_LE_OR_EXTENDS - && dfield_get_len(dtuple_get_nth_field(tuple, - cur_matched_fields)) - == cur_matched_bytes - && rec_get_nth_field_len(mid_rec, - cur_matched_fields) - != UNIV_SQL_NULL) { - - /* This means current dfield is not SQL - NULL, and the current rec field extends it */ - + && page_cur_rec_field_extends(tuple, mid_rec, + cur_matched_fields)) { low_rec = mid_rec; low_matched_fields = cur_matched_fields; low_matched_bytes = cur_matched_bytes; |