My Project
Public Member Functions | Public Attributes | Protected Attributes
Query_log_event Class Reference

#include <log_event.h>

Inheritance diagram for Query_log_event:
Log_event Execute_load_query_log_event

List of all members.

Public Member Functions

void print_query_header (IO_CACHE *file, PRINT_EVENT_INFO *print_event_info)
void print (FILE *file, PRINT_EVENT_INFO *print_event_info)
 Query_log_event ()
 Query_log_event (const char *buf, uint event_len, const Format_description_log_event *description_event, Log_event_type event_type)
Log_event_type get_type_code ()
bool is_valid () const
virtual ulong get_post_header_size_for_derived ()
bool is_trans_keyword ()
bool starts_group ()
virtual bool ends_group ()

Public Attributes

const char * query
const char * catalog
const char * db
uint32 q_len
uint32 db_len
uint16 error_code
ulong thread_id
ulong slave_proxy_id
uint catalog_len
uint16 status_vars_len
bool flags2_inited
bool sql_mode_inited
bool charset_inited
uint32 flags2
sql_mode_t sql_mode
ulong auto_increment_increment
ulong auto_increment_offset
char charset [6]
uint time_zone_len
const char * time_zone_str
uint lc_time_names_number
uint charset_database_number
ulonglong table_map_for_update
uint32 master_data_written
uchar mts_accessed_dbs
char mts_accessed_db_names [MAX_DBS_IN_EVENT_MTS][NAME_LEN]

Protected Attributes

Log_event::Byte * data_buf

Detailed Description

A Query_log_event is created for each query that modifies the database, unless the query is logged row-based.

Binary format

See Binary format for log events for a general discussion and introduction to the binary format of binlog events.

The Post-Header has five components:

Post-Header for Query_log_event
Name Format


slave_proxy_id 4 byte unsigned integer

An integer identifying the client thread that issued the query. The id is unique per server. (Note, however, that two threads on different servers may have the same slave_proxy_id.) This is used when a client thread creates a temporary table local to the client. The slave_proxy_id is used to distinguish temporary tables that belong to different clients.

exec_time 4 byte unsigned integer

The time from when the query started to when it was logged in the binlog, in seconds.

db_len 1 byte integer

The length of the name of the currently selected database.

error_code 2 byte unsigned integer

Error code generated by the master. If the master fails, the slave will fail with the same error code, except for the error codes ER_DB_CREATE_EXISTS == 1007 and ER_DB_DROP_EXISTS == 1008.

status_vars_len 2 byte unsigned integer The length of the status_vars block of the Body, in bytes. See below.

The Body has the following components:

Body for Query_log_event
Name Format


status_vars status_vars_len bytes

Zero or more status variables. Each status variable consists of one byte identifying the variable stored, followed by the value of the variable. The possible variables are listed separately in the table below. MySQL always writes events in the order defined below; however, it is capable of reading them in any order.

db db_len+1

The currently selected database, as a null-terminated string.

(The trailing zero is redundant since the length is already known; it is db_len from Post-Header.)

query variable length string without trailing zero, extending to the end of the event (determined by the length field of the Common-Header) The SQL query.

The following table lists the status variables that may appear in the status_vars field.

Status variables for Query_log_event
Status variable 1 byte identifier Format


flags2 Q_FLAGS2_CODE == 0 4 byte bitfield

The flags in thd->options, binary AND-ed with OPTIONS_WRITTEN_TO_BIN_LOG. The thd->options bitfield contains options for "SELECT". OPTIONS_WRITTEN identifies those options that need to be written to the binlog (not all do). Specifically, OPTIONS_WRITTEN_TO_BIN_LOG equals (OPTION_AUTO_IS_NULL | OPTION_NO_FOREIGN_KEY_CHECKS | OPTION_RELAXED_UNIQUE_CHECKS | OPTION_NOT_AUTOCOMMIT), or 0x0c084000 in hex.

These flags correspond to the SQL variables SQL_AUTO_IS_NULL, FOREIGN_KEY_CHECKS, UNIQUE_CHECKS, and AUTOCOMMIT, documented in the "SET Syntax" section of the MySQL Manual.

This field is always written to the binlog in version >= 5.0, and never written in version < 5.0.

sql_mode Q_SQL_MODE_CODE == 1 8 byte bitfield

The sql_mode variable. See the section "SQL Modes" in the MySQL manual, and see sql_priv.h for a list of the possible flags. Currently (2007-10-04), the following flags are available:


All these flags are replicated from the server. However, all flags except MODE_NO_DIR_IN_CREATE are honored by the slave; the slave always preserves its old value of MODE_NO_DIR_IN_CREATE. For a rationale, see comment in Query_log_event::do_apply_event in

This field is always written to the binlog.

catalog Q_CATALOG_NZ_CODE == 6 Variable-length string: the length in bytes (1 byte) followed by the characters (at most 255 bytes)

Stores the client's current catalog. Every database belongs to a catalog, the same way that every table belongs to a database. Currently, there is only one catalog, "std".

This field is written if the length of the catalog is > 0; otherwise it is not written.

auto_increment Q_AUTO_INCREMENT == 3

two 2 byte unsigned integers, totally 2+2=4 bytes

The two variables auto_increment_increment and auto_increment_offset, in that order. For more information, see "System variables" in the MySQL manual.

This field is written if auto_increment > 1. Otherwise, it is not written.

charset Q_CHARSET_CODE == 4 three 2 byte unsigned integers, totally 2+2+2=6 bytes

The three variables character_set_client, collation_connection, and collation_server, in that order. character_set_client is a code identifying the character set and collation used by the client to encode the query. collation_connection identifies the character set and collation that the master converts the query to when it receives it; this is useful when comparing literal strings. collation_server is the default character set and collation used when a new database is created.

See also "Connection Character Sets and Collations" in the MySQL 5.1 manual.

All three variables are codes identifying a (character set, collation) pair. To see which codes map to which pairs, run the query "SELECT id, character_set_name, collation_name FROM COLLATIONS".


This field is always written.

time_zone Q_TIME_ZONE_CODE == 5 Variable-length string: the length in bytes (1 byte) followed by the characters (at most 255 bytes).

The time_zone of the master.

See also "System Variables" and "MySQL Server Time Zone Support" in the MySQL manual.

This field is written if the length of the time zone string is > 0; otherwise, it is not written.

lc_time_names_number Q_LC_TIME_NAMES_CODE == 7 2 byte integer

A code identifying a table of month and day names. The mapping from codes to languages is defined in

This field is written if it is not 0, i.e., if the locale is not en_US.

charset_database_number Q_CHARSET_DATABASE_CODE == 8

2 byte integer

The value of the collation_database system variable (in the source code stored in thd->variables.collation_database), which holds the code for a (character set, collation) pair as described above (see Q_CHARSET_CODE).

collation_database was used in old versions (???WHEN). Its value was loaded when issuing a "use db" query and could be changed by issuing a "SET collation_database=xxx" query. It used to affect the "LOAD DATA INFILE" and "CREATE TABLE" commands.

In newer versions, "CREATE TABLE" has been changed to take the character set from the database of the created table, rather than the character set of the current database. This makes a difference when creating a table in another database than the current one. "LOAD DATA INFILE" has not yet changed to do this, but there are plans to eventually do it, and to make collation_database read-only.

This field is written if it is not 0.

table_map_for_update Q_TABLE_MAP_FOR_UPDATE_CODE == 9

8 byte integer

The value of the table map that is to be updated by the multi-table update query statement. Every bit of this variable represents a table, and is set to 1 if the corresponding table is to be updated by this statement.

The value of this variable is set when executing a multi-table update statement and used by slave to apply filter rules without opening all the tables on slave. This is required because some tables may not exist on slave because of the filter rules.

Notes on Previous Versions

Status vars were introduced in version 5.0. To read earlier versions correctly, check the length of the Post-Header.

The status variable Q_CATALOG_CODE == 2 existed in MySQL 5.0.x, where 0<=x<=3. It was identical to Q_CATALOG_CODE, except that the string had a trailing '\0'. The '\0' was removed in 5.0.4 since it was redundant (the string length is stored before the string). The Q_CATALOG_CODE will never be written by a new master, but can still be understood by a new slave.

See Q_CHARSET_DATABASE_CODE in the table above.

When adding new status vars, please don't forget to update the MAX_SIZE_LOG_EVENT_STATUS, and update function code_name

Constructor & Destructor Documentation

The simplest constructor that could possibly work. This is used for creating static objects that have a special meaning and are invisible to the log.

Query_log_event::Query_log_event ( const char *  buf,
uint  event_len,
const Format_description_log_event description_event,
Log_event_type  event_type 

This is used by the SQL slave thread to prepare the event before execution.

Layout for the data buffer is as follows +--------+-----------+------+------+---------+----+-------+ | catlog | time_zone | user | host | db name | \0 | Query | +--------+-----------+------+------+---------+----+-------+

To support the query cache we append the following buffer to the above +-------+----------------------------------------+-------+ |db len | uninitiatlized space of size of db len | FLAGS | +-------+----------------------------------------+-------+

The area of buffer starting from Query field all the way to the end belongs to the Query buffer and its structure is described in alloc_query() in

we should clean up and do only copy_str_and_move; it works for both cases. Then we can remove the catalog_nz flag. /sven

if time_zone_len or catalog_len are 0, then time_zone and catalog are uninitialized at this point. shouldn't they point to the zero-length null-terminated strings we allocated space for in the my_alloc call above? /sven

Append the db length at the end of the buffer. This will be used by Query_cache::send_result_to_client() in case the query cache is On.

Member Function Documentation

bool Query_log_event::starts_group ( ) [inline]

Notice, DDL queries are logged without BEGIN/COMMIT parentheses and identification of such single-query group occures within logics of get_slave_worker().

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines