• unknown's avatar
    Support for TIMESTAMP columns holding NULL values. Unlike all other · 7b511544
    unknown authored
    column types TIMESTAMP is NOT NULL by default, so in order to have 
    TIMESTAMP column holding NULL valaues you have to specify NULL as
    one of its attributes (this needed for backward compatibility).
    
    Main changes:
    Replaced TABLE::timestamp_default_now/on_update_now members with
    TABLE::timestamp_auto_set_type flag which is used everywhere
    for determining if we should auto-set value of TIMESTAMP field 
    during this operation or not. We are also use Field_timestamp::set_time()
    instead of handler::update_timestamp() in handlers.
    
    
    mysql-test/r/type_timestamp.result:
      Added test for TIMESTAMP columns which are able to store NULL values.
    mysql-test/t/type_timestamp.test:
      Added test for TIMESTAMP columns which are able to store NULL values.
    sql/field.cc:
      Added support for TIMESTAMP fields holding NULL values.
      We don't need Field_timestamp::set_timestamp_offsets() anymore.
      Instead we need Field_timestamp::get_auto_set_type() function
      which will convert TIMESTAMP auto-set type stored in Field in 
      unireg_check to value from timestamp_auto_set_type_enum.
      (We can't replace this function with additional Field_timestamp member
      and some code in constructor because then we will have troubles
      with Field::new_field() method).
      We should also set field to not null in Field_timestamp::set_time() now.
    sql/field.h:
      Added support for TIMESTAMP fields holding NULL values.
      We don't need Field_timestamp::set_timestamp_offsets() anymore.
      Instead we need Field_timestamp::get_auto_set_type() function,
      which will convert TIMESTAMP auto-set type stored in Field in 
      unireg_check to value from timestamp_auto_set_type_enum.
      We also have to support NULL values in Field_timestamp::get_timestamp()
      function.
    sql/field_conv.cc:
      Added comment clarifying behavior in case of TIMESTAMP fields which are
      able to store NULL values.
    sql/ha_berkeley.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now for determining 
      if we should auto-set value of TIMESTAMP field during this operation.
      We are also use Field_timestamp::set_time() instead of 
      handler::update_timestamp().
    sql/ha_heap.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now for determining 
      if we should auto-set value of TIMESTAMP field during this operation.
      We are also use Field_timestamp::set_time() instead of 
      handler::update_timestamp().
    sql/ha_innodb.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now for determining 
      if we should auto-set value of TIMESTAMP field during this operation.
      We are also use Field_timestamp::set_time() instead of 
      handler::update_timestamp().
    sql/ha_isam.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now for determining 
      if we should auto-set value of TIMESTAMP field during this operation.
      We are also use Field_timestamp::set_time() instead of 
      handler::update_timestamp().
    sql/ha_isammrg.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now for determining 
      if we should auto-set value of TIMESTAMP field during this operation.
      We are also use Field_timestamp::set_time() instead of 
      handler::update_timestamp().
    sql/ha_myisam.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now for determining 
      if we should auto-set value of TIMESTAMP field during this operation.
      We are also use Field_timestamp::set_time() instead of 
      handler::update_timestamp().
    sql/ha_myisammrg.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now for determining 
      if we should auto-set value of TIMESTAMP field during this operation.
      We are also use Field_timestamp::set_time() instead of 
      handler::update_timestamp().
    sql/ha_ndbcluster.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now for determining 
      if we should auto-set value of TIMESTAMP field during this operation.
      We are also use Field_timestamp::set_time() instead of 
      handler::update_timestamp().
    sql/handler.cc:
      handler::update_timestamp() is no longer needed since now we use
      Field_timestamp::set_time() instead.
      (we can't use handler::update_timestamp() anyway since field position
      only is not enough for TIMESTAMP fields which are able to store NULLs)
    sql/handler.h:
      handler::update_timestamp() is no longer needed since now we use
      Field_timestamp::set_time() instead.
    sql/item_timefunc.cc:
      Since now TIMESTAMP fields can hold NULL values we should take this into
      account.
    sql/sql_base.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now. 
      (Here we use Field_timestamp::get_auto_set_type() to setup its value
       before further statement execution).
    sql/sql_insert.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now.
    sql/sql_load.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now.
    sql/sql_parse.cc:
      Added support for TIMESTAMP fields holding NULL values.
      We should distinguish NULL default values and non-specified default
      values for such fields (because latter could mean DEFAULT NOW()
      ON UPDATE NOW() in some cases).
    sql/sql_show.cc:
      Added support for TIMESTAMP fields holding NULL values.
      Unlike all other fields these are NOT NULL by default
      so we have to specify NULL attribute explicitly for them.
    sql/sql_table.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now.
    sql/sql_update.cc:
      Now we use TABLE::timestamp_field_type instead of 
      TABLE::timestamp_default_now/on_update_now.
    sql/sql_yacc.yy:
      Added support for TIMESTAMP fields holding NULL values.
      Unlike all other fields these are NOT NULL by default
      (so we have to set NOT_NULL_FLAG properly for them).
    sql/table.h:
      Added timestamp_auto_set_type enum which values are used for indicating
      during which operations we should automatically set TIMESTAPM field
      value to current timestamp.
      TABLE: Replaced timestamp_default_now/on_update_now members with
      timestamp_auto_set_type flag (Now when TIMESTAMP field are able to 
      store NULL values, single position of field in record is not enough 
      for updating this field anyway).
    7b511544
sql_insert.cc 48.7 KB