Below is the list of changes that have just been committed into a local
5.1 repository of msvensson. When msvensson does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2132 06/02/10 14:53:56 msvensson@neptunus.(none) +3 -0
Merge neptunus.(none):/home/msvensson/mysql/bug14013/my50-bug14013
into neptunus.(none):/home/msvensson/mysql/bug14013/my51-bug14013
tests/mysql_client_test.c
1.170 06/02/10 14:53:50 msvensson@neptunus.(none) +0 -0
Auto merged
libmysql/libmysql.c
1.232 06/02/10 14:53:49 msvensson@neptunus.(none) +0 -0
Auto merged
client/mysqltest.c
1.178 06/02/10 14:53:49 msvensson@neptunus.(none) +0 -0
Auto merged
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: msvensson
# Host: neptunus.(none)
# Root: /home/msvensson/mysql/bug14013/my51-bug14013/RESYNC
--- 1.231/libmysql/libmysql.c 2006-01-04 11:18:53 +01:00
+++ 1.232/libmysql/libmysql.c 2006-02-10 14:53:49 +01:00
@@ -4757,12 +4757,39 @@
if (!stmt->field_count)
DBUG_RETURN(0);
- if ((int) stmt->state < (int) MYSQL_STMT_EXECUTE_DONE ||
- mysql->status != MYSQL_STATUS_GET_RESULT)
+
+ if ((int) stmt->state < (int) MYSQL_STMT_EXECUTE_DONE)
+ {
+ set_stmt_error(stmt, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
+ DBUG_RETURN(1);
+ }
+
+ if (mysql->status == MYSQL_STATUS_READY &&
+ stmt->server_status & SERVER_STATUS_CURSOR_EXISTS)
+ {
+ /*
+ Server side cursor exist, tell server to start sending the rows
+ */
+ NET *net= &mysql->net;
+ char buff[4 /* statement id */ +
+ 4 /* number of rows to fetch */];
+
+ /* Send row request to the server */
+ int4store(buff, stmt->stmt_id);
+ int4store(buff + 4, (int)~0); /* number of rows to fetch */
+ if (cli_advanced_command(mysql, COM_STMT_FETCH, buff, sizeof(buff),
+ NullS, 0, 1))
+ {
+ set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
+ DBUG_RETURN(1);
+ }
+ }
+ else if (mysql->status != MYSQL_STATUS_GET_RESULT)
{
set_stmt_error(stmt, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
DBUG_RETURN(1);
}
+
if (result->data)
{
free_root(&result->alloc, MYF(MY_KEEP_PREALLOC));
@@ -4802,6 +4829,10 @@
mysql->status= MYSQL_STATUS_READY;
DBUG_RETURN(1);
}
+
+ /* Assert that if there was a cursor, all rows have been fetched */
+ DBUG_ASSERT(mysql->status != MYSQL_STATUS_READY ||
+ (mysql->server_status & SERVER_STATUS_LAST_ROW_SENT));
if (stmt->update_max_length)
{
--- 1.177/client/mysqltest.c 2006-02-02 08:24:24 +01:00
+++ 1.178/client/mysqltest.c 2006-02-10 14:53:49 +01:00
@@ -3743,7 +3743,7 @@
if (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA)
die("fetch didn't end with MYSQL_NO_DATA from statement: %d %s",
- mysql_stmt_error(stmt), mysql_stmt_errno(stmt));
+ mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
free_replace_column();
@@ -4209,7 +4209,7 @@
if (mysql_stmt_prepare(stmt, query, query_len))
{
handle_error(query, command, mysql_stmt_errno(stmt),
- mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds);
+ mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds);
goto end;
}
@@ -4225,30 +4225,35 @@
parameter markers.
*/
-#ifdef BUG14013_FIXED
- /*
- Use cursor when retrieving result
- */
if (cursor_protocol_enabled)
{
+ /*
+ Use cursor when retrieving result
+ */
ulong type= CURSOR_TYPE_READ_ONLY;
if (mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*) &type))
die("mysql_stmt_attr_set(STMT_ATTR_CURSOR_TYPE) failed': %d %s",
- mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
+ mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
}
-#endif
/*
Execute the query
- */
+ */
if (mysql_stmt_execute(stmt))
{
handle_error(query, command, mysql_stmt_errno(stmt),
- mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds);
+ mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds);
goto end;
}
/*
+ When running in cursor_protocol get the warnings from execute here
+ and keep them in a separate string for later.
+ */
+ if (cursor_protocol_enabled && !disable_warnings)
+ append_warnings(&ds_execute_warnings, mysql);
+
+ /*
We instruct that we want to update the "max_length" field in
mysql_stmt_store_result(), this is our only way to know how much
buffer to allocate for result data
@@ -4257,7 +4262,7 @@
my_bool one= 1;
if (mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &one))
die("mysql_stmt_attr_set(STMT_ATTR_UPDATE_MAX_LENGTH) failed': %d %s",
- mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
+ mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
}
/*
@@ -4267,7 +4272,7 @@
if (mysql_stmt_store_result(stmt))
{
handle_error(query, command, mysql_stmt_errno(stmt),
- mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds);
+ mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds);
goto end;
}
@@ -4288,10 +4293,10 @@
uint num_fields= mysql_num_fields(res);
if (display_metadata)
- append_metadata(ds, fields, num_fields);
+ append_metadata(ds, fields, num_fields);
if (!display_result_vertically)
- append_table_headings(ds, fields, num_fields);
+ append_table_headings(ds, fields, num_fields);
append_stmt_result(ds, stmt, fields, num_fields);
@@ -4313,10 +4318,11 @@
/* Append warnings to ds - if there are any */
if (append_warnings(&ds_execute_warnings, mysql) ||
- ds_prepare_warnings.length ||
- ds_warnings->length)
+ ds_execute_warnings.length ||
+ ds_prepare_warnings.length ||
+ ds_warnings->length)
{
- dynstr_append_mem(ds, "Warnings:\n", 10);
+ dynstr_append_mem(ds, "Warnings:\n", 10);
if (ds_warnings->length)
dynstr_append_mem(ds, ds_warnings->str,
ds_warnings->length);
--- 1.169/tests/mysql_client_test.c 2006-01-30 10:57:34 +01:00
+++ 1.170/tests/mysql_client_test.c 2006-02-10 14:53:50 +01:00
@@ -1049,7 +1049,10 @@
reading from the rest.
*/
-my_bool fetch_n(const char **query_list, unsigned query_count)
+enum fetch_type { USE_ROW_BY_ROW_FETCH= 0, USE_STORE_RESULT= 1 };
+
+my_bool fetch_n(const char **query_list, unsigned query_count,
+ enum fetch_type fetch_type)
{
unsigned open_statements= query_count;
int rc, error_count= 0;
@@ -1065,6 +1068,15 @@
query_list[fetch - fetch_array]);
}
+ if (fetch_type == USE_STORE_RESULT)
+ {
+ for (fetch= fetch_array; fetch < fetch_array + query_count; ++fetch)
+ {
+ rc= mysql_stmt_store_result(fetch->handle);
+ check_execute(fetch->handle, rc);
+ }
+ }
+
while (open_statements)
{
for (fetch= fetch_array; fetch < fetch_array + query_count; ++fetch)
@@ -11867,7 +11879,8 @@
fill_tables(basic_tables, sizeof(basic_tables)/sizeof(*basic_tables));
- fetch_n(queries, sizeof(queries)/sizeof(*queries));
+ fetch_n(queries, sizeof(queries)/sizeof(*queries), USE_ROW_BY_ROW_FETCH);
+ fetch_n(queries, sizeof(queries)/sizeof(*queries), USE_STORE_RESULT);
DBUG_VOID_RETURN;
}
@@ -11880,7 +11893,8 @@
"SELECT t1.id FROM t1 WHERE t1.id < 5"
};
myheader("test_cursors_with_union");
- fetch_n(queries, sizeof(queries)/sizeof(*queries));
+ fetch_n(queries, sizeof(queries)/sizeof(*queries), USE_ROW_BY_ROW_FETCH);
+ fetch_n(queries, sizeof(queries)/sizeof(*queries), USE_STORE_RESULT);
}
/*
| Thread |
|---|
| • bk commit into 5.1 tree (msvensson:1.2132) | msvensson | 10 Feb |