diff options
author | Alexey Botchkov <holyfoot@askmonty.org> | 2011-09-22 18:53:36 +0500 |
---|---|---|
committer | Alexey Botchkov <holyfoot@askmonty.org> | 2011-09-22 18:53:36 +0500 |
commit | 5123f59ed2b363ac25fdef374af607f93ec9d762 (patch) | |
tree | a5cca669b6ba71be91edb191f4c4da015d254e64 /sql/gcalc_tools.h | |
parent | d0f2e1e55176c7f674832444ea174c2445058ef7 (diff) | |
download | mariadb-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.h | 60 |
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(); }; |