summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2021-08-02 10:30:18 +0200
committerOleksandr Byelkin <sanja@mariadb.com>2021-08-02 10:30:18 +0200
commit8b6c8a6ce96c2c8ce6fde16049fcd60eb1547aed (patch)
tree708cf8ba85ac5d07a0ca1ad135d64d575294ce1a
parent2cdf8a932737f5128004742cafbd3d3bb1df14a2 (diff)
downloadmariadb-git-8b6c8a6ce96c2c8ce6fde16049fcd60eb1547aed.tar.gz
Revert "MDEV-26220 Server crashes with indexed by prefix virtual column"
This reverts commit 9b8e207ce03b2ab7a766348738055be9520561bd.
-rw-r--r--mysql-test/suite/gcol/inc/gcol_partition.inc12
-rw-r--r--mysql-test/suite/gcol/r/gcol_partition_innodb.result11
-rw-r--r--mysql-test/suite/gcol/r/gcol_partition_myisam.result11
-rw-r--r--sql/table.cc113
4 files changed, 48 insertions, 99 deletions
diff --git a/mysql-test/suite/gcol/inc/gcol_partition.inc b/mysql-test/suite/gcol/inc/gcol_partition.inc
index 50a743c0153..4e4af4f0023 100644
--- a/mysql-test/suite/gcol/inc/gcol_partition.inc
+++ b/mysql-test/suite/gcol/inc/gcol_partition.inc
@@ -169,15 +169,3 @@ CREATE TABLE t1 (
INSERT INTO t1 () VALUES (),();
UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk;
DROP TABLE t1;
-
---echo #
---echo # MDEV-26220 Server crashes with indexed by prefix virtual column
---echo #
-
-CREATE TABLE t1 (pk INT PRIMARY KEY, a INT, b CHAR(20), c CHAR(20) AS (b),
- KEY (c(10),a)) PARTITION BY HASH(pk);
-INSERT INTO t1 (pk,a,b) VALUES (1,10,'foo'),(2,11,'baz');
-SELECT a FROM t1;
-
-# Cleanup
-DROP TABLE t1;
diff --git a/mysql-test/suite/gcol/r/gcol_partition_innodb.result b/mysql-test/suite/gcol/r/gcol_partition_innodb.result
index e61c0a26417..d3f211c9b9a 100644
--- a/mysql-test/suite/gcol/r/gcol_partition_innodb.result
+++ b/mysql-test/suite/gcol/r/gcol_partition_innodb.result
@@ -104,17 +104,6 @@ INSERT INTO t1 () VALUES (),();
UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk;
DROP TABLE t1;
#
-# MDEV-26220 Server crashes with indexed by prefix virtual column
-#
-CREATE TABLE t1 (pk INT PRIMARY KEY, a INT, b CHAR(20), c CHAR(20) AS (b),
-KEY (c(10),a)) PARTITION BY HASH(pk);
-INSERT INTO t1 (pk,a,b) VALUES (1,10,'foo'),(2,11,'baz');
-SELECT a FROM t1;
-a
-11
-10
-DROP TABLE t1;
-#
# MDEV-16980 Wrongly set tablename len while opening the
# table for purge thread
#
diff --git a/mysql-test/suite/gcol/r/gcol_partition_myisam.result b/mysql-test/suite/gcol/r/gcol_partition_myisam.result
index e54b0ad83c6..75e216f903b 100644
--- a/mysql-test/suite/gcol/r/gcol_partition_myisam.result
+++ b/mysql-test/suite/gcol/r/gcol_partition_myisam.result
@@ -101,17 +101,6 @@ KEY (b,d)
INSERT INTO t1 () VALUES (),();
UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk;
DROP TABLE t1;
-#
-# MDEV-26220 Server crashes with indexed by prefix virtual column
-#
-CREATE TABLE t1 (pk INT PRIMARY KEY, a INT, b CHAR(20), c CHAR(20) AS (b),
-KEY (c(10),a)) PARTITION BY HASH(pk);
-INSERT INTO t1 (pk,a,b) VALUES (1,10,'foo'),(2,11,'baz');
-SELECT a FROM t1;
-a
-11
-10
-DROP TABLE t1;
DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2,t3;
DROP PROCEDURE IF EXISTS p1;
diff --git a/sql/table.cc b/sql/table.cc
index ab2429f469f..b7cf1274400 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -3034,66 +3034,6 @@ static bool check_vcol_forward_refs(Field *field, Virtual_column_info *vcol)
return res;
}
-/**
- Copy keys from share to a table, so that fields in key_parts would match
- fields in a table.
-
- Also if key_part uses a field prefix, clone a field and make its length match
- that prefix.
-
- @retval true if success
- @retval false if memory allocation fails
- */
-static bool initialize_keys(TABLE_SHARE *share, TABLE *outparam)
-{
- if (share->key_parts == 0)
- return true;
- uint n_length= share->keys * sizeof(KEY)
- + share->ext_key_parts * sizeof(KEY_PART_INFO);
-
- KEY *key_info= (KEY*) alloc_root(&outparam->mem_root, n_length);
- if (!key_info)
- return false;
-
- outparam->key_info= key_info;
-
- KEY *key_info_end= key_info + share->keys;
- KEY_PART_INFO *key_part= reinterpret_cast<KEY_PART_INFO*>(key_info_end);
-
- memcpy(key_info, share->key_info, sizeof(*key_info) * share->keys);
- memcpy(key_part, share->key_info[0].key_part, (sizeof(*key_part) *
- share->ext_key_parts));
-
- for ( ; key_info < key_info_end; key_info++)
- {
- key_info->table= outparam;
- key_info->key_part= key_part;
-
- KEY_PART_INFO *key_part_end= key_part + (share->use_ext_keys
- ? key_info->ext_key_parts
- : key_info->user_defined_key_parts);
- for ( ; key_part < key_part_end; key_part++)
- {
- Field *field= key_part->field= outparam->field[key_part->fieldnr - 1];
-
- if (field->key_length() != key_part->length &&
- !(field->flags & BLOB_FLAG))
- {
- /*
- We are using only a prefix of the column as a key:
- Create a new field for the key part that matches the index
- */
- field= key_part->field=field->make_new_field(&outparam->mem_root,
- outparam, 0);
- field->field_length= key_part->length;
- }
- }
- if (!share->use_ext_keys)
- key_part+= key_info->ext_key_parts - key_info->user_defined_key_parts;
- }
- return true;
-}
-
/*
Open a table based on a TABLE_SHARE
@@ -3133,7 +3073,6 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
Field **field_ptr;
uint8 save_context_analysis_only= thd->lex->context_analysis_only;
TABLE_SHARE::enum_v_keys check_set_initialized= share->check_set_initialized;
- bool success;
DBUG_ENTER("open_table_from_share");
DBUG_PRINT("enter",("name: '%s.%s' form: %p", share->db.str,
share->table_name.str, outparam));
@@ -3243,6 +3182,54 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
outparam->found_next_number_field=
outparam->field[(uint) (share->found_next_number_field - share->field)];
+ /* Fix key->name and key_part->field */
+ if (share->key_parts)
+ {
+ KEY *key_info, *key_info_end;
+ KEY_PART_INFO *key_part;
+ uint n_length;
+ n_length= share->keys*sizeof(KEY) + share->ext_key_parts*sizeof(KEY_PART_INFO);
+ if (!(key_info= (KEY*) alloc_root(&outparam->mem_root, n_length)))
+ goto err;
+ outparam->key_info= key_info;
+ key_part= (reinterpret_cast<KEY_PART_INFO*>(key_info+share->keys));
+
+ memcpy(key_info, share->key_info, sizeof(*key_info)*share->keys);
+ memcpy(key_part, share->key_info[0].key_part, (sizeof(*key_part) *
+ share->ext_key_parts));
+
+ for (key_info_end= key_info + share->keys ;
+ key_info < key_info_end ;
+ key_info++)
+ {
+ KEY_PART_INFO *key_part_end;
+
+ key_info->table= outparam;
+ key_info->key_part= key_part;
+
+ key_part_end= key_part + (share->use_ext_keys ? key_info->ext_key_parts :
+ key_info->user_defined_key_parts) ;
+ for ( ; key_part < key_part_end; key_part++)
+ {
+ Field *field= key_part->field= outparam->field[key_part->fieldnr - 1];
+
+ if (field->key_length() != key_part->length &&
+ !(field->flags & BLOB_FLAG))
+ {
+ /*
+ We are using only a prefix of the column as a key:
+ Create a new field for the key part that matches the index
+ */
+ field= key_part->field=field->make_new_field(&outparam->mem_root,
+ outparam, 0);
+ field->field_length= key_part->length;
+ }
+ }
+ if (!share->use_ext_keys)
+ key_part+= key_info->ext_key_parts - key_info->user_defined_key_parts;
+ }
+ }
+
/*
Process virtual and default columns, if any.
*/
@@ -3299,10 +3286,6 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
switch_defaults_to_nullable_trigger_fields(outparam);
}
- success= initialize_keys(share, outparam);
- if (!success)
- goto err;
-
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (share->partition_info_str_len && outparam->file)
{