Commit 466b46a6 authored by unknown's avatar unknown

Fixed error found during review of new pushed code


client/mysql.cc:
  Don't use c_ptr() for cgets() and ensure buffer is not overwritten
mysql-test/r/cast.result:
  More test for CAST(0x.... as signed)
sql/opt_sum.cc:
  Fix bugs found during review
  - Changed code to be able to remove one if
  - Ensure that count == 0 only if is_exact_count == TRUE
sql/sql_delete.cc:
  Ensure 'allow_sum_func' is reset before call to setup_conds
sql/sql_lex.cc:
  allow_sum_func doesn't have to be reset for each query
  (It's to be reset in setup_fields() or before call to setup_conds()
sql/sql_load.cc:
  Move set of auto_increment_field_not_null so that it's not set if field value is NULL
sql/sql_prepare.cc:
  allow_sum_func doesn't have to be reset for each query
  (It's to be reset in setup_fields() or before call to setup_conds()
sql/sql_update.cc:
  Ensure 'allow_sum_func' is reset before call to setup_conds
parent b337566b
......@@ -993,13 +993,13 @@ static int read_lines(bool execute_commands)
unsigned long clen;
do
{
line= my_cgets(tmpbuf.c_ptr(), tmpbuf.alloced_length(), &clen);
line= my_cgets(tmpbuf.ptr(), tmpbuf.alloced_length()-1, &clen);
buffer.append(line, clen);
/*
if we got buffer fully filled than there is a chance that
something else is still in console input buffer
*/
} while (tmpbuf.alloced_length() <= clen + 1);
} while (tmpbuf.alloced_length() <= clen);
line= buffer.c_ptr();
#else /* OS2 */
buffer.length(0);
......
......@@ -54,6 +54,18 @@ CONVERT(DATE "2004-01-22 21:45:33",BINARY(4))
select CAST(DATE "2004-01-22 21:45:33" AS BINARY(4));
CAST(DATE "2004-01-22 21:45:33" AS BINARY(4))
2004
select CAST(0xb3 as signed);
CAST(0xb3 as signed)
179
select CAST(0x8fffffffffffffff as signed);
CAST(0x8fffffffffffffff as signed)
-8070450532247928833
select CAST(0xffffffffffffffff as unsigned);
CAST(0xffffffffffffffff as unsigned)
18446744073709551615
select CAST(0xfffffffffffffffe as signed);
CAST(0xfffffffffffffffe as signed)
-2
select cast('18446744073709551616' as unsigned);
cast('18446744073709551616' as unsigned)
18446744073709551615
......
......@@ -108,7 +108,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
WHERE t2.field IS NULL;
*/
if (tl->table->map & where_tables)
const_result= 0;
return 0;
}
else
used_tables|= tl->table->map;
......@@ -119,7 +119,10 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
may be used as the real count.
*/
if (tl->table->file->table_flags() & HA_NOT_EXACT_COUNT)
{
is_exact_count= FALSE;
count= 1; // ensure count != 0
}
else
{
tl->table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
......@@ -127,9 +130,6 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
}
}
if (!const_result)
return 0;
/*
Iterate through all items in the SELECT clause and replace
COUNT(), MIN() and MAX() with constants (if possible).
......@@ -150,8 +150,8 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
if (!conds && !((Item_sum_count*) item)->args[0]->maybe_null &&
!outer_tables && is_exact_count)
{
((Item_sum_count*) item)->make_const(count);
recalc_const_item= 1;
((Item_sum_count*) item)->make_const(count);
recalc_const_item= 1;
}
else
const_result= 0;
......@@ -234,7 +234,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
}
if (!count)
{
/* If count != 1, then we know that is_exact_count == TRUE. */
/* If count == 0, then we know that is_exact_count == TRUE. */
((Item_sum_min*) item_sum)->clear(); /* Set to NULL. */
}
else
......
......@@ -27,8 +27,8 @@
#include "ha_innodb.h"
#include "sql_select.h"
int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, SQL_LIST *order,
ha_rows limit, ulong options)
int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
SQL_LIST *order, ha_rows limit, ulong options)
{
int error;
TABLE *table;
......@@ -266,6 +266,7 @@ int mysql_prepare_delete(THD *thd, TABLE_LIST *table_list, Item **conds)
select_lex.table_list.first);
DBUG_ENTER("mysql_prepare_delete");
thd->allow_sum_func= 0;
if (setup_conds(thd, delete_table_list, conds) ||
setup_ftfuncs(&thd->lex->select_lex))
DBUG_RETURN(-1);
......
......@@ -160,7 +160,6 @@ void lex_start(THD *thd, uchar *buf,uint length)
lex->duplicates= DUP_ERROR;
lex->ignore= 0;
lex->proc_list.first= 0;
thd->allow_sum_func= 0;
}
void lex_end(LEX *lex)
......
......@@ -429,8 +429,6 @@ read_fixed_length(THD *thd,COPY_INFO &info,TABLE *table,List<Item> &fields,
while ((sql_field= (Item_field*) it++))
{
Field *field= sql_field->field;
if (field == table->next_number_field)
table->auto_increment_field_not_null= TRUE;
if (pos == read_info.row_end)
{
thd->cuted_fields++; /* Not enough fields */
......@@ -443,11 +441,13 @@ read_fixed_length(THD *thd,COPY_INFO &info,TABLE *table,List<Item> &fields,
{
uint length;
byte save_chr;
if (field == table->next_number_field)
table->auto_increment_field_not_null= TRUE;
if ((length=(uint) (read_info.row_end-pos)) >
field->field_length)
length=field->field_length;
save_chr=pos[length]; pos[length]='\0'; // Safeguard aganst malloc
field->store((char*) pos,length,read_info.read_charset);
field->store((char*) pos,length,read_info.read_charset);
pos[length]=save_chr;
if ((pos+=length) > read_info.row_end)
pos= read_info.row_end; /* Fills rest with space */
......@@ -522,8 +522,6 @@ read_sep_field(THD *thd,COPY_INFO &info,TABLE *table,
length=(uint) (read_info.row_end-pos);
Field *field=sql_field->field;
if (field == table->next_number_field)
table->auto_increment_field_not_null= TRUE;
if (!read_info.enclosed &&
(enclosed_length && length == 4 && !memcmp(pos,"NULL",4)) ||
(length == 1 && read_info.found_null))
......@@ -540,6 +538,8 @@ read_sep_field(THD *thd,COPY_INFO &info,TABLE *table,
}
continue;
}
if (field == table->next_number_field)
table->auto_increment_field_not_null= TRUE;
field->set_notnull();
read_info.row_end[0]=0; // Safe to change end marker
field->store((char*) read_info.row_start,length,read_info.read_charset);
......
......@@ -1738,7 +1738,6 @@ static void reset_stmt_for_execute(Prepared_statement *stmt)
lex->current_select= &lex->select_lex;
if (lex->result)
lex->result->cleanup();
thd->allow_sum_func= 0;
}
......
......@@ -426,6 +426,7 @@ int mysql_prepare_update(THD *thd, TABLE_LIST *table_list,
bzero((char*) &tables,sizeof(tables)); // For ORDER BY
tables.table= table;
tables.alias= table_list->alias;
thd->allow_sum_func= 0;
if (setup_tables(update_table_list) ||
setup_conds(thd, update_table_list, conds) ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment