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