diff options
Diffstat (limited to 'sql/field.h')
-rw-r--r-- | sql/field.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/sql/field.h b/sql/field.h index 6c0a981fc0a..6c585af3b02 100644 --- a/sql/field.h +++ b/sql/field.h @@ -785,6 +785,15 @@ public: virtual int store_decimal(const my_decimal *d)=0; virtual int store_time_dec(const MYSQL_TIME *ltime, uint dec); virtual int store_timestamp(my_time_t timestamp, ulong sec_part); + /** + Store a value represented in native format + */ + virtual int store_native(const Native &value) + { + DBUG_ASSERT(0); + reset(); + return 0; + } int store_time(const MYSQL_TIME *ltime) { return store_time_dec(ltime, TIME_SECOND_PART_DIGITS); } int store(const char *to, size_t length, CHARSET_INFO *cs, @@ -831,6 +840,11 @@ public: This trickery is used to decrease a number of malloc calls. */ virtual String *val_str(String*,String *)=0; + virtual bool val_native(Native *to) + { + DBUG_ASSERT(!is_null()); + return to->copy((const char *) ptr, pack_length()); + } String *val_int_as_str(String *val_buffer, bool unsigned_flag); /* Return the field value as a LEX_CSTRING, without padding to full length @@ -2780,6 +2794,16 @@ public: store_TIMESTAMP(Timestamp(ts, sec_part).round(decimals(), mode, &warn)); } bool get_date(MYSQL_TIME *ltime, date_mode_t fuzzydate); + int store_native(const Native &value) + { + Timestamp_or_zero_datetime tm(value); + if (tm.is_zero_datetime()) + reset(); + else + store_TIMESTAMP(tm); + return 0; + } + bool val_native(Native *to); uchar *pack(uchar *to, const uchar *from, uint max_length __attribute__((unused))) { @@ -2859,6 +2883,7 @@ public: { DBUG_ASSERT(dec); } + bool val_native(Native *to); my_time_t get_timestamp(const uchar *pos, ulong *sec_part) const; int cmp(const uchar *,const uchar *); uint32 pack_length() const { return 4 + sec_part_bytes(dec); } @@ -2909,6 +2934,16 @@ public: { return get_timestamp(ptr, sec_part); } + bool val_native(Native *to) + { + // Check if it's '0000-00-00 00:00:00' rather than a real timestamp + if (ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) + { + to->length(0); + return false; + } + return Field::val_native(to); + } uint size_of() const { return sizeof(*this); } }; |