1typedef uint64_t my_ulonglong;
2typedef int my_socket;
3#include "field_types.h"
4enum enum_field_types
5{ MYSQL_TYPE_DECIMAL,
6  MYSQL_TYPE_TINY,
7  MYSQL_TYPE_SHORT,
8  MYSQL_TYPE_LONG,
9  MYSQL_TYPE_FLOAT,
10  MYSQL_TYPE_DOUBLE,
11  MYSQL_TYPE_NULL,
12  MYSQL_TYPE_TIMESTAMP,
13  MYSQL_TYPE_LONGLONG,
14  MYSQL_TYPE_INT24,
15  MYSQL_TYPE_DATE,
16  MYSQL_TYPE_TIME,
17  MYSQL_TYPE_DATETIME,
18  MYSQL_TYPE_YEAR,
19  MYSQL_TYPE_NEWDATE,
20  MYSQL_TYPE_VARCHAR,
21  MYSQL_TYPE_BIT,
22  MYSQL_TYPE_TIMESTAMP2,
23  MYSQL_TYPE_DATETIME2,
24  MYSQL_TYPE_TIME2,
25  MYSQL_TYPE_TYPED_ARRAY,
26  MYSQL_TYPE_JSON = 245,
27  MYSQL_TYPE_NEWDECIMAL = 246,
28  MYSQL_TYPE_ENUM = 247,
29  MYSQL_TYPE_SET = 248,
30  MYSQL_TYPE_TINY_BLOB = 249,
31  MYSQL_TYPE_MEDIUM_BLOB = 250,
32  MYSQL_TYPE_LONG_BLOB = 251,
33  MYSQL_TYPE_BLOB = 252,
34  MYSQL_TYPE_VAR_STRING = 253,
35  MYSQL_TYPE_STRING = 254,
36  MYSQL_TYPE_GEOMETRY = 255 };
37typedef enum enum_field_types enum_field_types;
38#include "my_list.h"
39typedef struct LIST {
40  struct LIST *prev, *next;
41  void *data;
42} LIST;
43typedef int (*list_walk_action)(void *, void *);
44extern LIST *list_add(LIST *root, LIST *element);
45extern LIST *list_delete(LIST *root, LIST *element);
46extern LIST *list_cons(void *data, LIST *root);
47extern LIST *list_reverse(LIST *root);
48extern void list_free(LIST *root, unsigned int free_data);
49extern unsigned int list_length(LIST *);
50extern int list_walk(LIST *, list_walk_action action, unsigned char *argument);
51#include "mysql_com.h"
52#include "my_command.h"
53enum enum_server_command {
54  COM_SLEEP,
55  COM_QUIT,
56  COM_INIT_DB,
57  COM_QUERY,
58  COM_FIELD_LIST,
59  COM_CREATE_DB,
60  COM_DROP_DB,
61  COM_REFRESH,
62  COM_DEPRECATED_1,
63  COM_STATISTICS,
64  COM_PROCESS_INFO,
65  COM_CONNECT,
66  COM_PROCESS_KILL,
67  COM_DEBUG,
68  COM_PING,
69  COM_TIME,
70  COM_DELAYED_INSERT,
71  COM_CHANGE_USER,
72  COM_BINLOG_DUMP,
73  COM_TABLE_DUMP,
74  COM_CONNECT_OUT,
75  COM_REGISTER_SLAVE,
76  COM_STMT_PREPARE,
77  COM_STMT_EXECUTE,
78  COM_STMT_SEND_LONG_DATA,
79  COM_STMT_CLOSE,
80  COM_STMT_RESET,
81  COM_SET_OPTION,
82  COM_STMT_FETCH,
83  COM_DAEMON,
84  COM_BINLOG_DUMP_GTID,
85  COM_RESET_CONNECTION,
86  COM_CLONE,
87  COM_END
88};
89#include "my_compress.h"
90enum enum_compression_algorithm {
91  MYSQL_UNCOMPRESSED = 1,
92  MYSQL_ZLIB,
93  MYSQL_ZSTD,
94  MYSQL_INVALID
95};
96typedef struct mysql_zlib_compress_context {
97  unsigned int compression_level;
98} mysql_zlib_compress_context;
99typedef struct ZSTD_CCtx_s ZSTD_CCtx;
100typedef struct ZSTD_DCtx_s ZSTD_DCtx;
101typedef struct mysql_zstd_compress_context {
102  ZSTD_CCtx *cctx;
103  ZSTD_DCtx *dctx;
104  unsigned int compression_level;
105} mysql_zstd_compress_context;
106typedef struct mysql_compress_context {
107  enum enum_compression_algorithm algorithm;
108  union {
109    mysql_zlib_compress_context zlib_ctx;
110    mysql_zstd_compress_context zstd_ctx;
111  } u;
112} mysql_compress_context;
113unsigned int mysql_default_compression_level(
114    enum enum_compression_algorithm algorithm);
115void mysql_compress_context_init(mysql_compress_context *cmp_ctx,
116                                 enum enum_compression_algorithm algorithm,
117                                 unsigned int compression_level);
118void mysql_compress_context_deinit(mysql_compress_context *mysql_compress_ctx);
119enum SERVER_STATUS_flags_enum {
120  SERVER_STATUS_IN_TRANS = 1,
121  SERVER_STATUS_AUTOCOMMIT = 2,
122  SERVER_MORE_RESULTS_EXISTS = 8,
123  SERVER_QUERY_NO_GOOD_INDEX_USED = 16,
124  SERVER_QUERY_NO_INDEX_USED = 32,
125  SERVER_STATUS_CURSOR_EXISTS = 64,
126  SERVER_STATUS_LAST_ROW_SENT = 128,
127  SERVER_STATUS_DB_DROPPED = 256,
128  SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512,
129  SERVER_STATUS_METADATA_CHANGED = 1024,
130  SERVER_QUERY_WAS_SLOW = 2048,
131  SERVER_PS_OUT_PARAMS = 4096,
132  SERVER_STATUS_IN_TRANS_READONLY = 8192,
133  SERVER_SESSION_STATE_CHANGED = (1UL << 14)
134};
135struct Vio;
136typedef struct NET {
137  struct Vio * vio;
138  unsigned char *buff, *buff_end, *write_pos, *read_pos;
139  my_socket fd;
140  unsigned long remain_in_buf, length, buf_length, where_b;
141  unsigned long max_packet, max_packet_size;
142  unsigned int pkt_nr, compress_pkt_nr;
143  unsigned int write_timeout, read_timeout, retry_count;
144  int fcntl;
145  unsigned int *return_status;
146  unsigned char reading_or_writing;
147  unsigned char save_char;
148  bool compress;
149  unsigned int last_errno;
150  unsigned char error;
151  char last_error[512];
152  char sqlstate[5 + 1];
153  void *extension;
154} NET;
155enum mysql_enum_shutdown_level {
156  SHUTDOWN_DEFAULT = 0,
157  SHUTDOWN_WAIT_CONNECTIONS = (unsigned char)(1 << 0),
158  SHUTDOWN_WAIT_TRANSACTIONS = (unsigned char)(1 << 1),
159  SHUTDOWN_WAIT_UPDATES = (unsigned char)(1 << 3),
160  SHUTDOWN_WAIT_ALL_BUFFERS = ((unsigned char)(1 << 3) << 1),
161  SHUTDOWN_WAIT_CRITICAL_BUFFERS = ((unsigned char)(1 << 3) << 1) + 1,
162  KILL_QUERY = 254,
163  KILL_CONNECTION = 255
164};
165enum enum_resultset_metadata {
166  RESULTSET_METADATA_NONE = 0,
167  RESULTSET_METADATA_FULL = 1
168};
169enum enum_cursor_type {
170  CURSOR_TYPE_NO_CURSOR = 0,
171  CURSOR_TYPE_READ_ONLY = 1,
172  CURSOR_TYPE_FOR_UPDATE = 2,
173  CURSOR_TYPE_SCROLLABLE = 4
174};
175enum enum_mysql_set_option {
176  MYSQL_OPTION_MULTI_STATEMENTS_ON,
177  MYSQL_OPTION_MULTI_STATEMENTS_OFF
178};
179enum enum_session_state_type {
180  SESSION_TRACK_SYSTEM_VARIABLES,
181  SESSION_TRACK_SCHEMA,
182  SESSION_TRACK_STATE_CHANGE,
183  SESSION_TRACK_GTIDS,
184  SESSION_TRACK_TRANSACTION_CHARACTERISTICS,
185  SESSION_TRACK_TRANSACTION_STATE
186};
187bool my_net_init(struct NET *net, struct Vio * vio);
188void my_net_local_init(struct NET *net);
189void net_end(struct NET *net);
190void net_clear(struct NET *net, bool check_buffer);
191void net_claim_memory_ownership(struct NET *net);
192bool net_realloc(struct NET *net, size_t length);
193bool net_flush(struct NET *net);
194bool my_net_write(struct NET *net, const unsigned char *packet, size_t len);
195bool net_write_command(struct NET *net, unsigned char command,
196                       const unsigned char *header, size_t head_len,
197                       const unsigned char *packet, size_t len);
198bool net_write_packet(struct NET *net, const unsigned char *packet,
199                      size_t length);
200unsigned long my_net_read(struct NET *net);
201void my_net_set_write_timeout(struct NET *net, unsigned int timeout);
202void my_net_set_read_timeout(struct NET *net, unsigned int timeout);
203void my_net_set_retry_count(struct NET *net, unsigned int retry_count);
204struct rand_struct {
205  unsigned long seed1, seed2, max_value;
206  double max_value_dbl;
207};
208#include "mysql/udf_registration_types.h"
209enum Item_result {
210  INVALID_RESULT = -1,
211  STRING_RESULT = 0,
212  REAL_RESULT,
213  INT_RESULT,
214  ROW_RESULT,
215  DECIMAL_RESULT
216};
217typedef struct UDF_ARGS {
218  unsigned int arg_count;
219  enum Item_result *arg_type;
220  char **args;
221  unsigned long *lengths;
222  char *maybe_null;
223  char **attributes;
224  unsigned long *attribute_lengths;
225  void *extension;
226} UDF_ARGS;
227typedef struct UDF_INIT {
228  bool maybe_null;
229  unsigned int decimals;
230  unsigned long max_length;
231  char *ptr;
232  bool const_item;
233  void *extension;
234} UDF_INIT;
235enum Item_udftype { UDFTYPE_FUNCTION = 1, UDFTYPE_AGGREGATE };
236typedef void (*Udf_func_clear)(UDF_INIT *, unsigned char *, unsigned char *);
237typedef void (*Udf_func_add)(UDF_INIT *, UDF_ARGS *, unsigned char *,
238                             unsigned char *);
239typedef void (*Udf_func_deinit)(UDF_INIT *);
240typedef bool (*Udf_func_init)(UDF_INIT *, UDF_ARGS *, char *);
241typedef void (*Udf_func_any)(void);
242typedef double (*Udf_func_double)(UDF_INIT *, UDF_ARGS *, unsigned char *,
243                                  unsigned char *);
244typedef long long (*Udf_func_longlong)(UDF_INIT *, UDF_ARGS *, unsigned char *,
245                                       unsigned char *);
246typedef char *(*Udf_func_string)(UDF_INIT *, UDF_ARGS *, char *,
247                                 unsigned long *, unsigned char *,
248                                 unsigned char *);
249void randominit(struct rand_struct *, unsigned long seed1, unsigned long seed2);
250double my_rnd(struct rand_struct *);
251void create_random_string(char *to, unsigned int length,
252                          struct rand_struct *rand_st);
253void hash_password(unsigned long *to, const char *password,
254                   unsigned int password_len);
255void make_scrambled_password_323(char *to, const char *password);
256void scramble_323(char *to, const char *message, const char *password);
257bool check_scramble_323(const unsigned char *reply, const char *message,
258                        unsigned long *salt);
259void get_salt_from_password_323(unsigned long *res, const char *password);
260void make_password_from_salt_323(char *to, const unsigned long *salt);
261void make_scrambled_password(char *to, const char *password);
262void scramble(char *to, const char *message, const char *password);
263bool check_scramble(const unsigned char *reply, const char *message,
264                    const unsigned char *hash_stage2);
265void get_salt_from_password(unsigned char *res, const char *password);
266void make_password_from_salt(char *to, const unsigned char *hash_stage2);
267char *octet2hex(char *to, const char *str, unsigned int len);
268bool generate_sha256_scramble(unsigned char *dst, size_t dst_size,
269                              const char *src, size_t src_size, const char *rnd,
270                              size_t rnd_size);
271char *get_tty_password(const char *opt_message);
272const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
273bool my_thread_init(void);
274void my_thread_end(void);
275unsigned long net_field_length(unsigned char **packet);
276unsigned long net_field_length_checked(unsigned char **packet,
277                                               unsigned long max_length);
278uint64_t net_field_length_ll(unsigned char **packet);
279unsigned char *net_store_length(unsigned char *pkg, unsigned long long length);
280unsigned int net_length_size(unsigned long long num);
281unsigned int net_field_length_size(const unsigned char *pos);
282#include "mysql/client_plugin.h"
283struct st_mysql_client_plugin {
284  int type; unsigned int interface_version; const char *name; const char *author; const char *desc; unsigned int version[3]; const char *license; void *mysql_api; int (*init)(char *, size_t, int, va_list); int (*deinit)(void); int (*options)(const char *option, const void *);
285};
286struct MYSQL;
287#include "plugin_auth_common.h"
288struct MYSQL_PLUGIN_VIO_INFO {
289  enum {
290    MYSQL_VIO_INVALID,
291    MYSQL_VIO_TCP,
292    MYSQL_VIO_SOCKET,
293    MYSQL_VIO_PIPE,
294    MYSQL_VIO_MEMORY
295  } protocol;
296  int socket;
297};
298enum net_async_status {
299  NET_ASYNC_COMPLETE = 0,
300  NET_ASYNC_NOT_READY,
301  NET_ASYNC_ERROR,
302  NET_ASYNC_COMPLETE_NO_MORE_RESULTS
303};
304typedef struct MYSQL_PLUGIN_VIO {
305  int (*read_packet)(struct MYSQL_PLUGIN_VIO *vio, unsigned char **buf);
306  int (*write_packet)(struct MYSQL_PLUGIN_VIO *vio, const unsigned char *packet,
307                      int packet_len);
308  void (*info)(struct MYSQL_PLUGIN_VIO *vio,
309               struct MYSQL_PLUGIN_VIO_INFO *info);
310  enum net_async_status (*read_packet_nonblocking)(struct MYSQL_PLUGIN_VIO *vio,
311                                                   unsigned char **buf,
312                                                   int *result);
313  enum net_async_status (*write_packet_nonblocking)(
314      struct MYSQL_PLUGIN_VIO *vio, const unsigned char *pkt, int pkt_len,
315      int *result);
316} MYSQL_PLUGIN_VIO;
317struct auth_plugin_t {
318  int type; unsigned int interface_version; const char *name; const char *author; const char *desc; unsigned int version[3]; const char *license; void *mysql_api; int (*init)(char *, size_t, int, va_list); int (*deinit)(void); int (*options)(const char *option, const void *);
319  int (*authenticate_user)(MYSQL_PLUGIN_VIO *vio, struct MYSQL *mysql);
320  enum net_async_status (*authenticate_user_nonblocking)(MYSQL_PLUGIN_VIO *vio,
321                                                         struct MYSQL *mysql,
322                                                         int *result);
323};
324typedef struct auth_plugin_t st_mysql_client_plugin_AUTHENTICATION;
325struct st_mysql_client_plugin *mysql_load_plugin(struct MYSQL *mysql,
326                                                 const char *name, int type,
327                                                 int argc, ...);
328struct st_mysql_client_plugin *mysql_load_plugin_v(struct MYSQL *mysql,
329                                                   const char *name, int type,
330                                                   int argc, va_list args);
331struct st_mysql_client_plugin *mysql_client_find_plugin(struct MYSQL *mysql,
332                                                        const char *name,
333                                                        int type);
334struct st_mysql_client_plugin *mysql_client_register_plugin(
335    struct MYSQL *mysql, struct st_mysql_client_plugin *plugin);
336int mysql_plugin_options(struct st_mysql_client_plugin *plugin,
337                         const char *option, const void *value);
338#include "mysql_version.h"
339#include "mysql_time.h"
340enum enum_mysql_timestamp_type {
341  MYSQL_TIMESTAMP_NONE = -2,
342  MYSQL_TIMESTAMP_ERROR = -1,
343  MYSQL_TIMESTAMP_DATE = 0,
344  MYSQL_TIMESTAMP_DATETIME = 1,
345  MYSQL_TIMESTAMP_TIME = 2,
346  MYSQL_TIMESTAMP_DATETIME_TZ = 3
347};
348typedef struct MYSQL_TIME {
349  unsigned int year, month, day, hour, minute, second;
350  unsigned long second_part;
351  bool neg;
352  enum enum_mysql_timestamp_type time_type;
353  int time_zone_displacement;
354} MYSQL_TIME;
355#include "errmsg.h"
356void init_client_errs(void);
357void finish_client_errs(void);
358extern const char *client_errors[];
359static inline const char *ER_CLIENT(int client_errno) {
360  if (client_errno >= 2000 && client_errno <= 2069)
361    return client_errors[client_errno - 2000];
362  return client_errors[2000];
363}
364extern unsigned int mysql_port;
365extern char *mysql_unix_port;
366typedef struct MYSQL_FIELD {
367  char *name;
368  char *org_name;
369  char *table;
370  char *org_table;
371  char *db;
372  char *catalog;
373  char *def;
374  unsigned long length;
375  unsigned long max_length;
376  unsigned int name_length;
377  unsigned int org_name_length;
378  unsigned int table_length;
379  unsigned int org_table_length;
380  unsigned int db_length;
381  unsigned int catalog_length;
382  unsigned int def_length;
383  unsigned int flags;
384  unsigned int decimals;
385  unsigned int charsetnr;
386  enum enum_field_types type;
387  void *extension;
388} MYSQL_FIELD;
389typedef char **MYSQL_ROW;
390typedef unsigned int MYSQL_FIELD_OFFSET;
391typedef struct MYSQL_ROWS {
392  struct MYSQL_ROWS *next;
393  MYSQL_ROW data;
394  unsigned long length;
395} MYSQL_ROWS;
396typedef MYSQL_ROWS *MYSQL_ROW_OFFSET;
397struct MEM_ROOT;
398typedef struct MYSQL_DATA {
399  MYSQL_ROWS *data;
400  struct MEM_ROOT *alloc;
401  uint64_t rows;
402  unsigned int fields;
403} MYSQL_DATA;
404enum mysql_option {
405  MYSQL_OPT_CONNECT_TIMEOUT,
406  MYSQL_OPT_COMPRESS,
407  MYSQL_OPT_NAMED_PIPE,
408  MYSQL_INIT_COMMAND,
409  MYSQL_READ_DEFAULT_FILE,
410  MYSQL_READ_DEFAULT_GROUP,
411  MYSQL_SET_CHARSET_DIR,
412  MYSQL_SET_CHARSET_NAME,
413  MYSQL_OPT_LOCAL_INFILE,
414  MYSQL_OPT_PROTOCOL,
415  MYSQL_SHARED_MEMORY_BASE_NAME,
416  MYSQL_OPT_READ_TIMEOUT,
417  MYSQL_OPT_WRITE_TIMEOUT,
418  MYSQL_OPT_USE_RESULT,
419  MYSQL_REPORT_DATA_TRUNCATION,
420  MYSQL_OPT_RECONNECT,
421  MYSQL_PLUGIN_DIR,
422  MYSQL_DEFAULT_AUTH,
423  MYSQL_OPT_BIND,
424  MYSQL_OPT_SSL_KEY,
425  MYSQL_OPT_SSL_CERT,
426  MYSQL_OPT_SSL_CA,
427  MYSQL_OPT_SSL_CAPATH,
428  MYSQL_OPT_SSL_CIPHER,
429  MYSQL_OPT_SSL_CRL,
430  MYSQL_OPT_SSL_CRLPATH,
431  MYSQL_OPT_CONNECT_ATTR_RESET,
432  MYSQL_OPT_CONNECT_ATTR_ADD,
433  MYSQL_OPT_CONNECT_ATTR_DELETE,
434  MYSQL_SERVER_PUBLIC_KEY,
435  MYSQL_ENABLE_CLEARTEXT_PLUGIN,
436  MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
437  MYSQL_OPT_MAX_ALLOWED_PACKET,
438  MYSQL_OPT_NET_BUFFER_LENGTH,
439  MYSQL_OPT_TLS_VERSION,
440  MYSQL_OPT_SSL_MODE,
441  MYSQL_OPT_GET_SERVER_PUBLIC_KEY,
442  MYSQL_OPT_RETRY_COUNT,
443  MYSQL_OPT_OPTIONAL_RESULTSET_METADATA,
444  MYSQL_OPT_SSL_FIPS_MODE,
445  MYSQL_OPT_TLS_CIPHERSUITES,
446  MYSQL_OPT_COMPRESSION_ALGORITHMS,
447  MYSQL_OPT_ZSTD_COMPRESSION_LEVEL,
448  MYSQL_OPT_LOAD_DATA_LOCAL_DIR
449};
450struct st_mysql_options_extention;
451struct st_mysql_options {
452  unsigned int connect_timeout, read_timeout, write_timeout;
453  unsigned int port, protocol;
454  unsigned long client_flag;
455  char *host, *user, *password, *unix_socket, *db;
456  struct Init_commands_array *init_commands;
457  char *my_cnf_file, *my_cnf_group, *charset_dir, *charset_name;
458  char *ssl_key;
459  char *ssl_cert;
460  char *ssl_ca;
461  char *ssl_capath;
462  char *ssl_cipher;
463  char *shared_memory_base_name;
464  unsigned long max_allowed_packet;
465  bool compress, named_pipe;
466  char *bind_address;
467  bool report_data_truncation;
468  int (*local_infile_init)(void **, const char *, void *);
469  int (*local_infile_read)(void *, char *, unsigned int);
470  void (*local_infile_end)(void *);
471  int (*local_infile_error)(void *, char *, unsigned int);
472  void *local_infile_userdata;
473  struct st_mysql_options_extention *extension;
474};
475enum mysql_status {
476  MYSQL_STATUS_READY,
477  MYSQL_STATUS_GET_RESULT,
478  MYSQL_STATUS_USE_RESULT,
479  MYSQL_STATUS_STATEMENT_GET_RESULT
480};
481enum mysql_protocol_type {
482  MYSQL_PROTOCOL_DEFAULT,
483  MYSQL_PROTOCOL_TCP,
484  MYSQL_PROTOCOL_SOCKET,
485  MYSQL_PROTOCOL_PIPE,
486  MYSQL_PROTOCOL_MEMORY
487};
488enum mysql_ssl_mode {
489  SSL_MODE_DISABLED = 1,
490  SSL_MODE_PREFERRED,
491  SSL_MODE_REQUIRED,
492  SSL_MODE_VERIFY_CA,
493  SSL_MODE_VERIFY_IDENTITY
494};
495enum mysql_ssl_fips_mode {
496  SSL_FIPS_MODE_OFF = 0,
497  SSL_FIPS_MODE_ON = 1,
498  SSL_FIPS_MODE_STRICT
499};
500typedef struct character_set {
501  unsigned int number;
502  unsigned int state;
503  const char *csname;
504  const char *name;
505  const char *comment;
506  const char *dir;
507  unsigned int mbminlen;
508  unsigned int mbmaxlen;
509} MY_CHARSET_INFO;
510struct MYSQL_METHODS;
511struct MYSQL_STMT;
512typedef struct MYSQL {
513  NET net;
514  unsigned char *connector_fd;
515  char *host, *user, *passwd, *unix_socket, *server_version, *host_info;
516  char *info, *db;
517  struct CHARSET_INFO *charset;
518  MYSQL_FIELD *fields;
519  struct MEM_ROOT *field_alloc;
520  uint64_t affected_rows;
521  uint64_t insert_id;
522  uint64_t extra_info;
523  unsigned long thread_id;
524  unsigned long packet_length;
525  unsigned int port;
526  unsigned long client_flag, server_capabilities;
527  unsigned int protocol_version;
528  unsigned int field_count;
529  unsigned int server_status;
530  unsigned int server_language;
531  unsigned int warning_count;
532  struct st_mysql_options options;
533  enum mysql_status status;
534  enum enum_resultset_metadata resultset_metadata;
535  bool free_me;
536  bool reconnect;
537  char scramble[20 + 1];
538  LIST *stmts;
539  const struct MYSQL_METHODS *methods;
540  void *thd;
541  bool *unbuffered_fetch_owner;
542  void *extension;
543} MYSQL;
544typedef struct MYSQL_RES {
545  uint64_t row_count;
546  MYSQL_FIELD *fields;
547  struct MYSQL_DATA *data;
548  MYSQL_ROWS *data_cursor;
549  unsigned long *lengths;
550  MYSQL *handle;
551  const struct MYSQL_METHODS *methods;
552  MYSQL_ROW row;
553  MYSQL_ROW current_row;
554  struct MEM_ROOT *field_alloc;
555  unsigned int field_count, current_field;
556  bool eof;
557  bool unbuffered_fetch_cancelled;
558  enum enum_resultset_metadata metadata;
559  void *extension;
560} MYSQL_RES;
561typedef struct MYSQL_RPL {
562  size_t file_name_length;
563  const char *file_name;
564  uint64_t start_position;
565  unsigned int server_id;
566  unsigned int flags;
567  size_t gtid_set_encoded_size;
568  void (*fix_gtid_set)(struct MYSQL_RPL *rpl, unsigned char *packet_gtid_set);
569  void *gtid_set_arg;
570  unsigned long size;
571  const unsigned char *buffer;
572} MYSQL_RPL;
573int mysql_server_init(int argc, char **argv, char **groups);
574void mysql_server_end(void);
575bool mysql_thread_init(void);
576void mysql_thread_end(void);
577uint64_t mysql_num_rows(MYSQL_RES *res);
578unsigned int mysql_num_fields(MYSQL_RES *res);
579bool mysql_eof(MYSQL_RES *res);
580MYSQL_FIELD * mysql_fetch_field_direct(MYSQL_RES *res,
581                                              unsigned int fieldnr);
582MYSQL_FIELD * mysql_fetch_fields(MYSQL_RES *res);
583MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *res);
584MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *res);
585enum enum_resultset_metadata mysql_result_metadata(MYSQL_RES *result);
586unsigned int mysql_field_count(MYSQL *mysql);
587uint64_t mysql_affected_rows(MYSQL *mysql);
588uint64_t mysql_insert_id(MYSQL *mysql);
589unsigned int mysql_errno(MYSQL *mysql);
590const char * mysql_error(MYSQL *mysql);
591const char * mysql_sqlstate(MYSQL *mysql);
592unsigned int mysql_warning_count(MYSQL *mysql);
593const char * mysql_info(MYSQL *mysql);
594unsigned long mysql_thread_id(MYSQL *mysql);
595const char * mysql_character_set_name(MYSQL *mysql);
596int mysql_set_character_set(MYSQL *mysql, const char *csname);
597MYSQL * mysql_init(MYSQL *mysql);
598bool mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert,
599                           const char *ca, const char *capath,
600                           const char *cipher);
601const char * mysql_get_ssl_cipher(MYSQL *mysql);
602bool mysql_change_user(MYSQL *mysql, const char *user,
603                               const char *passwd, const char *db);
604MYSQL * mysql_real_connect(MYSQL *mysql, const char *host,
605                                  const char *user, const char *passwd,
606                                  const char *db, unsigned int port,
607                                  const char *unix_socket,
608                                  unsigned long clientflag);
609int mysql_select_db(MYSQL *mysql, const char *db);
610int mysql_query(MYSQL *mysql, const char *q);
611int mysql_send_query(MYSQL *mysql, const char *q, unsigned long length);
612int mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);
613MYSQL_RES * mysql_store_result(MYSQL *mysql);
614MYSQL_RES * mysql_use_result(MYSQL *mysql);
615enum net_async_status mysql_real_connect_nonblocking(
616    MYSQL *mysql, const char *host, const char *user, const char *passwd,
617    const char *db, unsigned int port, const char *unix_socket,
618    unsigned long clientflag);
619enum net_async_status mysql_send_query_nonblocking(
620    MYSQL *mysql, const char *query, unsigned long length);
621enum net_async_status mysql_real_query_nonblocking(
622    MYSQL *mysql, const char *query, unsigned long length);
623enum net_async_status
624mysql_store_result_nonblocking(MYSQL *mysql, MYSQL_RES **result);
625enum net_async_status mysql_next_result_nonblocking(MYSQL *mysql);
626enum net_async_status mysql_select_db_nonblocking(MYSQL *mysql,
627                                                          const char *db,
628                                                          bool *error);
629void mysql_get_character_set_info(MYSQL *mysql,
630                                          MY_CHARSET_INFO *charset);
631int mysql_session_track_get_first(MYSQL *mysql,
632                                          enum enum_session_state_type type,
633                                          const char **data, size_t *length);
634int mysql_session_track_get_next(MYSQL *mysql,
635                                         enum enum_session_state_type type,
636                                         const char **data, size_t *length);
637void mysql_set_local_infile_handler(
638    MYSQL *mysql, int (*local_infile_init)(void **, const char *, void *),
639    int (*local_infile_read)(void *, char *, unsigned int),
640    void (*local_infile_end)(void *),
641    int (*local_infile_error)(void *, char *, unsigned int), void *);
642void mysql_set_local_infile_default(MYSQL *mysql);
643int mysql_shutdown(MYSQL *mysql,
644                           enum mysql_enum_shutdown_level shutdown_level);
645int mysql_dump_debug_info(MYSQL *mysql);
646int mysql_refresh(MYSQL *mysql, unsigned int refresh_options);
647int mysql_kill(MYSQL *mysql, unsigned long pid);
648int mysql_set_server_option(MYSQL *mysql,
649                                    enum enum_mysql_set_option option);
650int mysql_ping(MYSQL *mysql);
651const char * mysql_stat(MYSQL *mysql);
652const char * mysql_get_server_info(MYSQL *mysql);
653const char * mysql_get_client_info(void);
654unsigned long mysql_get_client_version(void);
655const char * mysql_get_host_info(MYSQL *mysql);
656unsigned long mysql_get_server_version(MYSQL *mysql);
657unsigned int mysql_get_proto_info(MYSQL *mysql);
658MYSQL_RES * mysql_list_dbs(MYSQL *mysql, const char *wild);
659MYSQL_RES * mysql_list_tables(MYSQL *mysql, const char *wild);
660MYSQL_RES * mysql_list_processes(MYSQL *mysql);
661int mysql_options(MYSQL *mysql, enum mysql_option option,
662                          const void *arg);
663int mysql_options4(MYSQL *mysql, enum mysql_option option,
664                           const void *arg1, const void *arg2);
665int mysql_get_option(MYSQL *mysql, enum mysql_option option,
666                             const void *arg);
667void mysql_free_result(MYSQL_RES *result);
668enum net_async_status mysql_free_result_nonblocking(MYSQL_RES *result);
669void mysql_data_seek(MYSQL_RES *result, uint64_t offset);
670MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result,
671                                        MYSQL_ROW_OFFSET offset);
672MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result,
673                                            MYSQL_FIELD_OFFSET offset);
674MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
675enum net_async_status mysql_fetch_row_nonblocking(MYSQL_RES *res,
676                                                          MYSQL_ROW *row);
677unsigned long * mysql_fetch_lengths(MYSQL_RES *result);
678MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result);
679MYSQL_RES * mysql_list_fields(MYSQL *mysql, const char *table,
680                                     const char *wild);
681unsigned long mysql_escape_string(char *to, const char *from,
682                                          unsigned long from_length);
683unsigned long mysql_hex_string(char *to, const char *from,
684                                       unsigned long from_length);
685unsigned long mysql_real_escape_string(MYSQL *mysql, char *to,
686                                               const char *from,
687                                               unsigned long length);
688unsigned long mysql_real_escape_string_quote(MYSQL *mysql, char *to,
689                                                     const char *from,
690                                                     unsigned long length,
691                                                     char quote);
692void mysql_debug(const char *debug);
693void myodbc_remove_escape(MYSQL *mysql, char *name);
694unsigned int mysql_thread_safe(void);
695bool mysql_read_query_result(MYSQL *mysql);
696int mysql_reset_connection(MYSQL *mysql);
697int mysql_binlog_open(MYSQL *mysql, MYSQL_RPL *rpl);
698int mysql_binlog_fetch(MYSQL *mysql, MYSQL_RPL *rpl);
699void mysql_binlog_close(MYSQL *mysql, MYSQL_RPL *rpl);
700enum enum_mysql_stmt_state {
701  MYSQL_STMT_INIT_DONE = 1,
702  MYSQL_STMT_PREPARE_DONE,
703  MYSQL_STMT_EXECUTE_DONE,
704  MYSQL_STMT_FETCH_DONE
705};
706typedef struct MYSQL_BIND {
707  unsigned long *length;
708  bool *is_null;
709  void *buffer;
710  bool *error;
711  unsigned char *row_ptr;
712  void (*store_param_func)(NET *net, struct MYSQL_BIND *param);
713  void (*fetch_result)(struct MYSQL_BIND *, MYSQL_FIELD *, unsigned char **row);
714  void (*skip_result)(struct MYSQL_BIND *, MYSQL_FIELD *, unsigned char **row);
715  unsigned long buffer_length;
716  unsigned long offset;
717  unsigned long length_value;
718  unsigned int param_number;
719  unsigned int pack_length;
720  enum enum_field_types buffer_type;
721  bool error_value;
722  bool is_unsigned;
723  bool long_data_used;
724  bool is_null_value;
725  void *extension;
726} MYSQL_BIND;
727struct MYSQL_STMT_EXT;
728typedef struct MYSQL_STMT {
729  struct MEM_ROOT *mem_root;
730  LIST list;
731  MYSQL *mysql;
732  MYSQL_BIND *params;
733  MYSQL_BIND *bind;
734  MYSQL_FIELD *fields;
735  MYSQL_DATA result;
736  MYSQL_ROWS *data_cursor;
737  int (*read_row_func)(struct MYSQL_STMT *stmt, unsigned char **row);
738  uint64_t affected_rows;
739  uint64_t insert_id;
740  unsigned long stmt_id;
741  unsigned long flags;
742  unsigned long prefetch_rows;
743  unsigned int server_status;
744  unsigned int last_errno;
745  unsigned int param_count;
746  unsigned int field_count;
747  enum enum_mysql_stmt_state state;
748  char last_error[512];
749  char sqlstate[5 + 1];
750  bool send_types_to_server;
751  bool bind_param_done;
752  unsigned char bind_result_done;
753  bool unbuffered_fetch_cancelled;
754  bool update_max_length;
755  struct MYSQL_STMT_EXT *extension;
756} MYSQL_STMT;
757enum enum_stmt_attr_type {
758  STMT_ATTR_UPDATE_MAX_LENGTH,
759  STMT_ATTR_CURSOR_TYPE,
760  STMT_ATTR_PREFETCH_ROWS
761};
762MYSQL_STMT * mysql_stmt_init(MYSQL *mysql);
763int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query,
764                               unsigned long length);
765int mysql_stmt_execute(MYSQL_STMT *stmt);
766int mysql_stmt_fetch(MYSQL_STMT *stmt);
767int mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg,
768                                    unsigned int column, unsigned long offset);
769int mysql_stmt_store_result(MYSQL_STMT *stmt);
770unsigned long mysql_stmt_param_count(MYSQL_STMT *stmt);
771bool mysql_stmt_attr_set(MYSQL_STMT *stmt,
772                                 enum enum_stmt_attr_type attr_type,
773                                 const void *attr);
774bool mysql_stmt_attr_get(MYSQL_STMT *stmt,
775                                 enum enum_stmt_attr_type attr_type,
776                                 void *attr);
777bool mysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bnd);
778bool mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bnd);
779bool mysql_stmt_close(MYSQL_STMT *stmt);
780bool mysql_stmt_reset(MYSQL_STMT *stmt);
781bool mysql_stmt_free_result(MYSQL_STMT *stmt);
782bool mysql_stmt_send_long_data(MYSQL_STMT *stmt,
783                                       unsigned int param_number,
784                                       const char *data, unsigned long length);
785MYSQL_RES * mysql_stmt_result_metadata(MYSQL_STMT *stmt);
786MYSQL_RES * mysql_stmt_param_metadata(MYSQL_STMT *stmt);
787unsigned int mysql_stmt_errno(MYSQL_STMT *stmt);
788const char * mysql_stmt_error(MYSQL_STMT *stmt);
789const char * mysql_stmt_sqlstate(MYSQL_STMT *stmt);
790MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt,
791                                             MYSQL_ROW_OFFSET offset);
792MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt);
793void mysql_stmt_data_seek(MYSQL_STMT *stmt, uint64_t offset);
794uint64_t mysql_stmt_num_rows(MYSQL_STMT *stmt);
795uint64_t mysql_stmt_affected_rows(MYSQL_STMT *stmt);
796uint64_t mysql_stmt_insert_id(MYSQL_STMT *stmt);
797unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt);
798bool mysql_commit(MYSQL *mysql);
799bool mysql_rollback(MYSQL *mysql);
800bool mysql_autocommit(MYSQL *mysql, bool auto_mode);
801bool mysql_more_results(MYSQL *mysql);
802int mysql_next_result(MYSQL *mysql);
803int mysql_stmt_next_result(MYSQL_STMT *stmt);
804void mysql_close(MYSQL *sock);
805void mysql_reset_server_public_key(void);
806