1. 13 Sep, 2010 2 commits
    • Martin Hansson's avatar
      Bug #50394: Regression in EXPLAIN with index scan, LIMIT, GROUP BY and · 3beeb5d0
      Martin Hansson authored
      ORDER BY computed col
            
      GROUP BY implies ORDER BY in the MySQL dialect of SQL. Therefore, when an
      index on the first table in the query is used, and that index satisfies
      ordering according to the GROUP BY clause, the query optimizer estimates the
      number of tuples that need to be read from this index. If there is a LIMIT
      clause, table statistics on tables following this 'sort table' are employed.
      
      There may be a separate ORDER BY clause however, which mandates reading the
      whole 'sort table' anyway. But the previous estimate was left untouched.
      
      Fixed by removing the estimate from EXPLAIN output if GROUP BY is used in
      conjunction with an ORDER BY clause that mandates using a temporary table.
      3beeb5d0
    • Gleb Shchepa's avatar
      Bug #55779: select does not work properly in mysql server · daa6d1f4
      Gleb Shchepa authored
                  Version "5.1.42 SUSE MySQL RPM"
      
      When a query was using a DATE or DATETIME value formatted
      using different formatting than "yyyy-mm-dd HH:MM:SS", a
      query with a greater-or-equal '>=' condition matched only
      greater values in an indexed TIMESTAMP column.
      
      The problem was introduced by the fix for the bug 46362
      and partially solved (for DATE and DATETIME columns only)
      by the fix for the bug 47925.
      
      The stored_field_cmp_to_item function has been modified
      to take into account TIMESTAMP columns like we do for
      DATE and DATETIME columns.
      
      
      mysql-test/r/type_timestamp.result:
        Test case for bug #55779.
      mysql-test/t/type_timestamp.test:
        Test case for bug #55779.
      sql/item.cc:
        Bug #55779: select does not work properly in mysql server
                    Version "5.1.42 SUSE MySQL RPM"
        
        The stored_field_cmp_to_item function has been modified
        to take into account TIMESTAMP columns like we do for
        DATE and DATETIME.
      daa6d1f4
  2. 10 Sep, 2010 1 commit
  3. 09 Sep, 2010 3 commits
    • Alexey Kopytov's avatar
      Addendum patch for bug #54190. · da7646b6
      Alexey Kopytov authored
      The patch caused some test failures when merged to 5.5 because,
      unlike 5.1, it utilizes Item_cache_row to actually cache row
      values. The problem was that Item_cache_row::bring_value()
      essentially did nothing. In particular, it did not update its
      null_value, so all Item_cache_row objects were always having
      their null_values set to TRUE. This went unnoticed previously,
      but now when Arg_comparator::compare_row() actually depends on
      the row's null_value to evaluate the comparison, the problem
      has surfaced.
      
      Fixed by calling the underlying item's bring_value() and
      updating null_value in Item_cache_row::bring_value().
      
      Since the problem also exists in 5.1 code (albeit hidden, since
      the relevant code is not used anywhere), the addendum patch is
      against 5.1.
      da7646b6
    • Alexey Kopytov's avatar
      Automerge. · 3ce925bf
      Alexey Kopytov authored
      3ce925bf
    • Alexey Kopytov's avatar
      Bug #54190: Comparison to row subquery produces incorrect · 453107bc
      Alexey Kopytov authored
                  result
      
      Row subqueries producing no rows were not handled as UNKNOWN
      values in row comparison expressions.
      
      That was a result of the following two problems:
      
      1. Item_singlerow_subselect did not mark the resulting row
      value as NULL/UNKNOWN when no rows were produced.
      
      2. Arg_comparator::compare_row() did not take into account that
      a whole argument may be NULL rather than just individual scalar
      values.
      
      Before bug#34384 was fixed, the above problems were hidden
      because an uninitialized (i.e. without any stored value) cached
      object would appear as NULL for scalar values in a row subquery
      returning an empty result. After the fix
      Arg_comparator::compare_row() would try to evaluate
      uninitialized cached objects.
      
      Fixed by removing the aforementioned problems.
      
      
      mysql-test/r/row.result:
        Added a test case for bug #54190.
      mysql-test/r/subselect.result:
        Updated the result for a test relying on wrong behavior.
      mysql-test/t/row.test:
        Added a test case for bug #54190.
      sql/item_cmpfunc.cc:
        If either of the argument rows is NULL, return NULL as the
        result of comparison.
      sql/item_subselect.cc:
        Adjust null_value for Item_singlerow_subselect depending on
        whether a row has been produced by the row subquery.
      453107bc
  4. 07 Sep, 2010 4 commits
    • Martin Hansson's avatar
      Bug#51070: Query with a NOT IN subquery predicate returns a wrong result set · 4f4d03a4
      Martin Hansson authored
            
      The EXISTS transformation has additional switches to catch the known corner
      cases that appear when transforming an IN predicate into EXISTS. Guarded
      conditions are used which are deactivated when a NULL value is seen in the
      outer expression's row. When the inner query block supplies NULL values,
      however, they are filtered out because no distinction is made between the
      guarded conditions; guarded NOT x IS NULL conditions in the HAVING clause that
      filter out NULL values cannot be de-activated in isolation from those that
      match values or from the outer expression or NULL's.
      
      The above problem is handled by making the guarded conditions remember whether
      they have rejected a NULL value or not, and index access methods are taking
      this into account as well. 
      
      The bug consisted of 
      
      1) Not resetting the property for every nested loop iteration on the inner
         query's result.
      
      2) Not propagating the NULL result properly from inner query to IN optimizer.
      
      3) A hack that may or may not have been needed at some point. According to a
         comment it was aimed to fix #2 by returning NULL when FALSE was actually
         the result. This caused failures when #2 was properly fixed. The hack is
         now removed.
      
      The fix resolves all three points.
      4f4d03a4
    • Dmitry Shulga's avatar
      Fixed bug #55421 - Protocol::end_statement(): Assertion `0' on · d6f6db6f
      Dmitry Shulga authored
      multi-table UPDATE IGNORE.
      The problem was that if there was an active SELECT statement
      during trigger execution, an error risen during the execution
      may cause a crash. The fix is to temporary reset LEX::current_select
      before trigger execution and restore it afterwards. This way
      errors risen during the trigger execution are processed as
      if there was no active SELECT.
      
      mysql-test/r/trigger_notembedded.result:
        added test case result for bug #55421.
      mysql-test/t/trigger_notembedded.test:
        added test case for bug #55421.
      sql/sql_trigger.cc:
        Reset thd->lex->current_select before start trigger execution
        and restore its original value after execution is finished.
        This is neccessery in order to set error status in 
        diagnostic_area in case of trigger execution failure.
      d6f6db6f
    • Martin Hansson's avatar
      Bug#54543: update ignore with incorrect subquery leads to assertion failure: · 446cc653
      Martin Hansson authored
      inited==INDEX
      
      When an error occurs while sending the data in a temporary table there was no
      cleanup performed. This caused a failed assertion in the case when different
      access methods were used for populating the table vs. retrieving the data from
      the table if IGNORE was specified and sql_safe_updates = 0. In this case
      execution continues, but the handler expects to continue with the access
      method used for row retrieval.
      
      Fixed by doing the cleanup even if errors occur.
      446cc653
    • Dmitry Shulga's avatar
      Fixed bug #47485 - mysql_store_result returns a not NULL result set · d2d4fdb2
      Dmitry Shulga authored
      for a prepared statement.
      
      include/mysql.h:
        enumerator MYSQL_STATUS_STATEMENT_GET_RESULT was added
        into mysql_status enum.
      include/mysql.h.pp:
        enumerator MYSQL_STATUS_STATEMENT_GET_RESULT was added
        into mysql_status enum.
      libmysql/libmysql.c:
        Introduce a separate mysql state to distinguish the situation
        when we have a binary result set pending on the server from the
        situation when the result set is in text protocol.
        execute() modified: if mysql->status == MYSQL_STATUS_GET_RESULT
        before return then set it to value MYSQL_STATUS_STATEMENT_GET_RESULT.
        stmt_read_row_unbuffered() and mysql_stmt_store_result()
        were modified: added checking for mysql->status against
        MYSQL_STATUS_STATEMENT_GET_RESULT value instead of MYSQL_STATUS_GET_RESULT.
      tests/mysql_client_test.c:
        added test_bug47485()
      d2d4fdb2
  5. 01 Sep, 2010 1 commit
    • Magne Mahre's avatar
      Bug#39932 "create table fails if column for FK is in different · 64b63926
      Magne Mahre authored
                case than in corr index".
            
      Server was unable to find existing or explicitly created supporting
      index for foreign key if corresponding statement clause used field
      names in case different than one used in key specification and created
      yet another supporting index.
      In cases when name of constraint (and thus name of generated index)
      was the same as name of existing/explicitly created index this led
      to duplicate key name error.
            
      The problem was that unlike all other code Key_part_spec::operator==()
      compared field names in case sensitive fashion. As result routines
      responsible for getting rid of redundant generated supporting indexes
      for foreign key were not working properly for versions of field names
      using different cases.
      
      (backported from mysql-trunk)
      
      
      sql/sql_class.cc:
        Make field name comparison case-insensitive like it is
        in the rest of server.
      64b63926
  6. 31 Aug, 2010 1 commit
  7. 30 Aug, 2010 2 commits
  8. 25 Aug, 2010 2 commits
  9. 24 Aug, 2010 1 commit
  10. 30 Aug, 2010 5 commits
    • Gleb Shchepa's avatar
      automerge local --> 5.1-bugteam (bug 53034) · cfcc7e26
      Gleb Shchepa authored
      cfcc7e26
    • Gleb Shchepa's avatar
      Bug #53034: Multiple-table DELETE statements not accepting · ccab4d87
      Gleb Shchepa authored
                  "Access compatibility" syntax
      
      The "wild" "DELETE FROM table_name.* ... USING ..." syntax
      for multi-table DELETE statements is documented but it was
      lost in the fix for the bug 30234.
      
      The table_ident_opt_wild parser rule has been added
      to restore the lost syntax.
      
      
      mysql-test/r/delete.result:
        Test case for bug #53034.
      mysql-test/t/delete.test:
        Test case for bug #53034.
      sql/sql_yacc.yy:
        Bug #53034: Multiple-table DELETE statements not accepting
                    "Access compatibility" syntax
        
        The table_ident_opt_wild parser rule has been added
        to restore the lost syntax.
        Note: simple extending of table_ident with opt_wild in
        the table_alias_ref rule is not acceptable, because
        a) it adds one conflict more and b) this conflict resolves
        in the inappropriate way.
      ccab4d87
    • Ramil Kalimullin's avatar
      Automerge. · ed8aa284
      Ramil Kalimullin authored
      ed8aa284
    • Ramil Kalimullin's avatar
      Fix for bug #51875: crash when loading data into geometry function polyfromwkb · 6a113b21
      Ramil Kalimullin authored
      Check for number of line strings in the incoming polygon data (wkb) and
      for number of points in the incoming linestring wkb.
      
      
      
      mysql-test/r/gis.result:
        Fix for bug #51875: crash when loading data into geometry function polyfromwkb
          - test result.
      mysql-test/t/gis.test:
        Fix for bug #51875: crash when loading data into geometry function polyfromwkb
          - test case.
      sql/spatial.cc:
        Fix for bug #51875: crash when loading data into geometry function polyfromwkb
          - creating a polygon from wkb check for number of line strings,
          - creating a linestring from wkb check for number of line points.
      6a113b21
    • Alexey Kopytov's avatar
      Automerge. · c1bd124c
      Alexey Kopytov authored
      c1bd124c
  11. 27 Aug, 2010 3 commits
    • Vasil Dimov's avatar
      Merge mysql-5.1-innodb -> mysql-5.1-bugteam · 3bc7c508
      Vasil Dimov authored
      3bc7c508
    • Alexey Kopytov's avatar
      Bug #54465: assert: field_types == 0 || field_types[field_pos] · d7d0f639
      Alexey Kopytov authored
                  == MYSQL_TYPE_LONGLONG
      
      A MIN/MAX() function with a subquery as its argument could lead
      to a debug assertion on debug builds or wrong data on release
      ones.
      
      The problem was a combination of the following factors:
      
      - Item_sum_hybrid::fix_fields() might use the argument
      (args[0]) to calculate 'hybrid_field_type' which was later used
      to decide how the data should be sent to the client.
      
      - Item_sum::make_field() might use the argument again to
      calculate the field's type when sending result set metadata to
      the client.
      
      - The argument could be changed in between these two calls via
        Item::set_arg() leading to inconsistent metadata being
        reported.
      
      Here is what was happening for the bug's test case:
      
      1. Item_sum_hybrid::fix_fields() calculates hybrid_field_type
      as MYSQL_TYPE_LONGLONG based on args[0] which is an
      Item::SUBSELECT_ITEM at that time.
      
      2. A temporary table is created to execute the
      query. create_tmp_field_from_item() creates a Field_long object
      according to the subselect's max_length.
      
      3. The subselect item in Item_sum_hybrid is replaced by the
      Item_field object referencing the newly created Field_long.
      
      4. Item_sum::make_field() rightfully returns the
      MYSQL_TYPE_LONG type when calculating the result set metadata.
      
      5. When sending the actual data, Item::send() relies on the
      virtual field_type() function which in our case returns
      previously calculated hybrid_field_type == MYSQL_TYPE_LONGLONG.
      
      It looks like the only solution is to never refer to the
      argument's metadata after the result metadata has been
      calculated in fix_fields(), since the argument itself may be
      different by then. In this sense, Item_sum::make_field() should
      never be used, because it may rely on the argument's metadata
      and is only called after fix_fields(). The "default"
      implementation in Item::make_field() should be used instead as
      it relies only on field_type(), but not on the argument's type.
      
      Fixed by removing Item_sum::make_field() so that the superclass
      implementation Item::make_field() is always used.
      
      mysql-test/r/func_group.result:
        Added a test case for bug #54465.
      mysql-test/t/func_group.test:
        Added a test case for bug #54465.
      sql/item_sum.cc:
        Removed Item_sum::make_field() so that the superclass
        implementation Item::make_field() is always used.
      sql/item_sum.h:
        Removed Item_sum::make_field() so that the superclass
        implementation Item::make_field() is always used.
      d7d0f639
    • Ramil Kalimullin's avatar
      Fix for bug #54253: memory leak when using I_S plugins w/o deinit method · 7ebd2cd7
      Ramil Kalimullin authored
      Free memory allocated by the server for all plugins,
      with or without deinit() method.
      
      
      7ebd2cd7
  12. 26 Aug, 2010 5 commits
  13. 25 Aug, 2010 2 commits
    • Bjorn Munch's avatar
      merge followup fix for 52301 · e5a59eee
      Bjorn Munch authored
      e5a59eee
    • Dmitry Shulga's avatar
      Fixed bug #29751 - do not rename the error log at FLUSH LOGS. · 800feb16
      Dmitry Shulga authored
      Added open log file with FILE_SHARE_DELETE flag on Windows.
      
      sql/log.cc:
        added reopen_fstreams();
        modified redirect_std_streams(): call to sequence of freopen()
        replaced to reopen_fstreams();
        modified flush_error_log(): removed file rename for flushed
        error log file.
      sql/mysqld.cc:
        modified main() and init_server_components(): do open log error file
        over call to reopen_fstreams().
      800feb16
  14. 24 Aug, 2010 2 commits
    • Alexey Kopytov's avatar
      Bug #54802: 'NOT BETWEEN' evaluation is incorrect · e7b26882
      Alexey Kopytov authored
      Queries involving predicates of the form "const NOT BETWEEN
      not_indexed_column AND indexed_column" could return wrong data
      due to incorrect handling by the range optimizer.
      
      For "c NOT BETWEEN f1 AND f2" predicates, get_mm_tree()
      produces a disjunction of the SEL_ARG trees for "f1 > c" and
      "f2 < c". If one of the trees is empty (i.e. one of the
      arguments is not sargable) the resulting tree should be empty
      as well, since the whole expression in this case is not
      sargable.
      
      The above logic is implemented in get_mm_tree() as follows. The
      initial state of the resulting tree is NULL (aka empty). We
      then iterate through arguments and compute the corresponding
      SEL_ARG tree (either "f1 > c" or "f2 < c"). If the resulting
      tree is NULL, it is simply replaced by the generated
      tree. Otherwise it is replaced by a disjunction of itself and
      the generated tree. The obvious flaw in this implementation is
      that if the first argument is not sargable and thus produces a
      NULL tree, the resulting tree will simply be replaced by the
      tree for the second argument. As a result, "c NOT BETWEEN f1
      AND f2" will end up as just "f2 < c".
      
      Fixed by adding a check so that when the first argument
      produces an empty tree for the NOT BETWEEN case, the loop is
      aborted with an empty tree as a result. The whole idea of using
      a loop for 2 arguments does not make much sense, but it was
      probably used to avoid code duplication for several BETWEEN
      variants.
      e7b26882
    • Marko Mäkelä's avatar
      Bug#55832: selects crash too easily when innodb_force_recovery>3 · fed2531f
      Marko Mäkelä authored
      dict_update_statistics_low(): Create bogus statistics for those
      indexes that cannot be accessed because of the innodb_force_recovery
      setting.
      
      ha_innobase::info(): Calculate statistics for each index, even if
      innodb_force_recovery is set. Fill in bogus data for those indexes
      that are not accessed because of the innodb_force_recovery setting.
      fed2531f
  15. 23 Aug, 2010 1 commit
    • Marko Mäkelä's avatar
      Bug#55832: selects crash too easily when innodb_force_recovery>3 · 634af8f4
      Marko Mäkelä authored
      dict_update_statistics_low(): Create bogus statistics for those
      indexes that cannot be accessed because of the innodb_force_recovery
      setting.
      
      ha_innobase::info(): Calculate statistics for each index, even if
      innodb_force_recovery is set. Fill in bogus data for those indexes
      that are not accessed because of the innodb_force_recovery setting.
      634af8f4
  16. 20 Aug, 2010 5 commits