✘✘ GRAYBYTE WORDPRESS FILE MANAGER ✘✘

​🇳​​🇦​​🇲​​🇪♯➤ server.blackpussy.asia ​🇻​♯➤ 5.14.0-611.20.1.el9_7.x86_64 #1 SMP 🇾​♯➤ 2026

𝗛𝗢𝗠𝗘 𝗜𝗗 ♯➤ 163.245.207.76 ♯➤ 𝗔𝗗𝗠𝗜𝗡 𝗜𝗗 216.73.216.243
𝗢𝗣𝗧𝗜𝗢𝗡𝗦 ♯ CRL ♯➤ 𝗢𝗞 ┃ WGT ♯➤ 𝗢𝗞 ┃ SDO ♯➤ 𝗢𝗞 ┃ PKEX ♯➤ 𝗢𝗙𝗙
𝗗𝗘𝗔𝗖𝗧𝗜𝗩𝗔𝗧𝗘𝗗 ♯➤ mail,mb_send_mail
𝗖𝗨𝗥𝗥𝗘𝗡𝗧 𝗙𝗜𝗟𝗘 : /usr/include/mysql/server/private//item_windowfunc.h
/*
   Copyright (c) 2016, 2020, MariaDB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA */

#ifndef ITEM_WINDOWFUNC_INCLUDED
#define ITEM_WINDOWFUNC_INCLUDED

#include "item.h"

class Window_spec;


int test_if_group_changed(List<Cached_item> &list);


/* A wrapper around test_if_group_changed */
class Group_bound_tracker
{
public:

  Group_bound_tracker(THD *thd, SQL_I_List<ORDER> *list)
  {
    for (ORDER *curr = list->first; curr; curr=curr->next)
    {
        Cached_item *tmp= new_Cached_item(thd, curr->item[0], TRUE);
        group_fields.push_back(tmp);
    }
  }

  void init()
  {
    first_check= true;
  }

  /*
    Check if the current row is in a different group than the previous row
    this function was called for.
    XXX: Side-effect: The new row's group becomes the current row's group.

    Returns true if there is a change between the current_group and the cached
    value, or if it is the first check after a call to init.
  */
  bool check_if_next_group()
  {
    if (test_if_group_changed(group_fields) > -1 || first_check)
    {
      first_check= false;
      return true;
    }
    return false;
  }

  /*
    Check if the current row is in a different group than the previous row
    check_if_next_group was called for.

    Compares the groups without the additional side effect of updating the
    current cached values.
  */
  int compare_with_cache()
  {
    List_iterator<Cached_item> li(group_fields);
    Cached_item *ptr;
    int res;
    while ((ptr= li++))
    {
      if ((res= ptr->cmp_read_only()))
        return res;
    }
    return 0;
  }
  ~Group_bound_tracker()
  {
    group_fields.delete_elements();
  }

private:
  List<Cached_item> group_fields;
  /*
    During the first check_if_next_group, the list of cached_items is not
    initialized. The compare function will return that the items match if
    the field's value is the same as the Cached_item's default value (0).
    This flag makes sure that we always return true during the first check.

    XXX This is better to be implemented within test_if_group_changed, but
    since it is used in other parts of the codebase, we keep it here for now.
  */
   bool first_check;
};

/*
  ROW_NUMBER() OVER (...)

  @detail
  - This is a Window function (not just an aggregate)
  - It can be computed by doing one pass over select output, provided 
    the output is sorted according to the window definition.
*/

class Item_sum_row_number: public Item_sum_int
{
  longlong count;

public:

  Item_sum_row_number(THD *thd)
    : Item_sum_int(thd),  count(0) {}

  const Type_handler *type_handler() const override
  { return &type_handler_slonglong; }

  void clear() override
  {
    count= 0;
  }

  bool add() override
  {
    count++;
    return false;
  }

  void reset_field() override { DBUG_ASSERT(0); }
  void update_field() override {}

  enum Sumfunctype sum_func() const override
  {
    return ROW_NUMBER_FUNC;
  }

  longlong val_int() override
  {
    return count;
  }
  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("row_number") };
    return name;
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_row_number>(thd, this); }
};


/*
  RANK() OVER (...) Windowing function

  @detail
  - This is a Window function (not just an aggregate)
  - It can be computed by doing one pass over select output, provided 
    the output is sorted according to the window definition.

  The function is defined as:

  "The rank of row R is defined as 1 (one) plus the number of rows that 
  precede R and are not peers of R"

  "This implies that if two or more rows are not distinct with respect to 
  the window ordering, then there will be one or more"
*/

class Item_sum_rank: public Item_sum_int
{
protected:
  longlong row_number; // just ROW_NUMBER()
  longlong cur_rank;   // current value

  Group_bound_tracker *peer_tracker;
public:

  Item_sum_rank(THD *thd) : Item_sum_int(thd), peer_tracker(NULL) {}

  const Type_handler *type_handler() const override
  { return &type_handler_slonglong; }

  void clear() override
  {
    /* This is called on partition start */
    cur_rank= 1;
    row_number= 0;
  }

  bool add() override;

  longlong val_int() override
  {
    return cur_rank;
  }

  void reset_field() override { DBUG_ASSERT(0); }
  void update_field() override {}

  enum Sumfunctype sum_func () const override
  {
    return RANK_FUNC;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("rank") };
    return name;
  }

  void setup_window_func(THD *thd, Window_spec *window_spec) override;

  void cleanup() override
  {
    if (peer_tracker)
    {
      delete peer_tracker;
      peer_tracker= NULL;
    }
    Item_sum_int::cleanup();
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_rank>(thd, this); }
};


/*
  DENSE_RANK() OVER (...) Windowing function

  @detail
  - This is a Window function (not just an aggregate)
  - It can be computed by doing one pass over select output, provided 
    the output is sorted according to the window definition.

  The function is defined as:

  "If DENSE_RANK is specified, then the rank of row R is defined as the 
  number of rows preceding and including R that are distinct with respect 
  to the window ordering"

  "This implies that there are no gaps in the sequential rank numbering of
  rows in each window partition."
*/


class Item_sum_dense_rank: public Item_sum_int
{
  longlong dense_rank;
  bool first_add;
  Group_bound_tracker *peer_tracker;
 public:
  /*
     XXX(cvicentiu) This class could potentially be implemented in the rank
     class, with a switch for the DENSE case.
  */
  void clear() override
  {
    dense_rank= 0;
    first_add= true;
  }
  bool add() override;
  void reset_field() override { DBUG_ASSERT(0); }
  void update_field() override {}
  longlong val_int() override
  {
    return dense_rank;
  }

  Item_sum_dense_rank(THD *thd)
    : Item_sum_int(thd), dense_rank(0), first_add(true), peer_tracker(NULL) {}
  const Type_handler *type_handler() const override
  { return &type_handler_slonglong; }
  enum Sumfunctype sum_func () const override
  {
    return DENSE_RANK_FUNC;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("dense_rank") };
    return name;
  }

  void setup_window_func(THD *thd, Window_spec *window_spec) override;

  void cleanup() override
  {
    if (peer_tracker)
    {
      delete peer_tracker;
      peer_tracker= NULL;
    }
    Item_sum_int::cleanup();
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_dense_rank>(thd, this); }
};

class Item_sum_hybrid_simple : public Item_sum_hybrid
{
 public:
  Item_sum_hybrid_simple(THD *thd, Item *arg):
   Item_sum_hybrid(thd, arg),
   value(NULL)
  { }

  Item_sum_hybrid_simple(THD *thd, Item *arg1, Item *arg2):
   Item_sum_hybrid(thd, arg1, arg2),
   value(NULL)
  { }

  bool add() override;
  bool fix_fields(THD *, Item **) override;
  bool fix_length_and_dec(THD *thd) override;
  void setup_hybrid(THD *thd, Item *item);
  double val_real() override;
  longlong val_int() override;
  my_decimal *val_decimal(my_decimal *) override;
  void reset_field() override;
  String *val_str(String *) override;
  bool val_native(THD *thd, Native *to) override;
  bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override;
  const Type_handler *type_handler() const override
  { return Type_handler_hybrid_field_type::type_handler(); }
  void update_field() override;
  Field *create_tmp_field(MEM_ROOT *root, bool group, TABLE *table) override;
  void clear() override
  {
    value->clear();
    null_value= 1;
  }

 private:
  Item_cache *value;
};

/*
   This item will remember the first value added to it. It will not update
   the value unless it is cleared.
*/
class Item_sum_first_value : public Item_sum_hybrid_simple
{
 public:
  Item_sum_first_value(THD* thd, Item* arg_expr) :
    Item_sum_hybrid_simple(thd, arg_expr) {}


  enum Sumfunctype sum_func () const override
  {
    return FIRST_VALUE_FUNC;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("first_value") };
    return name;
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_first_value>(thd, this); }
};

/*
   This item will remember the last value added to it.

   This item does not support removal, and can be cleared only by calling
   clear().
*/
class Item_sum_last_value : public Item_sum_hybrid_simple
{
 public:
  Item_sum_last_value(THD* thd, Item* arg_expr) :
    Item_sum_hybrid_simple(thd, arg_expr) {}

  enum Sumfunctype sum_func() const override
  {
    return LAST_VALUE_FUNC;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("last_value") };
    return name;
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_last_value>(thd, this); }
};


class Item_sum_nth_value : public Item_sum_hybrid_simple
{
 public:
  Item_sum_nth_value(THD *thd, Item *arg_expr, Item* offset_expr) :
    Item_sum_hybrid_simple(thd, arg_expr, offset_expr) {}

  enum Sumfunctype sum_func() const override
  {
    return NTH_VALUE_FUNC;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("nth_value") };
    return name;
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_nth_value>(thd, this); }
};


class Item_sum_lead : public Item_sum_hybrid_simple
{
 public:
  Item_sum_lead(THD *thd, Item *arg_expr, Item* offset_expr) :
    Item_sum_hybrid_simple(thd, arg_expr, offset_expr) {}

  enum Sumfunctype sum_func() const override
  {
    return LEAD_FUNC;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("lead") };
    return name;
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_lead>(thd, this); }
};


class Item_sum_lag : public Item_sum_hybrid_simple
{
 public:
  Item_sum_lag(THD *thd, Item *arg_expr, Item* offset_expr) :
    Item_sum_hybrid_simple(thd, arg_expr, offset_expr) {}

  enum Sumfunctype sum_func() const override
  {
    return LAG_FUNC;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("lag") };
    return name;
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_lag>(thd, this); }
};


class Partition_row_count
{
public:
  Partition_row_count() :partition_row_count_(0) { }
  void set_partition_row_count(ulonglong count)
  {
    partition_row_count_ = count;
  }
  double calc_val_real(bool *null_value,
                       ulonglong current_row_count)
  {
    if ((*null_value= (partition_row_count_ == 0)))
      return 0;
    return static_cast<double>(current_row_count) / partition_row_count_;
  }
protected:
  longlong get_row_count() { return partition_row_count_; }
  ulonglong partition_row_count_;
};


class Current_row_count
{
public:
  Current_row_count() :current_row_count_(0) { }
protected:
  ulonglong get_row_number() { return current_row_count_ ; }
  ulonglong current_row_count_;
};


/*
  @detail
  "The relative rank of a row R is defined as (RK-1)/(NR-1), where RK is 
  defined to be the RANK of R and NR is defined to be the number of rows in
  the window partition of R."

  Computation of this function requires two passes:
  - First pass to find #rows in the partition
    This is held within the row_count context.
  - Second pass to compute rank of current row and the value of the function
*/
class Item_sum_percent_rank: public Item_sum_double,
                             public Partition_row_count
{
 public:
  Item_sum_percent_rank(THD *thd)
    : Item_sum_double(thd), cur_rank(1), peer_tracker(NULL) {}

  longlong val_int() override
  {
   /*
      Percent rank is a real value so calling the integer value should never
      happen. It makes no sense as it gets truncated to either 0 or 1.
   */
    DBUG_ASSERT(0);
    return 0;
  }

  double val_real() override
  {
   /*
     We can not get the real value without knowing the number of rows
     in the partition. Don't divide by 0.
   */
   ulonglong partition_rows = get_row_count();
   null_value= partition_rows > 0 ? false : true;

   return partition_rows > 1 ?
             static_cast<double>(cur_rank - 1) / (partition_rows - 1) : 0;
  }

  enum Sumfunctype sum_func () const override
  {
    return PERCENT_RANK_FUNC;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("percent_rank") };
    return name;
  }

  void update_field() override {}

  void clear() override
  {
    cur_rank= 1;
    row_number= 0;
  }
  bool add() override;
  const Type_handler *type_handler() const override
  { return &type_handler_double; }

  bool fix_length_and_dec(THD *thd) override
  {
    decimals = 10;  // TODO-cvicentiu find out how many decimals the standard
                    // requires.
    return FALSE;
  }

  void setup_window_func(THD *thd, Window_spec *window_spec) override;

  void reset_field() override { DBUG_ASSERT(0); }

  void set_partition_row_count(ulonglong count) override
  {
    Partition_row_count::set_partition_row_count(count);
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_percent_rank>(thd, this); }

 private:
  longlong cur_rank;   // Current rank of the current row.
  longlong row_number; // Value if this were ROW_NUMBER() function.

  Group_bound_tracker *peer_tracker;

  void cleanup() override
  {
    if (peer_tracker)
    {
      delete peer_tracker;
      peer_tracker= NULL;
    }
    Item_sum_num::cleanup();
  }
};




/*
  @detail
  "The relative rank of a row R is defined as NP/NR, where 
  - NP is defined to be the number of rows preceding or peer with R in the 
    window ordering of the window partition of R
  - NR is defined to be the number of rows in the window partition of R.

  Just like with Item_sum_percent_rank, computation of this function requires
  two passes.
*/

class Item_sum_cume_dist: public Item_sum_double,
                          public Partition_row_count,
                          public Current_row_count
{
 public:
  Item_sum_cume_dist(THD *thd) :Item_sum_double(thd) { }
  Item_sum_cume_dist(THD *thd, Item *arg) :Item_sum_double(thd, arg) { }

  double val_real() override
  {
    return calc_val_real(&null_value, current_row_count_);
  }

  bool add() override
  {
    current_row_count_++;
    return false;
  }

  enum Sumfunctype sum_func() const override
  {
    return CUME_DIST_FUNC;
  }

  void clear() override
  {
    current_row_count_= 0;
    partition_row_count_= 0;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("cume_dist") };
    return name;
  }

  void update_field() override {}
  const Type_handler *type_handler() const override
  { return &type_handler_double; }

  bool fix_length_and_dec(THD *thd) override
  {
    decimals = 10;  // TODO-cvicentiu find out how many decimals the standard
                    // requires.
    return FALSE;
  }
  
  void reset_field() override { DBUG_ASSERT(0); }

  void set_partition_row_count(ulonglong count) override
  {
    Partition_row_count::set_partition_row_count(count);
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_cume_dist>(thd, this); }
};

class Item_sum_ntile : public Item_sum_int,
                       public Partition_row_count,
                       public Current_row_count
{
 public:
  Item_sum_ntile(THD* thd, Item* num_quantiles_expr) :
    Item_sum_int(thd, num_quantiles_expr), n_old_val_(0)
  { }

  longlong val_int() override
  {
    if (partition_row_count_ == 0)
    {
      null_value= true;
      return 0;
    }
    /*
      The current row count in the partition should not exceed the
      total row count of the partition
    */
    DBUG_ASSERT(current_row_count_ <= partition_row_count_);
    DBUG_ASSERT(current_row_count_ > 0);

    longlong num_quantiles= get_num_quantiles();

    if (num_quantiles <= 0 || 
      (static_cast<ulonglong>(num_quantiles) != n_old_val_ && n_old_val_ > 0))
    {
      my_error(ER_INVALID_NTILE_ARGUMENT, MYF(0));
      return true;
    }
    n_old_val_= static_cast<ulonglong>(num_quantiles);
    null_value= false;
    ulonglong quantile_size = partition_row_count_ / num_quantiles;
    ulonglong extra_rows = partition_row_count_ - quantile_size * num_quantiles;

    /*
      Say there are n extra rows i.e. extra_rows == n, then each of
      these n rows is placed in the first n tiles, effectively
      incrementing the size of the first n tiles by 1.
    */
    if (current_row_count_ <= extra_rows * (quantile_size + 1))
      return (current_row_count_ - 1) / (quantile_size + 1) + 1;

    return (current_row_count_ - 1 - extra_rows) / quantile_size + 1;
  }

  bool add() override
  {
    current_row_count_++;
    return false;
  }

  enum Sumfunctype sum_func() const override
  {
    return NTILE_FUNC;
  }

  void clear() override
  {
    current_row_count_= 0;
    partition_row_count_= 0;
    n_old_val_= 0;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("ntile") };
    return name;
  }

  void update_field() override {}

  const Type_handler *type_handler() const override
  { return &type_handler_slonglong; }

  void reset_field() override { DBUG_ASSERT(0); }

  void set_partition_row_count(ulonglong count) override
  {
    Partition_row_count::set_partition_row_count(count);
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_ntile>(thd, this); }

 private:
  longlong get_num_quantiles() { return args[0]->val_int(); }
  ulonglong n_old_val_;
};

class Item_sum_percentile_disc : public Item_sum_num,
                                 public Type_handler_hybrid_field_type,
                                 public Partition_row_count,
                                 public Current_row_count
{
public:
  Item_sum_percentile_disc(THD *thd, Item* arg) : Item_sum_num(thd, arg),
                           Type_handler_hybrid_field_type(&type_handler_slonglong),
                           value(NULL), val_calculated(FALSE), first_call(TRUE),
                           prev_value(0), order_item(NULL){}

  double val_real() override
  {
    if (get_row_count() == 0 || get_arg(0)->is_null())
    {
      null_value= true;
      return 0;
    }
    null_value= false;
    return value->val_real();
  }

  longlong val_int() override
  {
    if (get_row_count() == 0 || get_arg(0)->is_null())
    {
      null_value= true;
      return 0;
    }
    null_value= false;
    return value->val_int();
  }

  my_decimal* val_decimal(my_decimal* dec) override
  {
    if (get_row_count() == 0 || get_arg(0)->is_null())
    {
      null_value= true;
      return 0;
    }
    null_value= false;
    return value->val_decimal(dec);
  }

  String* val_str(String *str) override
  {
    if (get_row_count() == 0 || get_arg(0)->is_null())
    {
      null_value= true;
      return 0;
    }
    null_value= false;
    return value->val_str(str);
  }

  bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override
  {
    if (get_row_count() == 0 || get_arg(0)->is_null())
    {
      null_value= true;
      return true;
    }
    null_value= false;
    return value->get_date(thd, ltime, fuzzydate);
  }

  bool val_native(THD *thd, Native *to) override
  {
    if (get_row_count() == 0 || get_arg(0)->is_null())
    {
      null_value= true;
      return true;
    }
    null_value= false;
    return value->val_native(thd, to);
  }

  bool add() override
  {
    Item *arg= get_arg(0);
    if (arg->is_null())
      return false;

    if (first_call)
    {
      prev_value= arg->val_real();
      if (prev_value > 1 || prev_value < 0)
      {
        my_error(ER_ARGUMENT_OUT_OF_RANGE, MYF(0), func_name());
        return true;
      }
      first_call= false;
    }

    double arg_val= arg->val_real();

    if (prev_value != arg_val)
    {
      my_error(ER_ARGUMENT_NOT_CONSTANT, MYF(0), func_name());
      return true;
    }

    if (val_calculated)
      return false;

    value->store(order_item);
    value->cache_value();
    if (value->null_value)
      return false;

    current_row_count_++;
    double val= calc_val_real(&null_value, current_row_count_);

    if (val >= prev_value && !val_calculated)
      val_calculated= true;
    return false;
  }

  enum Sumfunctype sum_func() const override
  {
    return PERCENTILE_DISC_FUNC;
  }

  void clear() override
  {
    val_calculated= false;
    first_call= true;
    value->clear();
    partition_row_count_= 0;
    current_row_count_= 0;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("percentile_disc") };
    return name;
  }

  void update_field() override {}
  const Type_handler *type_handler() const override
  {return Type_handler_hybrid_field_type::type_handler();}

  bool fix_length_and_dec(THD *thd) override
  {
    decimals = 10;  // TODO-cvicentiu find out how many decimals the standard
                    // requires.
    return FALSE;
  }

  void reset_field() override { DBUG_ASSERT(0); }

  void set_partition_row_count(ulonglong count) override
  {
    Partition_row_count::set_partition_row_count(count);
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_percentile_disc>(thd, this); }

public:
  void setup_window_func(THD *thd, Window_spec *window_spec) override;
  void setup_hybrid(THD *thd, Item *item);
  bool fix_fields(THD *thd, Item **ref) override;

private:
  Item_cache *value;
  bool val_calculated;
  bool first_call;
  double prev_value;
  Item *order_item;
};

class Item_sum_percentile_cont : public Item_sum_double,
                                 public Partition_row_count,
                                 public Current_row_count
{
public:
  Item_sum_percentile_cont(THD *thd, Item* arg) : Item_sum_double(thd, arg),
                           floor_value(NULL), ceil_value(NULL), first_call(TRUE),prev_value(0),
                           ceil_val_calculated(FALSE), floor_val_calculated(FALSE), order_item(NULL){}

  double val_real() override
  {
    if (get_row_count() == 0 || get_arg(0)->is_null())
    {
      null_value= true;
      return 0;
    }
    null_value= false;
    double val= 1 + prev_value * (get_row_count()-1);

    /*
      Applying the formula to get the value
      If (CRN = FRN = RN) then the result is (value of expression from row at RN)
      Otherwise the result is
      (CRN - RN) * (value of expression for row at FRN) +
      (RN - FRN) * (value of expression for row at CRN)
    */

    if(ceil(val) == floor(val))
      return floor_value->val_real();

    double ret_val=  ((val - floor(val)) * ceil_value->val_real()) +
                  ((ceil(val) - val) * floor_value->val_real());

    return ret_val;
  }

  bool add() override
  {
    Item *arg= get_arg(0);
    if (arg->is_null())
      return false;

    if (first_call)
    {
      first_call= false;
      prev_value= arg->val_real();
      if (prev_value > 1 || prev_value < 0)
      {
        my_error(ER_ARGUMENT_OUT_OF_RANGE, MYF(0), func_name());
        return true;
      }
    }

    double arg_val= arg->val_real();
    if (prev_value != arg_val)
    {
      my_error(ER_ARGUMENT_NOT_CONSTANT, MYF(0), func_name());
      return true;
    }

    if (!floor_val_calculated)
    {
      floor_value->store(order_item);
      floor_value->cache_value();
      if (floor_value->null_value)
        return false;
    }
    if (floor_val_calculated && !ceil_val_calculated)
    {
      ceil_value->store(order_item);
      ceil_value->cache_value();
      if (ceil_value->null_value)
        return false;
    }

    current_row_count_++;
    double val= 1 + prev_value * (get_row_count()-1);

    if (!floor_val_calculated && get_row_number() == floor(val))
      floor_val_calculated= true;

    if (!ceil_val_calculated && get_row_number() == ceil(val))
      ceil_val_calculated= true;
    return false;
  }

  enum Sumfunctype sum_func() const override
  {
    return PERCENTILE_CONT_FUNC;
  }

  void clear() override
  {
    first_call= true;
    floor_value->clear();
    ceil_value->clear();
    floor_val_calculated= false;
    ceil_val_calculated= false;
    partition_row_count_= 0;
    current_row_count_= 0;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("percentile_cont") };
    return name;
  }
  void update_field() override {}

  bool fix_length_and_dec(THD *thd) override
  {
    decimals = 10;  // TODO-cvicentiu find out how many decimals the standard
                    // requires.
    return FALSE;
  }

  void reset_field() override { DBUG_ASSERT(0); }

  void set_partition_row_count(ulonglong count) override
  {
    Partition_row_count::set_partition_row_count(count);
  }

protected:
  Item *shallow_copy(THD *thd) const override
  { return get_item_copy<Item_sum_percentile_cont>(thd, this); }

public:
  void setup_window_func(THD *thd, Window_spec *window_spec) override;
  void setup_hybrid(THD *thd, Item *item);
  bool fix_fields(THD *thd, Item **ref) override;

private:
  Item_cache *floor_value;
  Item_cache *ceil_value;
  bool first_call;
  double prev_value;
  bool ceil_val_calculated;
  bool floor_val_calculated;
  Item *order_item;
};




class Item_window_func : public Item_func_or_sum
{
  /* Window function parameters as we've got them from the parser */
public:
  LEX_CSTRING *window_name;
public:
  Window_spec *window_spec;
  
public:
  Item_window_func(THD *thd, Item_sum *win_func, LEX_CSTRING *win_name)
    : Item_func_or_sum(thd, (Item *) win_func),
      window_name(win_name), window_spec(NULL), 
      force_return_blank(true),
      read_value_from_result_field(false)
  {
    with_flags|= item_with_t::WINDOW_FUNC;
  }

  Item_window_func(THD *thd, Item_sum *win_func, Window_spec *win_spec)
    : Item_func_or_sum(thd, (Item *) win_func), 
      window_name(NULL), window_spec(win_spec), 
      force_return_blank(true),
      read_value_from_result_field(false)
  {
    with_flags|= item_with_t::WINDOW_FUNC;
  }

  Item_sum *window_func() const { return (Item_sum *) args[0]; }

  void update_used_tables() override;

  /*
    This is used by filesort to mark the columns it needs to read (because they
    participate in the sort criteria and/or row retrieval. Window functions can
    only be used in sort criteria).

    Sorting by window function value is only done after the window functions
    have been computed. In that case, window function will need to read its
    temp.table field. In order to allow that, mark that field in the read_set.
  */
  bool register_field_in_read_map(void *arg) override
  {
    TABLE *table= (TABLE*) arg;
    if (result_field && (result_field->table == table || !table))
    {
      bitmap_set_bit(result_field->table->read_set, result_field->field_index);
    }
    return 0;
  }

  bool is_frame_prohibited() const
  {
    switch (window_func()->sum_func()) {
    case Item_sum::ROW_NUMBER_FUNC:
    case Item_sum::RANK_FUNC:
    case Item_sum::DENSE_RANK_FUNC:
    case Item_sum::PERCENT_RANK_FUNC:
    case Item_sum::CUME_DIST_FUNC:
    case Item_sum::NTILE_FUNC:
    case Item_sum::PERCENTILE_CONT_FUNC:
    case Item_sum::PERCENTILE_DISC_FUNC:
      return true;
    default: 
      return false;
    }
  }

  bool requires_special_cursors() const
  {
    switch (window_func()->sum_func()) {
    case Item_sum::FIRST_VALUE_FUNC:
    case Item_sum::LAST_VALUE_FUNC:
    case Item_sum::NTH_VALUE_FUNC:
    case Item_sum::LAG_FUNC:
    case Item_sum::LEAD_FUNC:
      return true;
    default:
      return false;
    }
  }

  bool requires_partition_size() const
  {
    switch (window_func()->sum_func()) {
    case Item_sum::PERCENT_RANK_FUNC:
    case Item_sum::CUME_DIST_FUNC:
    case Item_sum::NTILE_FUNC:
    case Item_sum::PERCENTILE_CONT_FUNC:
    case Item_sum::PERCENTILE_DISC_FUNC:
      return true;
    default:
      return false;
    }
  }

  bool requires_peer_size() const
  {
    switch (window_func()->sum_func()) {
    case Item_sum::CUME_DIST_FUNC:
      return true;
    default:
      return false;
    }
  }

  bool is_order_list_mandatory() const
  {
    switch (window_func()->sum_func()) {
    case Item_sum::RANK_FUNC:
    case Item_sum::DENSE_RANK_FUNC:
    case Item_sum::PERCENT_RANK_FUNC:
    case Item_sum::CUME_DIST_FUNC:
    case Item_sum::LAG_FUNC:
    case Item_sum::LEAD_FUNC:
    case Item_sum::PERCENTILE_CONT_FUNC:
    case Item_sum::PERCENTILE_DISC_FUNC:
      return true;
    default: 
      return false;
    }
  }  

  bool only_single_element_order_list() const
  {
    switch (window_func()->sum_func()){
    case Item_sum::PERCENTILE_CONT_FUNC:
    case Item_sum::PERCENTILE_DISC_FUNC:
      return true;
    default:
      return false;
    }
  }

  bool check_result_type_of_order_item();



  /*
    Computation functions.
    TODO: consoder merging these with class Group_bound_tracker.
  */
  void setup_partition_border_check(THD *thd);

  const Type_handler *type_handler() const override
  {
    return ((Item_sum *) args[0])->type_handler();
  }
  enum Item::Type type() const override { return Item::WINDOW_FUNC_ITEM; }

private:
  /* 
    Window functions are very special functions, so val_() methods have
    special meaning for them:

    - Phase#1, "Initial" we run the join and put its result into temporary 
      table. For window functions, we write the default value (NULL?) as 
      a placeholder.
      
    - Phase#2: "Computation": executor does the scan in {PARTITION, ORDER BY} 
      order of this window function. It calls appropriate methods to inform 
      the window function about rows entering/leaving the window. 
      It calls window_func()->val_int() so that current window function value
      can be saved and stored in the temp.table.

    - Phase#3: "Retrieval" the temporary table is read and passed to query 
      output. However, Item_window_func still remains in the select list,
      so item_windowfunc->val_int() will be called.
      During Phase#3, read_value_from_result_field= true.
  */
  bool force_return_blank;
  bool read_value_from_result_field;
  void print_for_percentile_functions(String *str, enum_query_type query_type);

public:
  void set_phase_to_initial()
  {
    force_return_blank= true;
    read_value_from_result_field= false;
  }
  void set_phase_to_computation()
  {
    force_return_blank= false;
    read_value_from_result_field= false;
  }
  void set_phase_to_retrieval()
  {
    force_return_blank= false;
    read_value_from_result_field= true;
  }

  bool is_null() override
  {
    if (force_return_blank)
      return true;

    if (read_value_from_result_field)
      return result_field->is_null();

    return window_func()->is_null();
  }

  double val_real() override 
  {
    double res;
    if (force_return_blank)
    {
      res= 0.0;
      null_value= true;
    }
    else if (read_value_from_result_field)
    {
      res= result_field->val_real();
      null_value= result_field->is_null();
    }
    else
    {
      res= window_func()->val_real();
      null_value= window_func()->null_value;
    }
    return res;
  }

  longlong val_int() override
  {
    longlong res;
    if (force_return_blank)
    {
      res= 0;
      null_value= true;
    }
    else if (read_value_from_result_field)
    {
      res= result_field->val_int();
      null_value= result_field->is_null();
    }
    else
    {
      res= window_func()->val_int();
      null_value= window_func()->null_value;
    }
    return res;
  }

  String* val_str(String* str) override
  {
    String *res;
    if (force_return_blank)
    {
      null_value= true;
      res= NULL;
    }
    else if (read_value_from_result_field)
    {
      if ((null_value= result_field->is_null()))
        res= NULL;
      else
        res= result_field->val_str(str);
    }
    else
    {
      res= window_func()->val_str(str);
      null_value= window_func()->null_value;
    }
    return res;
  }

  bool val_native(THD *thd, Native *to) override
  {
    if (force_return_blank)
      return null_value= true;
    if (read_value_from_result_field)
      return val_native_from_field(result_field, to);
    return val_native_from_item(thd, window_func(), to);
  }

  my_decimal* val_decimal(my_decimal* dec) override
  {
    my_decimal *res;
    if (force_return_blank)
    {
      null_value= true;
      res= NULL;
    }
    else if (read_value_from_result_field)
    {
      if ((null_value= result_field->is_null()))
        res= NULL;
      else
        res= result_field->val_decimal(dec);
    }
    else
    {
      res= window_func()->val_decimal(dec);
      null_value= window_func()->null_value;
    }
    return res;
  }

  bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override
  {
    bool res;
    if (force_return_blank)
    {
      null_value= true;
      res= true;
    }
    else if (read_value_from_result_field)
    {
      if ((null_value= result_field->is_null()))
        res= true;
      else
        res= result_field->get_date(ltime, fuzzydate);
    }
    else
    {
      res= window_func()->get_date(thd, ltime, fuzzydate);
      null_value= window_func()->null_value;
    }
    return res;
  }

  void split_sum_func(THD *thd, Ref_ptr_array ref_pointer_array,
                              List<Item> &fields, uint flags) override;

  bool fix_length_and_dec(THD *thd) override
  {
    Type_std_attributes::set(window_func());
    return FALSE;
  }

  LEX_CSTRING func_name_cstring() const override
  {
    static LEX_CSTRING name= {STRING_WITH_LEN("WF") };
    return name;
  }

  bool fix_fields(THD *thd, Item **ref) override;

  bool resolve_window_name(THD *thd);
  
  void print(String *str, enum_query_type query_type) override;

protected:
  Item *shallow_copy(THD *thd) const override { return nullptr; }
};

#endif /* ITEM_WINDOWFUNC_INCLUDED */

Current_dir [ 𝗡𝗢𝗧 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ] Document_root [ 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ]

Current_dir [ 𝗡𝗢𝗧 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ] Document_root [ 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ]


[ Back ]
𝗡𝗔𝗠𝗘
𝗦𝗜𝗭𝗘
𝗟𝗔𝗦𝗧 𝗧𝗢𝗨𝗖𝗛
𝗨𝗦𝗘𝗥
𝗦𝗧𝗔𝗧𝗨𝗦
𝗙𝗨𝗡𝗖𝗧𝗜𝗢𝗡𝗦
..
--
22 Aug 2026 4.57 AM
root / root
0755
atomic
--
22 Aug 2026 4.57 AM
root / root
0755
data
--
19 Aug 2026 9.46 AM
root / root
0755
providers
--
22 Aug 2026 4.57 AM
root / root
0755
aligned.h
1.109 KB
19 Aug 2026 6.22 AM
root / root
0644
aria_backup.h
1.745 KB
19 Aug 2026 6.22 AM
root / root
0644
assume_aligned.h
2.295 KB
19 Aug 2026 6.22 AM
root / root
0644
authors.h
9.955 KB
19 Aug 2026 6.22 AM
root / root
0644
backup.h
1.663 KB
19 Aug 2026 6.22 AM
root / root
0644
bounded_queue.h
5.95 KB
19 Aug 2026 6.22 AM
root / root
0644
client_settings.h
1.89 KB
19 Aug 2026 6.22 AM
root / root
0644
compat56.h
2.227 KB
19 Aug 2026 6.22 AM
root / root
0644
config.h
14.006 KB
19 Aug 2026 9.01 AM
root / root
0644
contributors.h
4.815 KB
19 Aug 2026 6.22 AM
root / root
0644
create_options.h
4.095 KB
19 Aug 2026 6.22 AM
root / root
0644
create_tmp_table.h
2.742 KB
19 Aug 2026 6.22 AM
root / root
0644
cset_narrowing.h
3.875 KB
19 Aug 2026 6.22 AM
root / root
0644
custom_conf.h
1.057 KB
19 Aug 2026 6.22 AM
root / root
0644
datadict.h
1.66 KB
19 Aug 2026 6.22 AM
root / root
0644
ddl_log.h
12.507 KB
19 Aug 2026 6.22 AM
root / root
0644
debug.h
1.205 KB
19 Aug 2026 6.22 AM
root / root
0644
debug_sync.h
1.998 KB
19 Aug 2026 6.22 AM
root / root
0644
derived_handler.h
2.323 KB
19 Aug 2026 6.22 AM
root / root
0644
derror.h
0.957 KB
19 Aug 2026 6.22 AM
root / root
0644
des_key_file.h
1.207 KB
19 Aug 2026 6.22 AM
root / root
0644
discover.h
1.533 KB
19 Aug 2026 6.22 AM
root / root
0644
dur_prop.h
1.057 KB
19 Aug 2026 6.22 AM
root / root
0644
embedded_priv.h
1.692 KB
19 Aug 2026 6.22 AM
root / root
0644
event_data_objects.h
4.089 KB
19 Aug 2026 6.22 AM
root / root
0644
event_db_repository.h
3.563 KB
19 Aug 2026 6.22 AM
root / root
0644
event_parse_data.h
2.831 KB
19 Aug 2026 6.22 AM
root / root
0644
event_queue.h
3.357 KB
19 Aug 2026 6.22 AM
root / root
0644
event_scheduler.h
3.213 KB
19 Aug 2026 6.22 AM
root / root
0644
events.h
4.594 KB
19 Aug 2026 6.22 AM
root / root
0644
field.h
217.201 KB
19 Aug 2026 6.22 AM
root / root
0644
field_comp.h
1.146 KB
19 Aug 2026 6.22 AM
root / root
0644
filesort.h
7.112 KB
19 Aug 2026 6.22 AM
root / root
0644
filesort_utils.h
8.003 KB
19 Aug 2026 6.22 AM
root / root
0644
ft_global.h
3.04 KB
19 Aug 2026 6.22 AM
root / root
0644
gcalc_slicescan.h
16.924 KB
19 Aug 2026 6.22 AM
root / root
0644
gcalc_tools.h
11.621 KB
19 Aug 2026 6.22 AM
root / root
0644
grant.h
2.693 KB
19 Aug 2026 6.22 AM
root / root
0644
group_by_handler.h
3.451 KB
19 Aug 2026 6.22 AM
root / root
0644
gstream.h
2.38 KB
19 Aug 2026 6.22 AM
root / root
0644
ha_handler_stats.h
2.28 KB
19 Aug 2026 6.22 AM
root / root
0644
ha_partition.h
63.18 KB
19 Aug 2026 6.22 AM
root / root
0644
ha_sequence.h
6.099 KB
19 Aug 2026 6.22 AM
root / root
0644
handle_connections_win.h
0.863 KB
19 Aug 2026 6.22 AM
root / root
0644
handler.h
195.173 KB
19 Aug 2026 6.22 AM
root / root
0644
hash.h
4.348 KB
19 Aug 2026 6.22 AM
root / root
0644
hash_filo.h
5.468 KB
19 Aug 2026 6.22 AM
root / root
0644
heap.h
9.265 KB
19 Aug 2026 6.22 AM
root / root
0644
hostname.h
5.292 KB
19 Aug 2026 6.22 AM
root / root
0644
ilist.h
7.067 KB
19 Aug 2026 6.22 AM
root / root
0644
init.h
0.832 KB
19 Aug 2026 6.22 AM
root / root
0644
innodb_priv.h
1.288 KB
19 Aug 2026 6.22 AM
root / root
0644
item.h
278.768 KB
19 Aug 2026 6.22 AM
root / root
0644
item_cmpfunc.h
132.049 KB
19 Aug 2026 6.22 AM
root / root
0644
item_create.h
11.238 KB
19 Aug 2026 6.22 AM
root / root
0644
item_func.h
135.433 KB
19 Aug 2026 6.22 AM
root / root
0644
item_geofunc.h
38.684 KB
19 Aug 2026 6.22 AM
root / root
0644
item_jsonfunc.h
24.833 KB
19 Aug 2026 6.22 AM
root / root
0644
item_row.h
5.106 KB
19 Aug 2026 6.22 AM
root / root
0644
item_strfunc.h
73.501 KB
19 Aug 2026 6.22 AM
root / root
0644
item_subselect.h
57.702 KB
19 Aug 2026 6.22 AM
root / root
0644
item_sum.h
70.991 KB
19 Aug 2026 6.22 AM
root / root
0644
item_timefunc.h
64.352 KB
19 Aug 2026 6.22 AM
root / root
0644
item_vers.h
4.31 KB
19 Aug 2026 6.22 AM
root / root
0644
item_windowfunc.h
34.267 KB
19 Aug 2026 6.22 AM
root / root
0644
item_xmlfunc.h
4.541 KB
19 Aug 2026 6.22 AM
root / root
0644
json_table.h
9.44 KB
19 Aug 2026 6.22 AM
root / root
0644
key.h
2.082 KB
19 Aug 2026 6.22 AM
root / root
0644
keycaches.h
1.948 KB
19 Aug 2026 6.22 AM
root / root
0644
lex.h
29.141 KB
19 Aug 2026 6.22 AM
root / root
0644
lex_charset.h
23.743 KB
19 Aug 2026 6.22 AM
root / root
0644
lex_hash.h
139.754 KB
19 Aug 2026 9.10 AM
root / root
0644
lex_ident.h
2.072 KB
19 Aug 2026 6.22 AM
root / root
0644
lex_string.h
3.981 KB
19 Aug 2026 6.22 AM
root / root
0644
lex_symbol.h
1.292 KB
19 Aug 2026 6.22 AM
root / root
0644
lex_token.h
41.642 KB
19 Aug 2026 9.10 AM
root / root
0644
lf.h
6.311 KB
19 Aug 2026 6.22 AM
root / root
0644
lock.h
2.168 KB
19 Aug 2026 6.22 AM
root / root
0644
log.h
45.373 KB
19 Aug 2026 6.22 AM
root / root
0644
log_event.h
185.026 KB
19 Aug 2026 6.22 AM
root / root
0644
log_event_data_type.h
1.846 KB
19 Aug 2026 6.22 AM
root / root
0644
log_event_old.h
19.365 KB
19 Aug 2026 6.22 AM
root / root
0644
log_slow.h
2.385 KB
19 Aug 2026 6.22 AM
root / root
0644
maria.h
5.734 KB
19 Aug 2026 6.22 AM
root / root
0644
mariadb.h
1.247 KB
19 Aug 2026 6.22 AM
root / root
0644
mdl.h
37.981 KB
19 Aug 2026 6.22 AM
root / root
0644
mem_root_array.h
6.939 KB
19 Aug 2026 6.22 AM
root / root
0644
message.h
1.167 KB
19 Aug 2026 6.22 AM
root / root
0644
multi_range_read.h
22.636 KB
19 Aug 2026 6.22 AM
root / root
0644
my_alarm.h
2.372 KB
19 Aug 2026 6.22 AM
root / root
0644
my_apc.h
4.636 KB
19 Aug 2026 6.22 AM
root / root
0644
my_atomic.h
7.11 KB
19 Aug 2026 6.22 AM
root / root
0644
my_atomic_wrapper.h
2.979 KB
19 Aug 2026 6.22 AM
root / root
0644
my_base.h
27.1 KB
19 Aug 2026 6.22 AM
root / root
0644
my_bit.h
6.051 KB
19 Aug 2026 6.22 AM
root / root
0644
my_bitmap.h
5.373 KB
19 Aug 2026 6.22 AM
root / root
0644
my_check_opt.h
2.557 KB
19 Aug 2026 6.22 AM
root / root
0644
my_compare.h
10.932 KB
19 Aug 2026 6.22 AM
root / root
0644
my_counter.h
1.681 KB
19 Aug 2026 6.22 AM
root / root
0644
my_cpu.h
4.771 KB
19 Aug 2026 6.22 AM
root / root
0644
my_crypt.h
0.883 KB
19 Aug 2026 6.22 AM
root / root
0644
my_decimal.h
14.164 KB
19 Aug 2026 6.22 AM
root / root
0644
my_default.h
1.836 KB
19 Aug 2026 6.22 AM
root / root
0644
my_handler_errors.h
4.768 KB
19 Aug 2026 6.22 AM
root / root
0644
my_json_writer.h
18.268 KB
19 Aug 2026 6.22 AM
root / root
0644
my_libwrap.h
1.155 KB
19 Aug 2026 6.22 AM
root / root
0644
my_md5.h
1.451 KB
19 Aug 2026 6.22 AM
root / root
0644
my_minidump.h
0.828 KB
19 Aug 2026 6.22 AM
root / root
0644
my_nosys.h
1.404 KB
19 Aug 2026 6.22 AM
root / root
0644
my_rdtsc.h
9.882 KB
19 Aug 2026 6.22 AM
root / root
0644
my_rnd.h
0.99 KB
19 Aug 2026 6.22 AM
root / root
0644
my_service_manager.h
2.038 KB
19 Aug 2026 6.22 AM
root / root
0644
my_stack_alloc.h
6.341 KB
19 Aug 2026 6.22 AM
root / root
0644
my_stacktrace.h
3.14 KB
19 Aug 2026 6.22 AM
root / root
0644
my_time.h
10.17 KB
19 Aug 2026 6.22 AM
root / root
0644
my_tree.h
3.897 KB
19 Aug 2026 6.22 AM
root / root
0644
my_uctype.h
67.898 KB
19 Aug 2026 6.22 AM
root / root
0644
my_user.h
1.1 KB
19 Aug 2026 6.22 AM
root / root
0644
my_virtual_mem.h
1.226 KB
19 Aug 2026 6.22 AM
root / root
0644
myisam.h
17.096 KB
19 Aug 2026 6.22 AM
root / root
0644
myisamchk.h
4.623 KB
19 Aug 2026 6.22 AM
root / root
0644
myisammrg.h
4.782 KB
19 Aug 2026 6.22 AM
root / root
0644
myisampack.h
14.579 KB
19 Aug 2026 6.22 AM
root / root
0644
mysqld.h
40.259 KB
19 Aug 2026 6.22 AM
root / root
0644
mysqld_default_groups.h
0.199 KB
19 Aug 2026 6.22 AM
root / root
0644
mysqld_suffix.h
1.173 KB
19 Aug 2026 6.22 AM
root / root
0644
mysys_err.h
2.951 KB
19 Aug 2026 6.22 AM
root / root
0644
opt_histogram_json.h
4.529 KB
19 Aug 2026 6.22 AM
root / root
0644
opt_range.h
64.358 KB
19 Aug 2026 6.22 AM
root / root
0644
opt_subselect.h
14.204 KB
19 Aug 2026 6.22 AM
root / root
0644
opt_trace.h
9.282 KB
19 Aug 2026 6.22 AM
root / root
0644
opt_trace_context.h
3.214 KB
19 Aug 2026 6.22 AM
root / root
0644
parse_file.h
4.32 KB
19 Aug 2026 6.22 AM
root / root
0644
partition_element.h
5.301 KB
19 Aug 2026 6.22 AM
root / root
0644
partition_info.h
19.398 KB
19 Aug 2026 6.22 AM
root / root
0644
password.h
1.583 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_file_provider.h
3.079 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_idle_provider.h
1.353 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_memory_provider.h
1.588 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_metadata_provider.h
1.854 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_socket_provider.h
2.205 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_stage_provider.h
1.52 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_statement_provider.h
4.245 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_table_provider.h
2.563 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_thread_provider.h
5.43 KB
19 Aug 2026 6.22 AM
root / root
0644
pfs_transaction_provider.h
2.779 KB
19 Aug 2026 6.22 AM
root / root
0644
privilege.h
28.177 KB
19 Aug 2026 6.22 AM
root / root
0644
probes_mysql.h
0.95 KB
19 Aug 2026 6.22 AM
root / root
0644
probes_mysql_nodtrace.h
5.944 KB
19 Aug 2026 9.00 AM
root / root
0644
procedure.h
6.659 KB
19 Aug 2026 6.22 AM
root / root
0644
protocol.h
12.243 KB
19 Aug 2026 6.22 AM
root / root
0644
proxy_protocol.h
0.535 KB
19 Aug 2026 6.22 AM
root / root
0644
queues.h
3.396 KB
19 Aug 2026 6.22 AM
root / root
0644
records.h
3.073 KB
19 Aug 2026 6.22 AM
root / root
0644
repl_failsafe.h
1.548 KB
19 Aug 2026 6.22 AM
root / root
0644
replication.h
15.752 KB
19 Aug 2026 6.22 AM
root / root
0644
rijndael.h
1.671 KB
19 Aug 2026 6.22 AM
root / root
0644
rowid_filter.h
15.111 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_constants.h
3.278 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_filter.h
4.662 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_gtid.h
29.282 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_injector.h
9.396 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_mi.h
16.246 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_parallel.h
17.801 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_record.h
1.548 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_record_old.h
1.374 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_reporting.h
3.626 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_rli.h
35.225 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_tblmap.h
3.103 KB
19 Aug 2026 6.22 AM
root / root
0644
rpl_utility.h
9.57 KB
19 Aug 2026 6.22 AM
root / root
0644
scheduler.h
3.124 KB
19 Aug 2026 6.22 AM
root / root
0644
scope.h
4.29 KB
19 Aug 2026 6.22 AM
root / root
0644
select_handler.h
2.176 KB
19 Aug 2026 6.22 AM
root / root
0644
semisync.h
2.233 KB
19 Aug 2026 6.22 AM
root / root
0644
semisync_master.h
25.16 KB
19 Aug 2026 6.22 AM
root / root
0644
semisync_master_ack_receiver.h
8.505 KB
19 Aug 2026 6.22 AM
root / root
0644
semisync_slave.h
3.648 KB
19 Aug 2026 6.22 AM
root / root
0644
service_versions.h
2.231 KB
19 Aug 2026 6.22 AM
root / root
0644
session_tracker.h
13.94 KB
19 Aug 2026 6.22 AM
root / root
0644
set_var.h
16.925 KB
19 Aug 2026 6.22 AM
root / root
0644
slave.h
12.102 KB
19 Aug 2026 6.22 AM
root / root
0644
socketpair.h
0.822 KB
19 Aug 2026 6.22 AM
root / root
0644
source_revision.h
0.065 KB
19 Aug 2026 6.22 AM
root / root
0644
sp.h
22.059 KB
19 Aug 2026 6.22 AM
root / root
0644
sp_cache.h
1.989 KB
19 Aug 2026 6.22 AM
root / root
0644
sp_head.h
63.396 KB
19 Aug 2026 6.22 AM
root / root
0644
sp_pcontext.h
24.831 KB
19 Aug 2026 6.22 AM
root / root
0644
sp_rcontext.h
14.103 KB
19 Aug 2026 6.22 AM
root / root
0644
span.h
3.839 KB
19 Aug 2026 6.22 AM
root / root
0644
spatial.h
22.166 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_acl.h
13.835 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_admin.h
2.847 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_alloc.h
1.691 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_alter.h
15.034 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_analyse.h
10.793 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_analyze_stmt.h
12.386 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_array.h
6.697 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_audit.h
13.83 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_base.h
25.439 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_basic_types.h
9.3 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_binlog.h
0.874 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_bitmap.h
7.658 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_bootstrap.h
1.77 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_cache.h
21.168 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_callback.h
1.506 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_class.h
265.465 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_cmd.h
5.822 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_command.h
4.688 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_connect.h
3.991 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_const.h
11.357 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_crypt.h
1.403 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_cte.h
16.107 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_cursor.h
4.324 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_db.h
2.381 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_debug.h
5.593 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_delete.h
1.312 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_derived.h
1.259 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_digest.h
3.729 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_digest_stream.h
1.53 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_do.h
0.932 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_error.h
38.909 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_explain.h
29.608 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_expression_cache.h
4.257 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_get_diagnostics.h
7.698 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_handler.h
2.842 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_help.h
0.972 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_hset.h
3.321 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_i_s.h
8.288 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_insert.h
5.052 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_join_cache.h
47.519 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_lex.h
170.831 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_lifo_buffer.h
9.458 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_limit.h
3.112 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_list.h
21.866 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_load.h
1.246 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_locale.h
2.638 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_manager.h
0.938 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_mode.h
6.577 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_parse.h
8.76 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_partition.h
12.377 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_partition_admin.h
5.801 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_plist.h
7.53 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_plugin.h
7.399 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_plugin_compat.h
2.185 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_prepare.h
11.142 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_priv.h
18.094 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_profile.h
7.633 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_reload.h
1.012 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_rename.h
0.959 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_repl.h
2.974 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_schema.h
3.226 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_select.h
87.64 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_sequence.h
5.056 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_servers.h
1.735 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_show.h
9.589 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_signal.h
3.283 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_sort.h
21.449 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_statistics.h
16.117 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_string.h
38.095 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_table.h
9.582 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_test.h
2.603 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_time.h
8.306 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_trigger.h
12.043 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_truncate.h
2.03 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_tvc.h
2.361 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_type.h
290.305 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_type_fixedbin.h
64.041 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_type_fixedbin_storage.h
5.339 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_type_geom.h
18.593 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_type_int.h
9.767 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_type_json.h
6.011 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_type_real.h
1.228 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_type_string.h
1.591 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_udf.h
4.736 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_union.h
1.043 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_update.h
1.878 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_view.h
2.412 KB
19 Aug 2026 6.22 AM
root / root
0644
sql_window.h
6.654 KB
19 Aug 2026 6.22 AM
root / root
0644
ssl_compat.h
3.301 KB
19 Aug 2026 6.22 AM
root / root
0644
strfunc.h
2.489 KB
19 Aug 2026 6.22 AM
root / root
0644
structs.h
28.767 KB
19 Aug 2026 6.22 AM
root / root
0644
sys_vars_shared.h
2.665 KB
19 Aug 2026 6.22 AM
root / root
0644
t_ctype.h
5.507 KB
19 Aug 2026 6.22 AM
root / root
0644
table.h
116.22 KB
19 Aug 2026 6.22 AM
root / root
0644
table_cache.h
4.133 KB
19 Aug 2026 6.22 AM
root / root
0644
thr_alarm.h
2.863 KB
19 Aug 2026 6.22 AM
root / root
0644
thr_lock.h
7.178 KB
19 Aug 2026 6.22 AM
root / root
0644
thr_malloc.h
1.174 KB
19 Aug 2026 6.22 AM
root / root
0644
thr_timer.h
1.526 KB
19 Aug 2026 6.22 AM
root / root
0644
thread_cache.h
5.767 KB
19 Aug 2026 6.22 AM
root / root
0644
threadpool.h
4.697 KB
19 Aug 2026 6.22 AM
root / root
0644
threadpool_generic.h
3.876 KB
19 Aug 2026 6.22 AM
root / root
0644
threadpool_winsockets.h
2.236 KB
19 Aug 2026 6.22 AM
root / root
0644
transaction.h
1.432 KB
19 Aug 2026 6.22 AM
root / root
0644
tzfile.h
4.896 KB
19 Aug 2026 6.22 AM
root / root
0644
tztime.h
3.317 KB
19 Aug 2026 6.22 AM
root / root
0644
uniques.h
4.118 KB
19 Aug 2026 6.22 AM
root / root
0644
unireg.h
7.541 KB
19 Aug 2026 6.22 AM
root / root
0644
vers_string.h
2.483 KB
19 Aug 2026 6.22 AM
root / root
0644
violite.h
9.723 KB
19 Aug 2026 6.22 AM
root / root
0644
waiting_threads.h
4.426 KB
19 Aug 2026 6.22 AM
root / root
0644
welcome_copyright_notice.h
1.189 KB
19 Aug 2026 6.22 AM
root / root
0644
win_tzname_data.h
6.354 KB
19 Aug 2026 6.22 AM
root / root
0644
winservice.h
5.878 KB
19 Aug 2026 6.22 AM
root / root
0644
wqueue.h
1.528 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep.h
3.23 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_allowlist_service.h
1.011 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_applier.h
2.64 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_binlog.h
3.468 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_client_service.h
2.541 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_client_state.h
1.529 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_condition_variable.h
1.449 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_high_priority_service.h
4.797 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_mutex.h
1.21 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_mysqld.h
21.49 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_mysqld_c.h
1.198 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_on.h
1.678 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_priv.h
1.596 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_schema.h
5.748 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_server_service.h
3.546 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_server_state.h
2.47 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_sst.h
3.858 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_status.h
1.773 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_storage_service.h
1.767 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_thd.h
11.218 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_trans_observer.h
17.748 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_types.h
1.084 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_utils.h
10.011 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_var.h
4.504 KB
19 Aug 2026 6.22 AM
root / root
0644
wsrep_xid.h
1.474 KB
19 Aug 2026 6.22 AM
root / root
0644
xa.h
1.802 KB
19 Aug 2026 6.22 AM
root / root
0644

✘✘ GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME ✘✘
Static GIF Static GIF