1. 29 Nov, 2017 1 commit
    • Alexander Barkov's avatar
      MDEV-14467 Item_param: replace {INT|DECIMAL|REAL|STRING|TIME}_VALUE with Type_handler · e01d33d7
      Alexander Barkov authored
      1. Removing data type specific constants from enum_item_param_state,
         adding SHORT_DATA_VALUE instead.
      2. Replacing tests for Item_param::state for the removed constants to
         tests for Type_handler::cmp_type() against {INT|REAL|TIME|DECIAML}_RESULT.
         Deriving Item_param::PValue from Type_handler_hybrid_field_type,
         to store the data type handler of the current value of the parameter.
      
      3. Moving Item_param::decimal_value and Item_param::str_value_ptr
         to Item_param::PValue. Adding Item_param::PValue::m_string
         and changing Item_param to use it to store string values,
         instead of Item::str_value. The intent is to replace Item_param::value
         to a st_value based implementation in the future, to avoid duplicate code.
         Adding a sub-class Item::PValue_simple, to implement
         Item_param::PValue::swap() easier.
         Remaming Item_basic_value::fix_charset_and_length_from_str_value()
         to fix_charset_and_length() and adding the "CHARSET_INFO" pointer
         parameter, instead of getting it directly from item->str_value.charset().
         Changing Item_param to pass value.m_string.charset() instead
         of str_value.charset().
         Adding a String argument to the overloaded
         fix_charset_and_length_from_str_value() and changing Item_param
         to pass value.m_string instead of str_value.
      
      4. Replacing the case in Item_param::save_in_field() to a call
         for Type_handler::Item_save_in_field().
      
      5. Adding new methods into Item_param::PValue:
         val_real(), val_int(), val_decimal(), val_str().
         Changing the corresponding Item_param methods
         to use these new Item_param::PValue methods
         internally. Adding a helper method
         Item_param::can_return_value() and removing
         duplicate code in Item_param::val_xxx().
      
      6. Removing value.set_handler() from Item_param::set_conversion()
         and Type_handler_xxx::Item_param_set_from_value().
         It's now done inside Item_param::set_param_func(),
         Item_param::set_value() and Item_param::set_limit_clause_param().
      
      7. Changing Type_handler_int_result::Item_param_set_from_value()
         to set max_length using attr->max_length instead of
         MY_INT64_NUM_DECIMAL_DIGITS, to preserve the data type
         of the assigned expression more precisely.
      
      8. Adding Type_handler_hybrid_field_type::swap(),
         using it in Item_param::PValue::swap().
      
      9. Moving the data-type specific code from
         Item_param::query_val_str(), Item_param::eq(),
         Item_param::clone_item() to
         Item_param::value_query_type_str(),
         Item_param::value_eq(), Item_param::value_clone_item(),
         to split the "state" dependent code and
         the data type dependent code.
         Later we'll split the data type related code further
         and add new methods in Type_handler. This will be done
         after we replace Item_param::PValue to st_value.
      
      10. Adding asserts into set_int(), set_double(), set_decimal(),
         set_time(), set_str(), set_longdata() to make sure that
         the value set to Item_param corresponds to the previously
         set data type handler.
      
      11. Adding tests into t/ps.test and suite/binlog/t/binlog_stm_ps.test,
         to cover Item_param::print() and Item_param::append_for_log()
         for LIMIT clause parameters.
         Note, the patch does not change the behavior covered by the new
         tests. Adding for better code coverage.
      
      12. Adding tests for more precise integer data type in queries like this:
          EXECUTE IMMEDIATE
           'CREATE OR REPLACE TABLE t1 AS SELECT 999999999 AS a,? AS b'
            USING 999999999;
          The explicit integer literal and the same integer literal
          passed as a PS parameter now produce columns of the same data type.
          Re-recording old results in ps.result, gis.result, func_hybrid_type.result
          accordingly.
      e01d33d7
  2. 28 Nov, 2017 1 commit
  3. 24 Nov, 2017 1 commit
    • Alexander Barkov's avatar
      MDEV-14494 Move set_param_xxx() in sql_prepare.cc to methods in Item_param and Type_handler · 6aedbf40
      Alexander Barkov authored
      - sql_prepare.cc: Moving functions set_param_xxx() as
        methods to Item_param
      
      - Replacing a pointer to a function Item_param::set_param_func
        to Type_handler based implementation:
        Item_param::value now derives from Type_handler_hybrid_field_type.
        Adding new virtual methods Type_handler::Item_param_setup_conversion()
        and Type_handler::Item_param_set_param_func()
      
      - Moving declaration of some Item_param members  from "public:" to "private:"
        (CONVERSION_INFO, value, decimal_value)
      
      - Adding a new method Item_param::set_limit_clause_param(),
        to share duplicate code, as well as to encapsulate
        Item_param::value.
      
      - Adding Item_param::setup_conversion_string() and
        Item_param::setup_conversion_blob() to share
        the code for binding from a client value
        (mysql_stmt_bind_param), and for binding from
        an expression (Item).
      
      - Removing two different functions set_param_str_or_null()
        and set_param_str(). Adding a common method Item_param::set_param_str().
        Item_param::m_empty_string_is_null, used by Item_param::set_param_str().
      
      - Removing the call for setup_one_conversion_function() from
        insert_params_from_actual_params_with_log(). It's not needed,
        because the call for ps_param->save_in_param() makes sure
        to initialized all data type dependent members properly,
        by calling setup_conversion_string() from
        Type_handler_string_result::Item_param_set_from_value()
        and by calling setup_conversion_blob() from
        Type_handler_blob_common::Item_param_set_from_value()
      
      - Cleanup: removing multiplication to MY_CHARSET_BIN_MB_MAXLEN
        in a few places. It's 1 anyway, and will never change.
      6aedbf40
  4. 22 Nov, 2017 1 commit
    • Alexander Barkov's avatar
      A cleanup for MDEV-12846 sql_mode=ORACLE: using Oracle-style placeholders in... · a18f6009
      Alexander Barkov authored
      A cleanup for MDEV-12846 sql_mode=ORACLE: using Oracle-style placeholders in direct query execution makes the server crash
      
      Fixing a test failure in "mtr --ps compat/oracle.ps" caused by "SELECT ?"
      returning different errors:
      - CR_PARAMS_NOT_BOUND in prepared execution
      - ER_PARSE_ERROR in direct execution
      Disabling PS protocol for this test chunk.
      a18f6009
  5. 21 Nov, 2017 4 commits
    • Marko Mäkelä's avatar
      Merge 10.2 into bb-10.2-ext · 366bb162
      Marko Mäkelä authored
      366bb162
    • Marko Mäkelä's avatar
      Adjust an imported test · 375caf99
      Marko Mäkelä authored
      375caf99
    • Marko Mäkelä's avatar
      MDEV-13201 Assertion `srv_undo_sources || ...` failed on shutdown during DDL operation · 9405fdeb
      Marko Mäkelä authored
      dict_stats_exec_sql(): Refuse the operation if shutdown has been
      initiated.
      
      The real fix would be to update the persistent statistics as part
      of the data dictionary transactions. To do this, we should move the
      storage of InnoDB persistent statistics to the InnoDB data files,
      and maybe also remove the InnoDB data dictionary.
      9405fdeb
    • Alexander Barkov's avatar
      MDEV-14454 Binary protocol returns wrong collation ID for SP OUT parameters · 563f1d89
      Alexander Barkov authored
      Item_param::set_value() did not set Item::collation and
      Item_param::str_value_ptr.str_charset properly. So both
      metadata and data for OUT parameters were sent in a wrong
      way to the client.
      
      This patch removes the old implementation of Item_param::set_value()
      and rewrites it using Type_handler::Item_param_set_from_value(),
      so now setting IN and OUT parameters share the a lot of code.
      
      1. Item_param::set_str() now:
        - accepts two additional parameters fromcs, tocs
        - sets str_value_ptr, to make sure it's always in sync with str_value,
          even without Item_param::convert_str_value()
        - does collation.set(tocs, DERIVATION_COERCIBLE),
          to make sure that DTCollation is valid even without
          Item_param::convert_str_value()
      
      2. Item_param::set_value(), which is used to set OUT parameters,
         now reuses Type_handler::Item_param_set_from_value().
      
      3. Cleanup: moving Item_param::str_value_ptr to private,
         as it's not needed outside.
      
      4. Cleanup: adding a new virtual method
         Settable_routine_parameter::get_item_param()
         and using it a few new DBUG_ASSERTs, where
         Item_param cannot appear.
      
      After this change:
      1. Assigning of IN parameters works as before:
      a. Item_param::set_str() is called and sets the value as a binary string
      b. The original value is sent to the query used for binary/general logging
      c. Item_param::convert_str_value() converts the value from the client
         character set to the connection character set
      
      2. Assigning of OUT parameters works in the new way:
      a. Item_param::set_str() and sets the value
         using the source Item's collation, so both Item::collation
         and Item_param::str_value_ptr.str_charset are properly set.
      b. Protocol_binary::send_out_parameters() sends the
         value to the client correctly:
         - Protocol::send_result_set_metadata() uses Item::collation.collation
           (which is now properly set), to detect if conversion is needed,
           and sends a correct collation ID.
         - Protocol::send_result_set_row() calls Type_handler::Item_send_str(),
           which uses Item_param::str_value_ptr.str_charset
           (which is now properly set) to actually perform the conversion.
      563f1d89
  6. 20 Nov, 2017 5 commits
  7. 18 Nov, 2017 1 commit
  8. 17 Nov, 2017 1 commit
  9. 16 Nov, 2017 6 commits
    • Vladislav Vaintroub's avatar
      Fix rocksdb tests on Windows · 0d1e805a
      Vladislav Vaintroub authored
      0d1e805a
    • Vladislav Vaintroub's avatar
      MDEV-13852 - redefine WinWriteableFile such as IsSyncThreadSafe() · 689168be
      Vladislav Vaintroub authored
      is set to true, as it should.
      
      Copy and modify original io_win.h header file to a different location
      (as we cannot patch anything in submodule). Make sure modified header is
      used.
      689168be
    • Alexey Botchkov's avatar
      MDEV-14402 JSON_VALUE doesn't escape quote. · 842dce37
      Alexey Botchkov authored
              Result unescaping added.
      842dce37
    • Alexander Barkov's avatar
    • Jan Lindström's avatar
      MDEV-13206: INSERT ON DUPLICATE KEY UPDATE foreign key fail · 0c4d11e8
      Jan Lindström authored
      This is caused by following change:
      
      commit 95d29c99f01882ffcc2259f62b3163f9b0e80c75
      Author: Marko Mäkelä <marko.makela@oracle.com>
      Date:   Tue Nov 27 11:12:13 2012 +0200
      
          Bug#15920445 INNODB REPORTS ER_DUP_KEY BEFORE CREATE UNIQUE INDEX COMPLETED
      
          There is a phase during online secondary index creation where the index has
          been internally completed inside InnoDB, but does not 'officially' exist yet.
          We used to report ER_DUP_KEY in these situations, like this:
      
          ERROR 23000: Can't write; duplicate key in table 't1'
      
          What we should do is to let the 'offending' operation complete, but report an
          error to the
          ALTER TABLE t1 ADD UNIQUE KEY (c2):
      
          ERROR HY000: Index c2 is corrupted
          (This misleading error message should be fixed separately:
          Bug#15920713 CREATE UNIQUE INDEX REPORTS ER_INDEX_CORRUPT INSTEAD OF DUPLICATE)
      
          row_ins_sec_index_entry_low(): flag the index corrupted instead of
          reporting a duplicate, in case the index has not been published yet.
      
          rb:1614 approved by Jimmy Yang
      
      Problem is that after we have found duplicate key on primary key
      we continue to get necessary gap locks in secondary indexes to
      block concurrent transactions from inserting the searched records.
      However, search from unique index used in foreign key constraint
      could return DB_NO_REFERENCED_ROW if INSERT .. ON DUPLICATE KEY UPDATE
      does not contain value for foreign key column. In this case
      we should return the original DB_DUPLICATE_KEY error instead
      of DB_NO_REFERENCED_ROW.
      
      Consider as a example following:
      
      create table child(a int not null primary key,
      b int not null,
      c int,
      unique key (b),
      foreign key (b) references
      parent (id)) engine=innodb;
      
      insert into child values (1,1,2);
      
      insert into child(a) values (1) on duplicate key update c = 3;
      
      Now primary key value 1 naturally causes duplicate key error that will be
      stored on node->duplicate. If there was no duplicate key error, we should
      return the actual no referenced row error. As value for column b used in
      both unique key and foreign key is not provided, server uses 0 as a
      search value. This is naturally, not found leading to DB_NO_REFERENCED_ROW.
      But, we should update the row with primay key value 1 anyway as
      requested by on duplicate key update clause.
      0c4d11e8
    • Jun Su's avatar
      Support CRC32 SSE2 implementation under Windows · 2401d14e
      Jun Su authored
      2401d14e
  10. 15 Nov, 2017 6 commits
  11. 14 Nov, 2017 3 commits
  12. 13 Nov, 2017 8 commits
  13. 12 Nov, 2017 1 commit
  14. 11 Nov, 2017 1 commit