diff --git a/client/mysql.cc b/client/mysql.cc index 92aeb495629..37c83411091 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1812,7 +1812,6 @@ print_field_types(MYSQL_RES *result) while ((field = mysql_fetch_field(result))) { tee_fprintf(PAGER,"Catalog: '%s'\nDatabase: '%s'\nTable: '%s'\nName: '%s'\nType: %d\nLength: %d\nMax length: %d\nIs_null: %d\nFlags: %d\nDecimals: %d\n\n", - tee_fprintf(PAGER,"'%s.%s.%s.%s' %d %d %d %d %d\n", field->catalog, field->db, field->table, field->name, (int) field->type, field->length, field->max_length, diff --git a/include/mysql.h b/include/mysql.h index 2e23a1e2f98..55fe4107d0c 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -499,10 +499,12 @@ typedef struct st_mysql_bind /* Following are for internal use. Set by mysql_bind_param */ unsigned char *inter_buffer; /* for the current data position */ unsigned long offset; /* offset position for char/binary fetch */ + unsigned long internal_length; /* Used if length is 0 */ unsigned int param_number; /* For null count and error messages */ my_bool long_data_used; /* If used with mysql_send_long_data */ my_bool binary_data; /* data buffer is binary */ my_bool null_field; /* NULL data cache flag */ + my_bool internal_is_null; /* Used if is_null is 0 */ void (*store_param_func)(NET *net, struct st_mysql_bind *param); void (*fetch_result)(struct st_mysql_bind *, unsigned char **row); } MYSQL_BIND; @@ -572,13 +574,13 @@ my_bool STDCALL mysql_rollback(MYSQL * mysql); my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); int STDCALL mysql_fetch(MYSQL_STMT *stmt); int STDCALL mysql_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind, - my_ulonglong column, + unsigned int column, unsigned long offset); my_bool STDCALL mysql_send_long_data(MYSQL_STMT *stmt, unsigned int param_number, const char *data, unsigned long length); -MYSQL_RES *STDCALL mysql_prepare_result(MYSQL_STMT *stmt); +MYSQL_RES *STDCALL mysql_get_metadata(MYSQL_STMT *stmt); MYSQL_RES *STDCALL mysql_param_result(MYSQL_STMT *stmt); my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt); int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt); diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index cc45985a88c..afb785cf9d5 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -1715,10 +1715,10 @@ unsigned int alloc_stmt_fields(MYSQL_STMT *stmt) */ MYSQL_RES * STDCALL -mysql_prepare_result(MYSQL_STMT *stmt) +mysql_get_metadata(MYSQL_STMT *stmt) { MYSQL_RES *result; - DBUG_ENTER("mysql_prepare_result"); + DBUG_ENTER("mysql_get_metadata"); if (!stmt->field_count || !stmt->fields) { @@ -1758,7 +1758,6 @@ mysql_param_result(MYSQL_STMT *stmt) } - /******************************************************************** Prepare-execute, and param handling *********************************************************************/ @@ -1773,6 +1772,7 @@ static void store_param_type(NET *net, uint type) net->write_pos+=2; } + /**************************************************************************** Functions to store parameter data from a prepared statement. @@ -1788,7 +1788,6 @@ static void store_param_type(NET *net, uint type) 1 Error (Can't alloc net->buffer) ****************************************************************************/ - static void store_param_tinyint(NET *net, MYSQL_BIND *param) { *(net->write_pos++)= (uchar) *param->buffer; @@ -2085,8 +2084,6 @@ my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt) static my_bool int_is_null_true= 1; /* Used for MYSQL_TYPE_NULL */ static my_bool int_is_null_false= 0; -static my_bool int_is_null_dummy; -static unsigned long param_length_is_dummy; /* Setup the parameter data buffers from application @@ -2422,7 +2419,10 @@ static void send_data_long(MYSQL_BIND *param, longlong value) char tmp[22]; /* Enough for longlong */ uint length= (uint)(longlong10_to_str(value,(char *)tmp,10)-tmp); ulong copy_length= min((ulong)length-param->offset, param->buffer_length); - memcpy(buffer, (char *)tmp+param->offset, copy_length); + if ((long) copy_length < 0) + copy_length=0; + else + memcpy(buffer, (char *)tmp+param->offset, copy_length); *param->length= length; if (copy_length != param->buffer_length) @@ -2470,7 +2470,10 @@ static void send_data_double(MYSQL_BIND *param, double value) char tmp[128]; uint length= my_sprintf(tmp,(tmp,"%g",value)); ulong copy_length= min((ulong)length-param->offset, param->buffer_length); - memcpy(buffer, (char *)tmp+param->offset, copy_length); + if ((long) copy_length < 0) + copy_length=0; + else + memcpy(buffer, (char *)tmp+param->offset, copy_length); *param->length= length; if (copy_length != param->buffer_length) @@ -2535,15 +2538,19 @@ static void send_data_str(MYSQL_BIND *param, char *value, uint length) case MYSQL_TYPE_BLOB: *param->length= length; length= min(length-param->offset, param->buffer_length); - memcpy(buffer, value+param->offset, length); + if ((long) length > 0) + memcpy(buffer, value+param->offset, length); break; default: *param->length= length; length= min(length-param->offset, param->buffer_length); - memcpy(buffer, value+param->offset, length); + if ((long) length < 0) + length= 0; + else + memcpy(buffer, value+param->offset, length); if (length != param->buffer_length) buffer[length]= '\0'; - } + } } @@ -2605,15 +2612,16 @@ static void send_data_time(MYSQL_BIND *param, MYSQL_TIME ltime, /* Fetch data to buffers */ -static void fetch_results(MYSQL_BIND *param, uint field_type, uchar **row, - my_bool field_is_unsigned) +static void fetch_results(MYSQL_BIND *param, MYSQL_FIELD *field, uchar **row) { ulong length; - + enum enum_field_types field_type= field->type; + switch (field_type) { case MYSQL_TYPE_TINY: { char value= (char) **row; + uint field_is_unsigned= (field->flags & UNSIGNED_FLAG); longlong data= ((field_is_unsigned) ? (longlong) (unsigned char) value: (longlong) value); send_data_long(param,data); @@ -2624,6 +2632,7 @@ static void fetch_results(MYSQL_BIND *param, uint field_type, uchar **row, case MYSQL_TYPE_YEAR: { short value= sint2korr(*row); + uint field_is_unsigned= (field->flags & UNSIGNED_FLAG); longlong data= ((field_is_unsigned) ? (longlong) (unsigned short) value: (longlong) value); send_data_long(param,data); @@ -2633,6 +2642,7 @@ static void fetch_results(MYSQL_BIND *param, uint field_type, uchar **row, case MYSQL_TYPE_LONG: { long value= sint4korr(*row); + uint field_is_unsigned= (field->flags & UNSIGNED_FLAG); longlong data= ((field_is_unsigned) ? (longlong) (unsigned long) value: (longlong) value); send_data_long(param,data); @@ -2781,24 +2791,6 @@ static void fetch_result_str(MYSQL_BIND *param, uchar **row) *row+= length; } -static uint default_binary_field_length(uint field_type) -{ - switch(field_type) { - case MYSQL_TYPE_TINY: - return 1; - case MYSQL_TYPE_SHORT: - return 2; - case MYSQL_TYPE_LONG: - case MYSQL_TYPE_FLOAT: - return 4; - case MYSQL_TYPE_LONGLONG: - case MYSQL_TYPE_DOUBLE: - return 8; - default: - return 0; - } -} - /* Setup the bind buffers for resultset processing @@ -2838,10 +2830,10 @@ my_bool STDCALL mysql_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind) This is to make the excute code easier */ if (!param->is_null) - param->is_null= &int_is_null_dummy; + param->is_null= ¶m->internal_is_null; if (!param->length) - param->length= ¶m_length_is_dummy; + param->length= ¶m->internal_length; param->param_number= param_count++; param->offset= 0; @@ -2945,10 +2937,7 @@ static int stmt_fetch_row(MYSQL_STMT *stmt, uchar *row) if (field->type == bind->buffer_type) (*bind->fetch_result)(bind, &row); else - { - my_bool field_is_unsigned= (field->flags & UNSIGNED_FLAG) ? 1: 0; - fetch_results(bind, field->type, &row, field_is_unsigned); - } + fetch_results(bind, field, &row); } if (!((bit<<=1) & 255)) { @@ -2970,8 +2959,8 @@ int STDCALL mysql_fetch(MYSQL_STMT *stmt) uchar *row; DBUG_ENTER("mysql_fetch"); - stmt->last_fetched_column= 0; /* reset */ - if (stmt->result_buffered) /* buffered */ + stmt->last_fetched_column= 0; /* reset */ + if (stmt->result_buffered) /* buffered */ { MYSQL_RES *res; @@ -2986,7 +2975,7 @@ int STDCALL mysql_fetch(MYSQL_STMT *stmt) row= (uchar *)res->data_cursor->data; res->data_cursor= res->data_cursor->next; } - else /* un-buffered */ + else /* un-buffered */ { if (packet_error == net_safe_read(mysql)) { @@ -3012,107 +3001,55 @@ no_data: /* - Fetch only specified column data to buffers + Fetch datat for one specified column data + + SYNOPSIS + mysql_fetch_column() + stmt Prepared statement handler + bind Where date should be placed. Should be filled in as + when calling mysql_bind_param() + column Column to fetch (first column is 0) + ulong offset Offset in result data (to fetch blob in pieces) + This is normally 0 + RETURN + 0 ok + 1 error */ int STDCALL mysql_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind, - my_ulonglong icol, - ulong offset) + uint column, ulong offset) { - uchar *row; - my_bool null_data; - + MYSQL_BIND *param= stmt->bind+column; DBUG_ENTER("mysql_fetch_column"); - if (!(row= stmt->current_row)) + if (!stmt->current_row) goto no_data; #ifdef CHECK_EXTRA_ARGUMENTS - if (!bind || icol >= stmt->field_count) + if (column >= stmt->field_count) { - set_stmt_errmsg(stmt, "Invalid column descriptor or offset",1, - unknown_sqlstate); + set_stmt_errmsg(stmt, "Invalid column descriptor",1, unknown_sqlstate); DBUG_RETURN(1); } #endif - /* column '0' == first column */ - if (stmt->res_buffers) - { - /* - Already buffers are parsed and cached to stmt->bind - during mysql_fetch() call. - */ - MYSQL_BIND *param= stmt->bind+icol; - null_data= param->null_field; - row= param->inter_buffer; - } - else - { - if (stmt->last_fetched_column == icol+1) - { - /* - Data buffer is already parsed during the last call, get - the cached information - */ - if (!stmt->last_fetched_buffer) - null_data= 1; - else - { - null_data= 0; - row= stmt->last_fetched_buffer; - } - } - else - { - /* - Advance the data buffer to icol position and cache - the information for subsequent calls - */ - uint bit= icol > 6 ? 1 : 4; - stmt->last_fetched_column= icol+1; - - if (row[icol/8] & (bit << icol & 7)) - { - stmt->last_fetched_buffer= 0; - null_data= 1; - } - else - { - uint length, i; - - null_data= 0; - row+= (stmt->field_count+9)/8; /* skip null bits */ - - for (i=0; i < icol; i++) - { - if (!(length= default_binary_field_length((uint)(stmt->fields[i]. - type)))) - length= net_field_length(&row); - row+= length; - } - stmt->last_fetched_buffer= row; - } - } - } - if (null_data) + if (param->null_field) { if (bind->is_null) *bind->is_null= 1; } else { - MYSQL_FIELD *field= stmt->fields+icol; - my_bool field_is_unsigned= (field->flags & UNSIGNED_FLAG) ? 1: 0; - + MYSQL_FIELD *field= stmt->fields+column; + uchar *row= param->inter_buffer; bind->offset= offset; if (bind->is_null) *bind->is_null= 0; if (bind->length) /* Set the length if non char/binary types */ - *bind->length= default_binary_field_length(field->type); + *bind->length= *param->length; else - bind->length= ¶m_length_is_dummy; - fetch_results(bind, field->type, &row, field_is_unsigned); + bind->length= ¶m->internal_length; /* Needed for fetch_result() */ + fetch_results(bind, field, &row); } DBUG_RETURN(0); diff --git a/mysql-test/r/func_group.result b/mysql-test/r/func_group.result index 8fad9d16dc2..3af75b3c5bc 100644 --- a/mysql-test/r/func_group.result +++ b/mysql-test/r/func_group.result @@ -551,7 +551,7 @@ id select_type table type possible_keys key key_len ref rows Extra explain select min(a1) from t1 where a1 between a3 and 'KKK'; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 14 Using where +1 SIMPLE t1 ALL NULL NULL NULL NULL 14 Using where explain select min(a4) from t1 where (a4 + 0.01) between 0.07 and 0.08; id select_type table type possible_keys key key_len ref rows Extra diff --git a/mysql-test/r/func_test.result b/mysql-test/r/func_test.result index a58c26f7507..851c308ba3e 100644 --- a/mysql-test/r/func_test.result +++ b/mysql-test/r/func_test.result @@ -1,4 +1,4 @@ -DROP TABLE IF EXISTS t1,t2; +drop table if exists t1,t2; select 0=0,1>0,1>=1,1<0,1<=0,1!=0,strcmp("abc","abcd"),strcmp("b","a"),strcmp("a","a") ; 0=0 1>0 1>=1 1<0 1<=0 1!=0 strcmp("abc","abcd") strcmp("b","a") strcmp("a","a") 1 1 1 0 0 1 -1 1 0 @@ -125,10 +125,10 @@ ERROR HY000: Illegal mix of collations (koi8r_general_ci,EXPLICIT) and (koi8r_bi select _koi8r'a' LIKE _latin1'A'; ERROR HY000: Illegal mix of collations (koi8r_general_ci,COERCIBLE) and (latin1_swedish_ci,COERCIBLE) for operation 'like' CREATE TABLE t1 ( faq_group_id int(11) NOT NULL default '0', faq_id int(11) NOT NULL default '0', title varchar(240) default NULL, keywords text, description longblob, solution longblob, status tinyint(4) NOT NULL default '0', access_id smallint(6) default NULL, lang_id smallint(6) NOT NULL default '0', created datetime NOT NULL default '0000-00-00 00:00:00', updated datetime default NULL, last_access datetime default NULL, last_notify datetime default NULL, solved_count int(11) NOT NULL default '0', static_solved int(11) default NULL, solved_1 int(11) default NULL, solved_2 int(11) default NULL, solved_3 int(11) default NULL, solved_4 int(11) default NULL, solved_5 int(11) default NULL, expires datetime default NULL, notes text, assigned_to smallint(6) default NULL, assigned_group smallint(6) default NULL, last_edited_by smallint(6) default NULL, orig_ref_no varchar(15) binary default NULL, c$fundstate smallint(6) default NULL, c$contributor smallint(6) default NULL, UNIQUE KEY t1$faq_id (faq_id), KEY t1$group_id$faq_id (faq_group_id,faq_id), KEY t1$c$fundstate (c$fundstate) ) TYPE=MyISAM; - INSERT INTO t1 VALUES (82,82,'How to use the DynaVox Usage Counts Feature','usages count, number, corner, white, box, button','\r\n\r\n \r\n \r\n \r\n \r\n
 \r\n

How \r\n To: \r\n Display or Hide the Usage Counts to find out how many times each button is being selected.

\r\n
','\r\n \r\n \r\n \r\n \r\n\r\n \r\n
  \r\n \r\n

1. Select \r\n the On/Setup button to access the DynaVox Setup Menu.
\r\n 2. Select Button Features.
\r\n 3. Below the OK button is the Usage Counts button.
\r\n a. If it says \"Hidden\" then the Usage Counts will not be displayed.
\r\n b. If it says \"Displayed\" then the Usage Counts will be shown.
\r\n c. Select the Usage Counts Option Ring once and it will toggle \r\n to the alternative option.
\r\n 4. Once the correct setting has been chosen, select OK to leave the Button \r\n Features menu.
\r\n 5. Select OK out of the Setup menu and return to the communication \r\n page.

\r\n

For \r\n further information on Usage Counts, see the Button Features \r\n Menu Entry in the DynaVox/DynaMyte Reference Manual.

\r\n
',4,1,1,'2001-11-16 16:43:34','2002-11-25 12:09:43','2003-07-24 01:04:48',NULL,11,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,11,NULL,NULL,NULL); - CREATE TABLE t2 ( access_id smallint(6) NOT NULL default '0', name varchar(20) binary default NULL, rank smallint(6) NOT NULL default '0', KEY t2$access_id (access_id) ) TYPE=MyISAM; - INSERT INTO t2 VALUES (1,'Everyone',2),(2,'Help',3),(3,'Customer Support',1); - SELECT f_acc.rank, a1.rank, a2.rank FROM t1 LEFT JOIN t1 f1 ON (f1.access_id=1 AND f1.faq_group_id = t1.faq_group_id) LEFT JOIN t2 a1 ON (a1.access_id = f1.access_id) LEFT JOIN t1 f2 ON (f2.access_id=3 AND f2.faq_group_id = t1.faq_group_id) LEFT JOIN t2 a2 ON (a2.access_id = f2.access_id), t2 f_acc WHERE LEAST(a1.rank,a2.rank) = f_acc.rank; +INSERT INTO t1 VALUES (82,82,'How to use the DynaVox Usage Counts Feature','usages count, number, corner, white, box, button','\r\n\r\n \r\n \r\n \r\n \r\n
 \r\n

How \r\n To: \r\n Display or Hide the Usage Counts to find out how many times each button is being selected.

\r\n
','\r\n \r\n \r\n \r\n \r\n\r\n \r\n
  \r\n \r\n

1. Select \r\n the On/Setup button to access the DynaVox Setup Menu.
\r\n 2. Select Button Features.
\r\n 3. Below the OK button is the Usage Counts button.
\r\n a. If it says \"Hidden\" then the Usage Counts will not be displayed.
\r\n b. If it says \"Displayed\" then the Usage Counts will be shown.
\r\n c. Select the Usage Counts Option Ring once and it will toggle \r\n to the alternative option.
\r\n 4. Once the correct setting has been chosen, select OK to leave the Button \r\n Features menu.
\r\n 5. Select OK out of the Setup menu and return to the communication \r\n page.

\r\n

For \r\n further information on Usage Counts, see the Button Features \r\n Menu Entry in the DynaVox/DynaMyte Reference Manual.

\r\n
',4,1,1,'2001-11-16 16:43:34','2002-11-25 12:09:43','2003-07-24 01:04:48',NULL,11,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,11,NULL,NULL,NULL); +CREATE TABLE t2 ( access_id smallint(6) NOT NULL default '0', name varchar(20) binary default NULL, rank smallint(6) NOT NULL default '0', KEY t2$access_id (access_id) ) TYPE=MyISAM; +INSERT INTO t2 VALUES (1,'Everyone',2),(2,'Help',3),(3,'Customer Support',1); +SELECT f_acc.rank, a1.rank, a2.rank FROM t1 LEFT JOIN t1 f1 ON (f1.access_id=1 AND f1.faq_group_id = t1.faq_group_id) LEFT JOIN t2 a1 ON (a1.access_id = f1.access_id) LEFT JOIN t1 f2 ON (f2.access_id=3 AND f2.faq_group_id = t1.faq_group_id) LEFT JOIN t2 a2 ON (a2.access_id = f2.access_id), t2 f_acc WHERE LEAST(a1.rank,a2.rank) = f_acc.rank; rank rank rank 2 2 NULL DROP TABLE t1,t2; diff --git a/mysql-test/r/grant.result b/mysql-test/r/grant.result index 20698852b98..df6f8fe3615 100644 --- a/mysql-test/r/grant.result +++ b/mysql-test/r/grant.result @@ -145,7 +145,7 @@ show grants for drop_user@localhost; Grants for drop_user@localhost GRANT ALL PRIVILEGES ON *.* TO 'drop_user'@'localhost' WITH GRANT OPTION GRANT ALL PRIVILEGES ON `test`.* TO 'drop_user'@'localhost' WITH GRANT OPTION -GRANT SELECT (a) ON `test`.`t1` TO 'drop_user'@'localhost' +GRANT USAGE ON `test`.`t1` TO 'drop_user'@'localhost' revoke all privileges, grant from drop_user@localhost; show grants for drop_user@localhost; Grants for drop_user@localhost diff --git a/mysql-test/r/loaddata.result b/mysql-test/r/loaddata.result index 7d21ede0345..d738431e016 100644 --- a/mysql-test/r/loaddata.result +++ b/mysql-test/r/loaddata.result @@ -30,6 +30,8 @@ NULL 2003-03-03 2003-03-03 NULL drop table t1; create table t1 (a text, b text); load data infile '../../std_data/loaddata2.dat' into table t1 fields terminated by ',' enclosed by ''''; +Warnings: +Warning 1260 Record count is fewer than the column count at row 3 select concat('|',a,'|'), concat('|',b,'|') from t1; concat('|',a,'|') concat('|',b,'|') |Field A| |Field B| diff --git a/mysql-test/r/lowercase_table.result b/mysql-test/r/lowercase_table.result index dc5ae633ca5..9c6b212a4b6 100644 --- a/mysql-test/r/lowercase_table.result +++ b/mysql-test/r/lowercase_table.result @@ -13,7 +13,8 @@ SELECT T2.id from t1 as T2 LIMIT 1; id 1 SELECT T2.id from t1 as t2 LIMIT 1; -Unknown table 'T2' in field list +id +1 RENAME TABLE T1 TO T2; ALTER TABLE T2 ADD new_col int not null; ALTER TABLE T2 RENAME T3; diff --git a/mysql-test/r/mix_innodb_myisam_binlog.result b/mysql-test/r/mix_innodb_myisam_binlog.result index 8a3415a81d0..dd9876b4f90 100644 --- a/mysql-test/r/mix_innodb_myisam_binlog.result +++ b/mysql-test/r/mix_innodb_myisam_binlog.result @@ -8,10 +8,10 @@ insert into tm select * from ti; commit; show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; BEGIN -master-bin.001 119 Query 1 79 use test; insert into ti values(1) -master-bin.001 178 Query 1 79 use test; insert into tm select * from ti -master-bin.001 244 Query 1 244 use test; COMMIT +master-bin.000001 79 Query 1 79 use ; BEGIN +master-bin.000001 119 Query 1 79 use ; insert into ti values(1) +master-bin.000001 178 Query 1 79 use ; insert into tm select * from ti +master-bin.000001 244 Query 1 244 use ; COMMIT delete from ti; delete from tm; reset master; @@ -22,10 +22,10 @@ rollback; Warning: Some non-transactional changed tables couldn't be rolled back show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; BEGIN -master-bin.001 119 Query 1 79 use test; insert into ti values(2) -master-bin.001 178 Query 1 79 use test; insert into tm select * from ti -master-bin.001 244 Query 1 244 use test; ROLLBACK +master-bin.000001 79 Query 1 79 use ; BEGIN +master-bin.000001 119 Query 1 79 use ; insert into ti values(2) +master-bin.000001 178 Query 1 79 use ; insert into tm select * from ti +master-bin.000001 244 Query 1 244 use ; ROLLBACK delete from ti; delete from tm; reset master; @@ -39,13 +39,13 @@ Warning: Some non-transactional changed tables couldn't be rolled back commit; show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; BEGIN -master-bin.001 119 Query 1 79 use test; insert into ti values(3) -master-bin.001 178 Query 1 79 use test; savepoint my_savepoint -master-bin.001 235 Query 1 79 use test; insert into ti values(4) -master-bin.001 294 Query 1 79 use test; insert into tm select * from ti -master-bin.001 360 Query 1 79 use test; rollback to savepoint my_savepoint -master-bin.001 429 Query 1 429 use test; COMMIT +master-bin.000001 79 Query 1 79 use ; BEGIN +master-bin.000001 119 Query 1 79 use ; insert into ti values(3) +master-bin.000001 178 Query 1 79 use ; savepoint my_savepoint +master-bin.000001 235 Query 1 79 use ; insert into ti values(4) +master-bin.000001 294 Query 1 79 use ; insert into tm select * from ti +master-bin.000001 360 Query 1 79 use ; rollback to savepoint my_savepoint +master-bin.000001 429 Query 1 429 use ; COMMIT delete from ti; delete from tm; reset master; @@ -64,14 +64,14 @@ a 7 show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; BEGIN -master-bin.001 119 Query 1 79 use test; insert into ti values(5) -master-bin.001 178 Query 1 79 use test; savepoint my_savepoint -master-bin.001 235 Query 1 79 use test; insert into ti values(6) -master-bin.001 294 Query 1 79 use test; insert into tm select * from ti -master-bin.001 360 Query 1 79 use test; rollback to savepoint my_savepoint -master-bin.001 429 Query 1 79 use test; insert into ti values(7) -master-bin.001 488 Query 1 488 use test; COMMIT +master-bin.000001 79 Query 1 79 use ; BEGIN +master-bin.000001 119 Query 1 79 use ; insert into ti values(5) +master-bin.000001 178 Query 1 79 use ; savepoint my_savepoint +master-bin.000001 235 Query 1 79 use ; insert into ti values(6) +master-bin.000001 294 Query 1 79 use ; insert into tm select * from ti +master-bin.000001 360 Query 1 79 use ; rollback to savepoint my_savepoint +master-bin.000001 429 Query 1 79 use ; insert into ti values(7) +master-bin.000001 488 Query 1 488 use ; COMMIT delete from ti; delete from tm; reset master; @@ -86,10 +86,10 @@ get_lock("a",10) 1 show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; BEGIN -master-bin.001 119 Query 1 79 use test; insert into ti values(8) -master-bin.001 178 Query 1 79 use test; insert into tm select * from ti -master-bin.001 244 Query 1 244 use test; ROLLBACK +master-bin.000001 79 Query 1 79 use ; BEGIN +master-bin.000001 119 Query 1 79 use ; insert into ti values(8) +master-bin.000001 178 Query 1 79 use ; insert into tm select * from ti +master-bin.000001 244 Query 1 244 use ; ROLLBACK delete from ti; delete from tm; reset master; @@ -97,8 +97,8 @@ insert into ti values(9); insert into tm select * from ti; show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; insert into ti values(9) -master-bin.001 138 Query 1 138 use test; insert into tm select * from ti +master-bin.000001 79 Query 1 79 use ; insert into ti values(9) +master-bin.000001 138 Query 1 138 use ; insert into tm select * from ti delete from ti; delete from tm; reset master; @@ -107,17 +107,17 @@ begin; insert into tm select * from ti; show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; insert into ti values(10) -master-bin.001 139 Query 1 139 use test; insert into tm select * from ti +master-bin.000001 79 Query 1 79 use ; insert into ti values(10) +master-bin.000001 139 Query 1 139 use ; insert into tm select * from ti insert into ti values(11); commit; show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; insert into ti values(10) -master-bin.001 139 Query 1 139 use test; insert into tm select * from ti -master-bin.001 205 Query 1 205 use test; BEGIN -master-bin.001 245 Query 1 205 use test; insert into ti values(11) -master-bin.001 305 Query 1 305 use test; COMMIT +master-bin.000001 79 Query 1 79 use ; insert into ti values(10) +master-bin.000001 139 Query 1 139 use ; insert into tm select * from ti +master-bin.000001 205 Query 1 205 use ; BEGIN +master-bin.000001 245 Query 1 205 use ; insert into ti values(11) +master-bin.000001 305 Query 1 305 use ; COMMIT alter table tm type=INNODB; delete from ti; delete from tm; @@ -128,10 +128,10 @@ insert into tm select * from ti; commit; show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; BEGIN -master-bin.001 119 Query 1 79 use test; insert into ti values(12) -master-bin.001 179 Query 1 79 use test; insert into tm select * from ti -master-bin.001 245 Query 1 245 use test; COMMIT +master-bin.000001 79 Query 1 79 use ; BEGIN +master-bin.000001 119 Query 1 79 use ; insert into ti values(12) +master-bin.000001 179 Query 1 79 use ; insert into tm select * from ti +master-bin.000001 245 Query 1 245 use ; COMMIT delete from ti; delete from tm; reset master; @@ -153,9 +153,9 @@ rollback to savepoint my_savepoint; commit; show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; BEGIN -master-bin.001 119 Query 1 79 use test; insert into ti values(14) -master-bin.001 179 Query 1 179 use test; COMMIT +master-bin.000001 79 Query 1 79 use ; BEGIN +master-bin.000001 119 Query 1 79 use ; insert into ti values(14) +master-bin.000001 179 Query 1 179 use ; COMMIT delete from ti; delete from tm; reset master; @@ -173,8 +173,8 @@ a 18 show binlog events from 79; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; BEGIN -master-bin.001 119 Query 1 79 use test; insert into ti values(16) -master-bin.001 179 Query 1 79 use test; insert into ti values(18) -master-bin.001 239 Query 1 239 use test; COMMIT +master-bin.000001 79 Query 1 79 use ; BEGIN +master-bin.000001 119 Query 1 79 use ; insert into ti values(16) +master-bin.000001 179 Query 1 79 use ; insert into ti values(18) +master-bin.000001 239 Query 1 239 use ; COMMIT drop table ti,tm; diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index 0cd35e63d91..4fa71dbaecc 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -290,6 +290,12 @@ update t1 set i1=0, i2=0, i3=0, i4=0, i5=0, i6=0, i7=0; check table t1; Table Op Msg_type Msg_text test.t1 check status OK +delete from t1 where i8=1; +select i1,i2 from t1; +i1 i2 +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK drop table t1; CREATE TABLE `t1` ( `post_id` mediumint(8) unsigned NOT NULL auto_increment, diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result index 86203fb6786..df84dd55d04 100644 --- a/mysql-test/r/range.result +++ b/mysql-test/r/range.result @@ -230,27 +230,27 @@ create table t1 (x int, y int, index(x), index(y)); insert into t1 (x) values (1),(2),(3),(4),(5),(6),(7),(8),(9); update t1 set y=x; explain select * from t1, t1 t2 where t1.y = 2 and t2.x between 7 and t1.y+0; -table type possible_keys key key_len ref rows Extra -t1 ref y y 5 const 1 Using where -t2 range x x 5 NULL 4 Using where +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref y y 5 const 1 Using where +1 SIMPLE t2 range x x 5 NULL 4 Using where explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= 7 and t2.x <= t1.y+0; -table type possible_keys key key_len ref rows Extra -t1 ref y y 5 const 1 Using where -t2 range x x 5 NULL 4 Using where +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref y y 5 const 1 Using where +1 SIMPLE t2 range x x 5 NULL 4 Using where explain select * from t1, t1 t2 where t1.y = 2 and t2.x between t1.y-1 and t1.y+1; -table type possible_keys key key_len ref rows Extra -t1 ref y y 5 const 1 Using where -t2 ALL x NULL NULL NULL 9 Range checked for each record (index map: 1) +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref y y 5 const 1 Using where +1 SIMPLE t2 ALL x NULL NULL NULL 9 Range checked for each record (index map: 1) explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= t1.y-1 and t2.x <= t1.y+1; -table type possible_keys key key_len ref rows Extra -t1 ref y y 5 const 1 Using where -t2 ALL x NULL NULL NULL 9 Range checked for each record (index map: 1) +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref y y 5 const 1 Using where +1 SIMPLE t2 ALL x NULL NULL NULL 9 Range checked for each record (index map: 1) explain select * from t1, t1 t2 where t1.y = 2 and t2.x between 0 and t1.y; -table type possible_keys key key_len ref rows Extra -t1 ref y y 5 const 1 Using where -t2 ALL x NULL NULL NULL 9 Using where +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref y y 5 const 1 Using where +1 SIMPLE t2 ALL x NULL NULL NULL 9 Using where explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= 0 and t2.x <= t1.y; -table type possible_keys key key_len ref rows Extra -t1 ref y y 5 const 1 Using where -t2 range x x 5 NULL 2 Using where +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref y y 5 const 1 Using where +1 SIMPLE t2 range x x 5 NULL 2 Using where drop table t1; diff --git a/mysql-test/r/rpl_loaddata.result b/mysql-test/r/rpl_loaddata.result index b8c0285e825..975ba1a9fe1 100644 --- a/mysql-test/r/rpl_loaddata.result +++ b/mysql-test/r/rpl_loaddata.result @@ -22,7 +22,7 @@ day id category name 2003-04-22 2416 a bbbbb show master status; File Position Binlog_do_db Binlog_ignore_db -slave-bin.001 964 +slave-bin.000001 964 drop table t1; drop table t2; drop table t3; diff --git a/mysql-test/r/rpl_loaddata_rule_m.result b/mysql-test/r/rpl_loaddata_rule_m.result index 8d8ed749c71..c98b3fb358f 100644 --- a/mysql-test/r/rpl_loaddata_rule_m.result +++ b/mysql-test/r/rpl_loaddata_rule_m.result @@ -1,9 +1,9 @@ -slave stop; +stop slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; reset master; reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; -slave start; +start slave; reset master; create database test2; create table t1(a int, b int, unique(b)); diff --git a/mysql-test/r/rpl_loaddata_rule_s.result b/mysql-test/r/rpl_loaddata_rule_s.result index a84368501a9..26893cb1e9e 100644 --- a/mysql-test/r/rpl_loaddata_rule_s.result +++ b/mysql-test/r/rpl_loaddata_rule_s.result @@ -1,9 +1,9 @@ -slave stop; +stop slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; reset master; reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; -slave start; +start slave; reset master; create table t1(a int, b int, unique(b)); load data infile '../../std_data/rpl_loaddata.dat' into table test.t1; diff --git a/mysql-test/r/rpl_log.result b/mysql-test/r/rpl_log.result index 1583ac3038d..0c876d30ef4 100644 --- a/mysql-test/r/rpl_log.result +++ b/mysql-test/r/rpl_log.result @@ -12,7 +12,10 @@ create table t1(n int not null auto_increment primary key); insert into t1 values (NULL); drop table t1; create table t1 (word char(20) not null); -load data infile '../../std_data/words.dat' into table t1; +load data infile '../../std_data/words.dat' into table t1 ignore 1 lines; +select count(*) from t1; +count(*) +69 drop table t1; show binlog events; Log_name Pos Event_type Server_id Orig_log_pos Info @@ -81,16 +84,16 @@ slave-bin.000001 200 Query 1 200 use `test`; insert into t1 values (NULL) slave-bin.000001 263 Query 1 263 use `test`; drop table t1 slave-bin.000001 311 Query 1 311 use `test`; create table t1 (word char(20) not null) slave-bin.000001 386 Create_file 1 386 db=test;table=t1;file_id=1;block_len=581 -slave-bin.000001 1065 Exec_load 1 1056 ;file_id=1 -slave-bin.000001 1088 Query 1 1079 use `test`; drop table t1 -slave-bin.000001 1136 Query 1 4 use `test`; create table t5 (a int) -slave-bin.000001 1194 Query 1 62 use `test`; drop table t5 +slave-bin.000001 1065 Exec_load 1 1065 ;file_id=1 +slave-bin.000001 1088 Query 1 1088 use `test`; drop table t1 +slave-bin.000001 1136 Query 1 1136 use `test`; create table t5 (a int) +slave-bin.000001 1194 Query 1 1194 use `test`; drop table t5 slave-bin.000001 1242 Rotate 2 1242 slave-bin.000002;pos=4 show binlog events in 'slave-bin.000002' from 4; Log_name Pos Event_type Server_id Orig_log_pos Info -slave-bin.000002 4 Query 1 110 use `test`; create table t1 (n int) -slave-bin.000002 62 Query 1 168 use `test`; insert into t1 values (1) -slave-bin.000002 122 Query 1 228 use `test`; drop table t1 +slave-bin.000002 4 Query 1 4 use `test`; create table t1 (n int) +slave-bin.000002 62 Query 1 62 use `test`; insert into t1 values (1) +slave-bin.000002 122 Query 1 122 use `test`; drop table t1 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key 127.0.0.1 root MASTER_PORT 1 master-bin.000002 276 slave-relay-bin.000003 214 master-bin.000002 Yes Yes 0 0 276 214 No diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 888fe1b29f8..952ed566132 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -348,11 +348,7 @@ select found_rows(); found_rows() 4 (SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION SELECT * FROM t2 LIMIT 1; -a -1 -select found_rows(); -found_rows() -4 +ERROR 42000: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION all SELECT * FROM t2 LIMIT 2; a 1 @@ -435,7 +431,7 @@ a 3 3 (SELECT * FROM t1) UNION all (SELECT SQL_CALC_FOUND_ROWS * FROM t2) LIMIT 1; -Wrong usage/placement of 'SQL_CALC_FOUND_ROWS' +ERROR 42000: Wrong usage/placement of 'SQL_CALC_FOUND_ROWS' drop table t1,t2; CREATE TABLE t1 ( id int(3) unsigned default '0') TYPE=MyISAM; INSERT INTO t1 (id) VALUES("1"); diff --git a/mysql-test/t/lowercase_table.test b/mysql-test/t/lowercase_table.test index 2e5cb5f89fc..28e45bde5c5 100644 --- a/mysql-test/t/lowercase_table.test +++ b/mysql-test/t/lowercase_table.test @@ -11,7 +11,7 @@ INSERT INTO T1 VALUES (1, 'a'), (2, 'b'), (3, 'c'); SELECT * FROM t1; SELECT T1.id from T1 LIMIT 1; SELECT T2.id from t1 as T2 LIMIT 1; ---error 1109 +# This gave an error in 4.0, but it's fixed in 4.1 SELECT T2.id from t1 as t2 LIMIT 1; RENAME TABLE T1 TO T2; ALTER TABLE T2 ADD new_col int not null; diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test index 55449dafa3a..541f2be65d5 100644 --- a/mysql-test/t/myisam.test +++ b/mysql-test/t/myisam.test @@ -299,7 +299,7 @@ update t1 set b=repeat('a',256); update t1 set i1=0, i2=0, i3=0, i4=0, i5=0, i6=0, i7=0; check table t1; delete from t1 where i8=1; -select * from t1; +select i1,i2 from t1; check table t1; drop table t1; diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index e7bda27d43e..dfb5a15bf40 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -212,8 +212,10 @@ select found_rows(); select found_rows(); (SELECT SQL_CALC_FOUND_ROWS * FROM t1) UNION all (SELECT * FROM t2 LIMIT 1); select found_rows(); +# This used to work in 4.0 but not anymore in 4.1 +--error 1149 (SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION SELECT * FROM t2 LIMIT 1; -select found_rows(); +#select found_rows(); # In these case found_rows() should work SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION all SELECT * FROM t2 LIMIT 2; diff --git a/sql-bench/compare-results.sh b/sql-bench/compare-results.sh index 9e3a8f2add8..e95bd23e6a3 100644 --- a/sql-bench/compare-results.sh +++ b/sql-bench/compare-results.sh @@ -93,7 +93,7 @@ foreach (@ARGV) } elsif (/Comments:\s+(.+)/i) { $tot{$prog}{'comments'} = $1; - } elsif (/^(\S+):\s*(estimated\s|)total\stime:\s+([\d.]+)\s+(wallclock\s|)secs/i) + } elsif (/^(\S+):.*(estimated\s|)total\stime:\s+([\d.]+)\s+(wallclock\s|)secs/i) { $tmp = $1; $tmp =~ s/://; $tot{$prog}{$tmp} = [ $3, (length($2) ? "+" : "")]; diff --git a/sql/field.h b/sql/field.h index 10d3e671867..fe5141e9d80 100644 --- a/sql/field.h +++ b/sql/field.h @@ -125,6 +125,13 @@ public: { return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : table->null_row; } inline bool is_real_null(uint row_offset=0) { return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : 0; } + inline bool is_null_in_record(const uchar *record) + { + if (!null_ptr) + return 0; + return test(record[(uint) (null_ptr - (uchar*) table->record[0])] & + null_bit); + } inline void set_null(int row_offset=0) { if (null_ptr) null_ptr[row_offset]|= null_bit; } inline void set_notnull(int row_offset=0) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index bcdb01da9ca..017151dfca0 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -1540,82 +1540,6 @@ ha_innobase::close(void) DBUG_RETURN(0); } -/* The following accessor functions should really be inside MySQL code! */ - -/****************************************************************** -Gets field offset for a field in a table. */ -inline -uint -get_field_offset( -/*=============*/ - /* out: offset */ - TABLE* table, /* in: MySQL table object */ - Field* field) /* in: MySQL field object */ -{ - return((uint) (field->ptr - (char*) table->record[0])); -} - -/****************************************************************** -Checks if a field in a record is SQL NULL. Uses the record format -information in table to track the null bit in record. */ -inline -uint -field_in_record_is_null( -/*====================*/ - /* out: 1 if NULL, 0 otherwise */ - TABLE* table, /* in: MySQL table object */ - Field* field, /* in: MySQL field object */ - char* record) /* in: a row in MySQL format */ -{ - int null_offset; - - if (!field->null_ptr) { - - return(0); - } - - null_offset = (uint) ((char*) field->null_ptr - - (char*) table->record[0]); - - if (record[null_offset] & field->null_bit) { - - return(1); - } - - return(0); -} - -/****************************************************************** -Sets a field in a record to SQL NULL. Uses the record format -information in table to track the null bit in record. */ -inline -void -set_field_in_record_to_null( -/*========================*/ - TABLE* table, /* in: MySQL table object */ - Field* field, /* in: MySQL field object */ - char* record) /* in: a row in MySQL format */ -{ - int null_offset; - - null_offset = (uint) ((char*) field->null_ptr - - (char*) table->record[0]); - - record[null_offset] = record[null_offset] | field->null_bit; -} - -/****************************************************************** -Resets SQL NULL bits in a record to zero. */ -inline -void -reset_null_bits( -/*============*/ - TABLE* table, /* in: MySQL table object */ - char* record) /* in: a row in MySQL format */ -{ - bzero(record, table->null_bytes); -} - extern "C" { /***************************************************************** InnoDB uses this function is to compare two data fields for which the @@ -1825,11 +1749,10 @@ ha_innobase::store_key_val_for_row( blob_data = row_mysql_read_blob_ref(&blob_len, (byte*) (record - + (ulint)get_field_offset(table, field)), + + (ulint) field->offset()), (ulint) field->pack_length()); - ut_a(get_field_offset(table, field) - == key_part->offset); + ut_a(field->offset() == key_part->offset); if (blob_len > key_part->length) { blob_len = key_part->length; } @@ -2009,9 +1932,7 @@ build_template( templ->mysql_null_bit_mask = 0; } - templ->mysql_col_offset = (ulint) - get_field_offset(table, field); - + templ->mysql_col_offset = (ulint) field->offset(); templ->mysql_col_len = (ulint) field->pack_length(); templ->type = get_innobase_type_from_mysql_type(field); templ->is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); @@ -2348,8 +2269,8 @@ calc_row_difference( /* goto skip_field; }*/ - o_ptr = (byte*) old_row + get_field_offset(table, field); - n_ptr = (byte*) new_row + get_field_offset(table, field); + o_ptr = (byte*) old_row + field->offset(); + n_ptr = (byte*) new_row + field->offset(); o_len = field->pack_length(); n_len = field->pack_length(); @@ -2374,13 +2295,11 @@ calc_row_difference( } if (field->null_ptr) { - if (field_in_record_is_null(table, field, - (char*) old_row)) { + if (field->is_null_in_record((uchar*) old_row)) { o_len = UNIV_SQL_NULL; } - if (field_in_record_is_null(table, field, - (char*) new_row)) { + if (field->is_null_in_record((uchar*) new_row)) { n_len = UNIV_SQL_NULL; } } diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 09b92d7df40..c36b8dcc9d8 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1459,7 +1459,7 @@ void Item_func_in::fix_length_and_dec() DBUG_ASSERT(0); return; } - if (array && !(current_thd->fatal_error)) // If not EOM + if (array && !(current_thd->is_fatal_error)) // If not EOM { uint j=0; for (uint i=1 ; i < arg_count ; i++) diff --git a/sql/log_event.cc b/sql/log_event.cc index 48c2000d11b..91349feec39 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -912,18 +912,6 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) DBUG_PRINT("query",("%s",thd->query)); mysql_parse(thd, thd->query, q_len); - /* - Set a flag if we are inside an transaction so that we can restart - the transaction from the start if we are killed - - This will only be done if we are supporting transactional tables - in the slave. - */ - if (!strcmp(thd->query,"BEGIN")) - rli->inside_transaction= opt_using_transactions; - else if (!(strcmp(thd->query,"COMMIT") && strcmp(thd->query,"ROLLBACK"))) - rli->inside_transaction=0; - /* If we expected a non-zero error code, and we don't get the same error code, and none of them should be ignored. @@ -1771,7 +1759,7 @@ Fatal error running LOAD DATA INFILE on table '%s'. Default database: '%s'", void Rotate_log_event::pack_info(Protocol *protocol) { char buf1[256], buf[22]; - String tmp(buf1, sizeof(buf1)); + String tmp(buf1, sizeof(buf1), log_cs); tmp.length(0); tmp.append(new_log_ident, ident_len); tmp.append(";pos="); @@ -1896,16 +1884,19 @@ int Rotate_log_event::exec_event(struct st_relay_log_info* rli) pthread_mutex_lock(&rli->data_lock); +#ifdef TO_BE_CHECKED_BY_GUILHEM if (rli->inside_transaction) { slave_print_error(rli, 0, - "there is an unfinished transaction in the relay log \ -(could find neither COMMIT nor ROLLBACK in the relay log); it could be that \ -the master died while writing the transaction to its binary log. Now the slave \ -is rolling back the transaction."); + "\ +There is an unfinished transaction in the relay log (could find neither \ +COMMIT nor ROLLBACK in the relay log); It could be that the master died while \ +writing the transaction to its binary log. Now the slave is rolling back the \ +transaction."); pthread_mutex_unlock(&rli->data_lock); DBUG_RETURN(1); } +#endif memcpy(log_name, new_log_ident, ident_len+1); rli->group_master_log_pos = pos; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 947c930b2f4..5a883ce8b2c 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -618,6 +618,7 @@ int SQL_SELECT::test_quick_select(key_map keys_to_use, table_map prev_tables, SEL_TREE *tree; KEY_PART *key_parts; PARAM param; + THD *thd= current_thd; /* set up parameter that is passed to all functions */ param.baseflag=basflag; @@ -628,13 +629,13 @@ int SQL_SELECT::test_quick_select(key_map keys_to_use, table_map prev_tables, param.keys=0; param.mem_root= &alloc; - current_thd->no_errors=1; // Don't warn about NULL + thd->no_errors=1; // Don't warn about NULL init_sql_alloc(&alloc,2048,0); if (!(param.key_parts = (KEY_PART*) alloc_root(&alloc, sizeof(KEY_PART)* head->key_parts))) { - current_thd->no_errors=0; + thd->no_errors=0; free_root(&alloc,MYF(0)); // Return memory & allocator DBUG_RETURN(0); // Can't use range } @@ -736,7 +737,7 @@ int SQL_SELECT::test_quick_select(key_map keys_to_use, table_map prev_tables, } free_root(&alloc,MYF(0)); // Return memory & allocator my_pthread_setspecific_ptr(THR_MALLOC,old_root); - current_thd->no_errors=0; + thd->no_errors=0; } DBUG_EXECUTE("info",print_quick(quick,needed_reg);); /* @@ -764,7 +765,7 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond) while ((item=li++)) { SEL_TREE *new_tree=get_mm_tree(param,item); - if(current_thd->fatal_error) + if (current_thd->is_fatal_error) DBUG_RETURN(0); // out of memory tree=tree_and(param,tree,new_tree); if (tree && tree->type == SEL_TREE::IMPOSSIBLE) diff --git a/sql/slave.cc b/sql/slave.cc index 531b7897d83..0c8db2fe6cc 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -2963,7 +2963,6 @@ the slave SQL thread with \"SLAVE START\". We stopped at log \ restarts replication from a non-transactional statement (with CHANGE MASTER). */ - rli->inside_transaction= 0; /* Wake up master_pos_wait() */ pthread_mutex_unlock(&rli->data_lock); DBUG_PRINT("info",("Signaling possibly waiting master_pos_wait() functions")); diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 60353d23c16..6f588427ede 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -532,36 +532,13 @@ static int acl_compare(ACL_ACCESS *a,ACL_ACCESS *b) /* - Prepare crypted scramble to be sent to the client -*/ + Seek ACL entry for a user, check password, SSL cypher, and if + everything is OK, update THD user data and USER_RESOURCES struct. -void prepare_scramble(THD *thd, ACL_USER *acl_user,char* prepared_scramble) -{ - /* Binary password format to be used for generation*/ - char bin_password[SCRAMBLE41_LENGTH]; - /* Generate new long scramble for the thread */ - create_random_string(SCRAMBLE41_LENGTH,&thd->rand,thd->scramble); - thd->scramble[SCRAMBLE41_LENGTH]=0; - /* Get binary form, First 4 bytes of prepared scramble is salt */ - get_hash_and_password(acl_user->salt,acl_user->pversion,prepared_scramble, - (unsigned char*) bin_password); - /* Store "*" as identifier for old passwords */ - if (!acl_user->pversion) - prepared_scramble[0]='*'; - /* Finally encrypt password to get prepared scramble */ - password_crypt(thd->scramble, prepared_scramble+4, bin_password, - SCRAMBLE41_LENGTH); -} - - -/* - Seek ACL entry for a user, check password, SSL cypher, and if - everything is OK, update THD user data and USER_RESOURCES struct. - - IMPLEMENTATION - This function does not check if the user has any sensible privileges: - only user's existence and validity is checked. - Note, that entire operation is protected by acl_cache_lock. + IMPLEMENTATION + This function does not check if the user has any sensible privileges: + only user's existence and validity is checked. + Note, that entire operation is protected by acl_cache_lock. SYNOPSIS acl_getroot() @@ -578,7 +555,7 @@ void prepare_scramble(THD *thd, ACL_USER *acl_user,char* prepared_scramble) SCRAMBLE_LENGTH_323, SCRAMBLE_LENGTH 'thd' and 'mqh' are updated on success; other params are IN. - RETURN VALUE + RETURN VALUE 0 success: thd->priv_user, thd->priv_host, thd->master_access, mqh are updated 1 user not found or authentification failure @@ -616,29 +593,29 @@ int acl_getroot(THD *thd, USER_RESOURCES *mqh, for (uint i=0 ; i < acl_users.elements ; i++) { - ACL_USER *acl_user= dynamic_element(&acl_users,i,ACL_USER*); - if (!acl_user->user || !strcmp(thd->user, acl_user->user)) + ACL_USER *acl_user_tmp= dynamic_element(&acl_users,i,ACL_USER*); + if (!acl_user_tmp->user || !strcmp(thd->user, acl_user_tmp->user)) { - if (compare_hostname(&acl_user->host, thd->host, thd->ip)) + if (compare_hostname(&acl_user_tmp->host, thd->host, thd->ip)) { /* check password: it should be empty or valid */ - if (passwd_len == acl_user->salt_len) + if (passwd_len == acl_user_tmp->salt_len) { - if (acl_user->salt_len == 0 || - acl_user->salt_len == SCRAMBLE_LENGTH && - check_scramble(passwd, thd->scramble, acl_user->salt) == 0 || + if (acl_user_tmp->salt_len == 0 || + acl_user_tmp->salt_len == SCRAMBLE_LENGTH && + check_scramble(passwd, thd->scramble, acl_user_tmp->salt) == 0 || check_scramble_323(passwd, thd->scramble, - (ulong *) acl_user->salt) == 0) + (ulong *) acl_user_tmp->salt) == 0) { - acl_user= acl_user; + acl_user= acl_user_tmp; res= 0; } } else if (passwd_len == SCRAMBLE_LENGTH && - acl_user->salt_len == SCRAMBLE_LENGTH_323) + acl_user_tmp->salt_len == SCRAMBLE_LENGTH_323) res= -1; else if (passwd_len == SCRAMBLE_LENGTH_323 && - acl_user->salt_len == SCRAMBLE_LENGTH) + acl_user_tmp->salt_len == SCRAMBLE_LENGTH) res= 2; /* linear search complete: */ break; @@ -2472,7 +2449,7 @@ int mysql_grant(THD *thd, const char *db, List &list, { my_printf_error(ER_WRONG_USAGE, ER(ER_WRONG_USAGE), MYF(0), "DB GRANT","GLOBAL PRIVILEGES"); - result= 1; + result= -1; } } } @@ -3113,7 +3090,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) protocol->store(global.ptr(),global.length(),global.charset()); if (protocol->write()) { - error=-1; + error= -1; goto end; } } @@ -3171,7 +3148,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) protocol->store(db.ptr(),db.length(),db.charset()); if (protocol->write()) { - error=-1; + error= -1; goto end; } } @@ -3421,7 +3398,7 @@ int mysql_drop_user(THD *thd, List &list) { if (!(acl_user= check_acl_user(user_name, &counter))) { - sql_print_error("DROP USER: Can't drop user: '%s'@'%s'", + sql_print_error("DROP USER: Can't drop user: '%s'@'%s'; No such user", user_name->user.str, user_name->host.str); result= -1; @@ -3429,7 +3406,7 @@ int mysql_drop_user(THD *thd, List &list) } if ((acl_user->access & ~0)) { - sql_print_error("DROP USER: Can't drop user: '%s'@'%s'", + sql_print_error("DROP USER: Can't drop user: '%s'@'%s'; Global privileges exists", user_name->user.str, user_name->host.str); result= -1; @@ -3452,7 +3429,7 @@ int mysql_drop_user(THD *thd, List &list) } if (counter != acl_dbs.elements) { - sql_print_error("DROP USER: Can't drop user: '%s'@'%s'", + sql_print_error("DROP USER: Can't drop user: '%s'@'%s'; Database privileges exists", user_name->user.str, user_name->host.str); result= -1; @@ -3475,7 +3452,7 @@ int mysql_drop_user(THD *thd, List &list) } if (counter != column_priv_hash.records) { - sql_print_error("DROP USER: Can't drop user: '%s'@'%s'", + sql_print_error("DROP USER: Can't drop user: '%s'@'%s'; Table privileges exists", user_name->user.str, user_name->host.str); result= -1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 080e25cc7eb..eac4007d9fc 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1414,6 +1414,7 @@ JOIN::exec() curr_join->group_list : curr_join->order, curr_join->select_limit, unit->select_limit_cnt)) DBUG_VOID_RETURN; + } } curr_join->having= curr_join->tmp_having; thd->proc_info="Sending data"; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 0e1ad17c252..685d00db391 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1035,7 +1035,7 @@ static void append_directory(THD *thd, String *packet, const char *dir_type, const char *filename) { uint length; - if (filename && !(thd->sql_mode & MODE_NO_DIR_IN_CREATE)) + if (filename && !(thd->variables.sql_mode & MODE_NO_DIR_IN_CREATE)) { length= dirname_length(filename); packet->append(' '); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 0a2821e02e3..af1cb634ed7 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -916,7 +916,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, thd->proc_info="creating table"; - if (thd->sql_mode & MODE_NO_DIR_IN_CREATE) + if (thd->variables.sql_mode & MODE_NO_DIR_IN_CREATE) create_info->data_file_name= create_info->index_file_name= 0; create_info->table_options=db_options; @@ -2597,7 +2597,8 @@ copy_data_between_tables(TABLE *from,TABLE *to, DBUG_RETURN(error > 0 ? -1 : 0); } -int mysql_checksum_table(THD* thd, TABLE_LIST* tables, HA_CHECK_OPT *check_opt) + +int mysql_checksum_table(THD *thd, TABLE_LIST *tables, HA_CHECK_OPT *check_opt) { TABLE_LIST *table; List field_list; @@ -2612,24 +2613,23 @@ int mysql_checksum_table(THD* thd, TABLE_LIST* tables, HA_CHECK_OPT *check_opt) if (protocol->send_fields(&field_list, 1)) DBUG_RETURN(-1); - for (table = tables; table; table = table->next) + for (table= tables; table; table= table->next) { char table_name[NAME_LEN*2+2]; - char* db = (table->db) ? table->db : thd->db; - bool fatal_error=0; + bool fatal_error= 0; TABLE *t; - strxmov(table_name,db ? db : "",".",table->real_name,NullS); - t=table->table = open_ltable(thd, table, TL_READ_NO_INSERT); -#ifdef EMBEDDED_LIBRARY - thd->net.last_errno= 0; // these errors shouldn't get client -#endif + strxmov(table_name, table->db ,".", table->real_name, NullS); + + t= table->table= open_ltable(thd, table, TL_READ_NO_INSERT); + thd->clear_error(); // these errors shouldn't get client protocol->prepare_for_resend(); protocol->store(table_name, system_charset_info); if (!t) { + /* Table didn't exist */ protocol->store_null(); thd->net.last_error[0]=0; } @@ -2641,45 +2641,42 @@ int mysql_checksum_table(THD* thd, TABLE_LIST* tables, HA_CHECK_OPT *check_opt) !(check_opt->flags & T_EXTEND)) protocol->store((ulonglong)t->file->checksum()); else if (!(t->file->table_flags() & HA_HAS_CHECKSUM) && - check_opt->flags & T_QUICK) + (check_opt->flags & T_QUICK)) protocol->store_null(); else { /* calculating table's checksum */ - ha_checksum crc=0; + ha_checksum crc= 0; if (t->file->rnd_init(1)) protocol->store_null(); else { while (!t->file->rnd_next(t->record[0])) { - ha_checksum row_crc=0; + ha_checksum row_crc= 0; if (t->record[0] != t->field[0]->ptr) - row_crc=my_checksum(row_crc, t->record[0], - t->field[0]->ptr - t->record[0]); + row_crc= my_checksum(row_crc, t->record[0], + t->field[0]->ptr - t->record[0]); - for (uint i=0; i < t->fields; i++ ) + for (uint i= 0; i < t->fields; i++ ) { - Field *f=t->field[i]; + Field *f= t->field[i]; if (f->type() == FIELD_TYPE_BLOB) { String tmp; f->val_str(&tmp,&tmp); - row_crc=my_checksum(row_crc, tmp.ptr(), tmp.length()); + row_crc= my_checksum(row_crc, tmp.ptr(), tmp.length()); } else - row_crc=my_checksum(row_crc, f->ptr, f->pack_length()); + row_crc= my_checksum(row_crc, f->ptr, f->pack_length()); } - crc+=row_crc; + crc+= row_crc; } protocol->store((ulonglong)crc); } } -#ifdef EMBEDDED_LIBRARY - thd->net.last_errno= 0; // these errors shouldn't get client -#endif - + thd->clear_error(); close_thread_tables(thd); table->table=0; // For query cache } @@ -2689,6 +2686,7 @@ int mysql_checksum_table(THD* thd, TABLE_LIST* tables, HA_CHECK_OPT *check_opt) send_eof(thd); DBUG_RETURN(0); + err: close_thread_tables(thd); // Shouldn't be needed if (table) diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 7146630d132..381311b4975 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -262,23 +262,8 @@ int st_select_lex_unit::exec() res= sl->join->reinit(); else { - /* Don't use offset for the last union if there is no braces */ - if (sl != lex_sl) - { - offset_limit_cnt= sl->offset_limit; - select_limit_cnt= sl->select_limit+sl->offset_limit; - } - else - { - offset_limit_cnt= 0; - /* - We can't use LIMIT at this stage if we are using ORDER BY for the - whole query - */ - select_limit_cnt= HA_POS_ERROR; - if (! sl->order_list.first) - select_limit_cnt= sl->select_limit+sl->offset_limit; - } + offset_limit_cnt= sl->offset_limit; + select_limit_cnt= sl->select_limit+sl->offset_limit; if (select_limit_cnt < sl->select_limit) select_limit_cnt= HA_POS_ERROR; // no limit @@ -297,10 +282,10 @@ int st_select_lex_unit::exec() sl->options|= found_rows_for_union; } - /* - As far as union share table space we should reassign table map, - which can be spoiled by 'prepare' of JOIN of other UNION parts - if it use same tables + /* + As far as union share table space we should reassign table map, + which can be spoiled by 'prepare' of JOIN of other UNION parts + if it use same tables */ uint tablenr=0; for (TABLE_LIST *table_list= (TABLE_LIST*) sl->table_list.first; diff --git a/tests/client_test.c b/tests/client_test.c index 46a272f2acb..2cbea7e27bc 100644 --- a/tests/client_test.c +++ b/tests/client_test.c @@ -412,7 +412,7 @@ uint my_process_stmt_result(MYSQL_STMT *stmt) my_bool is_null[MAX_RES_FIELDS]; int rc, i; - if (!(result= mysql_prepare_result(stmt))) /* No meta info */ + if (!(result= mysql_get_metadata(stmt))) /* No meta info */ { while (!mysql_fetch(stmt)) row_count++; @@ -1017,7 +1017,7 @@ static void test_prepare_field_result() verify_param_count(stmt,1); - result = mysql_prepare_result(stmt); + result = mysql_get_metadata(stmt); mytest(result); my_print_result_metadata(result); @@ -1765,7 +1765,6 @@ static void test_bug1115() MYSQL_BIND bind[1]; ulong length[1]; char szData[11]; - int nData=1; myheader("test_bug1115"); @@ -3728,7 +3727,7 @@ static void test_prepare_resultset() verify_param_count(stmt,0); - result = mysql_prepare_result(stmt); + result = mysql_get_metadata(stmt); mytest(result); my_print_result_metadata(result); mysql_stmt_close(stmt); @@ -5926,7 +5925,7 @@ static void test_field_misc() rc = mysql_execute(stmt); mystmt(stmt,rc); - result = mysql_prepare_result(stmt); + result = mysql_get_metadata(stmt); mytest(result); myassert(1 == my_process_stmt_result(stmt)); @@ -5967,7 +5966,7 @@ static void test_field_misc() stmt = mysql_prepare(mysql, "SELECT @@table_type", 30); mystmt_init(stmt); - result = mysql_prepare_result(stmt); + result = mysql_get_metadata(stmt); mytest(result); rc = mysql_execute(stmt); @@ -5987,7 +5986,7 @@ static void test_field_misc() stmt = mysql_prepare(mysql, "SELECT @@max_error_count", 30); mystmt_init(stmt); - result = mysql_prepare_result(stmt); + result = mysql_get_metadata(stmt); mytest(result); rc = mysql_execute(stmt); @@ -6007,7 +6006,7 @@ static void test_field_misc() stmt = mysql_prepare(mysql, "SELECT @@max_allowed_packet", 30); mystmt_init(stmt); - result = mysql_prepare_result(stmt); + result = mysql_get_metadata(stmt); mytest(result); rc = mysql_execute(stmt); @@ -6027,7 +6026,7 @@ static void test_field_misc() stmt = mysql_prepare(mysql, "SELECT @@sql_warnings", 30); mystmt_init(stmt); - result = mysql_prepare_result(stmt); + result = mysql_get_metadata(stmt); mytest(result); rc = mysql_execute(stmt); @@ -6418,7 +6417,7 @@ static void test_explain_bug() myassert( 2 == my_process_stmt_result(stmt)); - result = mysql_prepare_result(stmt); + result = mysql_get_metadata(stmt); mytest(result); fprintf(stdout, "\n total fields in the result: %d", @@ -6454,7 +6453,7 @@ static void test_explain_bug() myassert( 1 == my_process_stmt_result(stmt)); - result = mysql_prepare_result(stmt); + result = mysql_get_metadata(stmt); mytest(result); fprintf(stdout, "\n total fields in the result: %d", @@ -7255,7 +7254,7 @@ static void test_mem_overun() rc = mysql_execute(stmt); mystmt(stmt,rc); - field_res = mysql_prepare_result(stmt); + field_res = mysql_get_metadata(stmt); mytest(field_res); fprintf(stdout,"\n total fields : %d", mysql_num_fields(field_res)); @@ -7611,7 +7610,7 @@ static void test_ts() stmt = mysql_prepare(mysql,"SELECT * FROM test_ts",50); mystmt_init(stmt); - prep_res = mysql_prepare_result(stmt); + prep_res = mysql_get_metadata(stmt); mytest(prep_res); rc = mysql_execute(stmt);