mariadb/include/row0mysql.h
marko c1d4665514 branches/innodb+: Merge revisions 2867:2986 from branches/zip:
------------------------------------------------------------------------
  r2867 | marko | 2008-10-24 10:24:17 +0300 (Fri, 24 Oct 2008) | 2 lines

  branches/zip: ChangeLog: Document r2763, r2794, r2683, r2799, r2809, r2866.
  ------------------------------------------------------------------------
  r2869 | vasil | 2008-10-24 11:14:16 +0300 (Fri, 24 Oct 2008) | 4 lines

  branches/zip:

  White space cleanup in ChangeLog
  ------------------------------------------------------------------------
  r2870 | vasil | 2008-10-24 13:36:14 +0300 (Fri, 24 Oct 2008) | 8 lines

  branches/zip:

  Remove a statement that causes the innodb-index test to fail.

  The change in behavior was introduced in MySQL BZR-r2738.

  Suggested by:	Marko
  ------------------------------------------------------------------------
  r2871 | vasil | 2008-10-24 13:48:38 +0300 (Fri, 24 Oct 2008) | 5 lines

  branches/zip:

  Adjust mysql-test/patches/innodb-index.diff after the change to
  mysql-test/innodb-index.(test|result) in r2870.
  ------------------------------------------------------------------------
  r2878 | calvin | 2008-10-27 11:05:42 +0200 (Mon, 27 Oct 2008) | 8 lines

  branches/zip: port the fix of Bug#19424 - InnoDB: Possibly a memory
  overrun of the buffer being freed with 64-bit Microsoft Visual C++.

  The changed file:

  CMakeLists.txt: Removing Win64 compiler optimizations for all 
  innodb/mem/* files.
  ------------------------------------------------------------------------
  r2884 | vasil | 2008-10-27 11:48:46 +0200 (Mon, 27 Oct 2008) | 7 lines

  branches/zip:

  ChangeLog:

  Add entry for the fix of Bug#19424 InnoDB: Possibly a memory overrun of
  the buffer being freed (64-bit Visual C)
  ------------------------------------------------------------------------
  r2886 | calvin | 2008-10-27 22:39:11 +0200 (Mon, 27 Oct 2008) | 8 lines

  branches/zip: This patch is to solve the issue that file handles can
  not cross DLL/EXE boundaries on Windows. In builtin InnoDB, it makes
  call to MySQL server for creating tmp files. innobase_mysql_tmpfile
  is now rewritten for the plugin. 

  rb://5

  Approved by:	Marko
  ------------------------------------------------------------------------
  r2887 | calvin | 2008-10-27 22:48:29 +0200 (Mon, 27 Oct 2008) | 44 lines

  branches/zip: implement the delayloading of externals for the plugin
  on Windows, which includes:

   * Load mysqld.map and insert all symbol/address pairs into hash for
     quick access
   * Resolves all external data variables. The delayloading mechanism
     in MSVC does not support automatic imports of data variables.
     A workaround is to explicitly handle the data import using the delay
     loader during the initialization of the plugin.
   * Resolves all external functions during run-time, by implementing
     the delayed loading helper function delayLoadHelper2, which is
     called by run-time as well as HrLoadAllImportsForDll. 

  The delay loader reuses the hash implementation in InnoDB. The normal
  hash_create (in hash0hash.c) creates hash tables in buffer pool. But
  the delay loader is invoked before the engine is initialized, and 
  buffer pools are not ready yet. Instead, the delay loader has its own
  implementation of hash_create() and hash_table_free(), called
  wdl_hash_create() and wdl_hash_table_free().

  This patch should be used with other two patches in order to build
  a dynamically linked plugin on Windows:
   * patch for tmpfile functions (r2886)
   * patch for "build" files (to be committed)

  The list of file changed:

  handler/handler0vars.h: new file, defines a list of external data
  variables (no external functions).

  handler/win_delay_loader.cc: new file, the implementation of the delay
  loader for Windows plugin.

  handler/ha_innodb.cc: add a header file, and changes for copying the
  system variables.

  handler/handler0alter.cc: add a header file

  handler/i_s.cc: add a header file

  rb://27

  Reviewed by:	Sunny, Marko
  Approved by:	Sunny
  ------------------------------------------------------------------------
  r2888 | calvin | 2008-10-28 01:51:49 +0200 (Tue, 28 Oct 2008) | 25 lines

  branches/zip: for building dynamic plugin on Windows, ha_innodb.dll,
  when INNODB_DYNAMIC_PLUGIN is specified.

  The changes are:

  CMakeLists.txt: add project ha_innodb for dynamic plugin on Windows.
  ha_innodb depends on project mysqld.

  ha_innodb.def: a new file with standard exports for a dynamic plugin.

  Two new files will be added:
   * sql/mysqld.def:	.def file for 32-bit compiler
   * sql/mysqld_x64.def:	.def file for x64 compiler

  It is also required to apply a patch to the MySQL source tree. The 
  patch is described in win-plugin/README:

  win-plugin/win-plugin.diff - a patch to be applied to MySQL source
  tree. When applied, the following files will be modified:
   * CMakeLists.txt:	add INNODB_DYNAMIC_PLUGIN and _USE_32BIT_TIME_T
   * sql/CMakeLists.txt:	add mysqld.def or mysqld_x64.def for mysqld
   * win/configure.js:	add INNODB_DYNAMIC_PLUGIN
   * win/build-vs71.bat:	provide an option to specify CMAKE_BUILD_TYPE
   * win/build-vs8.bat:	provide an option to specify CMAKE_BUILD_TYPE
   * win/build-vs8_x64.bat: provide an option to specify CMAKE_BUILD_TYPE
  ------------------------------------------------------------------------
  r2894 | marko | 2008-10-28 08:36:39 +0200 (Tue, 28 Oct 2008) | 4 lines

  branches/zip: dict_str_starts_with_keyword(): Removed this unused function.

  Spotted by Sunny.
  ------------------------------------------------------------------------
  r2895 | vasil | 2008-10-28 08:40:45 +0200 (Tue, 28 Oct 2008) | 6 lines

  branches/zip:

  ChangeLog:

  add entry for the Windows plugin.
  ------------------------------------------------------------------------
  r2917 | marko | 2008-10-28 23:53:23 +0200 (Tue, 28 Oct 2008) | 3 lines

  branches/zip: innodb_plugin_init(): Do not copy session variables,
  even when the variable is a global variable in the built-in InnoDB.
  ------------------------------------------------------------------------
  r2918 | calvin | 2008-10-29 00:08:11 +0200 (Wed, 29 Oct 2008) | 2 lines

  branches/zip: fix a problem introduced in r2917 - dyn is not
  initialized. Move the check into for().
  ------------------------------------------------------------------------
  r2922 | calvin | 2008-10-29 08:29:01 +0200 (Wed, 29 Oct 2008) | 16 lines

  branches/zip: fix issue #102 - Windows plugin: resolve dbug functions
  during run-time.

  Implement wrapper functions in the plugin. The plugin will get the
  function entries from mysqld.exe during the init, and invoke the
  corresponding functions (in mysqld.exe). The list of functions are:

  	_db_pargs_
  	_db_doprnt_
  	_db_enter_
  	_db_return_
  	_db_dump_

  rb://38

  Approved by:	Marko
  ------------------------------------------------------------------------
  r2923 | marko | 2008-10-29 09:52:30 +0200 (Wed, 29 Oct 2008) | 1 line

  branches/zip: ChangeLog: Mention Bug #27276.
  ------------------------------------------------------------------------
  r2925 | calvin | 2008-10-29 10:09:41 +0200 (Wed, 29 Oct 2008) | 16 lines

  branches/zip: change function names in sql/mysqld.def in order
  to work with 5.1.29-rc.

  In 5.1.29, the following function names are changed:
    _hash_init
    hash_free
    hash_search
    hash_delete

  changed to
    _my_hash_init
    my_hash_free
    my_hash_search
    my_hash_delete

  Approved by:	Marko (on IM)
  ------------------------------------------------------------------------
  r2927 | marko | 2008-10-29 11:43:23 +0200 (Wed, 29 Oct 2008) | 4 lines

  branches/zip: ha_innodb.cc: Make some functions static, so that they will
  not be compiled as weak global symbols.  These functions must not be
  redirected to the built-in InnoDB.
  ------------------------------------------------------------------------
  r2928 | michael | 2008-10-29 19:20:10 +0200 (Wed, 29 Oct 2008) | 4 lines

  Remove unnecessary assert

  Approved by: Heikki, over IM
  ------------------------------------------------------------------------
  r2930 | marko | 2008-10-29 21:39:24 +0200 (Wed, 29 Oct 2008) | 33 lines

  branches/zip: Merge revisions 2854:2929 from branches/5.1,
  except r2924, which was merged from branches/zip r2866 to branches/5.1
  and except r2879 which was merged separately by Calvin:

    ------------------------------------------------------------------------
    r2902 | vasil | 2008-10-28 12:10:25 +0200 (Tue, 28 Oct 2008) | 10 lines

    branches/5.1:

    Fix Bug#38189 innodb_stats_on_metadata missing

    Make the variable innodb_stats_on_metadata visible to the users and
    also settable at runtime. Previously it was only "visible" as a command
    line startup option to mysqld.

    Approved by:    Marko (https://svn.innodb.com/rb/r/36)
    ------------------------------------------------------------------------
    r2929 | marko | 2008-10-29 21:26:14 +0200 (Wed, 29 Oct 2008) | 13 lines

    branches/5.1: dtype_get_sql_null_size(): return the correct storage
    size of a SQL NULL column. (Bug #40369)

    When MySQL Bug #20877 was fixed in r834, this function was
    accidentally modified to return 0 or 1. Apparently, the only impact of
    this bug is that fixed-length columns cannot be updated in-place from
    or to SQL NULL, even in ROW_FORMAT=REDUNDANT.  After this fix,
    fixed-length columns in ROW_FORMAT=REDUNDANT will have a constant
    storage size as they should, no matter if NULL or non-NULL.  The bug
    caused fixed-length NULL columns to occupy 1 byte.

    rb://37 approved by Heikki over IM.
    ------------------------------------------------------------------------

  ------------------------------------------------------------------------
  r2931 | vasil | 2008-10-29 22:10:40 +0200 (Wed, 29 Oct 2008) | 4 lines

  branches/zip:

  Add 2 ChangeLog entries for the 2 bugfixes that were merged from branches/5.1.
  ------------------------------------------------------------------------
  r2935 | vasil | 2008-10-30 12:17:23 +0200 (Thu, 30 Oct 2008) | 17 lines

  branches/zip:

  Fix "Bug#40360 Binlog related errors with binlog off" in InnoDB code in order
  to have a Bug#40360-free InnoDB Plugin 1.0.2.

  The fix does check whether binary logging is enabled in MySQL by accessing the
  opt_bin_log global variable that is defined in sql/mysqld.cc.

  In case MySQL does develop another solution to this via Bug#40360 then we can
  revert this patch (except the mysql-tests).

  The windows-plugin part of this fix will be committed as a separate commit to
  ease eventual merge into branches/5.1 [note from the future: the separate
  commit went into r2936].

  Approved by:	Marko (https://svn.innodb.com/rb/r/39)
  ------------------------------------------------------------------------
  r2936 | vasil | 2008-10-30 12:24:09 +0200 (Thu, 30 Oct 2008) | 7 lines

  branches/zip:

  Followup to r2935: add the Windows Delay Loader stuff for the MySQL
  variable that we are accessing. If someday we have another solution for
  Bug#40360 Binlog related errors with binlog off
  then this should also be reverted.
  ------------------------------------------------------------------------
  r2937 | vasil | 2008-10-30 12:28:47 +0200 (Thu, 30 Oct 2008) | 4 lines

  branches/zip:

  Add ChangeLog entry for Bug#40360 Binlog related errors with binlog off
  ------------------------------------------------------------------------
  r2938 | vasil | 2008-10-30 12:33:28 +0200 (Thu, 30 Oct 2008) | 5 lines

  branches/zip:

  Non-functional change: convert handler/handler0vars.h and
  handler/win_delay_loader.cc from \r\n (dos) to \n (unix) line terminators.
  ------------------------------------------------------------------------
  r2939 | marko | 2008-10-30 12:38:18 +0200 (Thu, 30 Oct 2008) | 2 lines

  branches/zip: Set svn:eol-style native on some recently added text files.
  ------------------------------------------------------------------------
  r2940 | marko | 2008-10-30 12:46:21 +0200 (Thu, 30 Oct 2008) | 1 line

  branches/zip: ChangeLog, ha_innodb.def: Set svn:eol-style native
  ------------------------------------------------------------------------
  r2941 | vasil | 2008-10-30 19:34:27 +0200 (Thu, 30 Oct 2008) | 4 lines

  branches/zip:

  Increment the InnoDB Plugin version from 1.0.1 to 1.0.2.
  ------------------------------------------------------------------------
  r2943 | sunny | 2008-10-31 09:40:29 +0200 (Fri, 31 Oct 2008) | 15 lines

  branches/zip: 
    1. We add a vector of locks to trx_t. This array contains the autoinc
    locks granted to a transaction. There is one per table.

    2. We enforce releasing of these locks in the reverse order from the
    one in which they are acquired. The assumption is that since the
    AUTOINC locks are statement level locks. Nested statements introduced
    by triggers are stacked it should hold.

  There was some cleanup done to the vector code too by adding const and
  some new functions. Rename dict_table_t::auto_inc_lock to autoinc_lock.

  Fix Bug#26316 Triggers create duplicate entries on auto-increment columns
  rb://22
  ------------------------------------------------------------------------
  r2944 | vasil | 2008-10-31 09:44:16 +0200 (Fri, 31 Oct 2008) | 12 lines

  branches/zip:

  Revert our temporary fix for "Bug#40360 Binlog related errors with binlog off"
  (r2935, r2936) and deploy MySQL's one, but put the function
  mysql_bin_log_is_engaged() inside mysql_addons.cc instead of in mysql's log.cc
  and use a different name for it so there is no collision when MySQL adds this
  function in log.cc.

  [note from the future: the windows part of this patch went into r2947]

  Approved by:	Marko (https://svn.innodb.com/rb/r/41/)
  ------------------------------------------------------------------------
  r2945 | sunny | 2008-10-31 09:44:45 +0200 (Fri, 31 Oct 2008) | 2 lines

  branches/zip: Update ChangeLog with r2943 info.
  ------------------------------------------------------------------------
  r2946 | marko | 2008-10-31 10:18:47 +0200 (Fri, 31 Oct 2008) | 2 lines

  branches/zip: Revert the unintended change to univ.i that was made in r2943.
  ------------------------------------------------------------------------
  r2947 | calvin | 2008-10-31 10:38:26 +0200 (Fri, 31 Oct 2008) | 6 lines

  branches/zip: Windows plugin part of r2944

  r2944 has reference to mysql_bin_log.is_open(), which is new in InnoDB.
  Add two new entries and remove one duplicate in mysqld.def & 
  mysqld_x64.def.
  ------------------------------------------------------------------------
  r2948 | vasil | 2008-10-31 11:39:07 +0200 (Fri, 31 Oct 2008) | 9 lines

  branches/zip:

  Fix Mantis issue#106 plugin init error:InnoDB: stats_on_metadata in static
  InnoDB (flags=0x2401) differs from stats_on_metadata in dynamic InnoDB (fl

  Ignore the NOSYSVAR flag in addition to ignoring the READONLY flag.

  Approved by:	Marko (https://svn.innodb.com/rb/r/42/)
  ------------------------------------------------------------------------
  r2949 | vasil | 2008-10-31 11:47:56 +0200 (Fri, 31 Oct 2008) | 4 lines

  branches/zip:

  White-space cleanup in ChangeLog.
  ------------------------------------------------------------------------
  r2951 | marko | 2008-10-31 14:21:43 +0200 (Fri, 31 Oct 2008) | 4 lines

  branches/zip: scripts/install_innodb_plugins_win.sql: New script,
  for installing the InnoDB plugins in Windows.  Copied from
  scripts/install_innodb_plugins.sql.
  ------------------------------------------------------------------------
  r2954 | calvin | 2008-11-04 09:15:26 +0200 (Tue, 04 Nov 2008) | 8 lines

  branches/zip: ignore the failure when builtin_innobase_plugin is not
  available.

  External variable builtin_innobase_plugin is not available when mysqld
  does not have a builtin InnoDB. The init of the Windows plugin should
  not fail in this case. 

  Approved by:	Marko (on IM)
  ------------------------------------------------------------------------
  r2955 | calvin | 2008-11-04 12:43:14 +0200 (Tue, 04 Nov 2008) | 11 lines

  branches/zip: windows plugin - fix references to array variables.

  This problem surfaced when running new test innodb_bug40360.test. Both
  tx_isolation_names and binlog_format_names are name arrays, and
  should be defined as wdl_tx_isolation_names and wdl_binlog_format_names,
  not *wdl_tx_isolation_names and *wdl_binlog_format_names.

  Another array variable is all_charsets, which is already correctly
  defined.

  Approved by:	Marko (on IM)
  ------------------------------------------------------------------------
  r2986 | marko | 2008-11-11 09:28:37 +0200 (Tue, 11 Nov 2008) | 11 lines

  branches/zip: ha_innobase::create(): Remove the dependences on
  DICT_TF_ZSSIZE_MAX, so that the code can be compiled with a different
  uncompressed page size by redefining UNIV_PAGE_SIZE_SHIFT in univ.i.
  Currently, the allowed values are 12, 13, or 14 (4k, 8k, 16k).

  Make the default compressed page size half the uncompressed page size.
  The previous default was 8 kilobytes, which is the same when compiling
  with the default 16k uncompressed page size.

  rb://50 approved by Pekka Lampio and Sunny Bains.
  ------------------------------------------------------------------------
2008-11-11 10:21:16 +00:00

743 lines
28 KiB
C

/******************************************************
Interface between Innobase row operations and MySQL.
Contains also create table and other data dictionary operations.
(c) 2000 Innobase Oy
Created 9/17/2000 Heikki Tuuri
*******************************************************/
#ifndef row0mysql_h
#define row0mysql_h
#include "univ.i"
#include "data0data.h"
#include "que0types.h"
#include "dict0types.h"
#include "trx0types.h"
#include "row0types.h"
#include "btr0pcur.h"
#include "trx0types.h"
extern ibool row_rollback_on_timeout;
typedef struct row_prebuilt_struct row_prebuilt_t;
/***********************************************************************
Frees the blob heap in prebuilt when no longer needed. */
UNIV_INTERN
void
row_mysql_prebuilt_free_blob_heap(
/*==============================*/
row_prebuilt_t* prebuilt); /* in: prebuilt struct of a
ha_innobase:: table handle */
/***********************************************************************
Stores a >= 5.0.3 format true VARCHAR length to dest, in the MySQL row
format. */
UNIV_INTERN
byte*
row_mysql_store_true_var_len(
/*=========================*/
/* out: pointer to the data, we skip the 1 or 2 bytes
at the start that are used to store the len */
byte* dest, /* in: where to store */
ulint len, /* in: length, must fit in two bytes */
ulint lenlen);/* in: storage length of len: either 1 or 2 bytes */
/***********************************************************************
Reads a >= 5.0.3 format true VARCHAR length, in the MySQL row format, and
returns a pointer to the data. */
const byte*
row_mysql_read_true_varchar(
/*========================*/
/* out: pointer to the data, we skip
the 1 or 2 bytes at the start that are
used to store the len */
ulint* len, /* out: variable-length field length */
const byte* field, /* in: field in the MySQL format */
ulint lenlen);/* in: storage length of len: either 1
or 2 bytes */
/***********************************************************************
Stores a reference to a BLOB in the MySQL format. */
UNIV_INTERN
void
row_mysql_store_blob_ref(
/*=====================*/
byte* dest, /* in: where to store */
ulint col_len,/* in: dest buffer size: determines into
how many bytes the BLOB length is stored,
the space for the length may vary from 1
to 4 bytes */
const void* data, /* in: BLOB data; if the value to store
is SQL NULL this should be NULL pointer */
ulint len); /* in: BLOB length; if the value to store
is SQL NULL this should be 0; remember
also to set the NULL bit in the MySQL record
header! */
/***********************************************************************
Reads a reference to a BLOB in the MySQL format. */
const byte*
row_mysql_read_blob_ref(
/*====================*/
/* out: pointer to BLOB data */
ulint* len, /* out: BLOB length */
const byte* ref, /* in: BLOB reference in the
MySQL format */
ulint col_len); /* in: BLOB reference length
(not BLOB length) */
/******************************************************************
Stores a non-SQL-NULL field given in the MySQL format in the InnoDB format.
The counterpart of this function is row_sel_field_store_in_mysql_format() in
row0sel.c. */
UNIV_INTERN
byte*
row_mysql_store_col_in_innobase_format(
/*===================================*/
/* out: up to which byte we used
buf in the conversion */
dfield_t* dfield, /* in/out: dfield where dtype
information must be already set when
this function is called! */
byte* buf, /* in/out: buffer for a converted
integer value; this must be at least
col_len long then! */
ibool row_format_col, /* TRUE if the mysql_data is from
a MySQL row, FALSE if from a MySQL
key value;
in MySQL, a true VARCHAR storage
format differs in a row and in a
key value: in a key value the length
is always stored in 2 bytes! */
const byte* mysql_data, /* in: MySQL column value, not
SQL NULL; NOTE that dfield may also
get a pointer to mysql_data,
therefore do not discard this as long
as dfield is used! */
ulint col_len, /* in: MySQL column length; NOTE that
this is the storage length of the
column in the MySQL format row, not
necessarily the length of the actual
payload data; if the column is a true
VARCHAR then this is irrelevant */
ulint comp); /* in: nonzero=compact format */
/********************************************************************
Handles user errors and lock waits detected by the database engine. */
UNIV_INTERN
ibool
row_mysql_handle_errors(
/*====================*/
/* out: TRUE if it was a lock wait and
we should continue running the query thread */
ulint* new_err,/* out: possible new error encountered in
rollback, or the old error which was
during the function entry */
trx_t* trx, /* in: transaction */
que_thr_t* thr, /* in: query thread */
trx_savept_t* savept);/* in: savepoint */
/************************************************************************
Create a prebuilt struct for a MySQL table handle. */
UNIV_INTERN
row_prebuilt_t*
row_create_prebuilt(
/*================*/
/* out, own: a prebuilt struct */
dict_table_t* table); /* in: Innobase table handle */
/************************************************************************
Free a prebuilt struct for a MySQL table handle. */
UNIV_INTERN
void
row_prebuilt_free(
/*==============*/
row_prebuilt_t* prebuilt, /* in, own: prebuilt struct */
ibool dict_locked); /* in: TRUE=data dictionary locked */
/*************************************************************************
Updates the transaction pointers in query graphs stored in the prebuilt
struct. */
UNIV_INTERN
void
row_update_prebuilt_trx(
/*====================*/
/* out: prebuilt dtuple */
row_prebuilt_t* prebuilt, /* in: prebuilt struct in MySQL
handle */
trx_t* trx); /* in: transaction handle */
/*************************************************************************
Unlocks AUTO_INC type locks that were possibly reserved by a trx. */
UNIV_INTERN
void
row_unlock_table_autoinc_for_mysql(
/*===============================*/
trx_t* trx); /* in/out: transaction */
/*************************************************************************
Sets an AUTO_INC type lock on the table mentioned in prebuilt. The
AUTO_INC lock gives exclusive access to the auto-inc counter of the
table. The lock is reserved only for the duration of an SQL statement.
It is not compatible with another AUTO_INC or exclusive lock on the
table. */
UNIV_INTERN
int
row_lock_table_autoinc_for_mysql(
/*=============================*/
/* out: error code or DB_SUCCESS */
row_prebuilt_t* prebuilt); /* in: prebuilt struct in the MySQL
table handle */
/*************************************************************************
Sets a table lock on the table mentioned in prebuilt. */
UNIV_INTERN
int
row_lock_table_for_mysql(
/*=====================*/
/* out: error code or DB_SUCCESS */
row_prebuilt_t* prebuilt, /* in: prebuilt struct in the MySQL
table handle */
dict_table_t* table, /* in: table to lock, or NULL
if prebuilt->table should be
locked as
prebuilt->select_lock_type */
ulint mode); /* in: lock mode of table
(ignored if table==NULL) */
/*************************************************************************
Does an insert for MySQL. */
UNIV_INTERN
int
row_insert_for_mysql(
/*=================*/
/* out: error code or DB_SUCCESS */
byte* mysql_rec, /* in: row in the MySQL format */
row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL
handle */
/*************************************************************************
Builds a dummy query graph used in selects. */
UNIV_INTERN
void
row_prebuild_sel_graph(
/*===================*/
row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL
handle */
/*************************************************************************
Gets pointer to a prebuilt update vector used in updates. If the update
graph has not yet been built in the prebuilt struct, then this function
first builds it. */
UNIV_INTERN
upd_t*
row_get_prebuilt_update_vector(
/*===========================*/
/* out: prebuilt update vector */
row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL
handle */
/*************************************************************************
Checks if a table is such that we automatically created a clustered
index on it (on row id). */
UNIV_INTERN
ibool
row_table_got_default_clust_index(
/*==============================*/
const dict_table_t* table);
/*************************************************************************
Calculates the key number used inside MySQL for an Innobase index. We have
to take into account if we generated a default clustered index for the table */
UNIV_INTERN
ulint
row_get_mysql_key_number_for_index(
/*===============================*/
const dict_index_t* index);
/*************************************************************************
Does an update or delete of a row for MySQL. */
UNIV_INTERN
int
row_update_for_mysql(
/*=================*/
/* out: error code or DB_SUCCESS */
byte* mysql_rec, /* in: the row to be updated, in
the MySQL format */
row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL
handle */
/*************************************************************************
This can only be used when srv_locks_unsafe_for_binlog is TRUE or
session is using a READ COMMITTED isolation level. Before
calling this function we must use trx_reset_new_rec_lock_info() and
trx_register_new_rec_lock() to store the information which new record locks
really were set. This function removes a newly set lock under prebuilt->pcur,
and also under prebuilt->clust_pcur. Currently, this is only used and tested
in the case of an UPDATE or a DELETE statement, where the row lock is of the
LOCK_X type.
Thus, this implements a 'mini-rollback' that releases the latest record
locks we set. */
UNIV_INTERN
int
row_unlock_for_mysql(
/*=================*/
/* out: error code or DB_SUCCESS */
row_prebuilt_t* prebuilt, /* in: prebuilt struct in MySQL
handle */
ibool has_latches_on_recs);/* TRUE if called so that we have
the latches on the records under pcur
and clust_pcur, and we do not need to
reposition the cursors. */
/*************************************************************************
Creates an query graph node of 'update' type to be used in the MySQL
interface. */
UNIV_INTERN
upd_node_t*
row_create_update_node_for_mysql(
/*=============================*/
/* out, own: update node */
dict_table_t* table, /* in: table to update */
mem_heap_t* heap); /* in: mem heap from which allocated */
/**************************************************************************
Does a cascaded delete or set null in a foreign key operation. */
UNIV_INTERN
ulint
row_update_cascade_for_mysql(
/*=========================*/
/* out: error code or DB_SUCCESS */
que_thr_t* thr, /* in: query thread */
upd_node_t* node, /* in: update node used in the cascade
or set null operation */
dict_table_t* table); /* in: table where we do the operation */
/*************************************************************************
Locks the data dictionary exclusively for performing a table create or other
data dictionary modification operation. */
UNIV_INTERN
void
row_mysql_lock_data_dictionary(
/*===========================*/
trx_t* trx); /* in: transaction */
/*************************************************************************
Unlocks the data dictionary exclusive lock. */
UNIV_INTERN
void
row_mysql_unlock_data_dictionary(
/*=============================*/
trx_t* trx); /* in: transaction */
/*************************************************************************
Locks the data dictionary in shared mode from modifications, for performing
foreign key check, rollback, or other operation invisible to MySQL. */
UNIV_INTERN
void
row_mysql_freeze_data_dictionary(
/*=============================*/
trx_t* trx); /* in: transaction */
/*************************************************************************
Unlocks the data dictionary shared lock. */
UNIV_INTERN
void
row_mysql_unfreeze_data_dictionary(
/*===============================*/
trx_t* trx); /* in: transaction */
#ifndef UNIV_HOTBACKUP
/*************************************************************************
Creates a table for MySQL. If the name of the table ends in
one of "innodb_monitor", "innodb_lock_monitor", "innodb_tablespace_monitor",
"innodb_table_monitor", then this will also start the printing of monitor
output by the master thread. If the table name ends in "innodb_mem_validate",
InnoDB will try to invoke mem_validate(). */
UNIV_INTERN
int
row_create_table_for_mysql(
/*=======================*/
/* out: error code or DB_SUCCESS */
dict_table_t* table, /* in, own: table definition
(will be freed) */
trx_t* trx); /* in: transaction handle */
/*************************************************************************
Does an index creation operation for MySQL. TODO: currently failure
to create an index results in dropping the whole table! This is no problem
currently as all indexes must be created at the same time as the table. */
UNIV_INTERN
int
row_create_index_for_mysql(
/*=======================*/
/* out: error number or DB_SUCCESS */
dict_index_t* index, /* in, own: index definition
(will be freed) */
trx_t* trx, /* in: transaction handle */
const ulint* field_lengths); /* in: if not NULL, must contain
dict_index_get_n_fields(index)
actual field lengths for the
index columns, which are
then checked for not being too
large. */
/*************************************************************************
Scans a table create SQL string and adds to the data dictionary
the foreign key constraints declared in the string. This function
should be called after the indexes for a table have been created.
Each foreign key constraint must be accompanied with indexes in
bot participating tables. The indexes are allowed to contain more
fields than mentioned in the constraint. */
UNIV_INTERN
int
row_table_add_foreign_constraints(
/*==============================*/
/* out: error code or DB_SUCCESS */
trx_t* trx, /* in: transaction */
const char* sql_string, /* in: table create statement where
foreign keys are declared like:
FOREIGN KEY (a, b) REFERENCES table2(c, d),
table2 can be written also with the
database name before it: test.table2 */
const char* name, /* in: table full name in the
normalized form
database_name/table_name */
ibool reject_fks); /* in: if TRUE, fail with error
code DB_CANNOT_ADD_CONSTRAINT if
any foreign keys are found. */
/*************************************************************************
The master thread in srv0srv.c calls this regularly to drop tables which
we must drop in background after queries to them have ended. Such lazy
dropping of tables is needed in ALTER TABLE on Unix. */
UNIV_INTERN
ulint
row_drop_tables_for_mysql_in_background(void);
/*=========================================*/
/* out: how many tables dropped
+ remaining tables in list */
/*************************************************************************
Get the background drop list length. NOTE: the caller must own the kernel
mutex! */
UNIV_INTERN
ulint
row_get_background_drop_list_len_low(void);
/*======================================*/
/* out: how many tables in list */
/*************************************************************************
Truncates a table for MySQL. */
UNIV_INTERN
int
row_truncate_table_for_mysql(
/*=========================*/
/* out: error code or DB_SUCCESS */
dict_table_t* table, /* in: table handle */
trx_t* trx); /* in: transaction handle */
/*************************************************************************
Drops a table for MySQL. If the name of the dropped table ends in
one of "innodb_monitor", "innodb_lock_monitor", "innodb_tablespace_monitor",
"innodb_table_monitor", then this will also stop the printing of monitor
output by the master thread. If the data dictionary was not already locked
by the transaction, the transaction will be committed. Otherwise, the
data dictionary will remain locked. */
UNIV_INTERN
int
row_drop_table_for_mysql(
/*=====================*/
/* out: error code or DB_SUCCESS */
const char* name, /* in: table name */
trx_t* trx, /* in: transaction handle */
ibool drop_db);/* in: TRUE=dropping whole database */
/*************************************************************************
Discards the tablespace of a table which stored in an .ibd file. Discarding
means that this function deletes the .ibd file and assigns a new table id for
the table. Also the flag table->ibd_file_missing is set TRUE. */
UNIV_INTERN
int
row_discard_tablespace_for_mysql(
/*=============================*/
/* out: error code or DB_SUCCESS */
const char* name, /* in: table name */
trx_t* trx); /* in: transaction handle */
/*********************************************************************
Imports a tablespace. The space id in the .ibd file must match the space id
of the table in the data dictionary. */
UNIV_INTERN
int
row_import_tablespace_for_mysql(
/*============================*/
/* out: error code or DB_SUCCESS */
const char* name, /* in: table name */
trx_t* trx); /* in: transaction handle */
/*************************************************************************
Drops a database for MySQL. */
UNIV_INTERN
int
row_drop_database_for_mysql(
/*========================*/
/* out: error code or DB_SUCCESS */
const char* name, /* in: database name which ends to '/' */
trx_t* trx); /* in: transaction handle */
/*************************************************************************
Renames a table for MySQL. */
UNIV_INTERN
ulint
row_rename_table_for_mysql(
/*=======================*/
/* out: error code or DB_SUCCESS */
const char* old_name, /* in: old table name */
const char* new_name, /* in: new table name */
trx_t* trx, /* in: transaction handle */
ibool commit); /* in: if TRUE then commit trx */
/*************************************************************************
Checks a table for corruption. */
UNIV_INTERN
ulint
row_check_table_for_mysql(
/*======================*/
/* out: DB_ERROR or DB_SUCCESS */
row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL
handle */
#endif /* !UNIV_HOTBACKUP */
/*************************************************************************
Determines if a table is a magic monitor table. */
UNIV_INTERN
ibool
row_is_magic_monitor_table(
/*=======================*/
/* out: TRUE if monitor table */
const char* table_name); /* in: name of the table, in the
form database/table_name */
/* A struct describing a place for an individual column in the MySQL
row format which is presented to the table handler in ha_innobase.
This template struct is used to speed up row transformations between
Innobase and MySQL. */
typedef struct mysql_row_templ_struct mysql_row_templ_t;
struct mysql_row_templ_struct {
ulint col_no; /* column number of the column */
ulint rec_field_no; /* field number of the column in an
Innobase record in the current index;
not defined if template_type is
ROW_MYSQL_WHOLE_ROW */
ulint mysql_col_offset; /* offset of the column in the MySQL
row format */
ulint mysql_col_len; /* length of the column in the MySQL
row format */
ulint mysql_null_byte_offset; /* MySQL NULL bit byte offset in a
MySQL record */
ulint mysql_null_bit_mask; /* bit mask to get the NULL bit,
zero if column cannot be NULL */
ulint type; /* column type in Innobase mtype
numbers DATA_CHAR... */
ulint mysql_type; /* MySQL type code; this is always
< 256 */
ulint mysql_length_bytes; /* if mysql_type
== DATA_MYSQL_TRUE_VARCHAR, this tells
whether we should use 1 or 2 bytes to
store the MySQL true VARCHAR data
length at the start of row in the MySQL
format (NOTE that the MySQL key value
format always uses 2 bytes for the data
len) */
ulint charset; /* MySQL charset-collation code
of the column, or zero */
ulint mbminlen; /* minimum length of a char, in bytes,
or zero if not a char type */
ulint mbmaxlen; /* maximum length of a char, in bytes,
or zero if not a char type */
ulint is_unsigned; /* if a column type is an integer
type and this field is != 0, then
it is an unsigned integer type */
};
#define MYSQL_FETCH_CACHE_SIZE 8
/* After fetching this many rows, we start caching them in fetch_cache */
#define MYSQL_FETCH_CACHE_THRESHOLD 4
#define ROW_PREBUILT_ALLOCATED 78540783
#define ROW_PREBUILT_FREED 26423527
/* A struct for (sometimes lazily) prebuilt structures in an Innobase table
handle used within MySQL; these are used to save CPU time. */
struct row_prebuilt_struct {
ulint magic_n; /* this magic number is set to
ROW_PREBUILT_ALLOCATED when created,
or ROW_PREBUILT_FREED when the
struct has been freed */
dict_table_t* table; /* Innobase table handle */
trx_t* trx; /* current transaction handle */
ibool sql_stat_start; /* TRUE when we start processing of
an SQL statement: we may have to set
an intention lock on the table,
create a consistent read view etc. */
ibool mysql_has_locked; /* this is set TRUE when MySQL
calls external_lock on this handle
with a lock flag, and set FALSE when
with the F_UNLOCK flag */
ibool clust_index_was_generated;
/* if the user did not define a
primary key in MySQL, then Innobase
automatically generated a clustered
index where the ordering column is
the row id: in this case this flag
is set to TRUE */
dict_index_t* index; /* current index for a search, if
any */
ulint read_just_key; /* set to 1 when MySQL calls
ha_innobase::extra with the
argument HA_EXTRA_KEYREAD; it is enough
to read just columns defined in
the index (i.e., no read of the
clustered index record necessary) */
ibool used_in_HANDLER;/* TRUE if we have been using this
handle in a MySQL HANDLER low level
index cursor command: then we must
store the pcur position even in a
unique search from a clustered index,
because HANDLER allows NEXT and PREV
in such a situation */
ulint template_type; /* ROW_MYSQL_WHOLE_ROW,
ROW_MYSQL_REC_FIELDS,
ROW_MYSQL_DUMMY_TEMPLATE, or
ROW_MYSQL_NO_TEMPLATE */
ulint n_template; /* number of elements in the
template */
ulint null_bitmap_len;/* number of bytes in the SQL NULL
bitmap at the start of a row in the
MySQL format */
ibool need_to_access_clustered; /* if we are fetching
columns through a secondary index
and at least one column is not in
the secondary index, then this is
set to TRUE */
ibool templ_contains_blob;/* TRUE if the template contains
BLOB column(s) */
mysql_row_templ_t* mysql_template;/* template used to transform
rows fast between MySQL and Innobase
formats; memory for this template
is not allocated from 'heap' */
mem_heap_t* heap; /* memory heap from which
these auxiliary structures are
allocated when needed */
ins_node_t* ins_node; /* Innobase SQL insert node
used to perform inserts
to the table */
byte* ins_upd_rec_buff;/* buffer for storing data converted
to the Innobase format from the MySQL
format */
ulint hint_need_to_fetch_extra_cols;
/* normally this is set to 0; if this
is set to ROW_RETRIEVE_PRIMARY_KEY,
then we should at least retrieve all
columns in the primary key; if this
is set to ROW_RETRIEVE_ALL_COLS, then
we must retrieve all columns in the
key (if read_just_key == 1), or all
columns in the table */
upd_node_t* upd_node; /* Innobase SQL update node used
to perform updates and deletes */
que_fork_t* ins_graph; /* Innobase SQL query graph used
in inserts */
que_fork_t* upd_graph; /* Innobase SQL query graph used
in updates or deletes */
btr_pcur_t* pcur; /* persistent cursor used in selects
and updates */
btr_pcur_t* clust_pcur; /* persistent cursor used in
some selects and updates */
que_fork_t* sel_graph; /* dummy query graph used in
selects */
dtuple_t* search_tuple; /* prebuilt dtuple used in selects */
byte row_id[DATA_ROW_ID_LEN];
/* if the clustered index was
generated, the row id of the
last row fetched is stored
here */
dtuple_t* clust_ref; /* prebuilt dtuple used in
sel/upd/del */
ulint select_lock_type;/* LOCK_NONE, LOCK_S, or LOCK_X */
ulint stored_select_lock_type;/* this field is used to
remember the original select_lock_type
that was decided in ha_innodb.cc,
::store_lock(), ::external_lock(),
etc. */
ulint row_read_type; /* ROW_READ_WITH_LOCKS if row locks
should be the obtained for records
under an UPDATE or DELETE cursor.
If innodb_locks_unsafe_for_binlog
is TRUE, this can be set to
ROW_READ_TRY_SEMI_CONSISTENT, so that
if the row under an UPDATE or DELETE
cursor was locked by another
transaction, InnoDB will resort
to reading the last committed value
('semi-consistent read'). Then,
this field will be set to
ROW_READ_DID_SEMI_CONSISTENT to
indicate that. If the row does not
match the WHERE condition, MySQL will
invoke handler::unlock_row() to
clear the flag back to
ROW_READ_TRY_SEMI_CONSISTENT and
to simply skip the row. If
the row matches, the next call to
row_search_for_mysql() will lock
the row.
This eliminates lock waits in some
cases; note that this breaks
serializability. */
ulint mysql_prefix_len;/* byte offset of the end of
the last requested column */
ulint mysql_row_len; /* length in bytes of a row in the
MySQL format */
ulint n_rows_fetched; /* number of rows fetched after
positioning the current cursor */
ulint fetch_direction;/* ROW_SEL_NEXT or ROW_SEL_PREV */
byte* fetch_cache[MYSQL_FETCH_CACHE_SIZE];
/* a cache for fetched rows if we
fetch many rows from the same cursor:
it saves CPU time to fetch them in a
batch; we reserve mysql_row_len
bytes for each such row; these
pointers point 4 bytes past the
allocated mem buf start, because
there is a 4 byte magic number at the
start and at the end */
ibool keep_other_fields_on_keyread; /* when using fetch
cache with HA_EXTRA_KEYREAD, don't
overwrite other fields in mysql row
row buffer.*/
ulint fetch_cache_first;/* position of the first not yet
fetched row in fetch_cache */
ulint n_fetch_cached; /* number of not yet fetched rows
in fetch_cache */
mem_heap_t* blob_heap; /* in SELECTS BLOB fields are copied
to this heap */
mem_heap_t* old_vers_heap; /* memory heap where a previous
version is built in consistent read */
/*----------------------*/
ulonglong autoinc_last_value;/* last value of AUTO-INC interval */
ulonglong autoinc_increment;/* The increment step of the auto
increment column. Value must be
greater than or equal to 1. Required to
calculate the next value */
ulonglong autoinc_offset; /* The offset passed to
get_auto_increment() by MySQL. Required
to calculate the next value */
ulint autoinc_error; /* The actual error code encountered
while trying to init or read the
autoinc value from the table. We
store it here so that we can return
it to MySQL */
/*----------------------*/
UT_LIST_NODE_T(row_prebuilt_t) prebuilts;
/* list node of table->prebuilts */
ulint magic_n2; /* this should be the same as
magic_n */
};
#define ROW_PREBUILT_FETCH_MAGIC_N 465765687
#define ROW_MYSQL_WHOLE_ROW 0
#define ROW_MYSQL_REC_FIELDS 1
#define ROW_MYSQL_NO_TEMPLATE 2
#define ROW_MYSQL_DUMMY_TEMPLATE 3 /* dummy template used in
row_scan_and_check_index */
/* Values for hint_need_to_fetch_extra_cols */
#define ROW_RETRIEVE_PRIMARY_KEY 1
#define ROW_RETRIEVE_ALL_COLS 2
/* Values for row_read_type */
#define ROW_READ_WITH_LOCKS 0
#define ROW_READ_TRY_SEMI_CONSISTENT 1
#define ROW_READ_DID_SEMI_CONSISTENT 2
#ifndef UNIV_NONINL
#include "row0mysql.ic"
#endif
#endif