16 #ifndef OPT_TRACE_INCLUDED 
   17 #define OPT_TRACE_INCLUDED 
   19 #include "my_config.h"   
   20 #include "sql_array.h"   
   45 #ifdef OPTIMIZER_TRACE 
  366 class Opt_trace_struct;
 
  367 class Opt_trace_stmt;           
 
  373 struct Opt_trace_info
 
  385   const char *trace_ptr;
 
  388   const char *query_ptr;
 
  395   size_t missing_bytes;
 
  405 class Opt_trace_iterator
 
  424   void get_value(Opt_trace_info *info) 
const;
 
  427   bool at_end()
 const { 
return cursor == NULL; }
 
  432   const Opt_trace_stmt *
cursor; 
 
  446 class Opt_trace_struct
 
  468     if (unlikely(ctx_arg->is_started()))
 
  471       do_construct(ctx_arg, requires_key_arg, key, feature);
 
  478   ~Opt_trace_struct() { 
if (unlikely(started)) do_destruct(); }
 
  487   void end() { 
if (unlikely(started)) do_destruct(); }
 
  521   Opt_trace_struct& add_alnum(
const char *key, 
const char *value)
 
  523     if (likely(!started))
 
  525     return do_add(key, value, strlen(value), 
false);
 
  534   Opt_trace_struct& add_alnum(
const char *value)
 
  536     if (likely(!started))
 
  538     return do_add(NULL, value, strlen(value), 
false);
 
  548   Opt_trace_struct& add_utf8(
const char *key,
 
  549                              const char *value, 
size_t val_length)
 
  551     if (likely(!started))
 
  553     return do_add(key, value, val_length, 
true);
 
  557   Opt_trace_struct& add_utf8(
const char *value, 
size_t val_length)
 
  559     if (likely(!started))
 
  561     return do_add(NULL, value, val_length, 
true);
 
  565   Opt_trace_struct& add_utf8(
const char *key, 
const char *value)
 
  567     if (likely(!started))
 
  569     return do_add(key, value, strlen(value), 
true);
 
  573   Opt_trace_struct& add_utf8(
const char *value)
 
  575     if (likely(!started))
 
  577     return do_add(NULL, value, strlen(value), 
true);
 
  589   Opt_trace_struct& add(
const char *key, 
Item *item)
 
  591     if (likely(!started))
 
  593     return do_add(key, item);
 
  595   Opt_trace_struct& add(
Item *item)
 
  597     if (likely(!started))
 
  599     return do_add(NULL, item);
 
  602   Opt_trace_struct& add(
const char *key, 
bool value)
 
  604     if (likely(!started))
 
  606     return do_add(key, value);
 
  608   Opt_trace_struct& add(
bool value)
 
  610     if (likely(!started))
 
  612     return do_add(NULL, value);
 
  614   Opt_trace_struct& add(
const char *key, 
int value)
 
  616     if (likely(!started))
 
  618     return do_add(key, static_cast<longlong>(value));
 
  620   Opt_trace_struct& add(
int value)
 
  622     if (likely(!started))
 
  624     return do_add(NULL, static_cast<longlong>(value));
 
  626   Opt_trace_struct& add(
const char *key, uint value)
 
  628     if (likely(!started))
 
  630     return do_add(key, static_cast<ulonglong>(value));
 
  632   Opt_trace_struct& add(uint value)
 
  634     if (likely(!started))
 
  636     return do_add(NULL, static_cast<ulonglong>(value));
 
  638   Opt_trace_struct& add(
const char *key, ulong value)
 
  640     if (likely(!started))
 
  642     return do_add(key, static_cast<ulonglong>(value));
 
  644   Opt_trace_struct& add(ulong value)
 
  646     if (likely(!started))
 
  648     return do_add(NULL, static_cast<ulonglong>(value));
 
  650   Opt_trace_struct& add(
const char *key, longlong value)
 
  652     if (likely(!started))
 
  654     return do_add(key, value);
 
  656   Opt_trace_struct& add(longlong value)
 
  658     if (likely(!started))
 
  660     return do_add(NULL, value);
 
  662   Opt_trace_struct& add(
const char *key, ulonglong value)
 
  664     if (likely(!started))
 
  666     return do_add(key, value);
 
  668   Opt_trace_struct& add(ulonglong value)
 
  670     if (likely(!started))
 
  672     return do_add(NULL, value);
 
  674   Opt_trace_struct& add(
const char *key, 
double value)
 
  676     if (likely(!started))
 
  678     return do_add(key, value);
 
  680   Opt_trace_struct& add(
double value)
 
  682     if (likely(!started))
 
  684     return do_add(NULL, value);
 
  687   Opt_trace_struct& add_hex(
const char *key, uint64 value)
 
  689     if (likely(!started))
 
  691     return do_add_hex(key, value);
 
  693   Opt_trace_struct& add_hex(uint64 value)
 
  695     if (likely(!started))
 
  697     return do_add_hex(NULL, value);
 
  700   Opt_trace_struct& add_null(
const char *key)
 
  702     if (likely(!started))
 
  704     return do_add_null(key);
 
  710   Opt_trace_struct& add_utf8_table(
const TABLE *tab)
 
  712     if (likely(!started))
 
  714     return do_add_utf8_table(tab);
 
  720   Opt_trace_struct& add_select_number(uint select_number)
 
  722     return unlikely(select_number >= INT_MAX) ?
 
  724       add_alnum(
"select#", 
"fake") :
 
  725       add(
"select#", select_number);
 
  737     const bool old_empty= empty;
 
  774   const char *check_key(
const char *key);
 
  778   Opt_trace_struct& add(
const char *key, 
const char* value);
 
  779   Opt_trace_struct& add(
const char *key);
 
  783                     bool requires_key, 
const char *key,
 
  793   Opt_trace_struct& do_add(
const char *key, 
const char *value,
 
  794                            size_t val_length, 
bool escape);
 
  795   Opt_trace_struct& do_add(
const char *key, 
Item *item);
 
  796   Opt_trace_struct& do_add(
const char *key, 
bool value);
 
  797   Opt_trace_struct& do_add(
const char *key, longlong value);
 
  798   Opt_trace_struct& do_add(
const char *key, ulonglong value);
 
  799   Opt_trace_struct& do_add(
const char *key, 
double value);
 
  800   Opt_trace_struct& do_add_hex(
const char *key, uint64 value);
 
  801   Opt_trace_struct& do_add_null(
const char *key);
 
  802   Opt_trace_struct& do_add_utf8_table(
const TABLE *tab);
 
  804   Opt_trace_struct(
const Opt_trace_struct&);            
 
  805   Opt_trace_struct& operator=(
const Opt_trace_struct&); 
 
  828   bool has_disabled_I_S;
 
  830   Opt_trace_stmt *stmt;                        
 
  832   const char *saved_key;
 
  839   char previous_key[25];
 
  861                    Opt_trace_context::MISC)
 
  862     : Opt_trace_struct(ctx, true, key, feature)
 
  872                    Opt_trace_context::MISC)
 
  873     : Opt_trace_struct(ctx, true, NULL, feature)
 
  895                   Opt_trace_context::MISC)
 
  896     : Opt_trace_struct(ctx, false, key, feature)
 
  906                   Opt_trace_context::MISC)
 
  907     : Opt_trace_struct(ctx, false, NULL, feature)
 
  958       ctx->disable_I_S_for_this_and_children();
 
 1012                   enum enum_sql_command sql_command,
 
 1014                   const char *
query, 
size_t query_length,
 
 1024 class st_select_lex;
 
 1033 void opt_trace_print_expanded_query(THD *thd,
 
 1034                                     st_select_lex *select_lex,
 
 1072 void opt_trace_disable_if_no_security_context_access(THD *thd);
 
 1089 void opt_trace_disable_if_no_view_access(THD *thd, 
TABLE_LIST *
view,
 
 1108 void opt_trace_disable_if_no_stored_proc_func_access(THD *thd, 
sp_head *sp);
 
 1115 int fill_optimizer_trace_info(THD *thd, 
TABLE_LIST *tables, 
Item *cond);
 
 1129                    Opt_trace_context::MISC)
 
 1133                    Opt_trace_context::MISC)
 
 1138                              const char *value, 
size_t val_length)
 
 1162                   Opt_trace_context::MISC)
 
 1166                   Opt_trace_context::MISC)
 
 1182   Opt_trace_array& add_select_number(uint select_number) { 
return *
this; }
 
 1197                   enum enum_sql_command sql_command,
 
 1199                   const char *
query, 
size_t query_length,
 
 1204 #define opt_trace_print_expanded_query(thd, select_lex, trace_object) \ 
 1206 #define opt_trace_disable_if_no_view_access(thd, view, underlying_tables) \ 
 1208 #define opt_trace_disable_if_no_stored_proc_func_access(thd, sp) do{} while(0) 
 1209 #define opt_trace_disable_if_no_security_context_access(thd) do {} while (0) 
 1231 #define OPT_TRACE_TRANSFORM(trace,object_level0,object_level1,          \ 
 1232                             select_number,from,to)                      \ 
 1233   Opt_trace_object object_level0(trace);                                \ 
 1234   Opt_trace_object object_level1(trace, "transformation");              \ 
 1235   object_level1.add_select_number(select_number);                       \ 
 1236   object_level1.add_alnum("from", from).add_alnum("to", to); 
 1242 #if !defined(DBUG_OFF) && !defined(OPTIMIZER_TRACE) 
 1243 #error debug binaries must support optimizer trace