mariadb/storage/innobase/include/gis0geo.h
Jan Lindström 2e814d4702 Merge InnoDB 5.7 from mysql-5.7.9.
Contains also

MDEV-10547: Test multi_update_innodb fails with InnoDB 5.7

	The failure happened because 5.7 has changed the signature of
	the bool handler::primary_key_is_clustered() const
	virtual function ("const" was added). InnoDB was using the old
	signature which caused the function not to be used.

MDEV-10550: Parallel replication lock waits/deadlock handling does not work with InnoDB 5.7

	Fixed mutexing problem on lock_trx_handle_wait. Note that
	rpl_parallel and rpl_optimistic_parallel tests still
	fail.

MDEV-10156 : Group commit tests fail on 10.2 InnoDB (branch bb-10.2-jan)
  Reason: incorrect merge

MDEV-10550: Parallel replication can't sync with master in InnoDB 5.7 (branch bb-10.2-jan)
  Reason: incorrect merge
2016-09-02 13:22:28 +03:00

162 lines
4.9 KiB
C

/*****************************************************************************
Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
*****************************************************************************/
/**************************************************//**
@file gis0geo.h
The r-tree define from MyISAM
*******************************************************/
#ifndef _gis0geo_h
#define _gis0geo_h
#include "my_global.h"
#include "string.h"
#define SPTYPE HA_KEYTYPE_DOUBLE
#define SPLEN 8
/* Since the mbr could be a point or a linestring, in this case, area of
mbr is 0. So, we define this macro for calculating the area increasing
when we need to enlarge the mbr. */
#define LINE_MBR_WEIGHTS 0.001
/* Types of "well-known binary representation" (wkb) format. */
enum wkbType
{
wkbPoint = 1,
wkbLineString = 2,
wkbPolygon = 3,
wkbMultiPoint = 4,
wkbMultiLineString = 5,
wkbMultiPolygon = 6,
wkbGeometryCollection = 7
};
/* Byte order of "well-known binary representation" (wkb) format. */
enum wkbByteOrder
{
wkbXDR = 0, /* Big Endian */
wkbNDR = 1 /* Little Endian */
};
/** Get the wkb of default POINT value, which represents POINT(0 0)
if it's of dimension 2, etc.
@param[in] n_dims dimensions
@param[out] wkb wkb buffer for default POINT
@param[in] len length of wkb buffer
@return non-0 indicate the length of wkb of the default POINT,
0 if the buffer is too small */
uint
get_wkb_of_default_point(
uint n_dims,
uchar* wkb,
uint len);
/*************************************************************//**
Calculate minimal bounding rectangle (mbr) of the spatial object
stored in "well-known binary representation" (wkb) format.
@return 0 if ok */
int
rtree_mbr_from_wkb(
/*===============*/
uchar* wkb, /*!< in: pointer to wkb. */
uint size, /*!< in: size of wkb. */
uint n_dims, /*!< in: dimensions. */
double* mbr); /*!< in/out: mbr. */
/* Rtree split node structure. */
struct rtr_split_node_t
{
double square; /* square of the mbr.*/
int n_node; /* which group in.*/
uchar* key; /* key. */
double* coords; /* mbr. */
};
/*************************************************************//**
Inline function for reserving coords */
inline
static
double*
reserve_coords(double **d_buffer, /*!< in/out: buffer. */
int n_dim) /*!< in: dimensions. */
/*===========*/
{
double *coords = *d_buffer;
(*d_buffer) += n_dim * 2;
return coords;
}
/*************************************************************//**
Split rtree nodes.
Return which group the first rec is in. */
int
split_rtree_node(
/*=============*/
rtr_split_node_t* node, /*!< in: split nodes.*/
int n_entries, /*!< in: entries number.*/
int all_size, /*!< in: total key's size.*/
int key_size, /*!< in: key's size.*/
int min_size, /*!< in: minimal group size.*/
int size1, /*!< in: size of group.*/
int size2, /*!< in: initial group sizes */
double** d_buffer, /*!< in/out: buffer.*/
int n_dim, /*!< in: dimensions. */
uchar* first_rec); /*!< in: the first rec. */
/*************************************************************//**
Compares two keys a and b depending on nextflag
nextflag can contain these flags:
MBR_INTERSECT(a,b) a overlaps b
MBR_CONTAIN(a,b) a contains b
MBR_DISJOINT(a,b) a disjoint b
MBR_WITHIN(a,b) a within b
MBR_EQUAL(a,b) All coordinates of MBRs are equal
MBR_DATA(a,b) Data reference is the same
Returns 0 on success. */
int
rtree_key_cmp(
/*==========*/
page_cur_mode_t mode, /*!< in: compare method. */
const uchar* b, /*!< in: first key. */
int b_len, /*!< in: first key len. */
const uchar* a, /*!< in: second key. */
int a_len); /*!< in: second key len. */
/*************************************************************//**
Calculates MBR_AREA(a+b) - MBR_AREA(a)
Note: when 'a' and 'b' objects are far from each other,
the area increase can be really big, so this function
can return 'inf' as a result. */
double
rtree_area_increase(
const uchar* a, /*!< in: first mbr. */
const uchar* b, /*!< in: second mbr. */
int a_len, /*!< in: mbr length. */
double* ab_area); /*!< out: increased area. */
/** Calculates overlapping area
@param[in] a mbr a
@param[in] b mbr b
@param[in] mbr_len mbr length
@return overlapping area */
double
rtree_area_overlapping(
const uchar* a,
const uchar* b,
int mbr_len);
#endif