Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-12833

Split Column_definition::create_length_to_internal_length() to virtual methods in Type_handler

    Details

    • Type: Task
    • Status: Closed (View Workflow)
    • Priority: Major
    • Resolution: Fixed
    • Fix Version/s: 10.3.1
    • Component/s: OTHER
    • Labels:
      None

      Description

      This code is not friendly to pluggable data types:

      void Column_definition::create_length_to_internal_length(void)
      {
        switch (real_field_type()) {
        case MYSQL_TYPE_TINY_BLOB:
        ...
        }
      }
      

      As of MDEV creation time, the only place where create_length_to_internal_length() is used (see bb-10.2-ext and 10.3 branches) is a loop inside mysql_prepare_create_table():

      /* Check if we have used the same field name before */
      for (dup_no=0; (dup_field=it2++) != sql_field; dup_no++)
      {
      ...
          if (!(sql_field->flags & NOT_NULL_FLAG))
            null_fields--;
          sql_field->flags=             dup_field->flags;
          sql_field->create_length_to_internal_length();
          sql_field->interval=          dup_field->interval;
          sql_field->vcol_info=         dup_field->vcol_info;
      ...
      }
      

      This code is responsible for queries like this:

      CREATE TABLE t2 (a INT) AS SELECT a FROM t1;
      

      I.e. t1.a is queried, but its data type is redefined.

      Under terms of this task we'll do the following:

      • Introduce a new virtual method in Type_handler:

        virtual bool Column_definition_redefine_stage1(Column_definition *def,
                                                       const Column_definition *dup,
                                                       const handler *file,
                                                       const Schema_specification_st *)
                                                       const;
        

      • Move the entire redefinition code (responsible for copying members from dup_field to sql_field):
      • Data type independent code will go into a shared method Column_definition::redefine_stage1_common()
      • Data type specific code will go to relevant virtual implementations of Column_definition_redefine_stage1. Every implementation will include a call for redefine_stage1_common() followed by data specific code. For example, the method responsible for handling DECIMAL, will look like:

        bool Type_handler_newdecimal::
               Column_definition_redefine_stage1(Column_definition *def,
                                                 const Column_definition *dup,
                                                 const handler *file,
                                                 const Schema_specification_st *schema)
                                                 const
        {
          def->redefine_stage1_common(dup, file, schema);
          def->create_length_to_internal_length_newdecimal();
          return false;
        }
        

      • Remove Column_definition::create_length_to_internal_length()

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                bar Alexander Barkov
                Reporter:
                bar Alexander Barkov
              • Votes:
                0 Vote for this issue
                Watchers:
                1 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: