summaryrefslogtreecommitdiff
path: root/storage/perfschema/table_helper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/perfschema/table_helper.cc')
-rw-r--r--storage/perfschema/table_helper.cc502
1 files changed, 495 insertions, 7 deletions
diff --git a/storage/perfschema/table_helper.cc b/storage/perfschema/table_helper.cc
index d6bdd894483..749e15a7113 100644
--- a/storage/perfschema/table_helper.cc
+++ b/storage/perfschema/table_helper.cc
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2.0,
@@ -26,13 +26,16 @@
*/
#include "my_global.h"
-#include "my_pthread.h"
+#include "my_thread.h"
#include "pfs_engine_table.h"
#include "table_helper.h"
#include "pfs_host.h"
#include "pfs_user.h"
#include "pfs_account.h"
#include "pfs_instr.h"
+#include "pfs_program.h"
+#include "field.h"
+#include "pfs_variable.h"
int PFS_host_row::make_row(PFS_host *pfs)
{
@@ -147,7 +150,6 @@ int PFS_digest_row::make_row(PFS_statements_digest_stat* pfs)
else
{
m_digest_length= 0;
- m_digest_text.length(0);
}
return 0;
@@ -203,6 +205,107 @@ int PFS_object_row::make_row(PFS_table_share *pfs)
return 0;
}
+int PFS_object_row::make_row(PFS_program *pfs)
+{
+ m_object_type= pfs->m_type;
+
+ m_schema_name_length= pfs->m_schema_name_length;
+ if (m_schema_name_length > sizeof(m_schema_name))
+ return 1;
+ if (m_schema_name_length > 0)
+ memcpy(m_schema_name, pfs->m_schema_name, sizeof(m_schema_name));
+
+ m_object_name_length= pfs->m_object_name_length;
+ if (m_object_name_length > sizeof(m_object_name))
+ return 1;
+ if (m_object_name_length > 0)
+ memcpy(m_object_name, pfs->m_object_name, sizeof(m_object_name));
+
+ return 0;
+}
+
+int PFS_object_row::make_row(const MDL_key *mdl)
+{
+ switch(mdl->mdl_namespace())
+ {
+ case MDL_key::GLOBAL:
+ m_object_type= OBJECT_TYPE_GLOBAL;
+ m_schema_name_length= 0;
+ m_object_name_length= 0;
+ break;
+ case MDL_key::SCHEMA:
+ m_object_type= OBJECT_TYPE_SCHEMA;
+ m_schema_name_length= mdl->db_name_length();
+ m_object_name_length= 0;
+ break;
+ case MDL_key::TABLE:
+ m_object_type= OBJECT_TYPE_TABLE;
+ m_schema_name_length= mdl->db_name_length();
+ m_object_name_length= mdl->name_length();
+ break;
+ case MDL_key::FUNCTION:
+ m_object_type= OBJECT_TYPE_FUNCTION;
+ m_schema_name_length= mdl->db_name_length();
+ m_object_name_length= mdl->name_length();
+ break;
+ case MDL_key::PROCEDURE:
+ m_object_type= OBJECT_TYPE_PROCEDURE;
+ m_schema_name_length= mdl->db_name_length();
+ m_object_name_length= mdl->name_length();
+ break;
+ case MDL_key::TRIGGER:
+ m_object_type= OBJECT_TYPE_TRIGGER;
+ m_schema_name_length= mdl->db_name_length();
+ m_object_name_length= mdl->name_length();
+ break;
+ case MDL_key::EVENT:
+ m_object_type= OBJECT_TYPE_EVENT;
+ m_schema_name_length= mdl->db_name_length();
+ m_object_name_length= mdl->name_length();
+ break;
+ case MDL_key::COMMIT:
+ m_object_type= OBJECT_TYPE_COMMIT;
+ m_schema_name_length= 0;
+ m_object_name_length= 0;
+ break;
+ case MDL_key::USER_LOCK:
+ m_object_type= OBJECT_TYPE_USER_LEVEL_LOCK;
+ m_schema_name_length= 0;
+ m_object_name_length= mdl->name_length();
+ break;
+#if 0
+ case MDL_key::TABLESPACE:
+ m_object_type= OBJECT_TYPE_TABLESPACE;
+ m_schema_name_length= 0;
+ m_object_name_length= mdl->name_length();
+ break;
+ case MDL_key::LOCKING_SERVICE:
+ m_object_type= OBJECT_TYPE_LOCKING_SERVICE;
+ m_schema_name_length= mdl->db_name_length();
+ m_object_name_length= mdl->name_length();
+ break;
+#endif
+ case MDL_key::NAMESPACE_END:
+ default:
+ m_object_type= NO_OBJECT_TYPE;
+ m_schema_name_length= 0;
+ m_object_name_length= 0;
+ break;
+ }
+
+ if (m_schema_name_length > sizeof(m_schema_name))
+ return 1;
+ if (m_schema_name_length > 0)
+ memcpy(m_schema_name, mdl->db_name(), m_schema_name_length);
+
+ if (m_object_name_length > sizeof(m_object_name))
+ return 1;
+ if (m_object_name_length > 0)
+ memcpy(m_object_name, mdl->name(), m_object_name_length);
+
+ return 0;
+}
+
void PFS_object_row::set_field(uint index, Field *f)
{
switch(index)
@@ -221,21 +324,65 @@ void PFS_object_row::set_field(uint index, Field *f)
}
}
-int PFS_index_row::make_row(PFS_table_share *pfs, uint table_index)
+void PFS_object_row::set_nullable_field(uint index, Field *f)
+{
+ switch(index)
+ {
+ case 0: /* OBJECT_TYPE */
+ if (m_object_type != NO_OBJECT_TYPE)
+ set_field_object_type(f, m_object_type);
+ else
+ f->set_null();
+ break;
+ case 1: /* SCHEMA_NAME */
+ if (m_schema_name_length > 0)
+ PFS_engine_table::set_field_varchar_utf8(f, m_schema_name, m_schema_name_length);
+ else
+ f->set_null();
+ break;
+ case 2: /* OBJECT_NAME */
+ if (m_object_name_length > 0)
+ PFS_engine_table::set_field_varchar_utf8(f, m_object_name, m_object_name_length);
+ else
+ f->set_null();
+ break;
+ default:
+ DBUG_ASSERT(false);
+ }
+}
+
+int PFS_index_row::make_row(PFS_table_share *pfs,
+ PFS_table_share_index *pfs_index,
+ uint table_index)
{
if (m_object_row.make_row(pfs))
return 1;
+ if (pfs_index == NULL)
+ {
+ if (table_index < MAX_INDEXES)
+ {
+ m_index_name_length= sprintf(m_index_name, "(index %d)", table_index);
+ }
+ else
+ {
+ m_index_name_length= 0;
+ }
+ return 0;
+ }
+
if (table_index < MAX_INDEXES)
{
- PFS_table_key *key= &pfs->m_keys[table_index];
- m_index_name_length= key->m_name_length;
+ m_index_name_length= pfs_index->m_key.m_name_length;
if (m_index_name_length > sizeof(m_index_name))
return 1;
- memcpy(m_index_name, key->m_name, sizeof(m_index_name));
+
+ memcpy(m_index_name, pfs_index->m_key.m_name, sizeof(m_index_name));
}
else
+ {
m_index_name_length= 0;
+ }
return 0;
}
@@ -334,6 +481,37 @@ void PFS_statement_stat_row::set_field(uint index, Field *f)
}
}
+void PFS_transaction_stat_row::set_field(uint index, Field *f)
+{
+ switch (index)
+ {
+ case 0: /* COUNT_STAR */
+ case 1: /* SUM_TIMER_WAIT */
+ case 2: /* MIN_TIMER_WAIT */
+ case 3: /* AVG_TIMER_WAIT */
+ case 4: /* MAX_TIMER_WAIT */
+ m_timer1_row.set_field(index, f);
+ break;
+ case 5: /* COUNT_READ_WRITE */
+ case 6: /* SUM_TIMER_READ_WRITE */
+ case 7: /* MIN_TIMER_READ_WRITE */
+ case 8: /* AVG_TIMER_READ_WRITE */
+ case 9: /* MAX_TIMER_READ_WRITE */
+ m_read_write_row.set_field(index-5, f);
+ break;
+ case 10: /* COUNT_READ_ONLY */
+ case 11: /* SUM_TIMER_READ_ONLY */
+ case 12: /* MIN_TIMER_READ_ONLY */
+ case 13: /* AVG_TIMER_READ_ONLY */
+ case 14: /* MAX_TIMER_READ_ONLY */
+ m_read_only_row.set_field(index-10, f);
+ break;
+ default:
+ DBUG_ASSERT(false);
+ break;
+ }
+}
+
void PFS_connection_stat_row::set_field(uint index, Field *f)
{
switch (index)
@@ -354,14 +532,324 @@ void set_field_object_type(Field *f, enum_object_type object_type)
{
switch (object_type)
{
+ case OBJECT_TYPE_EVENT:
+ PFS_engine_table::set_field_varchar_utf8(f, "EVENT", 5);
+ break;
+ case OBJECT_TYPE_FUNCTION:
+ PFS_engine_table::set_field_varchar_utf8(f, "FUNCTION", 8);
+ break;
+ case OBJECT_TYPE_PROCEDURE:
+ PFS_engine_table::set_field_varchar_utf8(f, "PROCEDURE", 9);
+ break;
case OBJECT_TYPE_TABLE:
PFS_engine_table::set_field_varchar_utf8(f, "TABLE", 5);
break;
case OBJECT_TYPE_TEMPORARY_TABLE:
PFS_engine_table::set_field_varchar_utf8(f, "TEMPORARY TABLE", 15);
break;
+ case OBJECT_TYPE_TRIGGER:
+ PFS_engine_table::set_field_varchar_utf8(f, "TRIGGER", 7);
+ break;
+ case OBJECT_TYPE_GLOBAL:
+ PFS_engine_table::set_field_varchar_utf8(f, "GLOBAL", 6);
+ break;
+ case OBJECT_TYPE_SCHEMA:
+ PFS_engine_table::set_field_varchar_utf8(f, "SCHEMA", 6);
+ break;
+ case OBJECT_TYPE_COMMIT:
+ PFS_engine_table::set_field_varchar_utf8(f, "COMMIT", 6);
+ break;
+ case OBJECT_TYPE_USER_LEVEL_LOCK:
+ PFS_engine_table::set_field_varchar_utf8(f, "USER LEVEL LOCK", 15);
+ break;
+ case OBJECT_TYPE_TABLESPACE:
+ PFS_engine_table::set_field_varchar_utf8(f, "TABLESPACE", 10);
+ break;
+ case OBJECT_TYPE_LOCKING_SERVICE:
+ PFS_engine_table::set_field_varchar_utf8(f, "LOCKING SERVICE", 15);
+ break;
+ case NO_OBJECT_TYPE:
default:
DBUG_ASSERT(false);
+ PFS_engine_table::set_field_varchar_utf8(f, "", 0);
+ break;
+ }
+}
+
+void set_field_lock_type(Field *f, PFS_TL_LOCK_TYPE lock_type)
+{
+ switch (lock_type)
+ {
+ case PFS_TL_READ:
+ PFS_engine_table::set_field_varchar_utf8(f, "READ", 4);
+ break;
+ case PFS_TL_READ_WITH_SHARED_LOCKS:
+ PFS_engine_table::set_field_varchar_utf8(f, "READ WITH SHARED LOCKS", 22);
+ break;
+ case PFS_TL_READ_HIGH_PRIORITY:
+ PFS_engine_table::set_field_varchar_utf8(f, "READ HIGH PRIORITY", 18);
+ break;
+ case PFS_TL_READ_NO_INSERT:
+ PFS_engine_table::set_field_varchar_utf8(f, "READ NO INSERT", 14);
+ break;
+ case PFS_TL_WRITE_ALLOW_WRITE:
+ PFS_engine_table::set_field_varchar_utf8(f, "WRITE ALLOW WRITE", 17);
+ break;
+ case PFS_TL_WRITE_CONCURRENT_INSERT:
+ PFS_engine_table::set_field_varchar_utf8(f, "WRITE CONCURRENT INSERT", 23);
+ break;
+ case PFS_TL_WRITE_LOW_PRIORITY:
+ PFS_engine_table::set_field_varchar_utf8(f, "WRITE LOW PRIORITY", 18);
+ break;
+ case PFS_TL_WRITE:
+ PFS_engine_table::set_field_varchar_utf8(f, "WRITE", 5);
+ break;
+ case PFS_TL_READ_EXTERNAL:
+ PFS_engine_table::set_field_varchar_utf8(f, "READ EXTERNAL", 13);
+ break;
+ case PFS_TL_WRITE_EXTERNAL:
+ PFS_engine_table::set_field_varchar_utf8(f, "WRITE EXTERNAL", 14);
+ break;
+ case PFS_TL_NONE:
+ f->set_null();
+ break;
+ default:
+ DBUG_ASSERT(false);
+ }
+}
+
+void set_field_mdl_type(Field *f, opaque_mdl_type mdl_type)
+{
+ enum_mdl_type e= (enum_mdl_type) mdl_type;
+ switch (e)
+ {
+ case MDL_INTENTION_EXCLUSIVE:
+ PFS_engine_table::set_field_varchar_utf8(f, "INTENTION_EXCLUSIVE", 19);
+ break;
+ case MDL_SHARED:
+ PFS_engine_table::set_field_varchar_utf8(f, "SHARED", 6);
+ break;
+ case MDL_SHARED_HIGH_PRIO:
+ PFS_engine_table::set_field_varchar_utf8(f, "SHARED_HIGH_PRIO", 16);
+ break;
+ case MDL_SHARED_READ:
+ PFS_engine_table::set_field_varchar_utf8(f, "SHARED_READ", 11);
+ break;
+ case MDL_SHARED_WRITE:
+ PFS_engine_table::set_field_varchar_utf8(f, "SHARED_WRITE", 12);
+ break;
+ case MDL_SHARED_UPGRADABLE:
+ PFS_engine_table::set_field_varchar_utf8(f, "SHARED_UPGRADABLE", 17);
+ break;
+ case MDL_SHARED_NO_WRITE:
+ PFS_engine_table::set_field_varchar_utf8(f, "SHARED_NO_WRITE", 15);
+ break;
+ case MDL_SHARED_NO_READ_WRITE:
+ PFS_engine_table::set_field_varchar_utf8(f, "SHARED_NO_READ_WRITE", 20);
+ break;
+ case MDL_EXCLUSIVE:
+ PFS_engine_table::set_field_varchar_utf8(f, "EXCLUSIVE", 9);
+ break;
+ default:
+ DBUG_ASSERT(false);
+ }
+}
+
+void set_field_mdl_duration(Field *f, opaque_mdl_duration mdl_duration)
+{
+ enum_mdl_duration e= (enum_mdl_duration) mdl_duration;
+ switch (e)
+ {
+ case MDL_STATEMENT:
+ PFS_engine_table::set_field_varchar_utf8(f, "STATEMENT", 9);
+ break;
+ case MDL_TRANSACTION:
+ PFS_engine_table::set_field_varchar_utf8(f, "TRANSACTION", 11);
+ break;
+ case MDL_EXPLICIT:
+ PFS_engine_table::set_field_varchar_utf8(f, "EXPLICIT", 8);
+ break;
+ case MDL_DURATION_END:
+ default:
+ DBUG_ASSERT(false);
+ }
+}
+
+void set_field_mdl_status(Field *f, opaque_mdl_status mdl_status)
+{
+ enum_psi_status e= static_cast<enum_psi_status>(mdl_status);
+ switch (e)
+ {
+ case PENDING:
+ PFS_engine_table::set_field_varchar_utf8(f, "PENDING", 7);
+ break;
+ case GRANTED:
+ PFS_engine_table::set_field_varchar_utf8(f, "GRANTED", 7);
+ break;
+ case PRE_ACQUIRE_NOTIFY:
+ PFS_engine_table::set_field_varchar_utf8(f, "PRE_ACQUIRE_NOTIFY", 18);
+ break;
+ case POST_RELEASE_NOTIFY:
+ PFS_engine_table::set_field_varchar_utf8(f, "POST_RELEASE_NOTIFY", 19);
+ break;
+ default:
+ DBUG_ASSERT(false);
+ }
+}
+
+void PFS_memory_stat_row::set_field(uint index, Field *f)
+{
+ ssize_t val;
+
+ switch (index)
+ {
+ case 0: /* COUNT_ALLOC */
+ PFS_engine_table::set_field_ulonglong(f, m_stat.m_alloc_count);
+ break;
+ case 1: /* COUNT_FREE */
+ PFS_engine_table::set_field_ulonglong(f, m_stat.m_free_count);
+ break;
+ case 2: /* SUM_NUMBER_OF_BYTES_ALLOC */
+ PFS_engine_table::set_field_ulonglong(f, m_stat.m_alloc_size);
+ break;
+ case 3: /* SUM_NUMBER_OF_BYTES_FREE */
+ PFS_engine_table::set_field_ulonglong(f, m_stat.m_free_size);
+ break;
+ case 4: /* LOW_COUNT_USED */
+ val= m_stat.m_alloc_count - m_stat.m_free_count - m_stat.m_free_count_capacity;
+ PFS_engine_table::set_field_longlong(f, val);
+ break;
+ case 5: /* CURRENT_COUNT_USED */
+ val= m_stat.m_alloc_count - m_stat.m_free_count;
+ PFS_engine_table::set_field_longlong(f, val);
+ break;
+ case 6: /* HIGH_COUNT_USED */
+ val= m_stat.m_alloc_count - m_stat.m_free_count + m_stat.m_alloc_count_capacity;
+ PFS_engine_table::set_field_longlong(f, val);
+ break;
+ case 7: /* LOW_NUMBER_OF_BYTES_USED */
+ val= m_stat.m_alloc_size - m_stat.m_free_size - m_stat.m_free_size_capacity;
+ PFS_engine_table::set_field_longlong(f, val);
+ break;
+ case 8: /* CURRENT_NUMBER_OF_BYTES_USED */
+ val= m_stat.m_alloc_size - m_stat.m_free_size;
+ PFS_engine_table::set_field_longlong(f, val);
+ break;
+ case 9: /* HIGH_NUMBER_OF_BYTES_USED */
+ val= m_stat.m_alloc_size - m_stat.m_free_size + m_stat.m_alloc_size_capacity;
+ PFS_engine_table::set_field_longlong(f, val);
+ break;
+ default:
+ DBUG_ASSERT(false);
+ break;
+ }
+}
+
+void set_field_isolation_level(Field *f, enum_isolation_level iso_level)
+{
+ switch (iso_level)
+ {
+ case TRANS_LEVEL_READ_UNCOMMITTED:
+ PFS_engine_table::set_field_varchar_utf8(f, "READ UNCOMMITTED", 16);
+ break;
+ case TRANS_LEVEL_READ_COMMITTED:
+ PFS_engine_table::set_field_varchar_utf8(f, "READ COMMITTED", 14);
+ break;
+ case TRANS_LEVEL_REPEATABLE_READ:
+ PFS_engine_table::set_field_varchar_utf8(f, "REPEATABLE READ", 15);
+ break;
+ case TRANS_LEVEL_SERIALIZABLE:
+ PFS_engine_table::set_field_varchar_utf8(f, "SERIALIZABLE", 12);
+ break;
+ default:
+ DBUG_ASSERT(false);
+ }
+}
+
+void set_field_xa_state(Field *f, enum_xa_transaction_state xa_state)
+{
+ switch (xa_state)
+ {
+ case TRANS_STATE_XA_NOTR:
+ PFS_engine_table::set_field_varchar_utf8(f, "NOTR", 4);
+ break;
+ case TRANS_STATE_XA_ACTIVE:
+ PFS_engine_table::set_field_varchar_utf8(f, "ACTIVE", 6);
+ break;
+ case TRANS_STATE_XA_IDLE:
+ PFS_engine_table::set_field_varchar_utf8(f, "IDLE", 4);
+ break;
+ case TRANS_STATE_XA_PREPARED:
+ PFS_engine_table::set_field_varchar_utf8(f, "PREPARED", 8);
+ break;
+ case TRANS_STATE_XA_ROLLBACK_ONLY:
+ PFS_engine_table::set_field_varchar_utf8(f, "ROLLBACK ONLY", 13);
+ break;
+ case TRANS_STATE_XA_COMMITTED:
+ PFS_engine_table::set_field_varchar_utf8(f, "COMMITTED", 9);
+ break;
+ default:
+ DBUG_ASSERT(false);
+ }
+}
+
+void PFS_variable_name_row::make_row(const char* str, size_t length)
+{
+ DBUG_ASSERT(length <= sizeof(m_str));
+ DBUG_ASSERT(length <= NAME_CHAR_LEN);
+
+ m_length= MY_MIN(length, NAME_CHAR_LEN); /* enforce max name length */
+ if (m_length > 0)
+ memcpy(m_str, str, length);
+ m_str[m_length]= '\0';
+}
+
+void PFS_variable_value_row::make_row(const Status_variable *var)
+{
+ make_row(var->m_charset, var->m_value_str, var->m_value_length);
+}
+
+void PFS_variable_value_row::make_row(const System_variable *var)
+{
+ make_row(var->m_charset, var->m_value_str, var->m_value_length);
+}
+
+void PFS_variable_value_row::make_row(const CHARSET_INFO *cs, const char* str, size_t length)
+{
+ DBUG_ASSERT(cs != NULL);
+ DBUG_ASSERT(length <= sizeof(m_str));
+ if (length > 0)
+ {
+ memcpy(m_str, str, length);
+ }
+ m_length= length;
+ m_charset= cs;
+}
+
+void PFS_variable_value_row::set_field(Field *f)
+{
+ PFS_engine_table::set_field_varchar(f, m_charset, m_str, m_length);
+}
+
+void PFS_user_variable_value_row::clear()
+{
+ my_free(m_value);
+ m_value= NULL;
+ m_value_length= 0;
+}
+
+void PFS_user_variable_value_row::make_row(const char* val, size_t length)
+{
+ if (length > 0)
+ {
+ m_value= (char*) my_malloc(PSI_NOT_INSTRUMENTED, length, MYF(0));
+ m_value_length= length;
+ memcpy(m_value, val, length);
+ }
+ else
+ {
+ m_value= NULL;
+ m_value_length= 0;
}
}