Commit 7e6bec87 authored by Sergey Petrunya's avatar Sergey Petrunya

MDEV-398: Sergv related to spacial queries

- index_merge/intersection is unable to work on GIS indexes, because:
  1. index scans have no Rowid-Ordered-Retrieval property
  2. When one does an index-only read over a GIS index, they do not 
     get the index tuple, because index only contains bounding box of the geometry.
     This is why key_copy() call crashed.
This patch fixes #1, which makes the problem go away. Theoretically, it would 
be nice to check #2, too, but SE API semantics is not sufficiently precise to do it.
parent 1b84c0cf
...@@ -914,6 +914,28 @@ const char *ha_maria::index_type(uint key_number) ...@@ -914,6 +914,28 @@ const char *ha_maria::index_type(uint key_number)
} }
ulong ha_maria::index_flags(uint inx, uint part, bool all_parts) const
{
ulong flags;
if (table_share->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT)
flags= 0;
else
if ((table_share->key_info[inx].flags & HA_SPATIAL ||
table_share->key_info[inx].algorithm == HA_KEY_ALG_RTREE))
{
/* All GIS scans are non-ROR scans. We also disable IndexConditionPushdown */
flags= HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
HA_READ_ORDER | HA_KEYREAD_ONLY | HA_KEY_SCAN_NOT_ROR;
}
else
{
flags= HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
HA_READ_ORDER | HA_KEYREAD_ONLY | HA_DO_INDEX_COND_PUSHDOWN;
}
return flags;
}
double ha_maria::scan_time() double ha_maria::scan_time()
{ {
if (file->s->data_file_type == BLOCK_RECORD) if (file->s->data_file_type == BLOCK_RECORD)
......
...@@ -64,12 +64,7 @@ class ha_maria :public handler ...@@ -64,12 +64,7 @@ class ha_maria :public handler
const char **bas_ext() const; const char **bas_ext() const;
ulonglong table_flags() const ulonglong table_flags() const
{ return int_table_flags; } { return int_table_flags; }
ulong index_flags(uint inx, uint part, bool all_parts) const ulong index_flags(uint inx, uint part, bool all_parts) const;
{
return ((table_share->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT) ?
0 : HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
HA_READ_ORDER | HA_KEYREAD_ONLY | HA_DO_INDEX_COND_PUSHDOWN);
}
uint max_supported_keys() const uint max_supported_keys() const
{ return MARIA_MAX_KEY; } { return MARIA_MAX_KEY; }
uint max_supported_key_length() const; uint max_supported_key_length() const;
......
...@@ -691,6 +691,28 @@ int ha_myisam::dump(THD* thd, int fd) ...@@ -691,6 +691,28 @@ int ha_myisam::dump(THD* thd, int fd)
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
ulong ha_myisam::index_flags(uint inx, uint part, bool all_parts) const
{
ulong flags;
if (table_share->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT)
flags= 0;
else
if ((table_share->key_info[inx].flags & HA_SPATIAL ||
table_share->key_info[inx].algorithm == HA_KEY_ALG_RTREE))
{
/* All GIS scans are non-ROR scans. We also disable IndexConditionPushdown */
flags= HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
HA_READ_ORDER | HA_KEYREAD_ONLY | HA_KEY_SCAN_NOT_ROR;
}
else
{
flags= HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
HA_READ_ORDER | HA_KEYREAD_ONLY | HA_DO_INDEX_COND_PUSHDOWN;
}
return flags;
}
/* Name is here without an extension */ /* Name is here without an extension */
int ha_myisam::open(const char *name, int mode, uint test_if_locked) int ha_myisam::open(const char *name, int mode, uint test_if_locked)
{ {
......
...@@ -60,12 +60,7 @@ class ha_myisam: public handler ...@@ -60,12 +60,7 @@ class ha_myisam: public handler
int index_end(); int index_end();
int rnd_end(); int rnd_end();
ulong index_flags(uint inx, uint part, bool all_parts) const ulong index_flags(uint inx, uint part, bool all_parts) const;
{
return ((table_share->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT) ?
0 : HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
HA_READ_ORDER | HA_KEYREAD_ONLY | HA_DO_INDEX_COND_PUSHDOWN);
}
uint max_supported_keys() const { return MI_MAX_KEY; } uint max_supported_keys() const { return MI_MAX_KEY; }
uint max_supported_key_length() const { return HA_MAX_KEY_LENGTH; } uint max_supported_key_length() const { return HA_MAX_KEY_LENGTH; }
uint max_supported_key_part_length() const { return HA_MAX_KEY_LENGTH; } uint max_supported_key_part_length() const { return HA_MAX_KEY_LENGTH; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment