mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 13:32:33 +01:00
2e814d4702
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
162 lines
4.9 KiB
C
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
|