diff options
author | hcpp <hcpp@ydb.tech> | 2023-11-08 12:09:41 +0300 |
---|---|---|
committer | hcpp <hcpp@ydb.tech> | 2023-11-08 12:56:14 +0300 |
commit | a361f5b98b98b44ea510d274f6769164640dd5e1 (patch) | |
tree | c47c80962c6e2e7b06798238752fd3da0191a3f6 /contrib/libs/libmysql_r/include/mysql_com.h | |
parent | 9478806fde1f4d40bd5a45e7cbe77237dab613e9 (diff) | |
download | ydb-a361f5b98b98b44ea510d274f6769164640dd5e1.tar.gz |
metrics have been added
Diffstat (limited to 'contrib/libs/libmysql_r/include/mysql_com.h')
-rw-r--r-- | contrib/libs/libmysql_r/include/mysql_com.h | 1089 |
1 files changed, 1089 insertions, 0 deletions
diff --git a/contrib/libs/libmysql_r/include/mysql_com.h b/contrib/libs/libmysql_r/include/mysql_com.h new file mode 100644 index 0000000000..38a3b58747 --- /dev/null +++ b/contrib/libs/libmysql_r/include/mysql_com.h @@ -0,0 +1,1089 @@ +/* Copyright (c) 2000, 2019, 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, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + Without limiting anything contained in the foregoing, this file, + which is part of C Driver for MySQL (Connector/C), is also subject to the + Universal FOSS Exception, version 1.0, a copy of which can be found at + http://oss.oracle.com/licenses/universal-foss-exception. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +/** + @file include/mysql_com.h + Common definition between mysql server & client. +*/ + +#ifndef _mysql_com_h +#define _mysql_com_h + +#ifndef MYSQL_ABI_CHECK +#include <stdbool.h> +#endif + +#include "my_command.h" + +/* + We need a definition for my_socket. On the client, <mysql.h> already provides + it, but on the server side, we need to get it from a header. +*/ +#ifndef my_socket_defined +#include "my_io.h" +#endif + +#ifndef MYSQL_ABI_CHECK +#include <stdbool.h> +#endif + +#define SYSTEM_CHARSET_MBMAXLEN 3 +#define FILENAME_CHARSET_MBMAXLEN 5 +#define NAME_CHAR_LEN 64 /**< Field/table name length */ +#define PARTITION_EXPR_CHAR_LEN \ + 2048 /**< Maximum expression length in chars \ + */ +#define USERNAME_CHAR_LENGTH 32 +#define USERNAME_CHAR_LENGTH_STR "32" +#ifndef NAME_LEN +#define NAME_LEN (NAME_CHAR_LEN * SYSTEM_CHARSET_MBMAXLEN) +#endif +#define USERNAME_LENGTH (USERNAME_CHAR_LENGTH * SYSTEM_CHARSET_MBMAXLEN) +#define CONNECT_STRING_MAXLEN 1024 + +#define MYSQL_AUTODETECT_CHARSET_NAME "auto" + +#define SERVER_VERSION_LENGTH 60 +#define SQLSTATE_LENGTH 5 + +/** + Maximum length of comments + + pre 5.6: 60 characters +*/ +#define TABLE_COMMENT_INLINE_MAXLEN 180 +#define TABLE_COMMENT_MAXLEN 2048 +#define COLUMN_COMMENT_MAXLEN 1024 +#define INDEX_COMMENT_MAXLEN 1024 +#define TABLE_PARTITION_COMMENT_MAXLEN 1024 +#define TABLESPACE_COMMENT_MAXLEN 2048 + +/** + Maximum length of protocol packet. + @ref page_protocol_basic_ok_packet length limit also restricted to this value + as any length greater than this value will have first byte of + @ref page_protocol_basic_ok_packet to be 254 thus does not + provide a means to identify if this is @ref page_protocol_basic_ok_packet or + @ref page_protocol_basic_eof_packet. +*/ +#define MAX_PACKET_LENGTH (256L * 256L * 256L - 1) + +#define LOCAL_HOST "localhost" +#define LOCAL_HOST_NAMEDPIPE "." + +#if defined(_WIN32) +#define MYSQL_NAMEDPIPE "MySQL" +#define MYSQL_SERVICENAME "MySQL" +#endif /* _WIN32 */ + +/** The length of the header part for each generated column in the .frm file.*/ +#define FRM_GCOL_HEADER_SIZE 4 +/** + Maximum length of the expression statement defined for generated columns. +*/ +#define GENERATED_COLUMN_EXPRESSION_MAXLEN 65535 - FRM_GCOL_HEADER_SIZE +/** + Length of random string sent by server on handshake; this is also length of + obfuscated password, received from client +*/ +#define SCRAMBLE_LENGTH 20 +#define AUTH_PLUGIN_DATA_PART_1_LENGTH 8 +/** length of password stored in the db: new passwords are preceeded with '*'*/ +#define SCRAMBLED_PASSWORD_CHAR_LENGTH (SCRAMBLE_LENGTH * 2 + 1) + +/** + @defgroup group_cs_column_definition_flags Column Definition Flags + @ingroup group_cs + + @brief Values for the flags bitmask used by ::Send_field:flags + + Currently need to fit into 32 bits. + + Each bit represents an optional feature of the protocol. + + Both the client and the server are sending these. + + The intersection of the two determines what optional parts of the + protocol will be used. +*/ + +/** + @addtogroup group_cs_column_definition_flags + @{ +*/ + +#define NOT_NULL_FLAG 1 /**< Field can't be NULL */ +#define PRI_KEY_FLAG 2 /**< Field is part of a primary key */ +#define UNIQUE_KEY_FLAG 4 /**< Field is part of a unique key */ +#define MULTIPLE_KEY_FLAG 8 /**< Field is part of a key */ +#define BLOB_FLAG 16 /**< Field is a blob */ +#define UNSIGNED_FLAG 32 /**< Field is unsigned */ +#define ZEROFILL_FLAG 64 /**< Field is zerofill */ +#define BINARY_FLAG 128 /**< Field is binary */ + +/* The following are only sent to new clients */ +#define ENUM_FLAG 256 /**< field is an enum */ +#define AUTO_INCREMENT_FLAG 512 /**< field is a autoincrement field */ +#define TIMESTAMP_FLAG 1024 /**< Field is a timestamp */ +#define SET_FLAG 2048 /**< field is a set */ +#define NO_DEFAULT_VALUE_FLAG 4096 /**< Field doesn't have default value */ +#define ON_UPDATE_NOW_FLAG 8192 /**< Field is set to NOW on UPDATE */ +#define NUM_FLAG 32768 /**< Field is num (for clients) */ +#define PART_KEY_FLAG 16384 /**< Intern; Part of some key */ +#define GROUP_FLAG 32768 /**< Intern: Group field */ +#define UNIQUE_FLAG 65536 /**< Intern: Used by sql_yacc */ +#define BINCMP_FLAG 131072 /**< Intern: Used by sql_yacc */ +#define GET_FIXED_FIELDS_FLAG \ + (1 << 18) /**< Used to get fields in item tree \ + */ +#define FIELD_IN_PART_FUNC_FLAG (1 << 19) /**< Field part of partition func */ +/** + Intern: Field in TABLE object for new version of altered table, + which participates in a newly added index. +*/ +#define FIELD_IN_ADD_INDEX (1 << 20) +#define FIELD_IS_RENAMED (1 << 21) /**< Intern: Field is being renamed */ +#define FIELD_FLAGS_STORAGE_MEDIA 22 /**< Field storage media, bit 22-23 */ +#define FIELD_FLAGS_STORAGE_MEDIA_MASK (3 << FIELD_FLAGS_STORAGE_MEDIA) +#define FIELD_FLAGS_COLUMN_FORMAT 24 /**< Field column format, bit 24-25 */ +#define FIELD_FLAGS_COLUMN_FORMAT_MASK (3 << FIELD_FLAGS_COLUMN_FORMAT) +#define FIELD_IS_DROPPED (1 << 26) /**< Intern: Field is being dropped */ +#define EXPLICIT_NULL_FLAG \ + (1 << 27) /**< Field is explicitly specified as \ + NULL by the user */ +#define FIELD_IS_MARKED \ + (1 << 28) /**< Intern: field is marked, \ + general purpose */ + +/** Field will not be loaded in secondary engine. */ +#define NOT_SECONDARY_FLAG (1 << 29) + +/** @}*/ + +/** + @defgroup group_cs_com_refresh_flags COM_REFRESH Flags + @ingroup group_cs + + @brief Values for the `sub_command` in ::COM_REFRESH + + Currently the protocol carries only 8 bits of these flags. + + The rest (8-end) are used only internally in the server. +*/ + +/** + @addtogroup group_cs_com_refresh_flags + @{ +*/ + +#define REFRESH_GRANT 1 /**< Refresh grant tables, FLUSH PRIVILEGES */ +#define REFRESH_LOG 2 /**< Start on new log file, FLUSH LOGS */ +#define REFRESH_TABLES 4 /**< close all tables, FLUSH TABLES */ +#define REFRESH_HOSTS 8 /**< Flush host cache, FLUSH HOSTS */ +#define REFRESH_STATUS 16 /**< Flush status variables, FLUSH STATUS */ +#define REFRESH_THREADS 32 /**< Flush thread cache */ +#define REFRESH_SLAVE \ + 64 /**< Reset master info and restart slave \ + thread, RESET SLAVE */ +#define REFRESH_MASTER \ + 128 /**< Remove all bin logs in the index \ + and truncate the index, RESET MASTER */ +#define REFRESH_ERROR_LOG 256 /**< Rotate only the erorr log */ +#define REFRESH_ENGINE_LOG 512 /**< Flush all storage engine logs */ +#define REFRESH_BINARY_LOG 1024 /**< Flush the binary log */ +#define REFRESH_RELAY_LOG 2048 /**< Flush the relay log */ +#define REFRESH_GENERAL_LOG 4096 /**< Flush the general log */ +#define REFRESH_SLOW_LOG 8192 /**< Flush the slow query log */ +#define REFRESH_READ_LOCK 16384 /**< Lock tables for read. */ +/** + Wait for an impending flush before closing the tables. + + @sa REFRESH_READ_LOCK, handle_reload_request, close_cached_tables +*/ +#define REFRESH_FAST 32768 +#define REFRESH_USER_RESOURCES 0x80000L /** FLISH RESOUCES. @sa ::reset_mqh */ +#define REFRESH_FOR_EXPORT 0x100000L /** FLUSH TABLES ... FOR EXPORT */ +#define REFRESH_OPTIMIZER_COSTS 0x200000L /** FLUSH OPTIMIZER_COSTS */ +#define REFRESH_PERSIST 0x400000L /** RESET PERSIST */ + +/** @}*/ + +/** + @defgroup group_cs_capabilities_flags Capabilities Flags + @ingroup group_cs + + @brief Values for the capabilities flag bitmask used by the MySQL protocol + + Currently need to fit into 32 bits. + + Each bit represents an optional feature of the protocol. + + Both the client and the server are sending these. + + The intersection of the two determines whast optional parts of the + protocol will be used. +*/ + +/** + @addtogroup group_cs_capabilities_flags + @{ +*/ + +/** + Use the improved version of Old Password Authentication. + + Not used. + + @note Assumed to be set since 4.1.1. +*/ +#define CLIENT_LONG_PASSWORD 1 +/** + Send found rows instead of affected rows in @ref + page_protocol_basic_eof_packet +*/ +#define CLIENT_FOUND_ROWS 2 +/** + @brief Get all column flags + + Longer flags in Protocol::ColumnDefinition320. + + @todo Reference Protocol::ColumnDefinition320 + + Server + ------ + + Supports longer flags. + + Client + ------ + + Expects longer flags. +*/ +#define CLIENT_LONG_FLAG 4 +/** + Database (schema) name can be specified on connect in Handshake Response + Packet. + + @todo Reference Handshake Response Packet. + + Server + ------ + + Supports schema-name in Handshake Response Packet. + + Client + ------ + + Handshake Response Packet contains a schema-name. + + @sa send_client_reply_packet() +*/ +#define CLIENT_CONNECT_WITH_DB 8 +#define CLIENT_NO_SCHEMA 16 /**< Don't allow database.table.column */ +/** + Compression protocol supported. + + @todo Reference Compression + + Server + ------ + + Supports compression. + + Client + ------ + + Switches to Compression compressed protocol after successful authentication. +*/ +#define CLIENT_COMPRESS 32 +/** + Special handling of ODBC behavior. + + @note No special behavior since 3.22. +*/ +#define CLIENT_ODBC 64 +/** + Can use LOAD DATA LOCAL. + + Server + ------ + + Enables the LOCAL INFILE request of LOAD DATA|XML. + + Client + ------ + + Will handle LOCAL INFILE request. +*/ +#define CLIENT_LOCAL_FILES 128 +/** + Ignore spaces before '(' + + Server + ------ + + Parser can ignore spaces before '('. + + Client + ------ + + Let the parser ignore spaces before '('. +*/ +#define CLIENT_IGNORE_SPACE 256 +/** + New 4.1 protocol + + @todo Reference the new 4.1 protocol + + Server + ------ + + Supports the 4.1 protocol. + + Client + ------ + + Uses the 4.1 protocol. + + @note this value was CLIENT_CHANGE_USER in 3.22, unused in 4.0 +*/ +#define CLIENT_PROTOCOL_41 512 +/** + This is an interactive client + + Use @ref System_variables::net_wait_timeout + versus @ref System_variables::net_interactive_timeout. + + Server + ------ + + Supports interactive and noninteractive clients. + + Client + ------ + + Client is interactive. + + @sa mysql_real_connect() +*/ +#define CLIENT_INTERACTIVE 1024 +/** + Use SSL encryption for the session + + @todo Reference SSL + + Server + ------ + + Supports SSL + + Client + ------ + + Switch to SSL after sending the capability-flags. +*/ +#define CLIENT_SSL 2048 +/** + Client only flag. Not used. + + Client + ------ + + Do not issue SIGPIPE if network failures occur (libmysqlclient only). + + @sa mysql_real_connect() +*/ +#define CLIENT_IGNORE_SIGPIPE 4096 +/** + Client knows about transactions + + Server + ------ + + Can send status flags in @ref page_protocol_basic_ok_packet / + @ref page_protocol_basic_eof_packet. + + Client + ------ + + Expects status flags in @ref page_protocol_basic_ok_packet / + @ref page_protocol_basic_eof_packet. + + @note This flag is optional in 3.23, but always set by the server since 4.0. + @sa send_server_handshake_packet(), parse_client_handshake_packet(), + net_send_ok(), net_send_eof() +*/ +#define CLIENT_TRANSACTIONS 8192 +#define CLIENT_RESERVED 16384 /**< DEPRECATED: Old flag for 4.1 protocol */ +#define CLIENT_RESERVED2 \ + 32768 /**< DEPRECATED: Old flag for 4.1 authentication \ + CLIENT_SECURE_CONNECTION */ +/** + Enable/disable multi-stmt support + + Also sets @ref CLIENT_MULTI_RESULTS. Currently not checked anywhere. + + Server + ------ + + Can handle multiple statements per COM_QUERY and COM_STMT_PREPARE. + + Client + ------- + + May send multiple statements per COM_QUERY and COM_STMT_PREPARE. + + @note Was named ::CLIENT_MULTI_QUERIES in 4.1.0, renamed later. + + Requires + -------- + + ::CLIENT_PROTOCOL_41 + + @todo Reference COM_QUERY and COM_STMT_PREPARE +*/ +#define CLIENT_MULTI_STATEMENTS (1UL << 16) +/** + Enable/disable multi-results + + Server + ------ + + Can send multiple resultsets for COM_QUERY. + Error if the server needs to send them and client + does not support them. + + Client + ------- + + Can handle multiple resultsets for COM_QUERY. + + Requires + -------- + + ::CLIENT_PROTOCOL_41 + + @sa mysql_execute_command(), sp_head::MULTI_RESULTS +*/ +#define CLIENT_MULTI_RESULTS (1UL << 17) +/** + Multi-results and OUT parameters in PS-protocol. + + Server + ------ + + Can send multiple resultsets for COM_STMT_EXECUTE. + + Client + ------ + + Can handle multiple resultsets for COM_STMT_EXECUTE. + + Requires + -------- + + ::CLIENT_PROTOCOL_41 + + @todo Reference COM_STMT_EXECUTE and PS-protocol + + @sa Protocol_binary::send_out_parameters +*/ +#define CLIENT_PS_MULTI_RESULTS (1UL << 18) + +/** + Client supports plugin authentication + + Server + ------ + + Sends extra data in Initial Handshake Packet and supports the pluggable + authentication protocol. + + Client + ------ + + Supports authentication plugins. + + Requires + -------- + + ::CLIENT_PROTOCOL_41 + + @todo Reference plugin authentication, Initial Handshake Packet, + Authentication plugins + + @sa send_change_user_packet(), send_client_reply_packet(), run_plugin_auth(), + parse_com_change_user_packet(), parse_client_handshake_packet() +*/ +#define CLIENT_PLUGIN_AUTH (1UL << 19) +/** + Client supports connection attributes + + Server + ------ + + Permits connection attributes in Protocol::HandshakeResponse41. + + Client + ------ + + Sends connection attributes in Protocol::HandshakeResponse41. + + @todo Reference Protocol::HandshakeResponse41 + + @sa send_client_connect_attrs(), read_client_connect_attrs() +*/ +#define CLIENT_CONNECT_ATTRS (1UL << 20) + +/** + Enable authentication response packet to be larger than 255 bytes. + + When the ability to change default plugin require that the initial password + field in the Protocol::HandshakeResponse41 paclet can be of arbitrary size. + However, the 4.1 client-server protocol limits the length of the + auth-data-field sent from client to server to 255 bytes. + The solution is to change the type of the field to a true length encoded + string and indicate the protocol change + with this client capability flag. + + Server + ------ + + Understands length-encoded integer for auth response data in + Protocol::HandshakeResponse41. + + Client + ------ + + Length of auth response data in Protocol::HandshakeResponse41 + is a length-encoded integer. + + @todo Reference Protocol::HandshakeResponse41 + + @note The flag was introduced in 5.6.6, but had the wrong value. + + @sa send_client_reply_packet(), parse_client_handshake_packet(), + get_56_lenc_string(), get_41_lenc_string() +*/ +#define CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA (1UL << 21) + +/** + Don't close the connection for a user account with expired password. + + Server + ------ + + Announces support for expired password extension. + + Client + ------ + + Can handle expired passwords. + + @todo Reference expired password + + @sa MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, disconnect_on_expired_password + ACL_USER::password_expired, check_password_lifetime(), acl_authenticate() +*/ +#define CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS (1UL << 22) + +/** + Capable of handling server state change information. Its a hint to the + server to include the state change information in + @ref page_protocol_basic_ok_packet. + + Server + ------ + Can set ::SERVER_SESSION_STATE_CHANGED in the ::SERVER_STATUS_flags_enum + and send @ref sect_protocol_basic_ok_packet_sessinfo in a + @ref page_protocol_basic_ok_packet. + + Client + ------ + + Expects the server to send @ref sect_protocol_basic_ok_packet_sessinfo in + a @ref page_protocol_basic_ok_packet. + + @sa enum_session_state_type, read_ok_ex(), net_send_ok(), Session_tracker, + State_tracker +*/ +#define CLIENT_SESSION_TRACK (1UL << 23) +/** + Client no longer needs @ref page_protocol_basic_eof_packet and will + use @ref page_protocol_basic_ok_packet instead. + @sa net_send_ok() + + Server + ------ + + Can send OK after a Text Resultset. + + Client + ------ + + Expects an @ref page_protocol_basic_ok_packet (instead of + @ref page_protocol_basic_eof_packet) after the resultset rows of a + Text Resultset. + + Background + ---------- + + To support ::CLIENT_SESSION_TRACK, additional information must be sent after + all successful commands. Although the @ref page_protocol_basic_ok_packet is + extensible, the @ref page_protocol_basic_eof_packet is not due to the overlap + of its bytes with the content of the Text Resultset Row. + + Therefore, the @ref page_protocol_basic_eof_packet in the + Text Resultset is replaced with an @ref page_protocol_basic_ok_packet. + @ref page_protocol_basic_eof_packet is deprecated as of MySQL 5.7.5. + + @todo Reference Text Resultset + + @sa cli_safe_read_with_ok(), read_ok_ex(), net_send_ok(), net_send_eof() +*/ +#define CLIENT_DEPRECATE_EOF (1UL << 24) + +/** + Verify server certificate. + + Client only flag. + + @deprecated in favor of --ssl-mode. +*/ +#define CLIENT_SSL_VERIFY_SERVER_CERT (1UL << 30) + +/** + The client can handle optional metadata information in the resultset. +*/ +#define CLIENT_OPTIONAL_RESULTSET_METADATA (1UL << 25) + +/** + Don't reset the options after an unsuccessful connect + + Client only flag. + + Typically passed via ::mysql_real_connect() 's client_flag parameter. + + @sa mysql_real_connect() +*/ +#define CLIENT_REMEMBER_OPTIONS (1UL << 31) +/** @}*/ + +/** a compatibility alias for CLIENT_COMPRESS */ +#define CAN_CLIENT_COMPRESS CLIENT_COMPRESS + +/** Gather all possible capabilites (flags) supported by the server */ +#define CLIENT_ALL_FLAGS \ + (CLIENT_LONG_PASSWORD | CLIENT_FOUND_ROWS | CLIENT_LONG_FLAG | \ + CLIENT_CONNECT_WITH_DB | CLIENT_NO_SCHEMA | CLIENT_COMPRESS | CLIENT_ODBC | \ + CLIENT_LOCAL_FILES | CLIENT_IGNORE_SPACE | CLIENT_PROTOCOL_41 | \ + CLIENT_INTERACTIVE | CLIENT_SSL | CLIENT_IGNORE_SIGPIPE | \ + CLIENT_TRANSACTIONS | CLIENT_RESERVED | CLIENT_RESERVED2 | \ + CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS | CLIENT_PS_MULTI_RESULTS | \ + CLIENT_SSL_VERIFY_SERVER_CERT | CLIENT_REMEMBER_OPTIONS | \ + CLIENT_PLUGIN_AUTH | CLIENT_CONNECT_ATTRS | \ + CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA | \ + CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS | CLIENT_SESSION_TRACK | \ + CLIENT_DEPRECATE_EOF | CLIENT_OPTIONAL_RESULTSET_METADATA) + +/** + Switch off from ::CLIENT_ALL_FLAGS the flags that are optional and + depending on build flags. + If any of the optional flags is supported by the build it will be switched + on before sending to the client during the connection handshake. +*/ +#define CLIENT_BASIC_FLAGS \ + (((CLIENT_ALL_FLAGS & ~CLIENT_SSL) & ~CLIENT_COMPRESS) & \ + ~CLIENT_SSL_VERIFY_SERVER_CERT) + +/** The status flags are a bit-field */ +enum SERVER_STATUS_flags_enum { + /** + Is raised when a multi-statement transaction + has been started, either explicitly, by means + of BEGIN or COMMIT AND CHAIN, or + implicitly, by the first transactional + statement, when autocommit=off. + */ + SERVER_STATUS_IN_TRANS = 1, + SERVER_STATUS_AUTOCOMMIT = 2, /**< Server in auto_commit mode */ + SERVER_MORE_RESULTS_EXISTS = 8, /**< Multi query - next query exists */ + SERVER_QUERY_NO_GOOD_INDEX_USED = 16, + SERVER_QUERY_NO_INDEX_USED = 32, + /** + The server was able to fulfill the clients request and opened a + read-only non-scrollable cursor for a query. This flag comes + in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands. + Used by Binary Protocol Resultset to signal that COM_STMT_FETCH + must be used to fetch the row-data. + @todo Refify "Binary Protocol Resultset" and "COM_STMT_FETCH". + */ + SERVER_STATUS_CURSOR_EXISTS = 64, + /** + This flag is sent when a read-only cursor is exhausted, in reply to + COM_STMT_FETCH command. + */ + SERVER_STATUS_LAST_ROW_SENT = 128, + SERVER_STATUS_DB_DROPPED = 256, /**< A database was dropped */ + SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512, + /** + Sent to the client if after a prepared statement reprepare + we discovered that the new statement returns a different + number of result set columns. + */ + SERVER_STATUS_METADATA_CHANGED = 1024, + SERVER_QUERY_WAS_SLOW = 2048, + /** + To mark ResultSet containing output parameter values. + */ + SERVER_PS_OUT_PARAMS = 4096, + + /** + Set at the same time as SERVER_STATUS_IN_TRANS if the started + multi-statement transaction is a read-only transaction. Cleared + when the transaction commits or aborts. Since this flag is sent + to clients in OK and EOF packets, the flag indicates the + transaction status at the end of command execution. + */ + SERVER_STATUS_IN_TRANS_READONLY = 8192, + + /** + This status flag, when on, implies that one of the state information has + changed on the server because of the execution of the last statement. + */ + SERVER_SESSION_STATE_CHANGED = (1UL << 14) +}; + +/** + Server status flags that must be cleared when starting + execution of a new SQL statement. + Flags from this set are only added to the + current server status by the execution engine, but + never removed -- the execution engine expects them + to disappear automagically by the next command. +*/ +#define SERVER_STATUS_CLEAR_SET \ + (SERVER_QUERY_NO_GOOD_INDEX_USED | SERVER_QUERY_NO_INDEX_USED | \ + SERVER_MORE_RESULTS_EXISTS | SERVER_STATUS_METADATA_CHANGED | \ + SERVER_QUERY_WAS_SLOW | SERVER_STATUS_DB_DROPPED | \ + SERVER_STATUS_CURSOR_EXISTS | SERVER_STATUS_LAST_ROW_SENT | \ + SERVER_SESSION_STATE_CHANGED) + +/** Max length of a error message. Should be kept in sync with ::ERRMSGSIZE. */ +#define MYSQL_ERRMSG_SIZE 512 +#define NET_READ_TIMEOUT 30 /**< Timeout on read */ +#define NET_WRITE_TIMEOUT 60 /**< Timeout on write */ +#define NET_WAIT_TIMEOUT 8 * 60 * 60 /**< Wait for new query */ + +/** + Flag used by the parser. Kill only the query and not the connection. + + @sa SQLCOM_KILL, sql_kill(), LEX::type +*/ +#define ONLY_KILL_QUERY 1 + +#ifndef MYSQL_VIO +struct Vio; +#define MYSQL_VIO struct Vio * +#endif + +#define MAX_TINYINT_WIDTH 3 /**< Max width for a TINY w.o. sign */ +#define MAX_SMALLINT_WIDTH 5 /**< Max width for a SHORT w.o. sign */ +#define MAX_MEDIUMINT_WIDTH 8 /**< Max width for a INT24 w.o. sign */ +#define MAX_INT_WIDTH 10 /**< Max width for a LONG w.o. sign */ +#define MAX_BIGINT_WIDTH 20 /**< Max width for a LONGLONG */ +#define MAX_CHAR_WIDTH 255 /**< Max length for a CHAR colum */ +#define MAX_BLOB_WIDTH 16777216 /**< Default width for blob */ + +typedef struct NET { + MYSQL_VIO vio; + unsigned char *buff, *buff_end, *write_pos, *read_pos; + my_socket fd; /* For Perl DBI/dbd */ + /** + Set if we are doing several queries in one + command ( as in LOAD TABLE ... FROM MASTER ), + and do not want to confuse the client with OK at the wrong time + */ + unsigned long remain_in_buf, length, buf_length, where_b; + unsigned long max_packet, max_packet_size; + unsigned int pkt_nr, compress_pkt_nr; + unsigned int write_timeout, read_timeout, retry_count; + int fcntl; + unsigned int *return_status; + unsigned char reading_or_writing; + unsigned char save_char; + bool compress; + unsigned int last_errno; + unsigned char error; + /** Client library error message buffer. Actually belongs to struct MYSQL. */ + char last_error[MYSQL_ERRMSG_SIZE]; + /** Client library sqlstate buffer. Set along with the error message. */ + char sqlstate[SQLSTATE_LENGTH + 1]; + /** + Extension pointer, for the caller private use. + Any program linking with the networking library can use this pointer, + which is handy when private connection specific data needs to be + maintained. + The mysqld server process uses this pointer internally, + to maintain the server internal instrumentation for the connection. + */ + void *extension; +} NET; + +#define packet_error (~(unsigned long)0) + +/** + @addtogroup group_cs_backward_compatibility Backward compatibility + @ingroup group_cs + @{ +*/ +#define CLIENT_MULTI_QUERIES CLIENT_MULTI_STATEMENTS +#define FIELD_TYPE_DECIMAL MYSQL_TYPE_DECIMAL +#define FIELD_TYPE_NEWDECIMAL MYSQL_TYPE_NEWDECIMAL +#define FIELD_TYPE_TINY MYSQL_TYPE_TINY +#define FIELD_TYPE_SHORT MYSQL_TYPE_SHORT +#define FIELD_TYPE_LONG MYSQL_TYPE_LONG +#define FIELD_TYPE_FLOAT MYSQL_TYPE_FLOAT +#define FIELD_TYPE_DOUBLE MYSQL_TYPE_DOUBLE +#define FIELD_TYPE_NULL MYSQL_TYPE_NULL +#define FIELD_TYPE_TIMESTAMP MYSQL_TYPE_TIMESTAMP +#define FIELD_TYPE_LONGLONG MYSQL_TYPE_LONGLONG +#define FIELD_TYPE_INT24 MYSQL_TYPE_INT24 +#define FIELD_TYPE_DATE MYSQL_TYPE_DATE +#define FIELD_TYPE_TIME MYSQL_TYPE_TIME +#define FIELD_TYPE_DATETIME MYSQL_TYPE_DATETIME +#define FIELD_TYPE_YEAR MYSQL_TYPE_YEAR +#define FIELD_TYPE_NEWDATE MYSQL_TYPE_NEWDATE +#define FIELD_TYPE_ENUM MYSQL_TYPE_ENUM +#define FIELD_TYPE_SET MYSQL_TYPE_SET +#define FIELD_TYPE_TINY_BLOB MYSQL_TYPE_TINY_BLOB +#define FIELD_TYPE_MEDIUM_BLOB MYSQL_TYPE_MEDIUM_BLOB +#define FIELD_TYPE_LONG_BLOB MYSQL_TYPE_LONG_BLOB +#define FIELD_TYPE_BLOB MYSQL_TYPE_BLOB +#define FIELD_TYPE_VAR_STRING MYSQL_TYPE_VAR_STRING +#define FIELD_TYPE_STRING MYSQL_TYPE_STRING +#define FIELD_TYPE_CHAR MYSQL_TYPE_TINY +#define FIELD_TYPE_INTERVAL MYSQL_TYPE_ENUM +#define FIELD_TYPE_GEOMETRY MYSQL_TYPE_GEOMETRY +#define FIELD_TYPE_BIT MYSQL_TYPE_BIT +/** @}*/ + +/** + @addtogroup group_cs_shutdown_kill_constants Shutdown/kill enums and constants + @ingroup group_cs + + @sa THD::is_killable + @{ +*/ +#define MYSQL_SHUTDOWN_KILLABLE_CONNECT (unsigned char)(1 << 0) +#define MYSQL_SHUTDOWN_KILLABLE_TRANS (unsigned char)(1 << 1) +#define MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE (unsigned char)(1 << 2) +#define MYSQL_SHUTDOWN_KILLABLE_UPDATE (unsigned char)(1 << 3) + +/** + We want levels to be in growing order of hardness (because we use number + comparisons). + + @note ::SHUTDOWN_DEFAULT does not respect the growing property, but it's ok. +*/ +enum mysql_enum_shutdown_level { + SHUTDOWN_DEFAULT = 0, + /** Wait for existing connections to finish */ + SHUTDOWN_WAIT_CONNECTIONS = MYSQL_SHUTDOWN_KILLABLE_CONNECT, + /** Wait for existing transactons to finish */ + SHUTDOWN_WAIT_TRANSACTIONS = MYSQL_SHUTDOWN_KILLABLE_TRANS, + /** Wait for existing updates to finish (=> no partial MyISAM update) */ + SHUTDOWN_WAIT_UPDATES = MYSQL_SHUTDOWN_KILLABLE_UPDATE, + /** Flush InnoDB buffers and other storage engines' buffers*/ + SHUTDOWN_WAIT_ALL_BUFFERS = (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1), + /** Don't flush InnoDB buffers, flush other storage engines' buffers*/ + SHUTDOWN_WAIT_CRITICAL_BUFFERS = (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1, + /** Query level of the KILL command */ + KILL_QUERY = 254, + /** Connection level of the KILL command */ + KILL_CONNECTION = 255 +}; +/** @}*/ + +enum enum_resultset_metadata { + /** No metadata will be sent. */ + RESULTSET_METADATA_NONE = 0, + /** The server will send all metadata. */ + RESULTSET_METADATA_FULL = 1 +}; + +enum enum_cursor_type { + CURSOR_TYPE_NO_CURSOR = 0, + CURSOR_TYPE_READ_ONLY = 1, + CURSOR_TYPE_FOR_UPDATE = 2, + CURSOR_TYPE_SCROLLABLE = 4 +}; + +/** options for ::mysql_options() */ +enum enum_mysql_set_option { + MYSQL_OPTION_MULTI_STATEMENTS_ON, + MYSQL_OPTION_MULTI_STATEMENTS_OFF +}; + +/** + Type of state change information that the server can include in the Ok + packet. + + @note + - session_state_type shouldn't go past 255 (i.e. 1-byte boundary). + - Modify the definition of ::SESSION_TRACK_END when a new member is added. +*/ +enum enum_session_state_type { + SESSION_TRACK_SYSTEM_VARIABLES, /**< Session system variables */ + SESSION_TRACK_SCHEMA, /**< Current schema */ + SESSION_TRACK_STATE_CHANGE, /**< track session state changes */ + SESSION_TRACK_GTIDS, /**< See also: session_track_gtids */ + SESSION_TRACK_TRANSACTION_CHARACTERISTICS, /**< Transaction chistics */ + SESSION_TRACK_TRANSACTION_STATE /**< Transaction state */ +}; + +/** start of ::enum_session_state_type */ +#define SESSION_TRACK_BEGIN SESSION_TRACK_SYSTEM_VARIABLES + +/** End of ::enum_session_state_type */ +#define SESSION_TRACK_END SESSION_TRACK_TRANSACTION_STATE + +/** is T a valid session state type */ +#define IS_SESSION_STATE_TYPE(T) \ + (((int)(T) >= SESSION_TRACK_BEGIN) && ((T) <= SESSION_TRACK_END)) + +#define net_new_transaction(net) ((net)->pkt_nr = 0) + +bool my_net_init(struct NET *net, MYSQL_VIO vio); +void my_net_local_init(struct NET *net); +void net_end(struct NET *net); +void net_clear(struct NET *net, bool check_buffer); +void net_claim_memory_ownership(struct NET *net); +bool net_realloc(struct NET *net, size_t length); +bool net_flush(struct NET *net); +bool my_net_write(struct NET *net, const unsigned char *packet, size_t len); +bool net_write_command(struct NET *net, unsigned char command, + const unsigned char *header, size_t head_len, + const unsigned char *packet, size_t len); +bool net_write_packet(struct NET *net, const unsigned char *packet, + size_t length); +unsigned long my_net_read(struct NET *net); +void my_net_set_write_timeout(struct NET *net, unsigned int timeout); +void my_net_set_read_timeout(struct NET *net, unsigned int timeout); +void my_net_set_retry_count(struct NET *net, unsigned int retry_count); + +struct rand_struct { + unsigned long seed1, seed2, max_value; + double max_value_dbl; +}; + +/* Include the types here so existing UDFs can keep compiling */ +#include <mysql/udf_registration_types.h> + +/** + @addtogroup group_cs_compresson_constants Constants when using compression + @ingroup group_cs + @{ +*/ +#define NET_HEADER_SIZE 4 /**< standard header size */ +#define COMP_HEADER_SIZE 3 /**< compression header extra size */ +/** @}*/ + +/* Prototypes to password functions */ + +/* + These functions are used for authentication by client and server and + implemented in sql/password.c +*/ + +void randominit(struct rand_struct *, unsigned long seed1, unsigned long seed2); +double my_rnd(struct rand_struct *); +void create_random_string(char *to, unsigned int length, + struct rand_struct *rand_st); + +void hash_password(unsigned long *to, const char *password, + unsigned int password_len); +void make_scrambled_password_323(char *to, const char *password); +void scramble_323(char *to, const char *message, const char *password); +bool check_scramble_323(const unsigned char *reply, const char *message, + unsigned long *salt); +void get_salt_from_password_323(unsigned long *res, const char *password); +void make_password_from_salt_323(char *to, const unsigned long *salt); + +void make_scrambled_password(char *to, const char *password); +void scramble(char *to, const char *message, const char *password); +bool check_scramble(const unsigned char *reply, const char *message, + const unsigned char *hash_stage2); +void get_salt_from_password(unsigned char *res, const char *password); +void make_password_from_salt(char *to, const unsigned char *hash_stage2); +char *octet2hex(char *to, const char *str, unsigned int len); + +/* end of password.c */ + +bool generate_sha256_scramble(unsigned char *dst, size_t dst_size, + const char *src, size_t src_size, const char *rnd, + size_t rnd_size); + +// extern "C" since it is an (undocumented) part of the libmysql ABI. +#ifdef __cplusplus +extern "C" { +#endif +char *get_tty_password(const char *opt_message); +#ifdef __cplusplus +} +#endif + +const char *mysql_errno_to_sqlstate(unsigned int mysql_errno); + +/* Some other useful functions */ + +// Need to be extern "C" for the time being, due to memcached. +#ifdef __cplusplus +extern "C" { +#endif +bool my_thread_init(void); +void my_thread_end(void); +#ifdef __cplusplus +} +#endif + +#ifdef STDCALL +unsigned long STDCALL net_field_length(unsigned char **packet); +unsigned long STDCALL net_field_length_checked(unsigned char **packet, + unsigned long max_length); +#endif +unsigned long long net_field_length_ll(unsigned char **packet); +unsigned char *net_store_length(unsigned char *pkg, unsigned long long length); +unsigned int net_length_size(unsigned long long num); +unsigned int net_field_length_size(const unsigned char *pos); + +#define NULL_LENGTH ((unsigned long)~0) /**< For ::net_store_length() */ +#define MYSQL_STMT_HEADER 4 +#define MYSQL_LONG_DATA_HEADER 6 + +#define NOT_FIXED_DEC 31 +#endif |