Below is the list of changes that have just been committed into a local
5.0 repository of heikki. When heikki does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.1824 05/03/16 14:28:54 heikki@stripped +7 -0
data0type.h, row0sel.c:
Fix a crash in a simple search with a key: the dtype->len of a true VARCHAR is the payload maximum len in bytes: it does not include the 2 bytes MySQL uses to store the string length
ha_innodb.cc:
Fix a crash in true VARCHARs in test-innodb: we passed a wrong pointer to the column conversion in an UPDATE
rowid_order_innodb.result, ps_3innodb.result, innodb.result, endspace.result:
Edit InnoDB test results to reflect the arrival of true VARCHARs
innobase/include/data0type.h
1.19 05/03/16 14:27:21 heikki@stripped +11 -2
Fix a crash in a simple search with a key: the dtype->len of a true VARCHAR is the payload maximum len in bytes: it does not include the 2 bytes MySQL uses to store the string length
innobase/row/row0sel.c
1.80 05/03/16 14:27:06 heikki@stripped +20 -12
Fix a crash in a simple search with a key: the dtype->len of a true VARCHAR is the payload maximum len in bytes: it does not include the 2 bytes MySQL uses to store the string length
sql/ha_innodb.cc
1.178 05/03/16 14:25:35 heikki@stripped +11 -7
Fix a crash in true VARCHARs in test-innodb: we passed a wrong pointer to the column conversion in an UPDATE
mysql-test/r/rowid_order_innodb.result
1.5 05/03/16 14:23:52 heikki@stripped +1 -1
Edit InnoDB test results to reflect the arrival of true VARCHARs
mysql-test/r/ps_3innodb.result
1.25 05/03/16 14:23:51 heikki@stripped +5 -5
Edit InnoDB test results to reflect the arrival of true VARCHARs
mysql-test/r/innodb.result
1.102 05/03/16 14:23:48 heikki@stripped +4 -5
Edit InnoDB test results to reflect the arrival of true VARCHARs
mysql-test/r/endspace.result
1.7 05/03/16 14:23:46 heikki@stripped +1 -1
Edit InnoDB test results to reflect the arrival of true VARCHARs
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: heikki
# Host: hundin.mysql.fi
# Root: /home/heikki/mysql-5.0
--- 1.24/mysql-test/r/ps_3innodb.result Thu Feb 10 15:41:48 2005
+++ 1.25/mysql-test/r/ps_3innodb.result Wed Mar 16 14:23:51 2005
@@ -70,7 +70,7 @@
def test t9 t9 c19 c19 1 1 1 Y 32768 0 63
def test t9 t9 c20 c20 254 1 1 Y 0 0 8
def test t9 t9 c21 c21 254 10 10 Y 0 0 8
-def test t9 t9 c22 c22 254 30 30 Y 0 0 8
+def test t9 t9 c22 c22 253 30 30 Y 0 0 8
def test t9 t9 c23 c23 252 255 8 Y 144 0 63
def test t9 t9 c24 c24 252 255 8 Y 16 0 8
def test t9 t9 c25 c25 252 65535 4 Y 144 0 63
@@ -1691,8 +1691,8 @@
info: Records: 3 Duplicates: 0 Warnings: 0
select a,b from t2 order by a ;
a b
-3 duplicate
-4 duplicate
+3 duplicate
+4 duplicate
103 three
delete from t2 ;
prepare stmt1 from ' insert into t2 (b,a)
@@ -1710,8 +1710,8 @@
info: Records: 3 Duplicates: 0 Warnings: 0
select a,b from t2 order by a ;
a b
-3 duplicate
-4 duplicate
+3 duplicate
+4 duplicate
103 three
drop table t2;
drop table if exists t5 ;
--- 1.18/innobase/include/data0type.h Wed Mar 16 00:00:01 2005
+++ 1.19/innobase/include/data0type.h Wed Mar 16 14:27:21 2005
@@ -401,11 +401,20 @@
struct dtype_struct{
ulint mtype; /* main data type */
- ulint prtype; /* precise type; MySQL data type */
+ ulint prtype; /* precise type; MySQL data type, charset code,
+ flags to indicate nullability, signedness,
+ whether this is a binary string, whether this
+ is a true VARCHAR where MySQL uses 2 bytes to
+ store the length */
/* the remaining fields do not affect alphabetical ordering: */
- ulint len; /* length */
+ ulint len; /* length; for MySQL data this is
+ field->pack_length(), except that for a
+ >= 5.0.3 type true VARCHAR this is the
+ maximum byte length of the string data
+ (in addition to the string, MySQL uses 1 or
+ 2 bytes to store the string length) */
ulint prec; /* precision */
ulint mbminlen; /* minimum length of a character, in bytes */
--- 1.79/innobase/row/row0sel.c Wed Mar 16 11:26:27 2005
+++ 1.80/innobase/row/row0sel.c Wed Mar 16 14:27:06 2005
@@ -2018,7 +2018,8 @@
field of the key value may be just a prefix of a fixed length field: hence
the parameter key_len. But currently we do not allow search keys where the
last field is only a prefix of the full key field len and print a warning if
-such appears. */
+such appears. A counterpart of this function is
+ha_innobase::store_key_val_for_row() in ha_innodb.cc. */
void
row_sel_convert_mysql_key_to_innobase(
@@ -2099,13 +2100,10 @@
type = dfield_get_type(dfield)->mtype;
/* Calculate data length and data field total length */
-
- if (type == DATA_BLOB ||
- dtype_get_mysql_type(dfield_get_type(dfield))
- == DATA_MYSQL_TRUE_VARCHAR) {
-
- /* The key field is a column prefix of a BLOB,
- TEXT, OR TRUE VARCHAR type column */
+
+ if (type == DATA_BLOB) {
+ /* The key field is a column prefix of a BLOB or
+ TEXT */
ut_a(field->prefix_len > 0);
@@ -2122,11 +2120,9 @@
+ 256 * key_ptr[data_offset + 1];
data_field_len = data_offset + 2 + field->prefix_len;
- if (type == DATA_BLOB) {
- data_offset += 2;
- }
+ data_offset += 2;
- /* now that we know the length, we store the column
+ /* Now that we know the length, we store the column
value like it would be a fixed char field */
} else if (field->prefix_len > 0) {
@@ -2146,6 +2142,18 @@
} else {
data_len = dfield_get_type(dfield)->len;
data_field_len = data_offset + data_len;
+ }
+
+ if (dtype_get_mysql_type(dfield_get_type(dfield))
+ == DATA_MYSQL_TRUE_VARCHAR) {
+ /* In a MySQL key value format, a true VARCHAR is
+ always preceded by 2 bytes of a length field.
+ dfield_get_type(dfield)->len returns the maximum
+ 'payload' len in bytes. That does not include the
+ 2 bytes that tell the actual data length. */
+
+ data_len += 2;
+ data_field_len += 2;
}
/* Storing may use at most data_len bytes of buf */
--- 1.101/mysql-test/r/innodb.result Fri Mar 11 22:10:21 2005
+++ 1.102/mysql-test/r/innodb.result Wed Mar 16 14:23:48 2005
@@ -1466,13 +1466,13 @@
checksum table t1, t2, t3;
Table Checksum
test.t1 2948697075
-test.t2 968604391
-test.t3 968604391
+test.t2 1157260244
+test.t3 1157260244
checksum table t1, t2, t3 extended;
Table Checksum
test.t1 3092701434
-test.t2 968604391
-test.t3 968604391
+test.t2 1157260244
+test.t3 1157260244
drop table t1,t2,t3;
create table t1 (id int, name char(10) not null, name2 char(10) not null) engine=innodb;
insert into t1 values(1,'first','fff'),(2,'second','sss'),(3,'third','ttt');
@@ -1809,6 +1809,5 @@
Variable_name Value
innodb_thread_sleep_delay 10000
create table t1 (v varchar(16384)) engine=innodb;
-ERROR 42000: Column length too big for column 'v' (max = 255); use BLOB instead
create table t1 (a bit, key(a)) engine=innodb;
ERROR 42000: The storage engine for the table doesn't support BIT FIELD
--- 1.177/sql/ha_innodb.cc Wed Mar 16 09:26:41 2005
+++ 1.178/sql/ha_innodb.cc Wed Mar 16 14:25:35 2005
@@ -2920,6 +2920,7 @@
ulint o_len;
ulint n_len;
ulint col_pack_len;
+ byte* new_mysql_row_col;
byte* o_ptr;
byte* n_ptr;
byte* buf;
@@ -2948,10 +2949,17 @@
o_ptr = (byte*) old_row + get_field_offset(table, field);
n_ptr = (byte*) new_row + get_field_offset(table, field);
+ /* Use new_mysql_row_col and col_pack_len save the values */
+
+ new_mysql_row_col = n_ptr;
col_pack_len = field->pack_length();
+
o_len = col_pack_len;
n_len = col_pack_len;
+ /* We use o_ptr and n_ptr to dig up the actual data for
+ comparison. */
+
field_mysql_type = field->type();
col_type = get_innobase_type_from_mysql_type(field);
@@ -3017,15 +3025,11 @@
&dfield,
(byte*)buf,
TRUE,
- n_ptr,
+ new_mysql_row_col,
col_pack_len,
prebuilt->table->comp);
- ufield->new_val.data =
- dfield_get_data_noninline(
- &dfield);
- ufield->new_val.len =
- dfield_get_len_noninline(
- &dfield);
+ ufield->new_val.data = dfield.data;
+ ufield->new_val.len = dfield.len;
} else {
ufield->new_val.data = NULL;
ufield->new_val.len = UNIV_SQL_NULL;
--- 1.6/mysql-test/r/endspace.result Mon Dec 6 02:00:07 2004
+++ 1.7/mysql-test/r/endspace.result Wed Mar 16 14:23:46 2005
@@ -178,7 +178,7 @@
teststring
explain select * from t1 order by text1;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 index NULL key1 32 NULL 3 Using index
+1 SIMPLE t1 index NULL key1 34 NULL 3 Using index
alter table t1 modify text1 char(32) binary not null;
select * from t1 order by text1;
text1
--- 1.4/mysql-test/r/rowid_order_innodb.result Tue Jul 20 17:51:25 2004
+++ 1.5/mysql-test/r/rowid_order_innodb.result Wed Mar 16 14:23:52 2005
@@ -178,9 +178,9 @@
('dddd','d--d',2,2);
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
pk1 pk2 key1 key2
- empt 2 2
a a--a 2 2
bb b--b 2 2
ccc c--c 2 2
dddd d--d 2 2
+ empt 2 2
drop table t1;
| Thread |
|---|
| • bk commit into 5.0 tree (heikki:1.1824) | Heikki Tuuri | 16 Mar |