field.cc
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:102k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. /*
  17.   NOTES:
  18.   Some of the number class uses the system functions strtol(), strtoll()...
  19.   To avoid patching the end  or copying the buffer unnecessary, all calls
  20.   to system functions are wrapped to a String object that adds the end null
  21.   if it only if it isn't there.
  22.   This adds some overhead when assigning numbers from strings but makes
  23.   everything simpler.
  24.   */
  25. /*****************************************************************************
  26. ** This file implements classes defined in field.h
  27. *****************************************************************************/
  28. #ifdef __GNUC__
  29. #pragma implementation // gcc: Class implementation
  30. #endif
  31. #include "mysql_priv.h"
  32. #include "sql_select.h"
  33. #include <m_ctype.h>
  34. #include <errno.h>
  35. #ifdef HAVE_FCONVERT
  36. #include <floatingpoint.h>
  37. #endif
  38. /*****************************************************************************
  39. ** Instansiate templates and static variables
  40. *****************************************************************************/
  41. #ifdef __GNUC__
  42. template class List<create_field>;
  43. template class List_iterator<create_field>;
  44. #endif
  45. struct st_decstr {
  46.   uint nr_length,nr_dec,sign,extra;
  47.   char sign_char;
  48. };
  49. uchar Field_null::null[1]={1};
  50. const char field_separator=',';
  51. /*****************************************************************************
  52. ** Static help functions
  53. *****************************************************************************/
  54. /*
  55. ** Calculate length of number and it's parts
  56. ** Increment cuted_fields if wrong number
  57. */
  58. static bool
  59. number_dec(struct st_decstr *sdec, const char *str, const char *end)
  60. {
  61.   sdec->sign=sdec->extra=0;
  62.   if (str == end)
  63.   {
  64.     current_thd->cuted_fields++;
  65.     sdec->nr_length=sdec->nr_dec=sdec->sign=0;
  66.     sdec->extra=1; // We must put one 0 before .
  67.     return 1;
  68.   }
  69.   if (*str == '-' || *str == '+') /* sign */
  70.   {
  71.     sdec->sign_char= *str;
  72.     sdec->sign=1;
  73.     str++;
  74.   }
  75.   const char *start=str;
  76.   while (str != end && isdigit(*str))
  77.     str++;
  78.   if (!(sdec->nr_length=(uint) (str-start)))
  79.     sdec->extra=1; // We must put one 0 before .
  80.   start=str;
  81.   if (str != end && *str == '.')
  82.   {
  83.     str++;
  84.     start=str;
  85.     while (str != end && isdigit(*str))
  86.       str++;
  87.   }
  88.   sdec->nr_dec=(uint) (str-start);
  89.   if (current_thd->count_cuted_fields)
  90.   {
  91.     while (str != end && isspace(*str))
  92.       str++; /* purecov: inspected */
  93.     if (str != end)
  94.     {
  95.       current_thd->cuted_fields++;
  96.       return 1;
  97.     }
  98.   }
  99.   return 0;
  100. }
  101. void Field_num::prepend_zeros(String *value)
  102. {
  103.   int diff;
  104.   if ((diff= (int) (field_length - value->length())) > 0)
  105.   {
  106.     bmove_upp((char*) value->ptr()+field_length,value->ptr()+value->length(),
  107.       value->length());
  108.     bfill((char*) value->ptr(),diff,'0');
  109.     value->length(field_length);
  110.     (void) value->c_ptr_quick(); // Avoid warnings in purify
  111.   }
  112. }
  113. /*
  114. ** Test if given number is a int (or a fixed format float with .000)
  115. ** This is only used to give warnings in ALTER TABLE or LOAD DATA...
  116. */
  117. bool test_if_int(const char *str,int length)
  118. {
  119.   const char *end=str+length;
  120.   while (str != end && isspace(*str)) // Allow start space
  121.     str++; /* purecov: inspected */
  122.   if (str != end && (*str == '-' || *str == '+'))
  123.     str++;
  124.   if (str == end)
  125.     return 0; // Error: Empty string
  126.   for ( ; str != end ; str++)
  127.   {
  128.     if (!isdigit(*str))
  129.     {
  130.       if (*str == '.')
  131.       { // Allow '.0000'
  132. for (str++ ; str != end && *str == '0'; str++) ;
  133. if (str == end)
  134.   return 1;
  135.       }
  136.       if (!isspace(*str))
  137. return 0;
  138.       for (str++ ; str != end ; str++)
  139. if (!isspace(*str))
  140.   return 0;
  141.       return 1;
  142.     }
  143.   }
  144.   return 1;
  145. }
  146. static bool test_if_real(const char *str,int length)
  147. {
  148.   while (length && isspace(*str))
  149.   { // Allow start space
  150.     length--; str++;
  151.   }
  152.   if (!length)
  153.     return 0;
  154.   if (*str == '+' || *str == '-')
  155.   {
  156.     length--; str++;
  157.     if (!length || !(isdigit(*str) || *str == '.'))
  158.       return 0;
  159.   }
  160.   while (length && isdigit(*str))
  161.   {
  162.     length--; str++;
  163.   }
  164.   if (!length)
  165.     return 1;
  166.   if (*str == '.')
  167.   {
  168.     length--; str++;
  169.     while (length && isdigit(*str))
  170.     {
  171.       length--; str++;
  172.     }
  173.   }
  174.   if (!length)
  175.     return 1;
  176.   if (*str == 'E' || *str == 'e')
  177.   {
  178.     if (length < 3 || (str[1] != '+' && str[1] != '-') || !isdigit(str[2]))
  179.       return 0;
  180.     length-=3;
  181.     str+=3;
  182.     while (length && isdigit(*str))
  183.     {
  184.       length--; str++;
  185.     }
  186.   }
  187.   for ( ; length ; length--, str++)
  188.   { // Allow end space
  189.     if (!isspace(*str))
  190.       return 0;
  191.   }
  192.   return 1;
  193. }
  194. /****************************************************************************
  195. ** Functions for the base classes
  196. ** This is a unpacked number.
  197. ****************************************************************************/
  198. Field::Field(char *ptr_arg,uint32 length_arg,uchar *null_ptr_arg,
  199.      uint null_bit_arg,
  200.      utype unireg_check_arg, const char *field_name_arg,
  201.      struct st_table *table_arg)
  202.   :ptr(ptr_arg),null_ptr(null_ptr_arg),null_bit(null_bit_arg),
  203.    table(table_arg),query_id(0),key_start(0),part_of_key(0),part_of_sortkey(0),
  204.    table_name(table_arg ? table_arg->table_name : 0),
  205.    field_name(field_name_arg), unireg_check(unireg_check_arg),
  206.    field_length(length_arg)
  207. {
  208.   flags=null_ptr ? 0: NOT_NULL_FLAG;
  209. }
  210. uint Field::offset()
  211. {
  212.   return (uint) (ptr - (char*) table->record[0]);
  213. }
  214. void Field::copy_from_tmp(int row_offset)
  215. {
  216.   memcpy(ptr,ptr+row_offset,pack_length());
  217.   if (null_ptr)
  218.   {
  219.     *null_ptr= ((null_ptr[0] & (uchar) ~(uint) null_bit) |
  220. null_ptr[row_offset] & (uchar) null_bit);
  221.   }
  222. }
  223. bool Field::send(String *packet)
  224. {
  225.   if (is_null())
  226.     return net_store_null(packet);
  227.   char buff[MAX_FIELD_WIDTH];
  228.   String tmp(buff,sizeof(buff));
  229.   val_str(&tmp,&tmp);
  230.   CONVERT *convert;
  231.   if ((convert=current_thd->convert_set))
  232.     return convert->store(packet,tmp.ptr(),tmp.length());
  233.   return net_store_data(packet,tmp.ptr(),tmp.length());
  234. }
  235. void Field_num::add_zerofill_and_unsigned(String &res) const
  236. {
  237.   res.length((uint) strlen(res.ptr())); // Fix length
  238.   if (unsigned_flag)
  239.     res.append(" unsigned");
  240.   if (zerofill)
  241.     res.append(" zerofill");
  242. }
  243. void Field_num::make_field(Send_field *field)
  244. {
  245.   field->table_name=table_name;
  246.   field->col_name=field_name;
  247.   field->length=field_length;
  248.   field->type=type();
  249.   field->flags=table->maybe_null ? (flags & ~NOT_NULL_FLAG) : flags;
  250.   field->decimals=dec;
  251. }
  252. void Field_str::make_field(Send_field *field)
  253. {
  254.   field->table_name=table_name;
  255.   field->col_name=field_name;
  256.   field->length=field_length;
  257.   field->type=type();
  258.   field->flags=table->maybe_null ? (flags & ~NOT_NULL_FLAG) : flags;
  259.   field->decimals=0;
  260. }
  261. uint Field::fill_cache_field(CACHE_FIELD *copy)
  262. {
  263.   copy->str=ptr;
  264.   copy->length=pack_length();
  265.   copy->blob_field=0;
  266.   if (flags & BLOB_FLAG)
  267.   {
  268.     copy->blob_field=(Field_blob*) this;
  269.     copy->strip=0;
  270.     copy->length-=table->blob_ptr_size;
  271.     return copy->length;
  272.   }
  273.   else if (!zero_pack() && (type() == FIELD_TYPE_STRING && copy->length > 4 ||
  274.     type() == FIELD_TYPE_VAR_STRING))
  275.     copy->strip=1; /* Remove end space */
  276.   else
  277.     copy->strip=0;
  278.   return copy->length+(int) copy->strip;
  279. }
  280. bool Field::get_date(TIME *ltime,bool fuzzydate)
  281. {
  282.   char buff[40];
  283.   String tmp(buff,sizeof(buff)),tmp2,*res;
  284.   if (!(res=val_str(&tmp,&tmp2)) ||
  285.       str_to_TIME(res->ptr(),res->length(),ltime,fuzzydate) == TIMESTAMP_NONE)
  286.     return 1;
  287.   return 0;
  288. }
  289. bool Field::get_time(TIME *ltime)
  290. {
  291.   char buff[40];
  292.   String tmp(buff,sizeof(buff)),tmp2,*res;
  293.   if (!(res=val_str(&tmp,&tmp2)) ||
  294.       str_to_time(res->ptr(),res->length(),ltime))
  295.     return 1;
  296.   return 0;
  297. }
  298. /* This is called when storing a date in a string */
  299. void Field::store_time(TIME *ltime,timestamp_type type)
  300. {
  301.   char buff[25];
  302.   switch (type)  {
  303.   case TIMESTAMP_NONE:
  304.     store("",0); // Probably an error
  305.     break;
  306.   case TIMESTAMP_DATE:
  307.     sprintf(buff,"%04d-%02d-%02d", ltime->year,ltime->month,ltime->day);
  308.     store(buff,10);
  309.     break;
  310.   case TIMESTAMP_FULL:
  311.     sprintf(buff,"%04d-%02d-%02d %02d:%02d:%02d",
  312.     ltime->year,ltime->month,ltime->day,
  313.     ltime->hour,ltime->minute,ltime->second);
  314.     store(buff,19);
  315.     break;
  316.   case TIMESTAMP_TIME:
  317.     sprintf(buff, "%02d:%02d:%02d",
  318.     ltime->hour,ltime->minute,ltime->second);
  319.     store(buff,(uint) strlen(buff));
  320.     break;
  321.   }
  322. }
  323. bool Field::optimize_range()
  324. {
  325.   return test(table->file->option_flag() & HA_READ_NEXT);
  326. }
  327. /****************************************************************************
  328. ** Functions for the Field_decimal class
  329. ** This is a unpacked number.
  330. ****************************************************************************/
  331. void
  332. Field_decimal::reset(void)
  333. {
  334.   Field_decimal::store("0",1);
  335. }
  336. void Field_decimal::overflow(bool negative)
  337. {
  338.   uint len=field_length;
  339.   char *to=ptr;
  340.   if (negative && !unsigned_flag)
  341.   {
  342.     *to++ = '-';
  343.     len--;
  344.   }
  345.   bfill(to,len,negative && unsigned_flag ? '0' : '9');
  346.   if (dec)
  347.     ptr[field_length-dec-1]='.';
  348.   return;
  349. }
  350. void Field_decimal::store(const char *from,uint len)
  351. {
  352.   reg3 int i;
  353.   uint tmp_dec;
  354.   char fyllchar;
  355.   const char *end=from+len;
  356.   struct st_decstr decstr;
  357.   bool error;
  358.   if ((tmp_dec= dec))
  359.     tmp_dec++; // Calculate pos of '.'
  360.   while (from != end && isspace(*from))
  361.     from++;
  362.   if (zerofill)
  363.   {
  364.     fyllchar = '0';
  365.     if (from != end)
  366.       while (*from == '0' && from != end-1) // Skipp prezero
  367. from++;
  368.   }
  369.   else
  370.     fyllchar=' ';
  371.   error=number_dec(&decstr,from,end);
  372.   if (decstr.sign)
  373.   {
  374.     from++;
  375.     if (unsigned_flag) // No sign with zerofill
  376.     {
  377.       if (!error)
  378. current_thd->cuted_fields++;
  379.       Field_decimal::overflow(1);
  380.       return;
  381.     }
  382.   }
  383.   /*
  384.   ** Remove pre-zeros if too big number
  385.   */
  386.   for (i= (int) (decstr.nr_length+decstr.extra -(field_length-tmp_dec)+
  387.  decstr.sign) ;
  388.        i > 0 ;
  389.        i--)
  390.   {
  391.     if (*from == '0')
  392.     {
  393.       from++;
  394.       decstr.nr_length--;
  395.       continue;
  396.     }
  397.     if (decstr.sign && decstr.sign_char == '+' && i == 1)
  398.     { // Remove pre '+'
  399.       decstr.sign=0;
  400.       break;
  401.     }
  402.     current_thd->cuted_fields++;
  403.     // too big number, change to max or min number
  404.     Field_decimal::overflow(decstr.sign && decstr.sign_char == '-');
  405.     return;
  406.   }
  407.   char *to=ptr;
  408.   for (i=(int) (field_length-tmp_dec-decstr.nr_length-decstr.extra - decstr.sign) ;
  409.        i-- > 0 ;)
  410.     *to++ = fyllchar;
  411.   if (decstr.sign)
  412.     *to++= decstr.sign_char;
  413.   if (decstr.extra)
  414.     *to++ = '0';
  415.   for (i=(int) decstr.nr_length ; i-- > 0 ; )
  416.     *to++ = *from++;
  417.   if (tmp_dec--)
  418.   {
  419.     *to++ ='.';
  420.     if (decstr.nr_dec) from++; // Skipp '.'
  421.     for (i=(int) min(decstr.nr_dec,tmp_dec) ; i-- > 0 ; ) *to++ = *from++;
  422.     for (i=(int) (tmp_dec-min(decstr.nr_dec,tmp_dec)) ; i-- > 0 ; ) *to++ = '0';
  423.   }
  424.   /*
  425.   ** Check for incorrect string if in batch mode (ALTER TABLE/LOAD DATA...)
  426.   */
  427.   if (!error && current_thd->count_cuted_fields && from != end)
  428.   { // Check if number was cuted
  429.     for (; from != end ; from++)
  430.     {
  431.       if (*from != '0')
  432.       {
  433. if (!isspace(*from)) // Space is ok
  434.   current_thd->cuted_fields++;
  435. break;
  436.       }
  437.     }
  438.   }
  439. }
  440. void Field_decimal::store(double nr)
  441. {
  442.   if (unsigned_flag && nr < 0)
  443.   {
  444.     overflow(1);
  445.     current_thd->cuted_fields++;
  446.     return;
  447.   }
  448.   reg4 uint i,length;
  449.   char fyllchar,*to;
  450.   char buff[320];
  451.   fyllchar = zerofill ? (char) '0' : (char) ' ';
  452. #ifdef HAVE_SNPRINTF_
  453.   buff[sizeof(buff)-1]=0; // Safety
  454.   snprintf(buff,sizeof(buff)-1, "%.*f",(int) dec,nr);
  455. #else
  456.   sprintf(buff,"%.*f",dec,nr);
  457. #endif
  458.   length=(uint) strlen(buff);
  459.   if (length > field_length)
  460.   {
  461.     overflow(nr < 0.0);
  462.     current_thd->cuted_fields++;
  463.   }
  464.   else
  465.   {
  466.     to=ptr;
  467.     for (i=field_length-length ; i-- > 0 ;)
  468.       *to++ = fyllchar;
  469.     memcpy(to,buff,length);
  470.   }
  471. }
  472. void Field_decimal::store(longlong nr)
  473. {
  474.   if (unsigned_flag && nr < 0)
  475.   {
  476.     overflow(1);
  477.     current_thd->cuted_fields++;
  478.     return;
  479.   }
  480.   char buff[22];
  481.   uint length=(uint) (longlong10_to_str(nr,buff,-10)-buff);
  482.   uint int_part=field_length- (dec  ? dec+1 : 0);
  483.   if (length > int_part)
  484.   {
  485.     overflow(test(nr < 0L)); /* purecov: inspected */
  486.     current_thd->cuted_fields++; /* purecov: inspected */
  487.   }
  488.   else
  489.   {
  490.     char fyllchar = zerofill ? (char) '0' : (char) ' ';
  491.     char *to=ptr;
  492.     for (uint i=int_part-length ; i-- > 0 ;)
  493.       *to++ = fyllchar;
  494.     memcpy(to,buff,length);
  495.     if (dec)
  496.     {
  497.       to[length]='.';
  498.       bfill(to+length+1,dec,'0');
  499.     }
  500.   }
  501. }
  502. double Field_decimal::val_real(void)
  503. {
  504.   char temp= *(ptr+field_length); *(ptr+field_length) = '';
  505.   double nr=atod(ptr);
  506.   *(ptr+field_length)=temp;
  507.   return(nr);
  508. }
  509. longlong Field_decimal::val_int(void)
  510. {
  511.   char temp= *(ptr+field_length); *(ptr+field_length) = '';
  512.   longlong nr;
  513.   if (unsigned_flag)
  514.     nr=(longlong) strtoull(ptr,NULL,10);
  515.   else
  516.     nr=strtoll(ptr,NULL,10);
  517.   *(ptr+field_length)=temp;
  518.   return(nr);
  519. }
  520. String *Field_decimal::val_str(String *val_buffer __attribute__((unused)),
  521.        String *val_ptr)
  522. {
  523.   char *str;
  524.   for (str=ptr ; *str == ' ' ; str++) ;
  525.   uint tmp_length=(uint) (str-ptr);
  526.   if (field_length < tmp_length) // Error in data
  527.     val_ptr->length(0);
  528.   else
  529.     val_ptr->set((const char*) str,field_length-tmp_length);
  530.   return val_ptr;
  531. }
  532. /*
  533. ** Should be able to handle at least the following fixed decimal formats:
  534. ** 5.00 , -1.0,  05,  -05, +5 with optional pre/end space
  535. */
  536. int Field_decimal::cmp(const char *a_ptr,const char *b_ptr)
  537. {
  538.   const char *end;
  539.   int swap=0;
  540.   /* First remove prefixes '0', ' ', and '-' */
  541.   for (end=a_ptr+field_length;
  542.        a_ptr != end &&
  543.  (*a_ptr == *b_ptr ||
  544.   ((isspace(*a_ptr)  || *a_ptr == '+' || *a_ptr == '0') &&
  545.    (isspace(*b_ptr) || *b_ptr == '+' || *b_ptr == '0')));
  546.        a_ptr++,b_ptr++)
  547.   {
  548.     if (*a_ptr == '-') // If both numbers are negative
  549.       swap= -1 ^ 1; // Swap result      
  550.   }
  551.   if (a_ptr == end)
  552.     return 0;
  553.   if (*a_ptr == '-')
  554.     return -1;
  555.   else if (*b_ptr == '-')
  556.     return 1;
  557.   while (a_ptr != end)
  558.   {
  559.     if (*a_ptr++ != *b_ptr++)
  560.       return swap ^ (a_ptr[-1] < b_ptr[-1] ? -1 : 1); // compare digits
  561.   }
  562.   return 0;
  563. }
  564. void Field_decimal::sort_string(char *to,uint length)
  565. {
  566.   char *str,*end;
  567.   for (str=ptr,end=ptr+length;
  568.        str != end &&
  569.  ((isspace(*str) || *str == '+' || *str == '0')) ;
  570.        str++)
  571.     *to++=' ';
  572.   if (str == end)
  573.     return; /* purecov: inspected */
  574.   if (*str == '-')
  575.   {
  576.     *to++=1; // Smaller than any number
  577.     str++;
  578.     while (str != end)
  579.       if (isdigit(*str))
  580. *to++= (char) ('9' - *str++);
  581.       else
  582. *to++= *str++;
  583.   }
  584.   else memcpy(to,str,(uint) (end-str));
  585. }
  586. void Field_decimal::sql_type(String &res) const
  587. {
  588.   uint tmp=field_length;
  589.   if (!unsigned_flag)
  590.     tmp--;
  591.   if (dec)
  592.     tmp--;
  593.   sprintf((char*) res.ptr(),"decimal(%d,%d)",tmp,dec);
  594.   add_zerofill_and_unsigned(res);
  595. }
  596. /****************************************************************************
  597. ** tiny int
  598. ****************************************************************************/
  599. void Field_tiny::store(const char *from,uint len)
  600. {
  601.   String tmp_str(from,len);
  602.   long tmp= strtol(tmp_str.c_ptr(),NULL,10);
  603.   if (unsigned_flag)
  604.   {
  605.     if (tmp < 0)
  606.     {
  607.       tmp=0; /* purecov: inspected */
  608.       current_thd->cuted_fields++; /* purecov: inspected */
  609.     }
  610.     else if (tmp > 255)
  611.     {
  612.       tmp= 255;
  613.       current_thd->cuted_fields++;
  614.     }
  615.     else if (current_thd->count_cuted_fields && !test_if_int(from,len))
  616.       current_thd->cuted_fields++;
  617.   }
  618.   else
  619.   {
  620.     if (tmp < -128)
  621.     {
  622.       tmp= -128;
  623.       current_thd->cuted_fields++;
  624.     }
  625.     else if (tmp >= 128)
  626.     {
  627.       tmp= 127;
  628.       current_thd->cuted_fields++;
  629.     }
  630.     else if (current_thd->count_cuted_fields && !test_if_int(from,len))
  631.       current_thd->cuted_fields++;
  632.   }
  633.   ptr[0]= (char) tmp;
  634. }
  635. void Field_tiny::store(double nr)
  636. {
  637.   nr=rint(nr);
  638.   if (unsigned_flag)
  639.   {
  640.     if (nr < 0.0)
  641.     {
  642.       *ptr=0;
  643.       current_thd->cuted_fields++;
  644.     }
  645.     else if (nr > 255.0)
  646.     {
  647.       *ptr=(char) 255;
  648.       current_thd->cuted_fields++;
  649.     }
  650.     else
  651.       *ptr=(char) nr;
  652.   }
  653.   else
  654.   {
  655.     if (nr < -128.0)
  656.     {
  657.       *ptr= (char) -128;
  658.       current_thd->cuted_fields++;
  659.     }
  660.     else if (nr > 127.0)
  661.     {
  662.       *ptr=127;
  663.       current_thd->cuted_fields++;
  664.     }
  665.     else
  666.       *ptr=(char) nr;
  667.   }
  668. }
  669. void Field_tiny::store(longlong nr)
  670. {
  671.   if (unsigned_flag)
  672.   {
  673.     if (nr < 0L)
  674.     {
  675.       *ptr=0;
  676.       current_thd->cuted_fields++;
  677.     }
  678.     else if (nr > 255L)
  679.     {
  680.       *ptr= (char) 255;
  681.       current_thd->cuted_fields++;
  682.     }
  683.     else
  684.       *ptr=(char) nr;
  685.   }
  686.   else
  687.   {
  688.     if (nr < -128L)
  689.     {
  690.       *ptr= (char) -128;
  691.       current_thd->cuted_fields++;
  692.     }
  693.     else if (nr > 127L)
  694.     {
  695.       *ptr=127;
  696.       current_thd->cuted_fields++;
  697.     }
  698.     else
  699.       *ptr=(char) nr;
  700.   }
  701. }
  702. double Field_tiny::val_real(void)
  703. {
  704.   int tmp= unsigned_flag ? (int) ((uchar*) ptr)[0] :
  705.     (int) ((signed char*) ptr)[0];
  706.   return (double) tmp;
  707. }
  708. longlong Field_tiny::val_int(void)
  709. {
  710.   int tmp= unsigned_flag ? (int) ((uchar*) ptr)[0] :
  711.     (int) ((signed char*) ptr)[0];
  712.   return (longlong) tmp;
  713. }
  714. String *Field_tiny::val_str(String *val_buffer,
  715.     String *val_ptr __attribute__((unused)))
  716. {
  717.   uint length;
  718.   val_buffer->alloc(max(field_length+1,5));
  719.   char *to=(char*) val_buffer->ptr();
  720.   if (unsigned_flag)
  721.     length= (uint) (int10_to_str((long) *((uchar*) ptr),to,10)-to);
  722.   else
  723.     length= (uint) (int10_to_str((long) *((signed char*) ptr),to,-10)-to);
  724.   val_buffer->length(length);
  725.   if (zerofill)
  726.     prepend_zeros(val_buffer);
  727.   return val_buffer;
  728. }
  729. int Field_tiny::cmp(const char *a_ptr, const char *b_ptr)
  730. {
  731.   signed char a,b;
  732.   a=(signed char) a_ptr[0]; b= (signed char) b_ptr[0];
  733.   if (unsigned_flag)
  734.     return ((uchar) a < (uchar) b) ? -1 : ((uchar) a > (uchar) b) ? 1 : 0;
  735.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  736. }
  737. void Field_tiny::sort_string(char *to,uint length __attribute__((unused)))
  738. {
  739.   if (unsigned_flag)
  740.     *to= *ptr;
  741.   else
  742.     to[0] = (char) ((uchar) ptr[0] ^ (uchar) 128); /* Revers signbit */
  743. }
  744. void Field_tiny::sql_type(String &res) const
  745. {
  746.   sprintf((char*) res.ptr(),"tinyint(%d)",(int) field_length);
  747.   add_zerofill_and_unsigned(res);
  748. }
  749. /****************************************************************************
  750. ** short int
  751. ****************************************************************************/
  752. // Note:  Sometimes this should be fixed to use one strtol() to use
  753. // len and check for garbage after number.
  754. void Field_short::store(const char *from,uint len)
  755. {
  756.   String tmp_str(from,len);
  757.   long tmp= strtol(tmp_str.c_ptr(),NULL,10);
  758.   if (unsigned_flag)
  759.   {
  760.     if (tmp < 0)
  761.     {
  762.       tmp=0;
  763.       current_thd->cuted_fields++;
  764.     }
  765.     else if (tmp > (uint16) ~0)
  766.     {
  767.       tmp=(uint16) ~0;
  768.       current_thd->cuted_fields++;
  769.     }
  770.     else if (current_thd->count_cuted_fields && !test_if_int(from,len))
  771.       current_thd->cuted_fields++;
  772.   }
  773.   else
  774.   {
  775.     if (tmp < INT_MIN16)
  776.     {
  777.       tmp= INT_MIN16;
  778.       current_thd->cuted_fields++;
  779.     }
  780.     else if (tmp > INT_MAX16)
  781.     {
  782.       tmp=INT_MAX16;
  783.       current_thd->cuted_fields++;
  784.     }
  785.     else if (current_thd->count_cuted_fields && !test_if_int(from,len))
  786.       current_thd->cuted_fields++;
  787.   }
  788. #ifdef WORDS_BIGENDIAN
  789.   if (table->db_low_byte_first)
  790.   {
  791.     int2store(ptr,tmp);
  792.   }
  793.   else
  794. #endif
  795.     shortstore(ptr,(short) tmp);
  796. }
  797. void Field_short::store(double nr)
  798. {
  799.   int16 res;
  800.   nr=rint(nr);
  801.   if (unsigned_flag)
  802.   {
  803.     if (nr < 0)
  804.     {
  805.       res=0;
  806.       current_thd->cuted_fields++;
  807.     }
  808.     else if (nr > (double) (uint16) ~0)
  809.     {
  810.       res=(int16) (uint16) ~0;
  811.       current_thd->cuted_fields++;
  812.     }
  813.     else
  814.       res=(int16) (uint16) nr;
  815.   }
  816.   else
  817.   {
  818.     if (nr < (double) INT_MIN16)
  819.     {
  820.       res=INT_MIN16;
  821.       current_thd->cuted_fields++;
  822.     }
  823.     else if (nr > (double) INT_MAX16)
  824.     {
  825.       res=INT_MAX16;
  826.       current_thd->cuted_fields++;
  827.     }
  828.     else
  829.       res=(int16) nr;
  830.   }
  831. #ifdef WORDS_BIGENDIAN
  832.   if (table->db_low_byte_first)
  833.   {
  834.     int2store(ptr,res);
  835.   }
  836.   else
  837. #endif
  838.     shortstore(ptr,res);
  839. }
  840. void Field_short::store(longlong nr)
  841. {
  842.   int16 res;
  843.   if (unsigned_flag)
  844.   {
  845.     if (nr < 0L)
  846.     {
  847.       res=0;
  848.       current_thd->cuted_fields++;
  849.     }
  850.     else if (nr > (longlong) (uint16) ~0)
  851.     {
  852.       res=(int16) (uint16) ~0;
  853.       current_thd->cuted_fields++;
  854.     }
  855.     else
  856.       res=(int16) (uint16) nr;
  857.   }
  858.   else
  859.   {
  860.     if (nr < INT_MIN16)
  861.     {
  862.       res=INT_MIN16;
  863.       current_thd->cuted_fields++;
  864.     }
  865.     else if (nr > INT_MAX16)
  866.     {
  867.       res=INT_MAX16;
  868.       current_thd->cuted_fields++;
  869.     }
  870.     else
  871.       res=(int16) nr;
  872.   }
  873. #ifdef WORDS_BIGENDIAN
  874.   if (table->db_low_byte_first)
  875.   {
  876.     int2store(ptr,res);
  877.   }
  878.   else
  879. #endif
  880.     shortstore(ptr,res);
  881. }
  882. double Field_short::val_real(void)
  883. {
  884.   short j;
  885. #ifdef WORDS_BIGENDIAN
  886.   if (table->db_low_byte_first)
  887.     j=sint2korr(ptr);
  888.   else
  889. #endif
  890.     shortget(j,ptr);
  891.   return unsigned_flag ? (double) (unsigned short) j : (double) j;
  892. }
  893. longlong Field_short::val_int(void)
  894. {
  895.   short j;
  896. #ifdef WORDS_BIGENDIAN
  897.   if (table->db_low_byte_first)
  898.     j=sint2korr(ptr);
  899.   else
  900. #endif
  901.     shortget(j,ptr);
  902.   return unsigned_flag ? (longlong) (unsigned short) j : (longlong) j;
  903. }
  904. String *Field_short::val_str(String *val_buffer,
  905.      String *val_ptr __attribute__((unused)))
  906. {
  907.   uint length;
  908.   val_buffer->alloc(max(field_length+1,7));
  909.   char *to=(char*) val_buffer->ptr();
  910.   short j;
  911. #ifdef WORDS_BIGENDIAN
  912.   if (table->db_low_byte_first)
  913.     j=sint2korr(ptr);
  914.   else
  915. #endif
  916.     shortget(j,ptr);
  917.   if (unsigned_flag)
  918.     length=(uint) (int10_to_str((long) (uint16) j,to,10)-to);
  919.   else
  920.     length=(uint) (int10_to_str((long) j,to,-10)-to);
  921.   val_buffer->length(length);
  922.   if (zerofill)
  923.     prepend_zeros(val_buffer);
  924.   return val_buffer;
  925. }
  926. int Field_short::cmp(const char *a_ptr, const char *b_ptr)
  927. {
  928.   short a,b;
  929. #ifdef WORDS_BIGENDIAN
  930.   if (table->db_low_byte_first)
  931.   {
  932.     a=sint2korr(a_ptr);
  933.     b=sint2korr(b_ptr);
  934.   }
  935.   else
  936. #endif
  937.   {
  938.     shortget(a,a_ptr);
  939.     shortget(b,b_ptr);
  940.   }
  941.   if (unsigned_flag)
  942.     return ((unsigned short) a < (unsigned short) b) ? -1 :
  943.     ((unsigned short) a > (unsigned short) b) ? 1 : 0;
  944.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  945. }
  946. void Field_short::sort_string(char *to,uint length __attribute__((unused)))
  947. {
  948. #ifdef WORDS_BIGENDIAN
  949.   if (!table->db_low_byte_first)
  950.   {
  951.     if (unsigned_flag)
  952.       to[0] = ptr[0];
  953.     else
  954.       to[0] = ptr[0] ^ 128; /* Revers signbit */
  955.     to[1]   = ptr[1];
  956.   }
  957.   else
  958. #endif
  959.   {
  960.     if (unsigned_flag)
  961.       to[0] = ptr[1];
  962.     else
  963.       to[0] = ptr[1] ^ 128; /* Revers signbit */
  964.     to[1]   = ptr[0];
  965.   }
  966. }
  967. void Field_short::sql_type(String &res) const
  968. {
  969.   sprintf((char*) res.ptr(),"smallint(%d)",(int) field_length);
  970.   add_zerofill_and_unsigned(res);
  971. }
  972. /****************************************************************************
  973. ** medium int
  974. ****************************************************************************/
  975. // Note:  Sometimes this should be fixed to use one strtol() to use
  976. // len and check for garbage after number.
  977. void Field_medium::store(const char *from,uint len)
  978. {
  979.   String tmp_str(from,len);
  980.   long tmp= strtol(tmp_str.c_ptr(),NULL,10);
  981.   if (unsigned_flag)
  982.   {
  983.     if (tmp < 0)
  984.     {
  985.       tmp=0;
  986.       current_thd->cuted_fields++;
  987.     }
  988.     else if (tmp >= (long) (1L << 24))
  989.     {
  990.       tmp=(long) (1L << 24)-1L;
  991.       current_thd->cuted_fields++;
  992.     }
  993.     else if (current_thd->count_cuted_fields && !test_if_int(from,len))
  994.       current_thd->cuted_fields++;
  995.   }
  996.   else
  997.   {
  998.     if (tmp < INT_MIN24)
  999.     {
  1000.       tmp= INT_MIN24;
  1001.       current_thd->cuted_fields++;
  1002.     }
  1003.     else if (tmp > INT_MAX24)
  1004.     {
  1005.       tmp=INT_MAX24;
  1006.       current_thd->cuted_fields++;
  1007.     }
  1008.     else if (current_thd->count_cuted_fields && !test_if_int(from,len))
  1009.       current_thd->cuted_fields++;
  1010.   }
  1011.   int3store(ptr,tmp);
  1012. }
  1013. void Field_medium::store(double nr)
  1014. {
  1015.   nr=rint(nr);
  1016.   if (unsigned_flag)
  1017.   {
  1018.     if (nr < 0)
  1019.     {
  1020.       int3store(ptr,0);
  1021.       current_thd->cuted_fields++;
  1022.     }
  1023.     else if (nr >= (double) (long) (1L << 24))
  1024.     {
  1025.       ulong tmp=(ulong) (1L << 24)-1L;
  1026.       int3store(ptr,tmp);
  1027.       current_thd->cuted_fields++;
  1028.     }
  1029.     else
  1030.       int3store(ptr,(ulong) nr);
  1031.   }
  1032.   else
  1033.   {
  1034.     if (nr < (double) INT_MIN24)
  1035.     {
  1036.       long tmp=(long) INT_MIN24;
  1037.       int3store(ptr,tmp);
  1038.       current_thd->cuted_fields++;
  1039.     }
  1040.     else if (nr > (double) INT_MAX24)
  1041.     {
  1042.       long tmp=(long) INT_MAX24;
  1043.       int3store(ptr,tmp);
  1044.       current_thd->cuted_fields++;
  1045.     }
  1046.     else
  1047.       int3store(ptr,(long) nr);
  1048.   }
  1049. }
  1050. void Field_medium::store(longlong nr)
  1051. {
  1052.   if (unsigned_flag)
  1053.   {
  1054.     if (nr < 0L)
  1055.     {
  1056.       int3store(ptr,0);
  1057.       current_thd->cuted_fields++;
  1058.     }
  1059.     else if (nr >= (longlong) (long) (1L << 24))
  1060.     {
  1061.       long tmp=(long) (1L << 24)-1L;;
  1062.       int3store(ptr,tmp);
  1063.       current_thd->cuted_fields++;
  1064.     }
  1065.     else
  1066.       int3store(ptr,(ulong) nr);
  1067.   }
  1068.   else
  1069.   {
  1070.     if (nr < (longlong) INT_MIN24)
  1071.     {
  1072.       long tmp=(long) INT_MIN24;
  1073.       int3store(ptr,tmp);
  1074.       current_thd->cuted_fields++;
  1075.     }
  1076.     else if (nr > (longlong) INT_MAX24)
  1077.     {
  1078.       long tmp=(long) INT_MAX24;
  1079.       int3store(ptr,tmp);
  1080.       current_thd->cuted_fields++;
  1081.     }
  1082.     else
  1083.       int3store(ptr,(long) nr);
  1084.   }
  1085. }
  1086. double Field_medium::val_real(void)
  1087. {
  1088.   long j= unsigned_flag ? (long) uint3korr(ptr) : sint3korr(ptr);
  1089.   return (double) j;
  1090. }
  1091. longlong Field_medium::val_int(void)
  1092. {
  1093.   long j= unsigned_flag ? (long) uint3korr(ptr) : sint3korr(ptr);
  1094.   return (longlong) j;
  1095. }
  1096. String *Field_medium::val_str(String *val_buffer,
  1097.       String *val_ptr __attribute__((unused)))
  1098. {
  1099.   uint length;
  1100.   val_buffer->alloc(max(field_length+1,10));
  1101.   char *to=(char*) val_buffer->ptr();
  1102.   long j= unsigned_flag ? (long) uint3korr(ptr) : sint3korr(ptr);
  1103.   length=(uint) (int10_to_str(j,to,-10)-to);
  1104.   val_buffer->length(length);
  1105.   if (zerofill)
  1106.     prepend_zeros(val_buffer); /* purecov: inspected */
  1107.   return val_buffer;
  1108. }
  1109. int Field_medium::cmp(const char *a_ptr, const char *b_ptr)
  1110. {
  1111.   long a,b;
  1112.   if (unsigned_flag)
  1113.   {
  1114.     a=uint3korr(a_ptr);
  1115.     b=uint3korr(b_ptr);
  1116.   }
  1117.   else
  1118.   {
  1119.     a=sint3korr(a_ptr);
  1120.     b=sint3korr(b_ptr);
  1121.   }
  1122.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  1123. }
  1124. void Field_medium::sort_string(char *to,uint length __attribute__((unused)))
  1125. {
  1126.   if (unsigned_flag)
  1127.     to[0] = ptr[2];
  1128.   else
  1129.     to[0] = (uchar) (ptr[2] ^ 128); /* Revers signbit */
  1130.   to[1] = ptr[1];
  1131.   to[2] = ptr[0];
  1132. }
  1133. void Field_medium::sql_type(String &res) const
  1134. {
  1135.   sprintf((char*) res.ptr(),"mediumint(%d)",(int) field_length);
  1136.   add_zerofill_and_unsigned(res);
  1137. }
  1138. /****************************************************************************
  1139. ** long int
  1140. ****************************************************************************/
  1141. // Note:  Sometimes this should be fixed to use one strtol() to use
  1142. // len and check for garbage after number.
  1143. void Field_long::store(const char *from,uint len)
  1144. {
  1145.   while (len && isspace(*from))
  1146.   {
  1147.     len--; from++;
  1148.   }
  1149.   long tmp;
  1150.   String tmp_str(from,len);
  1151.   errno=0;
  1152.   if (unsigned_flag)
  1153.   {
  1154.     if (!len || *from == '-')
  1155.     {
  1156.       tmp=0; // Set negative to 0
  1157.       errno=ERANGE;
  1158.     }
  1159.     else
  1160.       tmp=(long) strtoul(tmp_str.c_ptr(),NULL,10);
  1161.   }
  1162.   else
  1163.     tmp=strtol(tmp_str.c_ptr(),NULL,10);
  1164.   if (errno || current_thd->count_cuted_fields && !test_if_int(from,len))
  1165.     current_thd->cuted_fields++;
  1166. #ifdef WORDS_BIGENDIAN
  1167.   if (table->db_low_byte_first)
  1168.   {
  1169.     int4store(ptr,tmp);
  1170.   }
  1171.   else
  1172. #endif
  1173.     longstore(ptr,tmp);
  1174. }
  1175. void Field_long::store(double nr)
  1176. {
  1177.   int32 res;
  1178.   nr=rint(nr);
  1179.   if (unsigned_flag)
  1180.   {
  1181.     if (nr < 0)
  1182.     {
  1183.       res=0;
  1184.       current_thd->cuted_fields++;
  1185.     }
  1186.     else if (nr > (double) (ulong) ~0L)
  1187.     {
  1188.       res=(int32) (uint32) ~0L;
  1189.       current_thd->cuted_fields++;
  1190.     }
  1191.     else
  1192.       res=(int32) (ulong) nr;
  1193.   }
  1194.   else
  1195.   {
  1196.     if (nr < (double) INT_MIN32)
  1197.     {
  1198.       res=(int32) INT_MIN32;
  1199.       current_thd->cuted_fields++;
  1200.     }
  1201.     else if (nr > (double) INT_MAX32)
  1202.     {
  1203.       res=(int32) INT_MAX32;
  1204.       current_thd->cuted_fields++;
  1205.     }
  1206.     else
  1207.       res=(int32) nr;
  1208.   }
  1209. #ifdef WORDS_BIGENDIAN
  1210.   if (table->db_low_byte_first)
  1211.   {
  1212.     int4store(ptr,res);
  1213.   }
  1214.   else
  1215. #endif
  1216.     longstore(ptr,res);
  1217. }
  1218. void Field_long::store(longlong nr)
  1219. {
  1220.   int32 res;
  1221.   if (unsigned_flag)
  1222.   {
  1223.     if (nr < 0)
  1224.     {
  1225.       res=0;
  1226.       current_thd->cuted_fields++;
  1227.     }
  1228.     else if (nr >= (LL(1) << 32))
  1229.     {
  1230.       res=(int32) (uint32) ~0L;
  1231.       current_thd->cuted_fields++;
  1232.     }
  1233.     else
  1234.       res=(int32) (uint32) nr;
  1235.   }
  1236.   else
  1237.   {
  1238.     if (nr < (longlong) INT_MIN32)
  1239.     {
  1240.       res=(int32) INT_MIN32;
  1241.       current_thd->cuted_fields++;
  1242.     }
  1243.     else if (nr > (longlong) INT_MAX32)
  1244.     {
  1245.       res=(int32) INT_MAX32;
  1246.       current_thd->cuted_fields++;
  1247.     }
  1248.     else
  1249.       res=(int32) nr;
  1250.   }
  1251. #ifdef WORDS_BIGENDIAN
  1252.   if (table->db_low_byte_first)
  1253.   {
  1254.     int4store(ptr,res);
  1255.   }
  1256.   else
  1257. #endif
  1258.     longstore(ptr,res);
  1259. }
  1260. double Field_long::val_real(void)
  1261. {
  1262.   int32 j;
  1263. #ifdef WORDS_BIGENDIAN
  1264.   if (table->db_low_byte_first)
  1265.     j=sint4korr(ptr);
  1266.   else
  1267. #endif
  1268.     longget(j,ptr);
  1269.   return unsigned_flag ? (double) (uint32) j : (double) j;
  1270. }
  1271. longlong Field_long::val_int(void)
  1272. {
  1273.   int32 j;
  1274. #ifdef WORDS_BIGENDIAN
  1275.   if (table->db_low_byte_first)
  1276.     j=sint4korr(ptr);
  1277.   else
  1278. #endif
  1279.     longget(j,ptr);
  1280.   return unsigned_flag ? (longlong) (uint32) j : (longlong) j;
  1281. }
  1282. String *Field_long::val_str(String *val_buffer,
  1283.     String *val_ptr __attribute__((unused)))
  1284. {
  1285.   uint length;
  1286.   val_buffer->alloc(max(field_length+1,12));
  1287.   char *to=(char*) val_buffer->ptr();
  1288.   int32 j;
  1289. #ifdef WORDS_BIGENDIAN
  1290.   if (table->db_low_byte_first)
  1291.     j=sint4korr(ptr);
  1292.   else
  1293. #endif
  1294.     longget(j,ptr);
  1295.   length=(uint) (int10_to_str((unsigned_flag ? (long) (uint32) j : (long) j),
  1296.  to,
  1297.  unsigned_flag ? 10 : -10)-to);
  1298.   val_buffer->length(length);
  1299.   if (zerofill)
  1300.     prepend_zeros(val_buffer);
  1301.   return val_buffer;
  1302. }
  1303. int Field_long::cmp(const char *a_ptr, const char *b_ptr)
  1304. {
  1305.   int32 a,b;
  1306. #ifdef WORDS_BIGENDIAN
  1307.   if (table->db_low_byte_first)
  1308.   {
  1309.     a=sint4korr(a_ptr);
  1310.     b=sint4korr(b_ptr);
  1311.   }
  1312.   else
  1313. #endif
  1314.   {
  1315.     longget(a,a_ptr);
  1316.     longget(b,b_ptr);
  1317.   }
  1318.   if (unsigned_flag)
  1319.     return ((ulong) a < (ulong) b) ? -1 : ((ulong) a > (ulong) b) ? 1 : 0;
  1320.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  1321. }
  1322. void Field_long::sort_string(char *to,uint length __attribute__((unused)))
  1323. {
  1324. #ifdef WORDS_BIGENDIAN
  1325.   if (!table->db_low_byte_first)
  1326.   {
  1327.     if (unsigned_flag)
  1328.       to[0] = ptr[0];
  1329.     else
  1330.       to[0] = ptr[0] ^ 128; /* Revers signbit */
  1331.     to[1]   = ptr[1];
  1332.     to[2]   = ptr[2];
  1333.     to[3]   = ptr[3];
  1334.   }
  1335.   else
  1336. #endif
  1337.   {
  1338.     if (unsigned_flag)
  1339.       to[0] = ptr[3];
  1340.     else
  1341.       to[0] = ptr[3] ^ 128; /* Revers signbit */
  1342.     to[1]   = ptr[2];
  1343.     to[2]   = ptr[1];
  1344.     to[3]   = ptr[0];
  1345.   }
  1346. }
  1347. void Field_long::sql_type(String &res) const
  1348. {
  1349.   sprintf((char*) res.ptr(),"int(%d)",(int) field_length);
  1350.   add_zerofill_and_unsigned(res);
  1351. }
  1352. /****************************************************************************
  1353. ** longlong int
  1354. ****************************************************************************/
  1355. void Field_longlong::store(const char *from,uint len)
  1356. {
  1357.   while (len && isspace(*from))
  1358.   { // For easy error check
  1359.     len--; from++;
  1360.   }
  1361.   longlong tmp;
  1362.   String tmp_str(from,len);
  1363.   errno=0;
  1364.   if (unsigned_flag)
  1365.   {
  1366.     if (!len || *from == '-')
  1367.     {
  1368.       tmp=0; // Set negative to 0
  1369.       errno=ERANGE;
  1370.     }
  1371.     else
  1372.       tmp=(longlong) strtoull(tmp_str.c_ptr(),NULL,10);
  1373.   }
  1374.   else
  1375.     tmp=strtoll(tmp_str.c_ptr(),NULL,10);
  1376.   if (errno || current_thd->count_cuted_fields && !test_if_int(from,len))
  1377.     current_thd->cuted_fields++;
  1378. #ifdef WORDS_BIGENDIAN
  1379.   if (table->db_low_byte_first)
  1380.   {
  1381.     int8store(ptr,tmp);
  1382.   }
  1383.   else
  1384. #endif
  1385.     longlongstore(ptr,tmp);
  1386. }
  1387. void Field_longlong::store(double nr)
  1388. {
  1389.   longlong res;
  1390.   nr=rint(nr);
  1391.   if (unsigned_flag)
  1392.   {
  1393.     if (nr < 0)
  1394.     {
  1395.       res=0;
  1396.       current_thd->cuted_fields++;
  1397.     }
  1398.     else if (nr >= (double) ~ (ulonglong) 0)
  1399.     {
  1400.       res= ~(longlong) 0;
  1401.       current_thd->cuted_fields++;
  1402.     }
  1403.     else
  1404.       res=(longlong) (ulonglong) nr;
  1405.   }
  1406.   else
  1407.   {
  1408.     if (nr <= (double) LONGLONG_MIN)
  1409.     {
  1410.       res=(longlong) LONGLONG_MIN;
  1411.       current_thd->cuted_fields++;
  1412.     }
  1413.     else if (nr >= (double) LONGLONG_MAX)
  1414.     {
  1415.       res=(longlong) LONGLONG_MAX;
  1416.       current_thd->cuted_fields++;
  1417.     }
  1418.     else
  1419.       res=(longlong) nr;
  1420.   }
  1421. #ifdef WORDS_BIGENDIAN
  1422.   if (table->db_low_byte_first)
  1423.   {
  1424.     int8store(ptr,res);
  1425.   }
  1426.   else
  1427. #endif
  1428.     longlongstore(ptr,res);
  1429. }
  1430. void Field_longlong::store(longlong nr)
  1431. {
  1432. #ifdef WORDS_BIGENDIAN
  1433.   if (table->db_low_byte_first)
  1434.   {
  1435.     int8store(ptr,nr);
  1436.   }
  1437.   else
  1438. #endif
  1439.     longlongstore(ptr,nr);
  1440. }
  1441. double Field_longlong::val_real(void)
  1442. {
  1443.   longlong j;
  1444. #ifdef WORDS_BIGENDIAN
  1445.   if (table->db_low_byte_first)
  1446.   {
  1447.     j=sint8korr(ptr);
  1448.   }
  1449.   else
  1450. #endif
  1451.     longlongget(j,ptr);
  1452.   return unsigned_flag ? ulonglong2double(j) : (double) j;
  1453. }
  1454. longlong Field_longlong::val_int(void)
  1455. {
  1456.   longlong j;
  1457. #ifdef WORDS_BIGENDIAN
  1458.   if (table->db_low_byte_first)
  1459.     j=sint8korr(ptr);
  1460.   else
  1461. #endif
  1462.     longlongget(j,ptr);
  1463.   return j;
  1464. }
  1465. String *Field_longlong::val_str(String *val_buffer,
  1466. String *val_ptr __attribute__((unused)))
  1467. {
  1468.   uint length;
  1469.   val_buffer->alloc(max(field_length+1,22));
  1470.   char *to=(char*) val_buffer->ptr();
  1471.   longlong j;
  1472. #ifdef WORDS_BIGENDIAN
  1473.   if (table->db_low_byte_first)
  1474.     j=sint8korr(ptr);
  1475.   else
  1476. #endif
  1477.     longlongget(j,ptr);
  1478.   length=(uint) (longlong10_to_str(j,to,unsigned_flag ? 10 : -10)-to);
  1479.   val_buffer->length(length);
  1480.   if (zerofill)
  1481.     prepend_zeros(val_buffer);
  1482.   return val_buffer;
  1483. }
  1484. int Field_longlong::cmp(const char *a_ptr, const char *b_ptr)
  1485. {
  1486.   longlong a,b;
  1487. #ifdef WORDS_BIGENDIAN
  1488.   if (table->db_low_byte_first)
  1489.   {
  1490.     a=sint8korr(a_ptr);
  1491.     b=sint8korr(b_ptr);
  1492.   }
  1493.   else
  1494. #endif
  1495.   {
  1496.     longlongget(a,a_ptr);
  1497.     longlongget(b,b_ptr);
  1498.   }
  1499.   if (unsigned_flag)
  1500.     return ((ulonglong) a < (ulonglong) b) ? -1 :
  1501.     ((ulonglong) a > (ulonglong) b) ? 1 : 0;
  1502.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  1503. }
  1504. void Field_longlong::sort_string(char *to,uint length __attribute__((unused)))
  1505. {
  1506. #ifdef WORDS_BIGENDIAN
  1507.   if (!table->db_low_byte_first)
  1508.   {
  1509.     if (unsigned_flag)
  1510.       to[0] = ptr[0];
  1511.     else
  1512.       to[0] = ptr[0] ^ 128; /* Revers signbit */
  1513.     to[1]   = ptr[1];
  1514.     to[2]   = ptr[2];
  1515.     to[3]   = ptr[3];
  1516.     to[4]   = ptr[4];
  1517.     to[5]   = ptr[5];
  1518.     to[6]   = ptr[6];
  1519.     to[7]   = ptr[7];
  1520.   }
  1521.   else
  1522. #endif
  1523.   {
  1524.     if (unsigned_flag)
  1525.       to[0] = ptr[7];
  1526.     else
  1527.       to[0] = ptr[7] ^ 128; /* Revers signbit */
  1528.     to[1]   = ptr[6];
  1529.     to[2]   = ptr[5];
  1530.     to[3]   = ptr[4];
  1531.     to[4]   = ptr[3];
  1532.     to[5]   = ptr[2];
  1533.     to[6]   = ptr[1];
  1534.     to[7]   = ptr[0];
  1535.   }
  1536. }
  1537. void Field_longlong::sql_type(String &res) const
  1538. {
  1539.   sprintf((char*) res.ptr(),"bigint(%d)",(int) field_length);
  1540.   add_zerofill_and_unsigned(res);
  1541. }
  1542. /****************************************************************************
  1543. ** single precision float
  1544. ****************************************************************************/
  1545. void Field_float::store(const char *from,uint len)
  1546. {
  1547.   String tmp_str(from,len);
  1548.   errno=0;
  1549.   Field_float::store(atof(tmp_str.c_ptr()));
  1550.   if (errno || current_thd->count_cuted_fields && !test_if_real(from,len))
  1551.     current_thd->cuted_fields++;
  1552. }
  1553. void Field_float::store(double nr)
  1554. {
  1555.   float j;
  1556.   if (dec < NOT_FIXED_DEC)
  1557.     nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point
  1558.   if (nr < -FLT_MAX)
  1559.   {
  1560.     j= -FLT_MAX;
  1561.     current_thd->cuted_fields++;
  1562.   }
  1563.   else if (nr > FLT_MAX)
  1564.   {
  1565.     j=FLT_MAX;
  1566.     current_thd->cuted_fields++;
  1567.   }
  1568.   else
  1569.     j= (float) nr;
  1570. #ifdef WORDS_BIGENDIAN
  1571.   if (table->db_low_byte_first)
  1572.   {
  1573.     float4store(ptr,j);
  1574.   }
  1575.   else
  1576. #endif
  1577.     memcpy_fixed(ptr,(byte*) &j,sizeof(j));
  1578. }
  1579. void Field_float::store(longlong nr)
  1580. {
  1581.   float j= (float) nr;
  1582. #ifdef WORDS_BIGENDIAN
  1583.   if (table->db_low_byte_first)
  1584.   {
  1585.     float4store(ptr,j);
  1586.   }
  1587.   else
  1588. #endif
  1589.     memcpy_fixed(ptr,(byte*) &j,sizeof(j));
  1590. }
  1591. double Field_float::val_real(void)
  1592. {
  1593.   float j;
  1594. #ifdef WORDS_BIGENDIAN
  1595.   if (table->db_low_byte_first)
  1596.   {
  1597.     float4get(j,ptr);
  1598.   }
  1599.   else
  1600. #endif
  1601.     memcpy_fixed((byte*) &j,ptr,sizeof(j));
  1602.   return ((double) j);
  1603. }
  1604. longlong Field_float::val_int(void)
  1605. {
  1606.   float j;
  1607. #ifdef WORDS_BIGENDIAN
  1608.   if (table->db_low_byte_first)
  1609.   {
  1610.     float4get(j,ptr);
  1611.   }
  1612.   else
  1613. #endif
  1614.     memcpy_fixed((byte*) &j,ptr,sizeof(j));
  1615.   return ((longlong) j);
  1616. }
  1617. String *Field_float::val_str(String *val_buffer,
  1618.      String *val_ptr __attribute__((unused)))
  1619. {
  1620.   float nr;
  1621. #ifdef WORDS_BIGENDIAN
  1622.   if (table->db_low_byte_first)
  1623.   {
  1624.     float4get(nr,ptr);
  1625.   }
  1626.   else
  1627. #endif
  1628.     memcpy_fixed((byte*) &nr,ptr,sizeof(nr));
  1629.   val_buffer->alloc(max(field_length,70));
  1630.   char *to=(char*) val_buffer->ptr();
  1631.   if (dec >= NOT_FIXED_DEC)
  1632.   {
  1633.     sprintf(to,"%-*.*g",(int) field_length,FLT_DIG,nr);
  1634.     to=strcend(to,' ');
  1635.     *to=0;
  1636.   }
  1637.   else
  1638.   {
  1639. #ifdef HAVE_FCONVERT
  1640.     char buff[70],*pos=buff;
  1641.     int decpt,sign,tmp_dec=dec;
  1642.     VOID(sfconvert(&nr,tmp_dec,&decpt,&sign,buff));
  1643.     if (sign)
  1644.     {
  1645.       *to++='-';
  1646.     }
  1647.     if (decpt < 0)
  1648.     { /* val_buffer is < 0 */
  1649.       *to++='0';
  1650.       if (!tmp_dec)
  1651. goto end;
  1652.       *to++='.';
  1653.       if (-decpt > tmp_dec)
  1654. decpt= - (int) tmp_dec;
  1655.       tmp_dec=(uint) ((int) tmp_dec+decpt);
  1656.       while (decpt++ < 0)
  1657. *to++='0';
  1658.     }
  1659.     else if (decpt == 0)
  1660.     {
  1661.       *to++= '0';
  1662.       if (!tmp_dec)
  1663. goto end;
  1664.       *to++='.';
  1665.     }
  1666.     else
  1667.     {
  1668.       while (decpt-- > 0)
  1669. *to++= *pos++;
  1670.       if (!tmp_dec)
  1671. goto end;
  1672.       *to++='.';
  1673.     }
  1674.     while (tmp_dec--)
  1675.       *to++= *pos++;
  1676. #else
  1677. #ifdef HAVE_SNPRINTF_
  1678.     sprintf(to,val_buffer->length(),"%.*f",dec,nr);
  1679. #else
  1680.     sprintf(to,"%.*f",dec,nr);
  1681. #endif
  1682.     to=strend(to);
  1683. #endif
  1684.   }
  1685. #ifdef HAVE_FCONVERT
  1686.  end:
  1687. #endif
  1688.   val_buffer->length((uint) (to-val_buffer->ptr()));
  1689.   if (zerofill)
  1690.     prepend_zeros(val_buffer);
  1691.   return val_buffer;
  1692. }
  1693. int Field_float::cmp(const char *a_ptr, const char *b_ptr)
  1694. {
  1695.   float a,b;
  1696. #ifdef WORDS_BIGENDIAN
  1697.   if (table->db_low_byte_first)
  1698.   {
  1699.     float4get(a,a_ptr);
  1700.     float4get(b,b_ptr);
  1701.   }
  1702.   else
  1703. #endif
  1704.   {
  1705.     memcpy_fixed(&a,a_ptr,sizeof(float));
  1706.     memcpy_fixed(&b,b_ptr,sizeof(float));
  1707.   }
  1708.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  1709. }
  1710. #define FLT_EXP_DIG (sizeof(float)*8-FLT_MANT_DIG)
  1711. void Field_float::sort_string(char *to,uint length __attribute__((unused)))
  1712. {
  1713.   float nr;
  1714. #ifdef WORDS_BIGENDIAN
  1715.   if (table->db_low_byte_first)
  1716.   {
  1717.     float4get(nr,ptr);
  1718.   }
  1719.   else
  1720. #endif
  1721.     memcpy_fixed(&nr,ptr,sizeof(float));
  1722.   uchar *tmp= (uchar*) to;
  1723.   if (nr == (float) 0.0)
  1724.   { /* Change to zero string */
  1725.     tmp[0]=(uchar) 128;
  1726.     bzero((char*) tmp+1,sizeof(nr)-1);
  1727.   }
  1728.   else
  1729.   {
  1730. #ifdef WORDS_BIGENDIAN
  1731.     memcpy_fixed(tmp,&nr,sizeof(nr));
  1732. #else
  1733.     tmp[0]= ptr[3]; tmp[1]=ptr[2]; tmp[2]= ptr[1]; tmp[3]=ptr[0];
  1734. #endif
  1735.     if (tmp[0] & 128) /* Negative */
  1736.     { /* make complement */
  1737.       uint i;
  1738.       for (i=0 ; i < sizeof(nr); i++)
  1739. tmp[i]=tmp[i] ^ (uchar) 255;
  1740.     }
  1741.     else
  1742.     {
  1743.       ushort exp_part=(((ushort) tmp[0] << 8) | (ushort) tmp[1] |
  1744.        (ushort) 32768);
  1745.       exp_part+= (ushort) 1 << (16-1-FLT_EXP_DIG);
  1746.       tmp[0]= (uchar) (exp_part >> 8);
  1747.       tmp[1]= (uchar) exp_part;
  1748.     }
  1749.   }
  1750. }
  1751. void Field_float::sql_type(String &res) const
  1752. {
  1753.   if (dec == NOT_FIXED_DEC)
  1754.     strmov((char*) res.ptr(),"float");
  1755.   else
  1756.     sprintf((char*) res.ptr(),"float(%d,%d)",(int) field_length,dec);
  1757.   add_zerofill_and_unsigned(res);
  1758. }
  1759. /****************************************************************************
  1760. ** double precision floating point numbers
  1761. ****************************************************************************/
  1762. void Field_double::store(const char *from,uint len)
  1763. {
  1764.   String tmp_str(from,len);
  1765.   errno=0;
  1766.   double j= atof(tmp_str.c_ptr());
  1767.   if (errno || current_thd->count_cuted_fields && !test_if_real(from,len))
  1768.     current_thd->cuted_fields++;
  1769. #ifdef WORDS_BIGENDIAN
  1770.   if (table->db_low_byte_first)
  1771.   {
  1772.     float8store(ptr,j);
  1773.   }
  1774.   else
  1775. #endif
  1776.     doublestore(ptr,j);
  1777. }
  1778. void Field_double::store(double nr)
  1779. {
  1780.   if (dec < NOT_FIXED_DEC)
  1781.     nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point
  1782. #ifdef WORDS_BIGENDIAN
  1783.   if (table->db_low_byte_first)
  1784.   {
  1785.     float8store(ptr,nr);
  1786.   }
  1787.   else
  1788. #endif
  1789.     doublestore(ptr,nr);
  1790. }
  1791. void Field_double::store(longlong nr)
  1792. {
  1793.   double j= (double) nr;
  1794. #ifdef WORDS_BIGENDIAN
  1795.   if (table->db_low_byte_first)
  1796.   {
  1797.     float8store(ptr,j);
  1798.   }
  1799.   else
  1800. #endif
  1801.     doublestore(ptr,j);
  1802. }
  1803. double Field_double::val_real(void)
  1804. {
  1805.   double j;
  1806. #ifdef WORDS_BIGENDIAN
  1807.   if (table->db_low_byte_first)
  1808.   {
  1809.     float8get(j,ptr);
  1810.   }
  1811.   else
  1812. #endif
  1813.     doubleget(j,ptr);
  1814.   return j;
  1815. }
  1816. longlong Field_double::val_int(void)
  1817. {
  1818.   double j;
  1819. #ifdef WORDS_BIGENDIAN
  1820.   if (table->db_low_byte_first)
  1821.   {
  1822.     float8get(j,ptr);
  1823.   }
  1824.   else
  1825. #endif
  1826.     doubleget(j,ptr);
  1827.   return ((longlong) j);
  1828. }
  1829. String *Field_double::val_str(String *val_buffer,
  1830.       String *val_ptr __attribute__((unused)))
  1831. {
  1832.   double nr;
  1833. #ifdef WORDS_BIGENDIAN
  1834.   if (table->db_low_byte_first)
  1835.   {
  1836.     float8get(nr,ptr);
  1837.   }
  1838.   else
  1839. #endif
  1840.     doubleget(nr,ptr);
  1841.   uint to_length=max(field_length,320);
  1842.   val_buffer->alloc(to_length);
  1843.   char *to=(char*) val_buffer->ptr();
  1844.   if (dec >= NOT_FIXED_DEC)
  1845.   {
  1846.     sprintf(to,"%-*.*g",(int) field_length,DBL_DIG,nr);
  1847.     to=strcend(to,' ');
  1848.   }
  1849.   else
  1850.   {
  1851. #ifdef HAVE_FCONVERT
  1852.     char buff[320],*pos=buff;
  1853.     int decpt,sign,tmp_dec=dec;
  1854.     VOID(fconvert(nr,tmp_dec,&decpt,&sign,buff));
  1855.     if (sign)
  1856.     {
  1857.       *to++='-';
  1858.     }
  1859.     if (decpt < 0)
  1860.     { /* val_buffer is < 0 */
  1861.       *to++='0';
  1862.       if (!tmp_dec)
  1863. goto end;
  1864.       *to++='.';
  1865.       if (-decpt > tmp_dec)
  1866. decpt= - (int) tmp_dec;
  1867.       tmp_dec=(uint) ((int) tmp_dec+decpt);
  1868.       while (decpt++ < 0)
  1869. *to++='0';
  1870.     }
  1871.     else if (decpt == 0)
  1872.     {
  1873.       *to++= '0';
  1874.       if (!tmp_dec)
  1875. goto end;
  1876.       *to++='.';
  1877.     }
  1878.     else
  1879.     {
  1880.       while (decpt-- > 0)
  1881. *to++= *pos++;
  1882.       if (!tmp_dec)
  1883. goto end;
  1884.       *to++='.';
  1885.     }
  1886.     while (tmp_dec--)
  1887.       *to++= *pos++;
  1888. #else
  1889. #ifdef HAVE_SNPRINTF
  1890.     to[to_length-1]=0; // Safety
  1891.     snprintf(to,to_length-1,"%.*f",dec,nr);
  1892. #else
  1893.     sprintf(to,"%.*f",dec,nr);
  1894. #endif
  1895.     to=strend(to);
  1896. #endif
  1897.   }
  1898. #ifdef HAVE_FCONVERT
  1899.  end:
  1900. #endif
  1901.   val_buffer->length((uint) (to-val_buffer->ptr()));
  1902.   if (zerofill)
  1903.     prepend_zeros(val_buffer);
  1904.   return val_buffer;
  1905. }
  1906. int Field_double::cmp(const char *a_ptr, const char *b_ptr)
  1907. {
  1908.   double a,b;
  1909. #ifdef WORDS_BIGENDIAN
  1910.   if (table->db_low_byte_first)
  1911.   {
  1912.     float8get(a,a_ptr);
  1913.     float8get(b,b_ptr);
  1914.   }
  1915.   else
  1916. #endif
  1917.   {
  1918. /* could this ALWAYS be 2 calls to doubleget() ?? */
  1919. #if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN)
  1920.     doubleget(a, a_ptr);
  1921.     doubleget(b, b_ptr);
  1922. #else
  1923.     memcpy_fixed(&a,a_ptr,sizeof(double));
  1924.     memcpy_fixed(&b,b_ptr,sizeof(double));
  1925. #endif
  1926.   }
  1927.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  1928. }
  1929. #define DBL_EXP_DIG (sizeof(double)*8-DBL_MANT_DIG)
  1930. /* The following should work for IEEE */
  1931. void Field_double::sort_string(char *to,uint length __attribute__((unused)))
  1932. {
  1933.   double nr;
  1934. #ifdef WORDS_BIGENDIAN
  1935.   if (table->db_low_byte_first)
  1936.   {
  1937.     float8get(nr,ptr);
  1938.   }
  1939.   else
  1940. #endif
  1941. /* could this ALWAYS be 2 calls to doubleget() ?? */
  1942. #if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN)
  1943.     doubleget(nr,ptr);
  1944. #else
  1945.     memcpy_fixed(&nr,ptr,sizeof(nr));
  1946. #endif
  1947.   change_double_for_sort(nr, (byte*) to);
  1948. }
  1949. void Field_double::sql_type(String &res) const
  1950. {
  1951.   if (dec == NOT_FIXED_DEC)
  1952.     strmov((char*) res.ptr(),"double");
  1953.   else
  1954.     sprintf((char*) res.ptr(),"double(%d,%d)",(int) field_length,dec);
  1955.   add_zerofill_and_unsigned(res);
  1956. }
  1957. /****************************************************************************
  1958. ** timestamp
  1959. ** The first timestamp in the table is automaticly updated
  1960. ** by handler.cc.  The form->timestamp points at the automatic timestamp.
  1961. ****************************************************************************/
  1962. Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg,
  1963.  enum utype unireg_check_arg,
  1964.  const char *field_name_arg,
  1965.  struct st_table *table_arg)
  1966.     :Field_num(ptr_arg, len_arg, (uchar*) 0,0,
  1967.        unireg_check_arg, field_name_arg, table_arg,
  1968.        0, 1, 1)
  1969. {
  1970.   if (table && !table->timestamp_field)
  1971.   {
  1972.     table->timestamp_field= this; // Automatic timestamp
  1973.     table->time_stamp=(ulong) (ptr_arg - (char*) table->record[0])+1;
  1974.     flags|=TIMESTAMP_FLAG;
  1975.   }
  1976. }
  1977. void Field_timestamp::store(const char *from,uint len)
  1978. {
  1979.   long tmp=(long) str_to_timestamp(from,len);
  1980. #ifdef WORDS_BIGENDIAN
  1981.   if (table->db_low_byte_first)
  1982.   {
  1983.     int4store(ptr,tmp);
  1984.   }
  1985.   else
  1986. #endif
  1987.     longstore(ptr,tmp);
  1988. }
  1989. void Field_timestamp::fill_and_store(char *from,uint len)
  1990. {
  1991.   uint res_length;
  1992.   if (len <= field_length)
  1993.     res_length=field_length;
  1994.   else if (len <= 12)
  1995.     res_length=12; /* purecov: inspected */
  1996.   else if (len <= 14)
  1997.     res_length=14; /* purecov: inspected */
  1998.   else
  1999.     res_length=(len+1)/2*2; // must be even
  2000.   if (res_length != len)
  2001.   {
  2002.     bmove_upp(from+res_length,from+len,len);
  2003.     bfill(from,res_length-len,'0');
  2004.     len=res_length;
  2005.   }
  2006.   long tmp=(long) str_to_timestamp(from,len);
  2007. #ifdef WORDS_BIGENDIAN
  2008.   if (table->db_low_byte_first)
  2009.   {
  2010.     int4store(ptr,tmp);
  2011.   }
  2012.   else
  2013. #endif
  2014.     longstore(ptr,tmp);
  2015. }
  2016. void Field_timestamp::store(double nr)
  2017. {
  2018.   if (nr < 0 || nr > 99991231235959.0)
  2019.   {
  2020.     nr=0; // Avoid overflow on buff
  2021.     current_thd->cuted_fields++;
  2022.   }
  2023.   Field_timestamp::store((longlong) rint(nr));
  2024. }
  2025. /*
  2026. ** Convert a datetime of formats YYMMDD, YYYYMMDD or YYMMDDHHMSS to
  2027. ** YYYYMMDDHHMMSS.  The high date '99991231235959' is checked before this
  2028. ** function.
  2029. */
  2030. static longlong fix_datetime(longlong nr)
  2031. {
  2032.   if (nr == LL(0) || nr >= LL(10000101000000))
  2033.     return nr; // Normal datetime >= Year 1000
  2034.   if (nr < 101)
  2035.     goto err;
  2036.   if (nr <= (YY_PART_YEAR-1)*10000L+1231L)
  2037.     return (nr+20000000L)*1000000L; // YYMMDD, year: 2000-2069
  2038.   if (nr < (YY_PART_YEAR)*10000L+101L)
  2039.     goto err;
  2040.   if (nr <= 991231L)
  2041.     return (nr+19000000L)*1000000L; // YYMMDD, year: 1970-1999
  2042.   if (nr < 10000101L)
  2043.     goto err;
  2044.   if (nr <= 99991231L)
  2045.     return nr*1000000L;
  2046.   if (nr < 101000000L)
  2047.     goto err;
  2048.   if (nr <= (YY_PART_YEAR-1)*LL(10000000000)+LL(1231235959))
  2049.     return nr+LL(20000000000000); // YYMMDDHHMMSS, 2000-2069
  2050.   if (nr <  YY_PART_YEAR*LL(10000000000)+ LL(101000000))
  2051.     goto err;
  2052.   if (nr <= LL(991231235959))
  2053.     return nr+LL(19000000000000); // YYMMDDHHMMSS, 1970-1999
  2054.  err:
  2055.   current_thd->cuted_fields++;
  2056.   return LL(0);
  2057. }
  2058. void Field_timestamp::store(longlong nr)
  2059. {
  2060.   TIME l_time;
  2061.   time_t timestamp;
  2062.   long part1,part2;
  2063.   if ((nr=fix_datetime(nr)))
  2064.   {
  2065.     part1=(long) (nr/LL(1000000));
  2066.     part2=(long) (nr - (longlong) part1*LL(1000000));
  2067.     l_time.year=  part1/10000L;  part1%=10000L;
  2068.     l_time.month= (int) part1 / 100;
  2069.     l_time.day= (int) part1 % 100; 
  2070.     l_time.hour=  part2/10000L;  part2%=10000L;
  2071.     l_time.minute=(int) part2 / 100;
  2072.     l_time.second=(int) part2 % 100; 
  2073.     timestamp=my_gmt_sec(&l_time);
  2074.   }
  2075.   else
  2076.     timestamp=0;
  2077. #ifdef WORDS_BIGENDIAN
  2078.   if (table->db_low_byte_first)
  2079.   {
  2080.     int4store(ptr,timestamp);
  2081.   }
  2082.   else
  2083. #endif
  2084.     longstore(ptr,timestamp);
  2085. }
  2086. double Field_timestamp::val_real(void)
  2087. {
  2088.   return (double) Field_timestamp::val_int();
  2089. }
  2090. longlong Field_timestamp::val_int(void)
  2091. {
  2092.   uint len,pos;
  2093.   int part_time;
  2094.   uint32 temp;
  2095.   time_t time_arg;
  2096.   struct tm *l_time;
  2097.   longlong res;
  2098.   struct tm tm_tmp;
  2099. #ifdef WORDS_BIGENDIAN
  2100.   if (table->db_low_byte_first)
  2101.     temp=uint4korr(ptr);
  2102.   else
  2103. #endif
  2104.     longget(temp,ptr);
  2105.   if (temp == 0L) // No time
  2106.     return(0); /* purecov: inspected */
  2107.   time_arg=(time_t) temp;
  2108.   localtime_r(&time_arg,&tm_tmp);
  2109.   l_time=&tm_tmp;
  2110.   res=(longlong) 0;
  2111.   for (pos=len=0; len+1 < (uint) field_length ; len+=2,pos++)
  2112.   {
  2113.     bool year_flag=0;
  2114.     switch (dayord.pos[pos]) {
  2115.     case 0: part_time=l_time->tm_year % 100; year_flag=1 ; break;
  2116.     case 1: part_time=l_time->tm_mon+1; break;
  2117.     case 2: part_time=l_time->tm_mday; break;
  2118.     case 3: part_time=l_time->tm_hour; break;
  2119.     case 4: part_time=l_time->tm_min; break;
  2120.     case 5: part_time=l_time->tm_sec; break;
  2121.     default: part_time=0; break; /* purecov: deadcode */
  2122.     }
  2123.     if (year_flag && (field_length == 8 || field_length == 14))
  2124.     {
  2125.       res=res*(longlong) 10000+(part_time+
  2126. ((part_time < YY_PART_YEAR) ? 2000 : 1900));
  2127.       len+=2;
  2128.     }
  2129.     else
  2130.       res=res*(longlong) 100+part_time;
  2131.   }
  2132.   return (longlong) res;
  2133. }
  2134. String *Field_timestamp::val_str(String *val_buffer,
  2135.  String *val_ptr __attribute__((unused)))
  2136. {
  2137.   uint pos;
  2138.   int part_time;
  2139.   uint32 temp;
  2140.   time_t time_arg;
  2141.   struct tm *l_time;
  2142.   struct tm tm_tmp;
  2143.   val_buffer->alloc(field_length+1);
  2144.   char *to=(char*) val_buffer->ptr(),*end=to+field_length;
  2145. #ifdef WORDS_BIGENDIAN
  2146.   if (table->db_low_byte_first)
  2147.     temp=uint4korr(ptr);
  2148.   else
  2149. #endif
  2150.     longget(temp,ptr);
  2151.   if (temp == 0L)
  2152.   {       /* Zero time is "000000" */
  2153.     VOID(strfill(to,field_length,'0'));
  2154.     val_buffer->length(field_length);
  2155.     return val_buffer;
  2156.   }
  2157.   time_arg=(time_t) temp;
  2158.   localtime_r(&time_arg,&tm_tmp);
  2159.   l_time=&tm_tmp;
  2160.   for (pos=0; to < end ; pos++)
  2161.   {
  2162.     bool year_flag=0;
  2163.     switch (dayord.pos[pos]) {
  2164.     case 0: part_time=l_time->tm_year % 100; year_flag=1; break;
  2165.     case 1: part_time=l_time->tm_mon+1; break;
  2166.     case 2: part_time=l_time->tm_mday; break;
  2167.     case 3: part_time=l_time->tm_hour; break;
  2168.     case 4: part_time=l_time->tm_min; break;
  2169.     case 5: part_time=l_time->tm_sec; break;
  2170.     default: part_time=0; break; /* purecov: deadcode */
  2171.     }
  2172.     if (year_flag && (field_length == 8 || field_length == 14))
  2173.     {
  2174.       if (part_time < YY_PART_YEAR)
  2175.       {
  2176. *to++='2'; *to++='0'; /* purecov: inspected */
  2177.       }
  2178.       else
  2179.       {
  2180. *to++='1'; *to++='9';
  2181.       }
  2182.     }
  2183.     *to++=(char) ('0'+((uint) part_time/10));
  2184.     *to++=(char) ('0'+((uint) part_time % 10));
  2185.   }
  2186.   *to=0; // Safeguard
  2187.   val_buffer->length((uint) (to-val_buffer->ptr()));
  2188.   return val_buffer;
  2189. }
  2190. bool Field_timestamp::get_date(TIME *ltime,
  2191.        bool fuzzydate __attribute__((unused)))
  2192. {
  2193.   long temp;
  2194. #ifdef WORDS_BIGENDIAN
  2195.   if (table->db_low_byte_first)
  2196.     temp=uint4korr(ptr);
  2197.   else
  2198. #endif
  2199.     longget(temp,ptr);
  2200.   if (temp == 0L)
  2201.   {       /* Zero time is "000000" */
  2202.     bzero((char*) ltime,sizeof(*ltime));
  2203.   }
  2204.   else
  2205.   {
  2206.     struct tm tm_tmp;
  2207.     time_t time_arg= (time_t) temp;
  2208.     localtime_r(&time_arg,&tm_tmp);
  2209.     struct tm *start= &tm_tmp;
  2210.     ltime->year= start->tm_year+1900;
  2211.     ltime->month= start->tm_mon+1;
  2212.     ltime->day= start->tm_mday;
  2213.     ltime->hour= start->tm_hour;
  2214.     ltime->minute= start->tm_min;
  2215.     ltime->second= start->tm_sec;
  2216.     ltime->second_part= 0;
  2217.     ltime->neg= 0;
  2218.     ltime->time_type=TIMESTAMP_FULL;
  2219.   }
  2220.   return 0;
  2221. }
  2222. bool Field_timestamp::get_time(TIME *ltime)
  2223. {
  2224.   Field_timestamp::get_date(ltime,0);
  2225.   return 0;
  2226. }
  2227. int Field_timestamp::cmp(const char *a_ptr, const char *b_ptr)
  2228. {
  2229.   int32 a,b;
  2230. #ifdef WORDS_BIGENDIAN
  2231.   if (table->db_low_byte_first)
  2232.   {
  2233.     a=sint4korr(a_ptr);
  2234.     b=sint4korr(b_ptr);
  2235.   }
  2236.   else
  2237. #endif
  2238.   {
  2239.   longget(a,a_ptr);
  2240.   longget(b,b_ptr);
  2241.   }
  2242.   return ((uint32) a < (uint32) b) ? -1 : ((uint32) a > (uint32) b) ? 1 : 0;
  2243. }
  2244. void Field_timestamp::sort_string(char *to,uint length __attribute__((unused)))
  2245. {
  2246. #ifdef WORDS_BIGENDIAN
  2247.   if (!table->db_low_byte_first)
  2248.   {
  2249.     to[0] = ptr[0];
  2250.     to[1] = ptr[1];
  2251.     to[2] = ptr[2];
  2252.     to[3] = ptr[3];
  2253.   }
  2254.   else
  2255. #endif
  2256.   {
  2257.     to[0] = ptr[3];
  2258.     to[1] = ptr[2];
  2259.     to[2] = ptr[1];
  2260.     to[3] = ptr[0];
  2261.   }
  2262. }
  2263. void Field_timestamp::sql_type(String &res) const
  2264. {
  2265.   sprintf((char*) res.ptr(),"timestamp(%d)",(int) field_length);
  2266.   res.length((uint) strlen(res.ptr()));
  2267. }
  2268. void Field_timestamp::set_time()
  2269. {
  2270.   long tmp= (long) current_thd->query_start();
  2271. #ifdef WORDS_BIGENDIAN
  2272.   if (table->db_low_byte_first)
  2273.   {
  2274.     int4store(ptr,tmp);
  2275.   }
  2276.   else
  2277. #endif
  2278.     longstore(ptr,tmp);
  2279. }
  2280. /****************************************************************************
  2281. ** time type
  2282. ** In string context: HH:MM:SS
  2283. ** In number context: HHMMSS
  2284. ** Stored as a 3 byte unsigned int
  2285. ****************************************************************************/
  2286. void Field_time::store(const char *from,uint len)
  2287. {
  2288.   TIME ltime;
  2289.   long tmp;
  2290.   if (str_to_time(from,len,&ltime))
  2291.     tmp=0L;
  2292.   else
  2293.   {
  2294.     if (ltime.month)
  2295.       ltime.day=0;
  2296.     tmp=(ltime.day*24L+ltime.hour)*10000L+(ltime.minute*100+ltime.second);
  2297.     if (tmp > 8385959)
  2298.     {
  2299.       tmp=8385959;
  2300.       current_thd->cuted_fields++;
  2301.     }
  2302.   }
  2303.   if (ltime.neg)
  2304.     tmp= -tmp;
  2305.   Field_time::store((longlong) tmp);
  2306. }
  2307. void Field_time::store(double nr)
  2308. {
  2309.   long tmp;
  2310.   if (nr > 8385959.0)
  2311.   {
  2312.     tmp=8385959L;
  2313.     current_thd->cuted_fields++;
  2314.   }
  2315.   else if (nr < -8385959.0)
  2316.   {
  2317.     tmp= -8385959L;
  2318.     current_thd->cuted_fields++;
  2319.   }
  2320.   else
  2321.   {
  2322.     tmp=(long) floor(fabs(nr)); // Remove fractions
  2323.     if (nr < 0)
  2324.       tmp= -tmp;
  2325.     if (tmp % 100 > 59 || tmp/100 % 100 > 59)
  2326.     {
  2327.       tmp=0;
  2328.       current_thd->cuted_fields++;
  2329.     }
  2330.   }
  2331.   int3store(ptr,tmp);
  2332. }
  2333. void Field_time::store(longlong nr)
  2334. {
  2335.   long tmp;
  2336.   if (nr > (longlong) 8385959L)
  2337.   {
  2338.     tmp=8385959L;
  2339.     current_thd->cuted_fields++;
  2340.   }
  2341.   else if (nr < (longlong) -8385959L)
  2342.   {
  2343.     tmp= -8385959L;
  2344.     current_thd->cuted_fields++;
  2345.   }
  2346.   else
  2347.   {
  2348.     tmp=(long) nr;
  2349.     if (tmp % 100 > 59 || tmp/100 % 100 > 59)
  2350.     {
  2351.       tmp=0;
  2352.       current_thd->cuted_fields++;
  2353.     }
  2354.   }
  2355.   int3store(ptr,tmp);
  2356. }
  2357. double Field_time::val_real(void)
  2358. {
  2359.   ulong j= (ulong) uint3korr(ptr);
  2360.   return (double) j;
  2361. }
  2362. longlong Field_time::val_int(void)
  2363. {
  2364.   return (longlong) sint3korr(ptr);
  2365. }
  2366. String *Field_time::val_str(String *val_buffer,
  2367.     String *val_ptr __attribute__((unused)))
  2368. {
  2369.   val_buffer->alloc(16);
  2370.   long tmp=(long) sint3korr(ptr);
  2371.   const char *sign="";
  2372.   if (tmp < 0)
  2373.   {
  2374.     tmp= -tmp;
  2375.     sign= "-";
  2376.   }
  2377.   sprintf((char*) val_buffer->ptr(),"%s%02d:%02d:%02d",
  2378.   sign,(int) (tmp/10000), (int) (tmp/100 % 100),
  2379.   (int) (tmp % 100));
  2380.   val_buffer->length((uint) strlen(val_buffer->ptr()));
  2381.   return val_buffer;
  2382. }
  2383. bool Field_time::get_time(TIME *ltime)
  2384. {
  2385.   long tmp=(long) sint3korr(ptr);
  2386.   ltime->neg=0;
  2387.   if (tmp < 0)
  2388.   {
  2389.     ltime->neg= 1;
  2390.     tmp=-tmp;
  2391.   }
  2392.   ltime->hour=tmp/10000;
  2393.   tmp-=ltime->hour*10000;
  2394.   ltime->minute=   tmp/100;
  2395.   ltime->second= tmp % 100;
  2396.   ltime->second_part=0;
  2397.   return 0;
  2398. }
  2399. int Field_time::cmp(const char *a_ptr, const char *b_ptr)
  2400. {
  2401.   long a,b;
  2402.   a=(long) sint3korr(a_ptr);
  2403.   b=(long) sint3korr(b_ptr);
  2404.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  2405. }
  2406. void Field_time::sort_string(char *to,uint length __attribute__((unused)))
  2407. {
  2408.   to[0] = (uchar) (ptr[2] ^ 128);
  2409.   to[1] = ptr[1];
  2410.   to[2] = ptr[0];
  2411. }
  2412. void Field_time::sql_type(String &res) const
  2413. {
  2414.   res.set("time",4);
  2415. }
  2416. /****************************************************************************
  2417. ** year type
  2418. ** Save in a byte the year 0, 1901->2155
  2419. ** Can handle 2 byte or 4 byte years!
  2420. ****************************************************************************/
  2421. void Field_year::store(const char *from, uint len)
  2422. {
  2423.   String tmp_str(from,len);
  2424.   long nr= strtol(tmp_str.c_ptr(),NULL,10);
  2425.   if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155)
  2426.   {
  2427.     *ptr=0;
  2428.     current_thd->cuted_fields++;
  2429.     return;
  2430.   }
  2431.   else if (current_thd->count_cuted_fields && !test_if_int(from,len))
  2432.     current_thd->cuted_fields++;
  2433.   if (nr != 0 || len != 4)
  2434.   {
  2435.     if (nr < YY_PART_YEAR)
  2436.       nr+=100; // 2000 - 2069
  2437.     else if (nr > 1900)
  2438.       nr-= 1900;
  2439.   }
  2440.   *ptr= (char) (unsigned char) nr;
  2441. }
  2442. void Field_year::store(double nr)
  2443. {
  2444.   if (nr < 0.0 || nr >= 2155.0)
  2445.     Field_year::store((longlong) -1);
  2446.   else
  2447.     Field_year::store((longlong) nr);
  2448. }
  2449. void Field_year::store(longlong nr)
  2450. {
  2451.   if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155)
  2452.   {
  2453.     *ptr=0;
  2454.     current_thd->cuted_fields++;
  2455.     return;
  2456.   }
  2457.   if (nr != 0 || field_length != 4) // 0000 -> 0; 00 -> 2000
  2458.   {
  2459.     if (nr < YY_PART_YEAR)
  2460.       nr+=100; // 2000 - 2069
  2461.     else if (nr > 1900)
  2462.       nr-= 1900;
  2463.   }
  2464.   *ptr= (char) (unsigned char) nr;
  2465. }
  2466. double Field_year::val_real(void)
  2467. {
  2468.   return (double) Field_year::val_int();
  2469. }
  2470. longlong Field_year::val_int(void)
  2471. {
  2472.   int tmp= (int) ((uchar*) ptr)[0];
  2473.   if (field_length != 4)
  2474.     tmp%=100; // Return last 2 char
  2475.   else if (tmp)
  2476.     tmp+=1900;
  2477.   return (longlong) tmp;
  2478. }
  2479. String *Field_year::val_str(String *val_buffer,
  2480.     String *val_ptr __attribute__((unused)))
  2481. {
  2482.   val_buffer->alloc(5);
  2483.   val_buffer->length(field_length);
  2484.   char *to=(char*) val_buffer->ptr();
  2485.   sprintf(to,field_length == 2 ? "%02d" : "%04d",(int) Field_year::val_int());
  2486.   return val_buffer;
  2487. }
  2488. void Field_year::sql_type(String &res) const
  2489. {
  2490.   sprintf((char*) res.ptr(),"year(%d)",(int) field_length);
  2491.   res.length((uint) strlen(res.ptr()));
  2492. }
  2493. /****************************************************************************
  2494. ** date type
  2495. ** In string context: YYYY-MM-DD
  2496. ** In number context: YYYYMMDD
  2497. ** Stored as a 4 byte unsigned int
  2498. ****************************************************************************/
  2499. void Field_date::store(const char *from,uint len)
  2500. {
  2501.   TIME l_time;
  2502.   ulong tmp;
  2503.   if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE)
  2504.     tmp=0;
  2505.   else
  2506.     tmp=(ulong) l_time.year*10000L + (ulong) (l_time.month*100+l_time.day);
  2507. #ifdef WORDS_BIGENDIAN
  2508.   if (table->db_low_byte_first)
  2509.   {
  2510.     int4store(ptr,tmp);
  2511.   }
  2512.   else
  2513. #endif
  2514.     longstore(ptr,tmp);
  2515. }
  2516. void Field_date::store(double nr)
  2517. {
  2518.   long tmp;
  2519.   if (nr >= 19000000000000.0 && nr <= 99991231235959.0)
  2520.     nr=floor(nr/1000000.0); // Timestamp to date
  2521.   if (nr < 0.0 || nr > 99991231.0)
  2522.   {
  2523.     tmp=0L;
  2524.     current_thd->cuted_fields++;
  2525.   }
  2526.   else
  2527.     tmp=(long) rint(nr);
  2528. #ifdef WORDS_BIGENDIAN
  2529.   if (table->db_low_byte_first)
  2530.   {
  2531.     int4store(ptr,tmp);
  2532.   }
  2533.   else
  2534. #endif
  2535.     longstore(ptr,tmp);
  2536. }
  2537. void Field_date::store(longlong nr)
  2538. {
  2539.   long tmp;
  2540.   if (nr >= LL(19000000000000) && nr < LL(99991231235959))
  2541.     nr=nr/LL(1000000); // Timestamp to date
  2542.   if (nr < 0 || nr > LL(99991231))
  2543.   {
  2544.     tmp=0L;
  2545.     current_thd->cuted_fields++;
  2546.   }
  2547.   else
  2548.     tmp=(long) nr;
  2549. #ifdef WORDS_BIGENDIAN
  2550.   if (table->db_low_byte_first)
  2551.   {
  2552.     int4store(ptr,tmp);
  2553.   }
  2554.   else
  2555. #endif
  2556.     longstore(ptr,tmp);
  2557. }
  2558. double Field_date::val_real(void)
  2559. {
  2560.   int32 j;
  2561. #ifdef WORDS_BIGENDIAN
  2562.   if (table->db_low_byte_first)
  2563.     j=sint4korr(ptr);
  2564.   else
  2565. #endif
  2566.     longget(j,ptr);
  2567.   return (double) (uint32) j;
  2568. }
  2569. longlong Field_date::val_int(void)
  2570. {
  2571.   int32 j;
  2572. #ifdef WORDS_BIGENDIAN
  2573.   if (table->db_low_byte_first)
  2574.     j=sint4korr(ptr);
  2575.   else
  2576. #endif
  2577.     longget(j,ptr);
  2578.   return (longlong) (uint32) j;
  2579. }
  2580. String *Field_date::val_str(String *val_buffer,
  2581.     String *val_ptr __attribute__((unused)))
  2582. {
  2583.   val_buffer->alloc(field_length);
  2584.   val_buffer->length(field_length);
  2585.   int32 tmp;
  2586. #ifdef WORDS_BIGENDIAN
  2587.   if (table->db_low_byte_first)
  2588.     tmp=sint4korr(ptr);
  2589.   else
  2590. #endif
  2591.     longget(tmp,ptr);
  2592.   sprintf((char*) val_buffer->ptr(),"%04d-%02d-%02d",
  2593.   (int) ((uint32) tmp/10000L % 10000), (int) ((uint32) tmp/100 % 100),
  2594.   (int) ((uint32) tmp % 100));
  2595.   return val_buffer;
  2596. }
  2597. int Field_date::cmp(const char *a_ptr, const char *b_ptr)
  2598. {
  2599.   int32 a,b;
  2600. #ifdef WORDS_BIGENDIAN
  2601.   if (table->db_low_byte_first)
  2602.   {
  2603.     a=sint4korr(a_ptr);
  2604.     b=sint4korr(b_ptr);
  2605.   }
  2606.   else
  2607. #endif
  2608.   {
  2609.     longget(a,a_ptr);
  2610.     longget(b,b_ptr);
  2611.   }
  2612.   return ((uint32) a < (uint32) b) ? -1 : ((uint32) a > (uint32) b) ? 1 : 0;
  2613. }
  2614. void Field_date::sort_string(char *to,uint length __attribute__((unused)))
  2615. {
  2616. #ifdef WORDS_BIGENDIAN
  2617.   if (!table->db_low_byte_first)
  2618.   {
  2619.     to[0] = ptr[0];
  2620.     to[1] = ptr[1];
  2621.     to[2] = ptr[2];
  2622.     to[3] = ptr[3];
  2623.   }
  2624.   else
  2625. #endif
  2626.   {
  2627.     to[0] = ptr[3];
  2628.     to[1] = ptr[2];
  2629.     to[2] = ptr[1];
  2630.     to[3] = ptr[0];
  2631.   }
  2632. }
  2633. void Field_date::sql_type(String &res) const
  2634. {
  2635.   res.set("date",4);
  2636. }
  2637. /****************************************************************************
  2638. ** The new date type
  2639. ** This is identical to the old date type, but stored on 3 bytes instead of 4
  2640. ** In number context: YYYYMMDD
  2641. ****************************************************************************/
  2642. void Field_newdate::store(const char *from,uint len)
  2643. {
  2644.   TIME l_time;
  2645.   long tmp;
  2646.   if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE)
  2647.     tmp=0L;
  2648.   else
  2649.     tmp= l_time.day + l_time.month*32 + l_time.year*16*32;
  2650.   int3store(ptr,tmp);
  2651. }
  2652. void Field_newdate::store(double nr)
  2653. {
  2654.   if (nr < 0.0 || nr > 99991231235959.0)
  2655.     Field_newdate::store((longlong) -1);
  2656.   else
  2657.     Field_newdate::store((longlong) rint(nr));
  2658. }
  2659. void Field_newdate::store(longlong nr)
  2660. {
  2661.   long tmp;
  2662.   if (nr >= LL(100000000) && nr <= LL(99991231235959))
  2663.     nr=nr/LL(1000000); // Timestamp to date
  2664.   if (nr < 0L || nr > 99991231L)
  2665.   {
  2666.     tmp=0;
  2667.     current_thd->cuted_fields++;
  2668.   }
  2669.   else
  2670.   {
  2671.     tmp=(long) nr;
  2672.     if (tmp)
  2673.     {
  2674.       if (tmp < YY_PART_YEAR*10000L) // Fix short dates
  2675. tmp+=20000000L;
  2676.       else if (tmp < 999999L)
  2677. tmp+=19000000L;
  2678.     }
  2679.     uint month=((tmp/100) % 100);
  2680.     uint day= tmp%100;
  2681.     if (month > 12 || day > 31)
  2682.     {
  2683.       tmp=0L; // Don't allow date to change
  2684.       current_thd->cuted_fields++;
  2685.     }
  2686.     else
  2687.       tmp= day + month*32 + (tmp/10000)*16*32;
  2688.   }
  2689.   int3store(ptr,tmp);
  2690. }
  2691. void Field_newdate::store_time(TIME *ltime,timestamp_type type)
  2692. {
  2693.   long tmp;
  2694.   if (type == TIMESTAMP_DATE || type == TIMESTAMP_FULL)
  2695.     tmp=ltime->year*16*32+ltime->month*32+ltime->day;
  2696.   else
  2697.   {
  2698.     tmp=0;
  2699.     current_thd->cuted_fields++;
  2700.   }
  2701.   int3store(ptr,tmp);
  2702. }
  2703. double Field_newdate::val_real(void)
  2704. {
  2705.   return (double) Field_newdate::val_int();
  2706. }
  2707. longlong Field_newdate::val_int(void)
  2708. {
  2709.   ulong j=uint3korr(ptr);
  2710.   j= (j % 32L)+(j / 32L % 16L)*100L + (j/(16L*32L))*10000L;
  2711.   return (longlong) j;
  2712. }
  2713. String *Field_newdate::val_str(String *val_buffer,
  2714.        String *val_ptr __attribute__((unused)))
  2715. {
  2716.   val_buffer->alloc(field_length);
  2717.   val_buffer->length(field_length);
  2718.   ulong tmp=(ulong) uint3korr(ptr);
  2719.   int part;
  2720.   char *pos=(char*) val_buffer->ptr()+10;
  2721.   /* Open coded to get more speed */
  2722.   *pos--=0;
  2723.   part=(int) (tmp & 31);
  2724.   *pos--='0'+part%10;
  2725.   *pos--='0'+part/10;
  2726.   *pos--='-';
  2727.   part=(int) (tmp >> 5 & 15);
  2728.   *pos--='0'+part%10;
  2729.   *pos--='0'+part/10;
  2730.   *pos--='-';
  2731.   part=(int) (tmp >> 9);
  2732.   *pos--='0'+part%10; part/=10;
  2733.   *pos--='0'+part%10; part/=10;
  2734.   *pos--='0'+part%10; part/=10;
  2735.   *pos='0'+part;
  2736.   return val_buffer;
  2737. }
  2738. bool Field_newdate::get_date(TIME *ltime,bool fuzzydate)
  2739. {
  2740.   if (is_null())
  2741.     return 1;
  2742.   ulong tmp=(ulong) uint3korr(ptr);
  2743.   bzero((char*) ltime,sizeof(*ltime));
  2744.   ltime->day=   tmp & 31;
  2745.   ltime->month= (tmp >> 5) & 15;
  2746.   ltime->year=  (tmp >> 9);
  2747.   ltime->time_type=TIMESTAMP_DATE;
  2748.   return (!fuzzydate && (!ltime->month || !ltime->day) && ltime->year) ? 1 : 0;
  2749. }
  2750. bool Field_newdate::get_time(TIME *ltime)
  2751. {
  2752.   Field_newdate::get_date(ltime,0);
  2753.   return 0;
  2754. }
  2755. int Field_newdate::cmp(const char *a_ptr, const char *b_ptr)
  2756. {
  2757.   ulong a,b;
  2758.   a=(ulong) uint3korr(a_ptr);
  2759.   b=(ulong) uint3korr(b_ptr);
  2760.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  2761. }
  2762. void Field_newdate::sort_string(char *to,uint length __attribute__((unused)))
  2763. {
  2764.   to[0] = ptr[2];
  2765.   to[1] = ptr[1];
  2766.   to[2] = ptr[0];
  2767. }
  2768. void Field_newdate::sql_type(String &res) const
  2769. {
  2770.   res.set("date",4);
  2771. }
  2772. /****************************************************************************
  2773. ** datetime type
  2774. ** In string context: YYYY-MM-DD HH:MM:DD
  2775. ** In number context: YYYYMMDDHHMMDD
  2776. ** Stored as a 8 byte unsigned int. Should sometimes be change to a 6 byte int.
  2777. ****************************************************************************/
  2778. void Field_datetime::store(const char *from,uint len)
  2779. {
  2780.   longlong tmp=str_to_datetime(from,len,1);
  2781. #ifdef WORDS_BIGENDIAN
  2782.   if (table->db_low_byte_first)
  2783.   {
  2784.     int8store(ptr,tmp);
  2785.   }
  2786.   else
  2787. #endif
  2788.     longlongstore(ptr,tmp);
  2789. }
  2790. void Field_datetime::store(double nr)
  2791. {
  2792.   if (nr < 0.0 || nr > 99991231235959.0)
  2793.   {
  2794.     nr=0.0;
  2795.     current_thd->cuted_fields++;
  2796.   }
  2797.   Field_datetime::store((longlong) rint(nr));
  2798. }
  2799. void Field_datetime::store(longlong nr)
  2800. {
  2801.   if (nr < 0 || nr > LL(99991231235959))
  2802.   {
  2803.     nr=0;
  2804.     current_thd->cuted_fields++;
  2805.   }
  2806.   else
  2807.     nr=fix_datetime(nr);
  2808. #ifdef WORDS_BIGENDIAN
  2809.   if (table->db_low_byte_first)
  2810.   {
  2811.     int8store(ptr,nr);
  2812.   }
  2813.   else
  2814. #endif
  2815.     longlongstore(ptr,nr);
  2816. }
  2817. void Field_datetime::store_time(TIME *ltime,timestamp_type type)
  2818. {
  2819.   longlong tmp;
  2820.   if (type == TIMESTAMP_DATE || type == TIMESTAMP_FULL)
  2821.     tmp=((ltime->year*10000L+ltime->month*100+ltime->day)*LL(1000000)+
  2822.  (ltime->hour*10000L+ltime->minute*100+ltime->second));
  2823.   else
  2824.   {
  2825.     tmp=0;
  2826.     current_thd->cuted_fields++;
  2827.   }
  2828. #ifdef WORDS_BIGENDIAN
  2829.   if (table->db_low_byte_first)
  2830.   {
  2831.     int8store(ptr,tmp);
  2832.   }
  2833.   else
  2834. #endif
  2835.     longlongstore(ptr,tmp);
  2836. }
  2837. double Field_datetime::val_real(void)
  2838. {
  2839.   return (double) Field_datetime::val_int();
  2840. }
  2841. longlong Field_datetime::val_int(void)
  2842. {
  2843.   longlong j;
  2844. #ifdef WORDS_BIGENDIAN
  2845.   if (table->db_low_byte_first)
  2846.     j=sint8korr(ptr);
  2847.   else
  2848. #endif
  2849.     longlongget(j,ptr);
  2850.   return j;
  2851. }
  2852. String *Field_datetime::val_str(String *val_buffer,
  2853. String *val_ptr __attribute__((unused)))
  2854. {
  2855.   val_buffer->alloc(field_length);
  2856.   val_buffer->length(field_length);
  2857.   ulonglong tmp;
  2858.   long part1,part2;
  2859.   char *pos;
  2860.   int part3;
  2861. #ifdef WORDS_BIGENDIAN
  2862.   if (table->db_low_byte_first)
  2863.     tmp=sint8korr(ptr);
  2864.   else
  2865. #endif
  2866.     longlongget(tmp,ptr);
  2867.   /*
  2868.     Avoid problem with slow longlong aritmetic and sprintf
  2869.   */
  2870.   part1=(long) (tmp/LL(1000000));
  2871.   part2=(long) (tmp - (ulonglong) part1*LL(1000000));
  2872.   pos=(char*) val_buffer->ptr()+19;
  2873.   *pos--=0;
  2874.   *pos--='0'+(char) (part2%10); part2/=10;
  2875.   *pos--='0'+(char) (part2%10); part3= (int) (part2 / 10);
  2876.   *pos--=':';
  2877.   *pos--='0'+(char) (part3%10); part3/=10;
  2878.   *pos--='0'+(char) (part3%10); part3/=10;
  2879.   *pos--=':';
  2880.   *pos--='0'+(char) (part3%10); part3/=10;
  2881.   *pos--='0'+(char) part3;
  2882.   *pos--=' ';
  2883.   *pos--='0'+(char) (part1%10); part1/=10;
  2884.   *pos--='0'+(char) (part1%10); part1/=10;
  2885.   *pos--='-';
  2886.   *pos--='0'+(char) (part1%10); part1/=10;
  2887.   *pos--='0'+(char) (part1%10); part3= (int) (part1/10);
  2888.   *pos--='-';
  2889.   *pos--='0'+(char) (part3%10); part3/=10;
  2890.   *pos--='0'+(char) (part3%10); part3/=10;
  2891.   *pos--='0'+(char) (part3%10); part3/=10;
  2892.   *pos='0'+(char) part3;
  2893.   return val_buffer;
  2894. }
  2895. bool Field_datetime::get_date(TIME *ltime,bool fuzzydate)
  2896. {
  2897.   longlong tmp=Field_datetime::val_int();
  2898.   long part1,part2;
  2899.   part1=(long) (tmp/LL(1000000));
  2900.   part2=(long) (tmp - (ulonglong) part1*LL(1000000));
  2901.   ltime->time_type= TIMESTAMP_FULL;
  2902.   ltime->neg=0;
  2903.   ltime->second_part=0;
  2904.   ltime->second= part2%100;
  2905.   ltime->minute= part2/100%100;
  2906.   ltime->hour= part2/10000;
  2907.   ltime->day= part1%100;
  2908.   ltime->month=  part1/100%100;
  2909.   ltime->year=  part1/10000;
  2910.   return (!fuzzydate && (!ltime->month || !ltime->day) && ltime->year) ? 1 : 0;
  2911. }
  2912. bool Field_datetime::get_time(TIME *ltime)
  2913. {
  2914.   Field_datetime::get_date(ltime,0);
  2915.   return 0;
  2916. }
  2917. int Field_datetime::cmp(const char *a_ptr, const char *b_ptr)
  2918. {
  2919.   longlong a,b;
  2920. #ifdef WORDS_BIGENDIAN
  2921.   if (table->db_low_byte_first)
  2922.   {
  2923.     a=sint8korr(a_ptr);
  2924.     b=sint8korr(b_ptr);
  2925.   }
  2926.   else
  2927. #endif
  2928.   {
  2929.     longlongget(a,a_ptr);
  2930.     longlongget(b,b_ptr);
  2931.   }
  2932.   return ((ulonglong) a < (ulonglong) b) ? -1 :
  2933.     ((ulonglong) a > (ulonglong) b) ? 1 : 0;
  2934. }
  2935. void Field_datetime::sort_string(char *to,uint length __attribute__((unused)))
  2936. {
  2937. #ifdef WORDS_BIGENDIAN
  2938.   if (!table->db_low_byte_first)
  2939.   {
  2940.     to[0] = ptr[0];
  2941.     to[1] = ptr[1];
  2942.     to[2] = ptr[2];
  2943.     to[3] = ptr[3];
  2944.     to[4] = ptr[4];
  2945.     to[5] = ptr[5];
  2946.     to[6] = ptr[6];
  2947.     to[7] = ptr[7];
  2948.   }
  2949.   else
  2950. #endif
  2951.   {
  2952.     to[0] = ptr[7];
  2953.     to[1] = ptr[6];
  2954.     to[2] = ptr[5];
  2955.     to[3] = ptr[4];
  2956.     to[4] = ptr[3];
  2957.     to[5] = ptr[2];
  2958.     to[6] = ptr[1];
  2959.     to[7] = ptr[0];
  2960.   }
  2961. }
  2962. void Field_datetime::sql_type(String &res) const
  2963. {
  2964.   res.set("datetime",8);
  2965. }
  2966. /****************************************************************************
  2967. ** string type
  2968. ** A string may be varchar or binary
  2969. ****************************************************************************/
  2970. /* Copy a string and fill with space */
  2971. void Field_string::store(const char *from,uint length)
  2972. {
  2973. #ifdef USE_TIS620
  2974.   if(!binary_flag) {
  2975.     ThNormalize((uchar *)ptr, field_length, (uchar *)from, length);
  2976.     if(length < field_length) {
  2977.       bfill(ptr + length, field_length - length, ' ');
  2978.     }
  2979.   }
  2980. #else
  2981.   if (length <= field_length)
  2982.   {
  2983.     memcpy(ptr,from,length);
  2984.     if (length < field_length)
  2985.       bfill(ptr+length,field_length-length,' ');
  2986.   }
  2987.   else
  2988.   {
  2989.     memcpy(ptr,from,field_length);
  2990.     if (current_thd->count_cuted_fields)
  2991.     { // Check if we loosed some info
  2992.       const char *end=from+length;
  2993.       for (from+=field_length ; from != end ; from++)
  2994.       {
  2995. if (!isspace(*from))
  2996. {
  2997.   current_thd->cuted_fields++;
  2998.   break;
  2999. }
  3000.       }
  3001.     }
  3002.   }
  3003. #endif /* USE_TIS620 */
  3004. }
  3005. void Field_string::store(double nr)
  3006. {
  3007.   char buff[MAX_FIELD_WIDTH],*end;
  3008.   int width=min(field_length,DBL_DIG+5);
  3009.   sprintf(buff,"%-*.*g",width,max(width-5,0),nr);
  3010.   end=strcend(buff,' ');
  3011.   Field_string::store(buff,(uint) (end - buff));
  3012. }
  3013. void Field_string::store(longlong nr)
  3014. {
  3015.   char buff[22];
  3016.   char *end=longlong10_to_str(nr,buff,-10);
  3017.   Field_string::store(buff,end-buff);
  3018. }
  3019. double Field_string::val_real(void)
  3020. {
  3021.   double value;
  3022.   char save=ptr[field_length]; // Ok to patch record
  3023.   ptr[field_length]=0;
  3024.   value=atof(ptr);
  3025.   ptr[field_length]=save;
  3026.   return value;
  3027. }
  3028. longlong Field_string::val_int(void)
  3029. {
  3030.   longlong value;
  3031.   char save=ptr[field_length]; // Ok to patch record
  3032.   ptr[field_length]=0;
  3033.   value=strtoll(ptr,NULL,10);
  3034.   ptr[field_length]=save;
  3035.   return value;
  3036. }
  3037. String *Field_string::val_str(String *val_buffer __attribute__((unused)),
  3038.       String *val_ptr)
  3039. {
  3040.   char *end=ptr+field_length;
  3041. #ifdef WANT_TRUE_BINARY_STRINGS
  3042.   if (!binary)
  3043. #endif
  3044.     while (end > ptr && end[-1] == ' ')
  3045.       end--;
  3046.   val_ptr->set((const char*) ptr,(uint) (end - ptr));
  3047.   return val_ptr;
  3048. }
  3049. int Field_string::cmp(const char *a_ptr, const char *b_ptr)
  3050. {
  3051.   if (binary_flag)
  3052.     return memcmp(a_ptr,b_ptr,field_length);
  3053.   else
  3054.     return my_sortcmp(a_ptr,b_ptr,field_length);
  3055. }
  3056. void Field_string::sort_string(char *to,uint length)
  3057. {
  3058.   if (binary_flag)
  3059.     memcpy((byte*) to,(byte*) ptr,(size_t) length);
  3060.   else
  3061.   {
  3062. #ifdef USE_STRCOLL
  3063.     if (use_strcoll(default_charset_info)) {
  3064.       uint tmp=my_strnxfrm(default_charset_info,
  3065.                           (unsigned char *)to, (unsigned char *) ptr,
  3066.                           length, field_length);
  3067.       if (tmp < length)
  3068.         bzero(to + tmp, length - tmp);
  3069.     }
  3070.     else
  3071. #endif
  3072.       for (char *from=ptr,*end=ptr+length ; from != end ;)
  3073.         *to++=(char) my_sort_order[(uint) (uchar) *from++];
  3074.   }
  3075. }
  3076. void Field_string::sql_type(String &res) const
  3077. {
  3078.   sprintf((char*) res.ptr(),"%s(%d)",
  3079.   field_length > 3 &&
  3080.   (table->db_options_in_use & HA_OPTION_PACK_RECORD) ?
  3081.   "varchar" : "char",
  3082.   (int) field_length);
  3083.   res.length((uint) strlen(res.ptr()));
  3084.   if (binary_flag)
  3085.     res.append(" binary");
  3086. }
  3087. char *Field_string::pack(char *to, const char *from, uint max_length)
  3088. {
  3089.   const char *end=from+min(field_length,max_length);
  3090.   uchar length;
  3091.   while (end > from && end[-1] == ' ')
  3092.     end--;
  3093.   *to= length=(uchar) (end-from);
  3094.   memcpy(to+1, from, (int) length);
  3095.   return to+1+length;
  3096. }
  3097. const char *Field_string::unpack(char *to, const char *from)
  3098. {
  3099.   uint length= (uint) (uchar) *from++;
  3100.   memcpy(to, from, (int) length);
  3101.   bfill(to+length, field_length - length, ' ');
  3102.   return from+length;
  3103. }
  3104. int Field_string::pack_cmp(const char *a, const char *b, uint length)
  3105. {
  3106.   uint a_length= (uint) (uchar) *a++;
  3107.   uint b_length= (uint) (uchar) *b++;
  3108.   if (binary_flag)
  3109.   {
  3110.     int cmp= memcmp(a,b,min(a_length,b_length));
  3111.     return cmp ? cmp : (int) (a_length - b_length);
  3112.   }
  3113.   return my_sortncmp(a,a_length, b,b_length);
  3114. }
  3115. int Field_string::pack_cmp(const char *b, uint length)
  3116. {
  3117.   uint b_length= (uint) (uchar) *b++;
  3118.   char *end= ptr + field_length;
  3119.   while (end > ptr && end[-1] == ' ')
  3120.     end--;
  3121.   uint a_length = (uint) (end - ptr);
  3122.   if (binary_flag)
  3123.   {
  3124.     int cmp= memcmp(ptr,b,min(a_length,b_length));
  3125.     return cmp ? cmp : (int) (a_length - b_length);
  3126.   }
  3127.   return my_sortncmp(ptr,a_length, b, b_length);
  3128. }
  3129. uint Field_string::packed_col_length(const char *ptr)
  3130. {
  3131.   if (field_length > 255)
  3132.     return uint2korr(ptr)+2;
  3133.   else
  3134.     return (uint) ((uchar) *ptr)+1;
  3135. }
  3136. uint Field_string::max_packed_col_length(uint max_length)
  3137. {
  3138.   return (field_length > 255 ? 2 : 1)+max_length;
  3139. }
  3140. /****************************************************************************
  3141. ** VARCHAR type  (Not available for the end user yet)
  3142. ****************************************************************************/
  3143. void Field_varstring::store(const char *from,uint length)
  3144. {
  3145. #ifdef USE_TIS620
  3146.   if(!binary_flag)
  3147.   {
  3148.     ThNormalize((uchar *) ptr+2, field_length, (uchar *) from, length);
  3149.   }
  3150. #else
  3151.   if (length <= field_length)
  3152.   {
  3153.     memcpy(ptr+2,from,length);
  3154.   }
  3155.   else
  3156.   {
  3157.     length=field_length;
  3158.     memcpy(ptr+2,from,field_length);
  3159.     current_thd->cuted_fields++;
  3160.   }
  3161. #endif /* USE_TIS620 */
  3162.   int2store(ptr,length);
  3163. }
  3164. void Field_varstring::store(double nr)
  3165. {
  3166.   char buff[MAX_FIELD_WIDTH],*end;
  3167.   int width=min(field_length,DBL_DIG+5);
  3168.   sprintf(buff,"%-*.*g",width,max(width-5,0),nr);
  3169.   end=strcend(buff,' ');
  3170.   Field_varstring::store(buff,(uint) (end - buff));
  3171. }
  3172. void Field_varstring::store(longlong nr)
  3173. {
  3174.   char buff[22];
  3175.   char *end=longlong10_to_str(nr,buff,-10);
  3176.   Field_varstring::store(buff,end-buff);
  3177. }
  3178. double Field_varstring::val_real(void)
  3179. {
  3180.   double value;
  3181.   uint length=uint2korr(ptr)+2;
  3182.   char save=ptr[length]; // Ok to patch record
  3183.   ptr[length]=0;
  3184.   value=atof(ptr+2);
  3185.   ptr[length]=save;
  3186.   return value;
  3187. }
  3188. longlong Field_varstring::val_int(void)
  3189. {
  3190.   longlong value;
  3191.   uint length=uint2korr(ptr)+2;
  3192.   char save=ptr[length]; // Ok to patch record
  3193.   ptr[length]=0;
  3194.   value=strtoll(ptr+2,NULL,10);
  3195.   ptr[length]=save;
  3196.   return value;
  3197. }
  3198. String *Field_varstring::val_str(String *val_buffer __attribute__((unused)),
  3199.  String *val_ptr)
  3200. {
  3201.   uint length=uint2korr(ptr);
  3202.   val_ptr->set((const char*) ptr+2,length);
  3203.   return val_ptr;
  3204. }
  3205. int Field_varstring::cmp(const char *a_ptr, const char *b_ptr)
  3206. {
  3207.   uint a_length=uint2korr(a_ptr);
  3208.   uint b_length=uint2korr(b_ptr);
  3209.   int diff;
  3210.   if (binary_flag)
  3211.     diff=memcmp(a_ptr+2,b_ptr+2,min(a_length,b_length));
  3212.   else
  3213.     diff=my_sortcmp(a_ptr+2,b_ptr+2,min(a_length,b_length));
  3214.   return diff ? diff : (int) (a_length - b_length);
  3215. }
  3216. void Field_varstring::sort_string(char *to,uint length)
  3217. {
  3218.   uint tot_length=uint2korr(ptr);
  3219.   if (binary_flag)
  3220.     memcpy((byte*) to,(byte*) ptr+2,(size_t) tot_length);
  3221.   else
  3222.   {
  3223. #ifdef USE_STRCOLL
  3224.     if (use_strcoll(default_charset_info))
  3225.       tot_length=my_strnxfrm(default_charset_info,
  3226.                              (unsigned char *) to, (unsigned char *)ptr+2,
  3227.                              length, tot_length);
  3228.     else
  3229.     {
  3230. #endif
  3231.       char *tmp=to;
  3232.       if (tot_length > length)
  3233.         tot_length=length;
  3234.       for (char *from=ptr+2,*end=from+tot_length ; from != end ;)
  3235.         *tmp++=(char) my_sort_order[(uint) (uchar) *from++];
  3236. #ifdef USE_STRCOLL
  3237.     }
  3238. #endif
  3239.   }
  3240.   if (tot_length < length)
  3241.     bzero(to+tot_length,length-tot_length);
  3242. }
  3243. void Field_varstring::sql_type(String &res) const
  3244. {
  3245.   sprintf((char*) res.ptr(),"varchar(%d)",(int) field_length);
  3246.   res.length((uint) strlen(res.ptr()));
  3247.   if (binary_flag)
  3248.     res.append(" binary");
  3249. }
  3250. char *Field_varstring::pack(char *to, const char *from, uint max_length)
  3251. {
  3252.   uint length=uint2korr(from);
  3253.   if (length > max_length)
  3254.     length=max_length;
  3255.   *to++= (length & 255);
  3256.   if (max_length > 255)
  3257.     *to++= (uchar) (length >> 8);
  3258.   if (length)
  3259.     memcpy(to, from+2, length);
  3260.   return to+length;
  3261. }
  3262. const char *Field_varstring::unpack(char *to, const char *from)
  3263. {
  3264.   uint length;
  3265.   if (field_length > 255)
  3266.   {
  3267.     length= (uint) (uchar) (*to= *from++);
  3268.     to[1]=0;
  3269.   }
  3270.   else
  3271.   {
  3272.     length=uint2korr(from);
  3273.     to[0] = *from++;
  3274.     to[1] = *from++;
  3275.   }
  3276.   if (length)
  3277.     memcpy(to+2, from, length);
  3278.   return from+length;
  3279. }
  3280. int Field_varstring::pack_cmp(const char *a, const char *b, uint key_length)
  3281. {
  3282.   uint a_length;
  3283.   uint b_length;
  3284.   if (key_length > 255)
  3285.   {
  3286.     a_length=uint2korr(a); a+=2;
  3287.     b_length=uint2korr(b); b+=2;
  3288.   }
  3289.   else
  3290.   {
  3291.     a_length= (uint) (uchar) *a++;
  3292.     b_length= (uint) (uchar) *b++;
  3293.   }
  3294.   if (binary_flag)
  3295.   {
  3296.     int cmp= memcmp(a,b,min(a_length,b_length));
  3297.     return cmp ? cmp : (int) (a_length - b_length);
  3298.   }
  3299.   return my_sortncmp(a,a_length, b,b_length);
  3300. }
  3301. int Field_varstring::pack_cmp(const char *b, uint key_length)
  3302. {
  3303.   char *a=ptr+2;
  3304.   uint a_length=uint2korr(ptr);
  3305.   uint b_length;
  3306.   if (key_length > 255)
  3307.   {
  3308.     b_length=uint2korr(b); b+=2;
  3309.   }
  3310.   else
  3311.   {
  3312.     b_length= (uint) (uchar) *b++;
  3313.   }
  3314.   if (binary_flag)
  3315.   {
  3316.     int cmp= memcmp(a,b,min(a_length,b_length));
  3317.     return cmp ? cmp : (int) (a_length - b_length);
  3318.   }
  3319.   return my_sortncmp(a,a_length, b,b_length);
  3320. }
  3321. uint Field_varstring::packed_col_length(const char *ptr)
  3322. {
  3323.   if (field_length > 255)
  3324.     return uint2korr(ptr)+2;
  3325.   else
  3326.     return (uint) ((uchar) *ptr)+1;
  3327. }
  3328. uint Field_varstring::max_packed_col_length(uint max_length)
  3329. {
  3330.   return (field_length > 255 ? 2 : 1)+max_length;
  3331. }
  3332. /****************************************************************************
  3333. ** blob type
  3334. ** A blob is saved as a length and a pointer. The length is stored in the
  3335. ** packlength slot and may be from 1-4.
  3336. ****************************************************************************/
  3337. Field_blob::Field_blob(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
  3338.        enum utype unireg_check_arg, const char *field_name_arg,
  3339.        struct st_table *table_arg,uint blob_pack_length,
  3340.        bool binary_arg)
  3341.   :Field_str(ptr_arg, (1L << min(blob_pack_length,3)*8)-1L,
  3342.      null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg,
  3343.      table_arg),
  3344.    packlength(blob_pack_length),binary_flag(binary_arg)
  3345. {
  3346.   flags|= BLOB_FLAG;
  3347.   if (binary_arg)
  3348.     flags|=BINARY_FLAG;
  3349.   if (table)
  3350.     table->blob_fields++;
  3351. }
  3352. void Field_blob::store_length(ulong number)
  3353. {
  3354.   switch (packlength) {
  3355.   case 1:
  3356.     if (number > 255)
  3357.     {
  3358.       number=255;
  3359.       current_thd->cuted_fields++;
  3360.     }
  3361.     ptr[0]= (uchar) number;
  3362.     break;
  3363.   case 2:
  3364.     if (number > (uint16) ~0)
  3365.     {
  3366.       number= (uint16) ~0;
  3367.       current_thd->cuted_fields++;
  3368.     }
  3369. #ifdef WORDS_BIGENDIAN
  3370.     if (table->db_low_byte_first)
  3371.     {
  3372.       int2store(ptr,(unsigned short) number);
  3373.     }
  3374.     else
  3375. #endif
  3376.       shortstore(ptr,(unsigned short) number);
  3377.     break;
  3378.   case 3:
  3379.     if (number > (ulong) (1L << 24))
  3380.     {
  3381.       number= (ulong) (1L << 24)-1L;
  3382.       current_thd->cuted_fields++;
  3383.     }
  3384.     int3store(ptr,number);
  3385.     break;
  3386.   case 4:
  3387. #ifdef WORDS_BIGENDIAN
  3388.     if (table->db_low_byte_first)
  3389.     {
  3390.       int4store(ptr,number);
  3391.     }
  3392.     else
  3393. #endif
  3394.       longstore(ptr,number);
  3395.   }
  3396. }
  3397. ulong Field_blob::get_length(const char *pos)
  3398. {
  3399.   switch (packlength) {
  3400.   case 1:
  3401.     return (ulong) (uchar) pos[0];
  3402.   case 2:
  3403.     {
  3404.       uint16 tmp;
  3405. #ifdef WORDS_BIGENDIAN
  3406.       if (table->db_low_byte_first)
  3407. tmp=sint2korr(pos);
  3408.       else
  3409. #endif
  3410. shortget(tmp,pos);
  3411.       return (ulong) tmp;
  3412.     }
  3413.   case 3:
  3414.     return (ulong) uint3korr(pos);
  3415.   case 4:
  3416.     {
  3417.       uint32 tmp;
  3418. #ifdef WORDS_BIGENDIAN
  3419.       if (table->db_low_byte_first)
  3420. tmp=uint4korr(pos);
  3421.       else
  3422. #endif
  3423. longget(tmp,pos);
  3424.       return (ulong) tmp;
  3425.     }
  3426.   }
  3427.   return 0; // Impossible
  3428. }
  3429. void Field_blob::store(const char *from,uint len)
  3430. {
  3431.   if (!len)
  3432.   {
  3433.     bzero(ptr,Field_blob::pack_length());
  3434.   }
  3435.   else
  3436.   {
  3437. #ifdef USE_TIS620
  3438.     char *th_ptr=0;
  3439. #endif
  3440.     Field_blob::store_length(len);
  3441.     if (table->copy_blobs || len <= MAX_FIELD_WIDTH)
  3442.     { // Must make a copy
  3443. #ifdef USE_TIS620
  3444.       if(!binary_flag)
  3445.       {
  3446. /* If there isn't enough memory, use original string */
  3447. if ((th_ptr=(char * ) my_malloc(sizeof(char) * len,MYF(0))))
  3448. {
  3449.   ThNormalize((uchar *) th_ptr, len, (uchar *) from, len);
  3450.   from= (const char*) th_ptr;
  3451. }
  3452.       }
  3453. #endif /* USE_TIS620 */
  3454.       value.copy(from,len);
  3455.       from=value.ptr();
  3456. #ifdef USE_TIS620
  3457.       my_free(th_ptr,MYF(MY_ALLOW_ZERO_PTR));
  3458. #endif
  3459.     }
  3460.     bmove(ptr+packlength,(char*) &from,sizeof(char*));
  3461.   }
  3462. }
  3463. void Field_blob::store(double nr)
  3464. {
  3465.   value.set(nr);
  3466.   Field_blob::store(value.ptr(),value.length());
  3467. }
  3468. void Field_blob::store(longlong nr)
  3469. {
  3470.   value.set(nr);
  3471.   Field_blob::store(value.ptr(),value.length());
  3472. }
  3473. double Field_blob::val_real(void)
  3474. {
  3475.   char *blob;
  3476.   memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
  3477.   if (!blob)
  3478.     return 0.0;
  3479.   ulong length=get_length(ptr);
  3480.   char save=blob[length]; // Ok to patch blob in NISAM
  3481.   blob[length]=0;
  3482.   double nr=atof(blob);
  3483.   blob[length]=save;
  3484.   return nr;
  3485. }
  3486. longlong Field_blob::val_int(void)
  3487. {
  3488.   char *blob;
  3489.   memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
  3490.   if (!blob)
  3491.     return 0;
  3492.   ulong length=get_length(ptr);
  3493.   char save=blob[length]; // Ok to patch blob in NISAM
  3494.   blob[length]=0;
  3495.   longlong nr=strtoll(blob,NULL,10);
  3496.   blob[length]=save;
  3497.   return nr;
  3498. }
  3499. String *Field_blob::val_str(String *val_buffer __attribute__((unused)),
  3500.     String *val_ptr)
  3501. {
  3502.   char *blob;
  3503.   memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
  3504.   if (!blob)
  3505.     val_ptr->length(0);
  3506.   else
  3507.     val_ptr->set((const char*) blob,get_length(ptr));
  3508.   return val_ptr;
  3509. }
  3510. int Field_blob::cmp(const char *a,ulong a_length, const char *b,
  3511.     ulong b_length)
  3512. {
  3513.   int diff;
  3514.   if (binary_flag)
  3515.     diff=memcmp(a,b,min(a_length,b_length));
  3516.   else
  3517.     diff=my_sortcmp(a,b,min(a_length,b_length));
  3518.   return diff ? diff : (int) (a_length - b_length);
  3519. }
  3520. int Field_blob::cmp(const char *a_ptr, const char *b_ptr)
  3521. {
  3522.   char *blob1,*blob2;
  3523.   memcpy_fixed(&blob1,a_ptr+packlength,sizeof(char*));
  3524.   memcpy_fixed(&blob2,b_ptr+packlength,sizeof(char*));
  3525.   return Field_blob::cmp(blob1,get_length(a_ptr),
  3526.  blob2,get_length(b_ptr));
  3527. }
  3528. int Field_blob::cmp_offset(uint row_offset)
  3529. {
  3530.   return Field_blob::cmp(ptr,ptr+row_offset);
  3531. }
  3532. int Field_blob::cmp_binary_offset(uint row_offset)
  3533. {
  3534.   return cmp_binary(ptr, ptr+row_offset);
  3535. }
  3536. int Field_blob::cmp_binary(const char *a_ptr, const char *b_ptr,
  3537.    ulong max_length)
  3538. {
  3539.   char *a,*b;
  3540.   uint diff;
  3541.   ulong a_length,b_length;
  3542.   memcpy_fixed(&a,a_ptr+packlength,sizeof(char*));
  3543.   memcpy_fixed(&b,b_ptr+packlength,sizeof(char*));
  3544.   a_length=get_length(a_ptr);
  3545.   if (a_length > max_length)
  3546.     a_length=max_length;
  3547.   b_length=get_length(b_ptr);
  3548.   if (b_length > max_length)
  3549.     b_length=max_length;
  3550.   diff=memcmp(a,b,min(a_length,b_length));
  3551.   return diff ? diff : (int) (a_length - b_length);
  3552. }
  3553. /* The following is used only when comparing a key */
  3554. void Field_blob::get_key_image(char *buff,uint length)
  3555. {
  3556.   length-=HA_KEY_BLOB_LENGTH;
  3557.   ulong blob_length=get_length(ptr);
  3558.   char *blob;
  3559.   if ((ulong) length > blob_length)
  3560.   {
  3561. #ifdef HAVE_purify
  3562.     bzero(buff+2+blob_length, (length-blob_length));
  3563. #endif
  3564.     length=(uint) blob_length;
  3565.   }
  3566.   int2store(buff,length);
  3567.   get_ptr(&blob);
  3568.   memcpy(buff+2,blob,length);
  3569. }
  3570. void Field_blob::set_key_image(char *buff,uint length)
  3571. {
  3572.   length=uint2korr(buff);
  3573.   Field_blob::store(buff+2,length);
  3574. }
  3575. int Field_blob::key_cmp(const byte *key_ptr, uint max_key_length)
  3576. {
  3577.   char *blob1;
  3578.   uint blob_length=get_length(ptr);
  3579.   max_key_length-=2;
  3580.   memcpy_fixed(&blob1,ptr+packlength,sizeof(char*));
  3581.   return Field_blob::cmp(blob1,min(blob_length, max_key_length),
  3582.  (char*) key_ptr+2,uint2korr(key_ptr));
  3583. }
  3584. int Field_blob::key_cmp(const byte *a,const byte *b)
  3585. {
  3586.   return Field_blob::cmp((char*) a+2,uint2korr(a),
  3587.  (char*) b+2,uint2korr(b));
  3588. }
  3589. void Field_blob::sort_string(char *to,uint length)
  3590. {
  3591.   char *blob;
  3592.   uint blob_length=get_length();
  3593. #ifdef USE_STRCOLL
  3594.   uint blob_org_length=blob_length;
  3595. #endif
  3596.   if (!blob_length)
  3597.     bzero(to,length);
  3598.   else
  3599.   {
  3600.     if (blob_length > length)
  3601.       blob_length=length;
  3602.     memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
  3603.     if (binary_flag)
  3604.     {
  3605.       memcpy(to,blob,blob_length);
  3606.       to+=blob_length;
  3607.     }
  3608.     else
  3609.     {
  3610. #ifdef USE_STRCOLL
  3611.       if (use_strcoll(default_charset_info))
  3612.       {
  3613.         blob_length=my_strnxfrm(default_charset_info,
  3614.                                 (unsigned char *)to,(unsigned char *)blob,
  3615.                                 length,blob_org_length);
  3616.         if (blob_length >= length)
  3617.           return;
  3618.         to+=blob_length;
  3619.       }
  3620.       else
  3621. #endif
  3622.         for (char *end=blob+blob_length ; blob != end ;)
  3623.           *to++=(char) my_sort_order[(uint) (uchar) *blob++];
  3624.     }
  3625.     bzero(to,length-blob_length);
  3626.   }
  3627. }
  3628. void Field_blob::sql_type(String &res) const
  3629. {
  3630.   const char *str;
  3631.   switch (packlength) {
  3632.   default: str="tiny"; break;
  3633.   case 2:  str=""; break;
  3634.   case 3:  str="medium"; break;
  3635.   case 4:  str="long"; break;
  3636.   }
  3637.   res.set(str,(uint) strlen(str));
  3638.   res.append(binary_flag ? "blob" : "text");
  3639. }
  3640. char *Field_blob::pack(char *to, const char *from, uint max_length)
  3641. {
  3642.   char *save=ptr;
  3643.   ptr=(char*) from;
  3644.   ulong length=get_length(); // Length of from string
  3645.   if (length > max_length)
  3646.   {
  3647.     ptr=to;
  3648.     length=max_length;
  3649.     store_length(length); // Store max length
  3650.     ptr=(char*) from;
  3651.   }
  3652.   else
  3653.     memcpy(to,from,packlength); // Copy length
  3654.   if (length)
  3655.   {
  3656.     get_ptr((char**) &from);
  3657.     memcpy(to+packlength, from,length);
  3658.   }
  3659.   ptr=save; // Restore org row pointer
  3660.   return to+packlength+length;
  3661. }
  3662. const char *Field_blob::unpack(char *to, const char *from)
  3663. {
  3664.   memcpy(to,from,packlength);
  3665.   ulong length=get_length(from);
  3666.   from+=packlength;
  3667.   if (length)
  3668.     memcpy_fixed(to+packlength, &from, sizeof(from));
  3669.   else
  3670.     bzero(to+packlength,sizeof(from));
  3671.   return from+length;
  3672. }
  3673. /* Keys for blobs are like keys on varchars */
  3674. int Field_blob::pack_cmp(const char *a, const char *b, uint key_length)
  3675. {
  3676.   uint a_length;
  3677.   uint b_length;
  3678.   if (key_length > 255)
  3679.   {
  3680.     a_length=uint2korr(a); a+=2;
  3681.     b_length=uint2korr(b); b+=2;
  3682.   }
  3683.   else
  3684.   {
  3685.     a_length= (uint) (uchar) *a++;
  3686.     b_length= (uint) (uchar) *b++;
  3687.   }
  3688.   if (binary_flag)
  3689.   {
  3690.     int cmp= memcmp(a,b,min(a_length,b_length));
  3691.     return cmp ? cmp : (int) (a_length - b_length);
  3692.   }
  3693.   return my_sortncmp(a,a_length, b,b_length);
  3694. }
  3695. int Field_blob::pack_cmp(const char *b, uint key_length)
  3696. {
  3697.   char *a;
  3698.   memcpy_fixed(&a,ptr+packlength,sizeof(char*));
  3699.   if (!a)
  3700.     return key_length > 0 ? -1 : 0;
  3701.   uint a_length=get_length(ptr);
  3702.   uint b_length;
  3703.   if (key_length > 255)
  3704.   {
  3705.     b_length=uint2korr(b); b+=2;
  3706.   }
  3707.   else
  3708.   {
  3709.     b_length= (uint) (uchar) *b++;
  3710.   }
  3711.   if (binary_flag)
  3712.   {
  3713.     int cmp= memcmp(a,b,min(a_length,b_length));
  3714.     return cmp ? cmp : (int) (a_length - b_length);
  3715.   }
  3716.   return my_sortncmp(a,a_length, b,b_length);
  3717. }
  3718. /* Create a packed key that will be used for storage from a MySQL row */
  3719. char *Field_blob::pack_key(char *to, const char *from, uint max_length)
  3720. {
  3721.   char *save=ptr;
  3722.   ptr=(char*) from;
  3723.   ulong length=get_length(); // Length of from string
  3724.   if (length > max_length)
  3725.     length=max_length;
  3726.   *to++= (uchar) length;
  3727.   if (max_length > 255) // 2 byte length
  3728.     *to++= (uchar) (length >> 8);
  3729.   if (length)
  3730.   {
  3731.     get_ptr((char**) &from);
  3732.     memcpy(to, from, length);
  3733.   }
  3734.   ptr=save; // Restore org row pointer
  3735.   return to+length;
  3736. }
  3737. /* Create a packed key that will be used for storage from a MySQL key */
  3738. char *Field_blob::pack_key_from_key_image(char *to, const char *from,
  3739.   uint max_length)
  3740. {
  3741.   uint length=uint2korr(from);
  3742.   if (length > max_length)
  3743.     length=max_length;
  3744.   *to++= (length & 255);
  3745.   if (max_length > 255)
  3746.     *to++= (uchar) (length >> 8);
  3747.   if (length)
  3748.     memcpy(to, from+2, length);
  3749.   return to+length;
  3750. }
  3751. /****************************************************************************
  3752. ** enum type.
  3753. ** This is a string which only can have a selection of different values.
  3754. ** If one uses this string in a number context one gets the type number.
  3755. ****************************************************************************/
  3756. enum ha_base_keytype Field_enum::key_type() const
  3757. {
  3758.   switch (packlength) {
  3759.   default: return HA_KEYTYPE_BINARY;
  3760.   case 2: return HA_KEYTYPE_USHORT_INT;
  3761.   case 3: return HA_KEYTYPE_UINT24;
  3762.   case 4: return HA_KEYTYPE_ULONG_INT;
  3763.   case 8: return HA_KEYTYPE_ULONGLONG;
  3764.   }
  3765. }
  3766. void Field_enum::store_type(ulonglong value)
  3767. {
  3768.   switch (packlength) {
  3769.   case 1: ptr[0]= (uchar) value;  break;
  3770.   case 2:
  3771. #ifdef WORDS_BIGENDIAN
  3772.   if (table->db_low_byte_first)
  3773.   {
  3774.     int2store(ptr,(unsigned short) value);
  3775.   }
  3776.   else
  3777. #endif
  3778.     shortstore(ptr,(unsigned short) value);
  3779.   break;
  3780.   case 3: int3store(ptr,(long) value); break;
  3781.   case 4:
  3782. #ifdef WORDS_BIGENDIAN
  3783.   if (table->db_low_byte_first)
  3784.   {
  3785.     int4store(ptr,value);
  3786.   }
  3787.   else
  3788. #endif
  3789.     longstore(ptr,(long) value);
  3790.   break;
  3791.   case 8:
  3792. #ifdef WORDS_BIGENDIAN
  3793.   if (table->db_low_byte_first)
  3794.   {
  3795.     int8store(ptr,value);
  3796.   }
  3797.   else
  3798. #endif
  3799.     longlongstore(ptr,value); break;
  3800.   }
  3801. }
  3802. uint find_enum(TYPELIB *lib,const char *x, uint length)
  3803. {
  3804.   const char *end=x+length;
  3805.   while (end > x && isspace(end[-1]))
  3806.     end--;
  3807.   const char *i;
  3808.   const char *j;
  3809.   for (uint pos=0 ; (j=lib->type_names[pos]) ; pos++)
  3810.   {
  3811.     for (i=x ; i != end && toupper(*i) == toupper(*j) ; i++, j++) ;
  3812.     if (i == end && ! *j)
  3813.       return(pos+1);
  3814.   }
  3815.   return(0);
  3816. }
  3817. /*
  3818. ** Note. Storing a empty string in a enum field gives a warning
  3819. ** (if there isn't a empty value in the enum)
  3820. */
  3821. void Field_enum::store(const char *from,uint length)
  3822. {
  3823.   uint tmp=find_enum(typelib,from,length);
  3824.   if (!tmp)
  3825.   {
  3826.     if (length < 6) // Can't be more than 99999 enums
  3827.     {
  3828.       /* This is for reading numbers with LOAD DATA INFILE */
  3829.       char buff[7], *end;
  3830.       const char *conv=from;
  3831.       if (from[length])
  3832.       {
  3833. strmake(buff, from, length);
  3834. conv=buff;
  3835.       }
  3836.       my_errno=0;
  3837.       tmp=strtoul(conv,&end,10);
  3838.       if (my_errno || end != conv+length || tmp > typelib->count)
  3839.       {
  3840. tmp=0;
  3841. current_thd->cuted_fields++;
  3842.       }
  3843.     }
  3844.     else
  3845.       current_thd->cuted_fields++;
  3846.   }
  3847.   store_type((ulonglong) tmp);
  3848. }
  3849. void Field_enum::store(double nr)
  3850. {
  3851.   Field_enum::store((longlong) nr);
  3852. }
  3853. void Field_enum::store(longlong nr)
  3854. {
  3855.   if ((uint) nr > typelib->count || nr == 0)
  3856.   {
  3857.     current_thd->cuted_fields++;
  3858.     nr=0;
  3859.   }
  3860.   store_type((ulonglong) (uint) nr);
  3861. }
  3862. double Field_enum::val_real(void)
  3863. {
  3864.   return (double) Field_enum::val_int();
  3865. }
  3866. longlong Field_enum::val_int(void)
  3867. {
  3868.   switch (packlength) {
  3869.   case 1:
  3870.     return (longlong) (uchar) ptr[0];
  3871.   case 2:
  3872.     {
  3873.       uint16 tmp;
  3874. #ifdef WORDS_BIGENDIAN
  3875.       if (table->db_low_byte_first)
  3876. tmp=sint2korr(ptr);
  3877.       else
  3878. #endif
  3879. shortget(tmp,ptr);
  3880.       return (longlong) tmp;
  3881.     }
  3882.   case 3:
  3883.     return (longlong) uint3korr(ptr);
  3884.   case 4:
  3885.     {
  3886.       uint32 tmp;
  3887. #ifdef WORDS_BIGENDIAN
  3888.       if (table->db_low_byte_first)
  3889. tmp=uint4korr(ptr);
  3890.       else
  3891. #endif
  3892. longget(tmp,ptr);
  3893.       return (longlong) tmp;
  3894.     }
  3895.   case 8:
  3896.     {
  3897.       longlong tmp;
  3898. #ifdef WORDS_BIGENDIAN
  3899.       if (table->db_low_byte_first)
  3900. tmp=sint8korr(ptr);
  3901.       else
  3902. #endif
  3903. longlongget(tmp,ptr);
  3904.       return tmp;
  3905.     }
  3906.   }
  3907.   return 0; // impossible
  3908. }
  3909. String *Field_enum::val_str(String *val_buffer __attribute__((unused)),
  3910.     String *val_ptr)
  3911. {
  3912.   uint tmp=(uint) Field_enum::val_int();
  3913.   if (!tmp || tmp > typelib->count)
  3914.     val_ptr->length(0);
  3915.   else
  3916.     val_ptr->set((const char*) typelib->type_names[tmp-1],
  3917.  (uint) strlen(typelib->type_names[tmp-1]));
  3918.   return val_ptr;
  3919. }
  3920. int Field_enum::cmp(const char *a_ptr, const char *b_ptr)
  3921. {
  3922.   char *old=ptr;
  3923.   ptr=(char*) a_ptr;
  3924.   ulonglong a=Field_enum::val_int();
  3925.   ptr=(char*) b_ptr;
  3926.   ulonglong b=Field_enum::val_int();
  3927.   ptr=old;
  3928.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  3929. }
  3930. void Field_enum::sort_string(char *to,uint length __attribute__((unused)))
  3931. {
  3932.   ulonglong value=Field_enum::val_int();
  3933.   to+=packlength-1;
  3934.   for (uint i=0 ; i < packlength ; i++)
  3935.   {
  3936.     *to-- = (uchar) (value & 255);
  3937.     value>>=8;
  3938.   }
  3939. }
  3940. void Field_enum::sql_type(String &res) const
  3941. {
  3942.   res.length(0);
  3943.   res.append("enum(");
  3944.   bool flag=0;
  3945.   for (const char **pos=typelib->type_names; *pos ; pos++)
  3946.   {
  3947.     if (flag)
  3948.       res.append(',');
  3949.     res.append(''');
  3950.     append_unescaped(&res,*pos);
  3951.     res.append(''');
  3952.     flag=1;
  3953.   }
  3954.   res.append(')');
  3955. }
  3956. /****************************************************************************
  3957. ** set type.
  3958. ** This is a string which can have a collection of different values.
  3959. ** Each string value is separated with a ','.
  3960. ** For example "One,two,five"
  3961. ** If one uses this string in a number context one gets the bits as a longlong
  3962. ** number.
  3963. ****************************************************************************/
  3964. ulonglong find_set(TYPELIB *lib,const char *x,uint length)
  3965. {
  3966.   const char *end=x+length;
  3967.   while (end > x && isspace(end[-1]))
  3968.     end--;
  3969.   ulonglong found=0;
  3970.   if (x != end)
  3971.   {
  3972.     const char *start=x;
  3973.     bool error=0;
  3974.     for (;;)
  3975.     {
  3976.       const char *pos=start;
  3977.       for ( ; pos != end && *pos != field_separator ; pos++) ;
  3978.       uint find=find_enum(lib,start,(uint) (pos-start));
  3979.       if (!find)
  3980. error=1;
  3981.       else
  3982. found|= ((longlong) 1 << (find-1));
  3983.       if (pos == end)
  3984. break;
  3985.       start=pos+1;
  3986.     }
  3987.     if (error)
  3988.       current_thd->cuted_fields++;
  3989.   }
  3990.   return found;
  3991. }
  3992. void Field_set::store(const char *from,uint length)
  3993. {
  3994.   ulonglong tmp=find_set(typelib,from,length);
  3995.   if (!tmp && length && length < 22)
  3996.   {
  3997.     /* This is for reading numbers with LOAD DATA INFILE */
  3998.     char buff[22], *end;
  3999.     const char *conv=from;
  4000.     if (from[length])
  4001.     {
  4002.       strmake(buff, from, length);
  4003.       conv=buff;
  4004.     }
  4005.     my_errno=0;
  4006.     tmp=strtoull(conv,&end,10);
  4007.     if (my_errno || end != conv+length ||
  4008. tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1))
  4009.       tmp=0;
  4010.     else
  4011.       current_thd->cuted_fields--; // Remove warning from find_set
  4012.   }
  4013.   store_type(tmp);
  4014. }
  4015. void Field_set::store(longlong nr)
  4016. {
  4017.   if ((ulonglong) nr > (ulonglong) (((longlong) 1 << typelib->count) -
  4018.     (longlong) 1))
  4019.   {
  4020.     nr&= (longlong) (((longlong) 1 << typelib->count) - (longlong) 1);
  4021.     current_thd->cuted_fields++;
  4022.   }
  4023.   store_type((ulonglong) nr);
  4024. }
  4025. String *Field_set::val_str(String *val_buffer,
  4026.    String *val_ptr __attribute__((unused)))
  4027. {
  4028.   ulonglong tmp=(ulonglong) Field_enum::val_int();
  4029.   uint bitnr=0;
  4030.   val_buffer->length(0);
  4031.   while (tmp && bitnr < (uint) typelib->count)
  4032.   {
  4033.     if (tmp & 1)
  4034.     {
  4035.       if (val_buffer->length())
  4036. val_buffer->append(field_separator);
  4037.       String str(typelib->type_names[bitnr],
  4038.  (uint) strlen(typelib->type_names[bitnr]));
  4039.       val_buffer->append(str);
  4040.     }
  4041.     tmp>>=1;
  4042.     bitnr++;
  4043.   }
  4044.   return val_buffer;
  4045. }
  4046. void Field_set::sql_type(String &res) const
  4047. {
  4048.   res.length(0);
  4049.   res.append("set(");
  4050.   bool flag=0;
  4051.   for (const char **pos=typelib->type_names; *pos ; pos++)
  4052.   {
  4053.     if (flag)
  4054.       res.append(',');
  4055.     res.append(''');
  4056.     append_unescaped(&res,*pos);
  4057.     res.append(''');
  4058.     flag=1;
  4059.   }
  4060.   res.append(')');
  4061. }
  4062. /* returns 1 if the fields are equally defined */
  4063. bool Field::eq_def(Field *field)
  4064. {
  4065.   if (real_type() != field->real_type() || binary() != field->binary() ||
  4066.       pack_length() != field->pack_length())
  4067.     return 0;
  4068.   return 1;
  4069. }
  4070. bool Field_enum::eq_def(Field *field)
  4071. {
  4072.   if (!Field::eq_def(field))
  4073.     return 0;
  4074.   TYPELIB *from_lib=((Field_enum*) field)->typelib;
  4075.   
  4076.   if (typelib->count < from_lib->count)
  4077.     return 0;
  4078.   for (uint i=0 ; i < from_lib->count ; i++)
  4079.     if (my_strcasecmp(typelib->type_names[i],from_lib->type_names[i]))
  4080.       return 0;
  4081.   return 1;
  4082. }
  4083. bool Field_num::eq_def(Field *field)
  4084. {  
  4085.   if (!Field::eq_def(field))
  4086.     return 0;
  4087.   Field_num *from_num= (Field_num*) field;
  4088.   if (unsigned_flag != from_num->unsigned_flag ||
  4089.       zerofill && !from_num->zerofill && !zero_pack() ||
  4090.       dec != from_num->dec)
  4091.     return 0;
  4092.   return 1;
  4093. }
  4094. /*****************************************************************************
  4095. ** Handling of field and create_field
  4096. *****************************************************************************/
  4097. /*
  4098. ** Make a field from the .frm file info
  4099. */
  4100. uint32 calc_pack_length(enum_field_types type,uint32 length)
  4101. {
  4102.   switch (type) {
  4103.   case FIELD_TYPE_STRING:
  4104.   case FIELD_TYPE_DECIMAL: return (length);
  4105.   case FIELD_TYPE_VAR_STRING: return (length+2);
  4106.   case FIELD_TYPE_YEAR:
  4107.   case FIELD_TYPE_TINY : return 1;
  4108.   case FIELD_TYPE_SHORT : return 2;
  4109.   case FIELD_TYPE_INT24:
  4110.   case FIELD_TYPE_NEWDATE:
  4111.   case FIELD_TYPE_TIME:   return 3;
  4112.   case FIELD_TYPE_TIMESTAMP:
  4113.   case FIELD_TYPE_DATE:
  4114.   case FIELD_TYPE_LONG : return 4;
  4115.   case FIELD_TYPE_FLOAT : return sizeof(float);
  4116.   case FIELD_TYPE_DOUBLE: return sizeof(double);
  4117.   case FIELD_TYPE_DATETIME:
  4118.   case FIELD_TYPE_LONGLONG: return 8; /* Don't crash if no longlong */
  4119.   case FIELD_TYPE_NULL : return 0;
  4120.   case FIELD_TYPE_TINY_BLOB: return 1+portable_sizeof_char_ptr;
  4121.   case FIELD_TYPE_BLOB: return 2+portable_sizeof_char_ptr;
  4122.   case FIELD_TYPE_MEDIUM_BLOB: return 3+portable_sizeof_char_ptr;
  4123.   case FIELD_TYPE_LONG_BLOB: return 4+portable_sizeof_char_ptr;
  4124.   case FIELD_TYPE_SET:
  4125.   case FIELD_TYPE_ENUM: abort(); return 0; // This shouldn't happen
  4126.   }
  4127.   return 0; // This shouldn't happen
  4128. }
  4129. uint pack_length_to_packflag(uint type)
  4130. {
  4131.   switch (type) {
  4132.     case 1: return f_settype((uint) FIELD_TYPE_TINY);
  4133.     case 2: return f_settype((uint) FIELD_TYPE_SHORT);
  4134.     case 3: return f_settype((uint) FIELD_TYPE_INT24);
  4135.     case 4: return f_settype((uint) FIELD_TYPE_LONG);
  4136.     case 8: return f_settype((uint) FIELD_TYPE_LONGLONG);
  4137.   }
  4138.   return 0; // This shouldn't happen
  4139. }
  4140. Field *make_field(char *ptr, uint32 field_length,
  4141.   uchar *null_pos, uint null_bit,
  4142.   uint pack_flag,
  4143.   Field::utype unireg_check,
  4144.   TYPELIB *interval,
  4145.   const char *field_name,
  4146.   struct st_table *table)
  4147. {
  4148.   if (!f_maybe_null(pack_flag))
  4149.   {
  4150.     null_pos=0;
  4151.     null_bit=0;
  4152.   }
  4153.   if (f_is_alpha(pack_flag))
  4154.   {
  4155.     if (!f_is_packed(pack_flag))
  4156.       return new Field_string(ptr,field_length,null_pos,null_bit,
  4157.       unireg_check, field_name, table,
  4158.       f_is_binary(pack_flag) != 0);
  4159.     uint pack_length=calc_pack_length((enum_field_types)
  4160.       f_packtype(pack_flag),
  4161.       field_length);
  4162.     if (f_is_blob(pack_flag))
  4163.       return new Field_blob(ptr,null_pos,null_bit,
  4164.     unireg_check, field_name, table,
  4165.     pack_length,f_is_binary(pack_flag) != 0);
  4166.     if (interval)
  4167.     {
  4168.       if (f_is_enum(pack_flag))
  4169. return new Field_enum(ptr,field_length,null_pos,null_bit,
  4170.   unireg_check, field_name, table,
  4171.   pack_length, interval);
  4172.       else
  4173. return new Field_set(ptr,field_length,null_pos,null_bit,
  4174.      unireg_check, field_name, table,
  4175.      pack_length, interval);
  4176.     }
  4177.   }
  4178.   switch ((enum enum_field_types) f_packtype(pack_flag)) {
  4179.   case FIELD_TYPE_DECIMAL:
  4180.     return new Field_decimal(ptr,field_length,null_pos,null_bit,
  4181.      unireg_check, field_name, table,
  4182.      f_decimals(pack_flag),
  4183.      f_is_zerofill(pack_flag) != 0,
  4184.      f_is_dec(pack_flag) == 0);
  4185.   case FIELD_TYPE_FLOAT:
  4186.     return new Field_float(ptr,field_length,null_pos,null_bit,
  4187.    unireg_check, field_name, table,
  4188.    f_decimals(pack_flag),
  4189.    f_is_zerofill(pack_flag) != 0,
  4190.    f_is_dec(pack_flag)== 0);
  4191.   case FIELD_TYPE_DOUBLE:
  4192.     return new Field_double(ptr,field_length,null_pos,null_bit,
  4193.     unireg_check, field_name, table,
  4194.     f_decimals(pack_flag),
  4195.     f_is_zerofill(pack_flag) != 0,
  4196.     f_is_dec(pack_flag)== 0);
  4197.   case FIELD_TYPE_TINY:
  4198.     return new Field_tiny(ptr,field_length,null_pos,null_bit,
  4199.   unireg_check, field_name, table,
  4200.   f_is_zerofill(pack_flag) != 0,
  4201.   f_is_dec(pack_flag) == 0);
  4202.   case FIELD_TYPE_SHORT:
  4203.     return new Field_short(ptr,field_length,null_pos,null_bit,
  4204.    unireg_check, field_name, table,
  4205.    f_is_zerofill(pack_flag) != 0,
  4206.    f_is_dec(pack_flag) == 0);
  4207.   case FIELD_TYPE_INT24:
  4208.     return new Field_medium(ptr,field_length,null_pos,null_bit,
  4209.     unireg_check, field_name, table,
  4210.     f_is_zerofill(pack_flag) != 0,
  4211.     f_is_dec(pack_flag) == 0);
  4212.   case FIELD_TYPE_LONG:
  4213.     return new Field_long(ptr,field_length,null_pos,null_bit,
  4214.    unireg_check, field_name, table,
  4215.    f_is_zerofill(pack_flag) != 0,
  4216.    f_is_dec(pack_flag) == 0);
  4217.   case FIELD_TYPE_LONGLONG:
  4218.     return new Field_longlong(ptr,field_length,null_pos,null_bit,
  4219.       unireg_check, field_name, table,
  4220.       f_is_zerofill(pack_flag) != 0,
  4221.       f_is_dec(pack_flag) == 0);
  4222.   case FIELD_TYPE_TIMESTAMP:
  4223.     return new Field_timestamp(ptr,field_length,
  4224.        unireg_check, field_name, table);
  4225.   case FIELD_TYPE_YEAR:
  4226.     return new Field_year(ptr,field_length,null_pos,null_bit,
  4227.   unireg_check, field_name, table);
  4228.   case FIELD_TYPE_DATE:
  4229.     return new Field_date(ptr,null_pos,null_bit,
  4230.   unireg_check, field_name, table);
  4231.   case FIELD_TYPE_NEWDATE:
  4232.     return new Field_newdate(ptr,null_pos,null_bit,
  4233.      unireg_check, field_name, table);
  4234.   case FIELD_TYPE_TIME:
  4235.     return new Field_time(ptr,null_pos,null_bit,
  4236.   unireg_check, field_name, table);
  4237.   case FIELD_TYPE_DATETIME:
  4238.     return new Field_datetime(ptr,null_pos,null_bit,
  4239.       unireg_check, field_name, table);
  4240.   case FIELD_TYPE_NULL:
  4241.     default: // Impossible (Wrong version)
  4242.     return new Field_null(ptr,field_length,unireg_check,field_name,table);
  4243.   }
  4244.   return 0; // Impossible (Wrong version)
  4245. }
  4246. /* Create a field suitable for create of table */
  4247. create_field::create_field(Field *old_field,Field *orig_field)
  4248. {
  4249.   field=      old_field;
  4250.   field_name=change=old_field->field_name;
  4251.   length=     old_field->field_length;
  4252.   flags=      old_field->flags;
  4253.   unireg_check=old_field->unireg_check;
  4254.   pack_length=old_field->pack_length();
  4255.   sql_type=   old_field->real_type();
  4256.   /* Fix if the original table had 4 byte pointer blobs */
  4257.   if (flags & BLOB_FLAG)
  4258.     pack_length= (pack_length- old_field->table->blob_ptr_size +
  4259.   portable_sizeof_char_ptr);
  4260.   decimals= old_field->decimals();
  4261.   if (sql_type == FIELD_TYPE_STRING)
  4262.   {
  4263.     sql_type=old_field->type();
  4264.     decimals=0;
  4265.   }
  4266.   if (flags & (ENUM_FLAG | SET_FLAG))
  4267.     interval= ((Field_enum*) old_field)->typelib;
  4268.   else
  4269.     interval=0;
  4270.   def=0;
  4271.   if (!old_field->is_real_null() && ! (flags & BLOB_FLAG) &&
  4272.       old_field->type() != FIELD_TYPE_TIMESTAMP && old_field->ptr &&
  4273.       orig_field)
  4274.   {
  4275.     char buff[MAX_FIELD_WIDTH],*pos;
  4276.     String tmp(buff,sizeof(buff));
  4277.     /* Get the value from record[2] (the default value row) */
  4278.     my_ptrdiff_t diff= (my_ptrdiff_t) (orig_field->table->rec_buff_length*2);
  4279.     orig_field->move_field(diff); // Points now at record[2]
  4280.     bool is_null=orig_field->is_real_null();
  4281.     orig_field->val_str(&tmp,&tmp);
  4282.     orig_field->move_field(-diff); // Back to record[0]
  4283.     if (!is_null)
  4284.     {
  4285.       pos= (char*) sql_memdup(tmp.ptr(),tmp.length()+1);
  4286.       pos[tmp.length()]=0;
  4287.       def=new Item_string(pos,tmp.length());
  4288.     }
  4289.   }
  4290. }