Manually merged
client/mysqltest.c: Auto merged myisam/mi_check.c: Auto merged mysql-test/r/update.result: Auto merged mysql-test/t/update.test: Auto merged sql/item_timefunc.h: Auto merged sql/spatial.cc: Auto merged sql/sql_select.h: Auto merged BitKeeper/deleted/.del-acinclude.m4~f4ab416bac5003: Auto merged
This commit is contained in:
commit
70536ba1b5
@ -3616,19 +3616,24 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags)
|
||||
/* Read result from each column */
|
||||
for (col_idx= 0; col_idx < num_fields; col_idx++)
|
||||
{
|
||||
/* FIXME is string terminated? */
|
||||
const char *val= (const char *)bind[col_idx].buffer;
|
||||
ulonglong len= *bind[col_idx].length;
|
||||
const char *val;
|
||||
ulonglong len;
|
||||
if (col_idx < max_replace_column && replace_column[col_idx])
|
||||
{
|
||||
val= replace_column[col_idx];
|
||||
len= strlen(val);
|
||||
}
|
||||
if (*bind[col_idx].is_null)
|
||||
else if (*bind[col_idx].is_null)
|
||||
{
|
||||
val= "NULL";
|
||||
len= 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* FIXME is string terminated? */
|
||||
val= (const char *) bind[col_idx].buffer;
|
||||
len= *bind[col_idx].length;
|
||||
}
|
||||
if (!display_result_vertically)
|
||||
{
|
||||
if (col_idx) /* No tab before first col */
|
||||
|
@ -1848,7 +1848,7 @@ static int sort_one_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
|
||||
if (sort_one_index(param,info,keyinfo,next_page,new_file))
|
||||
{
|
||||
DBUG_PRINT("error",
|
||||
("From page: %ld, keyoffset: 0x%lx used_length: %d",
|
||||
("From page: %ld, keyoffset: %lu used_length: %d",
|
||||
(ulong) pagepos, (ulong) (keypos - buff),
|
||||
(int) used_length));
|
||||
DBUG_DUMP("buff",(byte*) buff,used_length);
|
||||
|
@ -337,3 +337,11 @@ a b
|
||||
22 3
|
||||
23 3
|
||||
drop table t1;
|
||||
create table t1 (f1 date not null);
|
||||
insert into t1 values('2000-01-01'),('0000-00-00');
|
||||
update t1 set f1='2002-02-02' where f1 is null;
|
||||
select * from t1;
|
||||
f1
|
||||
2000-01-01
|
||||
2002-02-02
|
||||
drop table t1;
|
||||
|
@ -260,5 +260,14 @@ update t1 set a=a+11,b=2 order by a limit 3;
|
||||
update t1 set a=a+12,b=3 order by a limit 3;
|
||||
select * from t1 order by a;
|
||||
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#14186 select datefield is null not updated
|
||||
#
|
||||
create table t1 (f1 date not null);
|
||||
insert into t1 values('2000-01-01'),('0000-00-00');
|
||||
update t1 set f1='2002-02-02' where f1 is null;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
# End of 4.1 tests
|
||||
|
@ -1378,6 +1378,7 @@ my_decimal *Item_func_abs::decimal_op(my_decimal *decimal_value)
|
||||
void Item_func_abs::fix_length_and_dec()
|
||||
{
|
||||
Item_func_num1::fix_length_and_dec();
|
||||
maybe_null= 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2504,6 +2504,7 @@ void Item_func_add_time::fix_length_and_dec()
|
||||
enum_field_types arg0_field_type;
|
||||
decimals=0;
|
||||
max_length=MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
|
||||
maybe_null= 1;
|
||||
|
||||
/*
|
||||
The field type for the result of an Item_func_add_time function is defined
|
||||
|
@ -129,15 +129,14 @@ Geometry *Geometry::construct(Geometry_buffer *buffer,
|
||||
Geometry *result;
|
||||
char byte_order;
|
||||
|
||||
if (data_len < SRID_SIZE + 1 + 4)
|
||||
if (data_len < SRID_SIZE + WKB_HEADER_SIZE) // < 4 + (1 + 4)
|
||||
return NULL;
|
||||
byte_order= data[SRID_SIZE];
|
||||
geom_type= uint4korr(data + SRID_SIZE + 1);
|
||||
data+= SRID_SIZE + WKB_HEADER_SIZE;
|
||||
if (!(result= create_by_typeid(buffer, (int) geom_type)))
|
||||
return NULL;
|
||||
result->m_data= data;
|
||||
result->m_data_end= data + (data_len - (SRID_SIZE + WKB_HEADER_SIZE));
|
||||
result->m_data= data+ SRID_SIZE + WKB_HEADER_SIZE;
|
||||
result->m_data_end= data + data_len;
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -739,7 +738,7 @@ uint Gis_polygon::init_from_wkb(const char *wkb, uint len, wkbByteOrder bo,
|
||||
wkb+= ls_len;
|
||||
}
|
||||
|
||||
return wkb - wkb_orig;
|
||||
return (uint) (wkb - wkb_orig);
|
||||
}
|
||||
|
||||
|
||||
@ -1184,7 +1183,8 @@ uint Gis_multi_line_string::init_from_wkb(const char *wkb, uint len,
|
||||
return 0;
|
||||
res->q_append(n_line_strings);
|
||||
|
||||
for (wkb+=4; n_line_strings; n_line_strings--)
|
||||
wkb+= 4;
|
||||
while (n_line_strings--)
|
||||
{
|
||||
Gis_line_string ls;
|
||||
int ls_len;
|
||||
@ -1199,10 +1199,11 @@ uint Gis_multi_line_string::init_from_wkb(const char *wkb, uint len,
|
||||
if (!(ls_len= ls.init_from_wkb(wkb + WKB_HEADER_SIZE, len,
|
||||
(wkbByteOrder) wkb[0], res)))
|
||||
return 0;
|
||||
wkb+= (ls_len + WKB_HEADER_SIZE);
|
||||
len-= (ls_len + WKB_HEADER_SIZE);
|
||||
ls_len+= WKB_HEADER_SIZE;;
|
||||
wkb+= ls_len;
|
||||
len-= ls_len;
|
||||
}
|
||||
return wkb-wkb_orig;
|
||||
return (uint) (wkb - wkb_orig);
|
||||
}
|
||||
|
||||
|
||||
@ -1436,7 +1437,8 @@ uint Gis_multi_polygon::init_from_wkb(const char *wkb, uint len,
|
||||
return 0;
|
||||
res->q_append(n_poly);
|
||||
|
||||
for (wkb+=4; n_poly; n_poly--)
|
||||
wkb+=4;
|
||||
while (n_poly--)
|
||||
{
|
||||
Gis_polygon p;
|
||||
int p_len;
|
||||
@ -1450,10 +1452,11 @@ uint Gis_multi_polygon::init_from_wkb(const char *wkb, uint len,
|
||||
if (!(p_len= p.init_from_wkb(wkb + WKB_HEADER_SIZE, len,
|
||||
(wkbByteOrder) wkb[0], res)))
|
||||
return 0;
|
||||
wkb+= (p_len + WKB_HEADER_SIZE);
|
||||
len-= (p_len + WKB_HEADER_SIZE);
|
||||
p_len+= WKB_HEADER_SIZE;
|
||||
wkb+= p_len;
|
||||
len-= p_len;
|
||||
}
|
||||
return wkb-wkb_orig;
|
||||
return (uint) (wkb - wkb_orig);
|
||||
}
|
||||
|
||||
|
||||
@ -1733,7 +1736,8 @@ uint Gis_geometry_collection::init_from_wkb(const char *wkb, uint len,
|
||||
return 0;
|
||||
res->q_append(n_geom);
|
||||
|
||||
for (wkb+=4; n_geom; n_geom--)
|
||||
wkb+= 4;
|
||||
while (n_geom--)
|
||||
{
|
||||
Geometry_buffer buffer;
|
||||
Geometry *geom;
|
||||
@ -1752,10 +1756,11 @@ uint Gis_geometry_collection::init_from_wkb(const char *wkb, uint len,
|
||||
!(g_len= geom->init_from_wkb(wkb + WKB_HEADER_SIZE, len,
|
||||
(wkbByteOrder) wkb[0], res)))
|
||||
return 0;
|
||||
wkb+= (g_len + WKB_HEADER_SIZE);
|
||||
len-= (g_len + WKB_HEADER_SIZE);
|
||||
g_len+= WKB_HEADER_SIZE;
|
||||
wkb+= g_len;
|
||||
len-= g_len;
|
||||
}
|
||||
return wkb-wkb_orig;
|
||||
return (uint) (wkb - wkb_orig);
|
||||
}
|
||||
|
||||
|
||||
|
@ -102,8 +102,6 @@ static COND *optimize_cond(JOIN *join, COND *conds,
|
||||
List<TABLE_LIST> *join_list,
|
||||
Item::cond_result *cond_value);
|
||||
static bool resolve_nested_join (TABLE_LIST *table);
|
||||
static COND *remove_eq_conds(THD *thd, COND *cond,
|
||||
Item::cond_result *cond_value);
|
||||
static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item);
|
||||
static bool open_tmp_table(TABLE *table);
|
||||
static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param,
|
||||
@ -7474,7 +7472,7 @@ optimize_cond(JOIN *join, COND *conds, List<TABLE_LIST> *join_list,
|
||||
COND_FALSE always false ( 1 = 2 )
|
||||
*/
|
||||
|
||||
static COND *
|
||||
COND *
|
||||
remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value)
|
||||
{
|
||||
if (cond->type() == Item::COND_ITEM)
|
||||
|
@ -524,3 +524,4 @@ bool cp_buffer_from_ref(THD *thd, TABLE_REF *ref);
|
||||
bool error_if_full_join(JOIN *join);
|
||||
int report_error(TABLE *table, int error);
|
||||
int safe_index_read(JOIN_TAB *tab);
|
||||
COND *remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value);
|
||||
|
@ -132,7 +132,7 @@ int mysql_update(THD *thd,
|
||||
ha_rows updated, found;
|
||||
key_map old_used_keys;
|
||||
TABLE *table;
|
||||
SQL_SELECT *select;
|
||||
SQL_SELECT *select= 0;
|
||||
READ_RECORD info;
|
||||
SELECT_LEX *select_lex= &thd->lex->select_lex;
|
||||
bool need_reopen;
|
||||
@ -228,11 +228,20 @@ int mysql_update(THD *thd,
|
||||
DBUG_RETURN(1); /* purecov: inspected */
|
||||
}
|
||||
|
||||
if (conds)
|
||||
{
|
||||
Item::cond_result cond_value;
|
||||
conds= remove_eq_conds(thd, conds, &cond_value);
|
||||
if (cond_value == Item::COND_FALSE)
|
||||
limit= 0; // Impossible WHERE
|
||||
}
|
||||
// Don't count on usage of 'only index' when calculating which key to use
|
||||
table->used_keys.clear_all();
|
||||
select= make_select(table, 0, 0, conds, 0, &error);
|
||||
if (error ||
|
||||
(select && select->check_quick(thd, safe_update, limit)) || !limit)
|
||||
if (limit)
|
||||
select=make_select(table,0,0,conds,&error);
|
||||
if (error || !limit ||
|
||||
(select && select->check_quick(thd, safe_update, limit)))
|
||||
{
|
||||
delete select;
|
||||
free_underlaid_joins(thd, select_lex);
|
||||
|
Loading…
x
Reference in New Issue
Block a user