field.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:179k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1.   double a,b;
  2. #ifdef WORDS_BIGENDIAN
  3.   if (table->db_low_byte_first)
  4.   {
  5.     float8get(a,a_ptr);
  6.     float8get(b,b_ptr);
  7.   }
  8.   else
  9. #endif
  10.   {
  11.     doubleget(a, a_ptr);
  12.     doubleget(b, b_ptr);
  13.   }
  14.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  15. }
  16. #define DBL_EXP_DIG (sizeof(double)*8-DBL_MANT_DIG)
  17. /* The following should work for IEEE */
  18. void Field_double::sort_string(char *to,uint length __attribute__((unused)))
  19. {
  20.   double nr;
  21. #ifdef WORDS_BIGENDIAN
  22.   if (table->db_low_byte_first)
  23.   {
  24.     float8get(nr,ptr);
  25.   }
  26.   else
  27. #endif
  28.     doubleget(nr,ptr);
  29.   change_double_for_sort(nr, (byte*) to);
  30. }
  31. void Field_double::sql_type(String &res) const
  32. {
  33.   CHARSET_INFO *cs=res.charset();
  34.   if (dec == NOT_FIXED_DEC)
  35.   {
  36.     res.set_ascii("double",6);
  37.   }
  38.   else
  39.   {
  40.     res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
  41.     "double(%d,%d)",(int) field_length,dec));
  42.   }
  43.   add_zerofill_and_unsigned(res);
  44. }
  45. /*
  46.   TIMESTAMP type.
  47.   Holds datetime values in range from 1970-01-01 00:00:01 UTC to 
  48.   2038-01-01 00:00:00 UTC stored as number of seconds since Unix 
  49.   Epoch in UTC.
  50.   
  51.   Up to one of timestamps columns in the table can be automatically 
  52.   set on row update and/or have NOW() as default value.
  53.   TABLE::timestamp_field points to Field object for such timestamp with 
  54.   auto-set-on-update. TABLE::time_stamp holds offset in record + 1 for this
  55.   field, and is used by handler code which performs updates required.
  56.   
  57.   Actually SQL-99 says that we should allow niladic functions (like NOW())
  58.   as defaults for any field. Current limitations (only NOW() and only 
  59.   for one TIMESTAMP field) are because of restricted binary .frm format 
  60.   and should go away in the future.
  61.   
  62.   Also because of this limitation of binary .frm format we use 5 different
  63.   unireg_check values with TIMESTAMP field to distinguish various cases of
  64.   DEFAULT or ON UPDATE values. These values are:
  65.   
  66.   TIMESTAMP_OLD_FIELD - old timestamp, if there was not any fields with
  67.     auto-set-on-update (or now() as default) in this table before, then this 
  68.     field has NOW() as default and is updated when row changes, else it is 
  69.     field which has 0 as default value and is not automaitcally updated.
  70.   TIMESTAMP_DN_FIELD - field with NOW() as default but not set on update
  71.     automatically (TIMESTAMP DEFAULT NOW())
  72.   TIMESTAMP_UN_FIELD - field which is set on update automatically but has not 
  73.     NOW() as default (but it may has 0 or some other const timestamp as 
  74.     default) (TIMESTAMP ON UPDATE NOW()).
  75.   TIMESTAMP_DNUN_FIELD - field which has now() as default and is auto-set on 
  76.     update. (TIMESTAMP DEFAULT NOW() ON UPDATE NOW())
  77.   NONE - field which is not auto-set on update with some other than NOW() 
  78.     default value (TIMESTAMP DEFAULT 0).
  79.   Note that TIMESTAMP_OLD_FIELD's are never created explicitly now, they are 
  80.   left only for preserving ability to read old tables. Such fields replaced 
  81.   with their newer analogs in CREATE TABLE and in SHOW CREATE TABLE. This is 
  82.   because we want to prefer NONE unireg_check before TIMESTAMP_OLD_FIELD for 
  83.   "TIMESTAMP DEFAULT 'Const'" field. (Old timestamps allowed such 
  84.   specification too but ignored default value for first timestamp, which of 
  85.   course is non-standard.) In most cases user won't notice any change, only
  86.   exception is different behavior of old/new timestamps during ALTER TABLE.
  87.  */
  88. Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg,
  89.                                  uchar *null_ptr_arg, uchar null_bit_arg,
  90.  enum utype unireg_check_arg,
  91.  const char *field_name_arg,
  92.  struct st_table *table_arg,
  93.  CHARSET_INFO *cs)
  94.   :Field_str(ptr_arg, 19, null_ptr_arg, null_bit_arg,
  95.      unireg_check_arg, field_name_arg, table_arg, cs)
  96. {
  97.   /* For 4.0 MYD and 4.0 InnoDB compatibility */
  98.   flags|= ZEROFILL_FLAG | UNSIGNED_FLAG;
  99.   if (table && !table->timestamp_field && 
  100.       unireg_check != NONE)
  101.   {
  102.     /* This timestamp has auto-update */
  103.     table->timestamp_field= this;
  104.     flags|=TIMESTAMP_FLAG;
  105.   }
  106. }
  107. /*
  108.   Get auto-set type for TIMESTAMP field.
  109.   SYNOPSIS
  110.     get_auto_set_type()
  111.   DESCRIPTION
  112.     Returns value indicating during which operations this TIMESTAMP field
  113.     should be auto-set to current timestamp.
  114. */
  115. timestamp_auto_set_type Field_timestamp::get_auto_set_type() const
  116. {
  117.   switch (unireg_check)
  118.   {
  119.   case TIMESTAMP_DN_FIELD:
  120.     return TIMESTAMP_AUTO_SET_ON_INSERT;
  121.   case TIMESTAMP_UN_FIELD:
  122.     return TIMESTAMP_AUTO_SET_ON_UPDATE;
  123.   case TIMESTAMP_OLD_FIELD:
  124.     /*
  125.       Altough we can have several such columns in legacy tables this
  126.       function should be called only for first of them (i.e. the one
  127.       having auto-set property).
  128.     */
  129.     DBUG_ASSERT(table->timestamp_field == this);
  130.     /* Fall-through */
  131.   case TIMESTAMP_DNUN_FIELD:
  132.     return TIMESTAMP_AUTO_SET_ON_BOTH;
  133.   default:
  134.     /*
  135.       Normally this function should not be called for TIMESTAMPs without
  136.       auto-set property.
  137.     */
  138.     DBUG_ASSERT(0);
  139.     return TIMESTAMP_NO_AUTO_SET;
  140.   }
  141. }
  142. int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
  143. {
  144.   TIME l_time;
  145.   my_time_t tmp= 0;
  146.   int error;
  147.   bool have_smth_to_conv;
  148.   bool in_dst_time_gap;
  149.   THD *thd= table->in_use;
  150.   have_smth_to_conv= (str_to_datetime(from, len, &l_time, 0, &error) >
  151.                       MYSQL_TIMESTAMP_ERROR);
  152.   
  153.   if (error)
  154.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED,
  155.                          from, len, MYSQL_TIMESTAMP_DATETIME, 1);
  156.   if (have_smth_to_conv)
  157.   {
  158.     if (!(tmp= TIME_to_timestamp(thd, &l_time, &in_dst_time_gap)))
  159.     {
  160.       set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  161.                            ER_WARN_DATA_OUT_OF_RANGE,
  162.                            from, len, MYSQL_TIMESTAMP_DATETIME, !error);
  163.       
  164.       error= 1;
  165.     }
  166.     else if (in_dst_time_gap)
  167.     {
  168.       set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
  169.                            ER_WARN_INVALID_TIMESTAMP, 
  170.                            from, len, MYSQL_TIMESTAMP_DATETIME, !error);
  171.       error= 1;
  172.     }
  173.   }
  174.   if (error > 1)
  175.     error= 2;
  176. #ifdef WORDS_BIGENDIAN
  177.   if (table->db_low_byte_first)
  178.   {
  179.     int4store(ptr,tmp);
  180.   }
  181.   else
  182. #endif
  183.     longstore(ptr,tmp);
  184.   return error;
  185. }
  186. int Field_timestamp::store(double nr)
  187. {
  188.   int error= 0;
  189.   if (nr < 0 || nr > 99991231235959.0)
  190.   {
  191.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  192.                          ER_WARN_DATA_OUT_OF_RANGE, 
  193.                          nr, MYSQL_TIMESTAMP_DATETIME);
  194.     nr= 0; // Avoid overflow on buff
  195.     error= 1;
  196.   }
  197.   error|= Field_timestamp::store((longlong) rint(nr));
  198.   return error;
  199. }
  200. int Field_timestamp::store(longlong nr)
  201. {
  202.   TIME l_time;
  203.   my_time_t timestamp= 0;
  204.   int error;
  205.   bool in_dst_time_gap;
  206.   THD *thd= table->in_use;
  207.   if (number_to_TIME(nr, &l_time, 0, &error))
  208.   {
  209.     if (!(timestamp= TIME_to_timestamp(thd, &l_time, &in_dst_time_gap)))
  210.     {
  211.       set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  212.                           ER_WARN_DATA_OUT_OF_RANGE,
  213.                           nr, MYSQL_TIMESTAMP_DATETIME, 1);
  214.       error= 1;
  215.     }
  216.   
  217.     if (in_dst_time_gap)
  218.     {
  219.       set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
  220.                            ER_WARN_INVALID_TIMESTAMP, 
  221.                            nr, MYSQL_TIMESTAMP_DATETIME, !error);
  222.       error= 1;
  223.     }
  224.   }
  225.   else if (error)
  226.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  227.                          ER_WARN_DATA_TRUNCATED,
  228.                          nr, MYSQL_TIMESTAMP_DATETIME, 1);
  229. #ifdef WORDS_BIGENDIAN
  230.   if (table->db_low_byte_first)
  231.   {
  232.     int4store(ptr,timestamp);
  233.   }
  234.   else
  235. #endif
  236.     longstore(ptr,(uint32) timestamp);
  237.     
  238.   return error;
  239. }
  240. double Field_timestamp::val_real(void)
  241. {
  242.   return (double) Field_timestamp::val_int();
  243. }
  244. longlong Field_timestamp::val_int(void)
  245. {
  246.   uint32 temp;
  247.   TIME time_tmp;
  248.   THD  *thd= table->in_use;
  249. #ifdef WORDS_BIGENDIAN
  250.   if (table->db_low_byte_first)
  251.     temp=uint4korr(ptr);
  252.   else
  253. #endif
  254.     longget(temp,ptr);
  255.   if (temp == 0L) // No time
  256.     return(0); /* purecov: inspected */
  257.   
  258.   thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp, (my_time_t)temp);
  259.   thd->time_zone_used= 1;
  260.   
  261.   return time_tmp.year * LL(10000000000) + time_tmp.month * LL(100000000) +
  262.          time_tmp.day * 1000000L + time_tmp.hour * 10000L +
  263.          time_tmp.minute * 100 + time_tmp.second;
  264. }
  265. String *Field_timestamp::val_str(String *val_buffer, String *val_ptr)
  266. {
  267.   uint32 temp, temp2;
  268.   TIME time_tmp;
  269.   THD *thd= table->in_use;
  270.   char *to;
  271.   val_buffer->alloc(field_length+1);
  272.   to= (char*) val_buffer->ptr();
  273.   val_buffer->length(field_length);
  274. #ifdef WORDS_BIGENDIAN
  275.   if (table->db_low_byte_first)
  276.     temp=uint4korr(ptr);
  277.   else
  278. #endif
  279.     longget(temp,ptr);
  280.   if (temp == 0L)
  281.   {       /* Zero time is "000000" */
  282.     val_ptr->set("0000-00-00 00:00:00", 19, &my_charset_bin);
  283.     return val_ptr;
  284.   }
  285.   val_buffer->set_charset(&my_charset_bin); // Safety
  286.   
  287.   thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp,(my_time_t)temp);
  288.   thd->time_zone_used= 1;
  289.   temp= time_tmp.year % 100;
  290.   if (temp < YY_PART_YEAR)
  291.   {
  292.     *to++= '2';
  293.     *to++= '0';
  294.   }
  295.   else
  296.   {
  297.     *to++= '1';
  298.     *to++= '9';
  299.   }
  300.   temp2=temp/10; temp=temp-temp2*10;
  301.   *to++= (char) ('0'+(char) (temp2));
  302.   *to++= (char) ('0'+(char) (temp));
  303.   *to++= '-';
  304.   temp=time_tmp.month;
  305.   temp2=temp/10; temp=temp-temp2*10;
  306.   *to++= (char) ('0'+(char) (temp2));
  307.   *to++= (char) ('0'+(char) (temp));
  308.   *to++= '-';
  309.   temp=time_tmp.day;
  310.   temp2=temp/10; temp=temp-temp2*10;
  311.   *to++= (char) ('0'+(char) (temp2));
  312.   *to++= (char) ('0'+(char) (temp));
  313.   *to++= ' ';
  314.   temp=time_tmp.hour;
  315.   temp2=temp/10; temp=temp-temp2*10;
  316.   *to++= (char) ('0'+(char) (temp2));
  317.   *to++= (char) ('0'+(char) (temp));
  318.   *to++= ':';
  319.   temp=time_tmp.minute;
  320.   temp2=temp/10; temp=temp-temp2*10;
  321.   *to++= (char) ('0'+(char) (temp2));
  322.   *to++= (char) ('0'+(char) (temp));
  323.   *to++= ':';
  324.   temp=time_tmp.second;
  325.   temp2=temp/10; temp=temp-temp2*10;
  326.   *to++= (char) ('0'+(char) (temp2));
  327.   *to++= (char) ('0'+(char) (temp));
  328.   *to= 0;
  329.   return val_buffer;
  330. }
  331. bool Field_timestamp::get_date(TIME *ltime, uint fuzzydate)
  332. {
  333.   long temp;
  334.   THD *thd= table->in_use;
  335. #ifdef WORDS_BIGENDIAN
  336.   if (table->db_low_byte_first)
  337.     temp=uint4korr(ptr);
  338.   else
  339. #endif
  340.     longget(temp,ptr);
  341.   if (temp == 0L)
  342.   {       /* Zero time is "000000" */
  343.     if (!fuzzydate)
  344.       return 1;
  345.     bzero((char*) ltime,sizeof(*ltime));
  346.   }
  347.   else
  348.   {
  349.     thd->variables.time_zone->gmt_sec_to_TIME(ltime, (my_time_t)temp);
  350.     thd->time_zone_used= 1;
  351.   }
  352.   return 0;
  353. }
  354. bool Field_timestamp::get_time(TIME *ltime)
  355. {
  356.   return Field_timestamp::get_date(ltime,0);
  357. }
  358. bool Field_timestamp::send_binary(Protocol *protocol)
  359. {
  360.   TIME tm;
  361.   Field_timestamp::get_date(&tm, TIME_FUZZY_DATE);
  362.   return protocol->store(&tm);
  363. }
  364. int Field_timestamp::cmp(const char *a_ptr, const char *b_ptr)
  365. {
  366.   int32 a,b;
  367. #ifdef WORDS_BIGENDIAN
  368.   if (table->db_low_byte_first)
  369.   {
  370.     a=sint4korr(a_ptr);
  371.     b=sint4korr(b_ptr);
  372.   }
  373.   else
  374. #endif
  375.   {
  376.   longget(a,a_ptr);
  377.   longget(b,b_ptr);
  378.   }
  379.   return ((uint32) a < (uint32) b) ? -1 : ((uint32) a > (uint32) b) ? 1 : 0;
  380. }
  381. void Field_timestamp::sort_string(char *to,uint length __attribute__((unused)))
  382. {
  383. #ifdef WORDS_BIGENDIAN
  384.   if (!table->db_low_byte_first)
  385.   {
  386.     to[0] = ptr[0];
  387.     to[1] = ptr[1];
  388.     to[2] = ptr[2];
  389.     to[3] = ptr[3];
  390.   }
  391.   else
  392. #endif
  393.   {
  394.     to[0] = ptr[3];
  395.     to[1] = ptr[2];
  396.     to[2] = ptr[1];
  397.     to[3] = ptr[0];
  398.   }
  399. }
  400. void Field_timestamp::sql_type(String &res) const
  401. {
  402.   res.set_ascii("timestamp", 9);
  403. }
  404. void Field_timestamp::set_time()
  405. {
  406.   long tmp= (long) table->in_use->query_start();
  407.   set_notnull();
  408. #ifdef WORDS_BIGENDIAN
  409.   if (table->db_low_byte_first)
  410.   {
  411.     int4store(ptr,tmp);
  412.   }
  413.   else
  414. #endif
  415.     longstore(ptr,tmp);
  416. }
  417. /****************************************************************************
  418. ** time type
  419. ** In string context: HH:MM:SS
  420. ** In number context: HHMMSS
  421. ** Stored as a 3 byte unsigned int
  422. ****************************************************************************/
  423. int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
  424. {
  425.   TIME ltime;
  426.   long tmp;
  427.   int error;
  428.   if (str_to_time(from, len, &ltime, &error))
  429.   {
  430.     tmp=0L;
  431.     error= 2;
  432.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED,
  433.                          from, len, MYSQL_TIMESTAMP_TIME, 1);
  434.   }
  435.   else
  436.   {
  437.     if (error)
  438.       set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  439.                            ER_WARN_DATA_TRUNCATED,
  440.                            from, len, MYSQL_TIMESTAMP_TIME, 1);
  441.     if (ltime.month)
  442.       ltime.day=0;
  443.     tmp=(ltime.day*24L+ltime.hour)*10000L+(ltime.minute*100+ltime.second);
  444.     if (tmp > 8385959)
  445.     {
  446.       tmp=8385959;
  447.       set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  448.                            ER_WARN_DATA_OUT_OF_RANGE,
  449.                            from, len, MYSQL_TIMESTAMP_TIME, !error);
  450.       error= 1;
  451.     }
  452.     if (error > 1)
  453.       error= 2;
  454.   }
  455.   
  456.   if (ltime.neg)
  457.     tmp= -tmp;
  458.   error |= Field_time::store((longlong) tmp);
  459.   return error;
  460. }
  461. int Field_time::store(double nr)
  462. {
  463.   long tmp;
  464.   int error= 0;
  465.   if (nr > 8385959.0)
  466.   {
  467.     tmp=8385959L;
  468.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  469.                          ER_WARN_DATA_OUT_OF_RANGE, nr, MYSQL_TIMESTAMP_TIME);
  470.     error= 1;
  471.   }
  472.   else if (nr < -8385959.0)
  473.   {
  474.     tmp= -8385959L;
  475.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  476.                          ER_WARN_DATA_OUT_OF_RANGE, nr, MYSQL_TIMESTAMP_TIME);
  477.     error= 1;
  478.   }
  479.   else
  480.   {
  481.     tmp=(long) floor(fabs(nr)); // Remove fractions
  482.     if (nr < 0)
  483.       tmp= -tmp;
  484.     if (tmp % 100 > 59 || tmp/100 % 100 > 59)
  485.     {
  486.       tmp=0;
  487.       set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  488.                            ER_WARN_DATA_OUT_OF_RANGE, nr,
  489.                            MYSQL_TIMESTAMP_TIME);
  490.       error= 1;
  491.     }
  492.   }
  493.   int3store(ptr,tmp);
  494.   return error;
  495. }
  496. int Field_time::store(longlong nr)
  497. {
  498.   long tmp;
  499.   int error= 0;
  500.   if (nr > (longlong) 8385959L)
  501.   {
  502.     tmp=8385959L;
  503.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  504.                          ER_WARN_DATA_OUT_OF_RANGE, nr,
  505.                          MYSQL_TIMESTAMP_TIME, 1);
  506.     error= 1;
  507.   }
  508.   else if (nr < (longlong) -8385959L)
  509.   {
  510.     tmp= -8385959L;
  511.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  512.                          ER_WARN_DATA_OUT_OF_RANGE, nr,
  513.                          MYSQL_TIMESTAMP_TIME, 1);
  514.     error= 1;
  515.   }
  516.   else
  517.   {
  518.     tmp=(long) nr;
  519.     if (tmp % 100 > 59 || tmp/100 % 100 > 59)
  520.     {
  521.       tmp=0;
  522.       set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  523.                            ER_WARN_DATA_OUT_OF_RANGE, nr,
  524.                            MYSQL_TIMESTAMP_TIME, 1);
  525.       error= 1;
  526.     }
  527.   }
  528.   int3store(ptr,tmp);
  529.   return error;
  530. }
  531. double Field_time::val_real(void)
  532. {
  533.   uint32 j= (uint32) uint3korr(ptr);
  534.   return (double) j;
  535. }
  536. longlong Field_time::val_int(void)
  537. {
  538.   return (longlong) sint3korr(ptr);
  539. }
  540. /*
  541.   This function is multi-byte safe as the result string is always of type
  542.   my_charset_bin
  543. */
  544. String *Field_time::val_str(String *val_buffer,
  545.     String *val_ptr __attribute__((unused)))
  546. {
  547.   TIME ltime;
  548.   val_buffer->alloc(19);
  549.   long tmp=(long) sint3korr(ptr);
  550.   ltime.neg= 0;
  551.   if (tmp < 0)
  552.   {
  553.     tmp= -tmp;
  554.     ltime.neg= 1;
  555.   }
  556.   ltime.day= (uint) 0;
  557.   ltime.hour= (uint) (tmp/10000);
  558.   ltime.minute= (uint) (tmp/100 % 100);
  559.   ltime.second= (uint) (tmp % 100);
  560.   make_time((DATE_TIME_FORMAT*) 0, &ltime, val_buffer);
  561.   return val_buffer;
  562. }
  563. /*
  564.   Normally we would not consider 'time' as a vaild date, but we allow
  565.   get_date() here to be able to do things like
  566.   DATE_FORMAT(time, "%l.%i %p")
  567. */
  568.  
  569. bool Field_time::get_date(TIME *ltime, uint fuzzydate)
  570. {
  571.   long tmp;
  572.   if (!fuzzydate)
  573.   {
  574.     push_warning_printf(table->in_use, MYSQL_ERROR::WARN_LEVEL_WARN,
  575.                         ER_WARN_DATA_OUT_OF_RANGE,
  576.                         ER(ER_WARN_DATA_OUT_OF_RANGE), field_name,
  577.                         table->in_use->row_count);
  578.     return 1;
  579.   }
  580.   tmp=(long) sint3korr(ptr);
  581.   ltime->neg=0;
  582.   if (tmp < 0)
  583.   {
  584.     ltime->neg= 1;
  585.     tmp=-tmp;
  586.   }
  587.   ltime->hour=tmp/10000;
  588.   tmp-=ltime->hour*10000;
  589.   ltime->minute=   tmp/100;
  590.   ltime->second= tmp % 100;
  591.   ltime->year= ltime->month= ltime->day= ltime->second_part= 0;
  592.   return 0;
  593. }
  594. bool Field_time::get_time(TIME *ltime)
  595. {
  596.   long tmp=(long) sint3korr(ptr);
  597.   ltime->neg=0;
  598.   if (tmp < 0)
  599.   {
  600.     ltime->neg= 1;
  601.     tmp=-tmp;
  602.   }
  603.   ltime->day= 0;
  604.   ltime->hour=   (int) (tmp/10000);
  605.   tmp-=ltime->hour*10000;
  606.   ltime->minute= (int) tmp/100;
  607.   ltime->second= (int) tmp % 100;
  608.   ltime->second_part=0;
  609.   ltime->time_type= MYSQL_TIMESTAMP_TIME;
  610.   return 0;
  611. }
  612. bool Field_time::send_binary(Protocol *protocol)
  613. {
  614.   TIME tm;
  615.   Field_time::get_time(&tm);
  616.   tm.day= tm.hour/24; // Move hours to days
  617.   tm.hour-= tm.day*24;
  618.   return protocol->store_time(&tm);
  619. }
  620. int Field_time::cmp(const char *a_ptr, const char *b_ptr)
  621. {
  622.   int32 a,b;
  623.   a=(int32) sint3korr(a_ptr);
  624.   b=(int32) sint3korr(b_ptr);
  625.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  626. }
  627. void Field_time::sort_string(char *to,uint length __attribute__((unused)))
  628. {
  629.   to[0] = (uchar) (ptr[2] ^ 128);
  630.   to[1] = ptr[1];
  631.   to[2] = ptr[0];
  632. }
  633. void Field_time::sql_type(String &res) const
  634. {
  635.   res.set_ascii("time", 4);
  636. }
  637. /****************************************************************************
  638. ** year type
  639. ** Save in a byte the year 0, 1901->2155
  640. ** Can handle 2 byte or 4 byte years!
  641. ****************************************************************************/
  642. int Field_year::store(const char *from, uint len,CHARSET_INFO *cs)
  643. {
  644.   int err;
  645.   char *end;
  646.   long nr= my_strntol(cs, from, len, 10, &end, &err);
  647.   if (err)
  648.   {
  649.     if (table->in_use->count_cuted_fields)
  650.       set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  651.     *ptr= 0;
  652.     return 0;
  653.   }
  654.   if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155)
  655.   {
  656.     *ptr=0;
  657.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
  658.     return 1;
  659.   }
  660.   if (table->in_use->count_cuted_fields && !test_if_int(from,len,end,cs))
  661.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  662.   if (nr != 0 || len != 4)
  663.   {
  664.     if (nr < YY_PART_YEAR)
  665.       nr+=100; // 2000 - 2069
  666.     else if (nr > 1900)
  667.       nr-= 1900;
  668.   }
  669.   *ptr= (char) (unsigned char) nr;
  670.   return 0;
  671. }
  672. int Field_year::store(double nr)
  673. {
  674.   if (nr < 0.0 || nr >= 2155.0)
  675.   {
  676.     (void) Field_year::store((longlong) -1);
  677.     return 1;
  678.   }
  679.   else
  680.     return Field_year::store((longlong) nr);
  681. }
  682. int Field_year::store(longlong nr)
  683. {
  684.   if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155)
  685.   {
  686.     *ptr=0;
  687.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
  688.     return 1;
  689.   }
  690.   if (nr != 0 || field_length != 4) // 0000 -> 0; 00 -> 2000
  691.   {
  692.     if (nr < YY_PART_YEAR)
  693.       nr+=100; // 2000 - 2069
  694.     else if (nr > 1900)
  695.       nr-= 1900;
  696.   }
  697.   *ptr= (char) (unsigned char) nr;
  698.   return 0;
  699. }
  700. bool Field_year::send_binary(Protocol *protocol)
  701. {
  702.   ulonglong tmp= Field_year::val_int();
  703.   return protocol->store_short(tmp);
  704. }
  705. double Field_year::val_real(void)
  706. {
  707.   return (double) Field_year::val_int();
  708. }
  709. longlong Field_year::val_int(void)
  710. {
  711.   int tmp= (int) ((uchar*) ptr)[0];
  712.   if (field_length != 4)
  713.     tmp%=100; // Return last 2 char
  714.   else if (tmp)
  715.     tmp+=1900;
  716.   return (longlong) tmp;
  717. }
  718. String *Field_year::val_str(String *val_buffer,
  719.     String *val_ptr __attribute__((unused)))
  720. {
  721.   val_buffer->alloc(5);
  722.   val_buffer->length(field_length);
  723.   char *to=(char*) val_buffer->ptr();
  724.   sprintf(to,field_length == 2 ? "%02d" : "%04d",(int) Field_year::val_int());
  725.   return val_buffer;
  726. }
  727. void Field_year::sql_type(String &res) const
  728. {
  729.   CHARSET_INFO *cs=res.charset();
  730.   res.length(cs->cset->snprintf(cs,(char*)res.ptr(),res.alloced_length(),
  731.   "year(%d)",(int) field_length));
  732. }
  733. /****************************************************************************
  734. ** date type
  735. ** In string context: YYYY-MM-DD
  736. ** In number context: YYYYMMDD
  737. ** Stored as a 4 byte unsigned int
  738. ****************************************************************************/
  739. int Field_date::store(const char *from, uint len,CHARSET_INFO *cs)
  740. {
  741.   TIME l_time;
  742.   uint32 tmp;
  743.   int error;
  744.   
  745.   if (str_to_datetime(from, len, &l_time, 1, &error) <= MYSQL_TIMESTAMP_ERROR)
  746.   {
  747.     tmp=0;
  748.     error= 2;
  749.   }
  750.   else
  751.     tmp=(uint32) l_time.year*10000L + (uint32) (l_time.month*100+l_time.day);
  752.   if (error)
  753.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED,
  754.                          from, len, MYSQL_TIMESTAMP_DATE, 1);
  755. #ifdef WORDS_BIGENDIAN
  756.   if (table->db_low_byte_first)
  757.   {
  758.     int4store(ptr,tmp);
  759.   }
  760.   else
  761. #endif
  762.     longstore(ptr,tmp);
  763.   return error;
  764. }
  765. int Field_date::store(double nr)
  766. {
  767.   long tmp;
  768.   int error= 0;
  769.   if (nr >= 19000000000000.0 && nr <= 99991231235959.0)
  770.     nr=floor(nr/1000000.0); // Timestamp to date
  771.   if (nr < 0.0 || nr > 99991231.0)
  772.   {
  773.     tmp=0L;
  774.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  775.                          ER_WARN_DATA_OUT_OF_RANGE, 
  776.                          nr, MYSQL_TIMESTAMP_DATE);
  777.     error= 1;
  778.   }
  779.   else
  780.     tmp=(long) rint(nr);
  781. #ifdef WORDS_BIGENDIAN
  782.   if (table->db_low_byte_first)
  783.   {
  784.     int4store(ptr,tmp);
  785.   }
  786.   else
  787. #endif
  788.     longstore(ptr,tmp);
  789.   return error;
  790. }
  791. int Field_date::store(longlong nr)
  792. {
  793.   long tmp;
  794.   int error= 0;
  795.   if (nr >= LL(19000000000000) && nr < LL(99991231235959))
  796.     nr=nr/LL(1000000); // Timestamp to date
  797.   if (nr < 0 || nr > LL(99991231))
  798.   {
  799.     tmp=0L;
  800.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  801.                          ER_WARN_DATA_OUT_OF_RANGE,
  802.                          nr, MYSQL_TIMESTAMP_DATE, 0);
  803.     error= 1;
  804.   }
  805.   else
  806.     tmp=(long) nr;
  807. #ifdef WORDS_BIGENDIAN
  808.   if (table->db_low_byte_first)
  809.   {
  810.     int4store(ptr,tmp);
  811.   }
  812.   else
  813. #endif
  814.     longstore(ptr,tmp);
  815.   return error;
  816. }
  817. bool Field_date::send_binary(Protocol *protocol)
  818. {
  819.   longlong tmp= Field_date::val_int();
  820.   TIME tm;
  821.   tm.year= (uint32) tmp/10000L % 10000;
  822.   tm.month= (uint32) tmp/100 % 100;
  823.   tm.day= (uint32) tmp % 100;
  824.   return protocol->store_date(&tm);
  825. }
  826. double Field_date::val_real(void)
  827. {
  828.   int32 j;
  829. #ifdef WORDS_BIGENDIAN
  830.   if (table->db_low_byte_first)
  831.     j=sint4korr(ptr);
  832.   else
  833. #endif
  834.     longget(j,ptr);
  835.   return (double) (uint32) j;
  836. }
  837. longlong Field_date::val_int(void)
  838. {
  839.   int32 j;
  840. #ifdef WORDS_BIGENDIAN
  841.   if (table->db_low_byte_first)
  842.     j=sint4korr(ptr);
  843.   else
  844. #endif
  845.     longget(j,ptr);
  846.   return (longlong) (uint32) j;
  847. }
  848. String *Field_date::val_str(String *val_buffer,
  849.     String *val_ptr __attribute__((unused)))
  850. {
  851.   TIME ltime;
  852.   val_buffer->alloc(field_length);
  853.   int32 tmp;
  854. #ifdef WORDS_BIGENDIAN
  855.   if (table->db_low_byte_first)
  856.     tmp=sint4korr(ptr);
  857.   else
  858. #endif
  859.     longget(tmp,ptr);
  860.   ltime.neg= 0;
  861.   ltime.year= (int) ((uint32) tmp/10000L % 10000);
  862.   ltime.month= (int) ((uint32) tmp/100 % 100);
  863.   ltime.day= (int) ((uint32) tmp % 100);
  864.   make_date((DATE_TIME_FORMAT *) 0, &ltime, val_buffer);
  865.   return val_buffer;
  866. }
  867. int Field_date::cmp(const char *a_ptr, const char *b_ptr)
  868. {
  869.   int32 a,b;
  870. #ifdef WORDS_BIGENDIAN
  871.   if (table->db_low_byte_first)
  872.   {
  873.     a=sint4korr(a_ptr);
  874.     b=sint4korr(b_ptr);
  875.   }
  876.   else
  877. #endif
  878.   {
  879.     longget(a,a_ptr);
  880.     longget(b,b_ptr);
  881.   }
  882.   return ((uint32) a < (uint32) b) ? -1 : ((uint32) a > (uint32) b) ? 1 : 0;
  883. }
  884. void Field_date::sort_string(char *to,uint length __attribute__((unused)))
  885. {
  886. #ifdef WORDS_BIGENDIAN
  887.   if (!table->db_low_byte_first)
  888.   {
  889.     to[0] = ptr[0];
  890.     to[1] = ptr[1];
  891.     to[2] = ptr[2];
  892.     to[3] = ptr[3];
  893.   }
  894.   else
  895. #endif
  896.   {
  897.     to[0] = ptr[3];
  898.     to[1] = ptr[2];
  899.     to[2] = ptr[1];
  900.     to[3] = ptr[0];
  901.   }
  902. }
  903. void Field_date::sql_type(String &res) const
  904. {
  905.   res.set_ascii("date", 4);
  906. }
  907. /****************************************************************************
  908. ** The new date type
  909. ** This is identical to the old date type, but stored on 3 bytes instead of 4
  910. ** In number context: YYYYMMDD
  911. ****************************************************************************/
  912. int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs)
  913. {
  914.   TIME l_time;
  915.   long tmp;
  916.   int error;
  917.   if (str_to_datetime(from, len, &l_time, 1, &error) <= MYSQL_TIMESTAMP_ERROR)
  918.   {
  919.     tmp=0L;
  920.     error= 2;
  921.   }
  922.   else
  923.     tmp= l_time.day + l_time.month*32 + l_time.year*16*32;
  924.   if (error)
  925.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED,
  926.                          from, len, MYSQL_TIMESTAMP_DATE, 1);
  927.     
  928.   int3store(ptr,tmp);
  929.   return error;
  930. }
  931. int Field_newdate::store(double nr)
  932. {
  933.   if (nr < 0.0 || nr > 99991231235959.0)
  934.   {
  935.     (void) Field_newdate::store((longlong) -1);
  936.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  937.                          ER_WARN_DATA_TRUNCATED, nr, MYSQL_TIMESTAMP_DATE);
  938.     return 1;
  939.   }
  940.   else
  941.     return Field_newdate::store((longlong) rint(nr));
  942. }
  943. int Field_newdate::store(longlong nr)
  944. {
  945.   int32 tmp;
  946.   int error= 0;
  947.   if (nr >= LL(100000000) && nr <= LL(99991231235959))
  948.     nr=nr/LL(1000000); // Timestamp to date
  949.   if (nr < 0L || nr > 99991231L)
  950.   {
  951.     tmp=0;
  952.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  953.                          ER_WARN_DATA_OUT_OF_RANGE, nr,
  954.                          MYSQL_TIMESTAMP_DATE, 1);
  955.     error= 1;
  956.   }
  957.   else
  958.   {
  959.     tmp=(int32) nr;
  960.     if (tmp)
  961.     {
  962.       if (tmp < YY_PART_YEAR*10000L) // Fix short dates
  963. tmp+= (uint32) 20000000L;
  964.       else if (tmp < 999999L)
  965. tmp+= (uint32) 19000000L;
  966.     }
  967.     uint month= (uint) ((tmp/100) % 100);
  968.     uint day=   (uint) (tmp%100);
  969.     if (month > 12 || day > 31)
  970.     {
  971.       tmp=0L; // Don't allow date to change
  972.       set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  973.                            ER_WARN_DATA_OUT_OF_RANGE, nr,
  974.                            MYSQL_TIMESTAMP_DATE, 1);
  975.       error= 1;
  976.     }
  977.     else
  978.       tmp= day + month*32 + (tmp/10000)*16*32;
  979.   }
  980.   int3store(ptr,(int32) tmp);
  981.   return error;
  982. }
  983. void Field_newdate::store_time(TIME *ltime,timestamp_type type)
  984. {
  985.   long tmp;
  986.   if (type == MYSQL_TIMESTAMP_DATE || type == MYSQL_TIMESTAMP_DATETIME)
  987.     tmp=ltime->year*16*32+ltime->month*32+ltime->day;
  988.   else
  989.   {
  990.     tmp=0;
  991.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  992.   }
  993.   int3store(ptr,tmp);
  994. }
  995. bool Field_newdate::send_binary(Protocol *protocol)
  996. {
  997.   TIME tm;
  998.   Field_newdate::get_date(&tm,0);
  999.   return protocol->store_date(&tm);
  1000. }
  1001. double Field_newdate::val_real(void)
  1002. {
  1003.   return (double) Field_newdate::val_int();
  1004. }
  1005. longlong Field_newdate::val_int(void)
  1006. {
  1007.   ulong j= uint3korr(ptr);
  1008.   j= (j % 32L)+(j / 32L % 16L)*100L + (j/(16L*32L))*10000L;
  1009.   return (longlong) j;
  1010. }
  1011. String *Field_newdate::val_str(String *val_buffer,
  1012.        String *val_ptr __attribute__((unused)))
  1013. {
  1014.   val_buffer->alloc(field_length);
  1015.   val_buffer->length(field_length);
  1016.   uint32 tmp=(uint32) uint3korr(ptr);
  1017.   int part;
  1018.   char *pos=(char*) val_buffer->ptr()+10;
  1019.   /* Open coded to get more speed */
  1020.   *pos--=0; // End NULL
  1021.   part=(int) (tmp & 31);
  1022.   *pos--= (char) ('0'+part%10);
  1023.   *pos--= (char) ('0'+part/10);
  1024.   *pos--= '-';
  1025.   part=(int) (tmp >> 5 & 15);
  1026.   *pos--= (char) ('0'+part%10);
  1027.   *pos--= (char) ('0'+part/10);
  1028.   *pos--= '-';
  1029.   part=(int) (tmp >> 9);
  1030.   *pos--= (char) ('0'+part%10); part/=10;
  1031.   *pos--= (char) ('0'+part%10); part/=10;
  1032.   *pos--= (char) ('0'+part%10); part/=10;
  1033.   *pos=   (char) ('0'+part);
  1034.   return val_buffer;
  1035. }
  1036. bool Field_newdate::get_date(TIME *ltime,uint fuzzydate)
  1037. {
  1038.   if (is_null())
  1039.     return 1;
  1040.   uint32 tmp=(uint32) uint3korr(ptr);
  1041.   ltime->day=   tmp & 31;
  1042.   ltime->month= (tmp >> 5) & 15;
  1043.   ltime->year=  (tmp >> 9);
  1044.   ltime->time_type= MYSQL_TIMESTAMP_DATE;
  1045.   ltime->hour= ltime->minute= ltime->second= ltime->second_part= ltime->neg= 0;
  1046.   return (!fuzzydate && (!ltime->month || !ltime->day)) ? 1 : 0;
  1047. }
  1048. bool Field_newdate::get_time(TIME *ltime)
  1049. {
  1050.   return Field_newdate::get_date(ltime,0);
  1051. }
  1052. int Field_newdate::cmp(const char *a_ptr, const char *b_ptr)
  1053. {
  1054.   uint32 a,b;
  1055.   a=(uint32) uint3korr(a_ptr);
  1056.   b=(uint32) uint3korr(b_ptr);
  1057.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  1058. }
  1059. void Field_newdate::sort_string(char *to,uint length __attribute__((unused)))
  1060. {
  1061.   to[0] = ptr[2];
  1062.   to[1] = ptr[1];
  1063.   to[2] = ptr[0];
  1064. }
  1065. void Field_newdate::sql_type(String &res) const
  1066. {
  1067.   res.set_ascii("date", 4);
  1068. }
  1069. /****************************************************************************
  1070. ** datetime type
  1071. ** In string context: YYYY-MM-DD HH:MM:DD
  1072. ** In number context: YYYYMMDDHHMMDD
  1073. ** Stored as a 8 byte unsigned int. Should sometimes be change to a 6 byte int.
  1074. ****************************************************************************/
  1075. int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs)
  1076. {
  1077.   TIME time_tmp;
  1078.   int error;
  1079.   ulonglong tmp= 0;
  1080.   
  1081.   if (str_to_datetime(from, len, &time_tmp, 1, &error) > MYSQL_TIMESTAMP_ERROR)
  1082.     tmp= TIME_to_ulonglong_datetime(&time_tmp);
  1083.   
  1084.   if (error)
  1085.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  1086.                          ER_WARN_DATA_OUT_OF_RANGE,
  1087.                          from, len, MYSQL_TIMESTAMP_DATETIME, 1);
  1088. #ifdef WORDS_BIGENDIAN
  1089.   if (table->db_low_byte_first)
  1090.   {
  1091.     int8store(ptr,tmp);
  1092.   }
  1093.   else
  1094. #endif
  1095.     longlongstore(ptr,tmp);
  1096.   return error;
  1097. }
  1098. int Field_datetime::store(double nr)
  1099. {
  1100.   int error= 0;
  1101.   if (nr < 0.0 || nr > 99991231235959.0)
  1102.   {
  1103.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  1104.                          ER_WARN_DATA_OUT_OF_RANGE,
  1105.                          nr, MYSQL_TIMESTAMP_DATETIME);
  1106.     nr=0.0;
  1107.     error= 1;
  1108.   }
  1109.   error |= Field_datetime::store((longlong) rint(nr));
  1110.   return error;
  1111. }
  1112. int Field_datetime::store(longlong nr)
  1113. {
  1114.   TIME not_used;
  1115.   int error;
  1116.   longlong initial_nr= nr;
  1117.   
  1118.   nr= number_to_TIME(nr, &not_used, 1, &error);
  1119.   if (error)
  1120.     set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, 
  1121.                          ER_WARN_DATA_TRUNCATED, initial_nr, 
  1122.                          MYSQL_TIMESTAMP_DATETIME, 1);
  1123. #ifdef WORDS_BIGENDIAN
  1124.   if (table->db_low_byte_first)
  1125.   {
  1126.     int8store(ptr,nr);
  1127.   }
  1128.   else
  1129. #endif
  1130.     longlongstore(ptr,nr);
  1131.   return error;
  1132. }
  1133. void Field_datetime::store_time(TIME *ltime,timestamp_type type)
  1134. {
  1135.   longlong tmp;
  1136.   /*
  1137.     We don't perform range checking here since values stored in TIME
  1138.     structure always fit into DATETIME range.
  1139.   */
  1140.   if (type == MYSQL_TIMESTAMP_DATE || type == MYSQL_TIMESTAMP_DATETIME)
  1141.     tmp=((ltime->year*10000L+ltime->month*100+ltime->day)*LL(1000000)+
  1142.  (ltime->hour*10000L+ltime->minute*100+ltime->second));
  1143.   else
  1144.   {
  1145.     tmp=0;
  1146.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  1147.   }
  1148. #ifdef WORDS_BIGENDIAN
  1149.   if (table->db_low_byte_first)
  1150.   {
  1151.     int8store(ptr,tmp);
  1152.   }
  1153.   else
  1154. #endif
  1155.     longlongstore(ptr,tmp);
  1156. }
  1157. bool Field_datetime::send_binary(Protocol *protocol)
  1158. {
  1159.   TIME tm;
  1160.   Field_datetime::get_date(&tm, TIME_FUZZY_DATE);
  1161.   return protocol->store(&tm);
  1162. }
  1163. double Field_datetime::val_real(void)
  1164. {
  1165.   return (double) Field_datetime::val_int();
  1166. }
  1167. longlong Field_datetime::val_int(void)
  1168. {
  1169.   longlong j;
  1170. #ifdef WORDS_BIGENDIAN
  1171.   if (table->db_low_byte_first)
  1172.     j=sint8korr(ptr);
  1173.   else
  1174. #endif
  1175.     longlongget(j,ptr);
  1176.   return j;
  1177. }
  1178. String *Field_datetime::val_str(String *val_buffer,
  1179. String *val_ptr __attribute__((unused)))
  1180. {
  1181.   val_buffer->alloc(field_length);
  1182.   val_buffer->length(field_length);
  1183.   ulonglong tmp;
  1184.   long part1,part2;
  1185.   char *pos;
  1186.   int part3;
  1187. #ifdef WORDS_BIGENDIAN
  1188.   if (table->db_low_byte_first)
  1189.     tmp=sint8korr(ptr);
  1190.   else
  1191. #endif
  1192.     longlongget(tmp,ptr);
  1193.   /*
  1194.     Avoid problem with slow longlong aritmetic and sprintf
  1195.   */
  1196.   part1=(long) (tmp/LL(1000000));
  1197.   part2=(long) (tmp - (ulonglong) part1*LL(1000000));
  1198.   pos=(char*) val_buffer->ptr()+19;
  1199.   *pos--=0;
  1200.   *pos--= (char) ('0'+(char) (part2%10)); part2/=10;
  1201.   *pos--= (char) ('0'+(char) (part2%10)); part3= (int) (part2 / 10);
  1202.   *pos--= ':';
  1203.   *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  1204.   *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  1205.   *pos--= ':';
  1206.   *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  1207.   *pos--= (char) ('0'+(char) part3);
  1208.   *pos--= ' ';
  1209.   *pos--= (char) ('0'+(char) (part1%10)); part1/=10;
  1210.   *pos--= (char) ('0'+(char) (part1%10)); part1/=10;
  1211.   *pos--= '-';
  1212.   *pos--= (char) ('0'+(char) (part1%10)); part1/=10;
  1213.   *pos--= (char) ('0'+(char) (part1%10)); part3= (int) (part1/10);
  1214.   *pos--= '-';
  1215.   *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  1216.   *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  1217.   *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  1218.   *pos=(char) ('0'+(char) part3);
  1219.   return val_buffer;
  1220. }
  1221. bool Field_datetime::get_date(TIME *ltime, uint fuzzydate)
  1222. {
  1223.   longlong tmp=Field_datetime::val_int();
  1224.   uint32 part1,part2;
  1225.   part1=(uint32) (tmp/LL(1000000));
  1226.   part2=(uint32) (tmp - (ulonglong) part1*LL(1000000));
  1227.   ltime->time_type= MYSQL_TIMESTAMP_DATETIME;
  1228.   ltime->neg= 0;
  1229.   ltime->second_part= 0;
  1230.   ltime->second= (int) (part2%100);
  1231.   ltime->minute= (int) (part2/100%100);
  1232.   ltime->hour= (int) (part2/10000);
  1233.   ltime->day= (int) (part1%100);
  1234.   ltime->month=  (int) (part1/100%100);
  1235.   ltime->year=  (int) (part1/10000);
  1236.   return (!fuzzydate && (!ltime->month || !ltime->day)) ? 1 : 0;
  1237. }
  1238. bool Field_datetime::get_time(TIME *ltime)
  1239. {
  1240.   return Field_datetime::get_date(ltime,0);
  1241. }
  1242. int Field_datetime::cmp(const char *a_ptr, const char *b_ptr)
  1243. {
  1244.   longlong a,b;
  1245. #ifdef WORDS_BIGENDIAN
  1246.   if (table->db_low_byte_first)
  1247.   {
  1248.     a=sint8korr(a_ptr);
  1249.     b=sint8korr(b_ptr);
  1250.   }
  1251.   else
  1252. #endif
  1253.   {
  1254.     longlongget(a,a_ptr);
  1255.     longlongget(b,b_ptr);
  1256.   }
  1257.   return ((ulonglong) a < (ulonglong) b) ? -1 :
  1258.     ((ulonglong) a > (ulonglong) b) ? 1 : 0;
  1259. }
  1260. void Field_datetime::sort_string(char *to,uint length __attribute__((unused)))
  1261. {
  1262. #ifdef WORDS_BIGENDIAN
  1263.   if (!table->db_low_byte_first)
  1264.   {
  1265.     to[0] = ptr[0];
  1266.     to[1] = ptr[1];
  1267.     to[2] = ptr[2];
  1268.     to[3] = ptr[3];
  1269.     to[4] = ptr[4];
  1270.     to[5] = ptr[5];
  1271.     to[6] = ptr[6];
  1272.     to[7] = ptr[7];
  1273.   }
  1274.   else
  1275. #endif
  1276.   {
  1277.     to[0] = ptr[7];
  1278.     to[1] = ptr[6];
  1279.     to[2] = ptr[5];
  1280.     to[3] = ptr[4];
  1281.     to[4] = ptr[3];
  1282.     to[5] = ptr[2];
  1283.     to[6] = ptr[1];
  1284.     to[7] = ptr[0];
  1285.   }
  1286. }
  1287. void Field_datetime::sql_type(String &res) const
  1288. {
  1289.   res.set_ascii("datetime", 8);
  1290. }
  1291. /****************************************************************************
  1292. ** string type
  1293. ** A string may be varchar or binary
  1294. ****************************************************************************/
  1295. /* Copy a string and fill with space */
  1296. int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
  1297. {
  1298.   int error= 0, well_formed_error;
  1299.   uint32 not_used;
  1300.   char buff[80];
  1301.   String tmpstr(buff,sizeof(buff), &my_charset_bin);
  1302.   uint copy_length;
  1303.   
  1304.   /* See the comment for Field_long::store(long long) */
  1305.   DBUG_ASSERT(table->in_use == current_thd);
  1306.   
  1307.   /* Convert character set if nesessary */
  1308.   if (String::needs_conversion(length, cs, field_charset, &not_used))
  1309.   { 
  1310.     uint conv_errors;
  1311.     tmpstr.copy(from, length, cs, field_charset, &conv_errors);
  1312.     from= tmpstr.ptr();
  1313.     length=  tmpstr.length();
  1314.     if (conv_errors)
  1315.       error= 2;
  1316.   }
  1317.   /* 
  1318.     Make sure we don't break a multibyte sequence
  1319.     as well as don't copy a malformed data.
  1320.   */
  1321.   copy_length= field_charset->cset->well_formed_len(field_charset,
  1322.                                                     from,from+length,
  1323.                                                     field_length/
  1324.                                                     field_charset->mbmaxlen,
  1325.                                                     &well_formed_error);
  1326.   memcpy(ptr,from,copy_length);
  1327.   if (copy_length < field_length) // Append spaces if shorter
  1328.     field_charset->cset->fill(field_charset,ptr+copy_length,
  1329.       field_length-copy_length,' ');
  1330.   
  1331.   if ((copy_length < length) && table->in_use->count_cuted_fields)
  1332.   { // Check if we loosed some info
  1333.     const char *end=from+length;
  1334.     from+= copy_length;
  1335.     from+= field_charset->cset->scan(field_charset, from, end,
  1336.      MY_SEQ_SPACES);
  1337.     if (from != end)
  1338.       error= 2;
  1339.   }
  1340.   if (error)
  1341.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  1342.   return error;
  1343. }
  1344. /*
  1345.   Store double value in Field_string or Field_varstring.
  1346.   SYNOPSIS
  1347.     store(double nr)
  1348.     nr            number
  1349.   DESCRIPTION
  1350.     Pretty prints double number into field_length characters buffer.
  1351. */
  1352. int Field_str::store(double nr)
  1353. {
  1354.   char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
  1355.   uint length;
  1356.   bool use_scientific_notation= TRUE;
  1357.   uint char_length= field_length / charset()->mbmaxlen;
  1358.   /*
  1359.     Check fabs(nr) against longest value that can be stored in field,
  1360.     which depends on whether the value is < 1 or not, and negative or not
  1361.   */
  1362.   double anr= fabs(nr);
  1363.   int neg= (nr < 0.0) ? 1 : 0;
  1364.   if (char_length > 4 && char_length < 32 &&
  1365.       (anr < 1.0 ? anr > 1/(log_10[max(0,(int) char_length-neg-2)]) /* -2 for "0." */
  1366.                  : anr < log_10[char_length-neg]-1))
  1367.     use_scientific_notation= FALSE;
  1368.   length= (uint) my_sprintf(buff, (buff, "%-.*g",
  1369.                                    (use_scientific_notation ?
  1370.                                     max(0, (int)char_length-neg-5) :
  1371.                                     char_length),
  1372.                                    nr));
  1373.   /*
  1374.     +1 below is because "precision" in %g above means the
  1375.     max. number of significant digits, not the output width.
  1376.     Thus the width can be larger than number of significant digits by 1
  1377.     (for decimal point)
  1378.     the test for char_length < 5 is for extreme cases,
  1379.     like inserting 500.0 in char(1)
  1380.   */
  1381.   DBUG_ASSERT(char_length < 5 || length <= char_length+1);
  1382.   return store((const char *) buff, length, charset());
  1383. }
  1384. int Field_string::store(longlong nr)
  1385. {
  1386.   char buff[64];
  1387.   int  l;
  1388.   CHARSET_INFO *cs=charset();
  1389.   l= (cs->cset->longlong10_to_str)(cs,buff,sizeof(buff),-10,nr);
  1390.   return Field_string::store(buff,(uint)l,cs);
  1391. }
  1392. double Field_string::val_real(void)
  1393. {
  1394.   int not_used;
  1395.   char *end_not_used;
  1396.   CHARSET_INFO *cs=charset();
  1397.   return my_strntod(cs, ptr, field_length, &end_not_used, &not_used);
  1398. }
  1399. longlong Field_string::val_int(void)
  1400. {
  1401.   int not_used;
  1402.   CHARSET_INFO *cs=charset();
  1403.   return my_strntoll(cs,ptr,field_length,10,NULL,&not_used);
  1404. }
  1405. String *Field_string::val_str(String *val_buffer __attribute__((unused)),
  1406.       String *val_ptr)
  1407. {
  1408.   uint length= field_charset->cset->lengthsp(field_charset, ptr, field_length);
  1409.   /* See the comment for Field_long::store(long long) */
  1410.   DBUG_ASSERT(table->in_use == current_thd);
  1411.   val_ptr->set((const char*) ptr, length, field_charset);
  1412.   return val_ptr;
  1413. }
  1414. int Field_string::cmp(const char *a_ptr, const char *b_ptr)
  1415. {
  1416.   uint a_len, b_len;
  1417.   if (field_charset->strxfrm_multiply > 1)
  1418.   {
  1419.     /*
  1420.       We have to remove end space to be able to compare multi-byte-characters
  1421.       like in latin_de 'ae' and 0xe4
  1422.     */
  1423.     return field_charset->coll->strnncollsp(field_charset,
  1424.                                             (const uchar*) a_ptr, field_length,
  1425.                                             (const uchar*) b_ptr,
  1426.                                             field_length);
  1427.   }
  1428.   if (field_charset->mbmaxlen != 1)
  1429.   {
  1430.     uint char_len= field_length/field_charset->mbmaxlen;
  1431.     a_len= my_charpos(field_charset, a_ptr, a_ptr + field_length, char_len);
  1432.     b_len= my_charpos(field_charset, b_ptr, b_ptr + field_length, char_len);
  1433.   }
  1434.   else
  1435.     a_len= b_len= field_length;
  1436.   return my_strnncoll(field_charset,(const uchar*) a_ptr, a_len,
  1437.                                     (const uchar*) b_ptr, b_len);
  1438. }
  1439. void Field_string::sort_string(char *to,uint length)
  1440. {
  1441.   uint tmp=my_strnxfrm(field_charset,
  1442.        (unsigned char *) to, length,
  1443.        (unsigned char *) ptr, field_length);
  1444.   DBUG_ASSERT(tmp == length);
  1445. }
  1446. void Field_string::sql_type(String &res) const
  1447. {
  1448.   THD *thd= table->in_use;
  1449.   CHARSET_INFO *cs=res.charset();
  1450.   ulong length= cs->cset->snprintf(cs,(char*) res.ptr(),
  1451.     res.alloced_length(), "%s(%d)",
  1452.     (field_length > 3 &&
  1453.      (table->db_options_in_use &
  1454.       HA_OPTION_PACK_RECORD) ?
  1455.       (has_charset() ? "varchar" : "varbinary") :
  1456.       (has_charset() ? "char" : "binary")),
  1457.     (int) field_length / charset()->mbmaxlen);
  1458.   res.length(length);
  1459.   if ((thd->variables.sql_mode & (MODE_MYSQL323 | MODE_MYSQL40)) &&
  1460.       has_charset() && (charset()->state & MY_CS_BINSORT))
  1461.     res.append(" binary");
  1462. }
  1463. char *Field_string::pack(char *to, const char *from, uint max_length)
  1464. {
  1465.   uint length=      min(field_length,max_length);
  1466.   uint char_length= max_length/field_charset->mbmaxlen;
  1467.   if (length > char_length)
  1468.     char_length= my_charpos(field_charset, from, from+length, char_length);
  1469.   set_if_smaller(length, char_length);
  1470.   while (length && from[length-1] == ' ')
  1471.     length--;
  1472.   *to++= (char) (uchar) length;
  1473.   if (field_length > 255)
  1474.     *to++= (char) (uchar) (length >> 8);
  1475.   memcpy(to, from, length);
  1476.   return to+length;
  1477. }
  1478. const char *Field_string::unpack(char *to, const char *from)
  1479. {
  1480.   uint length;
  1481.   if (field_length > 255)
  1482.   {
  1483.     length= uint2korr(from);
  1484.     from+= 2;
  1485.   }
  1486.   else
  1487.     length= (uint) (uchar) *from++;
  1488.   memcpy(to, from, (int) length);
  1489.   bfill(to+length, field_length - length, ' ');
  1490.   return from+length;
  1491. }
  1492. int Field_string::pack_cmp(const char *a, const char *b, uint length)
  1493. {
  1494.   uint a_length, b_length;
  1495.   if (field_length > 255)
  1496.   {
  1497.     a_length= uint2korr(a);
  1498.     b_length= uint2korr(b);
  1499.     a+= 2;
  1500.     b+= 2;
  1501.   }
  1502.   else
  1503.   {
  1504.     a_length= (uint) (uchar) *a++;
  1505.     b_length= (uint) (uchar) *b++;
  1506.   }
  1507.   return my_strnncoll(field_charset,
  1508.       (const uchar*)a,a_length,
  1509.       (const uchar*)b,b_length);
  1510. }
  1511. int Field_string::pack_cmp(const char *b, uint length)
  1512. {
  1513.   uint b_length;
  1514.   if (field_length > 255)
  1515.   {
  1516.     b_length= uint2korr(b);
  1517.     b+= 2;
  1518.   }
  1519.   else
  1520.     b_length= (uint) (uchar) *b++;
  1521.   char *end= ptr + field_length;
  1522.   while (end > ptr && end[-1] == ' ')
  1523.     end--;
  1524.   uint a_length = (uint) (end - ptr);
  1525.   return my_strnncoll(field_charset,
  1526.      (const uchar*)ptr,a_length,
  1527.      (const uchar*)b, b_length);
  1528. }
  1529. uint Field_string::packed_col_length(const char *data_ptr, uint length)
  1530. {
  1531.   if (length > 255)
  1532.     return uint2korr(data_ptr)+2;
  1533.   else
  1534.     return (uint) ((uchar) *data_ptr)+1;
  1535. }
  1536. uint Field_string::max_packed_col_length(uint max_length)
  1537. {
  1538.   return (max_length > 255 ? 2 : 1)+max_length;
  1539. }
  1540. /****************************************************************************
  1541. ** VARCHAR type  (Not available for the end user yet)
  1542. ****************************************************************************/
  1543. int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
  1544. {
  1545.   int error= 0;
  1546.   uint32 not_used;
  1547.   char buff[80];
  1548.   String tmpstr(buff,sizeof(buff), &my_charset_bin);
  1549.   /* Convert character set if nesessary */
  1550.   if (String::needs_conversion(length, cs, field_charset, &not_used))
  1551.   { 
  1552.     uint conv_errors;
  1553.     tmpstr.copy(from, length, cs, field_charset, &conv_errors);
  1554.     from= tmpstr.ptr();
  1555.     length=  tmpstr.length();
  1556.     if (conv_errors)
  1557.       error= 2;
  1558.   }
  1559.   if (length > field_length)
  1560.   {
  1561.     length=field_length;
  1562.     error= 2;
  1563.   }
  1564.   if (error)
  1565.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  1566.   memcpy(ptr+HA_KEY_BLOB_LENGTH,from,length);
  1567.   int2store(ptr, length);
  1568.   return error;
  1569. }
  1570. int Field_varstring::store(longlong nr)
  1571. {
  1572.   char buff[64];
  1573.   int  l;
  1574.   CHARSET_INFO *cs=charset();
  1575.   l= (cs->cset->longlong10_to_str)(cs,buff,sizeof(buff),-10,nr);
  1576.   return Field_varstring::store(buff,(uint)l,cs);
  1577. }
  1578. double Field_varstring::val_real(void)
  1579. {
  1580.   int not_used;
  1581.   uint length=uint2korr(ptr)+HA_KEY_BLOB_LENGTH;
  1582.   CHARSET_INFO *cs=charset();
  1583.   char *end_not_used;
  1584.   return my_strntod(cs, ptr+HA_KEY_BLOB_LENGTH, length, &end_not_used,
  1585.                     &not_used);
  1586. }
  1587. longlong Field_varstring::val_int(void)
  1588. {
  1589.   int not_used;
  1590.   uint length=uint2korr(ptr)+HA_KEY_BLOB_LENGTH;
  1591.   CHARSET_INFO *cs=charset();
  1592.   return my_strntoll(cs,ptr+HA_KEY_BLOB_LENGTH,length,10,NULL, &not_used);
  1593. }
  1594. String *Field_varstring::val_str(String *val_buffer __attribute__((unused)),
  1595.  String *val_ptr)
  1596. {
  1597.   uint length=uint2korr(ptr);
  1598.   val_ptr->set((const char*) ptr+HA_KEY_BLOB_LENGTH,length,field_charset);
  1599.   return val_ptr;
  1600. }
  1601. int Field_varstring::cmp(const char *a_ptr, const char *b_ptr)
  1602. {
  1603.   uint a_length=uint2korr(a_ptr);
  1604.   uint b_length=uint2korr(b_ptr);
  1605.   int diff;
  1606.   diff= my_strnncoll(field_charset,
  1607.      (const uchar*) a_ptr+HA_KEY_BLOB_LENGTH,
  1608.      min(a_length,b_length),
  1609.      (const uchar*) b_ptr+HA_KEY_BLOB_LENGTH,
  1610.      min(a_length,b_length));
  1611.   return diff ? diff : (int) (a_length - b_length);
  1612. }
  1613. void Field_varstring::sort_string(char *to,uint length)
  1614. {
  1615.   uint tot_length=uint2korr(ptr);
  1616.   tot_length= my_strnxfrm(field_charset,
  1617.   (uchar*) to, length,
  1618.   (uchar*) ptr+HA_KEY_BLOB_LENGTH,
  1619.   tot_length);
  1620.   DBUG_ASSERT(tot_length == length);
  1621. }
  1622. void Field_varstring::sql_type(String &res) const
  1623. {
  1624.   CHARSET_INFO *cs=res.charset();
  1625.   ulong length= cs->cset->snprintf(cs,(char*) res.ptr(),
  1626.      res.alloced_length(),"varchar(%u)",
  1627.      field_length / charset()->mbmaxlen);
  1628.   res.length(length);
  1629. }
  1630. char *Field_varstring::pack(char *to, const char *from, uint max_length)
  1631. {
  1632.   uint length=uint2korr(from);
  1633.   if (length > max_length)
  1634.     length=max_length;
  1635.   *to++= (char) (length & 255);
  1636.   if (max_length > 255)
  1637.     *to++= (char) (length >> 8);
  1638.   if (length)
  1639.     memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
  1640.   return to+length;
  1641. }
  1642. char *Field_varstring::pack_key(char *to, const char *from, uint max_length)
  1643. {
  1644.   uint length=uint2korr(from);
  1645.   uint char_length= (field_charset->mbmaxlen > 1) ?
  1646.               max_length/field_charset->mbmaxlen : max_length;
  1647.   from+=HA_KEY_BLOB_LENGTH;
  1648.   if (length > char_length)
  1649.     char_length= my_charpos(field_charset, from, from+length, char_length);
  1650.   set_if_smaller(length, char_length);
  1651.   *to++= (char) (length & 255);
  1652.   if (max_length > 255)
  1653.     *to++= (char) (length >> 8);
  1654.   if (length)
  1655.     memcpy(to, from, length);
  1656.   return to+length;
  1657. }
  1658. const char *Field_varstring::unpack(char *to, const char *from)
  1659. {
  1660.   uint length;
  1661.   if (field_length > 255)
  1662.   {
  1663.     length= (uint) (uchar) (*to= *from++);
  1664.     to[1]=0;
  1665.   }
  1666.   else
  1667.   {
  1668.     length=uint2korr(from);
  1669.     to[0] = *from++;
  1670.     to[1] = *from++;
  1671.   }
  1672.   if (length)
  1673.     memcpy(to+HA_KEY_BLOB_LENGTH, from, length);
  1674.   return from+length;
  1675. }
  1676. int Field_varstring::pack_cmp(const char *a, const char *b, uint key_length)
  1677. {
  1678.   uint a_length;
  1679.   uint b_length;
  1680.   if (key_length > 255)
  1681.   {
  1682.     a_length=uint2korr(a); a+= 2;
  1683.     b_length=uint2korr(b); b+= 2;
  1684.   }
  1685.   else
  1686.   {
  1687.     a_length= (uint) (uchar) *a++;
  1688.     b_length= (uint) (uchar) *b++;
  1689.   }
  1690.   return my_strnncoll(field_charset,
  1691.      (const uchar*) a, a_length,
  1692.      (const uchar*) b, b_length);
  1693. }
  1694. int Field_varstring::pack_cmp(const char *b, uint key_length)
  1695. {
  1696.   char *a= ptr+HA_KEY_BLOB_LENGTH;
  1697.   uint a_length= uint2korr(ptr);
  1698.   uint b_length;
  1699.   if (key_length > 255)
  1700.   {
  1701.     b_length=uint2korr(b); b+= 2;
  1702.   }
  1703.   else
  1704.   {
  1705.     b_length= (uint) (uchar) *b++;
  1706.   }
  1707.   return my_strnncoll(field_charset,
  1708.      (const uchar*) a, a_length,
  1709.      (const uchar*) b, b_length);
  1710. }
  1711. uint Field_varstring::packed_col_length(const char *data_ptr, uint length)
  1712. {
  1713.   if (length > 255)
  1714.     return uint2korr(data_ptr)+HA_KEY_BLOB_LENGTH;
  1715.   else
  1716.     return (uint) ((uchar) *data_ptr)+1;
  1717. }
  1718. uint Field_varstring::max_packed_col_length(uint max_length)
  1719. {
  1720.   return (max_length > 255 ? 2 : 1)+max_length;
  1721. }
  1722. void Field_varstring::get_key_image(char *buff, uint length, CHARSET_INFO *cs,
  1723.     imagetype type)
  1724. {
  1725.   uint f_length=uint2korr(ptr);
  1726.   if (f_length > length)
  1727.     f_length= length;
  1728.   int2store(buff,length);
  1729.   memcpy(buff+HA_KEY_BLOB_LENGTH, ptr+HA_KEY_BLOB_LENGTH, length);
  1730. #ifdef HAVE_purify
  1731.   if (f_length < length)
  1732.     bzero(buff+HA_KEY_BLOB_LENGTH+f_length, (length-f_length));
  1733. #endif
  1734. }
  1735. void Field_varstring::set_key_image(char *buff,uint length, CHARSET_INFO *cs)
  1736. {
  1737.   length=uint2korr(buff); // Real length is here
  1738.   (void) Field_varstring::store(buff+HA_KEY_BLOB_LENGTH, length, cs);
  1739. }
  1740. /****************************************************************************
  1741. ** blob type
  1742. ** A blob is saved as a length and a pointer. The length is stored in the
  1743. ** packlength slot and may be from 1-4.
  1744. ****************************************************************************/
  1745. Field_blob::Field_blob(char *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
  1746.        enum utype unireg_check_arg, const char *field_name_arg,
  1747.        struct st_table *table_arg,uint blob_pack_length,
  1748.        CHARSET_INFO *cs)
  1749.   :Field_str(ptr_arg, BLOB_PACK_LENGTH_TO_MAX_LENGH(blob_pack_length),
  1750.      null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg,
  1751.      table_arg, cs),
  1752.    packlength(blob_pack_length)
  1753. {
  1754.   flags|= BLOB_FLAG;
  1755.   if (table)
  1756.     table->blob_fields++;
  1757. }
  1758. void Field_blob::store_length(uint32 number)
  1759. {
  1760.   switch (packlength) {
  1761.   case 1:
  1762.     ptr[0]= (uchar) number;
  1763.     break;
  1764.   case 2:
  1765. #ifdef WORDS_BIGENDIAN
  1766.     if (table->db_low_byte_first)
  1767.     {
  1768.       int2store(ptr,(unsigned short) number);
  1769.     }
  1770.     else
  1771. #endif
  1772.       shortstore(ptr,(unsigned short) number);
  1773.     break;
  1774.   case 3:
  1775.     int3store(ptr,number);
  1776.     break;
  1777.   case 4:
  1778. #ifdef WORDS_BIGENDIAN
  1779.     if (table->db_low_byte_first)
  1780.     {
  1781.       int4store(ptr,number);
  1782.     }
  1783.     else
  1784. #endif
  1785.       longstore(ptr,number);
  1786.   }
  1787. }
  1788. uint32 Field_blob::get_length(const char *pos)
  1789. {
  1790.   switch (packlength) {
  1791.   case 1:
  1792.     return (uint32) (uchar) pos[0];
  1793.   case 2:
  1794.     {
  1795.       uint16 tmp;
  1796. #ifdef WORDS_BIGENDIAN
  1797.       if (table->db_low_byte_first)
  1798. tmp=sint2korr(pos);
  1799.       else
  1800. #endif
  1801. shortget(tmp,pos);
  1802.       return (uint32) tmp;
  1803.     }
  1804.   case 3:
  1805.     return (uint32) uint3korr(pos);
  1806.   case 4:
  1807.     {
  1808.       uint32 tmp;
  1809. #ifdef WORDS_BIGENDIAN
  1810.       if (table->db_low_byte_first)
  1811. tmp=uint4korr(pos);
  1812.       else
  1813. #endif
  1814. longget(tmp,pos);
  1815.       return (uint32) tmp;
  1816.     }
  1817.   }
  1818.   return 0; // Impossible
  1819. }
  1820. /*
  1821.   Put a blob length field into a record buffer.
  1822.   SYNOPSIS
  1823.     Field_blob::put_length()
  1824.     pos                         Pointer into the record buffer.
  1825.     length                      The length value to put.
  1826.   DESCRIPTION
  1827.     Depending on the maximum length of a blob, its length field is
  1828.     put into 1 to 4 bytes. This is a property of the blob object,
  1829.     described by 'packlength'.
  1830.   RETURN
  1831.     nothing
  1832. */
  1833. void Field_blob::put_length(char *pos, uint32 length)
  1834. {
  1835.   switch (packlength) {
  1836.   case 1:
  1837.     *pos= (char) length;
  1838.     break;
  1839.   case 2:
  1840.     int2store(pos, length);
  1841.     break;
  1842.   case 3:
  1843.     int3store(pos, length);
  1844.     break;
  1845.   case 4:
  1846.     int4store(pos, length);
  1847.     break;
  1848.   }
  1849. }
  1850. int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
  1851. {
  1852.   int error= 0, well_formed_error;
  1853.   if (!length)
  1854.   {
  1855.     bzero(ptr,Field_blob::pack_length());
  1856.   }
  1857.   else
  1858.   {
  1859.     bool was_conversion;
  1860.     char buff[80];
  1861.     String tmpstr(buff,sizeof(buff), &my_charset_bin);
  1862.     uint copy_length;
  1863.     uint32 not_used;
  1864.     /* Convert character set if nesessary */
  1865.     if ((was_conversion= String::needs_conversion(length, cs, field_charset,
  1866.   &not_used)))
  1867.     { 
  1868.       uint conv_errors;
  1869.       tmpstr.copy(from, length, cs, field_charset, &conv_errors);
  1870.       from= tmpstr.ptr();
  1871.       length=  tmpstr.length();
  1872.       if (conv_errors)
  1873.         error= 2;
  1874.     }
  1875.     
  1876.     copy_length= max_data_length();
  1877.     /*
  1878.       copy_length is ok as last argument to well_formed_len as this is never
  1879.       used to limit the length of the data. The cut of long data is done with
  1880.       the 'min()' call below.
  1881.     */
  1882.     copy_length= field_charset->cset->well_formed_len(field_charset,
  1883.                                                       from,from +
  1884.                                                       min(length, copy_length),
  1885.                                                       copy_length,
  1886.                                                       &well_formed_error);
  1887.     if (copy_length < length)
  1888.       error= 2;
  1889.     Field_blob::store_length(copy_length);
  1890.     if (was_conversion || table->copy_blobs || copy_length <= MAX_FIELD_WIDTH)
  1891.     { // Must make a copy
  1892.       if (from != value.ptr()) // For valgrind
  1893.       {
  1894. value.copy(from,copy_length,charset());
  1895. from=value.ptr();
  1896.       }
  1897.     }
  1898.     bmove(ptr+packlength,(char*) &from,sizeof(char*));
  1899.   }
  1900.   if (error)
  1901.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  1902.   return 0;
  1903. }
  1904. int Field_blob::store(double nr)
  1905. {
  1906.   CHARSET_INFO *cs=charset();
  1907.   value.set(nr, 2, cs);
  1908.   return Field_blob::store(value.ptr(),(uint) value.length(), cs);
  1909. }
  1910. int Field_blob::store(longlong nr)
  1911. {
  1912.   CHARSET_INFO *cs=charset();
  1913.   value.set(nr, cs);
  1914.   return Field_blob::store(value.ptr(), (uint) value.length(), cs);
  1915. }
  1916. double Field_blob::val_real(void)
  1917. {
  1918.   int not_used;
  1919.   char *blob;
  1920.   char *end_not_used;
  1921.   memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
  1922.   if (!blob)
  1923.     return 0.0;
  1924.   uint32 length=get_length(ptr);
  1925.   CHARSET_INFO *cs=charset();
  1926.   return my_strntod(cs,blob,length, &end_not_used, &not_used);
  1927. }
  1928. longlong Field_blob::val_int(void)
  1929. {
  1930.   int not_used;
  1931.   char *blob;
  1932.   memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
  1933.   if (!blob)
  1934.     return 0;
  1935.   uint32 length=get_length(ptr);
  1936.   return my_strntoll(charset(),blob,length,10,NULL,&not_used);
  1937. }
  1938. String *Field_blob::val_str(String *val_buffer __attribute__((unused)),
  1939.     String *val_ptr)
  1940. {
  1941.   char *blob;
  1942.   memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
  1943.   if (!blob)
  1944.     val_ptr->set("",0,charset()); // A bit safer than ->length(0)
  1945.   else
  1946.     val_ptr->set((const char*) blob,get_length(ptr),charset());
  1947.   return val_ptr;
  1948. }
  1949. int Field_blob::cmp(const char *a,uint32 a_length, const char *b,
  1950.     uint32 b_length)
  1951. {
  1952.   return field_charset->coll->strnncoll(field_charset, 
  1953.                                         (const uchar*)a, a_length,
  1954.                                         (const uchar*)b, b_length,
  1955.                                         0);
  1956. }
  1957. int Field_blob::cmp(const char *a_ptr, const char *b_ptr)
  1958. {
  1959.   char *blob1,*blob2;
  1960.   memcpy_fixed(&blob1,a_ptr+packlength,sizeof(char*));
  1961.   memcpy_fixed(&blob2,b_ptr+packlength,sizeof(char*));
  1962.   return Field_blob::cmp(blob1,get_length(a_ptr),
  1963.  blob2,get_length(b_ptr));
  1964. }
  1965. int Field_blob::cmp_offset(uint row_offset)
  1966. {
  1967.   return Field_blob::cmp(ptr,ptr+row_offset);
  1968. }
  1969. int Field_blob::cmp_binary_offset(uint row_offset)
  1970. {
  1971.   return cmp_binary(ptr, ptr+row_offset);
  1972. }
  1973. int Field_blob::cmp_binary(const char *a_ptr, const char *b_ptr,
  1974.    uint32 max_length)
  1975. {
  1976.   char *a,*b;
  1977.   uint diff;
  1978.   uint32 a_length,b_length;
  1979.   memcpy_fixed(&a,a_ptr+packlength,sizeof(char*));
  1980.   memcpy_fixed(&b,b_ptr+packlength,sizeof(char*));
  1981.   a_length=get_length(a_ptr);
  1982.   if (a_length > max_length)
  1983.     a_length=max_length;
  1984.   b_length=get_length(b_ptr);
  1985.   if (b_length > max_length)
  1986.     b_length=max_length;
  1987.   diff=memcmp(a,b,min(a_length,b_length));
  1988.   return diff ? diff : (int) (a_length - b_length);
  1989. }
  1990. /* The following is used only when comparing a key */
  1991. void Field_blob::get_key_image(char *buff,uint length,
  1992.        CHARSET_INFO *cs, imagetype type)
  1993. {
  1994.   uint32 blob_length= get_length(ptr);
  1995.   char *blob;
  1996. #ifdef HAVE_SPATIAL
  1997.   if (type == itMBR)
  1998.   {
  1999.     const char *dummy;
  2000.     MBR mbr;
  2001.     Geometry_buffer buffer;
  2002.     Geometry *gobj;
  2003.     if (blob_length < SRID_SIZE)
  2004.     {
  2005.       bzero(buff, SIZEOF_STORED_DOUBLE*4);
  2006.       return;
  2007.     }
  2008.     get_ptr(&blob);
  2009.     gobj= Geometry::construct(&buffer, blob, blob_length);
  2010.     if (gobj->get_mbr(&mbr, &dummy))
  2011.       bzero(buff, SIZEOF_STORED_DOUBLE*4);
  2012.     else
  2013.     {
  2014.       float8store(buff,    mbr.xmin);
  2015.       float8store(buff+8,  mbr.xmax);
  2016.       float8store(buff+16, mbr.ymin);
  2017.       float8store(buff+24, mbr.ymax);
  2018.     }
  2019.     return;
  2020.   }
  2021. #endif /*HAVE_SPATIAL*/
  2022.   get_ptr(&blob);
  2023.   uint char_length= length / cs->mbmaxlen;
  2024.   char_length= my_charpos(cs, blob, blob + blob_length, char_length);
  2025.   set_if_smaller(blob_length, char_length);
  2026.   if ((uint32) length > blob_length)
  2027.   {
  2028.     /*
  2029.       Must clear this as we do a memcmp in opt_range.cc to detect
  2030.       identical keys
  2031.     */
  2032.     bzero(buff+HA_KEY_BLOB_LENGTH+blob_length, (length-blob_length));
  2033.     length=(uint) blob_length;
  2034.   }
  2035.   int2store(buff,length);
  2036.   memcpy(buff+HA_KEY_BLOB_LENGTH, blob, length);
  2037. }
  2038. void Field_blob::set_key_image(char *buff,uint length, CHARSET_INFO *cs)
  2039. {
  2040.   length= uint2korr(buff);
  2041.   (void) Field_blob::store(buff+HA_KEY_BLOB_LENGTH, length, cs);
  2042. }
  2043. int Field_blob::key_cmp(const byte *key_ptr, uint max_key_length)
  2044. {
  2045.   char *blob1;
  2046.   uint blob_length=get_length(ptr);
  2047.   memcpy_fixed(&blob1,ptr+packlength,sizeof(char*));
  2048.   CHARSET_INFO *cs= charset();
  2049.   uint char_length= max_key_length / cs->mbmaxlen;
  2050.   char_length= my_charpos(cs, blob1, blob1+blob_length, char_length);
  2051.   set_if_smaller(blob_length, char_length);
  2052.   return Field_blob::cmp(blob1,min(blob_length, max_key_length),
  2053.  (char*) key_ptr+HA_KEY_BLOB_LENGTH,
  2054.  uint2korr(key_ptr));
  2055. }
  2056. int Field_blob::key_cmp(const byte *a,const byte *b)
  2057. {
  2058.   return Field_blob::cmp((char*) a+HA_KEY_BLOB_LENGTH, uint2korr(a),
  2059.  (char*) b+HA_KEY_BLOB_LENGTH, uint2korr(b));
  2060. }
  2061. void Field_blob::sort_string(char *to,uint length)
  2062. {
  2063.   char *blob;
  2064.   uint blob_length=get_length();
  2065.   if (!blob_length)
  2066.     bzero(to,length);
  2067.   else
  2068.   {
  2069.     memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
  2070.     
  2071.     blob_length=my_strnxfrm(field_charset,
  2072.                             (uchar*) to, length, 
  2073.                             (uchar*) blob, blob_length);
  2074.     DBUG_ASSERT(blob_length == length);
  2075.   }
  2076. }
  2077. void Field_blob::sql_type(String &res) const
  2078. {
  2079.   const char *str;
  2080.   uint length;
  2081.   switch (packlength) {
  2082.   default: str="tiny"; length=4; break;
  2083.   case 2:  str="";     length=0; break;
  2084.   case 3:  str="medium"; length= 6; break;
  2085.   case 4:  str="long";  length=4; break;
  2086.   }
  2087.   res.set_ascii(str,length);
  2088.   if (charset() == &my_charset_bin)
  2089.     res.append("blob");
  2090.   else
  2091.   {
  2092.     res.append("text");
  2093.   }
  2094. }
  2095. char *Field_blob::pack(char *to, const char *from, uint max_length)
  2096. {
  2097.   char *save=ptr;
  2098.   ptr=(char*) from;
  2099.   uint32 length=get_length(); // Length of from string
  2100.   if (length > max_length)
  2101.   {
  2102.     ptr=to;
  2103.     length=max_length;
  2104.     store_length(length); // Store max length
  2105.     ptr=(char*) from;
  2106.   }
  2107.   else
  2108.     memcpy(to,from,packlength); // Copy length
  2109.   if (length)
  2110.   {
  2111.     get_ptr((char**) &from);
  2112.     memcpy(to+packlength, from,length);
  2113.   }
  2114.   ptr=save; // Restore org row pointer
  2115.   return to+packlength+length;
  2116. }
  2117. const char *Field_blob::unpack(char *to, const char *from)
  2118. {
  2119.   memcpy(to,from,packlength);
  2120.   uint32 length=get_length(from);
  2121.   from+=packlength;
  2122.   if (length)
  2123.     memcpy_fixed(to+packlength, &from, sizeof(from));
  2124.   else
  2125.     bzero(to+packlength,sizeof(from));
  2126.   return from+length;
  2127. }
  2128. /* Keys for blobs are like keys on varchars */
  2129. int Field_blob::pack_cmp(const char *a, const char *b, uint key_length)
  2130. {
  2131.   uint a_length;
  2132.   uint b_length;
  2133.   if (key_length > 255)
  2134.   {
  2135.     a_length=uint2korr(a); a+=2;
  2136.     b_length=uint2korr(b); b+=2;
  2137.   }
  2138.   else
  2139.   {
  2140.     a_length= (uint) (uchar) *a++;
  2141.     b_length= (uint) (uchar) *b++;
  2142.   }
  2143.   return my_strnncoll(field_charset,
  2144.      (const uchar*) a, a_length,
  2145.      (const uchar*) b, b_length);
  2146. }
  2147. int Field_blob::pack_cmp(const char *b, uint key_length)
  2148. {
  2149.   char *a;
  2150.   memcpy_fixed(&a,ptr+packlength,sizeof(char*));
  2151.   if (!a)
  2152.     return key_length > 0 ? -1 : 0;
  2153.   uint a_length=get_length(ptr);
  2154.   uint b_length;
  2155.   if (key_length > 255)
  2156.   {
  2157.     b_length=uint2korr(b); b+=2;
  2158.   }
  2159.   else
  2160.   {
  2161.     b_length= (uint) (uchar) *b++;
  2162.   }
  2163.   return my_strnncoll(field_charset,
  2164.      (const uchar*) a, a_length,
  2165.      (const uchar*) b, b_length);
  2166. }
  2167. /* Create a packed key that will be used for storage from a MySQL row */
  2168. char *Field_blob::pack_key(char *to, const char *from, uint max_length)
  2169. {
  2170.   char *save=ptr;
  2171.   ptr=(char*) from;
  2172.   uint32 length=get_length(); // Length of from string
  2173.   uint char_length= (field_charset->mbmaxlen > 1) ?
  2174.               max_length/field_charset->mbmaxlen : max_length;
  2175.   if (length)
  2176.     get_ptr((char**) &from);
  2177.   if (length > char_length)
  2178.     char_length= my_charpos(field_charset, from, from+length, char_length);
  2179.   set_if_smaller(length, char_length);
  2180.   *to++= (uchar) length;
  2181.   if (max_length > 255) // 2 byte length
  2182.     *to++= (uchar) (length >> 8);
  2183.   memcpy(to, from, length);
  2184.   ptr=save; // Restore org row pointer
  2185.   return to+length;
  2186. }
  2187. /*
  2188.   Unpack a blob key into a record buffer.
  2189.   SYNOPSIS
  2190.     Field_blob::unpack_key()
  2191.     to                          Pointer into the record buffer.
  2192.     from                        Pointer to the packed key.
  2193.     max_length                  Key length limit from key description.
  2194.   DESCRIPTION
  2195.     A blob key has a maximum size of 64K-1.
  2196.     In its packed form, the length field is one or two bytes long,
  2197.     depending on 'max_length'.
  2198.     Depending on the maximum length of a blob, its length field is
  2199.     put into 1 to 4 bytes. This is a property of the blob object,
  2200.     described by 'packlength'.
  2201.     Blobs are internally stored apart from the record buffer, which
  2202.     contains a pointer to the blob buffer.
  2203.   RETURN
  2204.     Pointer into 'from' past the last byte copied from packed key.
  2205. */
  2206. const char *Field_blob::unpack_key(char *to, const char *from, uint max_length)
  2207. {
  2208.   /* get length of the blob key */
  2209.   uint32 length= *((uchar*) from++);
  2210.   if (max_length > 255)
  2211.     length+= (*((uchar*) from++)) << 8;
  2212.   /* put the length into the record buffer */
  2213.   put_length(to, length);
  2214.   /* put the address of the blob buffer or NULL */
  2215.   if (length)
  2216.     memcpy_fixed(to + packlength, &from, sizeof(from));
  2217.   else
  2218.     bzero(to + packlength, sizeof(from));
  2219.   /* point to first byte of next field in 'from' */
  2220.   return from + length;
  2221. }
  2222. /* Create a packed key that will be used for storage from a MySQL key */
  2223. char *Field_blob::pack_key_from_key_image(char *to, const char *from,
  2224.   uint max_length)
  2225. {
  2226.   uint length=uint2korr(from);
  2227.   if (length > max_length)
  2228.     length=max_length;
  2229.   *to++= (char) (length & 255);
  2230.   if (max_length > 255)
  2231.     *to++= (char) (length >> 8);
  2232.   if (length)
  2233.     memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
  2234.   return to+length;
  2235. }
  2236. uint Field_blob::packed_col_length(const char *data_ptr, uint length)
  2237. {
  2238.   if (length > 255)
  2239.     return uint2korr(data_ptr)+2;
  2240.   else
  2241.     return (uint) ((uchar) *data_ptr)+1;
  2242. }
  2243. uint Field_blob::max_packed_col_length(uint max_length)
  2244. {
  2245.   return (max_length > 255 ? 2 : 1)+max_length;
  2246. }
  2247. #ifdef HAVE_SPATIAL
  2248. void Field_geom::get_key_image(char *buff, uint length, CHARSET_INFO *cs,
  2249.        imagetype type)
  2250. {
  2251.   char *blob;
  2252.   const char *dummy;
  2253.   MBR mbr;
  2254.   ulong blob_length= get_length(ptr);
  2255.   Geometry_buffer buffer;
  2256.   Geometry *gobj;
  2257.   if (blob_length < SRID_SIZE)
  2258.   {
  2259.     bzero(buff, SIZEOF_STORED_DOUBLE*4);
  2260.     return;
  2261.   }
  2262.   get_ptr(&blob);
  2263.   gobj= Geometry::construct(&buffer, blob, blob_length);
  2264.   if (gobj->get_mbr(&mbr, &dummy))
  2265.     bzero(buff, SIZEOF_STORED_DOUBLE*4);
  2266.   else
  2267.   {
  2268.     float8store(buff, mbr.xmin);
  2269.     float8store(buff + 8, mbr.xmax);
  2270.     float8store(buff + 16, mbr.ymin);
  2271.     float8store(buff + 24, mbr.ymax);
  2272.   }
  2273. }
  2274. void Field_geom::set_key_image(char *buff, uint length, CHARSET_INFO *cs)
  2275. {
  2276.   Field_blob::set_key_image(buff, length, cs);
  2277. }
  2278. void Field_geom::sql_type(String &res) const
  2279. {
  2280.   CHARSET_INFO *cs= &my_charset_latin1;
  2281.   switch (geom_type)
  2282.   {
  2283.     case GEOM_POINT:
  2284.      res.set("point", 5, cs);
  2285.      break;
  2286.     case GEOM_LINESTRING:
  2287.      res.set("linestring", 10, cs);
  2288.      break;
  2289.     case GEOM_POLYGON:
  2290.      res.set("polygon", 7, cs);
  2291.      break;
  2292.     case GEOM_MULTIPOINT:
  2293.      res.set("multipoint", 10, cs);
  2294.      break;
  2295.     case GEOM_MULTILINESTRING:
  2296.      res.set("multilinestring", 15, cs);
  2297.      break;
  2298.     case GEOM_MULTIPOLYGON:
  2299.      res.set("multipolygon", 12, cs);
  2300.      break;
  2301.     case GEOM_GEOMETRYCOLLECTION:
  2302.      res.set("geometrycollection", 18, cs);
  2303.      break;
  2304.     default:
  2305.      res.set("geometry", 8, cs);
  2306.   }
  2307. }
  2308. int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs)
  2309. {
  2310.   if (!length)
  2311.     bzero(ptr, Field_blob::pack_length());
  2312.   else
  2313.   {
  2314.     // Check given WKB
  2315.     uint32 wkb_type;
  2316.     if (length < SRID_SIZE + WKB_HEADER_SIZE + SIZEOF_STORED_DOUBLE*2)
  2317.       goto err;
  2318.     wkb_type= uint4korr(from + SRID_SIZE + 1);
  2319.     if (wkb_type < (uint32) Geometry::wkb_point ||
  2320. wkb_type > (uint32) Geometry::wkb_end)
  2321.       return -1;
  2322.     Field_blob::store_length(length);
  2323.     if (table->copy_blobs || length <= MAX_FIELD_WIDTH)
  2324.     { // Must make a copy
  2325.       value.copy(from, length, cs);
  2326.       from= value.ptr();
  2327.     }
  2328.     bmove(ptr + packlength, (char*) &from, sizeof(char*));
  2329.   }
  2330.   return 0;
  2331. err:
  2332.   bzero(ptr, Field_blob::pack_length());  
  2333.   return -1;
  2334. }
  2335. #endif /*HAVE_SPATIAL*/
  2336. /****************************************************************************
  2337. ** enum type.
  2338. ** This is a string which only can have a selection of different values.
  2339. ** If one uses this string in a number context one gets the type number.
  2340. ****************************************************************************/
  2341. enum ha_base_keytype Field_enum::key_type() const
  2342. {
  2343.   switch (packlength) {
  2344.   default: return HA_KEYTYPE_BINARY;
  2345.   case 2: return HA_KEYTYPE_USHORT_INT;
  2346.   case 3: return HA_KEYTYPE_UINT24;
  2347.   case 4: return HA_KEYTYPE_ULONG_INT;
  2348.   case 8: return HA_KEYTYPE_ULONGLONG;
  2349.   }
  2350. }
  2351. void Field_enum::store_type(ulonglong value)
  2352. {
  2353.   switch (packlength) {
  2354.   case 1: ptr[0]= (uchar) value;  break;
  2355.   case 2:
  2356. #ifdef WORDS_BIGENDIAN
  2357.   if (table->db_low_byte_first)
  2358.   {
  2359.     int2store(ptr,(unsigned short) value);
  2360.   }
  2361.   else
  2362. #endif
  2363.     shortstore(ptr,(unsigned short) value);
  2364.   break;
  2365.   case 3: int3store(ptr,(long) value); break;
  2366.   case 4:
  2367. #ifdef WORDS_BIGENDIAN
  2368.   if (table->db_low_byte_first)
  2369.   {
  2370.     int4store(ptr,value);
  2371.   }
  2372.   else
  2373. #endif
  2374.     longstore(ptr,(long) value);
  2375.   break;
  2376.   case 8:
  2377. #ifdef WORDS_BIGENDIAN
  2378.   if (table->db_low_byte_first)
  2379.   {
  2380.     int8store(ptr,value);
  2381.   }
  2382.   else
  2383. #endif
  2384.     longlongstore(ptr,value); break;
  2385.   }
  2386. }
  2387. /*
  2388. ** Note. Storing a empty string in a enum field gives a warning
  2389. ** (if there isn't a empty value in the enum)
  2390. */
  2391. int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
  2392. {
  2393.   int err= 0;
  2394.   uint32 not_used;
  2395.   char buff[80];
  2396.   String tmpstr(buff,sizeof(buff), &my_charset_bin);
  2397.   /* Convert character set if nesessary */
  2398.   if (String::needs_conversion(length, cs, field_charset, &not_used))
  2399.   { 
  2400.     uint dummy_errors;
  2401.     tmpstr.copy(from, length, cs, field_charset, &dummy_errors);
  2402.     from= tmpstr.ptr();
  2403.     length=  tmpstr.length();
  2404.   }
  2405.   /* Remove end space */
  2406.   length= field_charset->cset->lengthsp(field_charset, from, length);
  2407.   uint tmp=find_type2(typelib, from, length, field_charset);
  2408.   if (!tmp)
  2409.   {
  2410.     if (length < 6) // Can't be more than 99999 enums
  2411.     {
  2412.       /* This is for reading numbers with LOAD DATA INFILE */
  2413.       char *end;
  2414.       tmp=(uint) my_strntoul(cs,from,length,10,&end,&err);
  2415.       if (err || end != from+length || tmp > typelib->count)
  2416.       {
  2417. tmp=0;
  2418. set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  2419.       }
  2420.     }
  2421.     else
  2422.       set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  2423.   }
  2424.   store_type((ulonglong) tmp);
  2425.   return err;
  2426. }
  2427. int Field_enum::store(double nr)
  2428. {
  2429.   return Field_enum::store((longlong) nr);
  2430. }
  2431. int Field_enum::store(longlong nr)
  2432. {
  2433.   int error= 0;
  2434.   if ((uint) nr > typelib->count || nr == 0)
  2435.   {
  2436.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  2437.     nr=0;
  2438.     error=1;
  2439.   }
  2440.   store_type((ulonglong) (uint) nr);
  2441.   return error;
  2442. }
  2443. double Field_enum::val_real(void)
  2444. {
  2445.   return (double) Field_enum::val_int();
  2446. }
  2447. longlong Field_enum::val_int(void)
  2448. {
  2449.   switch (packlength) {
  2450.   case 1:
  2451.     return (longlong) (uchar) ptr[0];
  2452.   case 2:
  2453.     {
  2454.       uint16 tmp;
  2455. #ifdef WORDS_BIGENDIAN
  2456.       if (table->db_low_byte_first)
  2457. tmp=sint2korr(ptr);
  2458.       else
  2459. #endif
  2460. shortget(tmp,ptr);
  2461.       return (longlong) tmp;
  2462.     }
  2463.   case 3:
  2464.     return (longlong) uint3korr(ptr);
  2465.   case 4:
  2466.     {
  2467.       uint32 tmp;
  2468. #ifdef WORDS_BIGENDIAN
  2469.       if (table->db_low_byte_first)
  2470. tmp=uint4korr(ptr);
  2471.       else
  2472. #endif
  2473. longget(tmp,ptr);
  2474.       return (longlong) tmp;
  2475.     }
  2476.   case 8:
  2477.     {
  2478.       longlong tmp;
  2479. #ifdef WORDS_BIGENDIAN
  2480.       if (table->db_low_byte_first)
  2481. tmp=sint8korr(ptr);
  2482.       else
  2483. #endif
  2484. longlongget(tmp,ptr);
  2485.       return tmp;
  2486.     }
  2487.   }
  2488.   return 0; // impossible
  2489. }
  2490. String *Field_enum::val_str(String *val_buffer __attribute__((unused)),
  2491.     String *val_ptr)
  2492. {
  2493.   uint tmp=(uint) Field_enum::val_int();
  2494.   if (!tmp || tmp > typelib->count)
  2495.     val_ptr->set("", 0, field_charset);
  2496.   else
  2497.     val_ptr->set((const char*) typelib->type_names[tmp-1],
  2498.  typelib->type_lengths[tmp-1],
  2499.  field_charset);
  2500.   return val_ptr;
  2501. }
  2502. int Field_enum::cmp(const char *a_ptr, const char *b_ptr)
  2503. {
  2504.   char *old=ptr;
  2505.   ptr=(char*) a_ptr;
  2506.   ulonglong a=Field_enum::val_int();
  2507.   ptr=(char*) b_ptr;
  2508.   ulonglong b=Field_enum::val_int();
  2509.   ptr=old;
  2510.   return (a < b) ? -1 : (a > b) ? 1 : 0;
  2511. }
  2512. void Field_enum::sort_string(char *to,uint length __attribute__((unused)))
  2513. {
  2514.   ulonglong value=Field_enum::val_int();
  2515.   to+=packlength-1;
  2516.   for (uint i=0 ; i < packlength ; i++)
  2517.   {
  2518.     *to-- = (uchar) (value & 255);
  2519.     value>>=8;
  2520.   }
  2521. }
  2522. void Field_enum::sql_type(String &res) const
  2523. {
  2524.   char buffer[255];
  2525.   String enum_item(buffer, sizeof(buffer), res.charset());
  2526.   res.length(0);
  2527.   res.append("enum(");
  2528.   bool flag=0;
  2529.   uint *len= typelib->type_lengths;
  2530.   for (const char **pos= typelib->type_names; *pos; pos++, len++)
  2531.   {
  2532.     uint dummy_errors;
  2533.     if (flag)
  2534.       res.append(',');
  2535.     /* convert to res.charset() == utf8, then quote */
  2536.     enum_item.copy(*pos, *len, charset(), res.charset(), &dummy_errors);
  2537.     append_unescaped(&res, enum_item.ptr(), enum_item.length());
  2538.     flag= 1;
  2539.   }
  2540.   res.append(')');
  2541. }
  2542. /*
  2543.    set type.
  2544.    This is a string which can have a collection of different values.
  2545.    Each string value is separated with a ','.
  2546.    For example "One,two,five"
  2547.    If one uses this string in a number context one gets the bits as a longlong
  2548.    number.
  2549. */
  2550. int Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
  2551. {
  2552.   bool got_warning= 0;
  2553.   int err= 0;
  2554.   char *not_used;
  2555.   uint not_used2;
  2556.   uint32 not_used_offset;
  2557.   char buff[80];
  2558.   String tmpstr(buff,sizeof(buff), &my_charset_bin);
  2559.   /* Convert character set if nesessary */
  2560.   if (String::needs_conversion(length, cs, field_charset, &not_used_offset))
  2561.   { 
  2562.     uint dummy_errors;
  2563.     tmpstr.copy(from, length, cs, field_charset, &dummy_errors);
  2564.     from= tmpstr.ptr();
  2565.     length=  tmpstr.length();
  2566.   }
  2567.   ulonglong tmp= find_set(typelib, from, length, field_charset,
  2568.                           &not_used, &not_used2, &got_warning);
  2569.   if (!tmp && length && length < 22)
  2570.   {
  2571.     /* This is for reading numbers with LOAD DATA INFILE */
  2572.     char *end;
  2573.     tmp=my_strntoull(cs,from,length,10,&end,&err);
  2574.     if (err || end != from+length ||
  2575. tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1))
  2576.     {
  2577.       tmp=0;      
  2578.       set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  2579.     }
  2580.   }
  2581.   else if (got_warning)
  2582.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  2583.   store_type(tmp);
  2584.   return err;
  2585. }
  2586. int Field_set::store(longlong nr)
  2587. {
  2588.   int error= 0;
  2589.   if ((ulonglong) nr > (ulonglong) (((longlong) 1 << typelib->count) -
  2590.     (longlong) 1))
  2591.   {
  2592.     nr&= (longlong) (((longlong) 1 << typelib->count) - (longlong) 1);    
  2593.     set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
  2594.     error=1;
  2595.   }
  2596.   store_type((ulonglong) nr);
  2597.   return error;
  2598. }
  2599. String *Field_set::val_str(String *val_buffer,
  2600.    String *val_ptr __attribute__((unused)))
  2601. {
  2602.   ulonglong tmp=(ulonglong) Field_enum::val_int();
  2603.   uint bitnr=0;
  2604.   val_buffer->length(0);
  2605.   val_buffer->set_charset(field_charset);
  2606.   while (tmp && bitnr < (uint) typelib->count)
  2607.   {
  2608.     if (tmp & 1)
  2609.     {
  2610.       if (val_buffer->length())
  2611. val_buffer->append(&field_separator, 1, &my_charset_latin1);
  2612.       String str(typelib->type_names[bitnr],
  2613.  typelib->type_lengths[bitnr],
  2614.  field_charset);
  2615.       val_buffer->append(str);
  2616.     }
  2617.     tmp>>=1;
  2618.     bitnr++;
  2619.   }
  2620.   return val_buffer;
  2621. }
  2622. void Field_set::sql_type(String &res) const
  2623. {
  2624.   char buffer[255];
  2625.   String set_item(buffer, sizeof(buffer), res.charset());
  2626.   res.length(0);
  2627.   res.append("set(");
  2628.   bool flag=0;
  2629.   uint *len= typelib->type_lengths;
  2630.   for (const char **pos= typelib->type_names; *pos; pos++, len++)
  2631.   {
  2632.     uint dummy_errors;
  2633.     if (flag)
  2634.       res.append(',');
  2635.     /* convert to res.charset() == utf8, then quote */
  2636.     set_item.copy(*pos, *len, charset(), res.charset(), &dummy_errors);
  2637.     append_unescaped(&res, set_item.ptr(), set_item.length());
  2638.     flag= 1;
  2639.   }
  2640.   res.append(')');
  2641. }
  2642. /* returns 1 if the fields are equally defined */
  2643. bool Field::eq_def(Field *field)
  2644. {
  2645.   if (real_type() != field->real_type() || charset() != field->charset() ||
  2646.       pack_length() != field->pack_length())
  2647.     return 0;
  2648.   return 1;
  2649. }
  2650. bool Field_enum::eq_def(Field *field)
  2651. {
  2652.   if (!Field::eq_def(field))
  2653.     return 0;
  2654.   TYPELIB *from_lib=((Field_enum*) field)->typelib;
  2655.   if (typelib->count < from_lib->count)
  2656.     return 0;
  2657.   for (uint i=0 ; i < from_lib->count ; i++)
  2658.     if (my_strnncoll(field_charset,
  2659.                      (const uchar*)typelib->type_names[i],
  2660.                      strlen(typelib->type_names[i]),
  2661.                      (const uchar*)from_lib->type_names[i],
  2662.                      strlen(from_lib->type_names[i])))
  2663.       return 0;
  2664.   return 1;
  2665. }
  2666. bool Field_num::eq_def(Field *field)
  2667. {
  2668.   if (!Field::eq_def(field))
  2669.     return 0;
  2670.   Field_num *from_num= (Field_num*) field;
  2671.   if (unsigned_flag != from_num->unsigned_flag ||
  2672.       zerofill && !from_num->zerofill && !zero_pack() ||
  2673.       dec != from_num->dec)
  2674.     return 0;
  2675.   return 1;
  2676. }
  2677. /*****************************************************************************
  2678. ** Handling of field and create_field
  2679. *****************************************************************************/
  2680. /*
  2681.   Convert create_field::length from number of characters to number of bytes
  2682.   SYNOPSIS
  2683.     create_field::create_length_to_internal_length()
  2684.   
  2685.   DESCRIPTION
  2686.     Convert create_field::length from number of characters to number of bytes,
  2687.     save original value in chars_length.
  2688. */
  2689. void create_field::create_length_to_internal_length(void)
  2690. {
  2691.   chars_length= length;
  2692.   switch (sql_type) {
  2693.   case MYSQL_TYPE_TINY_BLOB:
  2694.   case MYSQL_TYPE_MEDIUM_BLOB:
  2695.   case MYSQL_TYPE_LONG_BLOB:
  2696.   case MYSQL_TYPE_BLOB:
  2697.   case MYSQL_TYPE_VAR_STRING:
  2698.   case MYSQL_TYPE_STRING:
  2699.     length*= charset->mbmaxlen;
  2700.     pack_length= calc_pack_length(sql_type == FIELD_TYPE_VAR_STRING ?
  2701.                                   FIELD_TYPE_STRING : sql_type, length);
  2702.     break;
  2703.   case MYSQL_TYPE_ENUM:
  2704.   case MYSQL_TYPE_SET:
  2705.     length*= charset->mbmaxlen;
  2706.     break;
  2707.   default:
  2708.     /* do nothing */
  2709.     break;
  2710.   }
  2711. }
  2712. /*
  2713.   Make a field from the .frm file info
  2714. */
  2715. uint32 calc_pack_length(enum_field_types type,uint32 length)
  2716. {
  2717.   switch (type) {
  2718.   case FIELD_TYPE_STRING:
  2719.   case FIELD_TYPE_DECIMAL: return (length);
  2720.   case FIELD_TYPE_VAR_STRING: return (length+HA_KEY_BLOB_LENGTH);
  2721.   case FIELD_TYPE_YEAR:
  2722.   case FIELD_TYPE_TINY : return 1;
  2723.   case FIELD_TYPE_SHORT : return 2;
  2724.   case FIELD_TYPE_INT24:
  2725.   case FIELD_TYPE_NEWDATE:
  2726.   case FIELD_TYPE_TIME:   return 3;
  2727.   case FIELD_TYPE_TIMESTAMP:
  2728.   case FIELD_TYPE_DATE:
  2729.   case FIELD_TYPE_LONG : return 4;
  2730.   case FIELD_TYPE_FLOAT : return sizeof(float);
  2731.   case FIELD_TYPE_DOUBLE: return sizeof(double);
  2732.   case FIELD_TYPE_DATETIME:
  2733.   case FIELD_TYPE_LONGLONG: return 8; /* Don't crash if no longlong */
  2734.   case FIELD_TYPE_NULL : return 0;
  2735.   case FIELD_TYPE_TINY_BLOB: return 1+portable_sizeof_char_ptr;
  2736.   case FIELD_TYPE_BLOB: return 2+portable_sizeof_char_ptr;
  2737.   case FIELD_TYPE_MEDIUM_BLOB: return 3+portable_sizeof_char_ptr;
  2738.   case FIELD_TYPE_LONG_BLOB: return 4+portable_sizeof_char_ptr;
  2739.   case FIELD_TYPE_GEOMETRY: return 4+portable_sizeof_char_ptr;
  2740.   case FIELD_TYPE_SET:
  2741.   case FIELD_TYPE_ENUM: abort(); return 0; // This shouldn't happen
  2742.   default: return 0;
  2743.   }
  2744.   return 0; // Keep compiler happy
  2745. }
  2746. uint pack_length_to_packflag(uint type)
  2747. {
  2748.   switch (type) {
  2749.     case 1: return f_settype((uint) FIELD_TYPE_TINY);
  2750.     case 2: return f_settype((uint) FIELD_TYPE_SHORT);
  2751.     case 3: return f_settype((uint) FIELD_TYPE_INT24);
  2752.     case 4: return f_settype((uint) FIELD_TYPE_LONG);
  2753.     case 8: return f_settype((uint) FIELD_TYPE_LONGLONG);
  2754.   }
  2755.   return 0; // This shouldn't happen
  2756. }
  2757. Field *make_field(char *ptr, uint32 field_length,
  2758.   uchar *null_pos, uchar null_bit,
  2759.   uint pack_flag,
  2760.   enum_field_types field_type,
  2761.   CHARSET_INFO *field_charset,
  2762.   Field::geometry_type geom_type,
  2763.   Field::utype unireg_check,
  2764.   TYPELIB *interval,
  2765.   const char *field_name,
  2766.   struct st_table *table)
  2767. {
  2768.   if (!f_maybe_null(pack_flag))
  2769.   {
  2770.     null_pos=0;
  2771.     null_bit=0;
  2772.   }
  2773.   switch (field_type)
  2774.   {
  2775.     case FIELD_TYPE_DATE:
  2776.     case FIELD_TYPE_NEWDATE:
  2777.     case FIELD_TYPE_TIME:
  2778.     case FIELD_TYPE_DATETIME:
  2779.     case FIELD_TYPE_TIMESTAMP:
  2780.       field_charset= &my_charset_bin;
  2781.     default: break;
  2782.   }
  2783.   if (f_is_alpha(pack_flag))
  2784.   {
  2785.     if (!f_is_packed(pack_flag))
  2786.     {
  2787.       if (field_type == FIELD_TYPE_STRING ||
  2788.           field_type == FIELD_TYPE_DECIMAL ||   // 3.23 or 4.0 string
  2789.           field_type == FIELD_TYPE_VAR_STRING)
  2790.         return new Field_string(ptr,field_length,null_pos,null_bit,
  2791.                                 unireg_check, field_name, table,
  2792.                                 field_charset);
  2793.       return 0;                                 // Error
  2794.     }
  2795.     uint pack_length=calc_pack_length((enum_field_types)
  2796.       f_packtype(pack_flag),
  2797.       field_length);
  2798. #ifdef HAVE_SPATIAL
  2799.     if (f_is_geom(pack_flag))
  2800.       return new Field_geom(ptr,null_pos,null_bit,
  2801.     unireg_check, field_name, table,
  2802.     pack_length, geom_type);
  2803. #endif
  2804.     if (f_is_blob(pack_flag))
  2805.       return new Field_blob(ptr,null_pos,null_bit,
  2806.     unireg_check, field_name, table,
  2807.     pack_length, field_charset);
  2808.     if (interval)
  2809.     {
  2810.       if (f_is_enum(pack_flag))
  2811. return new Field_enum(ptr,field_length,null_pos,null_bit,
  2812.   unireg_check, field_name, table,
  2813.   pack_length, interval, field_charset);
  2814.       else
  2815. return new Field_set(ptr,field_length,null_pos,null_bit,
  2816.      unireg_check, field_name, table,
  2817.      pack_length, interval, field_charset);
  2818.     }
  2819.   }
  2820.   switch (field_type) {
  2821.   case FIELD_TYPE_DECIMAL:
  2822.     return new Field_decimal(ptr,field_length,null_pos,null_bit,
  2823.      unireg_check, field_name, table,
  2824.      f_decimals(pack_flag),
  2825.      f_is_zerofill(pack_flag) != 0,
  2826.      f_is_dec(pack_flag) == 0);
  2827.   case FIELD_TYPE_FLOAT:
  2828.     return new Field_float(ptr,field_length,null_pos,null_bit,
  2829.    unireg_check, field_name, table,
  2830.    f_decimals(pack_flag),
  2831.    f_is_zerofill(pack_flag) != 0,
  2832.    f_is_dec(pack_flag)== 0);
  2833.   case FIELD_TYPE_DOUBLE:
  2834.     return new Field_double(ptr,field_length,null_pos,null_bit,
  2835.     unireg_check, field_name, table,
  2836.     f_decimals(pack_flag),
  2837.     f_is_zerofill(pack_flag) != 0,
  2838.     f_is_dec(pack_flag)== 0);
  2839.   case FIELD_TYPE_TINY:
  2840.     return new Field_tiny(ptr,field_length,null_pos,null_bit,
  2841.   unireg_check, field_name, table,
  2842.   f_is_zerofill(pack_flag) != 0,
  2843.   f_is_dec(pack_flag) == 0);
  2844.   case FIELD_TYPE_SHORT:
  2845.     return new Field_short(ptr,field_length,null_pos,null_bit,
  2846.    unireg_check, field_name, table,
  2847.    f_is_zerofill(pack_flag) != 0,
  2848.    f_is_dec(pack_flag) == 0);
  2849.   case FIELD_TYPE_INT24:
  2850.     return new Field_medium(ptr,field_length,null_pos,null_bit,
  2851.     unireg_check, field_name, table,
  2852.     f_is_zerofill(pack_flag) != 0,
  2853.     f_is_dec(pack_flag) == 0);
  2854.   case FIELD_TYPE_LONG:
  2855.     return new Field_long(ptr,field_length,null_pos,null_bit,
  2856.    unireg_check, field_name, table,
  2857.    f_is_zerofill(pack_flag) != 0,
  2858.    f_is_dec(pack_flag) == 0);
  2859.   case FIELD_TYPE_LONGLONG:
  2860.     return new Field_longlong(ptr,field_length,null_pos,null_bit,
  2861.       unireg_check, field_name, table,
  2862.       f_is_zerofill(pack_flag) != 0,
  2863.       f_is_dec(pack_flag) == 0);
  2864.   case FIELD_TYPE_TIMESTAMP:
  2865.     return new Field_timestamp(ptr,field_length, null_pos, null_bit,
  2866.                                unireg_check, field_name, table,
  2867.                                field_charset);
  2868.   case FIELD_TYPE_YEAR:
  2869.     return new Field_year(ptr,field_length,null_pos,null_bit,
  2870.   unireg_check, field_name, table);
  2871.   case FIELD_TYPE_DATE:
  2872.     return new Field_date(ptr,null_pos,null_bit,
  2873.   unireg_check, field_name, table, field_charset);
  2874.   case FIELD_TYPE_NEWDATE:
  2875.     return new Field_newdate(ptr,null_pos,null_bit,
  2876.      unireg_check, field_name, table, field_charset);
  2877.   case FIELD_TYPE_TIME:
  2878.     return new Field_time(ptr,null_pos,null_bit,
  2879.   unireg_check, field_name, table, field_charset);
  2880.   case FIELD_TYPE_DATETIME:
  2881.     return new Field_datetime(ptr,null_pos,null_bit,
  2882.       unireg_check, field_name, table, field_charset);
  2883.   case FIELD_TYPE_NULL:
  2884.     return new Field_null(ptr,field_length,unireg_check,field_name,table, field_charset);
  2885.   default: // Impossible (Wrong version)
  2886.     break;
  2887.   }
  2888.   return 0;
  2889. }
  2890. /* Create a field suitable for create of table */
  2891. create_field::create_field(Field *old_field,Field *orig_field)
  2892. {
  2893.   field=      old_field;
  2894.   field_name=change=old_field->field_name;
  2895.   length=     old_field->field_length;
  2896.   flags=      old_field->flags;
  2897.   unireg_check=old_field->unireg_check;
  2898.   pack_length=old_field->pack_length();
  2899.   sql_type=   old_field->real_type();
  2900.   charset=    old_field->charset(); // May be NULL ptr
  2901.   comment=    old_field->comment;
  2902.   /* Fix if the original table had 4 byte pointer blobs */
  2903.   if (flags & BLOB_FLAG)
  2904.     pack_length= (pack_length- old_field->table->blob_ptr_size +
  2905.   portable_sizeof_char_ptr);
  2906.   switch (sql_type)
  2907.   {
  2908.     case FIELD_TYPE_BLOB:
  2909.       switch (pack_length - portable_sizeof_char_ptr)
  2910.       {
  2911.         case  1: sql_type= FIELD_TYPE_TINY_BLOB; break;
  2912.         case  2: sql_type= FIELD_TYPE_BLOB; break;
  2913.         case  3: sql_type= FIELD_TYPE_MEDIUM_BLOB; break;
  2914.         default: sql_type= FIELD_TYPE_LONG_BLOB; break;
  2915.       }
  2916.       length=(length+charset->mbmaxlen-1)/charset->mbmaxlen; // QQ: Probably not needed
  2917.       break;
  2918.     case MYSQL_TYPE_ENUM:
  2919.     case MYSQL_TYPE_SET:
  2920.     case FIELD_TYPE_STRING:
  2921.     case FIELD_TYPE_VAR_STRING:
  2922.       length=(length+charset->mbmaxlen-1)/charset->mbmaxlen;
  2923.       break;
  2924.     default:
  2925.       break;
  2926.   }
  2927.   decimals= old_field->decimals();
  2928.   if (sql_type == FIELD_TYPE_STRING)
  2929.   {
  2930.     /* Change CHAR -> VARCHAR if dynamic record length */
  2931.     sql_type=old_field->type();
  2932.     decimals=0;
  2933.   }
  2934.   if (flags & (ENUM_FLAG | SET_FLAG))
  2935.     interval= ((Field_enum*) old_field)->typelib;
  2936.   else
  2937.     interval=0;
  2938.   def=0;
  2939.   if (!old_field->is_real_null() && ! (flags & BLOB_FLAG) &&
  2940.       old_field->ptr && orig_field)
  2941.   {
  2942.     char buff[MAX_FIELD_WIDTH],*pos;
  2943.     String tmp(buff,sizeof(buff), charset);
  2944.     /* Get the value from default_values */
  2945.     my_ptrdiff_t diff= (my_ptrdiff_t) (orig_field->table->rec_buff_length*2);
  2946.     orig_field->move_field(diff); // Points now at default_values
  2947.     bool is_null=orig_field->is_real_null();
  2948.     orig_field->val_str(&tmp);
  2949.     orig_field->move_field(-diff); // Back to record[0]
  2950.     if (!is_null)
  2951.     {
  2952.       pos= (char*) sql_memdup(tmp.ptr(),tmp.length()+1);
  2953.       pos[tmp.length()]=0;
  2954.       def= new Item_string(pos, tmp.length(), charset);
  2955.     }
  2956.   }
  2957. #ifdef HAVE_SPATIAL
  2958.   if (sql_type == FIELD_TYPE_GEOMETRY)
  2959.   {
  2960.     geom_type= ((Field_geom*)old_field)->geom_type;
  2961.   }
  2962. #endif
  2963. }
  2964. /* Warning handling */
  2965. /*
  2966.   Produce warning or note about data saved into field
  2967.   SYNOPSYS
  2968.     set_warning()
  2969.       level            - level of message (Note/Warning/Error)
  2970.       code             - error code of message to be produced
  2971.       cuted_increment  - whenever we should increase cut fields count or not
  2972.   NOTE
  2973.     This function won't produce warning and increase cut fields counter
  2974.     if count_cuted_fields == FIELD_CHECK_IGNORE for current thread.
  2975.   RETURN VALUE
  2976.     true  - if count_cuted_fields == FIELD_CHECK_IGNORE
  2977.     false - otherwise
  2978. */
  2979. bool 
  2980. Field::set_warning(const uint level, const uint code, int cuted_increment)
  2981. {
  2982.   THD *thd= table->in_use;
  2983.   if (thd->count_cuted_fields)
  2984.   {
  2985.     thd->cuted_fields+= cuted_increment;
  2986.     push_warning_printf(thd, (MYSQL_ERROR::enum_warning_level) level,
  2987.                         code, ER(code), field_name, thd->row_count);
  2988.     return 0;
  2989.   }
  2990.   return 1;
  2991. }
  2992. /*
  2993.   Produce warning or note about datetime string data saved into field
  2994.   SYNOPSYS
  2995.     set_warning()
  2996.       level            - level of message (Note/Warning/Error)
  2997.       code             - error code of message to be produced
  2998.       str              - string value which we tried to save
  2999.       str_len          - length of string which we tried to save
  3000.       ts_type          - type of datetime value (datetime/date/time)
  3001.       cuted_increment  - whenever we should increase cut fields count or not
  3002.   
  3003.   NOTE
  3004.     This function will always produce some warning but won't increase cut 
  3005.     fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current 
  3006.     thread.
  3007. */
  3008. void 
  3009. Field::set_datetime_warning(const uint level, const uint code, 
  3010.                             const char *str, uint str_length, 
  3011.                             timestamp_type ts_type, int cuted_increment)
  3012. {
  3013.   if (set_warning(level, code, cuted_increment))
  3014.     make_truncated_value_warning(table->in_use, str, str_length, ts_type);
  3015. }
  3016. /*
  3017.   Produce warning or note about integer datetime value saved into field
  3018.   SYNOPSYS
  3019.     set_warning()
  3020.       level            - level of message (Note/Warning/Error)
  3021.       code             - error code of message to be produced
  3022.       nr               - numeric value which we tried to save
  3023.       ts_type          - type of datetime value (datetime/date/time)
  3024.       cuted_increment  - whenever we should increase cut fields count or not
  3025.   
  3026.   NOTE
  3027.     This function will always produce some warning but won't increase cut 
  3028.     fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current 
  3029.     thread.
  3030. */
  3031. void 
  3032. Field::set_datetime_warning(const uint level, const uint code, 
  3033.                             longlong nr, timestamp_type ts_type,
  3034.                             int cuted_increment)
  3035. {
  3036.   if (set_warning(level, code, cuted_increment))
  3037.   {
  3038.     char str_nr[22];
  3039.     char *str_end= longlong10_to_str(nr, str_nr, -10);
  3040.     make_truncated_value_warning(table->in_use, str_nr, str_end - str_nr, 
  3041.                                  ts_type);
  3042.   }
  3043. }
  3044. /*
  3045.   Produce warning or note about double datetime data saved into field
  3046.   SYNOPSYS
  3047.     set_warning()
  3048.       level            - level of message (Note/Warning/Error)
  3049.       code             - error code of message to be produced
  3050.       nr               - double value which we tried to save
  3051.       ts_type          - type of datetime value (datetime/date/time)
  3052.   
  3053.   NOTE
  3054.     This function will always produce some warning but won't increase cut 
  3055.     fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current 
  3056.     thread.
  3057. */
  3058. void 
  3059. Field::set_datetime_warning(const uint level, const uint code, 
  3060.                             double nr, timestamp_type ts_type)
  3061. {
  3062.   if (set_warning(level, code, 1))
  3063.   {
  3064.     /* DBL_DIG is enough to print '-[digits].E+###' */
  3065.     char str_nr[DBL_DIG + 8];
  3066.     uint str_len= my_sprintf(str_nr, (str_nr, "%g", nr));
  3067.     make_truncated_value_warning(table->in_use, str_nr, str_len, ts_type);
  3068.   }
  3069. }
  3070. /*
  3071.   maximum possible display length for blob
  3072.   SYNOPSIS
  3073.     Field_blob::max_length()
  3074.   RETURN
  3075.     length
  3076. */
  3077. uint32 Field_blob::max_length()
  3078. {
  3079.   switch (packlength)
  3080.   {
  3081.   case 1:
  3082.     return 255;
  3083.   case 2:
  3084.     return 65535;
  3085.   case 3:
  3086.     return 16777215;
  3087.   case 4:
  3088.     return (uint32) 4294967295U;
  3089.   default:
  3090.     DBUG_ASSERT(0); // we should never go here
  3091.     return 0;
  3092.   }
  3093. }