Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
4ca48591
Commit
4ca48591
authored
Jan 18, 2006
by
konstantin@mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
A fix and a test case for Bug#15613 "libmysqlclient API function
mysql_stmt_prepare returns wrong field length"
parent
75bc48a8
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
81 additions
and
2 deletions
+81
-2
sql/protocol.cc
sql/protocol.cc
+16
-2
tests/mysql_client_test.c
tests/mysql_client_test.c
+65
-0
No files found.
sql/protocol.cc
View file @
4ca48591
...
...
@@ -565,9 +565,23 @@ bool Protocol::send_fields(List<Item> *list, uint flag)
else
{
/* With conversion */
uint
max_char_len
;
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
;
int2store
(
pos
+
7
,
field
.
flags
);
...
...
tests/mysql_client_test.c
View file @
4ca48591
...
...
@@ -11772,6 +11772,70 @@ static void test_bug16144()
}
/*
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
);
}
/*
Read and parse arguments and MySQL options from my.cnf
*/
...
...
@@ -11994,6 +12058,7 @@ static struct my_tests_st my_tests[]= {
{
"test_bug11718"
,
test_bug11718
},
{
"test_bug12925"
,
test_bug12925
},
{
"test_bug16144"
,
test_bug16144
},
{
"test_bug15613"
,
test_bug15613
},
{
0
,
0
}
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment