summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorserg@serg.mysql.com <>2002-10-25 14:09:47 +0000
committerserg@serg.mysql.com <>2002-10-25 14:09:47 +0000
commitd552ba7d8a75cbaa676b487c240aa745f12906af (patch)
tree924363f29111df2ea0eb851433529662bc1aa664
parent0ca3212a8cc3bafab07556e5dab2294fce17258a (diff)
downloadmariadb-git-d552ba7d8a75cbaa676b487c240aa745f12906af.tar.gz
support for HA_READ_PREFIX_LAST_OR_PREV in headres
full support for HA_READ_PREFIX_LAST_OR_PREV in MyISAM protected by #if NOT_IMPLEMENTED_YET in opt_range.cc as not all table handlers support it
-rw-r--r--.bzrignore8
-rw-r--r--include/my_base.h25
-rw-r--r--myisam/mi_search.c2
-rw-r--r--myisam/mi_static.c4
-rw-r--r--sql/opt_range.cc12
-rw-r--r--sql/sql_handler.cc2
6 files changed, 35 insertions, 18 deletions
diff --git a/.bzrignore b/.bzrignore
index 0a72b402ca9..bacfe2ff975 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -505,3 +505,11 @@ vio/test-sslserver
vio/viotest-ssl
sql_error.cc
sql_prepare.cc
+autom4te.cache/*
+innobase/autom4te.cache/*
+configure.lineno
+innobase/configure.lineno
+innobase/stamp-h1
+myisam/rt_test.MYD
+myisam/rt_test.MYI
+stamp-h1
diff --git a/include/my_base.h b/include/my_base.h
index 0158f735cc0..7e1df17b69d 100644
--- a/include/my_base.h
+++ b/include/my_base.h
@@ -50,13 +50,14 @@
/* The following is parameter to ha_rkey() how to use key */
enum ha_rkey_function {
- HA_READ_KEY_EXACT, /* Find first record else error */
- HA_READ_KEY_OR_NEXT, /* Record or next record */
- HA_READ_KEY_OR_PREV, /* Record or previous */
- HA_READ_AFTER_KEY, /* Find next rec. after key-record */
- HA_READ_BEFORE_KEY, /* Find next rec. before key-record */
- HA_READ_PREFIX, /* Key which as same prefix */
- HA_READ_PREFIX_LAST, /* Last key with the same prefix */
+ HA_READ_KEY_EXACT, /* Find first record else error */
+ HA_READ_KEY_OR_NEXT, /* Record or next record */
+ HA_READ_KEY_OR_PREV, /* Record or previous */
+ HA_READ_AFTER_KEY, /* Find next rec. after key-record */
+ HA_READ_BEFORE_KEY, /* Find next rec. before key-record */
+ HA_READ_PREFIX, /* Key which as same prefix */
+ HA_READ_PREFIX_LAST, /* Last key with the same prefix */
+ HA_READ_PREFIX_LAST_OR_PREV, /* Last or prev key with the same prefix */
HA_READ_MBR_CONTAIN,
HA_READ_MBR_INTERSECT,
HA_READ_MBR_WITHIN,
@@ -66,7 +67,7 @@ enum ha_rkey_function {
/* Key algorithm types */
-enum ha_key_alg {
+enum ha_key_alg {
HA_KEY_ALG_UNDEF= 0, /* Not specified (old file) */
HA_KEY_ALG_BTREE= 1, /* B-tree, default one */
HA_KEY_ALG_RTREE= 2, /* R-tree, for spatial searches */
@@ -202,7 +203,7 @@ enum ha_base_keytype {
/* Bits in flag to _status */
#define HA_STATUS_POS 1 /* Return position */
-#define HA_STATUS_NO_LOCK 2 /* Don't use external lock */
+#define HA_STATUS_NO_LOCK 2 /* Don't use external lock */
#define HA_STATUS_TIME 4 /* Return update time */
#define HA_STATUS_CONST 8 /* Return constants values */
#define HA_STATUS_VARIABLE 16
@@ -233,7 +234,7 @@ enum ha_base_keytype {
#define HA_ERR_WRONG_TABLE_DEF 143
#define HA_ERR_CRASHED_ON_REPAIR 144 /* Last (automatic?) repair failed */
#define HA_ERR_CRASHED_ON_USAGE 145 /* Table must be repaired */
-#define HA_ERR_LOCK_WAIT_TIMEOUT 146
+#define HA_ERR_LOCK_WAIT_TIMEOUT 146
#define HA_ERR_LOCK_TABLE_FULL 147
#define HA_ERR_READ_ONLY_TRANSACTION 148 /* Updates not allowed */
#define HA_ERR_LOCK_DEADLOCK 149
@@ -272,7 +273,7 @@ enum ha_base_keytype {
#define READ_CHECK_USED 4
#define KEY_READ_USED 8
#define WRITE_CACHE_USED 16
-#define OPT_NO_ROWS 32
+#define OPT_NO_ROWS 32
/* bits in update */
#define HA_STATE_CHANGED 1 /* Database has changed */
@@ -302,7 +303,7 @@ enum data_file_type {
#ifdef BIG_TABLES
typedef my_off_t ha_rows;
#else
-typedef ulong ha_rows;
+typedef ulong ha_rows;
#endif
#define HA_POS_ERROR (~ (ha_rows) 0)
diff --git a/myisam/mi_search.c b/myisam/mi_search.c
index 737bb2fd5d3..8aeccbbf559 100644
--- a/myisam/mi_search.c
+++ b/myisam/mi_search.c
@@ -132,7 +132,7 @@ int _mi_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
if (_mi_get_prev_key(info,keyinfo, buff, info->lastkey, keypos,
&info->lastkey_length))
goto err;
- if ((nextflag & SEARCH_LAST) &&
+ if (!(nextflag & SEARCH_SMALLER) &&
ha_key_cmp(keyinfo->seg, info->lastkey, key, key_len, SEARCH_FIND,
&not_used))
{
diff --git a/myisam/mi_static.c b/myisam/mi_static.c
index 57683a36920..a36c38e3c01 100644
--- a/myisam/mi_static.c
+++ b/myisam/mi_static.c
@@ -51,12 +51,12 @@ uint NEAR myisam_read_vec[]=
{
SEARCH_FIND, SEARCH_FIND | SEARCH_BIGGER, SEARCH_FIND | SEARCH_SMALLER,
SEARCH_NO_FIND | SEARCH_BIGGER, SEARCH_NO_FIND | SEARCH_SMALLER,
- SEARCH_FIND | SEARCH_PREFIX, SEARCH_LAST,
+ SEARCH_FIND | SEARCH_PREFIX, SEARCH_LAST, SEARCH_LAST | SEARCH_SMALLER,
MBR_CONTAIN, MBR_INTERSECT, MBR_WITHIN, MBR_DISJOINT, MBR_EQUAL
};
uint NEAR myisam_readnext_vec[]=
{
SEARCH_BIGGER, SEARCH_BIGGER, SEARCH_SMALLER, SEARCH_BIGGER, SEARCH_SMALLER,
- SEARCH_BIGGER, SEARCH_SMALLER
+ SEARCH_BIGGER, SEARCH_SMALLER, SEARCH_SMALLER
};
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 2b0ac08fe95..ed5916aa0c7 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -2238,7 +2238,7 @@ check_quick_keys(PARAM *param,uint idx,SEL_ARG *key_tree,
{
tmp=param->table->file->
records_in_range((int) keynr,(byte*)(param->min_key + 1),
- min_key_length, (ha_rkey_function)(tmp_min_flag ^ GEOM_FLAG),
+ min_key_length, (ha_rkey_function)(tmp_min_flag ^ GEOM_FLAG),
(byte *)NullS,0,HA_READ_KEY_EXACT);
}
else
@@ -2705,20 +2705,28 @@ int QUICK_SELECT_DESC::get_next()
}
else
{
+ DBUG_ASSERT(range->flag & NEAR_MAX || range_reads_after_key(range));
+#if NOT_IMPLEMENTED_YET
+ result=file->index_read(record, (byte*) range->max_key,
+ range->max_length,
+ ((range->flag & NEAR_MAX) ?
+ HA_READ_BEFORE_KEY : HA_READ_PREFIX_LAST_OR_PREV));
+#else
/* Heikki changed Sept 11, 2002: since InnoDB does not store the cursor
position if READ_KEY_EXACT is used to a primary key with all
key columns specified, we must use below HA_READ_KEY_OR_NEXT,
so that InnoDB stores the cursor position and is able to move
the cursor one step backward after the search. */
- DBUG_ASSERT(range->flag & NEAR_MAX || range_reads_after_key(range));
/* Note: even if max_key is only a prefix, HA_READ_AFTER_KEY will
* do the right thing - go past all keys which match the prefix */
+
result=file->index_read(record, (byte*) range->max_key,
range->max_length,
((range->flag & NEAR_MAX) ?
HA_READ_KEY_OR_NEXT : HA_READ_AFTER_KEY));
result = file->index_prev(record);
+#endif
}
if (result)
{
diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc
index ea15f2e5417..c43869d9d55 100644
--- a/sql/sql_handler.cc
+++ b/sql/sql_handler.cc
@@ -88,7 +88,7 @@ int mysql_ha_close(THD *thd, TABLE_LIST *tables, bool dont_send_ok)
}
static enum enum_ha_read_modes rkey_to_rnext[]=
- { RNEXT, RNEXT, RPREV, RNEXT, RPREV, RNEXT, RPREV };
+ { RNEXT, RNEXT, RPREV, RNEXT, RPREV, RNEXT, RPREV, RPREV };
int mysql_ha_read(THD *thd, TABLE_LIST *tables,