[MDEV-21497] Make Field_time, Field_datetime, Field_timestamp abstract Created: 2020-01-16  Updated: 2020-01-23  Resolved: 2020-01-16

Status: Closed
Project: MariaDB Server
Component/s: Data types
Fix Version/s: 10.5.1

Type: Task Priority: Critical
Reporter: Alexander Barkov Assignee: Alexander Barkov
Resolution: Fixed Votes: 0
Labels: None

Issue Links:
Blocks
blocks MDEV-19906 Show internal type for TIMESTAMP, DAT... Closed

 Description   

Currenly classes Field_time, Field_datetime, Field_timestamp are parent classes for all TIME, DATETIME, TIMESTAMP field implementations, and at the same time are instantiable classes implementing the pre-mysql-5.6 style TIME(0), DATETIME(0), TIMESTAMP(0).

The class hierarchy looks like this:

Field_temporal
  Field_temporal_with_date
    Field_datetime              -- instantiable
      Field_datetime_with_dec   -- abstract
        Field_datetime_hires    -- instantiable
        Field_datetimef         -- instantiable
 
  Field_timestamp               -- instantiable
    Field_timestamp_with_dec    -- abstract
      Field_timestamp_hires     -- instantiable
      Field_timestampf          -- instantiable
 
  Field_time                    -- instantiable
    Field_time_with_dec         -- abstract
      Field_time_hires          -- instantiable
      Field_timef               -- instantiable

This hierarchy style is too hard to follow because of multiple overriding, and is error prone because children classes can easily forget to override important methods.

For example, Field_datetimef has to overload the following Field_datetime methods:

  enum ha_base_keytype key_type() const override;
  double val_real() override;
  longlong val_int() override;
  String *val_str(String *, String *) override;
  bool send_binary(Protocol *protocol) override;
  int cmp(const uchar *,const uchar *) const override;
  void sort_string(uchar *buff,uint length) override;
  uint32 pack_length() const override;
  bool get_date(MYSQL_TIME *ltime, date_mode_t fuzzydate) override;
  uchar *pack(uchar* to, const uchar *from, uint) override;
  const uchar *unpack(uchar* to, const uchar *from, const uchar *from_end,
                      uint) override;
  uint size_of() const override;

The same style of multiple overriding happens in all instantiable Field_datetime, Field_timestamp, Field_time descendant classes.

MDEV-19906 would have to introduce more multiple overriding and make things harder to follow.

Let's do the following changes:

  • Introduce instantiable classes Field_datetime0, Field_timestamp0, Field_time0 implementing pre-mysql-5.6 DATETIME(0), TIMESTAMP(0), TIME(0) respectively.
  • Change Field_datetime, Field_timestamp, Field_time to be abstract

Implementation of the methods mentioned above will

  • migrate from Field_datetime to Field_datetime0, Field_timestamp to Field_timestamp0, Field_time to Field_time0.
  • become zero pointers in the abstract classes Field_datetime, Field_timestamp, Field_time, so it won't be possible to leave these methods unimplemented in the instrantiable descendants

The new hierarchy will look like this:

Field_temporal
  Field_temporal_with_date
    Field_datetime              -- abstract
      Field_datetime0           -- instantiable
      Field_datetime_with_dec   -- abstract
        Field_datetime_hires    -- instantiable
        Field_datetimef         -- instantiable
 
  Field_timestamp               -- abstract
    Field_timestamp0            -- instantiable
    Field_timestamp_with_dec    -- abstract
      Field_timestamp_hires     -- instantiable
      Field_timestampf          -- instantiable
 
  Field_time                    -- abstract
    Field_time0                 -- instantiable
    Field_time_with_dec         -- abstract
      Field_time_hires          -- instantiable
      Field_timef               -- instantiable


Generated at Thu Feb 08 09:07:35 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.