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