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
aee15a44
Commit
aee15a44
authored
Feb 04, 2003
by
monty@mashka.mysql.fi
Browse files
Options
Browse Files
Download
Plain Diff
merge
parents
30235c00
303c3e30
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
96 additions
and
80 deletions
+96
-80
Docs/internals.texi
Docs/internals.texi
+7
-0
include/mysql.h
include/mysql.h
+1
-0
libmysql/libmysql.c
libmysql/libmysql.c
+13
-10
sql/field.cc
sql/field.cc
+2
-0
sql/field.h
sql/field.h
+2
-1
sql/item.cc
sql/item.cc
+7
-5
sql/mysql_priv.h
sql/mysql_priv.h
+0
-2
sql/mysqld.cc
sql/mysqld.cc
+0
-11
sql/protocol.cc
sql/protocol.cc
+61
-46
sql/sql_parse.cc
sql/sql_parse.cc
+3
-5
No files found.
Docs/internals.texi
View file @
aee15a44
...
...
@@ -1719,9 +1719,16 @@ The field description result set contains the meta info for a result set.
@item string @tab Table name alias (or table name if no alias)
@item string @tab Real table name
@item string @tab Alias for column name (or column name if not used)
@item 11 byte @tab Fixed length fields in one field part:
@itemize
@item 2 byte int @tab Character set number
@item 3 byte int @tab Length of column definition
@item 1 byte int @tab Enum value for field type
@item 3 byte int @tab 2 byte column flags (NOT
_
NULL
_
FLAG etc..) + 1 byte number of decimals.
@item 2 byte int @tab zero (reserved for future use)
@end itemize
@item string int @tab Default value, only set when using mysql
_
list
_
fields().
@end multitable
...
...
include/mysql.h
View file @
aee15a44
...
...
@@ -84,6 +84,7 @@ typedef struct st_mysql_field {
unsigned
long
max_length
;
/* Max width of selected set */
unsigned
int
flags
;
/* Div flags */
unsigned
int
decimals
;
/* Number of decimals in field */
unsigned
int
charsetnr
;
/* Character set */
enum
enum_field_types
type
;
/* Type of field. Se mysql_com.h for types */
}
MYSQL_FIELD
;
...
...
libmysql/libmysql.c
View file @
aee15a44
...
...
@@ -1150,25 +1150,29 @@ unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
free_rows
(
data
);
/* Free old data */
DBUG_RETURN
(
0
);
}
bzero
((
char
*
)
field
,
(
uint
)
sizeof
(
MYSQL_FIELD
)
*
fields
);
if
(
server_capabilities
&
CLIENT_PROTOCOL_41
)
{
/* server is 4.1, and returns the new field result format */
for
(
row
=
data
->
data
;
row
;
row
=
row
->
next
,
field
++
)
{
uchar
*
pos
;
field
->
db
=
strdup_root
(
alloc
,(
char
*
)
row
->
data
[
0
]);
field
->
table
=
strdup_root
(
alloc
,(
char
*
)
row
->
data
[
1
]);
field
->
org_table
=
strdup_root
(
alloc
,(
char
*
)
row
->
data
[
2
]);
field
->
name
=
strdup_root
(
alloc
,(
char
*
)
row
->
data
[
3
]);
field
->
org_name
=
strdup_root
(
alloc
,(
char
*
)
row
->
data
[
4
]);
field
->
length
=
(
uint
)
uint3korr
(
row
->
data
[
5
]);
field
->
type
=
(
enum
enum_field_types
)
(
uchar
)
row
->
data
[
6
][
0
];
field
->
flags
=
uint2korr
(
row
->
data
[
7
]);
field
->
decimals
=
(
uint
)
(
uchar
)
row
->
data
[
7
][
2
];
/* Unpack fixed length parts */
pos
=
(
uchar
*
)
row
->
data
[
5
];
field
->
charsetnr
=
uint2korr
(
pos
);
field
->
length
=
(
uint
)
uint3korr
(
pos
+
2
);
field
->
type
=
(
enum
enum_field_types
)
pos
[
5
];
field
->
flags
=
uint2korr
(
pos
+
6
);
field
->
decimals
=
(
uint
)
pos
[
8
];
if
(
INTERNAL_NUM_FIELD
(
field
))
field
->
flags
|=
NUM_FLAG
;
if
(
default_value
&&
row
->
data
[
8
])
if
(
default_value
&&
row
->
data
[
6
])
field
->
def
=
strdup_root
(
alloc
,(
char
*
)
row
->
data
[
8
]);
else
field
->
def
=
0
;
...
...
@@ -2841,7 +2845,7 @@ get_info:
mysql
->
extra_info
=
net_field_length_ll
(
&
pos
);
/* Maybe number of rec */
if
(
!
(
fields
=
read_rows
(
mysql
,(
MYSQL_FIELD
*
)
0
,
(
protocol_41
(
mysql
)
?
8
:
5
)
)))
if
(
!
(
fields
=
read_rows
(
mysql
,(
MYSQL_FIELD
*
)
0
,
5
)))
DBUG_RETURN
(
1
);
if
(
!
(
mysql
->
fields
=
unpack_fields
(
fields
,
&
mysql
->
field_alloc
,
(
uint
)
field_count
,
0
,
...
...
@@ -3212,8 +3216,7 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
end
=
strmake
(
strmake
(
buff
,
table
,
128
)
+
1
,
wild
?
wild
:
""
,
128
);
if
(
simple_command
(
mysql
,
COM_FIELD_LIST
,
buff
,(
ulong
)
(
end
-
buff
),
1
)
||
!
(
query
=
read_rows
(
mysql
,(
MYSQL_FIELD
*
)
0
,
(
protocol_41
(
mysql
)
?
9
:
6
))))
!
(
query
=
read_rows
(
mysql
,(
MYSQL_FIELD
*
)
0
,
6
)))
DBUG_RETURN
(
NULL
);
free_old_query
(
mysql
);
...
...
@@ -3250,7 +3253,7 @@ mysql_list_processes(MYSQL *mysql)
free_old_query
(
mysql
);
pos
=
(
uchar
*
)
mysql
->
net
.
read_pos
;
field_count
=
(
uint
)
net_field_length
(
&
pos
);
if
(
!
(
fields
=
read_rows
(
mysql
,(
MYSQL_FIELD
*
)
0
,
protocol_41
(
mysql
)
?
8
:
5
)))
if
(
!
(
fields
=
read_rows
(
mysql
,(
MYSQL_FIELD
*
)
0
,
5
)))
DBUG_RETURN
(
NULL
);
if
(
!
(
mysql
->
fields
=
unpack_fields
(
fields
,
&
mysql
->
field_alloc
,
field_count
,
0
,
mysql
->
server_capabilities
)))
...
...
sql/field.cc
View file @
aee15a44
...
...
@@ -223,6 +223,7 @@ void Field_num::make_field(Send_field *field)
field
->
org_table_name
=
table
->
real_name
;
field
->
table_name
=
table_name
;
field
->
col_name
=
field
->
org_col_name
=
field_name
;
field
->
charsetnr
=
charset
()
->
number
;
field
->
length
=
field_length
;
field
->
type
=
type
();
field
->
flags
=
table
->
maybe_null
?
(
flags
&
~
NOT_NULL_FLAG
)
:
flags
;
...
...
@@ -237,6 +238,7 @@ void Field_str::make_field(Send_field *field)
field
->
org_table_name
=
table
->
real_name
;
field
->
table_name
=
table_name
;
field
->
col_name
=
field
->
org_col_name
=
field_name
;
field
->
charsetnr
=
charset
()
->
number
;
field
->
length
=
field_length
;
field
->
type
=
type
();
field
->
flags
=
table
->
maybe_null
?
(
flags
&
~
NOT_NULL_FLAG
)
:
flags
;
...
...
sql/field.h
View file @
aee15a44
...
...
@@ -1056,7 +1056,8 @@ class Send_field {
const
char
*
db_name
;
const
char
*
table_name
,
*
org_table_name
;
const
char
*
col_name
,
*
org_col_name
;
uint
length
,
flags
,
decimals
;
ulong
length
;
uint
charsetnr
,
flags
,
decimals
;
enum_field_types
type
;
Send_field
()
{}
};
...
...
sql/item.cc
View file @
aee15a44
...
...
@@ -721,11 +721,13 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
void
Item
::
init_make_field
(
Send_field
*
tmp_field
,
enum
enum_field_types
field_type
)
{
tmp_field
->
db_name
=
(
char
*
)
""
;
tmp_field
->
org_table_name
=
(
char
*
)
""
;
tmp_field
->
org_col_name
=
(
char
*
)
""
;
tmp_field
->
table_name
=
(
char
*
)
""
;
tmp_field
->
col_name
=
name
;
char
*
empty_name
=
(
char
*
)
""
;
tmp_field
->
db_name
=
empty_name
;
tmp_field
->
org_table_name
=
empty_name
;
tmp_field
->
org_col_name
=
empty_name
;
tmp_field
->
table_name
=
empty_name
;
tmp_field
->
col_name
=
name
;
tmp_field
->
charsetnr
=
charset
()
->
number
;
tmp_field
->
flags
=
maybe_null
?
0
:
NOT_NULL_FLAG
;
tmp_field
->
type
=
field_type
;
tmp_field
->
length
=
max_length
;
...
...
sql/mysql_priv.h
View file @
aee15a44
...
...
@@ -662,8 +662,6 @@ bool open_log(MYSQL_LOG *log, const char *hostname,
const
char
*
index_file_name
,
enum_log_type
type
,
bool
read_append
=
0
,
bool
no_auto_events
=
0
);
/* mysqld.cc */
void
clear_error_message
(
THD
*
thd
);
/*
External variables
...
...
sql/mysqld.cc
View file @
aee15a44
...
...
@@ -1736,17 +1736,6 @@ extern "C" int my_message_sql(uint error, const char *str,
DBUG_RETURN
(
0
);
}
/*
Forget last error message (if we got one)
*/
void
clear_error_message
(
THD
*
thd
)
{
thd
->
clear_error
();
}
#ifdef __WIN__
struct
utsname
...
...
sql/protocol.cc
View file @
aee15a44
...
...
@@ -132,6 +132,7 @@ void net_send_error(NET *net, uint sql_errno, const char *err)
}
#endif
/*
Send a warning to the end user
...
...
@@ -284,8 +285,8 @@ void my_net_local_init(NET *net __attribute__(unused))
If net->no_send_ok return without sending packet
*/
#ifndef EMBEDDED_LIBRARY
#ifndef EMBEDDED_LIBRARY
void
send_ok
(
THD
*
thd
,
ha_rows
affected_rows
,
ulonglong
id
,
const
char
*
message
)
{
...
...
@@ -375,7 +376,6 @@ send_eof(THD *thd, bool no_flush)
/****************************************************************************
Store a field length in logical packet
This is used to code the string length for normal protocol
****************************************************************************/
...
...
@@ -457,9 +457,6 @@ char *net_store_data(char *to,longlong from)
return
to
+
length
;
}
/*
Function called by my_net_init() to set some check variables
*/
/*****************************************************************************
Default Protocol functions
...
...
@@ -475,6 +472,7 @@ void Protocol::init(THD *thd_arg)
#endif
}
/*
Send name and type of result to client.
...
...
@@ -534,35 +532,55 @@ bool Protocol::send_fields(List<Item> *list, uint flag)
prot
.
store
(
field
.
org_table_name
,
(
uint
)
strlen
(
field
.
org_table_name
))
||
prot
.
store
(
field
.
col_name
,
(
uint
)
strlen
(
field
.
col_name
))
||
prot
.
store
(
field
.
org_col_name
,
(
uint
)
strlen
(
field
.
org_col_name
)))
prot
.
store
(
field
.
org_col_name
,
(
uint
)
strlen
(
field
.
org_col_name
))
||
packet
->
realloc
(
packet
->
length
()
+
12
))
goto
err
;
/* Store fixed length fields */
pos
=
(
char
*
)
packet
->
ptr
()
+
packet
->
length
();
*
pos
++=
11
;
// Length of packed fields
int2store
(
pos
,
field
.
charsetnr
);
int3store
(
pos
+
2
,
field
.
length
);
pos
[
5
]
=
field
.
type
;
int2store
(
pos
+
6
,
field
.
flags
);
pos
[
8
]
=
(
char
)
field
.
decimals
;
pos
[
9
]
=
0
;
// For the future
pos
[
10
]
=
0
;
// For the future
pos
+=
11
;
}
else
{
if
(
prot
.
store
(
field
.
table_name
,
(
uint
)
strlen
(
field
.
table_name
))
||
prot
.
store
(
field
.
col_name
,
(
uint
)
strlen
(
field
.
col_name
)))
goto
err
;
}
if
(
packet
->
realloc
(
packet
->
length
()
+
10
))
prot
.
store
(
field
.
col_name
,
(
uint
)
strlen
(
field
.
col_name
))
||
packet
->
realloc
(
packet
->
length
()
+
10
))
goto
err
;
pos
=
(
char
*
)
packet
->
ptr
()
+
packet
->
length
();
#ifdef TO_BE_DELETED_IN_6
if
(
!
(
thd
->
client_capabilities
&
CLIENT_LONG_FLAG
))
{
packet
->
length
(
packet
->
length
()
+
9
);
pos
[
0
]
=
3
;
int3store
(
pos
+
1
,
field
.
length
);
pos
[
4
]
=
1
;
pos
[
5
]
=
field
.
type
;
pos
[
6
]
=
2
;
pos
[
7
]
=
(
char
)
field
.
flags
;
pos
[
8
]
=
(
char
)
field
.
decimals
;
pos
[
0
]
=
3
;
int3store
(
pos
+
1
,
field
.
length
);
pos
[
4
]
=
1
;
pos
[
5
]
=
field
.
type
;
pos
[
6
]
=
2
;
pos
[
7
]
=
(
char
)
field
.
flags
;
pos
[
8
]
=
(
char
)
field
.
decimals
;
pos
+=
9
;
}
else
#endif
{
packet
->
length
(
packet
->
length
()
+
10
);
pos
[
0
]
=
3
;
int3store
(
pos
+
1
,
field
.
length
);
pos
[
4
]
=
1
;
pos
[
5
]
=
field
.
type
;
pos
[
6
]
=
3
;
int2store
(
pos
+
7
,
field
.
flags
);
pos
[
9
]
=
(
char
)
field
.
decimals
;
pos
[
0
]
=
3
;
int3store
(
pos
+
1
,
field
.
length
);
pos
[
4
]
=
1
;
pos
[
5
]
=
field
.
type
;
pos
[
6
]
=
3
;
int2store
(
pos
+
7
,
field
.
flags
);
pos
[
9
]
=
(
char
)
field
.
decimals
;
pos
+=
10
;
}
}
packet
->
length
((
uint
)
(
pos
-
packet
->
ptr
()));
if
(
flag
&
2
)
item
->
send
(
&
prot
,
&
tmp
);
// Send default value
if
(
prot
.
write
())
...
...
@@ -580,6 +598,7 @@ err:
DBUG_RETURN
(
1
);
/* purecov: inspected */
}
bool
Protocol
::
send_records_num
(
List
<
Item
>
*
list
,
ulonglong
records
)
{
char
*
pos
;
...
...
@@ -589,13 +608,12 @@ bool Protocol::send_records_num(List<Item> *list, ulonglong records)
return
my_net_write
(
&
thd
->
net
,
buff
,(
uint
)
(
pos
-
buff
));
}
bool
Protocol
::
write
()
{
DBUG_ENTER
(
"Protocol::write"
);
DBUG_RETURN
(
my_net_write
(
&
thd
->
net
,
packet
->
ptr
(),
packet
->
length
()));
}
#endif
/* EMBEDDED_LIBRARY */
...
...
@@ -653,7 +671,6 @@ bool Protocol::store(I_List<i_string>* str_list)
and client when you are not using prepared statements.
All data are sent as 'packed-string-length' followed by 'string-data'
****************************************************************************/
#ifndef EMBEDDED_LIBRARY
...
...
@@ -676,6 +693,7 @@ bool Protocol_simple::store_null()
}
#endif
bool
Protocol_simple
::
store
(
const
char
*
from
,
uint
length
)
{
#ifndef DEBUG_OFF
...
...
@@ -701,6 +719,7 @@ bool Protocol_simple::store_tiny(longlong from)
(
uint
)
(
int10_to_str
((
int
)
from
,
buff
,
-
10
)
-
buff
));
}
bool
Protocol_simple
::
store_short
(
longlong
from
)
{
#ifndef DEBUG_OFF
...
...
@@ -712,6 +731,7 @@ bool Protocol_simple::store_short(longlong from)
(
uint
)
(
int10_to_str
((
int
)
from
,
buff
,
-
10
)
-
buff
));
}
bool
Protocol_simple
::
store_long
(
longlong
from
)
{
#ifndef DEBUG_OFF
...
...
@@ -747,6 +767,7 @@ bool Protocol_simple::store(float from, uint32 decimals, String *buffer)
return
net_store_data
((
char
*
)
buffer
->
ptr
(),
buffer
->
length
());
}
bool
Protocol_simple
::
store
(
double
from
,
uint32
decimals
,
String
*
buffer
)
{
#ifndef DEBUG_OFF
...
...
@@ -833,17 +854,18 @@ bool Protocol_simple::store_time(TIME *tm)
Data format:
[ok:1]
<--
reserved ok packet
[null_field:(field_count+7+2)/8]
<--
reserved to send null data. The size is
[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
2 bits are reserved for identifying type
of package.
[[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
[..]..[[length]data] data
****************************************************************************/
bool
Protocol_prep
::
prepare_for_send
(
List
<
Item
>
*
item_list
)
...
...
@@ -983,7 +1005,7 @@ bool Protocol_prep::store(double from, uint32 decimals, String *buffer)
bool
Protocol_prep
::
store
(
Field
*
field
)
{
/*
We should not
count up
field_pos here as send_binary() will call another
We should not
increment
field_pos here as send_binary() will call another
protocol function to do this for us
*/
if
(
field
->
is_null
())
...
...
@@ -1057,10 +1079,3 @@ 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_parse.cc
View file @
aee15a44
...
...
@@ -1069,7 +1069,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
case
COM_CHANGE_USER
:
{
thd
->
change_user
();
clear_error_message
(
thd
);
// If errors from rollback
thd
->
clear_error
(
);
// If errors from rollback
statistic_increment
(
com_other
,
&
LOCK_status
);
char
*
user
=
(
char
*
)
packet
;
...
...
@@ -1210,7 +1210,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
DBUG_PRINT
(
"query"
,(
"%-.4096s"
,
thd
->
query
));
mysql_parse
(
thd
,
thd
->
query
,
thd
->
query_length
);
while
(
!
thd
->
is_
fatal_error
&&
thd
->
lex
.
found_colon
)
while
(
!
thd
->
killed
&&
!
thd
->
fatal_error
&&
thd
->
lex
.
found_colon
)
{
char
*
packet
=
thd
->
lex
.
found_colon
;
/*
...
...
@@ -1229,7 +1229,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
}
thd
->
query_length
=
length
;
thd
->
query
=
packet
;
thd
->
net
.
last_error
[
0
]
=
'\0'
;
VOID
(
pthread_mutex_lock
(
&
LOCK_thread_count
));
thd
->
query_id
=
query_id
++
;
VOID
(
pthread_mutex_unlock
(
&
LOCK_thread_count
));
...
...
@@ -3263,8 +3262,7 @@ mysql_parse(THD *thd, char *inBuf, uint length)
DBUG_ENTER
(
"mysql_parse"
);
mysql_init_query
(
thd
);
thd
->
query_length
=
length
;
thd
->
net
.
report_error
=
0
;
thd
->
clear_error
();
if
(
query_cache_send_result_to_client
(
thd
,
inBuf
,
length
)
<=
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