Commit d894e304 authored by pem@mysql.com's avatar pem@mysql.com

Merge mysql.com:/extern/mysql/bk/mysql-5.0

into  mysql.com:/extern/mysql/work/bug15658/mysql-5.0
parents 74fc0bbb a091b7b7
...@@ -134,7 +134,7 @@ if [ ! -x "$exec_waiter" ]; then ...@@ -134,7 +134,7 @@ if [ ! -x "$exec_waiter" ]; then
fi fi
exec_mgmtclient="$exec_mgmtclient --no-defaults $NDB_MGM_EXTRA_OPTS" exec_mgmtclient="$exec_mgmtclient --no-defaults $NDB_MGM_EXTRA_OPTS"
exec_mgmtsrvr="$exec_mgmtsrvr --no-defaults $NDB_MGMD_EXTRA_OPTS" exec_mgmtsrvr="$exec_mgmtsrvr $NDB_MGMD_EXTRA_OPTS"
exec_ndb="$exec_ndb --no-defaults $NDBD_EXTRA_OPTS" exec_ndb="$exec_ndb --no-defaults $NDBD_EXTRA_OPTS"
exec_waiter="$exec_waiter --no-defaults" exec_waiter="$exec_waiter --no-defaults"
......
...@@ -147,7 +147,7 @@ foreach(@{$tables}) ...@@ -147,7 +147,7 @@ foreach(@{$tables})
{ {
my $fixed= 1+$size; my $fixed= 1+$size;
my @dynamic=$dbh->selectrow_array("select avg(length(`" my @dynamic=$dbh->selectrow_array("select avg(length(`"
.$name. .$name
."`)) from `".$table.'`'); ."`)) from `".$table.'`');
$dynamic[0]=0 if !$dynamic[0]; $dynamic[0]=0 if !$dynamic[0];
@realsize= ($fixed,$fixed,ceil($dynamic[0])); @realsize= ($fixed,$fixed,ceil($dynamic[0]));
......
...@@ -597,9 +597,23 @@ bool Protocol::send_fields(List<Item> *list, uint flags) ...@@ -597,9 +597,23 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
else else
{ {
/* With conversion */ /* With conversion */
uint max_char_len;
int2store(pos, thd_charset->number); int2store(pos, thd_charset->number);
uint char_len= field.length / item->collation.collation->mbmaxlen; /*
int4store(pos+2, char_len * thd_charset->mbmaxlen); For TEXT/BLOB columns, field_length describes the maximum data
length in bytes. There is no limit to the number of characters
that a TEXT column can store, as long as the data fits into
the designated space.
For the rest of textual columns, field_length is evaluated as
char_count * mbmaxlen, where character count is taken from the
definition of the column. In other words, the maximum number
of characters here is limited by the column definition.
*/
max_char_len= (field.type >= (int) MYSQL_TYPE_TINY_BLOB &&
field.type <= (int) MYSQL_TYPE_BLOB) ?
field.length / item->collation.collation->mbminlen :
field.length / item->collation.collation->mbmaxlen;
int4store(pos+2, max_char_len * thd_charset->mbmaxlen);
} }
pos[6]= field.type; pos[6]= field.type;
int2store(pos+7,field.flags); int2store(pos+7,field.flags);
......
...@@ -14638,7 +14638,70 @@ static void test_bug16144() ...@@ -14638,7 +14638,70 @@ static void test_bug16144()
mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (const void*) &flag); mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (const void*) &flag);
mysql_stmt_attr_get(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &flag); mysql_stmt_attr_get(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &flag);
DIE_UNLESS(flag == flag_orig); DIE_UNLESS(flag == flag_orig);
mysql_stmt_close(stmt);
}
/*
Bug #15613: "libmysqlclient API function mysql_stmt_prepare returns wrong
field length"
*/
static void test_bug15613()
{
MYSQL_STMT *stmt;
const char *stmt_text;
MYSQL_RES *metadata;
MYSQL_FIELD *field;
int rc;
myheader("test_bug15613");
/* I. Prepare the table */
rc= mysql_query(mysql, "set names latin1");
myquery(rc);
mysql_query(mysql, "drop table if exists t1");
rc= mysql_query(mysql,
"create table t1 (t text character set utf8, "
"tt tinytext character set utf8, "
"mt mediumtext character set utf8, "
"lt longtext character set utf8, "
"vl varchar(255) character set latin1,"
"vb varchar(255) character set binary,"
"vu varchar(255) character set utf8)");
myquery(rc);
stmt= mysql_stmt_init(mysql);
/* II. Check SELECT metadata */
stmt_text= ("select t, tt, mt, lt, vl, vb, vu from t1");
rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
metadata= mysql_stmt_result_metadata(stmt);
field= mysql_fetch_fields(metadata);
if (!opt_silent)
{
printf("Field lengths (client character set is latin1):\n"
"text character set utf8:\t\t%lu\n"
"tinytext character set utf8:\t\t%lu\n"
"mediumtext character set utf8:\t\t%lu\n"
"longtext character set utf8:\t\t%lu\n"
"varchar(255) character set latin1:\t%lu\n"
"varchar(255) character set binary:\t%lu\n"
"varchar(255) character set utf8:\t%lu\n",
field[0].length, field[1].length, field[2].length, field[3].length,
field[4].length, field[5].length, field[6].length);
}
DIE_UNLESS(field[0].length == 65535);
DIE_UNLESS(field[1].length == 255);
DIE_UNLESS(field[2].length == 16777215);
DIE_UNLESS(field[3].length == 4294967295UL);
DIE_UNLESS(field[4].length == 255);
DIE_UNLESS(field[5].length == 255);
DIE_UNLESS(field[6].length == 255);
/* III. Cleanup */
rc= mysql_query(mysql, "drop table t1");
myquery(rc);
rc= mysql_query(mysql, "set names default");
myquery(rc);
mysql_stmt_close(stmt); mysql_stmt_close(stmt);
} }
...@@ -14903,6 +14966,7 @@ static struct my_tests_st my_tests[]= { ...@@ -14903,6 +14966,7 @@ static struct my_tests_st my_tests[]= {
{ "test_bug14845", test_bug14845 }, { "test_bug14845", test_bug14845 },
{ "test_bug15510", test_bug15510}, { "test_bug15510", test_bug15510},
{ "test_bug16144", test_bug16144 }, { "test_bug16144", test_bug16144 },
{ "test_bug15613", test_bug15613 },
{ 0, 0 } { 0, 0 }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment