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

Item::save_in_field(...) < 0 is not always returned for cases that terminate statement

Details

    • Bug
    • Status: Stalled (View Workflow)
    • Major
    • Resolution: Unresolved
    • 10.5, 10.6, 10.11, 11.4
    • 10.5, 10.6, 10.11, 11.4
    • None

    Description

      The correct behavior can be verified by the following assertions

      diff --git a/sql/sql_base.cc b/sql/sql_base.cc
      --- a/sql/sql_base.cc
      +++ b/sql/sql_base.cc
      @@ -2765,7 +2765,7 @@
         add_back_last_deleted_lock(dst_table_list);
       
         table->mdl_ticket->downgrade_lock(table->reginfo.lock_type >=
      -                                    TL_WRITE_ALLOW_WRITE ? 
      +                                    TL_WRITE_ALLOW_WRITE ?
                                           MDL_SHARED_NO_READ_WRITE :
                                           MDL_SHARED_READ);
       
      @@ -8606,11 +8606,15 @@
       
           if (rfield->stored_in_db())
           {
      -      if (!skip_sys_field &&
      -          unlikely(value->save_in_field(rfield, 0) < 0) && !ignore_errors)
      +      if (!skip_sys_field)
             {
      -        my_message(ER_UNKNOWN_ERROR, ER_THD(thd, ER_UNKNOWN_ERROR), MYF(0));
      -        goto err;
      +        if (unlikely(value->save_in_field(rfield, 0) < 0) && !ignore_errors)
      +        {
      +          my_message(ER_UNKNOWN_ERROR, ER_THD(thd, ER_UNKNOWN_ERROR), MYF(0));
      +          goto err;
      +        }
      +
      +        DBUG_ASSERT(!thd->is_error() || ignore_errors);
             }
             /*
               In sql MODE_SIMULTANEOUS_ASSIGNMENT,
      @@ -8901,6 +8905,9 @@
           else
             if (value->save_in_field(field, 0) < 0)
               goto err;
      +      else
      +        DBUG_ASSERT(!thd->is_error());
      +
           field->set_has_explicit_value();
         }
         /* Update virtual fields if there wasn't any errors */
      

      adding which results in test crashes.

      The result of save_in_field(...) < 0 should unambiguously mean a failed statement and should always be returned whenever thd->is_error() became true during the call.

      Attachments

        Issue Links

          Activity

            People

              nikitamalyavin Nikita Malyavin
              nikitamalyavin Nikita Malyavin
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.