MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
pfs_engine_table.cc
Go to the documentation of this file.
1 /* Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
2 
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License as published by
5  the Free Software Foundation; version 2 of the License.
6 
7  This program is distributed in the hope that it will be useful,
8  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  GNU General Public License for more details.
11 
12  You should have received a copy of the GNU General Public License
13  along with this program; if not, write to the Free Software Foundation,
14  51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
15 
21 #include "my_global.h"
22 #include "my_pthread.h"
23 #include "hostname.h" /* For Host_entry */
24 #include "pfs_engine_table.h"
25 
26 #include "table_events_waits.h"
27 #include "table_setup_actors.h"
28 #include "table_setup_consumers.h"
30 #include "table_setup_objects.h"
31 #include "table_setup_timers.h"
36 #include "table_host_cache.h"
38 #include "table_sync_instances.h"
39 #include "table_file_instances.h"
42 #include "table_threads.h"
43 
48 #include "table_tiws_by_table.h"
49 #include "table_tlws_by_table.h"
50 
51 #include "table_events_stages.h"
57 
64 #include "table_esms_by_digest.h"
65 
66 #include "table_users.h"
67 #include "table_accounts.h"
68 #include "table_hosts.h"
69 
70 #include "table_socket_instances.h"
73 #include "table_session_connect_attrs.h"
74 #include "table_session_account_connect_attrs.h"
75 
76 /* For show status */
77 #include "pfs_column_values.h"
78 #include "pfs_instr_class.h"
79 #include "pfs_instr.h"
80 #include "pfs_setup_actor.h"
81 #include "pfs_setup_object.h"
82 #include "pfs_global.h"
83 #include "pfs_digest.h"
84 
85 #include "sql_base.h" // close_thread_tables
86 #include "lock.h" // MYSQL_LOCK_IGNORE_TIMEOUT
87 
93 static PFS_engine_table_share *all_shares[]=
94 {
122 
131 
141 
145 
151  NULL
152 };
153 
159 {
160  PFS_engine_table_share **current;
161 
162  DBUG_EXECUTE_IF("tampered_perfschema_table1",
163  {
164  /* Hack SETUP_INSTRUMENT, incompatible change. */
165  all_shares[20]->m_field_def->count++;
166  });
167 
168  for (current= &all_shares[0]; (*current) != NULL; current++)
169  (*current)->check_one_table(thd);
170 }
171 
174 {
175 protected:
176  virtual void report_error(uint code, const char *fmt, ...);
177 
178 public:
180  {}
181 
183  {}
184 };
185 
186 void PFS_check_intact::report_error(uint code, const char *fmt, ...)
187 {
188  va_list args;
189  char buff[MYSQL_ERRMSG_SIZE];
190 
191  va_start(args, fmt);
192  my_vsnprintf(buff, sizeof(buff), fmt, args);
193  va_end(args);
194 
195  /*
196  This is an install/upgrade issue:
197  - do not report it in the user connection, there is none in main(),
198  - report it in the server error log.
199  */
200  sql_print_error("%s", buff);
201 }
202 
209 {
210  TABLE_LIST tables;
211 
213  PERFORMANCE_SCHEMA_str.length,
214  m_name.str, m_name.length,
215  m_name.str, TL_READ);
216 
217  /* Work around until Bug#32115 is backported. */
218  LEX dummy_lex;
219  LEX *old_lex= thd->lex;
220  thd->lex= &dummy_lex;
221  lex_start(thd);
222 
223  if (! open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
224  {
225  PFS_check_intact checker;
226 
227  if (!checker.check(tables.table, m_field_def))
228  m_checked= true;
229  close_thread_tables(thd);
230  }
231  else
232  sql_print_error(ER(ER_WRONG_NATIVE_TABLE_STRUCTURE),
233  PERFORMANCE_SCHEMA_str.str, m_name.str);
234 
235  lex_end(&dummy_lex);
236  thd->lex= old_lex;
237 }
238 
241 {
242  PFS_engine_table_share **current;
243 
244  for (current= &all_shares[0]; (*current) != NULL; current++)
245  thr_lock_init((*current)->m_thr_lock_ptr);
246 }
247 
250 {
251  PFS_engine_table_share **current;
252 
253  for (current= &all_shares[0]; (*current) != NULL; current++)
254  thr_lock_delete((*current)->m_thr_lock_ptr);
255 }
256 
258 {
259  /* If available, count the exact number or records */
260  if (m_get_row_count)
261  return m_get_row_count();
262  /* Otherwise, return an estimate */
263  return m_records;
264 }
265 
267  Field **fields) const
268 {
269  my_bitmap_map *org_bitmap;
270 
271  /*
272  Make sure the table structure is as expected before mapping
273  hard wired columns in m_write_row.
274  */
275  if (! m_checked)
276  {
277  return HA_ERR_TABLE_NEEDS_UPGRADE;
278  }
279 
280  if (m_write_row == NULL)
281  {
282  return HA_ERR_WRONG_COMMAND;
283  }
284 
285  /* We internally read from Fields to support the write interface */
286  org_bitmap= dbug_tmp_use_all_columns(table, table->read_set);
287  int result= m_write_row(table, buf, fields);
288  dbug_tmp_restore_column_map(table->read_set, org_bitmap);
289 
290  return result;
291 }
292 
293 static int compare_table_names(const char *name1, const char *name2)
294 {
295  /*
296  The performance schema is implemented as a storage engine, in memory.
297  The current storage engine interface exposed by the server,
298  and in particular handlerton::discover, uses 'FRM' files to describe a
299  table structure, which are later stored on disk, by the server,
300  in ha_create_table_from_engine().
301  Because the table metadata is stored on disk, the table naming rules
302  used by the performance schema then have to comply with the constraints
303  imposed by the disk storage, and in particular with lower_case_table_names.
304  Once the server is changed to be able to discover a table in a storage engine
305  and then open the table without storing a FRM file on disk, this constraint
306  on the performance schema will be lifted, and the naming logic can be relaxed
307  to be simply my_strcasecmp(system_charset_info, name1, name2).
308  */
309  if (lower_case_table_names)
310  return strcasecmp(name1, name2);
311  return strcmp(name1, name2);
312 }
313 
321 {
322  DBUG_ENTER("PFS_engine_table::find_table_share");
323 
324  PFS_engine_table_share **current;
325 
326  for (current= &all_shares[0]; (*current) != NULL; current++)
327  {
328  if (compare_table_names(name, (*current)->m_name.str) == 0)
329  DBUG_RETURN(*current);
330  }
331 
332  DBUG_RETURN(NULL);
333 }
334 
343  unsigned char *buf,
344  Field **fields)
345 {
346  my_bitmap_map *org_bitmap;
347  Field *f;
348  Field **fields_reset;
349 
350  /*
351  Make sure the table structure is as expected before mapping
352  hard wired columns in read_row_values.
353  */
354  if (! m_share_ptr->m_checked)
355  {
356  return HA_ERR_TABLE_NEEDS_UPGRADE;
357  }
358 
359  /* We must read all columns in case a table is opened for update */
360  bool read_all= !bitmap_is_clear_all(table->write_set);
361 
362  /* We internally write to Fields to support the read interface */
363  org_bitmap= dbug_tmp_use_all_columns(table, table->write_set);
364 
365  /*
366  Some callers of the storage engine interface do not honor the
367  f->is_null() flag, and will attempt to read the data itself.
368  A known offender is mysql_checksum_table().
369  For robustness, reset every field.
370  */
371  for (fields_reset= fields; (f= *fields_reset) ; fields_reset++)
372  f->reset();
373 
374  int result= read_row_values(table, buf, fields, read_all);
375  dbug_tmp_restore_column_map(table->write_set, org_bitmap);
376 
377  return result;
378 }
379 
389  const unsigned char *old_buf,
390  unsigned char *new_buf,
391  Field **fields)
392 {
393  my_bitmap_map *org_bitmap;
394 
395  /*
396  Make sure the table structure is as expected before mapping
397  hard wired columns in update_row_values.
398  */
399  if (! m_share_ptr->m_checked)
400  {
401  return HA_ERR_TABLE_NEEDS_UPGRADE;
402  }
403 
404  /* We internally read from Fields to support the write interface */
405  org_bitmap= dbug_tmp_use_all_columns(table, table->read_set);
406  int result= update_row_values(table, old_buf, new_buf, fields);
407  dbug_tmp_restore_column_map(table->read_set, org_bitmap);
408 
409  return result;
410 }
411 
413  const unsigned char *buf,
414  Field **fields)
415 {
416  my_bitmap_map *org_bitmap;
417 
418  /*
419  Make sure the table structure is as expected before mapping
420  hard wired columns in delete_row_values.
421  */
422  if (! m_share_ptr->m_checked)
423  {
424  return HA_ERR_TABLE_NEEDS_UPGRADE;
425  }
426 
427  /* We internally read from Fields to support the delete interface */
428  org_bitmap= dbug_tmp_use_all_columns(table, table->read_set);
429  int result= delete_row_values(table, buf, fields);
430  dbug_tmp_restore_column_map(table->read_set, org_bitmap);
431 
432  return result;
433 }
434 
436  const unsigned char *,
437  Field **)
438 {
439  return HA_ERR_WRONG_COMMAND;
440 }
441 
447 {
448  memcpy(ref, m_pos_ptr, m_share_ptr->m_ref_length);
449 }
450 
455 void PFS_engine_table::set_position(const void *ref)
456 {
457  memcpy(m_pos_ptr, ref, m_share_ptr->m_ref_length);
458 }
459 
465 {
466  if (instr_class->m_type != m_class_type)
467  {
468  m_normalizer= time_normalizer::get(*instr_class->m_timer);
469  m_class_type= instr_class->m_type;
470  }
471 }
472 
474 {
475  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_LONG);
476  Field_long *f2= (Field_long*) f;
477  f2->store(value, true);
478 }
479 
481 {
482  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_LONGLONG);
483  Field_longlong *f2= (Field_longlong*) f;
484  f2->store(value, true);
485 }
486 
488  uint len)
489 {
490  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_STRING);
491  Field_string *f2= (Field_string*) f;
492  f2->store(str, len, &my_charset_utf8_bin);
493 }
494 
496  uint len)
497 {
498  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_VARCHAR);
500  f2->store(str, len, &my_charset_utf8_bin);
501 }
502 
504  uint len)
505 {
506  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_BLOB);
507  Field_blob *f2= (Field_blob*) f;
508  f2->store(str, len, &my_charset_utf8_bin);
509 }
510 
511 void PFS_engine_table::set_field_enum(Field *f, ulonglong value)
512 {
513  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_ENUM);
514  Field_enum *f2= (Field_enum*) f;
515  f2->store_type(value);
516 }
517 
519 {
520  struct timeval tm;
521  tm.tv_sec= (long)(value / 1000000);
522  tm.tv_usec= (long)(value % 1000000);
523  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_TIMESTAMP2);
525  f2->store_timestamp(& tm);
526 }
527 
529 {
530  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_ENUM);
531  Field_enum *f2= (Field_enum*) f;
532  return f2->val_int();
533 }
534 
535 String*
537 {
538  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_STRING);
539  Field_string *f2= (Field_string*) f;
540  val= f2->val_str(NULL, val);
541  return val;
542 }
543 
544 String*
546 {
547  DBUG_ASSERT(f->real_type() == MYSQL_TYPE_VARCHAR);
549  val= f2->val_str(NULL, val);
550  return val;
551 }
552 
554  const unsigned char *,
555  unsigned char *,
556  Field **)
557 {
558  return HA_ERR_WRONG_COMMAND;
559 }
560 
563 {
564 public:
566  {}
567 
569  {}
570 
571  ACL_internal_access_result check(ulong want_access,
572  ulong *save_priv) const;
573 
574  const ACL_internal_table_access *lookup(const char *name) const;
575 };
576 
577 ACL_internal_access_result
579  ulong *save_priv) const
580 {
581  const ulong always_forbidden= /* CREATE_ACL | */ REFERENCES_ACL
582  | INDEX_ACL | ALTER_ACL | CREATE_TMP_ACL | EXECUTE_ACL
583  | CREATE_VIEW_ACL | SHOW_VIEW_ACL | CREATE_PROC_ACL | ALTER_PROC_ACL
584  | EVENT_ACL | TRIGGER_ACL ;
585 
586  if (unlikely(want_access & always_forbidden))
587  return ACL_INTERNAL_ACCESS_DENIED;
588 
589  /*
590  Proceed with regular grant tables,
591  to give administrative control to the DBA.
592  */
593  return ACL_INTERNAL_ACCESS_CHECK_GRANT;
594 }
595 
598 {
599  const PFS_engine_table_share* share;
601  if (share)
602  return share->m_acl;
603  /*
604  Do not return NULL, it would mean we are not interested
605  in privilege checks for unknown tables.
606  Instead, return an object that denies every actions,
607  to prevent users for creating their own tables in the
608  performance_schema database schema.
609  */
610  return &pfs_unknown_acl;
611 }
612 
613 PFS_internal_schema_access pfs_internal_access;
614 
616 {
617  /*
618  ACL is always enforced, even if the performance schema
619  is not enabled (the tables are still visible).
620  */
621  if (! bootstrap)
622  {
624  &pfs_internal_access);
625  }
626 }
627 
629 
630 ACL_internal_access_result
631 PFS_readonly_acl::check(ulong want_access, ulong *save_priv) const
632 {
633  const ulong always_forbidden= INSERT_ACL | UPDATE_ACL | DELETE_ACL
634  | /* CREATE_ACL | */ REFERENCES_ACL | INDEX_ACL | ALTER_ACL
635  | CREATE_VIEW_ACL | SHOW_VIEW_ACL | TRIGGER_ACL | LOCK_TABLES_ACL;
636 
637  if (unlikely(want_access & always_forbidden))
638  return ACL_INTERNAL_ACCESS_DENIED;
639 
640  return ACL_INTERNAL_ACCESS_CHECK_GRANT;
641 }
642 
644 
645 ACL_internal_access_result
646 PFS_truncatable_acl::check(ulong want_access, ulong *save_priv) const
647 {
648  const ulong always_forbidden= INSERT_ACL | UPDATE_ACL | DELETE_ACL
649  | /* CREATE_ACL | */ REFERENCES_ACL | INDEX_ACL | ALTER_ACL
650  | CREATE_VIEW_ACL | SHOW_VIEW_ACL | TRIGGER_ACL | LOCK_TABLES_ACL;
651 
652  if (unlikely(want_access & always_forbidden))
653  return ACL_INTERNAL_ACCESS_DENIED;
654 
655  return ACL_INTERNAL_ACCESS_CHECK_GRANT;
656 }
657 
659 
660 ACL_internal_access_result
661 PFS_updatable_acl::check(ulong want_access, ulong *save_priv) const
662 {
663  const ulong always_forbidden= INSERT_ACL | DELETE_ACL
664  | /* CREATE_ACL | */ REFERENCES_ACL | INDEX_ACL | ALTER_ACL
665  | CREATE_VIEW_ACL | SHOW_VIEW_ACL | TRIGGER_ACL;
666 
667  if (unlikely(want_access & always_forbidden))
668  return ACL_INTERNAL_ACCESS_DENIED;
669 
670  return ACL_INTERNAL_ACCESS_CHECK_GRANT;
671 }
672 
674 
675 ACL_internal_access_result
676 PFS_editable_acl::check(ulong want_access, ulong *save_priv) const
677 {
678  const ulong always_forbidden= /* CREATE_ACL | */ REFERENCES_ACL
679  | INDEX_ACL | ALTER_ACL | CREATE_VIEW_ACL | SHOW_VIEW_ACL | TRIGGER_ACL;
680 
681  if (unlikely(want_access & always_forbidden))
682  return ACL_INTERNAL_ACCESS_DENIED;
683 
684  return ACL_INTERNAL_ACCESS_CHECK_GRANT;
685 }
686 
688 
689 ACL_internal_access_result
690 PFS_unknown_acl::check(ulong want_access, ulong *save_priv) const
691 {
692  const ulong always_forbidden= CREATE_ACL
693  | REFERENCES_ACL | INDEX_ACL | ALTER_ACL
694  | CREATE_VIEW_ACL | TRIGGER_ACL;
695 
696  if (unlikely(want_access & always_forbidden))
697  return ACL_INTERNAL_ACCESS_DENIED;
698 
699  /*
700  There is no point in hiding (by enforcing ACCESS_DENIED for SELECT_ACL
701  on performance_schema.*) tables that do not exist anyway.
702  When SELECT_ACL is granted on performance_schema.* or *.*,
703  SELECT * from performance_schema.wrong_table
704  will fail with a more understandable ER_NO_SUCH_TABLE error,
705  instead of ER_TABLEACCESS_DENIED_ERROR.
706  The same goes for other DML (INSERT_ACL | UPDATE_ACL | DELETE_ACL),
707  for ease of use: error messages will be less surprising.
708  */
709  return ACL_INTERNAL_ACCESS_CHECK_GRANT;
710 }
711 
719 bool pfs_show_status(handlerton *hton, THD *thd,
720  stat_print_fn *print, enum ha_stat_type stat)
721 {
722  char buf[1024];
723  uint buflen;
724  const char *name;
725  int i;
726  size_t size;
727 
728  DBUG_ENTER("pfs_show_status");
729 
730  /*
731  Note about naming conventions:
732  - Internal buffers exposed as a table in the performance schema are named
733  after the table, as in 'events_waits_current'
734  - Internal buffers not exposed by a table are named with parenthesis,
735  as in '(pfs_mutex_class)'.
736  */
737  if (stat != HA_ENGINE_STATUS)
738  DBUG_RETURN(false);
739 
740  size_t total_memory= 0;
741 
742  for (i=0; /* empty */; i++)
743  {
744  switch (i){
745  case 0:
746  name= "events_waits_current.row_size";
747  size= sizeof(PFS_events_waits);
748  break;
749  case 1:
750  name= "events_waits_current.row_count";
751  size= WAIT_STACK_SIZE * thread_max;
752  break;
753  case 2:
754  name= "events_waits_history.row_size";
755  size= sizeof(PFS_events_waits);
756  break;
757  case 3:
758  name= "events_waits_history.row_count";
760  break;
761  case 4:
762  name= "events_waits_history.memory";
763  size= events_waits_history_per_thread * thread_max
764  * sizeof(PFS_events_waits);
765  total_memory+= size;
766  break;
767  case 5:
768  name= "events_waits_history_long.row_size";
769  size= sizeof(PFS_events_waits);
770  break;
771  case 6:
772  name= "events_waits_history_long.row_count";
773  size= events_waits_history_long_size;
774  break;
775  case 7:
776  name= "events_waits_history_long.memory";
777  size= events_waits_history_long_size * sizeof(PFS_events_waits);
778  total_memory+= size;
779  break;
780  case 8:
781  name= "(pfs_mutex_class).row_size";
782  size= sizeof(PFS_mutex_class);
783  break;
784  case 9:
785  name= "(pfs_mutex_class).row_count";
786  size= mutex_class_max;
787  break;
788  case 10:
789  name= "(pfs_mutex_class).memory";
790  size= mutex_class_max * sizeof(PFS_mutex_class);
791  total_memory+= size;
792  break;
793  case 11:
794  name= "(pfs_rwlock_class).row_size";
795  size= sizeof(PFS_rwlock_class);
796  break;
797  case 12:
798  name= "(pfs_rwlock_class).row_count";
799  size= rwlock_class_max;
800  break;
801  case 13:
802  name= "(pfs_rwlock_class).memory";
803  size= rwlock_class_max * sizeof(PFS_rwlock_class);
804  total_memory+= size;
805  break;
806  case 14:
807  name= "(pfs_cond_class).row_size";
808  size= sizeof(PFS_cond_class);
809  break;
810  case 15:
811  name= "(pfs_cond_class).row_count";
812  size= cond_class_max;
813  break;
814  case 16:
815  name= "(pfs_cond_class).memory";
816  size= cond_class_max * sizeof(PFS_cond_class);
817  total_memory+= size;
818  break;
819  case 17:
820  name= "(pfs_thread_class).row_size";
821  size= sizeof(PFS_thread_class);
822  break;
823  case 18:
824  name= "(pfs_thread_class).row_count";
825  size= thread_class_max;
826  break;
827  case 19:
828  name= "(pfs_thread_class).memory";
829  size= thread_class_max * sizeof(PFS_thread_class);
830  total_memory+= size;
831  break;
832  case 20:
833  name= "(pfs_file_class).row_size";
834  size= sizeof(PFS_file_class);
835  break;
836  case 21:
837  name= "(pfs_file_class).row_count";
838  size= file_class_max;
839  break;
840  case 22:
841  name= "(pfs_file_class).memory";
842  size= file_class_max * sizeof(PFS_file_class);
843  total_memory+= size;
844  break;
845  case 23:
846  name= "mutex_instances.row_size";
847  size= sizeof(PFS_mutex);
848  break;
849  case 24:
850  name= "mutex_instances.row_count";
851  size= mutex_max;
852  break;
853  case 25:
854  name= "mutex_instances.memory";
855  size= mutex_max * sizeof(PFS_mutex);
856  total_memory+= size;
857  break;
858  case 26:
859  name= "rwlock_instances.row_size";
860  size= sizeof(PFS_rwlock);
861  break;
862  case 27:
863  name= "rwlock_instances.row_count";
864  size= rwlock_max;
865  break;
866  case 28:
867  name= "rwlock_instances.memory";
868  size= rwlock_max * sizeof(PFS_rwlock);
869  total_memory+= size;
870  break;
871  case 29:
872  name= "cond_instances.row_size";
873  size= sizeof(PFS_cond);
874  break;
875  case 30:
876  name= "cond_instances.row_count";
877  size= cond_max;
878  break;
879  case 31:
880  name= "cond_instances.memory";
881  size= cond_max * sizeof(PFS_cond);
882  total_memory+= size;
883  break;
884  case 32:
885  name= "threads.row_size";
886  size= sizeof(PFS_thread);
887  break;
888  case 33:
889  name= "threads.row_count";
890  size= thread_max;
891  break;
892  case 34:
893  name= "threads.memory";
894  size= thread_max * sizeof(PFS_thread);
895  total_memory+= size;
896  break;
897  case 35:
898  name= "file_instances.row_size";
899  size= sizeof(PFS_file);
900  break;
901  case 36:
902  name= "file_instances.row_count";
903  size= file_max;
904  break;
905  case 37:
906  name= "file_instances.memory";
907  size= file_max * sizeof(PFS_file);
908  total_memory+= size;
909  break;
910  case 38:
911  name= "(pfs_file_handle).row_size";
912  size= sizeof(PFS_file*);
913  break;
914  case 39:
915  name= "(pfs_file_handle).row_count";
916  size= file_handle_max;
917  break;
918  case 40:
919  name= "(pfs_file_handle).memory";
920  size= file_handle_max * sizeof(PFS_file*);
921  total_memory+= size;
922  break;
923  case 41:
924  name= "events_waits_summary_by_thread_by_event_name.row_size";
925  size= sizeof(PFS_single_stat);
926  break;
927  case 42:
928  name= "events_waits_summary_by_thread_by_event_name.row_count";
929  size= thread_max * wait_class_max;
930  break;
931  case 43:
932  name= "events_waits_summary_by_thread_by_event_name.memory";
933  size= thread_max * wait_class_max * sizeof(PFS_single_stat);
934  total_memory+= size;
935  break;
936  case 44:
937  name= "(pfs_table_share).row_size";
938  size= sizeof(PFS_table_share);
939  break;
940  case 45:
941  name= "(pfs_table_share).row_count";
942  size= table_share_max;
943  break;
944  case 46:
945  name= "(pfs_table_share).memory";
946  size= table_share_max * sizeof(PFS_table_share);
947  total_memory+= size;
948  break;
949  case 47:
950  name= "(pfs_table).row_size";
951  size= sizeof(PFS_table);
952  break;
953  case 48:
954  name= "(pfs_table).row_count";
955  size= table_max;
956  break;
957  case 49:
958  name= "(pfs_table).memory";
959  size= table_max * sizeof(PFS_table);
960  total_memory+= size;
961  break;
962  case 50:
963  name= "setup_actors.row_size";
964  size= sizeof(PFS_setup_actor);
965  break;
966  case 51:
967  name= "setup_actors.row_count";
968  size= setup_actor_max;
969  break;
970  case 52:
971  name= "setup_actors.memory";
972  size= setup_actor_max * sizeof(PFS_setup_actor);
973  total_memory+= size;
974  break;
975  case 53:
976  name= "setup_objects.row_size";
977  size= sizeof(PFS_setup_object);
978  break;
979  case 54:
980  name= "setup_objects.row_count";
981  size= setup_object_max;
982  break;
983  case 55:
984  name= "setup_objects.memory";
985  size= setup_object_max * sizeof(PFS_setup_object);
986  total_memory+= size;
987  break;
988  case 56:
989  name= "(pfs_account).row_size";
990  size= sizeof(PFS_account);
991  break;
992  case 57:
993  name= "(pfs_account).row_count";
994  size= account_max;
995  break;
996  case 58:
997  name= "(pfs_account).memory";
998  size= account_max * sizeof(PFS_account);
999  total_memory+= size;
1000  break;
1001  case 59:
1002  name= "events_waits_summary_by_account_by_event_name.row_size";
1003  size= sizeof(PFS_single_stat);
1004  break;
1005  case 60:
1006  name= "events_waits_summary_by_account_by_event_name.row_count";
1007  size= account_max * wait_class_max;
1008  break;
1009  case 61:
1010  name= "events_waits_summary_by_account_by_event_name.memory";
1011  size= account_max * wait_class_max * sizeof(PFS_single_stat);
1012  total_memory+= size;
1013  break;
1014  case 62:
1015  name= "events_waits_summary_by_user_by_event_name.row_size";
1016  size= sizeof(PFS_single_stat);
1017  break;
1018  case 63:
1019  name= "events_waits_summary_by_user_by_event_name.row_count";
1020  size= user_max * wait_class_max;
1021  break;
1022  case 64:
1023  name= "events_waits_summary_by_user_by_event_name.memory";
1024  size= user_max * wait_class_max * sizeof(PFS_single_stat);
1025  total_memory+= size;
1026  break;
1027  case 65:
1028  name= "events_waits_summary_by_host_by_event_name.row_size";
1029  size= sizeof(PFS_single_stat);
1030  break;
1031  case 66:
1032  name= "events_waits_summary_by_host_by_event_name.row_count";
1033  size= host_max * wait_class_max;
1034  break;
1035  case 67:
1036  name= "events_waits_summary_by_host_by_event_name.memory";
1037  size= host_max * wait_class_max * sizeof(PFS_single_stat);
1038  total_memory+= size;
1039  break;
1040  case 68:
1041  name= "(pfs_user).row_size";
1042  size= sizeof(PFS_user);
1043  break;
1044  case 69:
1045  name= "(pfs_user).row_count";
1046  size= user_max;
1047  break;
1048  case 70:
1049  name= "(pfs_user).memory";
1050  size= user_max * sizeof(PFS_user);
1051  total_memory+= size;
1052  break;
1053  case 71:
1054  name= "(pfs_host).row_size";
1055  size= sizeof(PFS_host);
1056  break;
1057  case 72:
1058  name= "(pfs_host).row_count";
1059  size= host_max;
1060  break;
1061  case 73:
1062  name= "(pfs_host).memory";
1063  size= host_max * sizeof(PFS_host);
1064  total_memory+= size;
1065  break;
1066  case 74:
1067  name= "(pfs_stage_class).row_size";
1068  size= sizeof(PFS_stage_class);
1069  break;
1070  case 75:
1071  name= "(pfs_stage_class).row_count";
1072  size= stage_class_max;
1073  break;
1074  case 76:
1075  name= "(pfs_stage_class).memory";
1076  size= stage_class_max * sizeof(PFS_stage_class);
1077  total_memory+= size;
1078  break;
1079  case 77:
1080  name= "events_stages_history.row_size";
1081  size= sizeof(PFS_events_stages);
1082  break;
1083  case 78:
1084  name= "events_stages_history.row_count";
1086  break;
1087  case 79:
1088  name= "events_stages_history.memory";
1089  size= events_stages_history_per_thread * thread_max
1090  * sizeof(PFS_events_stages);
1091  total_memory+= size;
1092  break;
1093  case 80:
1094  name= "events_stages_history_long.row_size";
1095  size= sizeof(PFS_events_stages);
1096  break;
1097  case 81:
1098  name= "events_stages_history_long.row_count";
1099  size= events_stages_history_long_size;
1100  break;
1101  case 82:
1102  name= "events_stages_history_long.memory";
1103  size= events_stages_history_long_size * sizeof(PFS_events_stages);
1104  total_memory+= size;
1105  break;
1106  case 83:
1107  name= "events_stages_summary_by_thread_by_event_name.row_size";
1108  size= sizeof(PFS_stage_stat);
1109  break;
1110  case 84:
1111  name= "events_stages_summary_by_thread_by_event_name.row_count";
1112  size= thread_max * stage_class_max;
1113  break;
1114  case 85:
1115  name= "events_stages_summary_by_thread_by_event_name.memory";
1116  size= thread_max * stage_class_max * sizeof(PFS_stage_stat);
1117  total_memory+= size;
1118  break;
1119  case 86:
1120  name= "events_stages_summary_global_by_event_name.row_size";
1121  size= sizeof(PFS_stage_stat);
1122  break;
1123  case 87:
1124  name= "events_stages_summary_global_by_event_name.row_count";
1125  size= stage_class_max;
1126  break;
1127  case 88:
1128  name= "events_stages_summary_global_by_event_name.memory";
1129  size= stage_class_max * sizeof(PFS_stage_stat);
1130  total_memory+= size;
1131  break;
1132  case 89:
1133  name= "events_stages_summary_by_account_by_event_name.row_size";
1134  size= sizeof(PFS_stage_stat);
1135  break;
1136  case 90:
1137  name= "events_stages_summary_by_account_by_event_name.row_count";
1138  size= account_max * stage_class_max;
1139  break;
1140  case 91:
1141  name= "events_stages_summary_by_account_by_event_name.memory";
1142  size= account_max * stage_class_max * sizeof(PFS_stage_stat);
1143  total_memory+= size;
1144  break;
1145  case 92:
1146  name= "events_stages_summary_by_user_by_event_name.row_size";
1147  size= sizeof(PFS_stage_stat);
1148  break;
1149  case 93:
1150  name= "events_stages_summary_by_user_by_event_name.row_count";
1151  size= user_max * stage_class_max;
1152  break;
1153  case 94:
1154  name= "events_stages_summary_by_user_by_event_name.memory";
1155  size= user_max * stage_class_max * sizeof(PFS_stage_stat);
1156  total_memory+= size;
1157  break;
1158  case 95:
1159  name= "events_stages_summary_by_host_by_event_name.row_size";
1160  size= sizeof(PFS_stage_stat);
1161  break;
1162  case 96:
1163  name= "events_stages_summary_by_host_by_event_name.row_count";
1164  size= host_max * stage_class_max;
1165  break;
1166  case 97:
1167  name= "events_stages_summary_by_host_by_event_name.memory";
1168  size= host_max * stage_class_max * sizeof(PFS_stage_stat);
1169  total_memory+= size;
1170  break;
1171  case 98:
1172  name= "(pfs_statement_class).row_size";
1173  size= sizeof(PFS_statement_class);
1174  break;
1175  case 99:
1176  name= "(pfs_statement_class).row_count";
1177  size= statement_class_max;
1178  break;
1179  case 100:
1180  name= "(pfs_statement_class).memory";
1181  size= statement_class_max * sizeof(PFS_statement_class);
1182  total_memory+= size;
1183  break;
1184  case 101:
1185  name= "events_statements_history.row_size";
1186  size= sizeof(PFS_events_statements);
1187  break;
1188  case 102:
1189  name= "events_statements_history.row_count";
1191  break;
1192  case 103:
1193  name= "events_statements_history.memory";
1194  size= events_statements_history_per_thread * thread_max
1195  * sizeof(PFS_events_statements);
1196  total_memory+= size;
1197  break;
1198  case 104:
1199  name= "events_statements_history_long.row_size";
1200  size= sizeof(PFS_events_statements);
1201  break;
1202  case 105:
1203  name= "events_statements_history_long.row_count";
1204  size= events_statements_history_long_size;
1205  break;
1206  case 106:
1207  name= "events_statements_history_long.memory";
1208  size= events_statements_history_long_size * sizeof(PFS_events_statements);
1209  total_memory+= size;
1210  break;
1211  case 107:
1212  name= "events_statements_summary_by_thread_by_event_name.row_size";
1213  size= sizeof(PFS_statement_stat);
1214  break;
1215  case 108:
1216  name= "events_statements_summary_by_thread_by_event_name.row_count";
1217  size= thread_max * statement_class_max;
1218  break;
1219  case 109:
1220  name= "events_statements_summary_by_thread_by_event_name.memory";
1221  size= thread_max * statement_class_max * sizeof(PFS_statement_stat);
1222  total_memory+= size;
1223  break;
1224  case 110:
1225  name= "events_statements_summary_global_by_event_name.row_size";
1226  size= sizeof(PFS_statement_stat);
1227  break;
1228  case 111:
1229  name= "events_statements_summary_global_by_event_name.row_count";
1230  size= statement_class_max;
1231  break;
1232  case 112:
1233  name= "events_statements_summary_global_by_event_name.memory";
1234  size= statement_class_max * sizeof(PFS_statement_stat);
1235  total_memory+= size;
1236  break;
1237  case 113:
1238  name= "events_statements_summary_by_account_by_event_name.row_size";
1239  size= sizeof(PFS_statement_stat);
1240  break;
1241  case 114:
1242  name= "events_statements_summary_by_account_by_event_name.row_count";
1243  size= account_max * statement_class_max;
1244  break;
1245  case 115:
1246  name= "events_statements_summary_by_account_by_event_name.memory";
1247  size= account_max * statement_class_max * sizeof(PFS_statement_stat);
1248  total_memory+= size;
1249  break;
1250  case 116:
1251  name= "events_statements_summary_by_user_by_event_name.row_size";
1252  size= sizeof(PFS_statement_stat);
1253  break;
1254  case 117:
1255  name= "events_statements_summary_by_user_by_event_name.row_count";
1256  size= user_max * statement_class_max;
1257  break;
1258  case 118:
1259  name= "events_statements_summary_by_user_by_event_name.memory";
1260  size= user_max * statement_class_max * sizeof(PFS_statement_stat);
1261  total_memory+= size;
1262  break;
1263  case 119:
1264  name= "events_statements_summary_by_host_by_event_name.row_size";
1265  size= sizeof(PFS_statement_stat);
1266  break;
1267  case 120:
1268  name= "events_statements_summary_by_host_by_event_name.row_count";
1269  size= host_max * statement_class_max;
1270  break;
1271  case 121:
1272  name= "events_statements_summary_by_host_by_event_name.memory";
1273  size= host_max * statement_class_max * sizeof(PFS_statement_stat);
1274  total_memory+= size;
1275  break;
1276  case 122:
1277  name= "events_statements_current.row_size";
1278  size= sizeof(PFS_events_statements);
1279  break;
1280  case 123:
1281  name= "events_statements_current.row_count";
1282  size= thread_max * statement_stack_max;
1283  break;
1284  case 124:
1285  name= "events_statements_current.memory";
1286  size= thread_max * statement_stack_max * sizeof(PFS_events_statements);
1287  total_memory+= size;
1288  break;
1289  case 125:
1290  name= "(pfs_socket_class).row_size";
1291  size= sizeof(PFS_socket_class);
1292  break;
1293  case 126:
1294  name= "(pfs_socket_class).row_count";
1295  size= socket_class_max;
1296  break;
1297  case 127:
1298  name= "(pfs_socket_class).memory";
1299  size= socket_class_max * sizeof(PFS_socket_class);
1300  total_memory+= size;
1301  break;
1302  case 128:
1303  name= "socket_instances.row_size";
1304  size= sizeof(PFS_socket);
1305  break;
1306  case 129:
1307  name= "socket_instances.row_count";
1308  size= socket_max;
1309  break;
1310  case 130:
1311  name= "socket_instances.memory";
1312  size= socket_max * sizeof(PFS_socket);
1313  total_memory+= size;
1314  break;
1315  case 131:
1316  name= "events_statements_summary_by_digest.row_size";
1317  size= sizeof(PFS_statements_digest_stat);
1318  break;
1319  case 132:
1320  name= "events_statements_summary_by_digest.row_count";
1321  size= digest_max;
1322  break;
1323  case 133:
1324  name= "events_statements_summary_by_digest.memory";
1325  size= digest_max * sizeof(PFS_statements_digest_stat);
1326  total_memory+= size;
1327  break;
1328  case 134:
1329  name= "session_connect_attrs.row_size";
1330  size= thread_max;
1331  break;
1332  case 135:
1333  name= "session_connect_attrs.row_count";
1335  break;
1336  case 136:
1337  name= "session_connect_attrs.memory";
1338  size= thread_max * session_connect_attrs_size_per_thread;
1339  total_memory+= size;
1340  break;
1341 
1342  case 137:
1343  name= "(account_hash).count";
1344  size= account_hash.count;
1345  break;
1346  case 138:
1347  name= "(account_hash).size";
1348  size= account_hash.size;
1349  break;
1350  case 139:
1351  name= "(digest_hash).count";
1352  size= digest_hash.count;
1353  break;
1354  case 140:
1355  name= "(digest_hash).size";
1356  size= digest_hash.size;
1357  break;
1358  case 141:
1359  name= "(filename_hash).count";
1360  size= filename_hash.count;
1361  break;
1362  case 142:
1363  name= "(filename_hash).size";
1364  size= filename_hash.size;
1365  break;
1366  case 143:
1367  name= "(host_hash).count";
1368  size= host_hash.count;
1369  break;
1370  case 144:
1371  name= "(host_hash).size";
1372  size= host_hash.size;
1373  break;
1374  case 145:
1375  name= "(setup_actor_hash).count";
1376  size= setup_actor_hash.count;
1377  break;
1378  case 146:
1379  name= "(setup_actor_hash).size";
1380  size= setup_actor_hash.size;
1381  break;
1382  case 147:
1383  name= "(setup_object_hash).count";
1384  size= setup_object_hash.count;
1385  break;
1386  case 148:
1387  name= "(setup_object_hash).size";
1388  size= setup_object_hash.size;
1389  break;
1390  case 149:
1391  name= "(table_share_hash).count";
1392  size= table_share_hash.count;
1393  break;
1394  case 150:
1395  name= "(table_share_hash).size";
1396  size= table_share_hash.size;
1397  break;
1398  case 151:
1399  name= "(user_hash).count";
1400  size= user_hash.count;
1401  break;
1402  case 152:
1403  name= "(user_hash).size";
1404  size= user_hash.size;
1405  break;
1406  case 153:
1407  /*
1408  This is not a performance_schema buffer,
1409  the data is maintained in the server,
1410  in hostname_cache.
1411  Print the size only, there are:
1412  - no host_cache.count
1413  - no host_cache.memory
1414  */
1415  name= "host_cache.size";
1416  size= sizeof(Host_entry);
1417  break;
1418 
1419  /*
1420  This case must be last,
1421  for aggregation in total_memory.
1422  */
1423  case 154:
1424  name= "performance_schema.memory";
1425  size= total_memory;
1426  /* This will fail if something is not advertised here */
1427  DBUG_ASSERT(size == pfs_allocated_memory);
1428  break;
1429  default:
1430  goto end;
1431  break;
1432  }
1433 
1434  buflen= longlong10_to_str(size, buf, 10) - buf;
1435  if (print(thd,
1437  name, strlen(name),
1438  buf, buflen))
1439  DBUG_RETURN(true);
1440  }
1441 
1442 end:
1443  DBUG_RETURN(false);
1444 }
1445