1. 18 Oct, 2019 2 commits
    • Alexander Barkov's avatar
      MDEV-20844 RBR from binary(16) to inet6 fails with error 171: The event was... · ec171a94
      Alexander Barkov authored
      MDEV-20844 RBR from binary(16) to inet6 fails with error 171: The event was corrupt, leading to illegal data being read
      
      This patch changes the way how INET6 is packed to the RBR binary log:
      - from fixed length 16 bytes
      - to BINARY(16) compatible variable length style
        with trailing 0x00 byte compression.
      
      This is to make INET6 fully compatible with BINARY(16) in RBR binary logs,
      so RBR replication works in this scenarios:
      
      - Old master BINARY(16) -> New slave INET6
      - New master INET6      -> Old slave BINARY(16)
      
      A new class StringPack was added to share the code between
      Field_string and Field_inet6.
      ec171a94
    • Alexander Barkov's avatar
      MDEV-20856 Bad values in metadata views for partitions on VARBINARY · 9a833dc6
      Alexander Barkov authored
      The old code to print partition values was too complicated:
      - it created new Items for character set conversion purposes.
      - it mixed string conversion and partition error reporting
        in the same code blocks.
      
      Simplifying the code as follows:
      
      - Adding helper methods String::can_be_safely_convert_to() and
        String::append_introducer_and_hex().
      
      - Adding DBUG_EXECUTE_IF("generate_partition_syntax_for_frm",  push_warning...)
        into generate_partition_syntax_for_frm(), to test the PARTITON
        clause written to FRM. Adding test partition_utf8-debug.test for this.
      
      - Removing functions get_cs_converted_part_value_from_string() and
        get_cs_converted_string_value. Changing get_partition_column_description()
        to use Type_handler::partition_field_append_value() instead.
        This makes SHOW CREATE TABLE and SELECT FROM I_S.PARTITIONS
        use the same code path.
      
      - Changing Type_handler::partition_field_append_value() not to
        call convert_charset_partition_constant(), to avoid creating a new Item
        for string conversion pursposes.
        Rewritting the code to use only String methods.
      
      - Removing error reporting code (ER_PARTITION_FUNCTION_IS_NOT_ALLOWED)
        from Type_handler::partition_field_append_value().
        The error is correctly detected and reported on the caller level.
        So error reporting was redundant here.
      
      Also:
      
      - Moving methods Type_handler::partition_field_*() from sql_partition.cc
        to sql_type.cc. This fixes compilation problem with -DPLUGIN_PARTITION=NO,
        earlier introduced by the patch for MDEV-20831.
      9a833dc6
  2. 16 Oct, 2019 2 commits
  3. 15 Oct, 2019 1 commit
    • Alexander Barkov's avatar
      MDEV-20831 Table partitioned by LIST/RANGE COLUMNS(inet6) can be created, but not inserted into · 22b645ef
      Alexander Barkov authored
      This clause in CREATE TABLE:
      
        PARTITION BY LIST COLUMNS (inet6column)
          (PARTITION p1 VALUES IN ('::'))
      
      was erroneously written to frm file as:
      
        PARTITION BY LIST COLUMNS(inet6column)
          (PARTITION p1 VALUES IN (_binary 0x3A3A))
      
      I.e. the text value '::' was converted to HEX representation
      and prefixed with _binary.
      
      A simple fix could write `_latin1 0x3A3A` instead of `_binary 0x3A3A`,
      but in case of INET6 we don't need neither character set introducers,
      nor HEX encoding, because text representation of INET6 values consist
      of pure ASCII characters.
      
      So this patch changes the above clause to be printed as:
      
        PARTITION BY LIST COLUMNS(inet6column)
          (PARTITION p1 VALUES IN ('::'))
      
      Details:
      
      The old code in check_part_field() was not friendly to pluggable data types.
      Replacing this function to two new virtual methods in Type_handler:
      
        virtual bool partition_field_check(const LEX_CSTRING &field_name,
                                           Item *item_expr) const;
      
        virtual bool partition_field_append_value(String *str,
                                                  Item *item_expr,
                                                  CHARSET_INFO *field_cs,
                                                  partition_value_print_mode_t mode)
                                                  const;
      
      so data type plugins can decide whether they need to use character set
      introducer and/or hex encoding when printing partition values.
      22b645ef
  4. 14 Oct, 2019 20 commits
    • Alexander Barkov's avatar
      MDEV-20822 INET6 crashes in combination with RBR extended metadata · 8ec97814
      Alexander Barkov authored
      The code erroneously assumed that only Field_str descendants can
      store character set information. After adding Field_inet6, it's
      not true anymore.
      
      Also, after adding Field_inet6, storing field->charset() become not correct either:
      - Field_inet6::charset() return &my_charset_latin1,
        because clients see INET6 as VARCHAR(39).
      - Field_inet6::binlog_type_info().m_cs returns &my_charset_bin
        because storage engines see INET6 as BINARY(16).
      
      We need to store &my_charset_bin to the binlog metadata,
      so the slave sees INET6 as BINARY(16), like storage engines do,
      to make the slave treat the replicated data as binary IPv6 address
      representation (rather than text representation).
      
      The correct character set that needs to be stored to the metadata
      is already populated to binlog_type_info_array[i].m_cs. So the
      fixed code version uses this value rather than field->charset().
      8ec97814
    • Alexander Barkov's avatar
      MDEV-20826 Wrong result of MIN(inet6) with GROUP BY · a11694b8
      Alexander Barkov authored
      Type_handler_inet6::is_val_native_ready() was not overriden and
      returned "false" by default, so Item_sum_min_max::update_field()
      erroneously went through the min_max_update_str_field() rather than
      min_max_update_native_field() execution path. As a result '8888::'
      was compared to 'fff::' in string format (rather than INET6 binary format)
      and gave "less" instead of "greater".
      
      Adding the forgotten overriding method returning "true".
      a11694b8
    • Alexey Botchkov's avatar
      MDEV-16620 JSON_ARRAYAGG and JSON_OBJECTAGG. · ba8e5e68
      Alexey Botchkov authored
      Ison_objectagg implemented.
      ba8e5e68
    • Sergei Golubchik's avatar
      MDEV-10014 Add RETURNING to INSERT · b1c2c4ee
      Sergei Golubchik authored
      post-review fixes:
      * test for dependent subqueries
      * test for triggers and routines
      * disallow INSERT...RETURNING in triggers and stored functions
      * don't return anything if INSERT IGNORE ignored an error
      b1c2c4ee
    • Sergei Golubchik's avatar
      bugfix: PS and dependent subqueries · 904dc934
      Sergei Golubchik authored
      when there are nested subqueries, and a field in a subquery is
      resolved as an outer reference to a table few levels up, all subqueries
      the subquery with a reference and all subqueries up to subquery with
      the table must be marked as dependent.
      
      in the text protocol and PS-prepare step it happens in
      Item_field::fix_outer_field in a loop that walks contexts
      using context->outer_context.
      
      in PS-execute step Item_field->cached_table is set and subqueries
      are walked in a PS-only mark_select_range_as_dependent(),
      which inconsistently walks SELECT_LEX'es using select_lex->outer_select().
      
      Fix mark_select_range_as_dependent() to walk contexts, not SELECT_LEX'es,
      to have the same logic both in prepare and execute steps.
      
      This fixes a crash in main.insert_returning in --ps-protocol
      904dc934
    • Rucha Deodhar's avatar
      MDEV-10014 Add RETURNING to INSERT · 837ad9ab
      Rucha Deodhar authored
      Closes #1384
      837ad9ab
    • Sergei Golubchik's avatar
      cleanup st_select_lex_unit::explainable · 57a09a72
      Sergei Golubchik authored
      57a09a72
    • Sergei Golubchik's avatar
      cleanup: formatting · 721a9df7
      Sergei Golubchik authored
      comments, whitespaces
      721a9df7
    • Sergei Golubchik's avatar
      cleanup: reduce code duplication · 828d9ae5
      Sergei Golubchik authored
      828d9ae5
    • Sergei Golubchik's avatar
      cleanup: don't pass wild_num to setup_wild() · a4a025f5
      Sergei Golubchik authored
      because internally setup_wild() adjusts select_lex->with_wild directly
      anyway, so there is no reason to pretend that the number of '*' may be
      anything else but select_lex->with_wild
      
      And don't update select_lex->item_list, because fields can come
      from anywhere and don't necessarily have to be copied into select_lex.
      a4a025f5
    • Sergei Golubchik's avatar
      outer references in subqueries in INSERT · c7320830
      Sergei Golubchik authored
      remove inconsistent limitation
      c7320830
    • Sergei Golubchik's avatar
      MDEV-12684 Show what config file a sysvar got a value from · 173ae631
      Sergei Golubchik authored
      Show the config file in I_S.SYSTEM_VARIABLES
      But only if the user has FILE privilege
      173ae631
    • Sergei Golubchik's avatar
      MDEV-12684 Show what config file a sysvar got a value from · f217612f
      Sergei Golubchik authored
      change get_one_option() prototype to pass the filename and
      not to pass the redundant optid.
      f217612f
    • Sergei Golubchik's avatar
      MDEV-12684 Show what config file a sysvar got a value from · 927521a2
      Sergei Golubchik authored
      make load_defaults() store the file name in the generated option list
      using a special marker ---file-marker--- option.
      
      Pick up this filename in handle_options().
      
      Remove ---args-separator---, use ---file-marker--- with an empty file
      name instead - this simplifies checks on the caller, only one special
      option to recognize.
      927521a2
    • Sergei Golubchik's avatar
      cleanup: don't use my_getopt_is_args_separator() · f7b8d144
      Sergei Golubchik authored
      only my_getopt should use it, because it changes my_getopt's behavior.
      If one simply wants to skip the separator - don't ask it to be added
      in the first place
      f7b8d144
    • Sergei Golubchik's avatar
      cleanup: unify --defaults* option handling · 3e569727
      Sergei Golubchik authored
      process all --defaults* options uniformly,
      get rid of special case for --no-defaults and --print-defaults
      use realpath instead of blindly concatenating pwd and relative path.
      3e569727
    • Sergei Golubchik's avatar
      cleanup: my_getopt, get_one_option isn't optional · 3ea51b51
      Sergei Golubchik authored
      it turns out that practically every single user of handle_options()
      used the get_one_option callback. Simplify the code,
      make it mandatory, adjust unit tests.
      3ea51b51
    • Sergei Golubchik's avatar
      cleanup: my_getopt, consistency · eb3431d5
      Sergei Golubchik authored
      almost all my_getopt settings and callbacks are global variables,
      directly assignable to configure my_getopt. Only getopt_get_addr
      was using a setter function. Get rid of it, make it a global
      directly assignable variable like all other settings.
      
      Also make getopt_compare_strings() static.
      eb3431d5
    • Sergei Golubchik's avatar
      cleanup: my_defaults, remove Process_option_func · 8965ae27
      Sergei Golubchik authored
      This is a remnant of "MySQL Instance Manager", which was removed in
      MySQL-5.5.0 and never existed in MariaDB
      
      Remove callback, simplify and optimize the code accordingly.
      8965ae27
    • Alexander Barkov's avatar
      MDEV-20818 ER_CRASHED_ON_USAGE or Assertion `length <= column->length' failed... · 5392726e
      Alexander Barkov authored
      MDEV-20818 ER_CRASHED_ON_USAGE or Assertion `length <= column->length' failed in write_block_record on temporary table
      
      The patch for `MDEV-20795 CAST(inet6 AS BINARY) returns wrong result`
      unintentionally changed what Item_char_typecast::type_handler()
      returns. This broke UNIONs with the BINARY() function, as the Aria
      engine started to get columns of unexpected data types.
      
      Restoring previous behaviour, to return
        Type_handler::string_type_handler(max_length).
      
      The prototype for Item_handed_func::return_type_handler() has changed
      from:
        const Type_handler *return_type_handler() const
      to:
        const Type_handler *return_type_handler(const Item_handled_func *) const
      5392726e
  5. 13 Oct, 2019 8 commits
  6. 12 Oct, 2019 7 commits