List:Internals« Previous MessageNext Message »
From:konstantin Date:May 16 2005 4:29pm
Subject:bk commit into 5.0 tree (konstantin:1.1835)
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of kostja. When kostja 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.1835 05/05/16 18:29:04 konstantin@stripped +3 -0
  Merge bk-internal.mysql.com:/home/bk/mysql-5.0
  into mysql.com:/opt/local/work/mysql-5.0-9643

  tests/mysql_client_test.c
    1.118 05/05/16 18:29:02 konstantin@stripped +0 -0
    Auto merged

  libmysql/libmysql.c
    1.214 05/05/16 18:29:01 konstantin@stripped +0 -0
    Auto merged

  include/mysql.h
    1.150 05/05/16 18:29:01 konstantin@stripped +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:	konstantin
# Host:	dragonfly.local
# Root:	/opt/local/work/mysql-5.0-9643/RESYNC

--- 1.149/include/mysql.h	2005-05-14 12:36:55 +04:00
+++ 1.150/include/mysql.h	2005-05-16 18:29:01 +04:00
@@ -664,6 +664,7 @@
                                   unsigned char **row);
   unsigned long	 stmt_id;	       /* Id for prepared statement */
   unsigned long  flags;                /* i.e. type of cursor to open */
+  unsigned long  prefetch_rows;        /* number of rows per one COM_FETCH */
   /*
     Copied from mysql->server_status after execute/fetch to know
     server-side cursor status for this statement.
@@ -702,7 +703,12 @@
     unsigned long with combination of cursor flags (read only, for update,
     etc)
   */
-  STMT_ATTR_CURSOR_TYPE
+  STMT_ATTR_CURSOR_TYPE,
+  /*
+    Amount of rows to retrieve from server per one fetch if using cursors.
+    Accepts unsigned long attribute in the range 1 - ulong_max
+  */
+  STMT_ATTR_PREFETCH_ROWS
 };
 
 

--- 1.213/libmysql/libmysql.c	2005-05-14 12:36:56 +04:00
+++ 1.214/libmysql/libmysql.c	2005-05-16 18:29:01 +04:00
@@ -1733,6 +1733,9 @@
 
 /******************* Declarations ***********************************/
 
+/* Default number of rows fetched per one COM_FETCH command. */
+
+#define DEFAULT_PREFETCH_ROWS 1UL
 
 /*
   These functions are called by function pointer MYSQL_STMT::read_row_func.
@@ -1758,6 +1761,7 @@
 
 #define RESET_SERVER_SIDE 1
 #define RESET_LONG_DATA 2
+#define RESET_STORE_RESULT 4
 
 static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags);
 
@@ -1998,6 +2002,7 @@
   stmt->state= MYSQL_STMT_INIT_DONE;
   stmt->mysql= mysql;
   stmt->read_row_func= stmt_read_row_no_data;
+  stmt->prefetch_rows= DEFAULT_PREFETCH_ROWS;
   /* The rest of statement members was bzeroed inside malloc */
 
   DBUG_RETURN(stmt);
@@ -2056,7 +2061,7 @@
     /* This is second prepare with another statement */
     char buff[MYSQL_STMT_HEADER];               /* 4 bytes - stmt id */
 
-    if (reset_stmt_handle(stmt, RESET_LONG_DATA))
+    if (reset_stmt_handle(stmt, RESET_LONG_DATA | RESET_STORE_RESULT))
       DBUG_RETURN(1);
     /*
       These members must be reset for API to
@@ -2711,7 +2716,7 @@
     result->rows= 0;
     /* Send row request to the server */
     int4store(buff, stmt->stmt_id);
-    int4store(buff + 4, 1); /* number of rows to fetch */
+    int4store(buff + 4, stmt->prefetch_rows); /* number of rows to fetch */
     if (cli_advanced_command(mysql, COM_FETCH, buff, sizeof(buff),
                              NullS, 0, 1))
     {
@@ -2769,12 +2774,29 @@
     stmt->update_max_length= value ? *(const my_bool*) value : 0;
     break;
   case STMT_ATTR_CURSOR_TYPE:
-    stmt->flags= value ? *(const unsigned long *) value : 0;
+  {
+    ulong cursor_type;
+    cursor_type= value ? *(ulong*) value : 0UL;
+    if (cursor_type > (ulong) CURSOR_TYPE_READ_ONLY)
+      goto err_not_implemented;
+    stmt->flags= cursor_type;
+    break;
+  }
+  case STMT_ATTR_PREFETCH_ROWS:
+  {
+    ulong prefetch_rows= value ? *(ulong*) value : DEFAULT_PREFETCH_ROWS;
+    if (value == 0)
+      return TRUE;
+    stmt->prefetch_rows= prefetch_rows;
     break;
+  }
   default:
-    return TRUE;
+    goto err_not_implemented;
   }
   return FALSE;
+err_not_implemented:
+  set_stmt_error(stmt, CR_NOT_IMPLEMENTED, unknown_sqlstate);
+  return TRUE;
 }
 
 
@@ -2851,7 +2873,7 @@
     DBUG_RETURN(1);
   }
 
-  if (reset_stmt_handle(stmt, 0))
+  if (reset_stmt_handle(stmt, RESET_STORE_RESULT))
     DBUG_RETURN(1);
   /*
     No need to check for stmt->state: if the statement wasn't
@@ -4859,7 +4881,11 @@
     MYSQL_DATA *result= &stmt->result;
     my_bool has_cursor= stmt->read_row_func == stmt_read_row_from_cursor;
 
-    if (result->data)
+    /*
+      Reset stored result set if so was requested or it's a part
+      of cursor fetch.
+    */
+    if (result->data && (has_cursor || (flags & RESET_STORE_RESULT)))
     {
       /* Result buffered */
       free_root(&result->alloc, MYF(MY_KEEP_PREALLOC));
@@ -4918,7 +4944,7 @@
   DBUG_ENTER("mysql_stmt_free_result");
 
   /* Free the client side and close the server side cursor if there is one */
-  DBUG_RETURN(reset_stmt_handle(stmt, RESET_LONG_DATA));
+  DBUG_RETURN(reset_stmt_handle(stmt, RESET_LONG_DATA | RESET_STORE_RESULT));
 }
 
 /********************************************************************

--- 1.117/tests/mysql_client_test.c	2005-05-16 14:34:19 +04:00
+++ 1.118/tests/mysql_client_test.c	2005-05-16 18:29:02 +04:00
@@ -13079,6 +13079,68 @@
 
 
 /*
+  Error message is returned for unsupported features.
+  Test also cursors with non-default PREFETCH_ROWS
+*/
+
+static void test_bug9643()
+{
+  MYSQL_STMT *stmt;
+  MYSQL_BIND bind[1];
+  int32 a;
+  int rc;
+  const char *stmt_text;
+  int num_rows= 0;
+  ulong type;
+  ulong prefetch_rows= 5;
+
+  myheader("test_bug9643");
+
+  mysql_query(mysql, "drop table if exists t1");
+  mysql_query(mysql, "create table t1 (id integer not null primary key)");
+  rc= mysql_query(mysql, "insert into t1 (id) values "
+                         " (1), (2), (3), (4), (5), (6), (7), (8), (9)");
+  myquery(rc);
+
+  stmt= mysql_stmt_init(mysql);
+  /* Not implemented in 5.0 */
+  type= (ulong) CURSOR_TYPE_SCROLLABLE;
+  rc= mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*) &type);
+  DIE_UNLESS(rc);
+  if (! opt_silent)
+    printf("Got error (as expected): %s\n", mysql_stmt_error(stmt));
+
+  type= (ulong) CURSOR_TYPE_READ_ONLY;
+  rc= mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*) &type);
+  check_execute(stmt, rc);
+  rc= mysql_stmt_attr_set(stmt, STMT_ATTR_PREFETCH_ROWS,
+                          (void*) &prefetch_rows);
+  check_execute(stmt, rc);
+  stmt_text= "select * from t1";
+  rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
+  check_execute(stmt, rc);
+
+  bzero(bind, sizeof(bind));
+  bind[0].buffer_type= MYSQL_TYPE_LONG;
+  bind[0].buffer= (void*) &a;
+  bind[0].buffer_length= sizeof(a);
+  mysql_stmt_bind_result(stmt, bind);
+
+  rc= mysql_stmt_execute(stmt);
+  check_execute(stmt, rc);
+
+  while ((rc= mysql_stmt_fetch(stmt)) == 0)
+    ++num_rows;
+  DIE_UNLESS(num_rows == 9);
+
+  rc= mysql_stmt_close(stmt);
+  DIE_UNLESS(rc == 0);
+
+  rc= mysql_query(mysql, "drop table t1");
+  myquery(rc);
+}
+
+/*
   Read and parse arguments and MySQL options from my.cnf
 */
 
@@ -13309,6 +13371,7 @@
   { "test_bug9159", test_bug9159 },
   { "test_bug9520", test_bug9520 },
   { "test_bug9478", test_bug9478 },
+  { "test_bug9643", test_bug9643 },
   { 0, 0 }
 };
 
Thread
bk commit into 5.0 tree (konstantin:1.1835)konstantin16 May