summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <hf@deer.(none)>2004-05-17 18:45:50 +0500
committerunknown <hf@deer.(none)>2004-05-17 18:45:50 +0500
commit84cf2d8f7889a7c13f3c3010745b99cd0f16177f (patch)
tree30a151ad3b5d208e84f3d65f63812a2cf4d9995a
parent93168d599dfd311f27e508338443a10ece38e16a (diff)
parent05cd698f542f295b4fcd28d4704bce0f37e534ca (diff)
downloadmariadb-git-84cf2d8f7889a7c13f3c3010745b99cd0f16177f.tar.gz
Merge abotchkov@bk-internal.mysql.com:/home/bk/mysql-4.1
into deer.(none):/home/hf/work/mysql-4.1.ps sql/sql_parse.cc: Auto merged tests/client_test.c: Auto merged
-rw-r--r--libmysql/libmysql.c54
-rw-r--r--libmysqld/lib_sql.cc7
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_prepare.cc58
-rw-r--r--tests/client_test.c3
5 files changed, 97 insertions, 27 deletions
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index a467b7fc9fd..2214ca68c81 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -3729,28 +3729,6 @@ int cli_read_binary_rows(MYSQL_STMT *stmt)
mysql= mysql->last_used_con;
- if (stmt->update_max_length && !stmt->bind_result_done)
- {
- /*
- We must initalize the bind structure to be able to calculate
- max_length
- */
- MYSQL_BIND *bind, *end;
- MYSQL_FIELD *field;
- bzero((char*) stmt->bind, sizeof(*stmt->bind)* stmt->field_count);
-
- for (bind= stmt->bind, end= bind + stmt->field_count, field= stmt->fields;
- bind < end ;
- bind++, field++)
- {
- bind->buffer_type= field->type;
- bind->buffer_length=1;
- }
-
- mysql_stmt_bind_result(stmt, stmt->bind);
- stmt->bind_result_done= 0; /* No normal bind done */
- }
-
while ((pkt_len= net_safe_read(mysql)) != packet_error)
{
cp= net->read_pos;
@@ -3768,8 +3746,6 @@ int cli_read_binary_rows(MYSQL_STMT *stmt)
memcpy((char *) cur->data, (char *) cp+1, pkt_len-1);
cur->length= pkt_len; /* To allow us to do sanity checks */
result->rows++;
- if (stmt->update_max_length)
- stmt_update_metadata(stmt, cur);
}
else
{
@@ -3814,6 +3790,29 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
result->rows= 0;
stmt->data_cursor= NULL;
}
+
+ if (stmt->update_max_length && !stmt->bind_result_done)
+ {
+ /*
+ We must initalize the bind structure to be able to calculate
+ max_length
+ */
+ MYSQL_BIND *bind, *end;
+ MYSQL_FIELD *field;
+ bzero((char*) stmt->bind, sizeof(*stmt->bind)* stmt->field_count);
+
+ for (bind= stmt->bind, end= bind + stmt->field_count, field= stmt->fields;
+ bind < end ;
+ bind++, field++)
+ {
+ bind->buffer_type= field->type;
+ bind->buffer_length=1;
+ }
+
+ mysql_stmt_bind_result(stmt, stmt->bind);
+ stmt->bind_result_done= 0; /* No normal bind done */
+ }
+
if ((*mysql->methods->read_binary_rows)(stmt))
{
free_root(&result->alloc, MYF(MY_KEEP_PREALLOC));
@@ -3822,6 +3821,13 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
DBUG_RETURN(1);
}
+ if (stmt->update_max_length)
+ {
+ MYSQL_ROWS *cur= result->data;
+ for(; cur; cur=cur->next)
+ stmt_update_metadata(stmt, cur);
+ }
+
stmt->data_cursor= result->data;
mysql->affected_rows= stmt->affected_rows= result->rows;
stmt->read_row_func= stmt_read_row_buffered;
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index cfb50d3907a..09b03e38f2e 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -197,6 +197,8 @@ static int emb_stmt_execute(MYSQL_STMT *stmt)
set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
DBUG_RETURN(1);
}
+ stmt->affected_rows= stmt->mysql->affected_rows;
+ stmt->insert_id= stmt->mysql->insert_id;
DBUG_RETURN(0);
}
@@ -605,13 +607,14 @@ bool Protocol::send_fields(List<Item> *list, uint flag)
if (!(res=item->val_str(&tmp)))
{
- client_field->def= strdup_root(field_alloc, "");
client_field->def_length= 0;
+ client_field->def= strmake_root(field_alloc, "",0);
}
else
{
- client_field->def= strdup_root(field_alloc, res->ptr());
client_field->def_length= res->length();
+ client_field->def= strmake_root(field_alloc, res->ptr(),
+ client_field->def_length);
}
}
else
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index f2458068633..0c178f05cc0 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1493,7 +1493,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
thd->query_rest.length(length);
}
else
- thd->query_rest.copy(length);
+ thd->query_rest.copy(packet, length, thd->query_rest.charset());
break;
#endif /*EMBEDDED_LIBRARY*/
}
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 61e5b778b64..68da21018a0 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -309,6 +309,7 @@ void set_param_double(Item_param *param, uchar **pos, ulong len)
*pos+= 8;
}
+#ifndef EMBEDDED_LIBRARY
void set_param_time(Item_param *param, uchar **pos, ulong len)
{
ulong length;
@@ -386,6 +387,62 @@ void set_param_date(Item_param *param, uchar **pos, ulong len)
*pos+= length;
}
+#else/*!EMBEDDED_LIBRARY*/
+void set_param_time(Item_param *param, uchar **pos, ulong len)
+{
+ TIME tm;
+ MYSQL_TIME *to= (MYSQL_TIME*)*pos;
+
+ tm.second_part= to->second_part;
+
+ tm.day= to->day;
+ tm.hour= to->hour;
+ tm.minute= to->minute;
+ tm.second= to->second;
+
+ tm.year= tm.month= 0;
+ tm.neg= to->neg;
+
+ param->set_time(&tm, TIMESTAMP_TIME);
+}
+
+void set_param_datetime(Item_param *param, uchar **pos, ulong len)
+{
+ TIME tm;
+ MYSQL_TIME *to= (MYSQL_TIME*)*pos;
+
+ tm.second_part= to->second_part;
+
+ tm.day= to->day;
+ tm.hour= to->hour;
+ tm.minute= to->minute;
+ tm.second= to->second;
+ tm.year= to->year;
+ tm.month= to->month;
+ tm.neg= 0;
+
+ param->set_time(&tm, TIMESTAMP_DATETIME);
+}
+
+void set_param_date(Item_param *param, uchar **pos, ulong len)
+{
+ TIME tm;
+ MYSQL_TIME *to= (MYSQL_TIME*)*pos;
+
+ tm.second_part= to->second_part;
+
+ tm.day= to->day;
+ tm.year= to->year;
+ tm.month= to->month;
+ tm.neg= 0;
+ tm.hour= tm.minute= tm.second= 0;
+ tm.second_part= 0;
+ tm.neg= 0;
+
+ param->set_time(&tm, TIMESTAMP_DATE);
+}
+#endif /*!EMBEDDED_LIBRARY*/
+
void set_param_str(Item_param *param, uchar **pos, ulong len)
{
ulong length= get_param_length(pos, len);
@@ -568,6 +625,7 @@ static bool emb_insert_params(Prepared_statement *stmt)
{
Item_param *param= *it;
setup_one_conversion_function(param, client_param->buffer_type);
+ param->unsigned_flag= client_param->is_unsigned;
if (!param->long_data_supplied)
{
if (*client_param->is_null)
diff --git a/tests/client_test.c b/tests/client_test.c
index c244274a2e7..7fae648e8f5 100644
--- a/tests/client_test.c
+++ b/tests/client_test.c
@@ -9871,7 +9871,10 @@ int main(int argc, char **argv)
test_stiny_bug(); /* test a simple conv bug from php */
test_field_misc(); /* check the field info for misc case, bug: #74 */
test_set_option(); /* test the SET OPTION feature, bug #85 */
+ /*TODO HF: here should be NO_EMBEDDED_ACCESS_CHECKS*/
+#ifndef EMBEDDED_LIBRARY
test_prepare_grant(); /* to test the GRANT command, bug #89 */
+#endif
test_frm_bug(); /* test the crash when .frm is invalid, bug #93 */
test_explain_bug(); /* test for the EXPLAIN, bug #115 */
test_decimal_bug(); /* test for the decimal bug */