summaryrefslogtreecommitdiff
path: root/sql/gcalc_tools.h
diff options
context:
space:
mode:
authorAlexey Botchkov <holyfoot@askmonty.org>2011-09-22 18:53:36 +0500
committerAlexey Botchkov <holyfoot@askmonty.org>2011-09-22 18:53:36 +0500
commit5123f59ed2b363ac25fdef374af607f93ec9d762 (patch)
treea5cca669b6ba71be91edb191f4c4da015d254e64 /sql/gcalc_tools.h
parentd0f2e1e55176c7f674832444ea174c2445058ef7 (diff)
downloadmariadb-git-5123f59ed2b363ac25fdef374af607f93ec9d762.tar.gz
fixed bugs
855485 ST_CROSSES returns different result than PostGIS for overlapping polygons 855487 ST_WITHIN returns wrong result for partially overlapping polygons 855492 ST_WITHIN returns TRUE on point on the edge of a polygon 855497 ST_ENVELOPE of GEOMETRYCOLLECTION EMPTY returns NULL and not GEOMETRYCOLLECTION EMPTY 855503 ST_EQUALS reports TRUE between a POLYGON and a MULTILINESTRING 855505 ST_TOUCHES reports TRUE for intersecting polygon and linestring Changed the way weird functions like Crosses or Touches treated. Added BORDER handling to the Gcalc_function. per-file comments: mysql-test/r/gis-precise.result GIS bugs fixed. test result updated. mysql-test/t/gis-precise.test GIS bugs fixed. test cases added. sql/gcalc_slicescan.h GIS bugs fixed. sql/gcalc_tools.cc GIS bugs fixed. sql/gcalc_tools.h GIS bugs fixed. sql/item_create.cc GIS bugs fixed. sql/item_geofunc.cc GIS bugs fixed. sql/item_geofunc.h GIS bugs fixed. sql/spatial.cc GIS bugs fixed.
Diffstat (limited to 'sql/gcalc_tools.h')
-rw-r--r--sql/gcalc_tools.h60
1 files changed, 37 insertions, 23 deletions
diff --git a/sql/gcalc_tools.h b/sql/gcalc_tools.h
index 39704dfeb56..5e98d46a90f 100644
--- a/sql/gcalc_tools.h
+++ b/sql/gcalc_tools.h
@@ -43,23 +43,35 @@ class Gcalc_function
private:
String shapes_buffer;
String function_buffer;
- const char *cur_func;
int *i_states;
- int *saved_i_states;
+ int *b_states;
uint32 cur_object_id;
uint n_shapes;
- int count_internal();
+ int count_internal(const char *cur_func, uint set_type,
+ const char **end);
public:
+ enum value
+ {
+ v_empty= 0x0000000,
+ v_find_t= 0x1000000,
+ v_find_f= 0x2000000,
+ v_t_found= 0x3000000,
+ v_f_found= 0x4000000,
+ v_mask= 0x7000000
+ };
enum op_type
{
- op_shape= 0,
- op_not= 0x80000000,
- op_union= 0x10000000,
- op_intersection= 0x20000000,
+ op_not= 0x80000000,
+ op_shape= 0x00000000,
+ op_union= 0x10000000,
+ op_intersection= 0x20000000,
op_symdifference= 0x30000000,
- op_difference= 0x40000000,
- op_backdifference= 0x50000000,
- op_any= 0x70000000
+ op_difference= 0x40000000,
+ op_repeat= 0x50000000,
+ op_border= 0x60000000,
+ op_internals= 0x70000000,
+ op_false= 0x08000000,
+ op_any= 0x78000000 /* The mask to get any of the operations */
};
enum shape_type
{
@@ -75,10 +87,11 @@ public:
Also adds the shape to the list of operands.
*/
int single_shape_op(shape_type shape_kind, gcalc_shape_info *si);
- void add_operation(op_type operation, uint32 n_operands);
+ void add_operation(uint operation, uint32 n_operands);
void add_not_operation(op_type operation, uint32 n_operands);
- uint32 get_next_operation_pos() { return function_buffer.length(); }
+ uint32 get_next_expression_pos() { return function_buffer.length(); }
void add_operands_to_op(uint32 operation_pos, uint32 n_operands);
+ int repeat_expression(uint32 exp_pos);
void set_cur_obj(uint32 cur_obj) { cur_object_id= cur_obj; }
int reserve_shape_buffer(uint n_shapes);
int reserve_op_buffer(uint n_ops);
@@ -90,20 +103,20 @@ public:
void set_states(int *shape_states) { i_states= shape_states; }
int alloc_states();
- void invert_state(gcalc_shape_info shape) { i_states[shape]^= 1; }
- void set_on_state(gcalc_shape_info shape) { i_states[shape]= 1; }
- int get_state(gcalc_shape_info shape) { return i_states[shape]; }
- void save_states();
- void restore_states();
+ void invert_i_state(gcalc_shape_info shape) { i_states[shape]^= 1; }
+ void set_b_state(gcalc_shape_info shape) { b_states[shape]= 1; }
+ void clear_b_state(gcalc_shape_info shape) { b_states[shape]= 0; }
+ int get_state(gcalc_shape_info shape)
+ { return i_states[shape] | b_states[shape]; }
+ int get_i_state(gcalc_shape_info shape) { return i_states[shape]; }
+ int get_b_state(gcalc_shape_info shape) { return b_states[shape]; }
int count()
- {
- cur_func= function_buffer.ptr();
- return count_internal();
- }
- void clear_state() { bzero(i_states, n_shapes * sizeof(int)); }
+ { return count_internal(function_buffer.ptr(), 0, 0); }
+ void clear_i_states();
+ void clear_b_states();
void reset();
- int find_function(Gcalc_scan_iterator &scan_it);
+ int check_function(Gcalc_scan_iterator &scan_it);
};
@@ -132,6 +145,7 @@ public:
int complete_ring();
int add_point(double x, double y);
int start_collection(int n_objects);
+ int empty_shape();
};