1 /* Copyright (c) 2008, 2020, 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, version 2.0, 5 as published by the Free Software Foundation. 6 7 This program is also distributed with certain software (including 8 but not limited to OpenSSL) that is licensed under separate terms, 9 as designated in a particular file or component or in included license 10 documentation. The authors of MySQL hereby grant you an additional 11 permission to link the program and your derivative works with the 12 separately licensed software that they have included with MySQL. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License, version 2.0, for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software 21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ 22 23 #ifndef COMPONENTS_SERVICES_PSI_STATEMENT_BITS_H 24 #define COMPONENTS_SERVICES_PSI_STATEMENT_BITS_H 25 26 #ifndef MYSQL_ABI_CHECK 27 #include <stddef.h> /* size_t */ 28 #endif 29 30 /** 31 @file 32 Performance schema instrumentation interface. 33 34 @defgroup psi_abi_statement Statement Instrumentation (ABI) 35 @ingroup psi_abi 36 @{ 37 */ 38 39 /** 40 Instrumented statement key. 41 To instrument a statement, a statement key must be obtained using @c 42 register_statement. 43 Using a zero key always disable the instrumentation. 44 */ 45 typedef unsigned int PSI_statement_key; 46 47 /** 48 @def PSI_STATEMENT_VERSION_1 49 Performance Schema Statement Interface number for version 1. 50 This version is deprecated. 51 */ 52 #define PSI_STATEMENT_VERSION_1 1 53 54 /** 55 @def PSI_STATEMENT_VERSION_2 56 Performance Schema Statement Interface number for version 2. 57 This version is supported. 58 */ 59 #define PSI_STATEMENT_VERSION_2 2 60 61 /** 62 @def PSI_CURRENT_STATEMENT_VERSION 63 Performance Schema Statement Interface number for the most recent version. 64 The most current version is @c PSI_STATEMENT_VERSION_2 65 */ 66 #define PSI_CURRENT_STATEMENT_VERSION 2 67 68 /** 69 Interface for an instrumented statement. 70 This is an opaque structure. 71 */ 72 struct PSI_statement_locker; 73 typedef struct PSI_statement_locker PSI_statement_locker; 74 75 /** 76 Interface for an instrumented prepared statement. 77 This is an opaque structure. 78 */ 79 struct PSI_prepared_stmt; 80 typedef struct PSI_prepared_stmt PSI_prepared_stmt; 81 82 /** 83 Interface for an instrumented statement digest operation. 84 This is an opaque structure. 85 */ 86 struct PSI_digest_locker; 87 typedef struct PSI_digest_locker PSI_digest_locker; 88 89 /** 90 Interface for an instrumented stored procedure share. 91 This is an opaque structure. 92 */ 93 struct PSI_sp_share; 94 typedef struct PSI_sp_share PSI_sp_share; 95 96 /** 97 Interface for an instrumented stored program. 98 This is an opaque structure. 99 */ 100 struct PSI_sp_locker; 101 typedef struct PSI_sp_locker PSI_sp_locker; 102 103 /** 104 Statement instrument information. 105 @since PSI_STATEMENT_VERSION_1 106 This structure is used to register an instrumented statement. 107 */ 108 struct PSI_statement_info_v1 { 109 /** The registered statement key. */ 110 PSI_statement_key m_key; 111 /** The name of the statement instrument to register. */ 112 const char *m_name; 113 /** 114 The flags of the statement instrument to register. 115 @sa PSI_FLAG_MUTABLE 116 */ 117 unsigned int m_flags; 118 /** Documentation. */ 119 const char *m_documentation; 120 }; 121 typedef struct PSI_statement_info_v1 PSI_statement_info_v1; 122 123 /* Duplicate of NAME_LEN, to avoid dependency on mysql_com.h */ 124 #define PSI_SCHEMA_NAME_LEN (64 * 3) 125 126 /** 127 State data storage for @c get_thread_statement_locker_v1_t, 128 @c get_thread_statement_locker_v1_t. 129 This structure provide temporary storage to a statement locker. 130 The content of this structure is considered opaque, 131 the fields are only hints of what an implementation 132 of the psi interface can use. 133 This memory is provided by the instrumented code for performance reasons. 134 @sa get_thread_statement_locker_v1_t 135 */ 136 struct PSI_statement_locker_state_v1 { 137 /** Discarded flag. */ 138 bool m_discarded; 139 /** In prepare flag. */ 140 bool m_in_prepare; 141 /** Metric, no index used flag. */ 142 unsigned char m_no_index_used; 143 /** Metric, no good index used flag. */ 144 unsigned char m_no_good_index_used; 145 /** Internal state. */ 146 unsigned int m_flags; 147 /** Instrumentation class. */ 148 void *m_class; 149 /** Current thread. */ 150 struct PSI_thread *m_thread; 151 /** Timer start. */ 152 unsigned long long m_timer_start; 153 /** Timer function. */ 154 unsigned long long (*m_timer)(void); 155 /** Internal data. */ 156 void *m_statement; 157 /** Locked time. */ 158 unsigned long long m_lock_time; 159 /** Rows sent. */ 160 unsigned long long m_rows_sent; 161 /** Rows examined. */ 162 unsigned long long m_rows_examined; 163 /** Metric, temporary tables created on disk. */ 164 unsigned long m_created_tmp_disk_tables; 165 /** Metric, temporary tables created. */ 166 unsigned long m_created_tmp_tables; 167 /** Metric, number of select full join. */ 168 unsigned long m_select_full_join; 169 /** Metric, number of select full range join. */ 170 unsigned long m_select_full_range_join; 171 /** Metric, number of select range. */ 172 unsigned long m_select_range; 173 /** Metric, number of select range check. */ 174 unsigned long m_select_range_check; 175 /** Metric, number of select scan. */ 176 unsigned long m_select_scan; 177 /** Metric, number of sort merge passes. */ 178 unsigned long m_sort_merge_passes; 179 /** Metric, number of sort merge. */ 180 unsigned long m_sort_range; 181 /** Metric, number of sort rows. */ 182 unsigned long m_sort_rows; 183 /** Metric, number of sort scans. */ 184 unsigned long m_sort_scan; 185 /** Statement digest. */ 186 const struct sql_digest_storage *m_digest; 187 /** Current schema name. */ 188 char m_schema_name[PSI_SCHEMA_NAME_LEN]; 189 /** Length in bytes of @c m_schema_name. */ 190 unsigned int m_schema_name_length; 191 /** Statement character set number. */ 192 unsigned int m_cs_number; 193 /** Statement query sample. */ 194 const char *m_query_sample; 195 /** Length in bytes of @c m_query_sample. */ 196 unsigned int m_query_sample_length; 197 /** True if @c m_query_sample was truncated. */ 198 bool m_query_sample_truncated; 199 200 PSI_sp_share *m_parent_sp_share; 201 PSI_prepared_stmt *m_parent_prepared_stmt; 202 }; 203 typedef struct PSI_statement_locker_state_v1 PSI_statement_locker_state_v1; 204 205 struct PSI_sp_locker_state_v1 { 206 /** Internal state. */ 207 unsigned int m_flags; 208 /** Current thread. */ 209 struct PSI_thread *m_thread; 210 /** Timer start. */ 211 unsigned long long m_timer_start; 212 /** Timer function. */ 213 unsigned long long (*m_timer)(void); 214 /** Stored Procedure share. */ 215 PSI_sp_share *m_sp_share; 216 }; 217 typedef struct PSI_sp_locker_state_v1 PSI_sp_locker_state_v1; 218 219 /** 220 Statement registration API. 221 @param category a category name 222 @param info an array of statement info to register 223 @param count the size of the info array 224 */ 225 typedef void (*register_statement_v1_t)(const char *category, 226 struct PSI_statement_info_v1 *info, 227 int count); 228 229 /** 230 Get a statement instrumentation locker. 231 @param state data storage for the locker 232 @param key the statement instrumentation key 233 @param charset client character set 234 @return a statement locker, or NULL 235 */ 236 typedef struct PSI_statement_locker *(*get_thread_statement_locker_v1_t)( 237 struct PSI_statement_locker_state_v1 *state, PSI_statement_key key, 238 const void *charset, PSI_sp_share *sp_share); 239 240 /** 241 Refine a statement locker to a more specific key. 242 Note that only events declared mutable can be refined. 243 @param locker the statement locker for the current event 244 @param key the new key for the event 245 @sa PSI_FLAG_MUTABLE 246 */ 247 typedef struct PSI_statement_locker *(*refine_statement_v1_t)( 248 struct PSI_statement_locker *locker, PSI_statement_key key); 249 250 /** 251 Start a new statement event. 252 @param locker the statement locker for this event 253 @param db the active database name for this statement 254 @param db_length the active database name length for this statement 255 @param src_file source file name 256 @param src_line source line number 257 */ 258 typedef void (*start_statement_v1_t)(struct PSI_statement_locker *locker, 259 const char *db, unsigned int db_length, 260 const char *src_file, 261 unsigned int src_line); 262 263 /** 264 Set the statement text for a statement event. 265 Note that the statement text pointer must remain valid until end statement 266 is called. 267 @param locker the current statement locker 268 @param text the statement text 269 @param text_len the statement text length 270 */ 271 typedef void (*set_statement_text_v1_t)(struct PSI_statement_locker *locker, 272 const char *text, 273 unsigned int text_len); 274 275 /** 276 Set a statement query id. 277 Introduced in MySQL 8.0.14 278 @param locker the statement locker 279 @param query_id the query id 280 */ 281 typedef void (*set_statement_query_id_t)(struct PSI_statement_locker *locker, 282 unsigned long long query_id); 283 284 /** 285 Set a statement event lock time. 286 @param locker the statement locker 287 @param lock_time the locked time, in microseconds 288 */ 289 typedef void (*set_statement_lock_time_t)(struct PSI_statement_locker *locker, 290 unsigned long long lock_time); 291 292 /** 293 Set a statement event rows sent metric. 294 @param locker the statement locker 295 @param count the number of rows sent 296 */ 297 typedef void (*set_statement_rows_sent_t)(struct PSI_statement_locker *locker, 298 unsigned long long count); 299 300 /** 301 Set a statement event rows examined metric. 302 @param locker the statement locker 303 @param count the number of rows examined 304 */ 305 typedef void (*set_statement_rows_examined_t)( 306 struct PSI_statement_locker *locker, unsigned long long count); 307 308 /** 309 Increment a statement event "created tmp disk tables" metric. 310 @param locker the statement locker 311 @param count the metric increment value 312 */ 313 typedef void (*inc_statement_created_tmp_disk_tables_t)( 314 struct PSI_statement_locker *locker, unsigned long count); 315 316 /** 317 Increment a statement event "created tmp tables" metric. 318 @param locker the statement locker 319 @param count the metric increment value 320 */ 321 typedef void (*inc_statement_created_tmp_tables_t)( 322 struct PSI_statement_locker *locker, unsigned long count); 323 324 /** 325 Increment a statement event "select full join" metric. 326 @param locker the statement locker 327 @param count the metric increment value 328 */ 329 typedef void (*inc_statement_select_full_join_t)( 330 struct PSI_statement_locker *locker, unsigned long count); 331 332 /** 333 Increment a statement event "select full range join" metric. 334 @param locker the statement locker 335 @param count the metric increment value 336 */ 337 typedef void (*inc_statement_select_full_range_join_t)( 338 struct PSI_statement_locker *locker, unsigned long count); 339 340 /** 341 Increment a statement event "select range join" metric. 342 @param locker the statement locker 343 @param count the metric increment value 344 */ 345 typedef void (*inc_statement_select_range_t)( 346 struct PSI_statement_locker *locker, unsigned long count); 347 348 /** 349 Increment a statement event "select range check" metric. 350 @param locker the statement locker 351 @param count the metric increment value 352 */ 353 typedef void (*inc_statement_select_range_check_t)( 354 struct PSI_statement_locker *locker, unsigned long count); 355 356 /** 357 Increment a statement event "select scan" metric. 358 @param locker the statement locker 359 @param count the metric increment value 360 */ 361 typedef void (*inc_statement_select_scan_t)(struct PSI_statement_locker *locker, 362 unsigned long count); 363 364 /** 365 Increment a statement event "sort merge passes" metric. 366 @param locker the statement locker 367 @param count the metric increment value 368 */ 369 typedef void (*inc_statement_sort_merge_passes_t)( 370 struct PSI_statement_locker *locker, unsigned long count); 371 372 /** 373 Increment a statement event "sort range" metric. 374 @param locker the statement locker 375 @param count the metric increment value 376 */ 377 typedef void (*inc_statement_sort_range_t)(struct PSI_statement_locker *locker, 378 unsigned long count); 379 380 /** 381 Increment a statement event "sort rows" metric. 382 @param locker the statement locker 383 @param count the metric increment value 384 */ 385 typedef void (*inc_statement_sort_rows_t)(struct PSI_statement_locker *locker, 386 unsigned long count); 387 388 /** 389 Increment a statement event "sort scan" metric. 390 @param locker the statement locker 391 @param count the metric increment value 392 */ 393 typedef void (*inc_statement_sort_scan_t)(struct PSI_statement_locker *locker, 394 unsigned long count); 395 396 /** 397 Set a statement event "no index used" metric. 398 @param locker the statement locker 399 */ 400 typedef void (*set_statement_no_index_used_t)( 401 struct PSI_statement_locker *locker); 402 403 /** 404 Set a statement event "no good index used" metric. 405 @param locker the statement locker 406 */ 407 typedef void (*set_statement_no_good_index_used_t)( 408 struct PSI_statement_locker *locker); 409 410 /** 411 End a statement event. 412 @param locker the statement locker 413 @param stmt_da the statement diagnostics area. 414 @sa Diagnostics_area 415 */ 416 typedef void (*end_statement_v1_t)(struct PSI_statement_locker *locker, 417 void *stmt_da); 418 419 /** 420 Get a prepare statement. 421 @param locker a statement locker for the running thread. 422 */ 423 typedef PSI_prepared_stmt *(*create_prepared_stmt_v1_t)( 424 void *identity, unsigned int stmt_id, PSI_statement_locker *locker, 425 const char *stmt_name, size_t stmt_name_length, const char *name, 426 size_t length); 427 428 /** 429 destroy a prepare statement. 430 @param prepared_stmt prepared statement. 431 */ 432 typedef void (*destroy_prepared_stmt_v1_t)(PSI_prepared_stmt *prepared_stmt); 433 434 /** 435 repreare a prepare statement. 436 @param prepared_stmt prepared statement. 437 */ 438 typedef void (*reprepare_prepared_stmt_v1_t)(PSI_prepared_stmt *prepared_stmt); 439 440 /** 441 Record a prepare statement instrumentation execute event. 442 @param locker a statement locker for the running thread. 443 @param prepared_stmt prepared statement. 444 */ 445 typedef void (*execute_prepared_stmt_v1_t)(PSI_statement_locker *locker, 446 PSI_prepared_stmt *prepared_stmt); 447 448 /** 449 Set the statement text for a prepared statment event. 450 @param prepared_stmt prepared statement. 451 @param text the prepared statement text 452 @param text_len the prepared statement text length 453 */ 454 typedef void (*set_prepared_stmt_text_v1_t)(PSI_prepared_stmt *prepared_stmt, 455 const char *text, 456 unsigned int text_len); 457 /** 458 Get a digest locker for the current statement. 459 @param locker a statement locker for the running thread 460 */ 461 typedef struct PSI_digest_locker *(*digest_start_v1_t)( 462 struct PSI_statement_locker *locker); 463 464 /** 465 Add a computed digest to the current digest instrumentation. 466 @param locker a digest locker for the current statement 467 @param digest the computed digest 468 */ 469 typedef void (*digest_end_v1_t)(struct PSI_digest_locker *locker, 470 const struct sql_digest_storage *digest); 471 472 /** 473 Acquire a sp share instrumentation. 474 @param object_type type of stored program 475 @param schema_name schema name of stored program 476 @param schema_name_length length of schema_name 477 @param object_name object name of stored program 478 @param object_name_length length of object_name 479 @return a stored program share instrumentation, or NULL 480 */ 481 typedef struct PSI_sp_share *(*get_sp_share_v1_t)( 482 unsigned int object_type, const char *schema_name, 483 unsigned int schema_name_length, const char *object_name, 484 unsigned int object_name_length); 485 486 /** 487 Release a stored program share. 488 @param share the stored program share to release 489 */ 490 typedef void (*release_sp_share_v1_t)(struct PSI_sp_share *share); 491 492 typedef PSI_sp_locker *(*start_sp_v1_t)(struct PSI_sp_locker_state_v1 *state, 493 struct PSI_sp_share *sp_share); 494 495 typedef void (*end_sp_v1_t)(struct PSI_sp_locker *locker); 496 497 typedef void (*drop_sp_v1_t)(unsigned int object_type, const char *schema_name, 498 unsigned int schema_name_length, 499 const char *object_name, 500 unsigned int object_name_length); 501 502 typedef struct PSI_statement_info_v1 PSI_statement_info; 503 typedef struct PSI_statement_locker_state_v1 PSI_statement_locker_state; 504 typedef struct PSI_sp_locker_state_v1 PSI_sp_locker_state; 505 506 /** @} (end of group psi_abi_statement) */ 507 508 #endif /* COMPONENTS_SERVICES_PSI_STATEMENT_BITS_H */ 509