mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
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
This commit is contained in:
parent
b337566bab
commit
466b46a66a
8 changed files with 30 additions and 18 deletions
|
@ -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) ||
|
||||
|
|
Loading…
Reference in a new issue