From: Jorgen Loland Date: March 17 2011 12:03pm Subject: bzr commit into mysql-trunk branch (jorgen.loland:3279) List-Archive: http://lists.mysql.com/commits/133199 Message-Id: <20110317120335.13BAD8AE@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3536786931721121747==" --===============3536786931721121747== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/jl208045/mysql/wl4800/mysql-next-mr-opt-backporting-wl4800/ based on revid:guilhem.bichot@stripped 3279 Jorgen Loland 2011-03-17 Review comment by Guilhem: Pass Opt_trace_array pointer to sel_arg_range_seq_next(), which no longer needs to call get_current_struct() to get the optimizer trace array. With this, get_current_struct() is no longer used outside the trace classes and can be made private or removed. modified: sql/handler.cc sql/handler.h sql/opt_range.cc sql/opt_range.h sql/sql_join_cache.cc === modified file 'sql/handler.cc' --- a/sql/handler.cc 2011-02-16 13:52:44 +0000 +++ b/sql/handler.cc 2011-03-17 12:03:30 +0000 @@ -4439,7 +4439,7 @@ handler::multi_range_read_info_const(uin seq_it= seq->init(seq_init_param, n_ranges, *flags); Opt_trace_array ota(thd->opt_trace, "ranges"); - while (!seq->next(seq_it, &range)) + while (!seq->next(seq_it, &range, &ota)) { if (unlikely(thd->killed != 0)) return HA_POS_ERROR; @@ -4639,7 +4639,7 @@ int handler::multi_range_read_next(char start: /* Try the next range(s) until one matches a record. */ - while (!(range_res= mrr_funcs.next(mrr_iter, &mrr_cur_range))) + while (!(range_res= mrr_funcs.next(mrr_iter, &mrr_cur_range, NULL))) { scan_it_again: result= read_range_first(mrr_cur_range.start_key.keypart_map ? === modified file 'sql/handler.h' --- a/sql/handler.h 2011-02-16 13:52:44 +0000 +++ b/sql/handler.h 2011-03-17 12:03:30 +0000 @@ -28,6 +28,7 @@ #include "thr_lock.h" /* thr_lock_type, THR_LOCK_DATA */ #include "sql_cache.h" #include "structs.h" /* SHOW_COMP_OPTION */ +#include "opt_trace.h" // For Opt_trace_array #include #include @@ -1144,14 +1145,17 @@ typedef struct st_range_seq_if SYNOPSIS next() - seq The value returned by RANGE_SEQ_IF::init() - range OUT Information about the next range + seq The value returned by RANGE_SEQ_IF::init() + range OUT Information about the next range + trace_array Optimizer trace-related information is appended to this if + tracing is enabled. If NULL, no optimizer tracing is done RETURN 0 - Ok, the range structure filled with info about the next range 1 - No more ranges */ - uint (*next) (range_seq_t seq, KEY_MULTI_RANGE *range); + uint (*next) (range_seq_t seq, KEY_MULTI_RANGE *range, + Opt_trace_array *trace_array); /* Check whether range_info orders to skip the next record === modified file 'sql/opt_range.cc' --- a/sql/opt_range.cc 2011-02-16 15:06:06 +0000 +++ b/sql/opt_range.cc 2011-03-17 12:03:30 +0000 @@ -7969,13 +7969,17 @@ range_seq_t sel_arg_range_seq_init(void return init_param; } - -static void step_down_to(String *s, SEL_ARG_RANGE_SEQ *arg, SEL_ARG *key_tree) +/** + @param trace_string Append range information for this part of the range + condition to this String if not NULL. Used by optimizer + trace +*/ +static void step_down_to(String *trace_string, + SEL_ARG_RANGE_SEQ *arg, SEL_ARG *key_tree) { #ifdef OPTIMIZER_TRACE - if (unlikely(arg->param->thd->opt_trace != NULL) && - arg->param->thd->opt_trace->is_started()) + if (trace_string != NULL) { /* Stepping down will append the range for the current keypart (in @@ -7985,7 +7989,7 @@ static void step_down_to(String *s, SEL_ const KEY_PART_INFO *key_part= arg->param->table->key_info[arg->real_keyno].key_part + key_tree->part; - append_range(s, key_part, + append_range(trace_string, key_part, key_tree->min_value, key_tree->max_value, key_tree->min_flag | key_tree->max_flag); } @@ -8027,6 +8031,9 @@ static void step_down_to(String *s, SEL_ sel_arg_range_seq_next() rseq Value returned from sel_arg_range_seq_init range OUT Store information about the range here + trace_array Optimizer trace information about range boundaries are + appended to this if tracing is enabled. If NULL, no + optimizer tracing is done DESCRIPTION This is "get_next" function for Range sequence interface implementation @@ -8044,12 +8051,24 @@ static void step_down_to(String *s, SEL_ */ //psergey-merge-todo: support check_quick_keys:max_keypart -uint sel_arg_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range) +uint sel_arg_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range, + Opt_trace_array *trace_array) { SEL_ARG *key_tree; SEL_ARG_RANGE_SEQ *seq= (SEL_ARG_RANGE_SEQ*)rseq; String key_range_trace; - key_range_trace.set_charset(system_charset_info); + //points to key_range_trace if doing tracing, NULL otherwise + String *active_trace_ptr= NULL; + +#ifdef OPTIMIZER_TRACE + if (unlikely(trace_array) && + unlikely(seq->param->thd->opt_trace != NULL) && + seq->param->thd->opt_trace->is_started()) + { + key_range_trace.set_charset(system_charset_info); + active_trace_ptr= &key_range_trace; + } +#endif if (seq->at_start) { @@ -8066,7 +8085,7 @@ uint sel_arg_range_seq_next(range_seq_t { //step down; (update the tuple, we'll step right and stay there) seq->i--; - step_down_to(&key_range_trace, seq, key_tree->next); + step_down_to(active_trace_ptr, seq, key_tree->next); key_tree= key_tree->next; seq->param->is_ror_scan= FALSE; goto walk_right_n_up; @@ -8087,7 +8106,7 @@ uint sel_arg_range_seq_next(range_seq_t { // Step down; update the tuple seq->i--; - step_down_to(&key_range_trace, seq, key_tree->next); + step_down_to(active_trace_ptr, seq, key_tree->next); key_tree= key_tree->next; seq->param->is_ror_scan= FALSE; break; @@ -8128,15 +8147,14 @@ walk_right_n_up: MAX_KEY); #ifdef OPTIMIZER_TRACE - if (unlikely(seq->param->thd->opt_trace != NULL) && - seq->param->thd->opt_trace->is_started()) + if (unlikely(active_trace_ptr != NULL)) { // Trace the range we just stored KEY_PART_INFO *kpi= seq->param->table->key_info[seq->real_keyno].key_part + store_key_part->part; - append_range(&key_range_trace, kpi, + append_range(active_trace_ptr, kpi, store_key_part->min_value, store_key_part->max_value, store_key_part->min_flag | store_key_part->max_flag); } @@ -8157,7 +8175,7 @@ walk_up_n_right: /* Step up */ key_tree= key_tree->prev; } - step_down_to(&key_range_trace, seq, key_tree); + step_down_to(active_trace_ptr, seq, key_tree); } /* Ok got a tuple */ @@ -8219,22 +8237,8 @@ walk_up_n_right: seq->param->range_count++; seq->param->max_key_part=max(seq->param->max_key_part,key_tree->part); -#ifdef OPTIMIZER_TRACE - if (key_range_trace.length()) - { - DBUG_ASSERT(seq->param->thd->opt_trace); - DBUG_ASSERT(seq->param->thd->opt_trace->is_started()); - /* - Should be Opt_trace_array, but don't cast because if it is - Opt_trace_object a cast will crash the server while just - add()'ing to Opt_trace_struct will cause a JSON syntax error - for the optimizer trace (less severe) - */ - Opt_trace_struct *trace_range= - seq->param->thd->opt_trace->get_current_struct(); - trace_range->add_utf8(key_range_trace.ptr(), key_range_trace.length()); - } -#endif + if (unlikely(active_trace_ptr != NULL) && active_trace_ptr->length()) + trace_array->add_utf8(active_trace_ptr->ptr(), active_trace_ptr->length()); return 0; } @@ -9258,7 +9262,8 @@ range_seq_t quick_range_seq_init(void *i 1 No more ranges in the sequence */ -uint quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range) +uint quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range, + Opt_trace_array *unused) { QUICK_RANGE_SEQ_CTX *ctx= (QUICK_RANGE_SEQ_CTX*)rseq; === modified file 'sql/opt_range.h' --- a/sql/opt_range.h 2011-02-16 13:52:44 +0000 +++ b/sql/opt_range.h 2011-03-17 12:03:30 +0000 @@ -394,7 +394,8 @@ typedef struct st_quick_range_seq_ctx } QUICK_RANGE_SEQ_CTX; range_seq_t quick_range_seq_init(void *init_param, uint n_ranges, uint flags); -uint quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range); +uint quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range, + Opt_trace_array *unused); /* === modified file 'sql/sql_join_cache.cc' --- a/sql/sql_join_cache.cc 2010-09-02 07:34:10 +0000 +++ b/sql/sql_join_cache.cc 2011-03-17 12:03:30 +0000 @@ -2169,7 +2169,8 @@ range_seq_t bka_range_seq_init(void *ini */ static -uint bka_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range) +uint bka_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range, + Opt_trace_array *unused) { DBUG_ENTER("bka_range_seq_next"); JOIN_CACHE_BKA *cache= (JOIN_CACHE_BKA *) rseq; @@ -2993,7 +2994,8 @@ range_seq_t bka_unique_range_seq_init(vo */ static -uint bka_unique_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range) +uint bka_unique_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range, + Opt_trace_array *unused) { DBUG_ENTER("bka_unique_range_seq_next"); JOIN_CACHE_BKA_UNIQUE *cache= (JOIN_CACHE_BKA_UNIQUE *) rseq; --===============3536786931721121747== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jorgen.loland@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jorgen.loland@stripped\ # m40fjnqjehz83mek # target_branch: file:///export/home/jl208045/mysql/wl4800/mysql-next-\ # mr-opt-backporting-wl4800/ # testament_sha1: 69567f95743c65a0d44294bbc1f85fc17bf5ebaa # timestamp: 2011-03-17 13:03:35 +0100 # source_branch: file:///export/home/jl208045/mysql/wl4800/mysql-next-\ # mr-opt-backporting-wl4800/ # base_revision_id: guilhem.bichot@stripped\ # 2m2iiabbmo3bb576 # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWdBDKPUABZT/gFUVN0h5d/// e7/+sL////pgC0fTvdloAAABwkgAE+toDRq7C7AkkTUp+mmowU2npoU8KeQnk00mg0ekDTTTT1ND GQJkHNMRkZNMmgGQ0ZDJkAAAMjTI0DCGQNFPTIKh5TQDRoPSNABk0AAAAAAANNCKTRtQ9TI0zFBk AAAAAAAAAA2qEmTBQeU9RkyaD1PUAAAAAAAAACSICAEAJoATJqnqemKYTIBoekAAaBproR5r7X3b nLtzn9c4iTFyDuaA6Jw7pw9PPJ19BT3JI/Fik2bE7d2HQo1nxOas7seivlioO4WdR18n+uwjnjnZ ojgfwVqEvBeuEg98A228ex3HtwhdZSNaXwqQpB2aVNpT4b80RADYszX2Re6KAJBSBTMG/2uEurC4 B0Nca0uGVPO6xDAEfN88ItYiYKlRGlF1DJmGZmZkMyFj1AKd05HWOlUrV2yEUgKWgHJMqqhJNMHO pg9TMzg9zLF3cmkUtGJJchzSZQFVRAu6xonltVbY7qAlY9QNzN0H6/ZZc1HhaWHhKK7Y3DtkeDQ/ 7hQIIp9/Ctv2vnKFKXKA5OAsQiYBhryuQvUWR0VKFifVCJCLK8jOdkYE4hAxImcCCCTMT82V0aUS D0HyYjd1EWxQ4uFgbDu7e5yGOWzrjcM3ejt6EW5faT6EEmBZskdy60yATJUsHAZ5pRIqVnhwlAsV BWJSmJw2FBnNg04QNZH2zjAZlKkys7vh46YK1kKvCxdTLRo+0UYNfzeKnmMpehxNwMHcJHmvFG7C wuc3DkKHUZseAd0O1JNEuxysqF+GCKhq+8oLXLAySrayYYQmZMZAGyHLly+jkKl1ET7keHE08bBA zI9jAtrLexSQkzt7AIVIS74bQIgQIIQ9WCYytJRIIFIShP5eEisydGNLcCBc3JqdZmsS+4mnceF4 FgEl5+meJmVm1BLNfXrBQprdoD3w1xlON9CxBfcFdRECCAYnl2GXhJCKopGUMgvEqlNNm99kIZZF NZrW6Hklgti+ItekRtP967LqVakXdnwRG2wwpK4SY2FKzK/JM3z7eIF27E1I1ldmBsRkazjADI4F 2AMyNRtycu230VDQBOJZZcYGA4VooEDiYG81l8kygYKsTEyNZS8tJ8bSw3ZAa6W7hhjItGNC1jyO 9blsLUY6NQgXwNBLK444gSkDqQwk29hxKO1WWaiauPIrybqjvJ53vF7WKSLTij0Udy4OcEUEt6Jm BKpbqZ3T8jZmjkxyEpz1bySrnroNMkDKCooIYvT9TSYJmwcyFcU5HE6Dab0ciRt8iWgaNHA6WzOn UYmWa/4ilG75bzdpI6TetJJNGYFxeYHd/09BjCZOtmVsHlB7ykpPtKXyCpQ5TI1ruJnQSu23YLeM SutTnOpCQXGvbYMLGRm1GuBtozaO+a0QxlPU18Ge1sb4ASa/VASskPIvG60NCl5oQWCwIkiprIqR UuIPVoETRkqHI01FiWuiVb0x3F5kadZCi0Mbs9j7YxGHttbO2tpqRoMTGWYwplzkGhTXefcJTI2j ligYYMRutsJ1hrxleT7K33YwnfIcbApmBIIkFAaU6EjttKgWTkOYgX5GL3DHCtID0eR46EA14Dre beWZZN1/Bri9zTdck/bVyDJSdJqNEVgFKt99LHLkFNbzA29rbcY4ZMMYkW3DIGa5uoxzMhRRpMkp etB4DqYSMwmZuH9/zOKHaHhqFEaZJewBna3z7GE9YWFbEd4BVHyRiqgPSNDdXP0adJBd1mUqSpQl Iqj9UB3K1Xvrihy7IiwKnGSisRnP4CeKeBP7S6JeS7/H0c+wHjBEkN8Y0UQIC/W6R5kpi+uP1fYQ oo+74uCoIg4OWivB4MMMAyRMLLo1BfQZyHv4z2GeM4oEhnccZXPpROSUefZVzATAIqJkT8bkkZBQ G06LHTet2Zl8i7KBVqaHqsj8lyEXnrsAXhQQg9uyX9+XFQZC3+47mEo2kjD34cDU7xYPIzSX7b+Y zfYdHYQNR2L951EyaO8mZnl2SVxJP0m+PofuS8iJQyP5jLIjE+nwORFfjElDwWjC2FsPvGs4EJNM eB2q00QRKmICNl/qapFOlEdGQ0E1jJInYkiGf+eRKwokWpz1xYZhrXS8Dmh17cjd6aiBzNg1Dad5 fglO1K4zuORPsKpDiCqah7SZmNZiSNULKlhnHvI+QmS4rcG06jHc1/C8sPG9rODtl0jwZ0MPfyPV N9bucZmYwFXGjBMWJIhBM6JcYzMSFjLNp8CRqt9qOaLZCyeQlgjAB0jB0JwZepIy1bGlZqGgE7CJ bsDoNOm7p2jFfBHD/wlPaJRv72PaxoZSDYBrhtQHmus7Ef63mNAOCZKwLxC5l0HB3oLZGErcH67G uLYjDRofBwJ7EKKRoBWIvmNbnc3MDw7XO0/mfw9diO0qn55d8oFS4uPMw+4uPImJscZi6DoR/xHk juR5CWCORBWOGKiZsZDJQBXWGMwxWHoRXQMAPQDFJXYIeRpTIrGLdubz2HDA/KNtAp8wzDygLkcq WQE9OME8FCqqQYQkVhXjE59YZgbSrZzpgv41lTWwNh2WOR01taGDM8WwtkKhcSVMCwViUCSqqWUC bXJaI3hR3avK8UvpbyjbNG8DhqvQwzHv6eIEsz+s0zSAp1KJ5FmpBgoIibxVKGCbRCtClSMBOHXS RMES7w4H1f3+qCyA1D2F0FqFaHHECMBRXSgJw3HqMkopIYRocziKAHQHo5Ifr7cvWAazS+kqmQWn iS0EhiKXqXmJfPCTX7EvaVR7BLq7MC6Di70XGSoipe1grkbC7rx84FhTyxuwL2UWgANudQgiSbqC JciksHIwAcAcgynATGM3bs4sjp7WM7l8zAFqEFhcSvkwXdLLij6BLJFKKrJgGZMMlUHXScevzTJg H5qwZHM6yGM2ur8DjtAGBAqaE0DfiJCvjYZicdrL4anVvFJGwD7tQBFLURW73JeVnVwXVyW4PnT8 0LqCum09UEMk3hQWiMPYj4LQYxK++FP3eoPHhG9Fce1YiPiAwwxmaMgyNaFYfUuSIIXuMICW9A6P VkTOklbO1NQ5jAjaJaicqihogT4BAXIVssUyz0Yrpe9hMJlckvQsuD12QFIZKcOjwcUfcMZIDVA6 IKLifCwK+si1VBDXsEQEClE0UkarprS3atPMJADQK37u0GyQ1z1kC6E1dSAU9rP2aoCWZKWsZ3CS RniA6MDcopa+N3A+RHmzMzM16IPBuO9u58Oum76DdrAmJuvfnf0ut7HhvsRBny4dRMCDKkeNY+Ax dclVSQ0xSEQHSI7zgqTa2CKW8u42iPfnL5TyJBiyPzIwg2G80E8As2JFUtoaAaKoL6485uxJAtkJ McuY0MiCLuVT+LgVB7oRIQZa6oktGGHRfOIxb5RMxdMnBhHuMCWjy2kU94bBs2S21oLN7aYpWguL S1sUescnz5jJEKrlFBvMKVI955ke1uiFwWH4zxIqxC6BkjMxPQw7GSdmvZ4UBwizfLUDrN5tKG/b wIFRK2YL8R6F21XnE+s4H/xdyRThQkNBDKPU --===============3536786931721121747==--