• Sergei Golubchik's avatar
    wl#173 - temporal types with sub-second resolution · a8a757c6
    Sergei Golubchik authored
             and collateral changes.
    
    * introduce my_hrtime_t, my_timediff_t, and conversion macros
    * inroduce TIME_RESULT, but it can only be returned from Item::cmp_type(),
      never from Item::result_type()
    * pack_time/unpack_time function for "packed" representation of
      MYSQL_TIME in a longlong that can be compared
    * ADDTIME()/SUBTIME()/+- INTERVAL now work with TIME values
    * numbers aren't quoted in EXPLAIN EXTENDED
    * new column I_S.COLUMNS.DATETIME_PRECISION
    * date/time values are compares to anything as date/time, not as strings or numbers.
    * old timestamp(X) is no longer supported
    * MYSQL_TIME to string conversion functions take precision as an argument
    * unified the warnings from Field_timestamp/datetime/time/date/newdate store methods
    * Field_timestamp_hires, Field_datetime_hires, Field_time_hires
    * Field_temporal
    * Lazy_string class to pass a value (string, number, time) polymorphically down the stack
    * make_truncated_value_warning and Field::set_datetime_warning use Lazy_string as an argument, removed char*/int/double variants
    * removed Field::can_be_compared_as_longlong(). Use Field::cmp_type() == INT_RESULT instead
    * introduced Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
    * in many cases date/time types are treated like other types, not as special cases
    * greatly simplified Arg_comparator (regarding date/time/year code)
    * SEC_TO_TIME is real function, not integer.
    * microsecond precision in NOW, CURTIME, etc
    * Item_temporal. All items derived from it only provide get_date, but no val* methods
    * replication of NOW(6)
    * Protocol::store(time) now takes the precision as an argument
    * @@TIMESTAMP is a double
    
    client/mysqlbinlog.cc:
      remove unneded casts
    include/my_sys.h:
      introduce my_hrtime_t, my_timediff_t, and conversion macros
    include/my_time.h:
      pack_time/unpack_time, etc.
      convenience functions to work with MYSQL_TIME::second_part
    libmysql/libmysql.c:
      str_to_time() is gone. str_to_datetime() does it now.
      my_TIME_to_str() takes the precision as an argument
    mysql-test/include/ps_conv.inc:
      time is not equal to datetime anymore
    mysql-test/r/distinct.result:
      a test for an old MySQL bug
    mysql-test/r/explain.result:
      numbers aren't quoted in EXPLAIN EXTENDED
    mysql-test/r/func_default.result:
      numbers aren't quoted in EXPLAIN EXTENDED
    mysql-test/r/func_sapdb.result:
      when decimals=NOT_FIXED_DEC it means "not fixed" indeed
    mysql-test/r/func_test.result:
      numbers aren't quoted in EXPLAIN EXTENDED
    mysql-test/r/func_time.result:
      ADDTIME()/SUBTIME()/+- INTERVAL now work with TIME values
    mysql-test/r/having.result:
      numbers aren't quoted in EXPLAIN EXTENDED
    mysql-test/r/information_schema.result:
      new column I_S.COLUMNS.DATETIME_PRECISION
    mysql-test/r/join_outer.result:
      numbers aren't quoted in EXPLAIN EXTENDED
    mysql-test/r/metadata.result:
      TIMESTAMP no longer has zerofill flag
    mysql-test/r/range.result:
      invalid datetime is not compared with as a string
    mysql-test/r/select.result:
      NO_ZERO_IN_DATE, etc only affect storage - according to the manual
      numbers aren't quoted in EXPLAIN EXTENDED
    mysql-test/r/subselect.result:
      numbers aren't quoted in EXPLAIN EXTENDED
    mysql-test/r/sysdate_is_now.result:
      when decimals=NOT_FIXED_DEC it means "not fixed" indeed
    mysql-test/r/type_blob.result:
      TIMESTAMP(N) is not deprecated
    mysql-test/r/type_timestamp.result:
      old TIMESTAMP(X) semantics is not supported anymore
    mysql-test/r/union.result:
      numbers aren't quoted in EXPLAIN EXTENDED
    mysql-test/r/varbinary.result:
      numbers aren't quoted in EXPLAIN EXTENDED
    mysql-test/t/distinct.test:
      test for an old MySQL bug
    mysql-test/t/func_time.test:
      +- INTERVAL now works with TIME values
    mysql-test/t/select.test:
      typo
    mysql-test/t/subselect.test:
      only one error per statement, please
    mysql-test/t/system_mysql_db_fix40123.test:
      old timestamp(X) is no longer supported
    mysql-test/t/system_mysql_db_fix50030.test:
      old timestamp(X) is no longer supported
    mysql-test/t/system_mysql_db_fix50117.test:
      old timestamp(X) is no longer supported
    mysql-test/t/type_blob.test:
      old timestamp(X) is no longer supported
    mysql-test/t/type_timestamp.test:
      old timestamp(X) is no longer supported
    mysys/my_getsystime.c:
      functions to get the time with microsecond precision
    mysys/my_init.c:
      move the my_getsystime.c initialization code to my_getsystime.c
    mysys/my_static.c:
      no need to make these variables extern
    mysys/my_static.h:
      no need to make these variables extern
    scripts/mysql_system_tables.sql:
      old timestamp(X) is no longer supported
    scripts/mysql_system_tables_fix.sql:
      old timestamp(X) is no longer supported
    scripts/mysqlhotcopy.sh:
      old timestamp(X) is no longer supported
    sql-common/my_time.c:
      * call str_to_time from str_to_datetime, as appropriate
      * date/time to string conversions take precision as an argument
      * number_to_time()
      * TIME_to_double()
      * pack_time() and unpack_time()
    sql/event_data_objects.cc:
      cast is not needed
      my_datetime_to_str() takes precision as an argument
    sql/event_db_repository.cc:
      avoid dangerous downcast (because the pointer is
      not always Field_timestamp, see events_1.test)
    sql/event_queue.cc:
      avoid silly double-work for cond_wait
      (having an endpoint of wait, subtract the current time to get the timeout,
      and use set_timespec() macro to fill in struct timespec, by adding the current
      time to the timeout)
    sql/field.cc:
      * remove virtual Field::get_time(), everyone should use only Field::get_date()
      * remove lots of #ifdef WORDS_BIGENDIAN
      * unified the warnings from Field_timestamp/datetime/time/date/newdate store methods
      * Field_timestamp_hires, Field_datetime_hires, Field_time_hires
      * Field_temporal
      * make_truncated_value_warning and Field::set_datetime_warning use Lazy_string as an argument, removed char*/int/double variants
    sql/field.h:
      * remove virtual Field::get_time(), everyone should use only Field::get_date()
      * remove lots of #ifdef WORDS_BIGENDIAN
      * unified the warnings from Field_timestamp/datetime/time/date/newdate store methods
      * Field_timestamp_hires, Field_datetime_hires, Field_time_hires
      * Field_temporal
      * make_truncated_value_warning and Field::set_datetime_warning use Lazy_string as an argument, removed char*/int/double variants
      * removed Field::can_be_compared_as_longlong(). Use Field::cmp_type() == INT_RESULT instead
    sql/filesort.cc:
      TIME_RESULT, cmp_time()
    sql/item.cc:
      * numbers aren't quoted in EXPLAIN EXTENDED
      * Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
      * virtual Item::get_time() is gone
      * Item_param::field_type() is set correctly
      * Item_datetime, for a datetime constant
      * time to anything is compared as a time
      * Item_cache::print() prints the value is available
      * bug fixed in Item_cache_int::val_str()
    sql/item.h:
      * Item::print_value(), to be used from Item_xxx::print() when needed
      * Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
      * virtual Item::get_time() is gone
      * Item_datetime, for a datetime constant
      * better default for cast_to_int_type()
      * Item_cache objects now *always* have the field_type() set
    sql/item_cmpfunc.cc:
      * get_year_value, get_time_value are gone. get_datetime_value does it all
      * get_value_a_func, get_value_b_func are gone
      * can_compare_as_dates() is gone too, TIME_RESULT is used instead
      * cmp_type() instead or result_type() when doing a comparison
      * compare_datetime and compate_e_datetime in the comparator_matrix, is_nulls_eq is gone
      * Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
    sql/item_cmpfunc.h:
      greatly simplified Arg_comparator
    sql/item_create.cc:
      * fix a bug in error messages in CAST
    sql/item_func.cc:
      Item::cmp_result() instead of Item::is_datetime() and Item::result_as_longlong()
      mention all possibitiles in switch over Item_result values, or use default:
    sql/item_row.h:
      overwrite the default cmp_type() for Item_row,
      as no MYSQL_TYPE_xxx value corresponds to ROW_RESULT
    sql/item_timefunc.cc:
      rewrite make_datetime to support precision argument
      SEC_TO_TIME is real function, not integer.
      many functions that returned temporal values had duplicate code in val_* methods,
      some of them did not have get_date() which resulted in unnecessary date->str->date conversions. 
      Now they all are derived from Item_temporal_func and *only* provide get_date, not val* methods.
      many fixes to set decimals (datetime precision) correctly.
    sql/item_timefunc.h:
      SEC_TO_TIME is real function, not integer.
      many functions that returned temporal values had duplicate code in val_* methods,
      some of them did not have get_date() which resulted in unnecessary date->str->date conversions. 
      Now they all are derived from Item_temporal_func and *only* provide get_date, not val* methods.
      many fixes to set decimals (datetime precision) correctly.
    sql/log_event.cc:
      replication of NOW(6)
    sql/log_event.h:
      replication of NOW(6)
    sql/mysql_priv.h:
      Lazy_string class to pass a value (string, number, time) polymorphically down the stack.
      make_truncated_value_warning() that uses it.
    sql/mysqld.cc:
      datetime in Arg_comparator::comparator_matrix
    sql/opt_range.cc:
      cleanup: don't disable warnings before calling save_in_field_no_warnings()
    sql/protocol.cc:
      Protocol::store(time) now takes the precision as an argument
    sql/protocol.h:
      Protocol::store(time) now takes the precision as an argument
    sql/rpl_rli.cc:
      small cleanup
    sql/set_var.cc:
      SET TIMESTAMP=double
    sql/set_var.h:
      @@TIMESTAMP is a double
    sql/share/errmsg.txt:
      precision and scale are unsigned
    sql/slave.cc:
      replication of NOW(6)
    sql/sp_head.cc:
      cleanup
    sql/sql_class.cc:
      support for NOW(6)
    sql/sql_class.h:
      support for NOW(6)
    sql/sql_insert.cc:
      support for NOW(6)
    sql/sql_select.cc:
      use item->cmp_type().
      move a comment where it belongs
    sql/sql_show.cc:
      new column I_S.COLUMNS.DATETIME_PRECISION
    sql/sql_yacc.yy:
      TIME(X), DATETIME(X), cast, NOW(X), CURTIME(X), etc
    sql/time.cc:
      fix date_add_interval() to support MYSQL_TIMESTAMP_TIME argument
    storage/myisam/ha_myisam.cc:
      TIMESTAMP no longer carries ZEROFIELD flag, still we keep MYI file compatible.
    strings/my_vsnprintf.c:
      warnings
    tests/mysql_client_test.c:
      old timestamp(X) does not work anymore
      datetime is no longer equal to time
    a8a757c6
item_cmpfunc.cc 135 KB