Commit 0794dc71 authored by unknown's avatar unknown

Bug #21135 Crash in test "func_time"

 - backport patch from 5.0
 - "table" can be NULL in temporary fields used for type conversion


sql/field.cc:
  table can be NULL in temporary fields used for type conversion.
  Store value in field as if db_low_byte_first was set.
sql/field.h:
  table can be NULL in temporary fields used for type conversion.
  Store value in field as if db_low_byte_first was set.
parent 1c410132
...@@ -3680,7 +3680,7 @@ int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -3680,7 +3680,7 @@ int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
error= 2; error= 2;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
int4store(ptr,tmp); int4store(ptr,tmp);
} }
...@@ -3738,7 +3738,7 @@ int Field_timestamp::store(longlong nr) ...@@ -3738,7 +3738,7 @@ int Field_timestamp::store(longlong nr)
nr, MYSQL_TIMESTAMP_DATETIME, 1); nr, MYSQL_TIMESTAMP_DATETIME, 1);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
int4store(ptr,timestamp); int4store(ptr,timestamp);
} }
...@@ -3762,7 +3762,7 @@ longlong Field_timestamp::val_int(void) ...@@ -3762,7 +3762,7 @@ longlong Field_timestamp::val_int(void)
THD *thd= table->in_use; THD *thd= table->in_use;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
temp=uint4korr(ptr); temp=uint4korr(ptr);
else else
#endif #endif
...@@ -3792,7 +3792,7 @@ String *Field_timestamp::val_str(String *val_buffer, String *val_ptr) ...@@ -3792,7 +3792,7 @@ String *Field_timestamp::val_str(String *val_buffer, String *val_ptr)
val_buffer->length(field_length); val_buffer->length(field_length);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
temp=uint4korr(ptr); temp=uint4korr(ptr);
else else
#endif #endif
...@@ -3857,7 +3857,7 @@ bool Field_timestamp::get_date(TIME *ltime, uint fuzzydate) ...@@ -3857,7 +3857,7 @@ bool Field_timestamp::get_date(TIME *ltime, uint fuzzydate)
long temp; long temp;
THD *thd= table->in_use; THD *thd= table->in_use;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
temp=uint4korr(ptr); temp=uint4korr(ptr);
else else
#endif #endif
...@@ -3894,7 +3894,7 @@ int Field_timestamp::cmp(const char *a_ptr, const char *b_ptr) ...@@ -3894,7 +3894,7 @@ int Field_timestamp::cmp(const char *a_ptr, const char *b_ptr)
{ {
int32 a,b; int32 a,b;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
a=sint4korr(a_ptr); a=sint4korr(a_ptr);
b=sint4korr(b_ptr); b=sint4korr(b_ptr);
...@@ -3912,7 +3912,7 @@ int Field_timestamp::cmp(const char *a_ptr, const char *b_ptr) ...@@ -3912,7 +3912,7 @@ int Field_timestamp::cmp(const char *a_ptr, const char *b_ptr)
void Field_timestamp::sort_string(char *to,uint length __attribute__((unused))) void Field_timestamp::sort_string(char *to,uint length __attribute__((unused)))
{ {
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (!table->db_low_byte_first) if (!table || !table->db_low_byte_first)
{ {
to[0] = ptr[0]; to[0] = ptr[0];
to[1] = ptr[1]; to[1] = ptr[1];
...@@ -3941,7 +3941,7 @@ void Field_timestamp::set_time() ...@@ -3941,7 +3941,7 @@ void Field_timestamp::set_time()
long tmp= (long) table->in_use->query_start(); long tmp= (long) table->in_use->query_start();
set_notnull(); set_notnull();
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
int4store(ptr,tmp); int4store(ptr,tmp);
} }
...@@ -4329,7 +4329,7 @@ int Field_date::store(const char *from, uint len,CHARSET_INFO *cs) ...@@ -4329,7 +4329,7 @@ int Field_date::store(const char *from, uint len,CHARSET_INFO *cs)
from, len, MYSQL_TIMESTAMP_DATE, 1); from, len, MYSQL_TIMESTAMP_DATE, 1);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
int4store(ptr,tmp); int4store(ptr,tmp);
} }
...@@ -4357,7 +4357,7 @@ int Field_date::store(double nr) ...@@ -4357,7 +4357,7 @@ int Field_date::store(double nr)
else else
tmp=(long) rint(nr); tmp=(long) rint(nr);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
int4store(ptr,tmp); int4store(ptr,tmp);
} }
...@@ -4385,7 +4385,7 @@ int Field_date::store(longlong nr) ...@@ -4385,7 +4385,7 @@ int Field_date::store(longlong nr)
else else
tmp=(long) nr; tmp=(long) nr;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
int4store(ptr,tmp); int4store(ptr,tmp);
} }
...@@ -4411,7 +4411,7 @@ double Field_date::val_real(void) ...@@ -4411,7 +4411,7 @@ double Field_date::val_real(void)
{ {
int32 j; int32 j;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
j=sint4korr(ptr); j=sint4korr(ptr);
else else
#endif #endif
...@@ -4423,7 +4423,7 @@ longlong Field_date::val_int(void) ...@@ -4423,7 +4423,7 @@ longlong Field_date::val_int(void)
{ {
int32 j; int32 j;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
j=sint4korr(ptr); j=sint4korr(ptr);
else else
#endif #endif
...@@ -4438,7 +4438,7 @@ String *Field_date::val_str(String *val_buffer, ...@@ -4438,7 +4438,7 @@ String *Field_date::val_str(String *val_buffer,
val_buffer->alloc(field_length); val_buffer->alloc(field_length);
int32 tmp; int32 tmp;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
tmp=sint4korr(ptr); tmp=sint4korr(ptr);
else else
#endif #endif
...@@ -4456,7 +4456,7 @@ int Field_date::cmp(const char *a_ptr, const char *b_ptr) ...@@ -4456,7 +4456,7 @@ int Field_date::cmp(const char *a_ptr, const char *b_ptr)
{ {
int32 a,b; int32 a,b;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
a=sint4korr(a_ptr); a=sint4korr(a_ptr);
b=sint4korr(b_ptr); b=sint4korr(b_ptr);
...@@ -4474,7 +4474,7 @@ int Field_date::cmp(const char *a_ptr, const char *b_ptr) ...@@ -4474,7 +4474,7 @@ int Field_date::cmp(const char *a_ptr, const char *b_ptr)
void Field_date::sort_string(char *to,uint length __attribute__((unused))) void Field_date::sort_string(char *to,uint length __attribute__((unused)))
{ {
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (!table->db_low_byte_first) if (!table || !table->db_low_byte_first)
{ {
to[0] = ptr[0]; to[0] = ptr[0];
to[1] = ptr[1]; to[1] = ptr[1];
...@@ -4698,7 +4698,7 @@ int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -4698,7 +4698,7 @@ int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs)
from, len, MYSQL_TIMESTAMP_DATETIME, 1); from, len, MYSQL_TIMESTAMP_DATETIME, 1);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
int8store(ptr,tmp); int8store(ptr,tmp);
} }
...@@ -4739,7 +4739,7 @@ int Field_datetime::store(longlong nr) ...@@ -4739,7 +4739,7 @@ int Field_datetime::store(longlong nr)
MYSQL_TIMESTAMP_DATETIME, 1); MYSQL_TIMESTAMP_DATETIME, 1);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
int8store(ptr,nr); int8store(ptr,nr);
} }
...@@ -4766,7 +4766,7 @@ void Field_datetime::store_time(TIME *ltime,timestamp_type type) ...@@ -4766,7 +4766,7 @@ void Field_datetime::store_time(TIME *ltime,timestamp_type type)
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1); set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
} }
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
int8store(ptr,tmp); int8store(ptr,tmp);
} }
...@@ -4792,7 +4792,7 @@ longlong Field_datetime::val_int(void) ...@@ -4792,7 +4792,7 @@ longlong Field_datetime::val_int(void)
{ {
longlong j; longlong j;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
j=sint8korr(ptr); j=sint8korr(ptr);
else else
#endif #endif
...@@ -4812,7 +4812,7 @@ String *Field_datetime::val_str(String *val_buffer, ...@@ -4812,7 +4812,7 @@ String *Field_datetime::val_str(String *val_buffer,
int part3; int part3;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
tmp=sint8korr(ptr); tmp=sint8korr(ptr);
else else
#endif #endif
...@@ -4877,7 +4877,7 @@ int Field_datetime::cmp(const char *a_ptr, const char *b_ptr) ...@@ -4877,7 +4877,7 @@ int Field_datetime::cmp(const char *a_ptr, const char *b_ptr)
{ {
longlong a,b; longlong a,b;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
{ {
a=sint8korr(a_ptr); a=sint8korr(a_ptr);
b=sint8korr(b_ptr); b=sint8korr(b_ptr);
...@@ -4895,7 +4895,7 @@ int Field_datetime::cmp(const char *a_ptr, const char *b_ptr) ...@@ -4895,7 +4895,7 @@ int Field_datetime::cmp(const char *a_ptr, const char *b_ptr)
void Field_datetime::sort_string(char *to,uint length __attribute__((unused))) void Field_datetime::sort_string(char *to,uint length __attribute__((unused)))
{ {
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (!table->db_low_byte_first) if (!table || !table->db_low_byte_first)
{ {
to[0] = ptr[0]; to[0] = ptr[0];
to[1] = ptr[1]; to[1] = ptr[1];
......
...@@ -713,7 +713,7 @@ class Field_timestamp :public Field_str { ...@@ -713,7 +713,7 @@ class Field_timestamp :public Field_str {
if ((*null_value= is_null())) if ((*null_value= is_null()))
return 0; return 0;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table && table->db_low_byte_first)
return sint4korr(ptr); return sint4korr(ptr);
#endif #endif
long tmp; long tmp;
......
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