InnoDB: Remove dead code for DATA_POINT and DATA_VAR_POINT

The POINT data type is being treated just like any other
geometry data type in InnoDB. The fixed-length data type
DATA_POINT had been introduced in WL#6942 based on a
misunderstanding and without appropriate review.
Because of fundamental design problems (such as a
DEFAULT POINT(0 0) value secretly introduced by InnoDB),
the code was disabled in Oracle Bug#20415831 fix.

This patch removes the dead code and definitions that were
left behind by the Oracle Bug#20415831 patch.
This commit is contained in:
Marko Mäkelä 2017-07-03 11:47:54 +03:00
commit 56ff6f1b0b
13 changed files with 17 additions and 187 deletions

View file

@ -4673,29 +4673,12 @@ btr_index_rec_validate(
rec_get_nth_field_offs(offsets, i, &len);
/* Note that if fixed_size != 0, it equals the
length of a fixed-size column in the clustered index,
except the DATA_POINT, whose length would be MBR_LEN
when it's indexed in a R-TREE. We should adjust it here.
length of a fixed-size column in the clustered index.
We should adjust it here.
A prefix index of the column is of fixed, but different
length. When fixed_size == 0, prefix_len is the maximum
length of the prefix index column. */
if (dict_field_get_col(field)->mtype == DATA_POINT) {
ut_ad(fixed_size == DATA_POINT_LEN);
if (dict_index_is_spatial(index)) {
/* For DATA_POINT data, when it has R-tree
index, the fixed_len is the MBR of the point.
But if it's a primary key and on R-TREE
as the PK pointer, the length shall be
DATA_POINT_LEN as well. */
ut_ad((field->fixed_len == DATA_MBR_LEN
&& i == 0)
|| (field->fixed_len == DATA_POINT_LEN
&& i != 0));
fixed_size = field->fixed_len;
}
}
if ((field->prefix_len == 0
&& len != UNIV_SQL_NULL && fixed_size
&& len != fixed_size)

View file

@ -193,14 +193,6 @@ dtype_print(const dtype_t* type)
fputs("DATA_BLOB", stderr);
break;
case DATA_POINT:
fputs("DATA_POINT", stderr);
break;
case DATA_VAR_POINT:
fputs("DATA_VAR_POINT", stderr);
break;
case DATA_GEOMETRY:
fputs("DATA_GEOMETRY", stderr);
break;

View file

@ -2891,22 +2891,9 @@ dict_index_add_col(
field = dict_index_get_nth_field(index, index->n_def - 1);
field->col = col;
/* DATA_POINT is a special type, whose fixed_len should be:
1) DATA_MBR_LEN, when it's indexed in R-TREE. In this case,
it must be the first col to be added.
2) DATA_POINT_LEN(be equal to fixed size of column), when it's
indexed in B-TREE,
3) DATA_POINT_LEN, if a POINT col is the PRIMARY KEY, and we are
adding the PK col to other B-TREE/R-TREE. */
/* TODO: We suppose the dimension is 2 now. */
if (dict_index_is_spatial(index) && DATA_POINT_MTYPE(col->mtype)
&& index->n_def == 1) {
field->fixed_len = DATA_MBR_LEN;
} else {
field->fixed_len = static_cast<unsigned int>(
dict_col_get_fixed_size(
col, dict_table_is_comp(table)));
}
field->fixed_len = static_cast<unsigned int>(
dict_col_get_fixed_size(
col, dict_table_is_comp(table)));
if (prefix_len && field->fixed_len > prefix_len) {
field->fixed_len = (unsigned int) prefix_len;

View file

@ -5971,14 +5971,6 @@ innobase_match_index_columns(
spatial index on it and we intend to use DATA_GEOMETRY
for legacy GIS data types which are of var-length. */
switch (col_type) {
case DATA_POINT:
case DATA_VAR_POINT:
if (DATA_POINT_MTYPE(mtype)
|| mtype == DATA_GEOMETRY
|| mtype == DATA_BLOB) {
break;
}
/* Fall through */
case DATA_GEOMETRY:
if (mtype == DATA_BLOB) {
break;
@ -7969,12 +7961,6 @@ build_template_field(
prebuilt->templ_contains_blob = TRUE;
}
if (templ->type == DATA_POINT) {
/* We set this only when it's DATA_POINT, but not
DATA_VAR_POINT */
prebuilt->templ_contains_fixed_point = TRUE;
}
return(templ);
}
@ -8059,7 +8045,6 @@ ha_innobase::build_template(
/* Prepare to build m_prebuilt->mysql_template[]. */
m_prebuilt->templ_contains_blob = FALSE;
m_prebuilt->templ_contains_fixed_point = FALSE;
m_prebuilt->mysql_prefix_len = 0;
m_prebuilt->n_template = 0;
m_prebuilt->idx_cond_n_cols = 0;
@ -8950,8 +8935,6 @@ calc_row_difference(
switch (col_type) {
case DATA_BLOB:
case DATA_POINT:
case DATA_VAR_POINT:
case DATA_GEOMETRY:
o_ptr = row_mysql_read_blob_ref(&o_len, o_ptr, o_len);
n_ptr = row_mysql_read_blob_ref(&n_len, n_ptr, n_len);
@ -11714,10 +11697,6 @@ create_table_info_t::create_table_def()
}
}
if (col_type == DATA_POINT) {
col_len = DATA_POINT_LEN;
}
is_virtual = (innobase_is_v_fld(field)) ? DATA_VIRTUAL : 0;
is_stored = innobase_is_s_fld(field);

View file

@ -1760,7 +1760,6 @@ innobase_col_to_mysql(
memcpy(dest, data, len);
break;
case DATA_VAR_POINT:
case DATA_GEOMETRY:
case DATA_BLOB:
/* Skip MySQL BLOBs when reporting an erroneous row
@ -1785,7 +1784,6 @@ innobase_col_to_mysql(
case DATA_FLOAT:
case DATA_DOUBLE:
case DATA_DECIMAL:
case DATA_POINT:
/* Above are the valid column types for MySQL data. */
ut_ad(flen == len);
/* fall through */
@ -3011,29 +3009,6 @@ innobase_check_foreigns(
return(false);
}
/** Get the default POINT value in MySQL format
@param[in] heap memory heap where allocated
@param[in] length length of MySQL format
@return mysql format data */
static
const byte*
innobase_build_default_mysql_point(
mem_heap_t* heap,
ulint length)
{
byte* buf = static_cast<byte*>(mem_heap_alloc(
heap, DATA_POINT_LEN + length));
byte* wkb = buf + length;
ulint len = get_wkb_of_default_point(SPDIMS, wkb, DATA_POINT_LEN);
ut_ad(len == DATA_POINT_LEN);
row_mysql_store_blob_ref(buf, length, wkb, len);
return(buf);
}
/** Convert a default value for ADD COLUMN.
@param heap Memory heap where allocated
@ -3060,16 +3035,6 @@ innobase_build_col_map_add(
const byte* mysql_data = field->ptr;
if (dfield_get_type(dfield)->mtype == DATA_POINT) {
/** If the DATA_POINT field is NOT NULL, we need to
give it a default value, since DATA_POINT is a fixed length
type, we couldn't store a value of length 0, like other
geom types. Server doesn't provide the default value, and
we would use POINT(0 0) here instead. */
mysql_data = innobase_build_default_mysql_point(heap, size);
}
row_mysql_store_col_in_innobase_format(
dfield, buf, true, mysql_data, size, comp);
}
@ -4703,12 +4668,6 @@ prepare_inplace_alter_table_dict(
}
if (col_type == DATA_POINT) {
/* DATA_POINT should be of fixed length,
instead of the pack_length(blob length). */
col_len = DATA_POINT_LEN;
}
if (dict_col_name_is_reserved(field->field_name)) {
dict_mem_table_free(ctx->new_table);
my_error(ER_WRONG_COLUMN_NAME, MYF(0),

View file

@ -77,28 +77,18 @@ binary strings */
charset-collation for tables created with it
can also be latin1_swedish_ci */
/* DATA_POINT&DATA_VAR_POINT are for standard geometry datatype 'point' and
DATA_GEOMETRY include all other standard geometry datatypes as described in
OGC standard(line_string, polygon, multi_point, multi_polygon,
/* DATA_GEOMETRY includes all standard geometry datatypes as described in
OGC standard(point, line_string, polygon, multi_point, multi_polygon,
multi_line_string, geometry_collection, geometry).
Currently, geometry data is stored in the standard Well-Known Binary(WKB)
format (http://www.opengeospatial.org/standards/sfa).
We use BLOB as underlying datatype for DATA_GEOMETRY and DATA_VAR_POINT
while CHAR for DATA_POINT */
We use BLOB as the underlying datatype. */
#define DATA_GEOMETRY 14 /* geometry datatype of variable length */
/* The following two are disabled temporarily, we won't create them in
get_innobase_type_from_mysql_type().
TODO: We will enable DATA_POINT/them when we come to the fixed-length POINT
again. */
#define DATA_POINT 15 /* geometry datatype of fixed length POINT */
#define DATA_VAR_POINT 16 /* geometry datatype of variable length
POINT, used when we want to store POINT
as BLOB internally */
#define DATA_MTYPE_MAX 63 /* dtype_store_for_order_and_null_size()
requires the values are <= 63 */
#define DATA_MTYPE_CURRENT_MIN DATA_VARCHAR /* minimum value of mtype */
#define DATA_MTYPE_CURRENT_MAX DATA_VAR_POINT /* maximum value of mtype */
#define DATA_MTYPE_CURRENT_MAX DATA_GEOMETRY /* maximum value of mtype */
/*-------------------------------------------*/
/* The 'PRECISE TYPE' of a column */
/*
@ -211,15 +201,6 @@ store the charset-collation number; one byte is left unused, though */
/* Maximum multi-byte character length in bytes, plus 1 */
#define DATA_MBMAX 5
/* For DATA_POINT of dimension 2, the length of value in btree is always 25,
which is the summary of:
SRID_SIZE(4) + WKB_HEADER_SIZE(1+4) + POINT_DATA_SIZE(8*2).
So the length of physical record or POINT KEYs on btree are 25.
GIS_TODO: When we support multi-dimensions DATA_POINT, we should get the
length from corresponding column or index definition, instead of this MACRO
*/
#define DATA_POINT_LEN 25
/* Pack mbminlen, mbmaxlen to mbminmaxlen. */
#define DATA_MBMINMAXLEN(mbminlen, mbmaxlen) \
unsigned((mbmaxlen) * DATA_MBMAX + (mbminlen))
@ -229,18 +210,12 @@ length from corresponding column or index definition, instead of this MACRO
/* Get mbmaxlen from mbminmaxlen. */
#define DATA_MBMAXLEN(mbminmaxlen) unsigned((mbminmaxlen) / DATA_MBMAX)
/* For checking if a geom_type is POINT */
#define DATA_POINT_MTYPE(mtype) ((mtype) == DATA_POINT \
|| (mtype) == DATA_VAR_POINT)
/* For checking if mtype is GEOMETRY datatype */
#define DATA_GEOMETRY_MTYPE(mtype) (DATA_POINT_MTYPE(mtype) \
|| (mtype) == DATA_GEOMETRY)
#define DATA_GEOMETRY_MTYPE(mtype) ((mtype) == DATA_GEOMETRY)
/* For checking if mtype is BLOB or GEOMETRY, since we use BLOB as
the underling datatype of GEOMETRY(not DATA_POINT) data. */
the underlying datatype of GEOMETRY data. */
#define DATA_LARGE_MTYPE(mtype) ((mtype) == DATA_BLOB \
|| (mtype) == DATA_VAR_POINT \
|| (mtype) == DATA_GEOMETRY)
/* For checking if data type is big length data type. */

View file

@ -504,7 +504,6 @@ dtype_get_fixed_size_low(
case DATA_INT:
case DATA_FLOAT:
case DATA_DOUBLE:
case DATA_POINT:
return(len);
case DATA_MYSQL:
if (prtype & DATA_BINARY_TYPE) {
@ -533,7 +532,6 @@ dtype_get_fixed_size_low(
case DATA_BINARY:
case DATA_DECIMAL:
case DATA_VARMYSQL:
case DATA_VAR_POINT:
case DATA_GEOMETRY:
case DATA_BLOB:
return(0);
@ -580,7 +578,6 @@ dtype_get_min_size_low(
case DATA_INT:
case DATA_FLOAT:
case DATA_DOUBLE:
case DATA_POINT:
return(len);
case DATA_MYSQL:
if (prtype & DATA_BINARY_TYPE) {
@ -603,7 +600,6 @@ dtype_get_min_size_low(
case DATA_BINARY:
case DATA_DECIMAL:
case DATA_VARMYSQL:
case DATA_VAR_POINT:
case DATA_GEOMETRY:
case DATA_BLOB:
return(0);
@ -637,9 +633,7 @@ dtype_get_max_size_low(
case DATA_BINARY:
case DATA_DECIMAL:
case DATA_VARMYSQL:
case DATA_POINT:
return(len);
case DATA_VAR_POINT:
case DATA_GEOMETRY:
case DATA_BLOB:
break;

View file

@ -681,12 +681,6 @@ struct row_prebuilt_t {
not to be confused with InnoDB
externally stored columns
(VARCHAR can be off-page too) */
unsigned templ_contains_fixed_point:1;/*!< TRUE if the
template contains a column with
DATA_POINT. Since InnoDB regards
DATA_POINT as non-BLOB type, the
templ_contains_blob can't tell us
if there is DATA_POINT */
mysql_row_templ_t* mysql_template;/*!< template used to transform
rows fast between MySQL and Innobase
formats; memory for this template

View file

@ -378,8 +378,6 @@ cmp_whole_field(
case DATA_MYSQL:
return(innobase_mysql_cmp(prtype,
a, a_length, b, b_length));
case DATA_POINT:
case DATA_VAR_POINT:
case DATA_GEOMETRY:
return(cmp_geometry_field(mtype, prtype, a, a_length, b,
b_length));
@ -437,11 +435,6 @@ cmp_data(
case DATA_SYS:
pad = ULINT_UNDEFINED;
break;
case DATA_POINT:
case DATA_VAR_POINT:
/* Since DATA_POINT has a fixed length of DATA_POINT_LEN,
currently, pad is not needed. Meanwhile, DATA_VAR_POINT acts
the same as DATA_GEOMETRY */
case DATA_GEOMETRY:
ut_ad(prtype & DATA_BINARY_TYPE);
pad = ULINT_UNDEFINED;

View file

@ -308,7 +308,6 @@ rec_init_offsets_comp_ordinary(
if (!field->fixed_len
|| (temp && !dict_col_get_fixed_size(col, temp))) {
ut_ad(col->mtype != DATA_POINT);
/* Variable-length field: read the length */
len = *lens--;
/* If the maximum length of the field is up
@ -445,9 +444,6 @@ rec_init_offsets(
if (UNIV_UNLIKELY(!field->fixed_len)) {
const dict_col_t* col
= dict_field_get_col(field);
/* DATA_POINT should always be a fixed
length column. */
ut_ad(col->mtype != DATA_POINT);
/* Variable-length field: read the length */
len = *lens--;
/* If the maximum length of the field
@ -858,8 +854,6 @@ rec_get_converted_size_comp_prefix_low(
}
ut_ad(len <= col->len || DATA_LARGE_MTYPE(col->mtype)
|| (DATA_POINT_MTYPE(col->mtype)
&& len == DATA_MBR_LEN)
|| (col->len == 0 && col->mtype == DATA_VARCHAR));
fixed_len = field->fixed_len;
@ -1337,8 +1331,6 @@ rec_convert_dtuple_to_rec_comp(
*lens-- = (byte) (len >> 8) | 0xc0;
*lens-- = (byte) len;
} else {
/* DATA_POINT would have a fixed_len */
ut_ad(dtype_get_mtype(type) != DATA_POINT);
ut_ad(len <= dtype_get_len(type)
|| DATA_LARGE_MTYPE(dtype_get_mtype(type))
|| !strcmp(index->name,

View file

@ -840,9 +840,7 @@ row_merge_buf_add(
}
ut_ad(len <= col->len
|| DATA_LARGE_MTYPE(col->mtype)
|| (col->mtype == DATA_POINT
&& len == DATA_MBR_LEN));
|| DATA_LARGE_MTYPE(col->mtype));
fixed_len = ifield->fixed_len;
if (fixed_len && !dict_table_is_comp(index->table)

View file

@ -628,8 +628,6 @@ row_mysql_store_col_in_innobase_format(
ptr = row_mysql_read_blob_ref(&col_len, mysql_data, col_len);
} else if (DATA_GEOMETRY_MTYPE(type)) {
/* We use blob to store geometry data except DATA_POINT
internally, but in MySQL Layer the datatype is always blob. */
ptr = row_mysql_read_geometry(&col_len, mysql_data, col_len);
}

View file

@ -2619,10 +2619,9 @@ row_sel_convert_mysql_key_to_innobase(
data_field_len = data_offset + data_len;
} else {
/* The key field is a column prefix of a BLOB
or TEXT, except DATA_POINT of GEOMETRY. */
or TEXT. */
ut_a(field->prefix_len > 0
|| DATA_POINT_MTYPE(type));
ut_a(field->prefix_len > 0);
/* MySQL stores the actual data length to the
first 2 bytes after the optional SQL NULL
@ -2632,18 +2631,12 @@ row_sel_convert_mysql_key_to_innobase(
seems to reserve field->prefix_len bytes for
storing this field in the key value buffer,
even though the actual value only takes data
len bytes from the start.
For POINT of GEOMETRY, which has no prefix
because it's now a fixed length type in
InnoDB, we have to get DATA_POINT_LEN bytes,
which is original prefix length of POINT. */
len bytes from the start. */
data_len = key_ptr[data_offset]
+ 256 * key_ptr[data_offset + 1];
data_field_len = data_offset + 2
+ (type == DATA_POINT
? DATA_POINT_LEN
: field->prefix_len);
+ field->prefix_len;
data_offset += 2;
@ -2905,8 +2898,6 @@ row_sel_field_store_in_mysql_format_func(
len);
break;
case DATA_POINT:
case DATA_VAR_POINT:
case DATA_GEOMETRY:
/* We store all geometry data as BLOB data at server layer. */
row_mysql_store_geometry(dest, templ->mysql_col_len, data, len);
@ -3027,7 +3018,6 @@ row_sel_store_mysql_field_func(
/* Copy an externally stored field to a temporary heap */
ut_ad(field_no == templ->clust_rec_field_no);
ut_ad(templ->type != DATA_POINT);
if (DATA_LARGE_MTYPE(templ->type)) {
if (prebuilt->blob_heap == NULL) {
@ -3107,10 +3097,7 @@ row_sel_store_mysql_field_func(
will be invalid as soon as the
mini-transaction is committed and the page
latch on the clustered index page is
released.
For DATA_POINT, it's stored like CHAR in InnoDB,
but it should be a BLOB field in MySQL layer. So we
still treated it as BLOB here. */
released. */
if (prebuilt->blob_heap == NULL) {
prebuilt->blob_heap = mem_heap_create(
@ -5369,7 +5356,6 @@ requires_clust_rec:
&& prebuilt->select_lock_type == LOCK_NONE
&& !prebuilt->m_no_prefetch
&& !prebuilt->templ_contains_blob
&& !prebuilt->templ_contains_fixed_point
&& !prebuilt->clust_index_was_generated
&& !prebuilt->used_in_HANDLER
&& prebuilt->template_type != ROW_MYSQL_DUMMY_TEMPLATE