"Fossies" - the Fresh Open Source Software Archive

Member "mariadb-connector-c-3.0.8-src/unittest/libmariadb/result.c" (18 Dec 2018, 31568 Bytes) of package /linux/misc/mariadb-connector-c-3.0.8-src.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. See also the last Fossies "Diffs" side-by-side code changes report for "result.c": 3.0.3-src_vs_3.0.4-src.

    1 /*
    2 Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
    3 
    4 The MySQL Connector/C is licensed under the terms of the GPLv2
    5 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
    6 MySQL Connectors. There are special exceptions to the terms and
    7 conditions of the GPLv2 as it is applied to this software, see the
    8 FLOSS License Exception
    9 <http://www.mysql.com/about/legal/licensing/foss-exception.html>.
   10 
   11 This program is free software; you can redistribute it and/or modify
   12 it under the terms of the GNU General Public License as published
   13 by the Free Software Foundation; version 2 of the License.
   14 
   15 This program is distributed in the hope that it will be useful, but
   16 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   17 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
   18 for more details.
   19 
   20 You should have received a copy of the GNU General Public License along
   21 with this program; if not, write to the Free Software Foundation, Inc.,
   22 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
   23 */
   24 /**
   25   Some basic tests of the client API.
   26 */
   27 
   28 #include "my_test.h"
   29 
   30 static int client_store_result(MYSQL *mysql)
   31 {
   32   MYSQL_RES *result;
   33   int       rc, rowcount= 0;
   34 
   35   rc= mysql_query(mysql, "SELECT 'foo' FROM DUAL UNION SELECT 'bar' FROM DUAL");
   36   check_mysql_rc(rc, mysql);
   37 
   38   /* get the result */
   39   result= mysql_store_result(mysql);
   40   FAIL_IF(!result, "Invalid result set");
   41 
   42   /* since we use store result, we should be able execute other api calls */
   43   rc= mysql_ping(mysql);
   44   FAIL_IF(rc, "mysql_ping failed");
   45 
   46   while (mysql_fetch_row(result))
   47     rowcount++;
   48 
   49   FAIL_IF(rowcount != 2, "rowcount != 2");
   50   
   51   mysql_free_result(result);
   52 
   53   return OK;
   54 }
   55 
   56 static int client_use_result(MYSQL *mysql)
   57 {
   58   MYSQL_RES *result;
   59   int       rc, rowcount= 0;
   60 
   61   rc= mysql_query(mysql, "SELECT 'foo' FROM DUAL UNION SELECT 'bar' FROM DUAL");
   62   check_mysql_rc(rc, mysql);
   63 
   64   /* get the result */
   65   result= mysql_use_result(mysql);
   66   FAIL_IF(!result, "Invalid result set");
   67 
   68   /* since we use use result, we shouldn't be able execute other api calls */
   69   rc= mysql_ping(mysql);
   70   FAIL_IF(!rc, "Error expected");
   71 
   72   while (mysql_fetch_row(result))
   73     rowcount++;
   74 
   75   FAIL_IF(rowcount != 2, "rowcount != 2");
   76   
   77   mysql_free_result(result);
   78 
   79   return OK;
   80 }
   81 
   82 static int test_free_result(MYSQL *mysql)
   83 {
   84   MYSQL_STMT *stmt;
   85   MYSQL_BIND my_bind[1];
   86   char       c2[5];
   87   ulong      bl1, l2;
   88   int        rc, c1, bc1;
   89   char       query[MAX_TEST_QUERY_LENGTH];
   90 
   91   rc= mysql_query(mysql, "drop table if exists test_free_result");
   92   check_mysql_rc(rc, mysql);
   93 
   94   rc= mysql_query(mysql, "create table test_free_result("
   95                          "c1 int primary key auto_increment)");
   96   check_mysql_rc(rc, mysql);
   97 
   98   rc= mysql_query(mysql, "insert into test_free_result values(), (), ()");
   99   check_mysql_rc(rc, mysql);
  100 
  101   strcpy(query, "select * from test_free_result");
  102   stmt= mysql_stmt_init(mysql);
  103   FAIL_IF(!stmt, mysql_error(mysql));
  104   rc= mysql_stmt_prepare(stmt, SL(query));
  105   check_stmt_rc(rc, stmt);
  106 
  107   memset(my_bind, '\0', sizeof(my_bind));
  108   my_bind[0].buffer_type= MYSQL_TYPE_LONG;
  109   my_bind[0].buffer= (void *)&bc1;
  110   my_bind[0].length= &bl1;
  111 
  112   rc= mysql_stmt_execute(stmt);
  113   check_stmt_rc(rc, stmt);
  114 
  115   rc= mysql_stmt_bind_result(stmt, my_bind);
  116   check_stmt_rc(rc, stmt);
  117 
  118   rc= mysql_stmt_fetch(stmt);
  119   check_stmt_rc(rc, stmt);
  120 
  121   c2[0]= '\0'; l2= 0;
  122   my_bind[0].buffer_type= MYSQL_TYPE_STRING;
  123   my_bind[0].buffer= (void *)c2;
  124   my_bind[0].buffer_length= 7;
  125   my_bind[0].is_null= 0;
  126   my_bind[0].length= &l2;
  127 
  128   rc= mysql_stmt_fetch_column(stmt, my_bind, 0, 0);
  129   check_stmt_rc(rc, stmt);
  130   FAIL_UNLESS(strncmp(c2, "1", 1) == 0, "c2 != '1'");
  131   FAIL_UNLESS(l2 == 1, "l2 != 1");
  132 
  133   rc= mysql_stmt_fetch(stmt);
  134   check_stmt_rc(rc, stmt);
  135 
  136   c1= 0, l2= 0;
  137   my_bind[0].buffer_type= MYSQL_TYPE_LONG;
  138   my_bind[0].buffer= (void *)&c1;
  139   my_bind[0].buffer_length= 0;
  140   my_bind[0].is_null= 0;
  141   my_bind[0].length= &l2;
  142 
  143   rc= mysql_stmt_fetch_column(stmt, my_bind, 0, 0);
  144   check_stmt_rc(rc, stmt);
  145   FAIL_UNLESS(c1 == 2, "c1 != 2");
  146   FAIL_UNLESS(l2 == 4, "l2 != 4");
  147 
  148   rc= mysql_query(mysql, "drop table test_free_result");
  149   FAIL_IF(!rc, "Error commands out of sync expected");
  150 
  151   rc= mysql_stmt_free_result(stmt);
  152   check_stmt_rc(rc, stmt);
  153 
  154   rc= mysql_query(mysql, "drop table test_free_result");
  155   check_mysql_rc(rc, mysql);  /* should be successful */
  156 
  157   mysql_stmt_close(stmt);
  158 
  159   return OK;
  160 }
  161 
  162 
  163 /* Test mysql_stmt_store_result() */
  164 
  165 static int test_free_store_result(MYSQL *mysql)
  166 {
  167   MYSQL_STMT *stmt;
  168   MYSQL_BIND my_bind[1];
  169   char       c2[5];
  170   ulong      bl1, l2;
  171   int        rc, c1, bc1;
  172   char       query[MAX_TEST_QUERY_LENGTH];
  173 
  174   rc= mysql_query(mysql, "drop table if exists test_free_result");
  175   check_mysql_rc(rc, mysql);
  176 
  177   rc= mysql_query(mysql, "create table test_free_result(c1 int primary key auto_increment)");
  178   check_mysql_rc(rc, mysql);
  179 
  180   rc= mysql_query(mysql, "insert into test_free_result values(), (), ()");
  181   check_mysql_rc(rc, mysql);
  182 
  183   strcpy(query, "select * from test_free_result");
  184   stmt= mysql_stmt_init(mysql);
  185   FAIL_IF(!stmt, mysql_error(mysql));
  186   rc= mysql_stmt_prepare(stmt, SL(query));
  187   check_stmt_rc(rc, stmt);
  188 
  189   memset(my_bind, '\0', sizeof(my_bind));
  190   my_bind[0].buffer_type= MYSQL_TYPE_LONG;
  191   my_bind[0].buffer= (void *)&bc1;
  192   my_bind[0].buffer_length= 0;
  193   my_bind[0].is_null= 0;
  194   my_bind[0].length= &bl1;
  195 
  196   rc= mysql_stmt_execute(stmt);
  197   check_stmt_rc(rc, stmt);
  198 
  199   rc= mysql_stmt_bind_result(stmt, my_bind);
  200   check_stmt_rc(rc, stmt);
  201 
  202   rc= mysql_stmt_store_result(stmt);
  203   check_stmt_rc(rc, stmt);
  204 
  205   rc= mysql_stmt_fetch(stmt);
  206   check_stmt_rc(rc, stmt);
  207 
  208   c2[0]= '\0'; l2= 0;
  209   my_bind[0].buffer_type= MYSQL_TYPE_STRING;
  210   my_bind[0].buffer= (void *)c2;
  211   my_bind[0].buffer_length= 7;
  212   my_bind[0].is_null= 0;
  213   my_bind[0].length= &l2;
  214 
  215   rc= mysql_stmt_fetch_column(stmt, my_bind, 0, 0);
  216   check_stmt_rc(rc, stmt);
  217   FAIL_UNLESS(strncmp(c2, "1", 1) == 0, "c2 != '1'");
  218   FAIL_UNLESS(l2 == 1, "l2 != 1");
  219 
  220   rc= mysql_stmt_fetch(stmt);
  221   check_stmt_rc(rc, stmt);
  222 
  223   c1= 0, l2= 0;
  224   my_bind[0].buffer_type= MYSQL_TYPE_LONG;
  225   my_bind[0].buffer= (void *)&c1;
  226   my_bind[0].buffer_length= 0;
  227   my_bind[0].is_null= 0;
  228   my_bind[0].length= &l2;
  229 
  230   rc= mysql_stmt_fetch_column(stmt, my_bind, 0, 0);
  231   check_stmt_rc(rc, stmt);
  232   FAIL_UNLESS(c1 == 2, "c1 != 2");
  233   FAIL_UNLESS(l2 == 4, "l2 != 4");
  234 
  235   rc= mysql_stmt_free_result(stmt);
  236   check_stmt_rc(rc, stmt);
  237 
  238   rc= mysql_query(mysql, "drop table test_free_result");
  239   check_mysql_rc(rc, mysql);
  240 
  241   mysql_stmt_close(stmt);
  242 
  243   return OK;
  244 }
  245 
  246 static int test_store_result(MYSQL *mysql)
  247 {
  248   MYSQL_STMT *stmt;
  249   int        rc;
  250   int32      nData;
  251   char       szData[100];
  252   MYSQL_BIND my_bind[2];
  253   ulong      length, length1;
  254   my_bool    is_null[2];
  255   char       query[MAX_TEST_QUERY_LENGTH];
  256 
  257   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_store_result");
  258   check_mysql_rc(rc, mysql);
  259 
  260   rc= mysql_query(mysql, "CREATE TABLE test_store_result(col1 int , col2 varchar(50))");
  261   check_mysql_rc(rc, mysql);
  262 
  263   rc= mysql_query(mysql, "INSERT INTO test_store_result VALUES(10, 'venu'), (20, 'mysql')");
  264   check_mysql_rc(rc, mysql);
  265 
  266   rc= mysql_query(mysql, "INSERT INTO test_store_result(col2) VALUES('monty')");
  267   check_mysql_rc(rc, mysql);
  268 
  269   rc= mysql_commit(mysql);
  270   check_mysql_rc(rc, mysql);
  271 
  272   /* fetch */
  273   memset(my_bind, '\0', sizeof(my_bind));
  274   my_bind[0].buffer_type= MYSQL_TYPE_LONG;
  275   my_bind[0].buffer= (void *) &nData;       /* integer data */
  276   my_bind[0].length= &length;
  277   my_bind[0].is_null= &is_null[0];
  278 
  279   length= 0;
  280   my_bind[1].buffer_type= MYSQL_TYPE_STRING;
  281   my_bind[1].buffer= szData;                /* string data */
  282   my_bind[1].buffer_length= sizeof(szData);
  283   my_bind[1].length= &length1;
  284   my_bind[1].is_null= &is_null[1];
  285   length1= 0;
  286 
  287   strcpy(query, "SELECT * FROM test_store_result");
  288   stmt= mysql_stmt_init(mysql);
  289   FAIL_IF(!stmt, mysql_error(mysql));
  290   rc= mysql_stmt_prepare(stmt, SL(query));
  291   check_stmt_rc(rc, stmt);
  292 
  293   rc= mysql_stmt_bind_result(stmt, my_bind);
  294   check_stmt_rc(rc, stmt);
  295 
  296   rc= mysql_stmt_execute(stmt);
  297   check_stmt_rc(rc, stmt);
  298 
  299   rc= mysql_stmt_store_result(stmt);
  300   check_stmt_rc(rc, stmt);
  301 
  302   rc= mysql_stmt_fetch(stmt);
  303   check_stmt_rc(rc, stmt);
  304 
  305   FAIL_UNLESS(nData == 10, "nData != 10");
  306   FAIL_UNLESS(strcmp(szData, "venu") == 0, "szData != 'Venu'");
  307   FAIL_UNLESS(length1 == 4, "length1 != 4");
  308 
  309   rc= mysql_stmt_fetch(stmt);
  310   check_stmt_rc(rc, stmt);
  311 
  312   FAIL_UNLESS(nData == 20, "nData != 20");
  313   FAIL_UNLESS(strcmp(szData, "mysql") == 0, "szDaza != 'mysql'");
  314   FAIL_UNLESS(length1 == 5, "length1 != 5");
  315 
  316   length= 99;
  317   rc= mysql_stmt_fetch(stmt);
  318   check_stmt_rc(rc, stmt);
  319 
  320   FAIL_UNLESS(is_null[0], "isnull set");
  321   FAIL_UNLESS(strcmp(szData, "monty") == 0, "szData != 'monty'");
  322   FAIL_UNLESS(length1 == 5, "length1 != 5");
  323 
  324   rc= mysql_stmt_fetch(stmt);
  325   FAIL_UNLESS(rc == MYSQL_NO_DATA, "rc != MYSQL_NO_DATA");
  326 
  327   rc= mysql_stmt_execute(stmt);
  328   check_stmt_rc(rc, stmt);
  329 
  330   rc= mysql_stmt_store_result(stmt);
  331   check_stmt_rc(rc, stmt);
  332 
  333   rc= mysql_stmt_fetch(stmt);
  334   check_stmt_rc(rc, stmt);
  335 
  336   FAIL_UNLESS(nData == 10, "nData != 10");
  337   FAIL_UNLESS(strcmp(szData, "venu") == 0, "szData != 'Venu'");
  338   FAIL_UNLESS(length1 == 4, "length1 != 4");
  339 
  340   rc= mysql_stmt_fetch(stmt);
  341   check_stmt_rc(rc, stmt);
  342 
  343   FAIL_UNLESS(nData == 20, "nData != 20");
  344   FAIL_UNLESS(strcmp(szData, "mysql") == 0, "szDaza != 'mysql'");
  345   FAIL_UNLESS(length1 == 5, "length1 != 5");
  346 
  347   length= 99;
  348   rc= mysql_stmt_fetch(stmt);
  349   check_stmt_rc(rc, stmt);
  350 
  351   FAIL_UNLESS(is_null[0], "isnull set");
  352   FAIL_UNLESS(strcmp(szData, "monty") == 0, "szData != 'monty'");
  353   FAIL_UNLESS(length1 == 5, "length1 != 5");
  354 
  355   rc= mysql_stmt_fetch(stmt);
  356   FAIL_UNLESS(rc == MYSQL_NO_DATA, "rc != MYSQL_NO_DATA");
  357 
  358   mysql_stmt_close(stmt);
  359   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_store_result");
  360   check_mysql_rc(rc, mysql);
  361 
  362   return OK;
  363 }
  364 
  365 
  366 /* Test simple bind store result */
  367 
  368 static int test_store_result1(MYSQL *mysql)
  369 {
  370   MYSQL_STMT *stmt;
  371   int        rc;
  372   char       query[MAX_TEST_QUERY_LENGTH];
  373 
  374   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_store_result");
  375   check_mysql_rc(rc, mysql);
  376 
  377   rc= mysql_query(mysql, "CREATE TABLE test_store_result(col1 int , col2 varchar(50))");
  378   check_mysql_rc(rc, mysql);
  379 
  380   rc= mysql_query(mysql, "INSERT INTO test_store_result VALUES(10, 'venu'), (20, 'mysql')");
  381   check_mysql_rc(rc, mysql);
  382 
  383   rc= mysql_query(mysql, "INSERT INTO test_store_result(col2) VALUES('monty')");
  384   check_mysql_rc(rc, mysql);
  385 
  386   rc= mysql_commit(mysql);
  387   check_mysql_rc(rc, mysql);
  388 
  389   strcpy(query, "SELECT * FROM test_store_result");
  390   stmt= mysql_stmt_init(mysql);
  391   FAIL_IF(!stmt, mysql_error(mysql));
  392   rc= mysql_stmt_prepare(stmt, SL(query));
  393   check_stmt_rc(rc, stmt);
  394 
  395   rc= mysql_stmt_execute(stmt);
  396   check_stmt_rc(rc, stmt);
  397 
  398   rc= mysql_stmt_store_result(stmt);
  399   check_stmt_rc(rc, stmt);
  400 
  401   rc= 0;
  402   while (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA)
  403     rc++;
  404   FAIL_UNLESS(rc == 3, "rowcount != 3");
  405 
  406   rc= mysql_stmt_execute(stmt);
  407   check_stmt_rc(rc, stmt);
  408 
  409   rc= mysql_stmt_store_result(stmt);
  410   check_stmt_rc(rc, stmt);
  411 
  412   rc= 0;
  413   while (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA)
  414     rc++;
  415   FAIL_UNLESS(rc == 3, "rowcount != 3");
  416 
  417   mysql_stmt_close(stmt);
  418   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_store_result");
  419   check_mysql_rc(rc, mysql);
  420 
  421   return OK;
  422 }
  423 
  424 
  425 /* Another test for bind and store result */
  426 
  427 static int test_store_result2(MYSQL *mysql)
  428 {
  429   MYSQL_STMT *stmt;
  430   int        rc;
  431   int        nData;
  432   ulong      length;
  433   MYSQL_BIND my_bind[1];
  434   char query[MAX_TEST_QUERY_LENGTH];
  435 
  436   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_store_result");
  437   check_mysql_rc(rc, mysql);
  438 
  439   rc= mysql_query(mysql, "CREATE TABLE test_store_result(col1 int , col2 varchar(50))");
  440   check_mysql_rc(rc, mysql);
  441 
  442   rc= mysql_query(mysql, "INSERT INTO test_store_result VALUES(10, 'venu'), (20, 'mysql')");
  443   check_mysql_rc(rc, mysql);
  444 
  445   rc= mysql_query(mysql, "INSERT INTO test_store_result(col2) VALUES('monty')");
  446   check_mysql_rc(rc, mysql);
  447 
  448   rc= mysql_commit(mysql);
  449   check_mysql_rc(rc, mysql);
  450 
  451   memset(my_bind, '\0', sizeof(my_bind));
  452 
  453   my_bind[0].buffer_type= MYSQL_TYPE_LONG;
  454   my_bind[0].buffer= (void *) &nData;      /* integer data */
  455   my_bind[0].length= &length;
  456   my_bind[0].is_null= 0;
  457 
  458   strcpy((char *)query , "SELECT col1 FROM test_store_result where col1= ?");
  459   stmt= mysql_stmt_init(mysql);
  460   FAIL_IF(!stmt, mysql_error(mysql));
  461   rc= mysql_stmt_prepare(stmt, SL(query));
  462   check_stmt_rc(rc, stmt);
  463 
  464   rc= mysql_stmt_bind_param(stmt, my_bind);
  465   check_stmt_rc(rc, stmt);
  466 
  467   rc= mysql_stmt_bind_result(stmt, my_bind);
  468   check_stmt_rc(rc, stmt);
  469 
  470   nData= 10; length= 0;
  471   rc= mysql_stmt_execute(stmt);
  472   check_stmt_rc(rc, stmt);
  473 
  474   nData= 0;
  475   rc= mysql_stmt_store_result(stmt);
  476   check_stmt_rc(rc, stmt);
  477 
  478   rc= mysql_stmt_fetch(stmt);
  479   check_stmt_rc(rc, stmt);
  480 
  481   FAIL_UNLESS(nData == 10, "nData != 10");
  482 
  483   rc= mysql_stmt_fetch(stmt);
  484   FAIL_UNLESS(rc == MYSQL_NO_DATA, "rc != MYSQL_NO_DATA");
  485 
  486   nData= 20;
  487   rc= mysql_stmt_execute(stmt);
  488   check_stmt_rc(rc, stmt);
  489 
  490   nData= 0;
  491   rc= mysql_stmt_store_result(stmt);
  492   check_stmt_rc(rc, stmt);
  493 
  494   rc= mysql_stmt_fetch(stmt);
  495   check_stmt_rc(rc, stmt);
  496 
  497   FAIL_UNLESS(nData == 20, "nData != 20");
  498 
  499   rc= mysql_stmt_fetch(stmt);
  500   FAIL_UNLESS(rc == MYSQL_NO_DATA, "rc != MYSQL_NO_DATA");
  501   mysql_stmt_close(stmt);
  502   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_store_result");
  503   check_mysql_rc(rc, mysql);
  504 
  505   return OK;
  506 }
  507 
  508 static int test_bug11718(MYSQL *mysql)
  509 {
  510   MYSQL_RES *res;
  511   int rc;
  512   const char *query= "select str_to_date(concat(f3),'%Y%m%d') from t1,t2 "
  513                      "where f1=f2 order by f1";
  514 
  515   rc= mysql_query(mysql, "drop table if exists t1, t2");
  516   check_mysql_rc(rc, mysql);
  517   rc= mysql_query(mysql, "create table t1 (f1 int)");
  518   check_mysql_rc(rc, mysql);
  519   rc= mysql_query(mysql, "create table t2 (f2 int, f3 numeric(8))");
  520   check_mysql_rc(rc, mysql);
  521   rc= mysql_query(mysql, "insert into t1 values (1), (2)");
  522   check_mysql_rc(rc, mysql);
  523   rc= mysql_query(mysql, "insert into t2 values (1,20050101), (2,20050202)");
  524   check_mysql_rc(rc, mysql);
  525   rc= mysql_query(mysql, query);
  526   check_mysql_rc(rc, mysql);
  527   res = mysql_store_result(mysql);
  528 
  529   FAIL_UNLESS(res->fields[0].type == MYSQL_TYPE_DATE, "type != MYSQL_TYPE_DATE");
  530   mysql_free_result(res);
  531   rc= mysql_query(mysql, "drop table t1, t2");
  532   check_mysql_rc(rc, mysql);
  533 
  534   return OK;
  535 }
  536 
  537 static int test_bug19671(MYSQL *mysql)
  538 {
  539   MYSQL_RES *result;
  540   int rc;
  541 
  542   mysql_query(mysql, "set sql_mode=''");
  543   rc= mysql_query(mysql, "drop table if exists t1");
  544   check_mysql_rc(rc, mysql)
  545 
  546   rc= mysql_query(mysql, "drop view if exists v1");
  547   check_mysql_rc(rc, mysql)
  548 
  549   rc= mysql_query(mysql, "create table t1(f1 int)");
  550   check_mysql_rc(rc, mysql)
  551 
  552   rc= mysql_query(mysql, "create view v1 as select va.* from t1 va");
  553   check_mysql_rc(rc, mysql)
  554 
  555   result= mysql_list_fields(mysql, "v1", NULL);
  556   FAIL_IF(!result, "Invalid result set");
  557 
  558   rc= 0;
  559   while (mysql_fetch_row(result))
  560     rc++;
  561   FAIL_UNLESS(rc == 0, "");
  562 
  563   if (verify_prepare_field(result, 0, "f1", "f1", MYSQL_TYPE_LONG,
  564                        "v1", "v1", schema, 11, "0")) {
  565     mysql_free_result(result);
  566     diag("verify_prepare_field failed");
  567     return FAIL;
  568   }
  569 
  570   mysql_free_result(result);
  571   check_mysql_rc(mysql_query(mysql, "drop view v1"), mysql)
  572   check_mysql_rc(mysql_query(mysql, "drop table t1"), mysql)
  573   return OK;
  574 }
  575 
  576 /*
  577   Bug#21726: Incorrect result with multiple invocations of
  578   LAST_INSERT_ID
  579 
  580   Test that client gets updated value of insert_id on UPDATE that uses
  581   LAST_INSERT_ID(expr).
  582   select_query added to test for bug
  583     #26921 Problem in mysql_insert_id() Embedded C API function
  584 */
  585 static int test_bug21726(MYSQL *mysql)
  586 {
  587   const char *create_table[]=
  588   {
  589     "DROP TABLE IF EXISTS t1",
  590     "CREATE TABLE t1 (i INT)",
  591     "INSERT INTO t1 VALUES (1)",
  592   };
  593   const char *update_query= "UPDATE t1 SET i= LAST_INSERT_ID(i + 1)";
  594   int rc;
  595   unsigned long long insert_id;
  596   const char *select_query= "SELECT * FROM t1";
  597   MYSQL_RES  *result;
  598 
  599   rc= mysql_query(mysql, create_table[0]);
  600   check_mysql_rc(rc, mysql);
  601   rc= mysql_query(mysql, create_table[1]);
  602   check_mysql_rc(rc, mysql);
  603   rc= mysql_query(mysql, create_table[2]);
  604   check_mysql_rc(rc, mysql);
  605 
  606   rc= mysql_query(mysql, update_query);
  607   check_mysql_rc(rc, mysql)
  608   insert_id= mysql_insert_id(mysql);
  609   FAIL_UNLESS(insert_id == 2, "insert_id != 2");
  610 
  611   rc= mysql_query(mysql, update_query);
  612   check_mysql_rc(rc, mysql)
  613   insert_id= mysql_insert_id(mysql);
  614   FAIL_UNLESS(insert_id == 3, "insert_id != 3");
  615 
  616   rc= mysql_query(mysql, select_query);
  617   check_mysql_rc(rc, mysql)
  618   insert_id= mysql_insert_id(mysql);
  619   FAIL_UNLESS(insert_id == 3, "insert_id != 3");
  620   result= mysql_store_result(mysql);
  621   mysql_free_result(result);
  622 
  623   return OK;
  624 }
  625 
  626 /* Bug#6761 - mysql_list_fields doesn't work */
  627 
  628 static int test_bug6761(MYSQL *mysql)
  629 {
  630   const char *stmt_text;
  631   MYSQL_RES *res;
  632   int rc;
  633 
  634   rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
  635   check_mysql_rc(rc, mysql);
  636 
  637   stmt_text= "CREATE TABLE t1 (a int, b char(255), c decimal)";
  638   rc= mysql_real_query(mysql, stmt_text, (unsigned long)strlen(stmt_text));
  639   check_mysql_rc(rc, mysql);
  640 
  641   res= mysql_list_fields(mysql, "t1", "%");
  642   FAIL_UNLESS(res && mysql_num_fields(res) == 3, "num_fields != 3");
  643   mysql_free_result(res);
  644 
  645   stmt_text= "DROP TABLE t1";
  646   rc= mysql_real_query(mysql, stmt_text, (unsigned long)strlen(stmt_text));
  647   check_mysql_rc(rc, mysql);
  648   return OK;
  649 }
  650 
  651 /* Test field flags (verify .NET provider) */
  652 
  653 static int test_field_flags(MYSQL *mysql)
  654 {
  655   int          rc;
  656   MYSQL_RES    *result;
  657   MYSQL_FIELD  *field;
  658 
  659   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_field_flags");
  660   check_mysql_rc(rc, mysql);
  661 
  662   rc= mysql_query(mysql, "CREATE TABLE test_field_flags(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, \
  663                                                         id1 int NOT NULL, \
  664                                                         id2 int UNIQUE, \
  665                                                         id3 int, \
  666                                                         id4 int NOT NULL, \
  667                                                         id5 int, \
  668                                                         KEY(id3, id4))");
  669   check_mysql_rc(rc, mysql);
  670 
  671   /* with table name included with TRUE column name */
  672   rc= mysql_query(mysql, "SELECT * FROM test_field_flags");
  673   check_mysql_rc(rc, mysql);
  674 
  675   result= mysql_use_result(mysql);
  676   FAIL_IF(!result, "Invalid result set");
  677 
  678   mysql_field_seek(result, 0);
  679 
  680   field= mysql_fetch_field(result);
  681   FAIL_UNLESS(field->flags & NOT_NULL_FLAG && 
  682               field->flags & PRI_KEY_FLAG &&
  683               field->flags & AUTO_INCREMENT_FLAG, "Wrong flags for field 0");
  684 
  685   field= mysql_fetch_field(result);
  686   FAIL_UNLESS(field->flags & NOT_NULL_FLAG, "Wrong flags for field 1");
  687 
  688   field= mysql_fetch_field(result);
  689   FAIL_UNLESS(field->flags & UNIQUE_KEY_FLAG, "Wrong flags for field 2");
  690 
  691   field= mysql_fetch_field(result);
  692   FAIL_UNLESS(field->flags & MULTIPLE_KEY_FLAG, "Wrong flags for field 3");
  693 
  694   field= mysql_fetch_field(result);
  695   FAIL_UNLESS(field->flags & NOT_NULL_FLAG, "Wrong flags for field 4");
  696 
  697   mysql_free_result(result);
  698   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_field_flags");
  699   check_mysql_rc(rc, mysql);
  700   return OK;
  701 }
  702 
  703 /* Test real and alias names */
  704 
  705 static int test_field_names(MYSQL *mysql)
  706 {
  707   int        rc;
  708   MYSQL_RES  *result;
  709 
  710 
  711   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_field_names1");
  712   check_mysql_rc(rc, mysql);
  713 
  714   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_field_names2");
  715   check_mysql_rc(rc, mysql);
  716 
  717   rc= mysql_query(mysql, "CREATE TABLE test_field_names1(id int, name varchar(50))");
  718   check_mysql_rc(rc, mysql);
  719 
  720   rc= mysql_query(mysql, "CREATE TABLE test_field_names2(id int, name varchar(50))");
  721   check_mysql_rc(rc, mysql);
  722 
  723   /* with table name included with TRUE column name */
  724   rc= mysql_query(mysql, "SELECT id as 'id-alias' FROM test_field_names1");
  725   check_mysql_rc(rc, mysql);
  726 
  727   result= mysql_use_result(mysql);
  728   FAIL_IF(!result, "Invalid result set");
  729 
  730   rc= 0;
  731   while (mysql_fetch_row(result))
  732     rc++;
  733   FAIL_UNLESS(rc == 0, "rowcount != 0");
  734   mysql_free_result(result);
  735 
  736   /* with table name included with TRUE column name */
  737   rc= mysql_query(mysql, "SELECT t1.id as 'id-alias', test_field_names2.name FROM test_field_names1 t1, test_field_names2");
  738   check_mysql_rc(rc, mysql);
  739 
  740   result= mysql_use_result(mysql);
  741   FAIL_IF(!result, "Invalid result set");
  742 
  743   rc= 0;
  744   while (mysql_fetch_row(result))
  745     rc++;
  746   FAIL_UNLESS(rc == 0, "rowcount != 0");
  747   mysql_free_result(result);
  748   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_field_names1");
  749   check_mysql_rc(rc, mysql);
  750 
  751   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_field_names2");
  752   check_mysql_rc(rc, mysql);
  753   return OK;
  754 }
  755 
  756 /* Test FUNCTION field info / DATE_FORMAT() table_name . */
  757 
  758 static int test_func_fields(MYSQL *mysql)
  759 {
  760   int        rc;
  761   MYSQL_RES  *result;
  762   MYSQL_FIELD *field;
  763 
  764 
  765   rc= mysql_autocommit(mysql, TRUE);
  766   check_mysql_rc(rc, mysql);
  767 
  768   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_dateformat");
  769   check_mysql_rc(rc, mysql);
  770 
  771   rc= mysql_query(mysql, "CREATE TABLE test_dateformat(id int, \
  772                                                        ts timestamp)");
  773   check_mysql_rc(rc, mysql);
  774 
  775   rc= mysql_query(mysql, "INSERT INTO test_dateformat(id) values(10)");
  776   check_mysql_rc(rc, mysql);
  777 
  778   rc= mysql_query(mysql, "SELECT ts FROM test_dateformat");
  779   check_mysql_rc(rc, mysql);
  780 
  781   result= mysql_store_result(mysql);
  782   FAIL_IF(!result, "Invalid result set");
  783 
  784   field= mysql_fetch_field(result);
  785   FAIL_IF(!field, "Invalid field");
  786   FAIL_UNLESS(strcmp(field->table, "test_dateformat") == 0, "field->table != 'test_dateformat'");
  787 
  788   field= mysql_fetch_field(result);
  789   FAIL_IF(field, "no more fields expected");
  790 
  791   mysql_free_result(result);
  792 
  793   /* DATE_FORMAT */
  794   rc= mysql_query(mysql, "SELECT DATE_FORMAT(ts, '%Y') AS 'venu' FROM test_dateformat");
  795   check_mysql_rc(rc, mysql);
  796 
  797   result= mysql_store_result(mysql);
  798   FAIL_IF(!result, "Invalid result set");
  799 
  800   field= mysql_fetch_field(result);
  801   FAIL_IF(!field, "Invalid field");
  802   FAIL_UNLESS(field->table[0] == '\0', "field->table != ''");
  803 
  804   field= mysql_fetch_field(result);
  805   FAIL_IF(field, "no more fields expected");
  806 
  807   mysql_free_result(result);
  808 
  809   /* FIELD ALIAS TEST */
  810   rc= mysql_query(mysql, "SELECT DATE_FORMAT(ts, '%Y')  AS 'YEAR' FROM test_dateformat");
  811   check_mysql_rc(rc, mysql);
  812 
  813   result= mysql_store_result(mysql);
  814   FAIL_IF(!result, "Invalid result set");
  815 
  816   field= mysql_fetch_field(result);
  817   FAIL_IF(!field, "Invalid field");
  818   FAIL_UNLESS(strcmp(field->name, "YEAR") == 0, "name != 'YEAR'");
  819   FAIL_UNLESS(field->org_name[0] == '\0', "org_name != ''");
  820 
  821   field= mysql_fetch_field(result);
  822   FAIL_IF(field, "no more fields expected");
  823 
  824   mysql_free_result(result);
  825   rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_dateformat");
  826   check_mysql_rc(rc, mysql);
  827   return OK;
  828 }
  829 
  830 /* Test mysql_list_fields() */
  831 
  832 static int test_list_fields(MYSQL *mysql)
  833 {
  834   MYSQL_RES *result;
  835   int rc;
  836 
  837   rc= mysql_query(mysql, "drop table if exists t1");
  838   check_mysql_rc(rc, mysql);
  839 
  840   rc= mysql_query(mysql, "create table t1(c1 int primary key auto_increment, c2 char(10) default 'mysql')");
  841   check_mysql_rc(rc, mysql);
  842 
  843   result= mysql_list_fields(mysql, "t1", NULL);
  844   FAIL_IF(!result, "Invalid result set");
  845 
  846   rc= 0;
  847   while (mysql_fetch_row(result))
  848     rc++;
  849   FAIL_UNLESS(rc == 0, "rowcount != 0");
  850 
  851   if (verify_prepare_field(result, 0, "c1", "c1", MYSQL_TYPE_LONG,
  852                        "t1", "t1",
  853                        schema, 11, "0"))
  854     goto error;
  855 
  856   if (verify_prepare_field(result, 1, "c2", "c2", MYSQL_TYPE_STRING,
  857                        "t1", "t1",
  858                        schema, 10, "mysql"))
  859     goto error;
  860 
  861   mysql_free_result(result);
  862   check_mysql_rc(mysql_query(mysql, "drop table t1"), mysql);
  863   return OK;
  864 
  865 error:
  866   mysql_free_result(result);
  867   check_mysql_rc(mysql_query(mysql, "drop table t1"), mysql);
  868   return FAIL;
  869 }
  870 
  871 /* Test correct max length for MEDIUMTEXT and LONGTEXT columns */
  872 
  873 static int test_bug9735(MYSQL *mysql)
  874 {
  875   MYSQL_RES *res;
  876   int rc;
  877 
  878 
  879   rc= mysql_query(mysql, "drop table if exists t1");
  880   check_mysql_rc(rc, mysql);
  881   rc= mysql_query(mysql, "create table t1 (a mediumtext, b longtext) "
  882                          "character set latin1");
  883   check_mysql_rc(rc, mysql);
  884   rc= mysql_query(mysql, "select * from t1");
  885   check_mysql_rc(rc, mysql);
  886   res= mysql_store_result(mysql);
  887   if (verify_prepare_field(res, 0, "a", "a", MYSQL_TYPE_BLOB,
  888                        "t1", "t1", schema, (1U << 24)-1, 0)) 
  889     goto error;
  890   if (verify_prepare_field(res, 1, "b", "b", MYSQL_TYPE_BLOB,
  891                        "t1", "t1", schema, ~0U, 0))
  892     goto error;
  893   mysql_free_result(res);
  894   rc= mysql_query(mysql, "drop table t1");
  895   check_mysql_rc(rc, mysql);
  896   return OK;
  897 error:
  898   mysql_free_result(res);
  899   rc= mysql_query(mysql, "drop table t1");
  900   return FAIL;
  901 }
  902 
  903 /*
  904   Check that mysql_next_result works properly in case when one of
  905   the statements used in a multi-statement query is erroneous
  906 */
  907 
  908 static int test_bug9992(MYSQL *mysql)
  909 {
  910   MYSQL_RES* res ;
  911   int   rc;
  912 
  913   /* Sic: SHOW DATABASE is incorrect syntax. */
  914   rc= mysql_query(mysql, "SHOW TABLES; SHOW DATABASE; SELECT 1;");
  915   check_mysql_rc(rc, mysql);
  916   
  917   res= mysql_store_result(mysql);
  918   FAIL_UNLESS(res, "Invalid resultset");
  919   mysql_free_result(res);
  920   rc= mysql_next_result(mysql);
  921   FAIL_UNLESS(rc == 1, "Error expected");                         /* Got errors, as expected */
  922 
  923   return OK;
  924 }
  925 
  926 /* Test the support of multi-statement executions */
  927 
  928 static int test_multi_statements(MYSQL *mysql)
  929 {
  930   MYSQL *mysql_local;
  931   MYSQL_RES *result;
  932   int    rc;
  933 
  934   const char *query= "\
  935 DROP TABLE IF EXISTS test_multi_tab;\
  936 CREATE TABLE test_multi_tab(id int, name char(20));\
  937 INSERT INTO test_multi_tab(id) VALUES(10), (20);\
  938 INSERT INTO test_multi_tab VALUES(20, 'insert;comma');\
  939 SELECT * FROM test_multi_tab;\
  940 UPDATE test_multi_tab SET name='new;name' WHERE id=20;\
  941 DELETE FROM test_multi_tab WHERE name='new;name';\
  942 SELECT * FROM test_multi_tab;\
  943 DELETE FROM test_multi_tab WHERE id=10;\
  944 SELECT * FROM test_multi_tab;\
  945 DROP TABLE test_multi_tab;\
  946 select 1;\
  947 DROP TABLE IF EXISTS test_multi_tab";
  948   uint count, exp_value;
  949   uint rows[]= {0, 0, 2, 1, 3, 2, 2, 1, 1, 0, 0, 1, 0};
  950   my_bool reconnect= 1;
  951 
  952   /*
  953     First test that we get an error for multi statements
  954     (Because default connection is not opened with CLIENT_MULTI_STATEMENTS)
  955   */
  956   mysql_local= mysql;
  957   mysql = test_connect(NULL);
  958   rc= mysql_query(mysql, query); /* syntax error */
  959   FAIL_IF(!rc, "Error expected");
  960 
  961   rc= mysql_next_result(mysql);
  962   FAIL_UNLESS(rc == -1, "rc != -1");
  963   rc= mysql_more_results(mysql);
  964   FAIL_UNLESS(rc == 0, "rc != 0");
  965 
  966   mysql_close(mysql);
  967   mysql= mysql_local;
  968 
  969   mysql_options(mysql_local, MYSQL_OPT_RECONNECT, &reconnect);
  970 
  971   rc= mysql_query(mysql_local, query);
  972   check_mysql_rc(rc, mysql);
  973 
  974   for (count= 0 ; count < array_elements(rows) ; count++)
  975   {
  976     if ((result= mysql_store_result(mysql_local)))
  977     {
  978       mysql_free_result(result);
  979     }
  980 
  981     exp_value= (uint) mysql_affected_rows(mysql_local);
  982     FAIL_IF(rows[count] !=  exp_value, "row[count] != exp_value");
  983     if (count != array_elements(rows) -1)
  984     {
  985       rc= mysql_more_results(mysql_local);
  986       FAIL_IF(!rc, "More results expected");
  987       rc= mysql_next_result(mysql_local);
  988       check_mysql_rc(rc, mysql_local);
  989     }
  990     else
  991     {
  992       rc= mysql_more_results(mysql_local);
  993       FAIL_UNLESS(rc == 0, "rc != 0");
  994       rc= mysql_next_result(mysql_local);
  995       FAIL_UNLESS(rc == -1, "rc != -1");
  996     }
  997   }
  998 
  999   /* check that errors abort multi statements */
 1000 
 1001   rc= mysql_query(mysql_local, "select 1+1+a;select 1+1");
 1002   FAIL_IF(!rc, "Error expected");
 1003   rc= mysql_more_results(mysql_local);
 1004   FAIL_UNLESS(rc == 0, "rc != 0");
 1005   rc= mysql_next_result(mysql_local);
 1006   FAIL_UNLESS(rc == -1, "rc != -1");
 1007 
 1008   rc= mysql_query(mysql_local, "select 1+1;select 1+1+a;select 1");
 1009   check_mysql_rc(rc, mysql);
 1010   result= mysql_store_result(mysql_local);
 1011   FAIL_IF(!result, "Invalid result set");
 1012   mysql_free_result(result);
 1013   rc= mysql_more_results(mysql_local);
 1014   FAIL_UNLESS(rc == 1, "rc != 1");
 1015   rc= mysql_next_result(mysql_local);
 1016   FAIL_UNLESS(rc > 0, "rc <= 0");
 1017 
 1018   /*
 1019     Ensure that we can now do a simple query (this checks that the server is
 1020     not trying to send us the results for the last 'select 1'
 1021   */
 1022   rc= mysql_query(mysql_local, "select 1+1+1");
 1023   check_mysql_rc(rc, mysql);
 1024   result= mysql_store_result(mysql_local);
 1025   FAIL_IF(!result, "Invalid result set");
 1026   mysql_free_result(result);
 1027 
 1028   /*
 1029     Check if errors in one of the queries handled properly.
 1030   */
 1031   rc= mysql_query(mysql_local, "select 1; select * from not_existing_table");
 1032   check_mysql_rc(rc, mysql);
 1033   result= mysql_store_result(mysql_local);
 1034   mysql_free_result(result);
 1035 
 1036   rc= mysql_next_result(mysql_local);
 1037   FAIL_UNLESS(rc > 0, "rc <= 0");
 1038 
 1039   rc= mysql_next_result(mysql_local);
 1040   FAIL_UNLESS(rc < 0, "rc >= 0");
 1041 
 1042   return OK;
 1043 }
 1044 
 1045 static int test_conc160(MYSQL *mysql)
 1046 {
 1047   MYSQL_RES *result;
 1048   MYSQL_FIELD *field;
 1049   int rc;
 1050 
 1051   rc= mysql_query(mysql, "SELECT cast(1.234 AS DECIMAL)");
 1052   check_mysql_rc(rc, mysql);
 1053 
 1054   result= mysql_store_result(mysql);
 1055   field= mysql_fetch_field(result);
 1056 
 1057   FAIL_UNLESS(field->flags & NUM_FLAG, "Numceric flag not set");
 1058 
 1059   mysql_free_result(result);
 1060   return OK;
 1061 }
 1062 
 1063 
 1064 
 1065 struct my_tests_st my_tests[] = {
 1066   {"test_conc160", test_conc160, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1067   {"client_store_result", client_store_result, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1068   {"client_use_result", client_use_result, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1069   {"test_free_result", test_free_result, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1070   {"test_free_store_result", test_free_store_result, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1071   {"test_store_result", test_store_result, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1072   {"test_store_result1", test_store_result1, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1073   {"test_store_result2", test_store_result2, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1074   {"test_bug11718", test_bug11718, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1075   {"test_bug19671", test_bug19671, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1076   {"test_bug21726", test_bug21726, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1077   {"test_bug6761", test_bug6761, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1078   {"test_field_flags", test_field_flags, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1079   {"test_field_names", test_field_names, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1080   {"test_func_fields", test_func_fields, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1081   {"test_list_fields", test_list_fields, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1082   {"test_bug9735", test_bug9735, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
 1083   {"test_bug9992", test_bug9992, TEST_CONNECTION_NEW, CLIENT_MULTI_STATEMENTS,  NULL,  NULL},
 1084   {"test_multi_statements", test_multi_statements, TEST_CONNECTION_NEW, CLIENT_MULTI_STATEMENTS,  NULL,  NULL},
 1085   {NULL, NULL, 0, 0, NULL, NULL}
 1086 };
 1087 
 1088 
 1089 int main(int argc, char **argv)
 1090 {
 1091   if (argc > 1)
 1092     get_options(argc, argv);
 1093 
 1094   get_envvars();
 1095 
 1096   run_tests(my_tests);
 1097 
 1098   return(exit_status());
 1099 }