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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
5c4b7a2e
Commit
5c4b7a2e
authored
Jan 03, 2003
by
venu@myvenu.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Binary protocol changes (to monty)
parent
d5631610
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
173 additions
and
104 deletions
+173
-104
libmysql/libmysql.c
libmysql/libmysql.c
+92
-73
sql/field.cc
sql/field.cc
+32
-3
sql/field.h
sql/field.h
+1
-5
sql/protocol.cc
sql/protocol.cc
+29
-8
sql/sql_prepare.cc
sql/sql_prepare.cc
+19
-15
No files found.
libmysql/libmysql.c
View file @
5c4b7a2e
This diff is collapsed.
Click to expand it.
sql/field.cc
View file @
5c4b7a2e
...
...
@@ -2599,7 +2599,7 @@ String *Field_double::val_str(String *val_buffer,
bool
Field_double
::
send_binary
(
Protocol
*
protocol
)
{
return
protocol
->
store
((
float
)
Field_double
::
val_real
(),
dec
,
(
String
*
)
0
);
return
protocol
->
store
((
double
)
Field_double
::
val_real
(),
dec
,
(
String
*
)
0
);
}
...
...
@@ -3169,7 +3169,7 @@ bool Field_time::send_binary(Protocol *protocol)
Field_time
::
get_time
(
&
tm
);
tm
.
day
=
tm
.
hour
/
3600
;
// Move hours to days
tm
.
hour
-=
tm
.
day
*
3600
;
return
protocol
->
store
(
&
tm
);
return
protocol
->
store
_time
(
&
tm
);
}
...
...
@@ -3254,6 +3254,13 @@ int Field_year::store(longlong nr)
return
0
;
}
bool
Field_year
::
send_binary
(
Protocol
*
protocol
)
{
ulonglong
tmp
=
Field_year
::
val_int
();
TIME
tm
;
tm
.
year
=
(
uint32
)
tmp
;
return
protocol
->
store_date
(
&
tm
);
}
double
Field_year
::
val_real
(
void
)
{
...
...
@@ -3371,6 +3378,16 @@ int Field_date::store(longlong nr)
return
error
;
}
bool
Field_date
::
send_binary
(
Protocol
*
protocol
)
{
longlong
tmp
=
Field_date
::
val_int
();
TIME
tm
;
tm
.
year
=
(
uint32
)
tmp
/
10000L
%
10000
;
tm
.
month
=
(
uint32
)
tmp
/
100
%
100
;
tm
.
day
=
(
uint32
)
tmp
%
100
;
return
protocol
->
store_date
(
&
tm
);
}
double
Field_date
::
val_real
(
void
)
{
...
...
@@ -3544,7 +3561,12 @@ void Field_newdate::store_time(TIME *ltime,timestamp_type type)
int3store
(
ptr
,
tmp
);
}
bool
Field_newdate
::
send_binary
(
Protocol
*
protocol
)
{
TIME
tm
;
Field_newdate
::
get_date
(
&
tm
,
0
);
return
protocol
->
store_date
(
&
tm
);
}
double
Field_newdate
::
val_real
(
void
)
{
...
...
@@ -3705,6 +3727,13 @@ void Field_datetime::store_time(TIME *ltime,timestamp_type type)
longlongstore
(
ptr
,
tmp
);
}
bool
Field_datetime
::
send_binary
(
Protocol
*
protocol
)
{
TIME
tm
;
Field_datetime
::
get_date
(
&
tm
,
1
);
return
protocol
->
store
(
&
tm
);
}
double
Field_datetime
::
val_real
(
void
)
{
...
...
sql/field.h
View file @
5c4b7a2e
...
...
@@ -166,7 +166,7 @@ class Field
ptr
-=
row_offset
;
return
tmp
;
}
bool
send_binary
(
Protocol
*
protocol
);
virtual
bool
send_binary
(
Protocol
*
protocol
);
virtual
char
*
pack
(
char
*
to
,
const
char
*
from
,
uint
max_length
=~
(
uint
)
0
)
{
uint32
length
=
pack_length
();
...
...
@@ -792,7 +792,6 @@ class Field_string :public Field_str {
double
val_real
(
void
);
longlong
val_int
(
void
);
String
*
val_str
(
String
*
,
String
*
);
bool
send_binary
(
Protocol
*
protocol
);
int
cmp
(
const
char
*
,
const
char
*
);
void
sort_string
(
char
*
buff
,
uint
length
);
void
sql_type
(
String
&
str
)
const
;
...
...
@@ -833,7 +832,6 @@ class Field_varstring :public Field_str {
double
val_real
(
void
);
longlong
val_int
(
void
);
String
*
val_str
(
String
*
,
String
*
);
bool
send_binary
(
Protocol
*
protocol
);
int
cmp
(
const
char
*
,
const
char
*
);
void
sort_string
(
char
*
buff
,
uint
length
);
void
get_key_image
(
char
*
buff
,
uint
length
,
CHARSET_INFO
*
cs
,
imagetype
type
);
...
...
@@ -876,7 +874,6 @@ class Field_blob :public Field_str {
double
val_real
(
void
);
longlong
val_int
(
void
);
String
*
val_str
(
String
*
,
String
*
);
bool
send_binary
(
Protocol
*
protocol
);
int
cmp
(
const
char
*
,
const
char
*
);
int
cmp
(
const
char
*
a
,
uint32
a_length
,
const
char
*
b
,
uint32
b_length
);
int
cmp_offset
(
uint
offset
);
...
...
@@ -982,7 +979,6 @@ class Field_enum :public Field_str {
double
val_real
(
void
);
longlong
val_int
(
void
);
String
*
val_str
(
String
*
,
String
*
);
bool
send_binary
(
Protocol
*
protocol
);
int
cmp
(
const
char
*
,
const
char
*
);
void
sort_string
(
char
*
buff
,
uint
length
);
uint32
pack_length
()
const
{
return
(
uint32
)
packlength
;
}
...
...
sql/protocol.cc
View file @
5c4b7a2e
...
...
@@ -616,7 +616,7 @@ bool Protocol_simple::store_null()
field_pos
++
;
#endif
char
buff
[
1
];
buff
[
0
]
=
251
;
buff
[
0
]
=
(
char
)
251
;
return
packet
->
append
(
buff
,
sizeof
(
buff
),
PACKET_BUFFET_EXTRA_ALLOC
);
}
...
...
@@ -774,13 +774,27 @@ bool Protocol_simple::store_time(TIME *tm)
/****************************************************************************
Functions to handle the binary protocol used with prepared statements
Data format:
[ok:1] <-- reserved ok packet
[null_field:(field_count+7+2)/8] <-- reserved to send null data. The size is
calculated using:
bit_fields= (field_count+7+2)/8;
2 bits are reserved
[[length]data] <-- data field (the length applies only for
string/binary/time/timestamp fields and
rest of them are not sent as they have
the default length that client understands
based on the field type
[..]..[[length]data] <-- data
****************************************************************************/
bool
Protocol_prep
::
prepare_for_send
(
List
<
Item
>
*
item_list
)
{
field_count
=
item_list
->
elements
;
bit_fields
=
(
field_count
+
3
)
/
8
;
if
(
packet
->
alloc
(
bit_fields
))
field_count
=
item_list
->
elements
;
bit_fields
=
(
field_count
+
9
)
/
8
;
if
(
packet
->
alloc
(
bit_fields
+
1
))
return
1
;
/* prepare_for_resend will be called after this one */
return
0
;
...
...
@@ -789,9 +803,8 @@ bool Protocol_prep::prepare_for_send(List<Item> *item_list)
void
Protocol_prep
::
prepare_for_resend
()
{
packet
->
length
(
bit_fields
);
bzero
((
char
*
)
packet
->
ptr
()
+
1
,
bit_fields
-
1
);
packet
[
0
]
=
1
;
// Marker for ok packet
packet
->
length
(
bit_fields
+
1
);
bzero
((
char
*
)
packet
->
ptr
(),
1
+
bit_fields
);
field_pos
=
0
;
}
...
...
@@ -813,7 +826,7 @@ bool Protocol_prep::store(const char *from,uint length)
bool
Protocol_prep
::
store_null
()
{
uint
offset
=
(
field_pos
+
2
)
/
8
,
bit
=
(
1
<<
((
field_pos
+
2
)
&
7
));
uint
offset
=
(
field_pos
+
2
)
/
8
+
1
,
bit
=
(
1
<<
((
field_pos
+
2
)
&
7
));
/* Room for this as it's allocated in prepare_for_send */
char
*
to
=
(
char
*
)
packet
->
ptr
()
+
offset
;
*
to
=
(
char
)
((
uchar
)
*
to
|
(
uchar
)
bit
);
...
...
@@ -926,6 +939,7 @@ bool Protocol_prep::store(TIME *tm)
{
#ifndef DEBUG_OFF
DBUG_ASSERT
(
field_types
==
0
||
field_types
[
field_pos
]
==
MYSQL_TYPE_YEAR
||
field_types
[
field_pos
]
==
MYSQL_TYPE_DATETIME
||
field_types
[
field_pos
]
==
MYSQL_TYPE_DATE
||
field_types
[
field_pos
]
==
MYSQL_TYPE_TIMESTAMP
);
...
...
@@ -987,3 +1001,10 @@ bool Protocol_prep::store_time(TIME *tm)
buff
[
0
]
=
(
char
)
length
;
// Length is stored first
return
packet
->
append
(
buff
,
length
+
1
,
PACKET_BUFFET_EXTRA_ALLOC
);
}
#if 0
bool Protocol_prep::send_fields(List<Item> *list, uint flag)
{
return prepare_for_send(list);
};
#endif
sql/sql_prepare.cc
View file @
5c4b7a2e
...
...
@@ -440,10 +440,9 @@ static bool mysql_test_upd_fields(PREP_STMT *stmt, TABLE_LIST *table_list,
COND
*
conds
)
{
THD
*
thd
=
stmt
->
thd
;
TABLE
*
table
;
DBUG_ENTER
(
"mysql_test_upd_fields"
);
if
(
!
(
table
=
open_ltable
(
thd
,
table_list
,
table_list
->
lock_type
)
))
if
(
open_and_lock_tables
(
thd
,
table_list
))
DBUG_RETURN
(
1
);
if
(
setup_tables
(
table_list
)
||
setup_fields
(
thd
,
table_list
,
fields
,
1
,
0
,
0
)
||
...
...
@@ -477,13 +476,12 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables,
COND
*
conds
,
ORDER
*
order
,
ORDER
*
group
,
Item
*
having
)
{
TABLE
*
table
;
bool
hidden_group_fields
;
THD
*
thd
=
stmt
->
thd
;
List
<
Item
>
all_fields
(
fields
);
DBUG_ENTER
(
"mysql_test_select_fields"
);
if
(
!
(
table
=
open_ltable
(
thd
,
tables
,
TL_READ
)
))
if
(
open_and_lock_tables
(
thd
,
tables
))
DBUG_RETURN
(
1
);
thd
->
used_tables
=
0
;
// Updated by setup_fields
...
...
@@ -512,7 +510,7 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables,
sending any info on where clause.
*/
if
(
send_prep_stmt
(
stmt
,
fields
.
elements
)
||
thd
->
protocol_
prep
.
send_fields
(
&
fields
,
0
)
||
thd
->
protocol_
simple
.
send_fields
(
&
fields
,
0
)
||
send_item_params
(
stmt
))
DBUG_RETURN
(
1
);
DBUG_RETURN
(
0
);
...
...
@@ -626,14 +624,17 @@ static bool parse_prepare_query(PREP_STMT *stmt,
/*
Initialize parameter items in statement
*/
static
bool
init_param_items
(
THD
*
thd
,
PREP_STMT
*
stmt
)
static
bool
init_param_items
(
PREP_STMT
*
stmt
)
{
List
<
Item
>
&
params
=
stmt
->
thd
->
lex
.
param_list
;
Item_param
**
to
;
if
(
!
(
stmt
->
param
=
to
=
(
Item_param
**
)
my_malloc
(
sizeof
(
Item_param
*
)
*
(
stmt
->
param_count
+
1
),
MYF
(
MY_WME
))))
return
1
;
List_iterator
<
Item
>
param_iterator
(
thd
->
lex
.
param_list
);
List_iterator
<
Item
>
param_iterator
(
params
);
while
((
*
(
to
++
)
=
(
Item_param
*
)
param_iterator
++
));
return
0
;
}
...
...
@@ -659,29 +660,32 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length)
DBUG_ENTER
(
"mysql_stmt_prepare"
);
bzero
((
char
*
)
&
stmt
,
sizeof
(
stmt
));
stmt
.
thd
=
thd
;
stmt
.
stmt_id
=
++
thd
->
current_stmt_id
;
init_sql_alloc
(
&
stmt
.
mem_root
,
8192
,
8192
);
stmt
.
thd
=
thd
;
stmt
.
thd
->
mem_root
=
stmt
.
mem_root
;
thd
->
mem_root
=
stmt
.
mem_root
;
if
(
alloc_query
(
thd
,
packet
,
packet_length
))
if
(
alloc_query
(
stmt
.
thd
,
packet
,
packet_length
))
goto
err
;
if
(
parse_prepare_query
(
&
stmt
,
thd
->
query
,
thd
->
query_length
))
goto
err
;
if
(
!
(
specialflag
&
SPECIAL_NO_PRIOR
))
my_pthread_setprio
(
pthread_self
(),
WAIT_PRIOR
);
if
(
init_param_items
(
thd
,
&
stmt
))
if
(
init_param_items
(
&
stmt
))
goto
err
;
stmt
.
mem_root
=
thd
->
mem_root
;
stmt
.
mem_root
=
stmt
.
thd
->
mem_root
;
tree_insert
(
&
thd
->
prepared_statements
,
(
void
*
)
&
stmt
,
0
,
(
void
*
)
0
);
thd
->
mem_root
=
thd_root
;
// restore main mem_root
DBUG_RETURN
(
0
);
err:
stmt
.
mem_root
=
thd
->
mem_root
;
stmt
.
mem_root
=
stmt
.
thd
->
mem_root
;
free_prep_stmt
(
&
stmt
,
free_free
,
(
void
*
)
0
);
thd
->
mem_root
=
thd_root
;
// restore main mem_root
DBUG_RETURN
(
1
);
...
...
@@ -727,9 +731,9 @@ void mysql_stmt_execute(THD *thd, char *packet)
mysql_delete(), mysql_update() and mysql_select() to not to
have re-check on setup_* and other things ..
*/
thd
->
protocol
=
&
thd
->
protocol_prep
;
// Switch to binary protocol
stmt
->
thd
->
protocol
=
&
thd
->
protocol_prep
;
// Switch to binary protocol
mysql_execute_command
(
stmt
->
thd
);
thd
->
protocol
=
&
thd
->
protocol_simple
;
// Use normal protocol
stmt
->
thd
->
protocol
=
&
thd
->
protocol_simple
;
// Use normal protocol
if
(
!
(
specialflag
&
SPECIAL_NO_PRIOR
))
my_pthread_setprio
(
pthread_self
(),
WAIT_PRIOR
);
...
...
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